{"mappings":"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","sources":["node_modules/@swc/helpers/src/_assert_this_initialized.js","node_modules/@swc/helpers/src/_class_call_check.js","node_modules/@swc/helpers/src/_create_class.js","node_modules/@swc/helpers/src/_set_prototype_of.js","node_modules/@swc/helpers/src/_inherits.js","node_modules/@swc/helpers/src/_type_of.js","node_modules/@swc/helpers/src/_get_prototype_of.js","node_modules/@swc/helpers/src/_possible_constructor_return.js","node_modules/@swc/helpers/src/_create_super.js","node_modules/@swc/helpers/src/_is_native_reflect_construct.js","node_modules/@parcel/runtime-js/lib/helpers/bundle-manifest.js","node_modules/rxjs/src/internal/Observable.ts","node_modules/rxjs/src/internal/util/canReportError.ts","node_modules/rxjs/src/internal/Subscriber.ts","node_modules/tslib/tslib.es6.js","node_modules/rxjs/src/internal/util/isFunction.ts","node_modules/rxjs/src/internal/Observer.ts","node_modules/rxjs/src/internal/config.ts","node_modules/rxjs/src/internal/util/hostReportError.ts","node_modules/rxjs/src/internal/Subscription.ts","node_modules/rxjs/src/internal/util/isObject.ts","node_modules/rxjs/src/internal/util/UnsubscriptionError.ts","node_modules/rxjs/src/internal/symbol/rxSubscriber.ts","node_modules/rxjs/src/internal/util/toSubscriber.ts","node_modules/rxjs/src/internal/util/pipe.ts","node_modules/rxjs/src/internal/observable/ConnectableObservable.ts","node_modules/rxjs/src/internal/Subject.ts","node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts","node_modules/rxjs/src/internal/SubjectSubscription.ts","node_modules/rxjs/src/internal/operators/refCount.ts","node_modules/rxjs/src/internal/operators/groupBy.ts","node_modules/rxjs/src/internal/BehaviorSubject.ts","node_modules/rxjs/src/internal/ReplaySubject.ts","node_modules/rxjs/src/internal/scheduler/QueueAction.ts","node_modules/rxjs/src/internal/scheduler/AsyncAction.ts","node_modules/rxjs/src/internal/scheduler/Action.ts","node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts","node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts","node_modules/rxjs/src/internal/Scheduler.ts","node_modules/rxjs/src/internal/operators/observeOn.ts","node_modules/rxjs/src/internal/Notification.ts","node_modules/rxjs/src/internal/observable/empty.ts","node_modules/rxjs/src/internal/observable/of.ts","node_modules/rxjs/src/internal/util/isScheduler.ts","node_modules/rxjs/src/internal/observable/fromArray.ts","node_modules/rxjs/src/internal/util/subscribeToArray.ts","node_modules/rxjs/src/internal/scheduled/scheduleArray.ts","node_modules/rxjs/src/internal/observable/throwError.ts","node_modules/rxjs/src/internal/AsyncSubject.ts","node_modules/rxjs/src/internal/scheduler/AsapAction.ts","node_modules/rxjs/src/internal/util/Immediate.ts","node_modules/rxjs/src/internal/scheduler/AsapScheduler.ts","node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts","node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts","node_modules/rxjs/src/internal/scheduler/VirtualTimeScheduler.ts","node_modules/rxjs/src/internal/util/identity.ts","node_modules/rxjs/src/internal/util/isObservable.ts","node_modules/rxjs/src/internal/util/ArgumentOutOfRangeError.ts","node_modules/rxjs/src/internal/util/EmptyError.ts","node_modules/rxjs/src/internal/util/TimeoutError.ts","node_modules/rxjs/src/internal/observable/bindCallback.ts","node_modules/rxjs/src/internal/operators/map.ts","node_modules/rxjs/src/internal/observable/bindNodeCallback.ts","node_modules/rxjs/src/internal/observable/combineLatest.ts","node_modules/rxjs/src/internal/OuterSubscriber.ts","node_modules/rxjs/src/internal/util/subscribeToResult.ts","node_modules/rxjs/src/internal/InnerSubscriber.ts","node_modules/rxjs/src/internal/util/subscribeTo.ts","node_modules/rxjs/src/internal/util/subscribeToPromise.ts","node_modules/rxjs/src/internal/util/subscribeToIterable.ts","node_modules/rxjs/src/internal/symbol/iterator.ts","node_modules/rxjs/src/internal/util/subscribeToObservable.ts","node_modules/rxjs/src/internal/util/isPromise.ts","node_modules/rxjs/src/internal/observable/concat.ts","node_modules/rxjs/src/internal/operators/concatAll.ts","node_modules/rxjs/src/internal/operators/mergeAll.ts","node_modules/rxjs/src/internal/operators/mergeMap.ts","node_modules/rxjs/src/internal/observable/from.ts","node_modules/rxjs/src/internal/scheduled/scheduled.ts","node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts","node_modules/rxjs/src/internal/scheduled/schedulePromise.ts","node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts","node_modules/rxjs/src/internal/util/isInteropObservable.ts","node_modules/rxjs/src/internal/util/isIterable.ts","node_modules/rxjs/src/internal/observable/defer.ts","node_modules/rxjs/src/internal/observable/forkJoin.ts","node_modules/rxjs/src/internal/observable/fromEvent.ts","node_modules/rxjs/src/internal/observable/fromEventPattern.ts","node_modules/rxjs/src/internal/observable/generate.ts","node_modules/rxjs/src/internal/observable/iif.ts","node_modules/rxjs/src/internal/observable/interval.ts","node_modules/rxjs/src/internal/util/isNumeric.ts","node_modules/rxjs/src/internal/observable/merge.ts","node_modules/rxjs/src/internal/observable/never.ts","node_modules/rxjs/src/internal/observable/onErrorResumeNext.ts","node_modules/rxjs/src/internal/observable/pairs.ts","node_modules/rxjs/src/internal/observable/partition.ts","node_modules/rxjs/src/internal/util/not.ts","node_modules/rxjs/src/internal/operators/filter.ts","node_modules/rxjs/src/internal/observable/race.ts","node_modules/rxjs/src/internal/observable/range.ts","node_modules/rxjs/src/internal/observable/timer.ts","node_modules/rxjs/src/internal/observable/using.ts","node_modules/rxjs/src/internal/observable/zip.ts","node_modules/three/build/three.module.js","node_modules/three-gltf-loader/index.js","gestures.ts","node_modules/immutable/dist/immutable.es.js","GestureData.ts","node_modules/howler/dist/howler.js","node_modules/botframework-directlinejs/src/directLine.ts","node_modules/@babel/runtime/helpers/interopRequireDefault.js","node_modules/@babel/runtime/helpers/objectWithoutProperties.js","node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","node_modules/@babel/runtime/helpers/objectSpread.js","node_modules/@babel/runtime/helpers/defineProperty.js","node_modules/@babel/runtime/helpers/classCallCheck.js","node_modules/@babel/runtime/helpers/createClass.js","node_modules/botframework-directlinejs/node_modules/src/BehaviorSubject.ts","node_modules/botframework-directlinejs/node_modules/src/Subject.ts","node_modules/botframework-directlinejs/node_modules/src/Observable.ts","node_modules/botframework-directlinejs/node_modules/src/util/root.ts","node_modules/botframework-directlinejs/node_modules/src/util/toSubscriber.ts","node_modules/botframework-directlinejs/node_modules/src/Subscriber.ts","node_modules/botframework-directlinejs/node_modules/src/util/isFunction.ts","node_modules/botframework-directlinejs/node_modules/src/Subscription.ts","node_modules/botframework-directlinejs/node_modules/src/util/isArray.ts","node_modules/botframework-directlinejs/node_modules/src/util/isObject.ts","node_modules/botframework-directlinejs/node_modules/src/util/tryCatch.ts","node_modules/botframework-directlinejs/node_modules/src/util/errorObject.ts","node_modules/botframework-directlinejs/node_modules/src/util/UnsubscriptionError.ts","node_modules/botframework-directlinejs/node_modules/src/Observer.ts","node_modules/botframework-directlinejs/node_modules/src/symbol/rxSubscriber.ts","node_modules/botframework-directlinejs/node_modules/src/symbol/observable.ts","node_modules/botframework-directlinejs/node_modules/src/util/pipe.ts","node_modules/botframework-directlinejs/node_modules/src/util/noop.ts","node_modules/botframework-directlinejs/node_modules/src/util/ObjectUnsubscribedError.ts","node_modules/botframework-directlinejs/node_modules/src/SubjectSubscription.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/catch.ts","node_modules/botframework-directlinejs/node_modules/src/operator/catch.ts","node_modules/botframework-directlinejs/node_modules/src/operators/catchError.ts","node_modules/botframework-directlinejs/node_modules/src/OuterSubscriber.ts","node_modules/botframework-directlinejs/node_modules/src/util/subscribeToResult.ts","node_modules/botframework-directlinejs/node_modules/src/util/isArrayLike.ts","node_modules/botframework-directlinejs/node_modules/src/util/isPromise.ts","node_modules/botframework-directlinejs/node_modules/src/symbol/iterator.ts","node_modules/botframework-directlinejs/node_modules/src/InnerSubscriber.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/combineLatest.ts","node_modules/botframework-directlinejs/node_modules/src/operator/combineLatest.ts","node_modules/botframework-directlinejs/node_modules/src/operators/combineLatest.ts","node_modules/botframework-directlinejs/node_modules/src/observable/ArrayObservable.ts","node_modules/botframework-directlinejs/node_modules/src/observable/ScalarObservable.ts","node_modules/botframework-directlinejs/node_modules/src/observable/EmptyObservable.ts","node_modules/botframework-directlinejs/node_modules/src/util/isScheduler.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/count.ts","node_modules/botframework-directlinejs/node_modules/src/operator/count.ts","node_modules/botframework-directlinejs/node_modules/src/operators/count.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/delay.ts","node_modules/botframework-directlinejs/node_modules/src/operator/delay.ts","node_modules/botframework-directlinejs/node_modules/src/scheduler/async.ts","node_modules/botframework-directlinejs/node_modules/src/scheduler/AsyncAction.ts","node_modules/botframework-directlinejs/node_modules/src/scheduler/Action.ts","node_modules/botframework-directlinejs/node_modules/src/scheduler/AsyncScheduler.ts","node_modules/botframework-directlinejs/node_modules/src/Scheduler.ts","node_modules/botframework-directlinejs/node_modules/src/operators/delay.ts","node_modules/botframework-directlinejs/node_modules/src/util/isDate.ts","node_modules/botframework-directlinejs/node_modules/src/Notification.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/do.ts","node_modules/botframework-directlinejs/node_modules/src/operator/do.ts","node_modules/botframework-directlinejs/node_modules/src/operators/tap.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/filter.ts","node_modules/botframework-directlinejs/node_modules/src/operator/filter.ts","node_modules/botframework-directlinejs/node_modules/src/operators/filter.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/map.ts","node_modules/botframework-directlinejs/node_modules/src/operator/map.ts","node_modules/botframework-directlinejs/node_modules/src/operators/map.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/mergeMap.ts","node_modules/botframework-directlinejs/node_modules/src/operator/mergeMap.ts","node_modules/botframework-directlinejs/node_modules/src/operators/mergeMap.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/retryWhen.ts","node_modules/botframework-directlinejs/node_modules/src/operator/retryWhen.ts","node_modules/botframework-directlinejs/node_modules/src/operators/retryWhen.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/share.ts","node_modules/botframework-directlinejs/node_modules/src/operator/share.ts","node_modules/botframework-directlinejs/node_modules/src/operators/share.ts","node_modules/botframework-directlinejs/node_modules/src/operators/multicast.ts","node_modules/botframework-directlinejs/node_modules/src/observable/ConnectableObservable.ts","node_modules/botframework-directlinejs/node_modules/src/operators/refCount.ts","node_modules/botframework-directlinejs/node_modules/src/add/operator/take.ts","node_modules/botframework-directlinejs/node_modules/src/operator/take.ts","node_modules/botframework-directlinejs/node_modules/src/operators/take.ts","node_modules/botframework-directlinejs/node_modules/src/util/ArgumentOutOfRangeError.ts","node_modules/botframework-directlinejs/node_modules/src/add/observable/dom/ajax.ts","node_modules/botframework-directlinejs/node_modules/src/observable/dom/ajax.ts","node_modules/botframework-directlinejs/node_modules/src/observable/dom/AjaxObservable.ts","node_modules/botframework-directlinejs/node_modules/src/add/observable/empty.ts","node_modules/botframework-directlinejs/node_modules/src/observable/empty.ts","node_modules/botframework-directlinejs/node_modules/src/add/observable/from.ts","node_modules/botframework-directlinejs/node_modules/src/observable/from.ts","node_modules/botframework-directlinejs/node_modules/src/observable/FromObservable.ts","node_modules/botframework-directlinejs/node_modules/src/observable/PromiseObservable.ts","node_modules/botframework-directlinejs/node_modules/src/observable/IteratorObservable.ts","node_modules/botframework-directlinejs/node_modules/src/observable/ArrayLikeObservable.ts","node_modules/botframework-directlinejs/node_modules/src/operators/observeOn.ts","node_modules/botframework-directlinejs/node_modules/src/add/observable/interval.ts","node_modules/botframework-directlinejs/node_modules/src/observable/interval.ts","node_modules/botframework-directlinejs/node_modules/src/observable/IntervalObservable.ts","node_modules/botframework-directlinejs/node_modules/src/util/isNumeric.ts","node_modules/botframework-directlinejs/node_modules/src/add/observable/of.ts","node_modules/botframework-directlinejs/node_modules/src/observable/of.ts","node_modules/botframework-directlinejs/node_modules/src/add/observable/throw.ts","node_modules/botframework-directlinejs/node_modules/src/observable/throw.ts","node_modules/botframework-directlinejs/node_modules/src/observable/ErrorObservable.ts","node_modules/@aspnet/signalr/src/index.ts","node_modules/@aspnet/signalr/src/Errors.ts","node_modules/@aspnet/signalr/src/HttpClient.ts","node_modules/@aspnet/signalr/src/DefaultHttpClient.ts","node_modules/@aspnet/signalr/src/NodeHttpClient.ts","node_modules/@aspnet/signalr/src/ILogger.ts","node_modules/@aspnet/signalr/src/Utils.ts","node_modules/@aspnet/signalr/src/Loggers.ts","node_modules/buffer/index.js","node_modules/base64-js/index.js","node_modules/ieee754/index.js","node_modules/@aspnet/signalr/src/XhrHttpClient.ts","node_modules/@aspnet/signalr/src/HubConnection.ts","node_modules/@aspnet/signalr/src/HandshakeProtocol.ts","node_modules/@aspnet/signalr/src/TextMessageFormat.ts","node_modules/@aspnet/signalr/src/IHubProtocol.ts","node_modules/@aspnet/signalr/src/HubConnectionBuilder.ts","node_modules/@aspnet/signalr/src/HttpConnection.ts","node_modules/@aspnet/signalr/src/ITransport.ts","node_modules/@aspnet/signalr/src/LongPollingTransport.ts","node_modules/@aspnet/signalr/src/AbortController.ts","node_modules/@aspnet/signalr/src/ServerSentEventsTransport.ts","node_modules/@aspnet/signalr/src/WebSocketTransport.ts","node_modules/@aspnet/signalr/src/JsonHubProtocol.ts","node_modules/opus-media-recorder/OpusMediaRecorder.umd.js","CharacterView.ts","logger.ts","CharacterError.ts","node_modules/unionize/src/index.ts","initGui.ts","utilities.ts","CoolDown.ts","Vocabulary.ts","Token.ts","node_modules/@parcel/runtime-js/lib/runtime-8be5c4fea3167ef9.js","node_modules/ramda/es/internal/_isPlaceholder.js","node_modules/ramda/es/internal/_curry1.js","node_modules/ramda/es/internal/_curry2.js","node_modules/ramda/es/internal/_isArray.js","node_modules/ramda/es/internal/_isTransformer.js","node_modules/ramda/es/internal/_dispatchable.js","node_modules/ramda/es/internal/_xfBase.js","node_modules/ramda/es/internal/_xany.js","node_modules/ramda/es/internal/_reduced.js","node_modules/ramda/es/any.js","node_modules/ramda/es/internal/_isString.js","node_modules/ramda/es/nth.js","node_modules/ramda/es/head.js","node_modules/ramda/es/internal/_has.js","node_modules/ramda/es/internal/_isArguments.js","node_modules/ramda/es/internal/_isObject.js","node_modules/ramda/es/empty.js","node_modules/ramda/es/internal/_arrayFromIterator.js","node_modules/ramda/es/internal/_includesWith.js","node_modules/ramda/es/internal/_objectIs.js","node_modules/ramda/es/keys.js","node_modules/ramda/es/type.js","node_modules/ramda/es/internal/_equals.js","node_modules/ramda/es/internal/_functionName.js","node_modules/ramda/es/equals.js","node_modules/ramda/es/isEmpty.js","node_modules/ramda/es/internal/_isFunction.js","node_modules/ramda/es/internal/_arity.js","node_modules/ramda/es/internal/_curryN.js","node_modules/ramda/es/curryN.js","node_modules/ramda/es/internal/_includes.js","node_modules/ramda/es/internal/_indexOf.js","node_modules/ramda/es/internal/_map.js","node_modules/ramda/es/internal/_quote.js","node_modules/ramda/es/internal/_toISOString.js","node_modules/ramda/es/internal/_isArrayLike.js","node_modules/ramda/es/internal/_xwrap.js","node_modules/ramda/es/bind.js","node_modules/ramda/es/internal/_reduce.js","node_modules/ramda/es/internal/_xfilter.js","node_modules/ramda/es/filter.js","node_modules/ramda/es/internal/_filter.js","node_modules/ramda/es/reject.js","node_modules/ramda/es/internal/_complement.js","node_modules/ramda/es/internal/_toString.js","node_modules/ramda/es/toString.js","node_modules/ramda/es/invoker.js","node_modules/ramda/es/join.js","node_modules/ramda/es/max.js","node_modules/ramda/es/internal/_isNumber.js","node_modules/ramda/es/range.js","node_modules/ramda/es/internal/_checkForMethod.js","node_modules/ramda/es/internal/_curry3.js","node_modules/ramda/es/slice.js","node_modules/ramda/es/tail.js","node_modules/rxjs/src/internal/operators/concatMap.ts","database.ts","AvatarAnimation.ts","Avatar.ts","botCommands.ts","node_modules/tsmonads/src/maybemonad.ts","node_modules/tsmonads/src/trymonad.ts","node_modules/tsmonads/src/helpers.ts","node_modules/tsmonads/monads.ts","node_modules/tsmonads/src/eithermonad.ts","HttpRequestError.ts","Response.ts","BotConnector.ts","node_modules/process/browser.js","node_modules/detect-browser/index.js","node_modules/uuid/dist/esm-browser/rng.js","node_modules/uuid/dist/esm-browser/native.js","node_modules/uuid/dist/esm-browser/stringify.js","node_modules/uuid/dist/esm-browser/v4.js","WaveHeader.ts","SpeechRecognition.ts","node_modules/@parcel/runtime-js/lib/helpers/bundle-url.js","node_modules/@parcel/runtime-js/lib/helpers/get-worker-url.js","node_modules/@parcel/runtime-js/lib/runtime-e059364d85e95f5d.js","Bot.ts","Configuration.ts","CharacterEvent.ts","MessageQueue.ts","actionEnricher.ts","expressionEnricher.ts","parser.ts","Encoding.ts","Gesture.ts","Word.ts","gestureEnricher.ts","lipSyncEnricher.ts","Character.ts","ui.ts"],"sourcesContent":["export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}\n","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n","function setPrototypeOf(o, p) {\n setPrototypeOf = Object.setPrototypeOf || function setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return setPrototypeOf(o, p);\n}\n\nexport default function _setPrototypeOf(o, p) {\n return setPrototypeOf(o, p);\n}\n","import setPrototypeOf from './_set_prototype_of';\n\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\n}\n","export default function _typeof(obj) {\n return obj && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n};\n","function getPrototypeOf(o) {\n getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return getPrototypeOf(o);\n}\n\nexport default function _getPrototypeOf(o) {\n return getPrototypeOf(o);\n}","import assertThisInitialized from './_assert_this_initialized';\nimport _typeof from './_type_of';\n\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return assertThisInitialized(self);\n}\n","import _isNativeReflectConstruct from \"./_is_native_reflect_construct\";\nimport _getPrototypeOf from \"./_get_prototype_of\";\nimport _possibleConstructorReturn from './_possible_constructor_return';\n\nexport default function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n return _possibleConstructorReturn(this, result);\n };\n}","export default function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () { }));\n return true;\n } catch (e) {\n return false;\n }\n}","\"use strict\";\n\nvar mapping = {};\n\nfunction register(pairs) {\n var keys = Object.keys(pairs);\n\n for (var i = 0; i < keys.length; i++) {\n mapping[keys[i]] = pairs[keys[i]];\n }\n}\n\nfunction resolve(id) {\n var resolved = mapping[id];\n\n if (resolved == null) {\n throw new Error('Could not resolve bundle with id ' + id);\n }\n\n return resolved;\n}\n\nmodule.exports.register = register;\nmodule.exports.resolve = resolve;","import { Operator } from './Operator';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, PartialObserver, Subscribable } from './types';\nimport { canReportError } from './util/canReportError';\nimport { toSubscriber } from './util/toSubscriber';\nimport { iif } from './observable/iif';\nimport { throwError } from './observable/throwError';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n\n /** Internal implementation detail, do not use directly. */\n public _isScalar: boolean = false;\n\n /** @deprecated This is an internal implementation detail, do not use. */\n source: Observable;\n\n /** @deprecated This is an internal implementation detail, do not use. */\n operator: Operator;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new cold Observable by calling the Observable constructor\n * @static true\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new cold observable\n * @nocollapse\n * @deprecated use new Observable() instead\n */\n static create: Function = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n }\n\n /**\n * Creates a new Observable, with this Observable as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param {Operator} operator the operator defining the operation to take on the observable\n * @return {Observable} a new observable with the Operator applied\n */\n lift(operator: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observer?: PartialObserver): Subscription;\n /** @deprecated Use an observer instead of a complete callback */\n subscribe(next: null | undefined, error: null | undefined, complete: () => void): Subscription;\n /** @deprecated Use an observer instead of an error callback */\n subscribe(next: null | undefined, error: (error: any) => void, complete?: () => void): Subscription;\n /** @deprecated Use an observer instead of a complete callback */\n subscribe(next: (value: T) => void, error: null | undefined, complete: () => void): Subscription;\n subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided, all errors will\n * be left uncaught.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of Observer,\n * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown.\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * ## Example\n * ### Subscribe with an Observer\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // \"Adding: 1\"\n * // \"Adding: 2\"\n * // \"Adding: 3\"\n * // \"Sum equals: 6\"\n * ```\n *\n * ### Subscribe with functions\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // \"Adding: 1\"\n * // \"Adding: 2\"\n * // \"Adding: 3\"\n * // \"Sum equals: 6\"\n * ```\n *\n * ### Cancel a subscription\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe(\n * num => console.log(num),\n * undefined,\n * () => {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * );\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // \"unsubscribed!\" after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {ISubscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(observerOrNext?: PartialObserver | ((value: T) => void),\n error?: (error: any) => void,\n complete?: () => void): Subscription {\n\n const { operator } = this;\n const sink = toSubscriber(observerOrNext, error, complete);\n\n if (operator) {\n sink.add(operator.call(sink, this.source));\n } else {\n sink.add(\n this.source || (config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?\n this._subscribe(sink) :\n this._trySubscribe(sink)\n );\n }\n\n if (config.useDeprecatedSynchronousErrorHandling) {\n if (sink.syncErrorThrowable) {\n sink.syncErrorThrowable = false;\n if (sink.syncErrorThrown) {\n throw sink.syncErrorValue;\n }\n }\n }\n\n return sink;\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n sink.syncErrorThrown = true;\n sink.syncErrorValue = err;\n }\n if (canReportError(sink)) {\n sink.error(err);\n } else {\n console.warn(err);\n }\n }\n }\n\n /**\n * @method forEach\n * @param {Function} next a handler for each value emitted by the observable\n * @param {PromiseConstructor} [promiseCtor] a constructor function used to instantiate the Promise\n * @return {Promise} a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n // Must be declared in a separate statement to avoid a ReferenceError when\n // accessing subscription below in the closure due to Temporal Dead Zone.\n let subscription: Subscription;\n subscription = this.subscribe((value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n if (subscription) {\n subscription.unsubscribe();\n }\n }\n }, reject, resolve);\n }) as Promise;\n }\n\n /** @internal This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): TeardownLogic {\n const { source } = this;\n return source && source.subscribe(subscriber);\n }\n\n // `if` and `throw` are special snow flakes, the compiler sees them as reserved words. Deprecated in\n // favor of iif and throwError functions.\n /**\n * @nocollapse\n * @deprecated In favor of iif creation function: import { iif } from 'rxjs';\n */\n static if: typeof iif;\n /**\n * @nocollapse\n * @deprecated In favor of throwError creation function: import { throwError } from 'rxjs';\n */\n static throw: typeof throwError;\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction, op9: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction, op9: OperatorFunction, ...operations: OperatorFunction[]): Observable<{}>;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ### Example\n * ```ts\n * import { interval } from 'rxjs';\n * import { map, filter, scan } from 'rxjs/operators';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x))\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n if (operations.length === 0) {\n return this as any;\n }\n\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n toPromise(this: Observable): Promise;\n toPromise(this: Observable, PromiseCtor: typeof Promise): Promise;\n toPromise(this: Observable, PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: any;\n this.subscribe((x: T) => value = x, (err: any) => reject(err), () => resolve(value));\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n if (!promiseCtor) {\n promiseCtor = config.Promise || Promise;\n }\n\n if (!promiseCtor) {\n throw new Error('no Promise impl found');\n }\n\n return promiseCtor;\n}\n","import { Subscriber } from '../Subscriber';\nimport { Subject } from '../Subject';\n\n/**\n * Determines whether the ErrorObserver is closed or stopped or has a\n * destination that is closed or stopped - in which case errors will\n * need to be reported via a different mechanism.\n * @param observer the observer\n */\nexport function canReportError(observer: Subscriber | Subject): boolean {\n while (observer) {\n const { closed, destination, isStopped } = observer as any;\n if (closed || isStopped) {\n return false;\n } else if (destination && destination instanceof Subscriber) {\n observer = destination;\n } else {\n observer = null;\n }\n }\n return true;\n}\n","import { isFunction } from './util/isFunction';\nimport { empty as emptyObserver } from './Observer';\nimport { Observer, PartialObserver, TeardownLogic } from './types';\nimport { Subscription } from './Subscription';\nimport { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';\nimport { config } from './config';\nimport { hostReportError } from './util/hostReportError';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n\n [rxSubscriberSymbol]() { return this; }\n\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param {function(x: ?T): void} [next] The `next` callback of an Observer.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n * @return {Subscriber} A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n */\n static create(next?: (x?: T) => void,\n error?: (e?: any) => void,\n complete?: () => void): Subscriber {\n const subscriber = new Subscriber(next, error, complete);\n subscriber.syncErrorThrowable = false;\n return subscriber;\n }\n\n /** @internal */ syncErrorValue: any = null;\n /** @internal */ syncErrorThrown: boolean = false;\n /** @internal */ syncErrorThrowable: boolean = false;\n\n protected isStopped: boolean = false;\n protected destination: PartialObserver | Subscriber; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @param {Observer|function(value: T): void} [destinationOrNext] A partially\n * defined Observer or a `next` callback function.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n */\n constructor(destinationOrNext?: PartialObserver | ((value: T) => void),\n error?: (e?: any) => void,\n complete?: () => void) {\n super();\n\n switch (arguments.length) {\n case 0:\n this.destination = emptyObserver;\n break;\n case 1:\n if (!destinationOrNext) {\n this.destination = emptyObserver;\n break;\n }\n if (typeof destinationOrNext === 'object') {\n if (destinationOrNext instanceof Subscriber) {\n this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;\n this.destination = destinationOrNext;\n destinationOrNext.add(this);\n } else {\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, > destinationOrNext);\n }\n break;\n }\n default:\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, <((value: T) => void)> destinationOrNext, error, complete);\n break;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (!this.isStopped) {\n this._next(value);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (!this.isStopped) {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (!this.isStopped) {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (this.closed) {\n return;\n }\n this.isStopped = true;\n super.unsubscribe();\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n this.destination.error(err);\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.destination.complete();\n this.unsubscribe();\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _unsubscribeAndRecycle(): Subscriber {\n const { _parentOrParents } = this;\n this._parentOrParents = null;\n this.unsubscribe();\n this.closed = false;\n this.isStopped = false;\n this._parentOrParents = _parentOrParents;\n return this;\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class SafeSubscriber extends Subscriber {\n\n private _context: any;\n\n constructor(private _parentSubscriber: Subscriber,\n observerOrNext?: PartialObserver | ((value: T) => void),\n error?: (e?: any) => void,\n complete?: () => void) {\n super();\n\n let next: ((value: T) => void);\n let context: any = this;\n\n if (isFunction(observerOrNext)) {\n next = (<((value: T) => void)> observerOrNext);\n } else if (observerOrNext) {\n next = (> observerOrNext).next;\n error = (> observerOrNext).error;\n complete = (> observerOrNext).complete;\n if (observerOrNext !== emptyObserver) {\n context = Object.create(observerOrNext);\n if (isFunction(context.unsubscribe)) {\n this.add(<() => void> context.unsubscribe.bind(context));\n }\n context.unsubscribe = this.unsubscribe.bind(this);\n }\n }\n\n this._context = context;\n this._next = next;\n this._error = error;\n this._complete = complete;\n }\n\n next(value?: T): void {\n if (!this.isStopped && this._next) {\n const { _parentSubscriber } = this;\n if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(this._next, value);\n } else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {\n this.unsubscribe();\n }\n }\n }\n\n error(err?: any): void {\n if (!this.isStopped) {\n const { _parentSubscriber } = this;\n const { useDeprecatedSynchronousErrorHandling } = config;\n if (this._error) {\n if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(this._error, err);\n this.unsubscribe();\n } else {\n this.__tryOrSetError(_parentSubscriber, this._error, err);\n this.unsubscribe();\n }\n } else if (!_parentSubscriber.syncErrorThrowable) {\n this.unsubscribe();\n if (useDeprecatedSynchronousErrorHandling) {\n throw err;\n }\n hostReportError(err);\n } else {\n if (useDeprecatedSynchronousErrorHandling) {\n _parentSubscriber.syncErrorValue = err;\n _parentSubscriber.syncErrorThrown = true;\n } else {\n hostReportError(err);\n }\n this.unsubscribe();\n }\n }\n }\n\n complete(): void {\n if (!this.isStopped) {\n const { _parentSubscriber } = this;\n if (this._complete) {\n const wrappedComplete = () => this._complete.call(this._context);\n\n if (!config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(wrappedComplete);\n this.unsubscribe();\n } else {\n this.__tryOrSetError(_parentSubscriber, wrappedComplete);\n this.unsubscribe();\n }\n } else {\n this.unsubscribe();\n }\n }\n }\n\n private __tryOrUnsub(fn: Function, value?: any): void {\n try {\n fn.call(this._context, value);\n } catch (err) {\n this.unsubscribe();\n if (config.useDeprecatedSynchronousErrorHandling) {\n throw err;\n } else {\n hostReportError(err);\n }\n }\n }\n\n private __tryOrSetError(parent: Subscriber, fn: Function, value?: any): boolean {\n if (!config.useDeprecatedSynchronousErrorHandling) {\n throw new Error('bad call');\n }\n try {\n fn.call(this._context, value);\n } catch (err) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n parent.syncErrorValue = err;\n parent.syncErrorThrown = true;\n return true;\n } else {\n hostReportError(err);\n return true;\n }\n }\n return false;\n }\n\n /** @internal This is an internal implementation detail, do not use. */\n _unsubscribe(): void {\n const { _parentSubscriber } = this;\n this._context = null;\n this._parentSubscriber = null;\n _parentSubscriber.unsubscribe();\n }\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","export function isFunction(x: any): x is Function {\n return typeof x === 'function';\n}\n","import { Observer } from './types';\nimport { config } from './config';\nimport { hostReportError } from './util/hostReportError';\n\nexport const empty: Observer = {\n closed: true,\n next(value: any): void { /* noop */},\n error(err: any): void {\n if (config.useDeprecatedSynchronousErrorHandling) {\n throw err;\n } else {\n hostReportError(err);\n }\n },\n complete(): void { /*noop*/ }\n};\n","let _enable_super_gross_mode_that_will_cause_bad_things = false;\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like what Promise contructor should used to create Promises\n */\nexport const config = {\n /**\n * The promise constructor used by default for methods such as\n * {@link toPromise} and {@link forEach}\n */\n Promise: undefined as PromiseConstructorLike,\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BY TIME\n * FOR MIGRATION REASONS.\n */\n set useDeprecatedSynchronousErrorHandling(value: boolean) {\n if (value) {\n const error = new Error();\n console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \\n' + error.stack);\n } else if (_enable_super_gross_mode_that_will_cause_bad_things) {\n console.log('RxJS: Back to a better error behavior. Thank you. <3');\n }\n _enable_super_gross_mode_that_will_cause_bad_things = value;\n },\n\n get useDeprecatedSynchronousErrorHandling() {\n return _enable_super_gross_mode_that_will_cause_bad_things;\n },\n};\n","/**\n * Throws an error on another job so that it's picked up by the runtime's\n * uncaught error handling mechanism.\n * @param err the error to throw\n */\nexport function hostReportError(err: any) {\n setTimeout(() => { throw err; }, 0);\n}","import { isArray } from './util/isArray';\nimport { isObject } from './util/isObject';\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic } from './types';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY: Subscription = (function(empty: any) {\n empty.closed = true;\n return empty;\n }(new Subscription()));\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n * @type {boolean}\n */\n public closed: boolean = false;\n\n /** @internal */\n protected _parentOrParents: Subscription | Subscription[] = null;\n /** @internal */\n private _subscriptions: SubscriptionLike[] = null;\n\n /**\n * @param {function(): void} [unsubscribe] A function describing how to\n * perform the disposal of resources when the `unsubscribe` method is called.\n */\n constructor(unsubscribe?: () => void) {\n if (unsubscribe) {\n ( this)._unsubscribe = unsubscribe;\n }\n }\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[];\n\n if (this.closed) {\n return;\n }\n\n let { _parentOrParents, _unsubscribe, _subscriptions } = ( this);\n\n this.closed = true;\n this._parentOrParents = null;\n // null out _subscriptions first so any child subscriptions that attempt\n // to remove themselves from this subscription will noop\n this._subscriptions = null;\n\n if (_parentOrParents instanceof Subscription) {\n _parentOrParents.remove(this);\n } else if (_parentOrParents !== null) {\n for (let index = 0; index < _parentOrParents.length; ++index) {\n const parent = _parentOrParents[index];\n parent.remove(this);\n }\n }\n\n if (isFunction(_unsubscribe)) {\n try {\n _unsubscribe.call(this);\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? flattenUnsubscriptionErrors(e.errors) : [e];\n }\n }\n\n if (isArray(_subscriptions)) {\n let index = -1;\n let len = _subscriptions.length;\n\n while (++index < len) {\n const sub = _subscriptions[index];\n if (isObject(sub)) {\n try {\n sub.unsubscribe();\n } catch (e) {\n errors = errors || [];\n if (e instanceof UnsubscriptionError) {\n errors = errors.concat(flattenUnsubscriptionErrors(e.errors));\n } else {\n errors.push(e);\n }\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n\n /**\n * Adds a tear down to be called during the unsubscribe() of this\n * Subscription. Can also be used to add a child subscription.\n *\n * If the tear down being added is a subscription that is already\n * unsubscribed, is the same reference `add` is being called on, or is\n * `Subscription.EMPTY`, it will not be added.\n *\n * If this subscription is already in an `closed` state, the passed\n * tear down logic will be executed immediately.\n *\n * When a parent subscription is unsubscribed, any child subscriptions that were added to it are also unsubscribed.\n *\n * @param {TeardownLogic} teardown The additional logic to execute on\n * teardown.\n * @return {Subscription} Returns the Subscription used or created to be\n * added to the inner subscriptions list. This Subscription can be used with\n * `remove()` to remove the passed teardown logic from the inner subscriptions\n * list.\n */\n add(teardown: TeardownLogic): Subscription {\n let subscription = (teardown);\n\n if (!(teardown)) {\n return Subscription.EMPTY;\n }\n\n switch (typeof teardown) {\n case 'function':\n subscription = new Subscription(<(() => void)>teardown);\n case 'object':\n if (subscription === this || subscription.closed || typeof subscription.unsubscribe !== 'function') {\n // This also covers the case where `subscription` is `Subscription.EMPTY`, which is always in `closed` state.\n return subscription;\n } else if (this.closed) {\n subscription.unsubscribe();\n return subscription;\n } else if (!(subscription instanceof Subscription)) {\n const tmp = subscription;\n subscription = new Subscription();\n subscription._subscriptions = [tmp];\n }\n break;\n default: {\n throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');\n }\n }\n\n // Add `this` as parent of `subscription` if that's not already the case.\n let { _parentOrParents } = subscription;\n if (_parentOrParents === null) {\n // If we don't have a parent, then set `subscription._parents` to\n // the `this`, which is the common case that we optimize for.\n subscription._parentOrParents = this;\n } else if (_parentOrParents instanceof Subscription) {\n if (_parentOrParents === this) {\n // The `subscription` already has `this` as a parent.\n return subscription;\n }\n // If there's already one parent, but not multiple, allocate an\n // Array to store the rest of the parent Subscriptions.\n subscription._parentOrParents = [_parentOrParents, this];\n } else if (_parentOrParents.indexOf(this) === -1) {\n // Only add `this` to the _parentOrParents list if it's not already there.\n _parentOrParents.push(this);\n } else {\n // The `subscription` already has `this` as a parent.\n return subscription;\n }\n\n // Optimize for the common case when adding the first subscription.\n const subscriptions = this._subscriptions;\n if (subscriptions === null) {\n this._subscriptions = [subscription];\n } else {\n subscriptions.push(subscription);\n }\n\n return subscription;\n }\n\n /**\n * Removes a Subscription from the internal list of subscriptions that will\n * unsubscribe during the unsubscribe process of this Subscription.\n * @param {Subscription} subscription The subscription to remove.\n * @return {void}\n */\n remove(subscription: Subscription): void {\n const subscriptions = this._subscriptions;\n if (subscriptions) {\n const subscriptionIndex = subscriptions.indexOf(subscription);\n if (subscriptionIndex !== -1) {\n subscriptions.splice(subscriptionIndex, 1);\n }\n }\n }\n}\n\nfunction flattenUnsubscriptionErrors(errors: any[]) {\n return errors.reduce((errs, err) => errs.concat((err instanceof UnsubscriptionError) ? err.errors : err), []);\n}\n","export function isObject(x: any): x is Object {\n return x !== null && typeof x === 'object';\n}\n","export interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n new(errors: any[]): UnsubscriptionError;\n}\n\nfunction UnsubscriptionErrorImpl(this: any, errors: any[]) {\n Error.call(this);\n this.message = errors ?\n `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}` : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n return this;\n}\n\nUnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = UnsubscriptionErrorImpl as any;","/** @deprecated do not use, this is no longer checked by RxJS internals */\nexport const rxSubscriber =\n typeof Symbol === 'function'\n ? Symbol('rxSubscriber')\n : '@@rxSubscriber_' + Math.random();\n\n/**\n * @deprecated use rxSubscriber instead\n */\nexport const $$rxSubscriber = rxSubscriber;\n","import { Subscriber } from '../Subscriber';\nimport { rxSubscriber as rxSubscriberSymbol } from '../symbol/rxSubscriber';\nimport { empty as emptyObserver } from '../Observer';\nimport { PartialObserver } from '../types';\n\nexport function toSubscriber(\n nextOrObserver?: PartialObserver | ((value: T) => void),\n error?: (error: any) => void,\n complete?: () => void): Subscriber {\n\n if (nextOrObserver) {\n if (nextOrObserver instanceof Subscriber) {\n return (> nextOrObserver);\n }\n\n if (nextOrObserver[rxSubscriberSymbol]) {\n return nextOrObserver[rxSubscriberSymbol]();\n }\n }\n\n if (!nextOrObserver && !error && !complete) {\n return new Subscriber(emptyObserver);\n }\n\n return new Subscriber(nextOrObserver, error, complete);\n}\n","import { noop } from './noop';\nimport { UnaryFunction } from '../types';\n\n/* tslint:disable:max-line-length */\nexport function pipe(): UnaryFunction;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction, fn8: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction, fn8: UnaryFunction, fn9: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction, fn4: UnaryFunction, fn5: UnaryFunction, fn6: UnaryFunction, fn7: UnaryFunction, fn8: UnaryFunction, fn9: UnaryFunction, ...fns: UnaryFunction[]): UnaryFunction;\n/* tslint:enable:max-line-length */\n\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (!fns) {\n return noop as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n","import { Subject, SubjectSubscriber } from '../Subject';\nimport { Operator } from '../Operator';\nimport { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { TeardownLogic } from '../types';\nimport { refCount as higherOrderRefCount } from '../operators/refCount';\n\n/**\n * @class ConnectableObservable\n */\nexport class ConnectableObservable extends Observable {\n\n protected _subject: Subject;\n protected _refCount: number = 0;\n protected _connection: Subscription;\n /** @internal */\n _isComplete = false;\n\n constructor(public source: Observable,\n protected subjectFactory: () => Subject) {\n super();\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber) {\n return this.getSubject().subscribe(subscriber);\n }\n\n protected getSubject(): Subject {\n const subject = this._subject;\n if (!subject || subject.isStopped) {\n this._subject = this.subjectFactory();\n }\n return this._subject;\n }\n\n connect(): Subscription {\n let connection = this._connection;\n if (!connection) {\n this._isComplete = false;\n connection = this._connection = new Subscription();\n connection.add(this.source\n .subscribe(new ConnectableSubscriber(this.getSubject(), this)));\n if (connection.closed) {\n this._connection = null;\n connection = Subscription.EMPTY;\n }\n }\n return connection;\n }\n\n refCount(): Observable {\n return higherOrderRefCount()(this) as Observable;\n }\n}\n\nconst connectableProto = ConnectableObservable.prototype;\n\nexport const connectableObservableDescriptor: PropertyDescriptorMap = {\n operator: { value: null },\n _refCount: { value: 0, writable: true },\n _subject: { value: null, writable: true },\n _connection: { value: null, writable: true },\n _subscribe: { value: connectableProto._subscribe },\n _isComplete: { value: connectableProto._isComplete, writable: true },\n getSubject: { value: connectableProto.getSubject },\n connect: { value: connectableProto.connect },\n refCount: { value: connectableProto.refCount }\n};\n\nclass ConnectableSubscriber extends SubjectSubscriber {\n constructor(destination: Subject,\n private connectable: ConnectableObservable) {\n super(destination);\n }\n protected _error(err: any): void {\n this._unsubscribe();\n super._error(err);\n }\n protected _complete(): void {\n this.connectable._isComplete = true;\n this._unsubscribe();\n super._complete();\n }\n protected _unsubscribe() {\n const connectable = this.connectable;\n if (connectable) {\n this.connectable = null;\n const connection = connectable._connection;\n connectable._refCount = 0;\n connectable._subject = null;\n connectable._connection = null;\n if (connection) {\n connection.unsubscribe();\n }\n }\n }\n}\n\nclass RefCountOperator implements Operator {\n constructor(private connectable: ConnectableObservable) {\n }\n call(subscriber: Subscriber, source: any): TeardownLogic {\n\n const { connectable } = this;\n ( connectable)._refCount++;\n\n const refCounter = new RefCountSubscriber(subscriber, connectable);\n const subscription = source.subscribe(refCounter);\n\n if (!refCounter.closed) {\n ( refCounter).connection = connectable.connect();\n }\n\n return subscription;\n }\n}\n\nclass RefCountSubscriber extends Subscriber {\n\n private connection: Subscription;\n\n constructor(destination: Subscriber,\n private connectable: ConnectableObservable) {\n super(destination);\n }\n\n protected _unsubscribe() {\n\n const { connectable } = this;\n if (!connectable) {\n this.connection = null;\n return;\n }\n\n this.connectable = null;\n const refCount = ( connectable)._refCount;\n if (refCount <= 0) {\n this.connection = null;\n return;\n }\n\n ( connectable)._refCount = refCount - 1;\n if (refCount > 1) {\n this.connection = null;\n return;\n }\n\n ///\n // Compare the local RefCountSubscriber's connection Subscription to the\n // connection Subscription on the shared ConnectableObservable. In cases\n // where the ConnectableObservable source synchronously emits values, and\n // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n // execution continues to here before the RefCountOperator has a chance to\n // supply the RefCountSubscriber with the shared connection Subscription.\n // For example:\n // ```\n // range(0, 10).pipe(\n // publish(),\n // refCount(),\n // take(5),\n // ).subscribe();\n // ```\n // In order to account for this case, RefCountSubscriber should only dispose\n // the ConnectableObservable's shared connection Subscription if the\n // connection Subscription exists, *and* either:\n // a. RefCountSubscriber doesn't have a reference to the shared connection\n // Subscription yet, or,\n // b. RefCountSubscriber's connection Subscription reference is identical\n // to the shared connection Subscription\n ///\n const { connection } = this;\n const sharedConnection = ( connectable)._connection;\n this.connection = null;\n\n if (sharedConnection && (!connection || sharedConnection === connection)) {\n sharedConnection.unsubscribe();\n }\n }\n}\n","import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { SubjectSubscription } from './SubjectSubscription';\nimport { rxSubscriber as rxSubscriberSymbol } from '../internal/symbol/rxSubscriber';\n\n/**\n * @class SubjectSubscriber\n */\nexport class SubjectSubscriber extends Subscriber {\n constructor(protected destination: Subject) {\n super(destination);\n }\n}\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n *\n * @class Subject\n */\nexport class Subject extends Observable implements SubscriptionLike {\n\n [rxSubscriberSymbol]() {\n return new SubjectSubscriber(this);\n }\n\n observers: Observer[] = [];\n\n closed = false;\n\n isStopped = false;\n\n hasError = false;\n\n thrownError: any = null;\n\n constructor() {\n super();\n }\n\n /**@nocollapse\n * @deprecated use new Subject() instead\n */\n static create: Function = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n }\n\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator;\n return subject;\n }\n\n next(value?: T) {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n if (!this.isStopped) {\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].next(value);\n }\n }\n }\n\n error(err: any) {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n this.hasError = true;\n this.thrownError = err;\n this.isStopped = true;\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].error(err);\n }\n this.observers.length = 0;\n }\n\n complete() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n this.isStopped = true;\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].complete();\n }\n this.observers.length = 0;\n }\n\n unsubscribe() {\n this.isStopped = true;\n this.closed = true;\n this.observers = null;\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _trySubscribe(subscriber: Subscriber): TeardownLogic {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else {\n return super._trySubscribe(subscriber);\n }\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else if (this.hasError) {\n subscriber.error(this.thrownError);\n return Subscription.EMPTY;\n } else if (this.isStopped) {\n subscriber.complete();\n return Subscription.EMPTY;\n } else {\n this.observers.push(subscriber);\n return new SubjectSubscription(this, subscriber);\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create customize Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable = new Observable();\n (observable).source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(protected destination?: Observer, source?: Observable) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n const { destination } = this;\n if (destination && destination.next) {\n destination.next(value);\n }\n }\n\n error(err: any) {\n const { destination } = this;\n if (destination && destination.error) {\n this.destination.error(err);\n }\n }\n\n complete() {\n const { destination } = this;\n if (destination && destination.complete) {\n this.destination.complete();\n }\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n const { source } = this;\n if (source) {\n return this.source.subscribe(subscriber);\n } else {\n return Subscription.EMPTY;\n }\n }\n}\n","export interface ObjectUnsubscribedError extends Error {\n}\n\nexport interface ObjectUnsubscribedErrorCtor {\n new(): ObjectUnsubscribedError;\n}\n\nfunction ObjectUnsubscribedErrorImpl(this: any) {\n Error.call(this);\n this.message = 'object unsubscribed';\n this.name = 'ObjectUnsubscribedError';\n return this;\n}\n\nObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = ObjectUnsubscribedErrorImpl as any;","import { Subject } from './Subject';\nimport { Observer } from './types';\nimport { Subscription } from './Subscription';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class SubjectSubscription extends Subscription {\n closed: boolean = false;\n\n constructor(public subject: Subject, public subscriber: Observer) {\n super();\n }\n\n unsubscribe() {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n const subject = this.subject;\n const observers = subject.observers;\n\n this.subject = null;\n\n if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n return;\n }\n\n const subscriberIndex = observers.indexOf(this.subscriber);\n\n if (subscriberIndex !== -1) {\n observers.splice(subscriberIndex, 1);\n }\n }\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { MonoTypeOperatorFunction, TeardownLogic } from '../types';\nimport { ConnectableObservable } from '../observable/ConnectableObservable';\nimport { Observable } from '../Observable';\n\n/**\n * Make a {@link ConnectableObservable} behave like a ordinary observable and automates the way\n * you can connect to it.\n *\n * Internally it counts the subscriptions to the observable and subscribes (only once) to the source if\n * the number of subscriptions is larger than 0. If the number of subscriptions is smaller than 1, it\n * unsubscribes from the source. This way you can make sure that everything before the *published*\n * refCount has only a single subscription independently of the number of subscribers to the target\n * observable.\n *\n * Note that using the {@link share} operator is exactly the same as using the *publish* operator\n * (making the observable hot) and the *refCount* operator in a sequence.\n *\n * ![](refCount.png)\n *\n * ## Example\n *\n * In the following example there are two intervals turned into connectable observables\n * by using the *publish* operator. The first one uses the *refCount* operator, the\n * second one does not use it. You will notice that a connectable observable does nothing\n * until you call its connect function.\n *\n * ```ts\n * import { interval } from 'rxjs';\n * import { tap, publish, refCount } from 'rxjs/operators';\n *\n * // Turn the interval observable into a ConnectableObservable (hot)\n * const refCountInterval = interval(400).pipe(\n * tap((num) => console.log(`refCount ${num}`)),\n * publish(),\n * refCount()\n * );\n *\n * const publishedInterval = interval(400).pipe(\n * tap((num) => console.log(`publish ${num}`)),\n * publish()\n * );\n *\n * refCountInterval.subscribe();\n * refCountInterval.subscribe();\n * // 'refCount 0' -----> 'refCount 1' -----> etc\n * // All subscriptions will receive the same value and the tap (and\n * // every other operator) before the publish operator will be executed\n * // only once per event independently of the number of subscriptions.\n *\n * publishedInterval.subscribe();\n * // Nothing happens until you call .connect() on the observable.\n * ```\n *\n * @see {@link ConnectableObservable}\n * @see {@link share}\n * @see {@link publish}\n */\nexport function refCount(): MonoTypeOperatorFunction {\n return function refCountOperatorFunction(source: ConnectableObservable): Observable {\n return source.lift(new RefCountOperator(source));\n } as MonoTypeOperatorFunction;\n}\n\nclass RefCountOperator implements Operator {\n constructor(private connectable: ConnectableObservable) {\n }\n call(subscriber: Subscriber, source: any): TeardownLogic {\n\n const { connectable } = this;\n ( connectable)._refCount++;\n\n const refCounter = new RefCountSubscriber(subscriber, connectable);\n const subscription = source.subscribe(refCounter);\n\n if (!refCounter.closed) {\n ( refCounter).connection = connectable.connect();\n }\n\n return subscription;\n }\n}\n\nclass RefCountSubscriber extends Subscriber {\n\n private connection: Subscription;\n\n constructor(destination: Subscriber,\n private connectable: ConnectableObservable) {\n super(destination);\n }\n\n protected _unsubscribe() {\n\n const { connectable } = this;\n if (!connectable) {\n this.connection = null;\n return;\n }\n\n this.connectable = null;\n const refCount = ( connectable)._refCount;\n if (refCount <= 0) {\n this.connection = null;\n return;\n }\n\n ( connectable)._refCount = refCount - 1;\n if (refCount > 1) {\n this.connection = null;\n return;\n }\n\n ///\n // Compare the local RefCountSubscriber's connection Subscription to the\n // connection Subscription on the shared ConnectableObservable. In cases\n // where the ConnectableObservable source synchronously emits values, and\n // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n // execution continues to here before the RefCountOperator has a chance to\n // supply the RefCountSubscriber with the shared connection Subscription.\n // For example:\n // ```\n // range(0, 10).pipe(\n // publish(),\n // refCount(),\n // take(5),\n // )\n // .subscribe();\n // ```\n // In order to account for this case, RefCountSubscriber should only dispose\n // the ConnectableObservable's shared connection Subscription if the\n // connection Subscription exists, *and* either:\n // a. RefCountSubscriber doesn't have a reference to the shared connection\n // Subscription yet, or,\n // b. RefCountSubscriber's connection Subscription reference is identical\n // to the shared connection Subscription\n ///\n const { connection } = this;\n const sharedConnection = ( connectable)._connection;\n this.connection = null;\n\n if (sharedConnection && (!connection || sharedConnection === connection)) {\n sharedConnection.unsubscribe();\n }\n }\n}\n","import { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { Observable } from '../Observable';\nimport { Operator } from '../Operator';\nimport { Subject } from '../Subject';\nimport { OperatorFunction } from '../types';\n\n/* tslint:disable:max-line-length */\nexport function groupBy(keySelector: (value: T) => K): OperatorFunction>;\nexport function groupBy(keySelector: (value: T) => K, elementSelector: void, durationSelector: (grouped: GroupedObservable) => Observable): OperatorFunction>;\nexport function groupBy(keySelector: (value: T) => K, elementSelector?: (value: T) => R, durationSelector?: (grouped: GroupedObservable) => Observable): OperatorFunction>;\nexport function groupBy(keySelector: (value: T) => K, elementSelector?: (value: T) => R, durationSelector?: (grouped: GroupedObservable) => Observable, subjectSelector?: () => Subject): OperatorFunction>;\n/* tslint:enable:max-line-length */\n\n/**\n * Groups the items emitted by an Observable according to a specified criterion,\n * and emits these grouped items as `GroupedObservables`, one\n * {@link GroupedObservable} per group.\n *\n * ![](groupBy.png)\n *\n * When the Observable emits an item, a key is computed for this item with the keySelector function.\n *\n * If a {@link GroupedObservable} for this key exists, this {@link GroupedObservable} emits. Elsewhere, a new\n * {@link GroupedObservable} for this key is created and emits.\n *\n * A {@link GroupedObservable} represents values belonging to the same group represented by a common key. The common\n * key is available as the key field of a {@link GroupedObservable} instance.\n *\n * The elements emitted by {@link GroupedObservable}s are by default the items emitted by the Observable, or elements\n * returned by the elementSelector function.\n *\n * ## Examples\n *\n * ### Group objects by id and return as array\n *\n * ```ts\n * import { of } from 'rxjs';\n * import { mergeMap, groupBy, reduce } from 'rxjs/operators';\n *\n * of(\n * {id: 1, name: 'JavaScript'},\n * {id: 2, name: 'Parcel'},\n * {id: 2, name: 'webpack'},\n * {id: 1, name: 'TypeScript'},\n * {id: 3, name: 'TSLint'}\n * ).pipe(\n * groupBy(p => p.id),\n * mergeMap((group$) => group$.pipe(reduce((acc, cur) => [...acc, cur], []))),\n * )\n * .subscribe(p => console.log(p));\n *\n * // displays:\n * // [ { id: 1, name: 'JavaScript'},\n * // { id: 1, name: 'TypeScript'} ]\n * //\n * // [ { id: 2, name: 'Parcel'},\n * // { id: 2, name: 'webpack'} ]\n * //\n * // [ { id: 3, name: 'TSLint'} ]\n * ```\n *\n * ### Pivot data on the id field\n *\n * ```ts\n * import { of } from 'rxjs';\n * import { groupBy, map, mergeMap, reduce } from 'rxjs/operators';\n *\n * of(\n * { id: 1, name: 'JavaScript' },\n * { id: 2, name: 'Parcel' },\n * { id: 2, name: 'webpack' },\n * { id: 1, name: 'TypeScript' },\n * { id: 3, name: 'TSLint' }\n * )\n * .pipe(\n * groupBy(p => p.id, p => p.name),\n * mergeMap(group$ =>\n * group$.pipe(reduce((acc, cur) => [...acc, cur], [`${group$.key}`]))\n * ),\n * map(arr => ({ id: parseInt(arr[0], 10), values: arr.slice(1) }))\n * )\n * .subscribe(p => console.log(p));\n *\n * // displays:\n * // { id: 1, values: [ 'JavaScript', 'TypeScript' ] }\n * // { id: 2, values: [ 'Parcel', 'webpack' ] }\n * // { id: 3, values: [ 'TSLint' ] }\n * ```\n *\n * @param {function(value: T): K} keySelector A function that extracts the key\n * for each item.\n * @param {function(value: T): R} [elementSelector] A function that extracts the\n * return element for each item.\n * @param {function(grouped: GroupedObservable): Observable} [durationSelector]\n * A function that returns an Observable to determine how long each group should\n * exist.\n * @return {Observable>} An Observable that emits\n * GroupedObservables, each of which corresponds to a unique key value and each\n * of which emits those items from the source Observable that share that key\n * value.\n * @method groupBy\n * @owner Observable\n */\nexport function groupBy(keySelector: (value: T) => K,\n elementSelector?: ((value: T) => R) | void,\n durationSelector?: (grouped: GroupedObservable) => Observable,\n subjectSelector?: () => Subject): OperatorFunction> {\n return (source: Observable) =>\n source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));\n}\n\nexport interface RefCountSubscription {\n count: number;\n unsubscribe: () => void;\n closed: boolean;\n attemptedToUnsubscribe: boolean;\n}\n\nclass GroupByOperator implements Operator> {\n constructor(private keySelector: (value: T) => K,\n private elementSelector?: ((value: T) => R) | void,\n private durationSelector?: (grouped: GroupedObservable) => Observable,\n private subjectSelector?: () => Subject) {\n }\n\n call(subscriber: Subscriber>, source: any): any {\n return source.subscribe(new GroupBySubscriber(\n subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector\n ));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass GroupBySubscriber extends Subscriber implements RefCountSubscription {\n private groups: Map> = null;\n public attemptedToUnsubscribe: boolean = false;\n public count: number = 0;\n\n constructor(destination: Subscriber>,\n private keySelector: (value: T) => K,\n private elementSelector?: ((value: T) => R) | void,\n private durationSelector?: (grouped: GroupedObservable) => Observable,\n private subjectSelector?: () => Subject) {\n super(destination);\n }\n\n protected _next(value: T): void {\n let key: K;\n try {\n key = this.keySelector(value);\n } catch (err) {\n this.error(err);\n return;\n }\n\n this._group(value, key);\n }\n\n private _group(value: T, key: K) {\n let groups = this.groups;\n\n if (!groups) {\n groups = this.groups = new Map>();\n }\n\n let group = groups.get(key);\n\n let element: R;\n if (this.elementSelector) {\n try {\n element = this.elementSelector(value);\n } catch (err) {\n this.error(err);\n }\n } else {\n element = value;\n }\n\n if (!group) {\n group = (this.subjectSelector ? this.subjectSelector() : new Subject()) as Subject;\n groups.set(key, group);\n const groupedObservable = new GroupedObservable(key, group, this);\n this.destination.next(groupedObservable);\n if (this.durationSelector) {\n let duration: any;\n try {\n duration = this.durationSelector(new GroupedObservable(key, >group));\n } catch (err) {\n this.error(err);\n return;\n }\n this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));\n }\n }\n\n if (!group.closed) {\n group.next(element);\n }\n }\n\n protected _error(err: any): void {\n const groups = this.groups;\n if (groups) {\n groups.forEach((group, key) => {\n group.error(err);\n });\n\n groups.clear();\n }\n this.destination.error(err);\n }\n\n protected _complete(): void {\n const groups = this.groups;\n if (groups) {\n groups.forEach((group, key) => {\n group.complete();\n });\n\n groups.clear();\n }\n this.destination.complete();\n }\n\n removeGroup(key: K): void {\n this.groups.delete(key);\n }\n\n unsubscribe() {\n if (!this.closed) {\n this.attemptedToUnsubscribe = true;\n if (this.count === 0) {\n super.unsubscribe();\n }\n }\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass GroupDurationSubscriber extends Subscriber {\n constructor(private key: K,\n private group: Subject,\n private parent: GroupBySubscriber) {\n super(group);\n }\n\n protected _next(value: T): void {\n this.complete();\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _unsubscribe() {\n const { parent, key } = this;\n this.key = this.parent = null;\n if (parent) {\n parent.removeGroup(key);\n }\n }\n}\n\n/**\n * An Observable representing values belonging to the same group represented by\n * a common key. The values emitted by a GroupedObservable come from the source\n * Observable. The common key is available as the field `key` on a\n * GroupedObservable instance.\n *\n * @class GroupedObservable\n */\nexport class GroupedObservable extends Observable {\n /** @deprecated Do not construct this type. Internal use only */\n constructor(public key: K,\n private groupSubject: Subject,\n private refCountSubscription?: RefCountSubscription) {\n super();\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber) {\n const subscription = new Subscription();\n const { refCountSubscription, groupSubject } = this;\n if (refCountSubscription && !refCountSubscription.closed) {\n subscription.add(new InnerRefCountSubscription(refCountSubscription));\n }\n subscription.add(groupSubject.subscribe(subscriber));\n return subscription;\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass InnerRefCountSubscription extends Subscription {\n constructor(private parent: RefCountSubscription) {\n super();\n parent.count++;\n }\n\n unsubscribe() {\n const parent = this.parent;\n if (!parent.closed && !this.closed) {\n super.unsubscribe();\n parent.count -= 1;\n if (parent.count === 0 && parent.attemptedToUnsubscribe) {\n parent.unsubscribe();\n }\n }\n }\n}\n","import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { SubscriptionLike } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n if (subscription && !(subscription).closed) {\n subscriber.next(this._value);\n }\n return subscription;\n }\n\n getValue(): T {\n if (this.hasError) {\n throw this.thrownError;\n } else if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else {\n return this._value;\n }\n }\n\n next(value: T): void {\n super.next(this._value = value);\n }\n}\n","import { Subject } from './Subject';\nimport { SchedulerLike } from './types';\nimport { queue } from './scheduler/queue';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { ObserveOnSubscriber } from './operators/observeOn';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { SubjectSubscription } from './SubjectSubscription';\n/**\n * A variant of Subject that \"replays\" or emits old values to new subscribers.\n * It buffers a set number of values and will emit those values immediately to\n * any new subscribers in addition to emitting new values to existing subscribers.\n *\n * @class ReplaySubject\n */\nexport class ReplaySubject extends Subject {\n private _events: (ReplayEvent | T)[] = [];\n private _bufferSize: number;\n private _windowTime: number;\n private _infiniteTimeWindow: boolean = false;\n\n constructor(bufferSize: number = Number.POSITIVE_INFINITY,\n windowTime: number = Number.POSITIVE_INFINITY,\n private scheduler?: SchedulerLike) {\n super();\n this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n this._windowTime = windowTime < 1 ? 1 : windowTime;\n\n if (windowTime === Number.POSITIVE_INFINITY) {\n this._infiniteTimeWindow = true;\n this.next = this.nextInfiniteTimeWindow;\n } else {\n this.next = this.nextTimeWindow;\n }\n }\n\n private nextInfiniteTimeWindow(value: T): void {\n const _events = this._events;\n _events.push(value);\n // Since this method is invoked in every next() call than the buffer\n // can overgrow the max size only by one item\n if (_events.length > this._bufferSize) {\n _events.shift();\n }\n\n super.next(value);\n }\n\n private nextTimeWindow(value: T): void {\n this._events.push(new ReplayEvent(this._getNow(), value));\n this._trimBufferThenGetEvents();\n\n super.next(value);\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n // When `_infiniteTimeWindow === true` then the buffer is already trimmed\n const _infiniteTimeWindow = this._infiniteTimeWindow;\n const _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();\n const scheduler = this.scheduler;\n const len = _events.length;\n let subscription: Subscription;\n\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else if (this.isStopped || this.hasError) {\n subscription = Subscription.EMPTY;\n } else {\n this.observers.push(subscriber);\n subscription = new SubjectSubscription(this, subscriber);\n }\n\n if (scheduler) {\n subscriber.add(subscriber = new ObserveOnSubscriber(subscriber, scheduler));\n }\n\n if (_infiniteTimeWindow) {\n for (let i = 0; i < len && !subscriber.closed; i++) {\n subscriber.next(_events[i]);\n }\n } else {\n for (let i = 0; i < len && !subscriber.closed; i++) {\n subscriber.next((>_events[i]).value);\n }\n }\n\n if (this.hasError) {\n subscriber.error(this.thrownError);\n } else if (this.isStopped) {\n subscriber.complete();\n }\n\n return subscription;\n }\n\n _getNow(): number {\n return (this.scheduler || queue).now();\n }\n\n private _trimBufferThenGetEvents(): ReplayEvent[] {\n const now = this._getNow();\n const _bufferSize = this._bufferSize;\n const _windowTime = this._windowTime;\n const _events = []>this._events;\n\n const eventsCount = _events.length;\n let spliceCount = 0;\n\n // Trim events that fall out of the time window.\n // Start at the front of the list. Break early once\n // we encounter an event that falls within the window.\n while (spliceCount < eventsCount) {\n if ((now - _events[spliceCount].time) < _windowTime) {\n break;\n }\n spliceCount++;\n }\n\n if (eventsCount > _bufferSize) {\n spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n }\n\n if (spliceCount > 0) {\n _events.splice(0, spliceCount);\n }\n\n return _events;\n }\n\n}\n\nclass ReplayEvent {\n constructor(public time: number, public value: T) {\n }\n}\n","import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class QueueAction extends AsyncAction {\n\n constructor(protected scheduler: QueueScheduler,\n protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return (delay > 0 || this.closed) ?\n super.execute(state, delay) :\n this._execute(state, delay) ;\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: any, delay: number = 0): any {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Otherwise flush the scheduler starting with this action.\n return scheduler.flush(this);\n }\n}\n","import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class AsyncAction extends Action {\n\n public id: any;\n public state: T;\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler,\n protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, id?: any, delay: number = 0): any {\n return setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(scheduler: AsyncScheduler, id: any, delay: number = 0): any {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay !== null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n clearInterval(id);\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, delay: number): any {\n let errored: boolean = false;\n let errorValue: any = undefined;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n errorValue = !!e && e || new Error(e);\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _unsubscribe() {\n\n const id = this.id;\n const scheduler = this.scheduler;\n const actions = scheduler.actions;\n const index = actions.indexOf(this);\n\n this.work = null;\n this.state = null;\n this.pending = false;\n this.scheduler = null;\n\n if (index !== -1) {\n actions.splice(index, 1);\n }\n\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null;\n }\n}\n","import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n","import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n","import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\n\nexport class AsyncScheduler extends Scheduler {\n public static delegate?: Scheduler;\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @deprecated internal use only\n */\n public active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @deprecated internal use only\n */\n public scheduled: any = undefined;\n\n constructor(SchedulerAction: typeof Action,\n now: () => number = Scheduler.now) {\n super(SchedulerAction, () => {\n if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {\n return AsyncScheduler.delegate.now();\n } else {\n return now();\n }\n });\n }\n\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {\n return AsyncScheduler.delegate.schedule(work, delay, state);\n } else {\n return super.schedule(work, delay, state);\n }\n }\n\n public flush(action: AsyncAction): void {\n\n const {actions} = this;\n\n if (this.active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this.active = true;\n\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (action = actions.shift()); // exhaust the scheduler queue\n\n this.active = false;\n\n if (error) {\n while (action = actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n","import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}\n */\nexport class Scheduler implements SchedulerLike {\n\n /**\n * Note: the extra arrow function wrapper is to make testing by overriding\n * Date.now easier.\n * @nocollapse\n */\n public static now: () => number = () => Date.now();\n\n constructor(private SchedulerAction: typeof Action,\n now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.SchedulerAction(this, work).schedule(state, delay);\n }\n}\n","import { Observable } from '../Observable';\nimport { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { Notification } from '../Notification';\nimport { MonoTypeOperatorFunction, PartialObserver, SchedulerAction, SchedulerLike, TeardownLogic } from '../types';\n\n/**\n *\n * Re-emits all notifications from source Observable with specified scheduler.\n *\n * Ensure a specific scheduler is used, from outside of an Observable.\n *\n * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule\n * notifications emitted by the source Observable. It might be useful, if you do not have control over\n * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.\n *\n * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,\n * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal\n * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits\n * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.\n * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split\n * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source\n * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a\n * little bit more, to ensure that they are emitted at expected moments.\n *\n * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications\n * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`\n * will delay all notifications - including error notifications - while `delay` will pass through error\n * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator\n * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used\n * for notification emissions in general.\n *\n * ## Example\n * Ensure values in subscribe are called just before browser repaint.\n * ```ts\n * import { interval } from 'rxjs';\n * import { observeOn } from 'rxjs/operators';\n *\n * const intervals = interval(10); // Intervals are scheduled\n * // with async scheduler by default...\n * intervals.pipe(\n * observeOn(animationFrameScheduler), // ...but we will observe on animationFrame\n * ) // scheduler to ensure smooth animation.\n * .subscribe(val => {\n * someDiv.style.height = val + 'px';\n * });\n * ```\n *\n * @see {@link delay}\n *\n * @param {SchedulerLike} scheduler Scheduler that will be used to reschedule notifications from source Observable.\n * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled.\n * @return {Observable} Observable that emits the same notifications as the source Observable,\n * but with provided scheduler.\n *\n * @method observeOn\n * @owner Observable\n */\nexport function observeOn(scheduler: SchedulerLike, delay: number = 0): MonoTypeOperatorFunction {\n return function observeOnOperatorFunction(source: Observable): Observable {\n return source.lift(new ObserveOnOperator(scheduler, delay));\n };\n}\n\nexport class ObserveOnOperator implements Operator {\n constructor(private scheduler: SchedulerLike, private delay: number = 0) {\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class ObserveOnSubscriber extends Subscriber {\n /** @nocollapse */\n static dispatch(this: SchedulerAction, arg: ObserveOnMessage) {\n const { notification, destination } = arg;\n notification.observe(destination);\n this.unsubscribe();\n }\n\n constructor(destination: Subscriber,\n private scheduler: SchedulerLike,\n private delay: number = 0) {\n super(destination);\n }\n\n private scheduleMessage(notification: Notification): void {\n const destination = this.destination as Subscription;\n destination.add(this.scheduler.schedule(\n ObserveOnSubscriber.dispatch,\n this.delay,\n new ObserveOnMessage(notification, this.destination)\n ));\n }\n\n protected _next(value: T): void {\n this.scheduleMessage(Notification.createNext(value));\n }\n\n protected _error(err: any): void {\n this.scheduleMessage(Notification.createError(err));\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.scheduleMessage(Notification.createComplete());\n this.unsubscribe();\n }\n}\n\nexport class ObserveOnMessage {\n constructor(public notification: Notification,\n public destination: PartialObserver) {\n }\n}\n","import { PartialObserver } from './types';\nimport { Observable } from './Observable';\nimport { empty } from './observable/empty';\nimport { of } from './observable/of';\nimport { throwError } from './observable/throwError';\nimport { deprecate } from 'util';\n\n// TODO: When this enum is removed, replace it with a type alias. See #4556.\n/**\n * @deprecated NotificationKind is deprecated as const enums are not compatible with isolated modules. Use a string literal instead.\n */\nexport enum NotificationKind {\n NEXT = 'N',\n ERROR = 'E',\n COMPLETE = 'C',\n}\n\n/**\n * Represents a push-based event or value that an {@link Observable} can emit.\n * This class is particularly useful for operators that manage notifications,\n * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and\n * others. Besides wrapping the actual delivered value, it also annotates it\n * with metadata of, for instance, what type of push message it is (`next`,\n * `error`, or `complete`).\n *\n * @see {@link materialize}\n * @see {@link dematerialize}\n * @see {@link observeOn}\n *\n * @class Notification\n */\nexport class Notification {\n hasValue: boolean;\n\n constructor(public kind: 'N' | 'E' | 'C', public value?: T, public error?: any) {\n this.hasValue = kind === 'N';\n }\n\n /**\n * Delivers to the given `observer` the value wrapped by this Notification.\n * @param {Observer} observer\n * @return\n */\n observe(observer: PartialObserver): any {\n switch (this.kind) {\n case 'N':\n return observer.next && observer.next(this.value);\n case 'E':\n return observer.error && observer.error(this.error);\n case 'C':\n return observer.complete && observer.complete();\n }\n }\n\n /**\n * Given some {@link Observer} callbacks, deliver the value represented by the\n * current Notification to the correctly corresponding callback.\n * @param {function(value: T): void} next An Observer `next` callback.\n * @param {function(err: any): void} [error] An Observer `error` callback.\n * @param {function(): void} [complete] An Observer `complete` callback.\n * @return {any}\n */\n do(next: (value: T) => void, error?: (err: any) => void, complete?: () => void): any {\n const kind = this.kind;\n switch (kind) {\n case 'N':\n return next && next(this.value);\n case 'E':\n return error && error(this.error);\n case 'C':\n return complete && complete();\n }\n }\n\n /**\n * Takes an Observer or its individual callback functions, and calls `observe`\n * or `do` methods accordingly.\n * @param {Observer|function(value: T): void} nextOrObserver An Observer or\n * the `next` callback.\n * @param {function(err: any): void} [error] An Observer `error` callback.\n * @param {function(): void} [complete] An Observer `complete` callback.\n * @return {any}\n */\n accept(nextOrObserver: PartialObserver | ((value: T) => void), error?: (err: any) => void, complete?: () => void) {\n if (nextOrObserver && typeof (>nextOrObserver).next === 'function') {\n return this.observe(>nextOrObserver);\n } else {\n return this.do(<(value: T) => void>nextOrObserver, error, complete);\n }\n }\n\n /**\n * Returns a simple Observable that just delivers the notification represented\n * by this Notification instance.\n * @return {any}\n */\n toObservable(): Observable {\n const kind = this.kind;\n switch (kind) {\n case 'N':\n return of(this.value);\n case 'E':\n return throwError(this.error);\n case 'C':\n return empty();\n }\n throw new Error('unexpected notification kind value');\n }\n\n private static completeNotification: Notification = new Notification('C');\n private static undefinedValueNotification: Notification = new Notification('N', undefined);\n\n /**\n * A shortcut to create a Notification instance of the type `next` from a\n * given value.\n * @param {T} value The `next` value.\n * @return {Notification} The \"next\" Notification representing the\n * argument.\n * @nocollapse\n */\n static createNext(value: T): Notification {\n if (typeof value !== 'undefined') {\n return new Notification('N', value);\n }\n return Notification.undefinedValueNotification;\n }\n\n /**\n * A shortcut to create a Notification instance of the type `error` from a\n * given error.\n * @param {any} [err] The `error` error.\n * @return {Notification} The \"error\" Notification representing the\n * argument.\n * @nocollapse\n */\n static createError(err?: any): Notification {\n return new Notification('E', undefined, err);\n }\n\n /**\n * A shortcut to create a Notification instance of the type `complete`.\n * @return {Notification} The valueless \"complete\" Notification.\n * @nocollapse\n */\n static createComplete(): Notification {\n return Notification.completeNotification;\n }\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * The same Observable instance returned by any call to {@link empty} without a\n * `scheduler`. It is preferrable to use this over `empty()`.\n */\nexport const EMPTY = new Observable(subscriber => subscriber.complete());\n\n/**\n * Creates an Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n * \n *\n * ![](empty.png)\n *\n * This static operator is useful for creating a simple Observable that only\n * emits the complete notification. It can be used for composing with other\n * Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n * ### Emit the number 7, then complete\n * ```ts\n * import { empty } from 'rxjs';\n * import { startWith } from 'rxjs/operators';\n *\n * const result = empty().pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n * ```\n *\n * ### Map and flatten only odd numbers to the sequence 'a', 'b', 'c'\n * ```ts\n * import { empty, interval } from 'rxjs';\n * import { mergeMap } from 'rxjs/operators';\n *\n * const interval$ = interval(1000);\n * result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : empty()),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval eg(0,1,2,3,...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1 print abc\n * // if x % 2 is not equal to 1 nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link never}\n * @see {@link of}\n * @see {@link throwError}\n *\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @return An \"empty\" Observable: emits only the complete\n * notification.\n * @deprecated Deprecated in favor of using {@link EMPTY} constant, or {@link scheduled} (e.g. `scheduled([], scheduler)`)\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable(subscriber => scheduler.schedule(() => subscriber.complete()));\n}\n","import { SchedulerLike } from '../types';\nimport { isScheduler } from '../util/isScheduler';\nimport { fromArray } from './fromArray';\nimport { Observable } from '../Observable';\nimport { scheduleArray } from '../scheduled/scheduleArray';\n\n/* tslint:disable:max-line-length */\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, c: T3, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, c: T3, d: T4, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, scheduler: SchedulerLike):\n Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, scheduler: SchedulerLike):\n Observable;\n/** @deprecated use {@link scheduled} instead `scheduled([a, b, c], scheduler)` */\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, i: T9, scheduler: SchedulerLike):\n Observable;\nexport function of(...args: (T | SchedulerLike)[]): Observable;\n\n// TODO(benlesh): Update the typings for this when we can switch to TS 3.x\nexport function of(a: T): Observable;\nexport function of(a: T, b: T2): Observable;\nexport function of(a: T, b: T2, c: T3): Observable;\nexport function of(a: T, b: T2, c: T3, d: T4): Observable;\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5): Observable;\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6): Observable;\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7):\n Observable;\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8):\n Observable;\nexport function of(a: T, b: T2, c: T3, d: T4, e: T5, f: T6, g: T7, h: T8, i: T9):\n Observable;\nexport function of(...args: T[]): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Converts the arguments to an observable sequence.\n *\n * Each argument becomes a `next` notification.\n *\n * ![](of.png)\n *\n * Unlike {@link from}, it does not do any flattening and emits each argument in whole\n * as a separate `next` notification.\n *\n * ## Examples\n *\n * Emit the values `10, 20, 30`\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * of(10, 20, 30)\n * .subscribe(\n * next => console.log('next:', next),\n * err => console.log('error:', err),\n * () => console.log('the end'),\n * );\n * // result:\n * // 'next: 10'\n * // 'next: 20'\n * // 'next: 30'\n *\n * ```\n *\n * Emit the array `[1,2,3]`\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * of([1,2,3])\n * .subscribe(\n * next => console.log('next:', next),\n * err => console.log('error:', err),\n * () => console.log('the end'),\n * );\n * // result:\n * // 'next: [1,2,3]'\n * ```\n *\n * @see {@link from}\n * @see {@link range}\n *\n * @param {...T} values A comma separated list of arguments you want to be emitted\n * @return {Observable} An Observable that emits the arguments\n * described above and then completes.\n * @method of\n * @owner Observable\n */\n\nexport function of(...args: Array): Observable {\n let scheduler = args[args.length - 1] as SchedulerLike;\n if (isScheduler(scheduler)) {\n args.pop();\n return scheduleArray(args as T[], scheduler);\n } else {\n return fromArray(args as T[]);\n }\n}\n","import { SchedulerLike } from '../types';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && typeof (value).schedule === 'function';\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { subscribeToArray } from '../util/subscribeToArray';\nimport { scheduleArray } from '../scheduled/scheduleArray';\n\nexport function fromArray(input: ArrayLike, scheduler?: SchedulerLike) {\n if (!scheduler) {\n return new Observable(subscribeToArray(input));\n } else {\n return scheduleArray(input, scheduler);\n }\n}\n","import { Subscriber } from '../Subscriber';\n\n/**\n * Subscribes to an ArrayLike with a subscriber\n * @param array The array or array-like to subscribe to\n */\nexport const subscribeToArray = (array: ArrayLike) => (subscriber: Subscriber) => {\n for (let i = 0, len = array.length; i < len && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n};\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { Subscription } from '../Subscription';\n\nexport function scheduleArray(input: ArrayLike, scheduler: SchedulerLike) {\n return new Observable(subscriber => {\n const sub = new Subscription();\n let i = 0;\n sub.add(scheduler.schedule(function () {\n if (i === input.length) {\n subscriber.complete();\n return;\n }\n subscriber.next(input[i++]);\n if (!subscriber.closed) {\n sub.add(this.schedule());\n }\n }));\n return sub;\n });\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { Subscriber } from '../Subscriber';\n\n/**\n * Creates an Observable that emits no items to the Observer and immediately\n * emits an error notification.\n *\n * Just emits 'error', and nothing else.\n * \n *\n * ![](throw.png)\n *\n * This static operator is useful for creating a simple Observable that only\n * emits the error notification. It can be used for composing with other\n * Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n * ### Emit the number 7, then emit an error\n * ```ts\n * import { throwError, concat, of } from 'rxjs';\n *\n * const result = concat(of(7), throwError(new Error('oops!')));\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * // Logs:\n * // 7\n * // Error: oops!\n * ```\n *\n * ---\n *\n * ### Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 2\n * ```ts\n * import { throwError, interval, of } from 'rxjs';\n * import { mergeMap } from 'rxjs/operators';\n *\n * interval(1000).pipe(\n * mergeMap(x => x === 2\n * ? throwError('Twos are bad')\n * : of('a', 'b', 'c')\n * ),\n * ).subscribe(x => console.log(x), e => console.error(e));\n *\n * // Logs:\n * // a\n * // b\n * // c\n * // a\n * // b\n * // c\n * // Twos are bad\n * ```\n *\n * @see {@link Observable}\n * @see {@link empty}\n * @see {@link never}\n * @see {@link of}\n *\n * @param {any} error The particular Error to pass to the error notification.\n * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling\n * the emission of the error notification.\n * @return {Observable} An error Observable: emits only the error notification\n * using the given error argument.\n * @static true\n * @name throwError\n * @owner Observable\n */\nexport function throwError(error: any, scheduler?: SchedulerLike): Observable {\n if (!scheduler) {\n return new Observable(subscriber => subscriber.error(error));\n } else {\n return new Observable(subscriber => scheduler.schedule(dispatch, 0, { error, subscriber }));\n }\n}\n\ninterface DispatchArg {\n error: any;\n subscriber: Subscriber;\n}\n\nfunction dispatch({ error, subscriber }: DispatchArg) {\n subscriber.error(error);\n}\n","import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that only emits a value when it completes. It will emit\n * its latest value to all its observers on completion.\n *\n * @class AsyncSubject\n */\nexport class AsyncSubject extends Subject {\n private value: T = null;\n private hasNext: boolean = false;\n private hasCompleted: boolean = false;\n\n /** @deprecated This is an internal implementation detail, do not use. */\n _subscribe(subscriber: Subscriber): Subscription {\n if (this.hasError) {\n subscriber.error(this.thrownError);\n return Subscription.EMPTY;\n } else if (this.hasCompleted && this.hasNext) {\n subscriber.next(this.value);\n subscriber.complete();\n return Subscription.EMPTY;\n }\n return super._subscribe(subscriber);\n }\n\n next(value: T): void {\n if (!this.hasCompleted) {\n this.value = value;\n this.hasNext = true;\n }\n }\n\n error(error: any): void {\n if (!this.hasCompleted) {\n super.error(error);\n }\n }\n\n complete(): void {\n this.hasCompleted = true;\n if (this.hasNext) {\n super.next(this.value);\n }\n super.complete();\n }\n}\n","import { Immediate } from '../util/Immediate';\nimport { AsyncAction } from './AsyncAction';\nimport { AsapScheduler } from './AsapScheduler';\nimport { SchedulerAction } from '../types';\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class AsapAction extends AsyncAction {\n\n constructor(protected scheduler: AsapScheduler,\n protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AsapScheduler, id?: any, delay: number = 0): any {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If a microtask has already been scheduled, don't schedule another\n // one. If a microtask hasn't been scheduled yet, schedule one now. Return\n // the current scheduled microtask id.\n return scheduler.scheduled || (scheduler.scheduled = Immediate.setImmediate(\n scheduler.flush.bind(scheduler, null)\n ));\n }\n protected recycleAsyncId(scheduler: AsapScheduler, id?: any, delay: number = 0): any {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue is empty, cancel the requested microtask and\n // set the scheduled flag to undefined so the next AsapAction will schedule\n // its own.\n if (scheduler.actions.length === 0) {\n Immediate.clearImmediate(id);\n scheduler.scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n","let nextHandle = 1;\n\nconst tasksByHandle: { [handle: string]: () => void } = {};\n\nfunction runIfPresent(handle: number) {\n const cb = tasksByHandle[handle];\n if (cb) {\n cb();\n }\n}\n\nexport const Immediate = {\n setImmediate(cb: () => void): number {\n const handle = nextHandle++;\n tasksByHandle[handle] = cb;\n Promise.resolve().then(() => runIfPresent(handle));\n return handle;\n },\n\n clearImmediate(handle: number): void {\n delete tasksByHandle[handle];\n },\n};\n","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AsapScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n\n this.active = true;\n this.scheduled = undefined;\n\n const {actions} = this;\n let error: any;\n let index: number = -1;\n let count: number = actions.length;\n action = action || actions.shift();\n\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (++index < count && (action = actions.shift()));\n\n this.active = false;\n\n if (error) {\n while (++index < count && (action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n","import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class AnimationFrameAction extends AsyncAction {\n\n constructor(protected scheduler: AnimationFrameScheduler,\n protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay: number = 0): any {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(\n () => scheduler.flush(null)));\n }\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: any, delay: number = 0): any {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue is empty, cancel the requested animation frame and\n // set the scheduled flag to undefined so the next AnimationFrameAction will\n // request its own.\n if (scheduler.actions.length === 0) {\n cancelAnimationFrame(id);\n scheduler.scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n\n this.active = true;\n this.scheduled = undefined;\n\n const {actions} = this;\n let error: any;\n let index: number = -1;\n let count: number = actions.length;\n action = action || actions.shift();\n\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (++index < count && (action = actions.shift()));\n\n this.active = false;\n\n if (error) {\n while (++index < count && (action = actions.shift())) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n","import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { SchedulerAction } from '../types';\n\nexport class VirtualTimeScheduler extends AsyncScheduler {\n\n protected static frameTimeFactor: number = 10;\n\n public frame: number = 0;\n public index: number = -1;\n\n constructor(SchedulerAction: typeof AsyncAction = VirtualAction as any,\n public maxFrames: number = Number.POSITIVE_INFINITY) {\n super(SchedulerAction, () => this.frame);\n }\n\n /**\n * Prompt the Scheduler to execute all of its queued actions, therefore\n * clearing its queue.\n * @return {void}\n */\n public flush(): void {\n\n const {actions, maxFrames} = this;\n let error: any, action: AsyncAction;\n\n while ((action = actions[0]) && action.delay <= maxFrames) {\n actions.shift();\n this.frame = action.delay;\n\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n }\n\n if (error) {\n while (action = actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @nodoc\n */\nexport class VirtualAction extends AsyncAction {\n\n protected active: boolean = true;\n\n constructor(protected scheduler: VirtualTimeScheduler,\n protected work: (this: SchedulerAction, state?: T) => void,\n protected index: number = scheduler.index += 1) {\n super(scheduler, work);\n this.index = scheduler.index = index;\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (!this.id) {\n return super.schedule(state, delay);\n }\n this.active = false;\n // If an action is rescheduled, we save allocations by mutating its state,\n // pushing it to the end of the scheduler queue, and recycling the action.\n // But since the VirtualTimeScheduler is used for testing, VirtualActions\n // must be immutable so they can be inspected later.\n const action = new VirtualAction(this.scheduler, this.work);\n this.add(action);\n return action.schedule(state, delay);\n }\n\n protected requestAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): any {\n this.delay = scheduler.frame + delay;\n const {actions} = scheduler;\n actions.push(this);\n (actions as Array>).sort(VirtualAction.sortActions);\n return true;\n }\n\n protected recycleAsyncId(scheduler: VirtualTimeScheduler, id?: any, delay: number = 0): any {\n return undefined;\n }\n\n protected _execute(state: T, delay: number): any {\n if (this.active === true) {\n return super._execute(state, delay);\n }\n }\n\n public static sortActions(a: VirtualAction, b: VirtualAction) {\n if (a.delay === b.delay) {\n if (a.index === b.index) {\n return 0;\n } else if (a.index > b.index) {\n return 1;\n } else {\n return -1;\n }\n } else if (a.delay > b.delay) {\n return 1;\n } else {\n return -1;\n }\n }\n}\n","export function identity(x: T): T {\n return x;\n}\n","import { Observable } from '../Observable';\nimport { ObservableInput } from '../types';\n\n/**\n * Tests to see if the object is an RxJS {@link Observable}\n * @param obj the object to test\n */\nexport function isObservable(obj: any): obj is Observable {\n return !!obj && (obj instanceof Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));\n}\n","export interface ArgumentOutOfRangeError extends Error {\n}\n\nexport interface ArgumentOutOfRangeErrorCtor {\n new(): ArgumentOutOfRangeError;\n}\n\nfunction ArgumentOutOfRangeErrorImpl(this: any) {\n Error.call(this);\n this.message = 'argument out of range';\n this.name = 'ArgumentOutOfRangeError';\n return this;\n}\n\nArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);\n\n/**\n * An error thrown when an element was queried at a certain index of an\n * Observable, but no such index or position exists in that sequence.\n *\n * @see {@link elementAt}\n * @see {@link take}\n * @see {@link takeLast}\n *\n * @class ArgumentOutOfRangeError\n */\nexport const ArgumentOutOfRangeError: ArgumentOutOfRangeErrorCtor = ArgumentOutOfRangeErrorImpl as any;","export interface EmptyError extends Error {\n}\n\nexport interface EmptyErrorCtor {\n new(): EmptyError;\n}\n\nfunction EmptyErrorImpl(this: any) {\n Error.call(this);\n this.message = 'no elements in sequence';\n this.name = 'EmptyError';\n return this;\n}\n\nEmptyErrorImpl.prototype = Object.create(Error.prototype);\n\n/**\n * An error thrown when an Observable or a sequence was queried but has no\n * elements.\n *\n * @see {@link first}\n * @see {@link last}\n * @see {@link single}\n *\n * @class EmptyError\n */\nexport const EmptyError: EmptyErrorCtor = EmptyErrorImpl as any;","export interface TimeoutError extends Error {\n}\n\nexport interface TimeoutErrorCtor {\n new(): TimeoutError;\n}\n\nfunction TimeoutErrorImpl(this: any) {\n Error.call(this);\n this.message = 'Timeout has occurred';\n this.name = 'TimeoutError';\n return this;\n}\n\nTimeoutErrorImpl.prototype = Object.create(Error.prototype);\n\n/**\n * An error thrown when duetime elapses.\n *\n * @see {@link operators/timeout}\n *\n * @class TimeoutError\n */\nexport const TimeoutError: TimeoutErrorCtor = TimeoutErrorImpl as any;\n","import { SchedulerLike, SchedulerAction } from '../types';\nimport { Observable } from '../Observable';\nimport { AsyncSubject } from '../AsyncSubject';\nimport { Subscriber } from '../Subscriber';\nimport { map } from '../operators/map';\nimport { canReportError } from '../util/canReportError';\nimport { isArray } from '../util/isArray';\nimport { isScheduler } from '../util/isScheduler';\n\n// tslint:disable:max-line-length\n/** @deprecated resultSelector is no longer supported, use a mapping function. */\nexport function bindCallback(callbackFunc: Function, resultSelector: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable;\n\nexport function bindCallback(callbackFunc: (callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): () => Observable;\nexport function bindCallback(callbackFunc: (callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2, R3]>;\nexport function bindCallback(callbackFunc: (callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2]>;\nexport function bindCallback(callbackFunc: (callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): () => Observable;\nexport function bindCallback(callbackFunc: (callback: () => any) => any, scheduler?: SchedulerLike): () => Observable;\n\nexport function bindCallback(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2, R3]>;\nexport function bindCallback(callbackFunc: (arg1: A1, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2]>;\nexport function bindCallback(callbackFunc: (arg1: A1, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable;\n\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2, R3]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable;\n\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2, R3]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable;\n\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2, R3]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable;\n\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2, R3]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2]>;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable;\nexport function bindCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: () => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable;\n\nexport function bindCallback(callbackFunc: (...args: Array any)>) => any, scheduler?: SchedulerLike): (...args: A[]) => Observable;\nexport function bindCallback(callbackFunc: (...args: Array any)>) => any, scheduler?: SchedulerLike): (...args: A[]) => Observable;\n\nexport function bindCallback(callbackFunc: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable;\n\n// tslint:enable:max-line-length\n\n/**\n * Converts a callback API to a function that returns an Observable.\n *\n * Give it a function `f` of type `f(x, callback)` and\n * it will return a function `g` that when called as `g(x)` will output an\n * Observable.\n *\n * `bindCallback` is not an operator because its input and output are not\n * Observables. The input is a function `func` with some parameters. The\n * last parameter must be a callback function that `func` calls when it is\n * done.\n *\n * The output of `bindCallback` is a function that takes the same parameters\n * as `func`, except the last one (the callback). When the output function\n * is called with arguments it will return an Observable. If function `func`\n * calls its callback with one argument, the Observable will emit that value.\n * If on the other hand the callback is called with multiple values the resulting\n * Observable will emit an array with said values as arguments.\n *\n * It is **very important** to remember that input function `func` is not called\n * when the output function is, but rather when the Observable returned by the output\n * function is subscribed. This means if `func` makes an AJAX request, that request\n * will be made every time someone subscribes to the resulting Observable, but not before.\n *\n * The last optional parameter - `scheduler` - can be used to control when the call\n * to `func` happens after someone subscribes to Observable, as well as when results\n * passed to callback will be emitted. By default, the subscription to an Observable calls `func`\n * synchronously, but using {@link asyncScheduler} as the last parameter will defer the call to `func`,\n * just like wrapping the call in `setTimeout` with a timeout of `0` would. If you were to use the async Scheduler\n * and call `subscribe` on the output Observable, all function calls that are currently executing\n * will end before `func` is invoked.\n *\n * By default, results passed to the callback are emitted immediately after `func` invokes the callback.\n * In particular, if the callback is called synchronously, then the subscription of the resulting Observable\n * will call the `next` function synchronously as well. If you want to defer that call,\n * you may use {@link asyncScheduler} just as before. This means that by using `Scheduler.async` you can\n * ensure that `func` always calls its callback asynchronously, thus avoiding terrifying Zalgo.\n *\n * Note that the Observable created by the output function will always emit a single value\n * and then complete immediately. If `func` calls the callback multiple times, values from subsequent\n * calls will not appear in the stream. If you need to listen for multiple calls,\n * you probably want to use {@link fromEvent} or {@link fromEventPattern} instead.\n *\n * If `func` depends on some context (`this` property) and is not already bound, the context of `func`\n * will be the context that the output function has at call time. In particular, if `func`\n * is called as a method of some objec and if `func` is not already bound, in order to preserve the context\n * it is recommended that the context of the output function is set to that object as well.\n *\n * If the input function calls its callback in the \"node style\" (i.e. first argument to callback is\n * optional error parameter signaling whether the call failed or not), {@link bindNodeCallback}\n * provides convenient error handling and probably is a better choice.\n * `bindCallback` will treat such functions the same as any other and error parameters\n * (whether passed or not) will always be interpreted as regular callback argument.\n *\n * ## Examples\n *\n * ### Convert jQuery's getJSON to an Observable API\n * ```ts\n * import { bindCallback } from 'rxjs';\n * import * as jQuery from 'jquery';\n *\n * // Suppose we have jQuery.getJSON('/my/url', callback)\n * const getJSONAsObservable = bindCallback(jQuery.getJSON);\n * const result = getJSONAsObservable('/my/url');\n * result.subscribe(x => console.log(x), e => console.error(e));\n * ```\n *\n * ### Receive an array of arguments passed to a callback\n * ```ts\n * import { bindCallback } from 'rxjs';\n *\n * const someFunction = (a, b, c) => {\n * console.log(a); // 5\n * console.log(b); // 'some string'\n * console.log(c); // {someProperty: 'someValue'}\n * };\n *\n * const boundSomeFunction = bindCallback(someFunction);\n * boundSomeFunction().subscribe(values => {\n * console.log(values) // [5, 'some string', {someProperty: 'someValue'}]\n * });\n * ```\n *\n * ### Compare behaviour with and without async Scheduler\n * ```ts\n * import { bindCallback } from 'rxjs';\n *\n * function iCallMyCallbackSynchronously(cb) {\n * cb();\n * }\n *\n * const boundSyncFn = bindCallback(iCallMyCallbackSynchronously);\n * const boundAsyncFn = bindCallback(iCallMyCallbackSynchronously, null, Rx.Scheduler.async);\n *\n * boundSyncFn().subscribe(() => console.log('I was sync!'));\n * boundAsyncFn().subscribe(() => console.log('I was async!'));\n * console.log('This happened...');\n *\n * // Logs:\n * // I was sync!\n * // This happened...\n * // I was async!\n * ```\n *\n * ### Use bindCallback on an object method\n * ```ts\n * import { bindCallback } from 'rxjs';\n *\n * const boundMethod = bindCallback(someObject.methodWithCallback);\n * boundMethod.call(someObject) // make sure methodWithCallback has access to someObject\n * .subscribe(subscriber);\n * ```\n *\n * @see {@link bindNodeCallback}\n * @see {@link from}\n *\n * @param {function} func A function with a callback as the last parameter.\n * @param {SchedulerLike} [scheduler] The scheduler on which to schedule the\n * callbacks.\n * @return {function(...params: *): Observable} A function which returns the\n * Observable that delivers the same values the callback would deliver.\n * @name bindCallback\n */\nexport function bindCallback(\n callbackFunc: Function,\n resultSelector?: Function|SchedulerLike,\n scheduler?: SchedulerLike\n): (...args: any[]) => Observable {\n if (resultSelector) {\n if (isScheduler(resultSelector)) {\n scheduler = resultSelector;\n } else {\n // DEPRECATED PATH\n return (...args: any[]) => bindCallback(callbackFunc, scheduler)(...args).pipe(\n map((args) => isArray(args) ? resultSelector(...args) : resultSelector(args)),\n );\n }\n }\n\n return function (this: any, ...args: any[]): Observable {\n const context = this;\n let subject: AsyncSubject;\n const params = {\n context,\n subject,\n callbackFunc,\n scheduler,\n };\n return new Observable(subscriber => {\n if (!scheduler) {\n if (!subject) {\n subject = new AsyncSubject();\n const handler = (...innerArgs: any[]) => {\n subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);\n subject.complete();\n };\n\n try {\n callbackFunc.apply(context, [...args, handler]);\n } catch (err) {\n if (canReportError(subject)) {\n subject.error(err);\n } else {\n console.warn(err);\n }\n }\n }\n return subject.subscribe(subscriber);\n } else {\n const state: DispatchState = {\n args, subscriber, params,\n };\n return scheduler.schedule>(dispatch, 0, state);\n }\n });\n };\n}\n\ninterface DispatchState {\n args: any[];\n subscriber: Subscriber;\n params: ParamsContext;\n}\n\ninterface ParamsContext {\n callbackFunc: Function;\n scheduler: SchedulerLike;\n context: any;\n subject: AsyncSubject;\n}\n\nfunction dispatch(this: SchedulerAction>, state: DispatchState) {\n const self = this;\n const { args, subscriber, params } = state;\n const { callbackFunc, context, scheduler } = params;\n let { subject } = params;\n if (!subject) {\n subject = params.subject = new AsyncSubject();\n\n const handler = (...innerArgs: any[]) => {\n const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;\n this.add(scheduler.schedule>(dispatchNext, 0, { value, subject }));\n };\n\n try {\n callbackFunc.apply(context, [...args, handler]);\n } catch (err) {\n subject.error(err);\n }\n }\n\n this.add(subject.subscribe(subscriber));\n}\n\ninterface NextState {\n subject: AsyncSubject;\n value: T;\n}\n\nfunction dispatchNext(this: SchedulerAction>, state: NextState) {\n const { value, subject } = state;\n subject.next(value);\n subject.complete();\n}\n\ninterface ErrorState {\n subject: AsyncSubject;\n err: any;\n}\n\nfunction dispatchError(this: SchedulerAction>, state: ErrorState) {\n const { err, subject } = state;\n subject.error(err);\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { OperatorFunction } from '../types';\n\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.\n *\n * ![](map.png)\n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * ## Example\n * Map every click to the clientX position of that click\n * ```ts\n * import { fromEvent } from 'rxjs';\n * import { map } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const positions = clicks.pipe(map(ev => ev.clientX));\n * positions.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nexport function map(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction {\n return function mapOperation(source: Observable): Observable {\n if (typeof project !== 'function') {\n throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n }\n return source.lift(new MapOperator(project, thisArg));\n };\n}\n\nexport class MapOperator implements Operator {\n constructor(private project: (value: T, index: number) => R, private thisArg: any) {\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass MapSubscriber extends Subscriber {\n count: number = 0;\n private thisArg: any;\n\n constructor(destination: Subscriber,\n private project: (value: T, index: number) => R,\n thisArg: any) {\n super(destination);\n this.thisArg = thisArg || this;\n }\n\n // NOTE: This looks unoptimized, but it's actually purposefully NOT\n // using try/catch optimizations.\n protected _next(value: T) {\n let result: any;\n try {\n result = this.project.call(this.thisArg, value, this.count++);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n}\n","import { Observable } from '../Observable';\nimport { AsyncSubject } from '../AsyncSubject';\nimport { Subscriber } from '../Subscriber';\nimport { SchedulerAction, SchedulerLike } from '../types';\nimport { map } from '../operators/map';\nimport { canReportError } from '../util/canReportError';\nimport { isScheduler } from '../util/isScheduler';\nimport { isArray } from '../util/isArray';\n\n/* tslint:disable:max-line-length */\n/** @deprecated resultSelector is deprecated, pipe to map instead */\nexport function bindNodeCallback(callbackFunc: Function, resultSelector: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable;\n\nexport function bindNodeCallback(callbackFunc: (callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable;\nexport function bindNodeCallback(callbackFunc: (callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2, R3]>;\nexport function bindNodeCallback(callbackFunc: (callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): () => Observable<[R1, R2]>;\nexport function bindNodeCallback(callbackFunc: (callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): () => Observable;\nexport function bindNodeCallback(callbackFunc: (callback: (err: any) => any) => any, scheduler?: SchedulerLike): () => Observable;\n\nexport function bindNodeCallback(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2, R3]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable<[R1, R2]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1) => Observable;\n\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2, R3]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable<[R1, R2]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2) => Observable;\n\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2, R3]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable<[R1, R2]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3) => Observable;\n\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2, R3]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable<[R1, R2]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Observable;\n\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2, res3: R3, res4: R4, ...args: any[]) => any) => any, scheduler?: SchedulerLike): (...args: any[]) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2, res3: R3) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2, R3]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1, res2: R2) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable<[R1, R2]>;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, res1: R1) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable;\nexport function bindNodeCallback(callbackFunc: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any) => any) => any, scheduler?: SchedulerLike): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Observable; /* tslint:enable:max-line-length */\n\nexport function bindNodeCallback(callbackFunc: Function, scheduler?: SchedulerLike): (...args: any[]) => Observable;\n/**\n * Converts a Node.js-style callback API to a function that returns an\n * Observable.\n *\n * It's just like {@link bindCallback}, but the\n * callback is expected to be of type `callback(error, result)`.\n *\n * `bindNodeCallback` is not an operator because its input and output are not\n * Observables. The input is a function `func` with some parameters, but the\n * last parameter must be a callback function that `func` calls when it is\n * done. The callback function is expected to follow Node.js conventions,\n * where the first argument to the callback is an error object, signaling\n * whether call was successful. If that object is passed to callback, it means\n * something went wrong.\n *\n * The output of `bindNodeCallback` is a function that takes the same\n * parameters as `func`, except the last one (the callback). When the output\n * function is called with arguments, it will return an Observable.\n * If `func` calls its callback with error parameter present, Observable will\n * error with that value as well. If error parameter is not passed, Observable will emit\n * second parameter. If there are more parameters (third and so on),\n * Observable will emit an array with all arguments, except first error argument.\n *\n * Note that `func` will not be called at the same time output function is,\n * but rather whenever resulting Observable is subscribed. By default call to\n * `func` will happen synchronously after subscription, but that can be changed\n * with proper `scheduler` provided as optional third parameter. {@link SchedulerLike}\n * can also control when values from callback will be emitted by Observable.\n * To find out more, check out documentation for {@link bindCallback}, where\n * {@link SchedulerLike} works exactly the same.\n *\n * As in {@link bindCallback}, context (`this` property) of input function will be set to context\n * of returned function, when it is called.\n *\n * After Observable emits value, it will complete immediately. This means\n * even if `func` calls callback again, values from second and consecutive\n * calls will never appear on the stream. If you need to handle functions\n * that call callbacks multiple times, check out {@link fromEvent} or\n * {@link fromEventPattern} instead.\n *\n * Note that `bindNodeCallback` can be used in non-Node.js environments as well.\n * \"Node.js-style\" callbacks are just a convention, so if you write for\n * browsers or any other environment and API you use implements that callback style,\n * `bindNodeCallback` can be safely used on that API functions as well.\n *\n * Remember that Error object passed to callback does not have to be an instance\n * of JavaScript built-in `Error` object. In fact, it does not even have to an object.\n * Error parameter of callback function is interpreted as \"present\", when value\n * of that parameter is truthy. It could be, for example, non-zero number, non-empty\n * string or boolean `true`. In all of these cases resulting Observable would error\n * with that value. This means usually regular style callbacks will fail very often when\n * `bindNodeCallback` is used. If your Observable errors much more often then you\n * would expect, check if callback really is called in Node.js-style and, if not,\n * switch to {@link bindCallback} instead.\n *\n * Note that even if error parameter is technically present in callback, but its value\n * is falsy, it still won't appear in array emitted by Observable.\n *\n * ## Examples\n * ### Read a file from the filesystem and get the data as an Observable\n * ```ts\n * import * as fs from 'fs';\n * const readFileAsObservable = bindNodeCallback(fs.readFile);\n * const result = readFileAsObservable('./roadNames.txt', 'utf8');\n * result.subscribe(x => console.log(x), e => console.error(e));\n * ```\n *\n * ### Use on function calling callback with multiple arguments\n * ```ts\n * someFunction((err, a, b) => {\n * console.log(err); // null\n * console.log(a); // 5\n * console.log(b); // \"some string\"\n * });\n * const boundSomeFunction = bindNodeCallback(someFunction);\n * boundSomeFunction()\n * .subscribe(value => {\n * console.log(value); // [5, \"some string\"]\n * });\n * ```\n *\n * ### Use on function calling callback in regular style\n * ```ts\n * someFunction(a => {\n * console.log(a); // 5\n * });\n * const boundSomeFunction = bindNodeCallback(someFunction);\n * boundSomeFunction()\n * .subscribe(\n * value => {} // never gets called\n * err => console.log(err) // 5\n * );\n * ```\n *\n * @see {@link bindCallback}\n * @see {@link from}\n *\n * @param {function} func Function with a Node.js-style callback as the last parameter.\n * @param {SchedulerLike} [scheduler] The scheduler on which to schedule the\n * callbacks.\n * @return {function(...params: *): Observable} A function which returns the\n * Observable that delivers the same values the Node.js callback would\n * deliver.\n * @name bindNodeCallback\n */\nexport function bindNodeCallback(\n callbackFunc: Function,\n resultSelector: Function|SchedulerLike,\n scheduler?: SchedulerLike\n): (...args: any[]) => Observable {\n\n if (resultSelector) {\n if (isScheduler(resultSelector)) {\n scheduler = resultSelector;\n } else {\n // DEPRECATED PATH\n return (...args: any[]) => bindNodeCallback(callbackFunc, scheduler)(...args).pipe(\n map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))\n );\n }\n }\n\n return function(this: any, ...args: any[]): Observable {\n const params: ParamsState = {\n subject: undefined,\n args,\n callbackFunc,\n scheduler,\n context: this,\n };\n return new Observable(subscriber => {\n const { context } = params;\n let { subject } = params;\n if (!scheduler) {\n if (!subject) {\n subject = params.subject = new AsyncSubject();\n const handler = (...innerArgs: any[]) => {\n const err = innerArgs.shift();\n\n if (err) {\n subject.error(err);\n return;\n }\n\n subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);\n subject.complete();\n };\n\n try {\n callbackFunc.apply(context, [...args, handler]);\n } catch (err) {\n if (canReportError(subject)) {\n subject.error(err);\n } else {\n console.warn(err);\n }\n }\n }\n return subject.subscribe(subscriber);\n } else {\n return scheduler.schedule>(dispatch, 0, { params, subscriber, context });\n }\n });\n };\n}\n\ninterface DispatchState {\n subscriber: Subscriber;\n context: any;\n params: ParamsState;\n}\n\ninterface ParamsState {\n callbackFunc: Function;\n args: any[];\n scheduler: SchedulerLike;\n subject: AsyncSubject;\n context: any;\n}\n\nfunction dispatch(this: SchedulerAction>, state: DispatchState) {\n const { params, subscriber, context } = state;\n const { callbackFunc, args, scheduler } = params;\n let subject = params.subject;\n\n if (!subject) {\n subject = params.subject = new AsyncSubject();\n\n const handler = (...innerArgs: any[]) => {\n const err = innerArgs.shift();\n if (err) {\n this.add(scheduler.schedule>(dispatchError, 0, { err, subject }));\n } else {\n const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;\n this.add(scheduler.schedule>(dispatchNext, 0, { value, subject }));\n }\n };\n\n try {\n callbackFunc.apply(context, [...args, handler]);\n } catch (err) {\n this.add(scheduler.schedule>(dispatchError, 0, { err, subject }));\n }\n }\n\n this.add(subject.subscribe(subscriber));\n}\n\ninterface DispatchNextArg {\n subject: AsyncSubject;\n value: T;\n}\n\nfunction dispatchNext(arg: DispatchNextArg) {\n const { value, subject } = arg;\n subject.next(value);\n subject.complete();\n}\n\ninterface DispatchErrorArg {\n subject: AsyncSubject;\n err: any;\n}\n\nfunction dispatchError(arg: DispatchErrorArg) {\n const { err, subject } = arg;\n subject.error(err);\n}\n","import { Observable } from '../Observable';\nimport { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';\nimport { isScheduler } from '../util/isScheduler';\nimport { isArray } from '../util/isArray';\nimport { Subscriber } from '../Subscriber';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { Operator } from '../Operator';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { fromArray } from './fromArray';\n\nconst NONE = {};\n\n/* tslint:disable:max-line-length */\n\n// If called with a single array, it \"auto-spreads\" the array, with result selector\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, R>(sources: [O1], resultSelector: (v1: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, R>(sources: [O1, O2], resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, R>(sources: [O1, O2, O3], resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, R>(sources: [O1, O2, O3, O4], resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, R>(sources: [O1, O2, O3, O4, O5], resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf, v5: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput, R>(sources: [O1, O2, O3, O4, O5, O6], resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf, v5: ObservedValueOf, v6: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, R>(sources: O[], resultSelector: (...args: ObservedValueOf[]) => R, scheduler?: SchedulerLike): Observable;\n\n// standard call, but with a result selector\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, R>(v1: O1, resultSelector: (v1: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, R>(v1: O1, v2: O2, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, v4: O4, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf, v5: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf, v5: ObservedValueOf, v6: ObservedValueOf) => R, scheduler?: SchedulerLike): Observable;\n\n// With a scheduler (deprecated)\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest>(sources: [O1], scheduler: SchedulerLike): Observable<[ObservedValueOf]>;\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest, O2 extends ObservableInput>(sources: [O1, O2], scheduler: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput>(sources: [O1, O2, O3], scheduler: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput>(sources: [O1, O2, O3, O4], scheduler: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput>(sources: [O1, O2, O3, O4, O5], scheduler: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput>(sources: [O1, O2, O3, O4, O5, O6], scheduler: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest>(sources: O[], scheduler: SchedulerLike): Observable[]>;\n\n// Best case\nexport function combineLatest>(sources: [O1]): Observable<[ObservedValueOf]>;\nexport function combineLatest, O2 extends ObservableInput>(sources: [O1, O2]): Observable<[ObservedValueOf, ObservedValueOf]>;\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput>(sources: [O1, O2, O3]): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput>(sources: [O1, O2, O3, O4]): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput>(sources: [O1, O2, O3, O4, O5]): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput>(sources: [O1, O2, O3, O4, O5, O6]): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\nexport function combineLatest>(sources: O[]): Observable[]>;\n\n// Standard calls\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest>(v1: O1, scheduler?: SchedulerLike): Observable<[ObservedValueOf]>;\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest, O2 extends ObservableInput>(v1: O1, v2: O2, scheduler?: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput>(v1: O1, v2: O2, v3: O3, scheduler?: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, scheduler?: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, scheduler?: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, scheduler?: SchedulerLike): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest>(...observables: O[]): Observable;\n\n/** @deprecated Pass arguments in a single array instead `combineLatest([a, b, c])` */\nexport function combineLatest, R>(...observables: Array | ((...values: Array) => R)>): Observable;\n\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function combineLatest, R>(array: O[], resultSelector: (...values: ObservedValueOf[]) => R, scheduler?: SchedulerLike): Observable;\n\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest>(...observables: Array): Observable;\n\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest, R>(...observables: Array[]) => R) | SchedulerLike>): Observable;\n\n/** @deprecated Passing a scheduler here is deprecated, use {@link subscribeOn} and/or {@link observeOn} instead */\nexport function combineLatest(...observables: Array | ((...values: Array) => R) | SchedulerLike>): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.\n *\n * ![](combineLatest.png)\n *\n * `combineLatest` combines the values from all the Observables passed as\n * arguments. This is done by subscribing to each Observable in order and,\n * whenever any Observable emits, collecting an array of the most recent\n * values from each Observable. So if you pass `n` Observables to operator,\n * returned Observable will always emit an array of `n` values, in order\n * corresponding to order of passed Observables (value from the first Observable\n * on the first place and so on).\n *\n * Static version of `combineLatest` accepts either an array of Observables\n * or each Observable can be put directly as an argument. Note that array of\n * Observables is good choice, if you don't know beforehand how many Observables\n * you will combine. Passing empty array will result in Observable that\n * completes immediately.\n *\n * To ensure output array has always the same length, `combineLatest` will\n * actually wait for all input Observables to emit at least once,\n * before it starts emitting results. This means if some Observable emits\n * values before other Observables started emitting, all these values but the last\n * will be lost. On the other hand, if some Observable does not emit a value but\n * completes, resulting Observable will complete at the same moment without\n * emitting anything, since it will be now impossible to include value from\n * completed Observable in resulting array. Also, if some input Observable does\n * not emit any value and never completes, `combineLatest` will also never emit\n * and never complete, since, again, it will wait for all streams to emit some\n * value.\n *\n * If at least one Observable was passed to `combineLatest` and all passed Observables\n * emitted something, resulting Observable will complete when all combined\n * streams complete. So even if some Observable completes, result of\n * `combineLatest` will still emit values when other Observables do. In case\n * of completed Observable, its value from now on will always be the last\n * emitted value. On the other hand, if any Observable errors, `combineLatest`\n * will error immediately as well, and all other Observables will be unsubscribed.\n *\n * `combineLatest` accepts as optional parameter `project` function, which takes\n * as arguments all values that would normally be emitted by resulting Observable.\n * `project` can return any kind of value, which will be then emitted by Observable\n * instead of default array. Note that `project` does not take as argument that array\n * of values, but values themselves. That means default `project` can be imagined\n * as function that takes all its arguments and puts them into an array.\n *\n * ## Examples\n * ### Combine two timer Observables\n * ```ts\n * import { combineLatest, timer } from 'rxjs';\n *\n * const firstTimer = timer(0, 1000); // emit 0, 1, 2... after every second, starting from now\n * const secondTimer = timer(500, 1000); // emit 0, 1, 2... after every second, starting 0,5s from now\n * const combinedTimers = combineLatest(firstTimer, secondTimer);\n * combinedTimers.subscribe(value => console.log(value));\n * // Logs\n * // [0, 0] after 0.5s\n * // [1, 0] after 1s\n * // [1, 1] after 1.5s\n * // [2, 1] after 2s\n * ```\n *\n * ### Combine an array of Observables\n * ```ts\n * import { combineLatest, of } from 'rxjs';\n * import { delay, starWith } from 'rxjs/operators';\n *\n * const observables = [1, 5, 10].map(\n * n => of(n).pipe(\n * delay(n * 1000), // emit 0 and then emit n after n seconds\n * startWith(0),\n * )\n * );\n * const combined = combineLatest(observables);\n * combined.subscribe(value => console.log(value));\n * // Logs\n * // [0, 0, 0] immediately\n * // [1, 0, 0] after 1s\n * // [1, 5, 0] after 5s\n * // [1, 5, 10] after 10s\n * ```\n *\n *\n * ### Use project function to dynamically calculate the Body-Mass Index\n * ```ts\n * import { combineLatest, of } from 'rxjs';\n * import { map } from 'rxjs/operators';\n *\n * const weight = of(70, 72, 76, 79, 75);\n * const height = of(1.76, 1.77, 1.78);\n * const bmi = combineLatest(weight, height).pipe(\n * map(([w, h]) => w / (h * h)),\n * );\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n * ```\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} observable1 An input Observable to combine with other Observables.\n * @param {ObservableInput} observable2 An input Observable to combine with other Observables.\n * More than one input Observables may be given as arguments\n * or an array of Observables may be given as the first argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for subscribing to\n * each input Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n */\nexport function combineLatest, R>(\n ...observables: (O | ((...values: ObservedValueOf[]) => R) | SchedulerLike)[]\n): Observable {\n let resultSelector: (...values: Array) => R = null;\n let scheduler: SchedulerLike = null;\n\n if (isScheduler(observables[observables.length - 1])) {\n scheduler = observables.pop() as SchedulerLike;\n }\n\n if (typeof observables[observables.length - 1] === 'function') {\n resultSelector = observables.pop() as (...values: Array) => R;\n }\n\n // if the first and only other argument besides the resultSelector is an array\n // assume it's been called with `combineLatest([obs1, obs2, obs3], resultSelector)`\n if (observables.length === 1 && isArray(observables[0])) {\n observables = observables[0] as any;\n }\n\n return fromArray(observables, scheduler).lift(new CombineLatestOperator, R>(resultSelector));\n}\n\nexport class CombineLatestOperator implements Operator {\n constructor(private resultSelector?: (...values: Array) => R) {\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class CombineLatestSubscriber extends OuterSubscriber {\n private active: number = 0;\n private values: any[] = [];\n private observables: any[] = [];\n private toRespond: number;\n\n constructor(destination: Subscriber, private resultSelector?: (...values: Array) => R) {\n super(destination);\n }\n\n protected _next(observable: any) {\n this.values.push(NONE);\n this.observables.push(observable);\n }\n\n protected _complete() {\n const observables = this.observables;\n const len = observables.length;\n if (len === 0) {\n this.destination.complete();\n } else {\n this.active = len;\n this.toRespond = len;\n for (let i = 0; i < len; i++) {\n const observable = observables[i];\n this.add(subscribeToResult(this, observable, observable, i));\n }\n }\n }\n\n notifyComplete(unused: Subscriber): void {\n if ((this.active -= 1) === 0) {\n this.destination.complete();\n }\n }\n\n notifyNext(outerValue: T, innerValue: R,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n const values = this.values;\n const oldVal = values[outerIndex];\n const toRespond = !this.toRespond\n ? 0\n : oldVal === NONE ? --this.toRespond : this.toRespond;\n values[outerIndex] = innerValue;\n\n if (toRespond === 0) {\n if (this.resultSelector) {\n this._tryResultSelector(values);\n } else {\n this.destination.next(values.slice());\n }\n }\n }\n\n private _tryResultSelector(values: any[]) {\n let result: any;\n try {\n result = this.resultSelector.apply(this, values);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n}\n","import { Subscriber } from './Subscriber';\nimport { InnerSubscriber } from './InnerSubscriber';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class OuterSubscriber extends Subscriber {\n notifyNext(outerValue: T, innerValue: R,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n this.destination.next(innerValue);\n }\n\n notifyError(error: any, innerSub: InnerSubscriber): void {\n this.destination.error(error);\n }\n\n notifyComplete(innerSub: InnerSubscriber): void {\n this.destination.complete();\n }\n}\n","import { Subscription } from '../Subscription';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { Subscriber } from '../Subscriber';\nimport { subscribeTo } from './subscribeTo';\nimport { Observable } from '../Observable';\n\nexport function subscribeToResult(\n outerSubscriber: OuterSubscriber,\n result: any,\n outerValue?: T,\n outerIndex?: number,\n destination?: Subscriber\n): Subscription;\nexport function subscribeToResult(\n outerSubscriber: OuterSubscriber,\n result: any,\n outerValue?: T,\n outerIndex?: number,\n destination: Subscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex)\n): Subscription | void {\n if (destination.closed) {\n return undefined;\n }\n if (result instanceof Observable) {\n return result.subscribe(destination);\n }\n return subscribeTo(result)(destination);\n}\n","import { Subscriber } from './Subscriber';\nimport { OuterSubscriber } from './OuterSubscriber';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class InnerSubscriber extends Subscriber {\n private index = 0;\n\n constructor(private parent: OuterSubscriber, public outerValue: T, public outerIndex: number) {\n super();\n }\n\n protected _next(value: R): void {\n this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);\n }\n\n protected _error(error: any): void {\n this.parent.notifyError(error, this);\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.parent.notifyComplete(this);\n this.unsubscribe();\n }\n}\n","import { ObservableInput } from '../types';\nimport { subscribeToArray } from './subscribeToArray';\nimport { subscribeToPromise } from './subscribeToPromise';\nimport { subscribeToIterable } from './subscribeToIterable';\nimport { subscribeToObservable } from './subscribeToObservable';\nimport { isArrayLike } from './isArrayLike';\nimport { isPromise } from './isPromise';\nimport { isObject } from './isObject';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { Subscription } from '../Subscription';\nimport { Subscriber } from '../Subscriber';\n\nexport const subscribeTo = (result: ObservableInput): (subscriber: Subscriber) => Subscription | void => {\n if (!!result && typeof result[Symbol_observable] === 'function') {\n return subscribeToObservable(result as any);\n } else if (isArrayLike(result)) {\n return subscribeToArray(result);\n } else if (isPromise(result)) {\n return subscribeToPromise(result as Promise);\n } else if (!!result && typeof result[Symbol_iterator] === 'function') {\n return subscribeToIterable(result as any);\n } else {\n const value = isObject(result) ? 'an invalid object' : `'${result}'`;\n const msg = `You provided ${value} where a stream was expected.`\n + ' You can provide an Observable, Promise, Array, or Iterable.';\n throw new TypeError(msg);\n }\n};\n","import { Subscriber } from '../Subscriber';\nimport { hostReportError } from './hostReportError';\n\nexport const subscribeToPromise = (promise: PromiseLike) => (subscriber: Subscriber) => {\n promise.then(\n (value) => {\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n },\n (err: any) => subscriber.error(err)\n )\n .then(null, hostReportError);\n return subscriber;\n};\n","import { Subscriber } from '../Subscriber';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\n\nexport const subscribeToIterable = (iterable: Iterable) => (subscriber: Subscriber) => {\n const iterator = iterable[Symbol_iterator]();\n do {\n const item = iterator.next();\n if (item.done) {\n subscriber.complete();\n break;\n }\n subscriber.next(item.value);\n if (subscriber.closed) {\n break;\n }\n } while (true);\n\n // Finalize the iterator if it happens to be a Generator\n if (typeof iterator.return === 'function') {\n subscriber.add(() => {\n if (iterator.return) {\n iterator.return();\n }\n });\n }\n\n return subscriber;\n};\n","export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n\n/**\n * @deprecated use {@link iterator} instead\n */\nexport const $$iterator = iterator;\n","import { Subscriber } from '../Subscriber';\nimport { observable as Symbol_observable } from '../symbol/observable';\n\n/**\n * Subscribes to an object that implements Symbol.observable with the given\n * Subscriber.\n * @param obj An object that implements Symbol.observable\n */\nexport const subscribeToObservable = (obj: any) => (subscriber: Subscriber) => {\n const obs = obj[Symbol_observable]();\n if (typeof obs.subscribe !== 'function') {\n // Should be caught by observable subscribe function error handling.\n throw new TypeError('Provided object does not correctly implement Symbol.observable');\n } else {\n return obs.subscribe(subscriber);\n }\n};\n","/**\n * Tests to see if the object is an ES2015 (ES6) Promise\n * @see {@link https://www.ecma-international.org/ecma-262/6.0/#sec-promise-objects}\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return !!value && typeof (value).subscribe !== 'function' && typeof (value as any).then === 'function';\n}\n","import { Observable } from '../Observable';\nimport { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';\nimport { isScheduler } from '../util/isScheduler';\nimport { of } from './of';\nimport { from } from './from';\nimport { concatAll } from '../operators/concatAll';\n\n/* tslint:disable:max-line-length */\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat>(v1: O1, scheduler: SchedulerLike): Observable>;\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat, O2 extends ObservableInput>(v1: O1, v2: O2, scheduler: SchedulerLike): Observable | ObservedValueOf>;\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput>(v1: O1, v2: O2, v3: O3, scheduler: SchedulerLike): Observable | ObservedValueOf | ObservedValueOf>;\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, scheduler: SchedulerLike): Observable | ObservedValueOf | ObservedValueOf | ObservedValueOf>;\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, scheduler: SchedulerLike): Observable | ObservedValueOf | ObservedValueOf | ObservedValueOf | ObservedValueOf>;\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, scheduler: SchedulerLike): Observable | ObservedValueOf | ObservedValueOf | ObservedValueOf | ObservedValueOf | ObservedValueOf>;\n\nexport function concat>(v1: O1): Observable>;\nexport function concat, O2 extends ObservableInput>(v1: O1, v2: O2): Observable | ObservedValueOf>;\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput>(v1: O1, v2: O2, v3: O3): Observable | ObservedValueOf | ObservedValueOf>;\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4): Observable | ObservedValueOf | ObservedValueOf | ObservedValueOf>;\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5): Observable | ObservedValueOf | ObservedValueOf | ObservedValueOf | ObservedValueOf>;\nexport function concat, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): Observable | ObservedValueOf | ObservedValueOf | ObservedValueOf | ObservedValueOf | ObservedValueOf>;\nexport function concat>(...observables: O[]): Observable>;\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat>(...observables: (O | SchedulerLike)[]): Observable>;\nexport function concat(...observables: ObservableInput[]): Observable;\n/** @deprecated Use {@link scheduled} and {@link concatAll} (e.g. `scheduled([o1, o2, o3], scheduler).pipe(concatAll())`) */\nexport function concat(...observables: (ObservableInput | SchedulerLike)[]): Observable;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which sequentially emits all values from given\n * Observable and then moves on to the next.\n *\n * Concatenates multiple Observables together by\n * sequentially emitting their values, one Observable after the other.\n *\n * ![](concat.png)\n *\n * `concat` joins multiple Observables together, by subscribing to them one at a time and\n * merging their results into the output Observable. You can pass either an array of\n * Observables, or put them directly as arguments. Passing an empty array will result\n * in Observable that completes immediately.\n *\n * `concat` will subscribe to first input Observable and emit all its values, without\n * changing or affecting them in any way. When that Observable completes, it will\n * subscribe to then next Observable passed and, again, emit its values. This will be\n * repeated, until the operator runs out of Observables. When last input Observable completes,\n * `concat` will complete as well. At any given moment only one Observable passed to operator\n * emits values. If you would like to emit values from passed Observables concurrently, check out\n * {@link merge} instead, especially with optional `concurrent` parameter. As a matter of fact,\n * `concat` is an equivalent of `merge` operator with `concurrent` parameter set to `1`.\n *\n * Note that if some input Observable never completes, `concat` will also never complete\n * and Observables following the one that did not complete will never be subscribed. On the other\n * hand, if some Observable simply completes immediately after it is subscribed, it will be\n * invisible for `concat`, which will just move on to the next Observable.\n *\n * If any Observable in chain errors, instead of passing control to the next Observable,\n * `concat` will error immediately as well. Observables that would be subscribed after\n * the one that emitted error, never will.\n *\n * If you pass to `concat` the same Observable many times, its stream of values\n * will be \"replayed\" on every subscription, which means you can repeat given Observable\n * as many times as you like. If passing the same Observable to `concat` 1000 times becomes tedious,\n * you can always use {@link repeat}.\n *\n * ## Examples\n * ### Concatenate a timer counting from 0 to 3 with a synchronous sequence from 1 to 10\n * ```ts\n * import { concat, interval, range } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * const timer = interval(1000).pipe(take(4));\n * const sequence = range(1, 10);\n * const result = concat(timer, sequence);\n * result.subscribe(x => console.log(x));\n *\n * // results in:\n * // 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3 -immediate-> 1 ... 10\n * ```\n *\n * ### Concatenate 3 Observables\n * ```ts\n * import { concat, interval } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * const timer1 = interval(1000).pipe(take(10));\n * const timer2 = interval(2000).pipe(take(6));\n * const timer3 = interval(500).pipe(take(10));\n *\n * const result = concat(timer1, timer2, timer3);\n * result.subscribe(x => console.log(x));\n *\n * // results in the following:\n * // (Prints to console sequentially)\n * // -1000ms-> 0 -1000ms-> 1 -1000ms-> ... 9\n * // -2000ms-> 0 -2000ms-> 1 -2000ms-> ... 5\n * // -500ms-> 0 -500ms-> 1 -500ms-> ... 9\n * ```\n *\n * ### Concatenate the same Observable to repeat it\n * ```ts\n * import { concat, interval } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * const timer = interval(1000).pipe(take(2));\n *\n * concat(timer, timer) // concatenating the same Observable!\n * .subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('...and it is done!')\n * );\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 0 after 3s\n * // 1 after 4s\n * // \"...and it is done!\" also after 4s\n * ```\n *\n * @see {@link concatAll}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n *\n * @param {ObservableInput} input1 An input Observable to concatenate with others.\n * @param {ObservableInput} input2 An input Observable to concatenate with others.\n * More than one input Observables may be given as argument.\n * @param {SchedulerLike} [scheduler=null] An optional {@link SchedulerLike} to schedule each\n * Observable subscription on.\n * @return {Observable} All values of each passed Observable merged into a\n * single Observable, in order, in serial fashion.\n * @static true\n * @name concat\n * @owner Observable\n */\nexport function concat, R>(...observables: Array): Observable | R> {\n return concatAll()(of(...observables));\n}\n","\nimport { mergeAll } from './mergeAll';\nimport { OperatorFunction, ObservableInput } from '../types';\n\nexport function concatAll(): OperatorFunction, T>;\nexport function concatAll(): OperatorFunction;\n\n/**\n * Converts a higher-order Observable into a first-order Observable by\n * concatenating the inner Observables in order.\n *\n * Flattens an Observable-of-Observables by putting one\n * inner Observable after the other.\n *\n * ![](concatAll.png)\n *\n * Joins every Observable emitted by the source (a higher-order Observable), in\n * a serial fashion. It subscribes to each inner Observable only after the\n * previous inner Observable has completed, and merges all of their values into\n * the returned observable.\n *\n * __Warning:__ If the source Observable emits Observables quickly and\n * endlessly, and the inner Observables it emits generally complete slower than\n * the source emits, you can run into memory issues as the incoming Observables\n * collect in an unbounded buffer.\n *\n * Note: `concatAll` is equivalent to `mergeAll` with concurrency parameter set\n * to `1`.\n *\n * ## Example\n *\n * For each click event, tick every second from 0 to 3, with no concurrency\n * ```ts\n * import { fromEvent, interval } from 'rxjs';\n * import { map, take, concatAll } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const higherOrder = clicks.pipe(\n * map(ev => interval(1000).pipe(take(4))),\n * );\n * const firstOrder = higherOrder.pipe(concatAll());\n * firstOrder.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n * ```\n *\n * @see {@link combineAll}\n * @see {@link concat}\n * @see {@link concatMap}\n * @see {@link concatMapTo}\n * @see {@link exhaust}\n * @see {@link mergeAll}\n * @see {@link switchAll}\n * @see {@link switchMap}\n * @see {@link zipAll}\n *\n * @return {Observable} An Observable emitting values from all the inner\n * Observables concatenated.\n * @method concatAll\n * @owner Observable\n */\nexport function concatAll(): OperatorFunction, T> {\n return mergeAll(1);\n}\n","\nimport { mergeMap } from './mergeMap';\nimport { identity } from '../util/identity';\nimport { OperatorFunction, ObservableInput } from '../types';\n\n/**\n * Converts a higher-order Observable into a first-order Observable which\n * concurrently delivers all values that are emitted on the inner Observables.\n *\n * Flattens an Observable-of-Observables.\n *\n * ![](mergeAll.png)\n *\n * `mergeAll` subscribes to an Observable that emits Observables, also known as\n * a higher-order Observable. Each time it observes one of these emitted inner\n * Observables, it subscribes to that and delivers all the values from the\n * inner Observable on the output Observable. The output Observable only\n * completes once all inner Observables have completed. Any error delivered by\n * a inner Observable will be immediately emitted on the output Observable.\n *\n * ## Examples\n * Spawn a new interval Observable for each click event, and blend their outputs as one Observable\n * ```ts\n * import { fromEvent, interval } from 'rxjs';\n * import { map, mergeAll } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const higherOrder = clicks.pipe(map((ev) => interval(1000)));\n * const firstOrder = higherOrder.pipe(mergeAll());\n * firstOrder.subscribe(x => console.log(x));\n * ```\n *\n * Count from 0 to 9 every second for each click, but only allow 2 concurrent timers\n * ```ts\n * import { fromEvent, interval } from 'rxjs';\n * import { take, map, mergeAll } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const higherOrder = clicks.pipe(\n * map((ev) => interval(1000).pipe(take(10))),\n * );\n * const firstOrder = higherOrder.pipe(mergeAll(2));\n * firstOrder.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link combineAll}\n * @see {@link concatAll}\n * @see {@link exhaust}\n * @see {@link merge}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchAll}\n * @see {@link switchMap}\n * @see {@link zipAll}\n *\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of inner\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits values coming from all the\n * inner Observables emitted by the source Observable.\n * @method mergeAll\n * @owner Observable\n */\nexport function mergeAll(concurrent: number = Number.POSITIVE_INFINITY): OperatorFunction, T> {\n return mergeMap(identity, concurrent);\n}\n","import { Observable } from '../Observable';\nimport { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';\nimport { map } from './map';\nimport { from } from '../observable/from';\n\n/* tslint:disable:max-line-length */\nexport function mergeMap>(project: (value: T, index: number) => O, concurrent?: number): OperatorFunction>;\n/** @deprecated resultSelector no longer supported, use inner map instead */\nexport function mergeMap>(project: (value: T, index: number) => O, resultSelector: undefined, concurrent?: number): OperatorFunction>;\n/** @deprecated resultSelector no longer supported, use inner map instead */\nexport function mergeMap>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R, concurrent?: number): OperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.\n *\n * ![](mergeMap.png)\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * ## Example\n * Map and flatten each letter to an Observable ticking every 1 second\n * ```ts\n * import { of, interval } from 'rxjs';\n * import { mergeMap, map } from 'rxjs/operators';\n *\n * const letters = of('a', 'b', 'c');\n * const result = letters.pipe(\n * mergeMap(x => interval(1000).pipe(map(i => x+i))),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n * ```\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional deprecated `resultSelector`) to each item\n * emitted by the source Observable and merging the results of the Observables\n * obtained from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nexport function mergeMap>(\n project: (value: T, index: number) => O,\n resultSelector?: ((outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R) | number,\n concurrent: number = Number.POSITIVE_INFINITY\n): OperatorFunction|R> {\n if (typeof resultSelector === 'function') {\n // DEPRECATED PATH\n return (source: Observable) => source.pipe(\n mergeMap((a, i) => from(project(a, i)).pipe(\n map((b: any, ii: number) => resultSelector(a, b, i, ii)),\n ), concurrent)\n );\n } else if (typeof resultSelector === 'number') {\n concurrent = resultSelector;\n }\n return (source: Observable) => source.lift(new MergeMapOperator(project, concurrent));\n}\n\nexport class MergeMapOperator implements Operator {\n constructor(private project: (value: T, index: number) => ObservableInput,\n private concurrent: number = Number.POSITIVE_INFINITY) {\n }\n\n call(observer: Subscriber, source: any): any {\n return source.subscribe(new MergeMapSubscriber(\n observer, this.project, this.concurrent\n ));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class MergeMapSubscriber extends OuterSubscriber {\n private hasCompleted: boolean = false;\n private buffer: T[] = [];\n private active: number = 0;\n protected index: number = 0;\n\n constructor(destination: Subscriber,\n private project: (value: T, index: number) => ObservableInput,\n private concurrent: number = Number.POSITIVE_INFINITY) {\n super(destination);\n }\n\n protected _next(value: T): void {\n if (this.active < this.concurrent) {\n this._tryNext(value);\n } else {\n this.buffer.push(value);\n }\n }\n\n protected _tryNext(value: T) {\n let result: ObservableInput;\n const index = this.index++;\n try {\n result = this.project(value, index);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.active++;\n this._innerSub(result, value, index);\n }\n\n private _innerSub(ish: ObservableInput, value: T, index: number): void {\n const innerSubscriber = new InnerSubscriber(this, undefined, undefined);\n const destination = this.destination as Subscription;\n destination.add(innerSubscriber);\n subscribeToResult(this, ish, value, index, innerSubscriber);\n }\n\n protected _complete(): void {\n this.hasCompleted = true;\n if (this.active === 0 && this.buffer.length === 0) {\n this.destination.complete();\n }\n this.unsubscribe();\n }\n\n notifyNext(outerValue: T, innerValue: R,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n this.destination.next(innerValue);\n }\n\n notifyComplete(innerSub: Subscription): void {\n const buffer = this.buffer;\n this.remove(innerSub);\n this.active--;\n if (buffer.length > 0) {\n this._next(buffer.shift());\n } else if (this.active === 0 && this.hasCompleted) {\n this.destination.complete();\n }\n }\n}\n","import { Observable } from '../Observable';\nimport { subscribeTo } from '../util/subscribeTo';\nimport { ObservableInput, SchedulerLike, ObservedValueOf } from '../types';\nimport { scheduled } from '../scheduled/scheduled';\n\nexport function from>(input: O): Observable>;\n/** @deprecated use {@link scheduled} instead. */\nexport function from>(input: O, scheduler: SchedulerLike): Observable>;\n\n/**\n * Creates an Observable from an Array, an array-like object, a Promise, an iterable object, or an Observable-like object.\n *\n * Converts almost anything to an Observable.\n *\n * ![](from.png)\n *\n * `from` converts various other objects and data types into Observables. It also converts a Promise, an array-like, or an\n * iterable\n * object into an Observable that emits the items in that promise, array, or iterable. A String, in this context, is treated\n * as an array of characters. Observable-like objects (contains a function named with the ES2015 Symbol for Observable) can also be\n * converted through this operator.\n *\n * ## Examples\n *\n * ### Converts an array to an Observable\n *\n * ```ts\n * import { from } from 'rxjs';\n *\n * const array = [10, 20, 30];\n * const result = from(array);\n *\n * result.subscribe(x => console.log(x));\n *\n * // Logs:\n * // 10\n * // 20\n * // 30\n * ```\n *\n * ---\n *\n * ### Convert an infinite iterable (from a generator) to an Observable\n *\n * ```ts\n * import { from } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * function* generateDoubles(seed) {\n * let i = seed;\n * while (true) {\n * yield i;\n * i = 2 * i; // double it\n * }\n * }\n *\n * const iterator = generateDoubles(3);\n * const result = from(iterator).pipe(take(10));\n *\n * result.subscribe(x => console.log(x));\n *\n * // Logs:\n * // 3\n * // 6\n * // 12\n * // 24\n * // 48\n * // 96\n * // 192\n * // 384\n * // 768\n * // 1536\n * ```\n *\n * ---\n *\n * ### With async scheduler\n *\n * ```ts\n * import { from, asyncScheduler } from 'rxjs';\n *\n * console.log('start');\n *\n * const array = [10, 20, 30];\n * const result = from(array, asyncScheduler);\n *\n * result.subscribe(x => console.log(x));\n *\n * console.log('end');\n *\n * // Logs:\n * // start\n * // end\n * // 10\n * // 20\n * // 30\n * ```\n *\n * @see {@link fromEvent}\n * @see {@link fromEventPattern}\n *\n * @param {ObservableInput} A subscription object, a Promise, an Observable-like,\n * an Array, an iterable, or an array-like object to be converted.\n * @param {SchedulerLike} An optional {@link SchedulerLike} on which to schedule the emission of values.\n * @return {Observable}\n * @name from\n * @owner Observable\n */\nexport function from(input: ObservableInput, scheduler?: SchedulerLike): Observable {\n if (!scheduler) {\n if (input instanceof Observable) {\n return input;\n }\n return new Observable(subscribeTo(input));\n } else {\n return scheduled(input, scheduler);\n }\n}\n","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { ObservableInput, SchedulerLike, Observable } from 'rxjs';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\n\n/**\n * Converts from a common {@link ObservableInput} type to an observable where subscription and emissions\n * are scheduled on the provided scheduler.\n *\n * @see from\n * @see of\n *\n * @param input The observable, array, promise, iterable, etc you would like to schedule\n * @param scheduler The scheduler to use to schedule the subscription and emissions from\n * the returned observable.\n */\nexport function scheduled(input: ObservableInput, scheduler: SchedulerLike): Observable {\n if (input != null) {\n if (isInteropObservable(input)) {\n return scheduleObservable(input, scheduler);\n } else if (isPromise(input)) {\n return schedulePromise(input, scheduler);\n } else if (isArrayLike(input)) {\n return scheduleArray(input, scheduler);\n } else if (isIterable(input) || typeof input === 'string') {\n return scheduleIterable(input, scheduler);\n }\n }\n\n throw new TypeError((input !== null && typeof input || input) + ' is not observable');\n}\n","import { Observable } from '../Observable';\nimport { Subscription } from '../Subscription';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { InteropObservable, SchedulerLike, Subscribable } from '../types';\n\nexport function scheduleObservable(input: InteropObservable, scheduler: SchedulerLike) {\n return new Observable(subscriber => {\n const sub = new Subscription();\n sub.add(scheduler.schedule(() => {\n const observable: Subscribable = input[Symbol_observable]();\n sub.add(observable.subscribe({\n next(value) { sub.add(scheduler.schedule(() => subscriber.next(value))); },\n error(err) { sub.add(scheduler.schedule(() => subscriber.error(err))); },\n complete() { sub.add(scheduler.schedule(() => subscriber.complete())); },\n }));\n }));\n return sub;\n });\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { Subscription } from '../Subscription';\n\nexport function schedulePromise(input: PromiseLike, scheduler: SchedulerLike) {\n return new Observable(subscriber => {\n const sub = new Subscription();\n sub.add(scheduler.schedule(() => input.then(\n value => {\n sub.add(scheduler.schedule(() => {\n subscriber.next(value);\n sub.add(scheduler.schedule(() => subscriber.complete()));\n }));\n },\n err => {\n sub.add(scheduler.schedule(() => subscriber.error(err)));\n }\n )));\n return sub;\n });\n}\n","import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\nimport { Subscription } from '../Subscription';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\n\nexport function scheduleIterable(input: Iterable, scheduler: SchedulerLike) {\n if (!input) {\n throw new Error('Iterable cannot be null');\n }\n return new Observable(subscriber => {\n const sub = new Subscription();\n let iterator: Iterator;\n sub.add(() => {\n // Finalize generators\n if (iterator && typeof iterator.return === 'function') {\n iterator.return();\n }\n });\n sub.add(scheduler.schedule(() => {\n iterator = input[Symbol_iterator]();\n sub.add(scheduler.schedule(function () {\n if (subscriber.closed) {\n return;\n }\n let value: T;\n let done: boolean;\n try {\n const result = iterator.next();\n value = result.value;\n done = result.done;\n } catch (err) {\n subscriber.error(err);\n return;\n }\n if (done) {\n subscriber.complete();\n } else {\n subscriber.next(value);\n this.schedule();\n }\n }));\n }));\n return sub;\n });\n}\n","import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return input && typeof input[Symbol_observable] === 'function';\n}\n","import { iterator as Symbol_iterator } from '../symbol/iterator';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return input && typeof input[Symbol_iterator] === 'function';\n}\n","import { Observable } from '../Observable';\nimport { SubscribableOrPromise, ObservedValueOf, ObservableInput } from '../types';\nimport { from } from './from'; // lol\nimport { empty } from './empty';\n\n/**\n * Creates an Observable that, on subscribe, calls an Observable factory to\n * make an Observable for each new Observer.\n *\n * Creates the Observable lazily, that is, only when it\n * is subscribed.\n * \n *\n * ![](defer.png)\n *\n * `defer` allows you to create the Observable only when the Observer\n * subscribes, and create a fresh Observable for each Observer. It waits until\n * an Observer subscribes to it, and then it generates an Observable,\n * typically with an Observable factory function. It does this afresh for each\n * subscriber, so although each subscriber may think it is subscribing to the\n * same Observable, in fact each subscriber gets its own individual\n * Observable.\n *\n * ## Example\n * ### Subscribe to either an Observable of clicks or an Observable of interval, at random\n * ```ts\n * import { defer, fromEvent, interval } from 'rxjs';\n *\n * const clicksOrInterval = defer(function () {\n * return Math.random() > 0.5\n * ? fromEvent(document, 'click')\n * : interval(1000);\n * });\n * clicksOrInterval.subscribe(x => console.log(x));\n *\n * // Results in the following behavior:\n * // If the result of Math.random() is greater than 0.5 it will listen\n * // for clicks anywhere on the \"document\"; when document is clicked it\n * // will log a MouseEvent object to the console. If the result is less\n * // than 0.5 it will emit ascending numbers, one every second(1000ms).\n * ```\n *\n * @see {@link Observable}\n *\n * @param {function(): SubscribableOrPromise} observableFactory The Observable\n * factory function to invoke for each Observer that subscribes to the output\n * Observable. May also return a Promise, which will be converted on the fly\n * to an Observable.\n * @return {Observable} An Observable whose Observers' subscriptions trigger\n * an invocation of the given Observable factory function.\n * @static true\n * @name defer\n * @owner Observable\n */\nexport function defer>(observableFactory: () => O | void): Observable> {\n return new Observable>(subscriber => {\n let input: O | void;\n try {\n input = observableFactory();\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n const source = input ? from(input) : empty();\n return source.subscribe(subscriber);\n });\n}\n","import { Observable } from '../Observable';\nimport { ObservableInput, ObservedValuesFromArray, ObservedValueOf, SubscribableOrPromise } from '../types';\nimport { isArray } from '../util/isArray';\nimport { map } from '../operators/map';\nimport { isObject } from '../util/isObject';\nimport { isObservable } from '../util/isObservable';\nimport { from } from './from';\n\n/* tslint:disable:max-line-length */\n\n// forkJoin(a$, b$, c$)\n/** @deprecated Use the version that takes an array of Observables instead */\nexport function forkJoin(v1: SubscribableOrPromise): Observable<[T]>;\n/** @deprecated Use the version that takes an array of Observables instead */\nexport function forkJoin(v1: ObservableInput, v2: ObservableInput): Observable<[T, T2]>;\n/** @deprecated Use the version that takes an array of Observables instead */\nexport function forkJoin(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput): Observable<[T, T2, T3]>;\n/** @deprecated Use the version that takes an array of Observables instead */\nexport function forkJoin(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput): Observable<[T, T2, T3, T4]>;\n/** @deprecated Use the version that takes an array of Observables instead */\nexport function forkJoin(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput): Observable<[T, T2, T3, T4, T5]>;\n/** @deprecated Use the version that takes an array of Observables instead */\nexport function forkJoin(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput): Observable<[T, T2, T3, T4, T5, T6]>;\n\n// forkJoin([a$, b$, c$]);\n// TODO(benlesh): Uncomment for TS 3.0\n// export function forkJoin(sources: []): Observable;\nexport function forkJoin(sources: [ObservableInput]): Observable<[A]>;\nexport function forkJoin(sources: [ObservableInput, ObservableInput]): Observable<[A, B]>;\nexport function forkJoin(sources: [ObservableInput, ObservableInput, ObservableInput]): Observable<[A, B, C]>;\nexport function forkJoin(sources: [ObservableInput, ObservableInput, ObservableInput, ObservableInput]): Observable<[A, B, C, D]>;\nexport function forkJoin(sources: [ObservableInput, ObservableInput, ObservableInput, ObservableInput, ObservableInput]): Observable<[A, B, C, D, E]>;\nexport function forkJoin(sources: [ObservableInput, ObservableInput, ObservableInput, ObservableInput, ObservableInput, ObservableInput]): Observable<[A, B, C, D, E, F]>;\nexport function forkJoin[]>(sources: A): Observable[]>;\n\n// forkJoin({})\nexport function forkJoin(sourcesObject: {}): Observable;\nexport function forkJoin(sourcesObject: T): Observable<{ [K in keyof T]: ObservedValueOf }>;\n\n/** @deprecated resultSelector is deprecated, pipe to map instead */\nexport function forkJoin(...args: Array|Function>): Observable;\n/** @deprecated Use the version that takes an array of Observables instead */\nexport function forkJoin(...sources: ObservableInput[]): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Accepts an `Array` of {@link ObservableInput} or a dictionary `Object` of {@link ObservableInput} and returns\n * an {@link Observable} that emits either an array of values in the exact same order as the passed array,\n * or a dictionary of values in the same shape as the passed dictionary.\n *\n * Wait for Observables to complete and then combine last values they emitted.\n *\n * ![](forkJoin.png)\n *\n * `forkJoin` is an operator that takes any number of input observables which can be passed either as an array\n * or a dictionary of input observables. If no input observables are provided, resulting stream will complete\n * immediately.\n *\n * `forkJoin` will wait for all passed observables to complete and then it will emit an array or an object with last\n * values from corresponding observables.\n *\n * If you pass an array of `n` observables to the operator, resulting\n * array will have `n` values, where first value is the last thing emitted by the first observable,\n * second value is the last thing emitted by the second observable and so on.\n *\n * If you pass a dictionary of observables to the operator, resulting\n * objects will have the same keys as the dictionary passed, with their last values they've emitted\n * located at the corresponding key.\n *\n * That means `forkJoin` will not emit more than once and it will complete after that. If you need to emit combined\n * values not only at the end of lifecycle of passed observables, but also throughout it, try out {@link combineLatest}\n * or {@link zip} instead.\n *\n * In order for resulting array to have the same length as the number of input observables, whenever any of\n * that observables completes without emitting any value, `forkJoin` will complete at that moment as well\n * and it will not emit anything either, even if it already has some last values from other observables.\n * Conversely, if there is an observable that never completes, `forkJoin` will never complete as well,\n * unless at any point some other observable completes without emitting value, which brings us back to\n * the previous case. Overall, in order for `forkJoin` to emit a value, all observables passed as arguments\n * have to emit something at least once and complete.\n *\n * If any input observable errors at some point, `forkJoin` will error as well and all other observables\n * will be immediately unsubscribed.\n *\n * Optionally `forkJoin` accepts project function, that will be called with values which normally\n * would land in emitted array. Whatever is returned by project function, will appear in output\n * observable instead. This means that default project can be thought of as a function that takes\n * all its arguments and puts them into an array. Note that project function will be called only\n * when output observable is supposed to emit a result.\n *\n * ## Examples\n *\n * ### Use forkJoin with a dictionary of observable inputs\n * ```ts\n * import { forkJoin, of, timer } from 'rxjs';\n *\n * const observable = forkJoin({\n * foo: of(1, 2, 3, 4),\n * bar: Promise.resolve(8),\n * baz: timer(4000),\n * });\n * observable.subscribe({\n * next: value => console.log(value),\n * complete: () => console.log('This is how it ends!'),\n * });\n *\n * // Logs:\n * // { foo: 4, bar: 8, baz: 0 } after 4 seconds\n * // \"This is how it ends!\" immediately after\n * ```\n *\n * ### Use forkJoin with an array of observable inputs\n * ```ts\n * import { forkJoin, of } from 'rxjs';\n *\n * const observable = forkJoin([\n * of(1, 2, 3, 4),\n * Promise.resolve(8),\n * timer(4000),\n * ]);\n * observable.subscribe({\n * next: value => console.log(value),\n * complete: () => console.log('This is how it ends!'),\n * });\n *\n * // Logs:\n * // [4, 8, 0] after 4 seconds\n * // \"This is how it ends!\" immediately after\n * ```\n *\n * @see {@link combineLatest}\n * @see {@link zip}\n *\n * @param {...ObservableInput} sources Any number of Observables provided either as an array or as an arguments\n * passed directly to the operator.\n * @param {function} [project] Function that takes values emitted by input Observables and returns value\n * that will appear in resulting Observable instead of default array.\n * @return {Observable} Observable emitting either an array of last values emitted by passed Observables\n * or value from project function.\n */\nexport function forkJoin(\n ...sources: any[]\n): Observable {\n if (sources.length === 1) {\n const first = sources[0];\n if (isArray(first)) {\n return forkJoinInternal(first, null);\n }\n // TODO(benlesh): isObservable check will not be necessary when deprecated path is removed.\n if (isObject(first) && Object.getPrototypeOf(first) === Object.prototype) {\n const keys = Object.keys(first);\n return forkJoinInternal(keys.map(key => first[key]), keys);\n }\n }\n\n // DEPRECATED PATHS BELOW HERE\n if (typeof sources[sources.length - 1] === 'function') {\n const resultSelector = sources.pop() as Function;\n sources = (sources.length === 1 && isArray(sources[0])) ? sources[0] : sources;\n return forkJoinInternal(sources, null).pipe(\n map((args: any[]) => resultSelector(...args))\n );\n }\n\n return forkJoinInternal(sources, null);\n}\n\nfunction forkJoinInternal(sources: ObservableInput[], keys: string[] | null): Observable {\n return new Observable(subscriber => {\n const len = sources.length;\n if (len === 0) {\n subscriber.complete();\n return;\n }\n const values = new Array(len);\n let completed = 0;\n let emitted = 0;\n for (let i = 0; i < len; i++) {\n const source = from(sources[i]);\n let hasValue = false;\n subscriber.add(source.subscribe({\n next: value => {\n if (!hasValue) {\n hasValue = true;\n emitted++;\n }\n values[i] = value;\n },\n error: err => subscriber.error(err),\n complete: () => {\n completed++;\n if (completed === len || !hasValue) {\n if (emitted === len) {\n subscriber.next(keys ?\n keys.reduce((result, key, i) => (result[key] = values[i], result), {}) :\n values);\n }\n subscriber.complete();\n }\n }\n }));\n }\n });\n}\n","import { Observable } from '../Observable';\nimport { isArray } from '../util/isArray';\nimport { isFunction } from '../util/isFunction';\nimport { Subscriber } from '../Subscriber';\nimport { map } from '../operators/map';\n\nconst toString: Function = Object.prototype.toString;\n\nexport interface NodeStyleEventEmitter {\n addListener: (eventName: string | symbol, handler: NodeEventHandler) => this;\n removeListener: (eventName: string | symbol, handler: NodeEventHandler) => this;\n}\n\nexport type NodeEventHandler = (...args: any[]) => void;\n\n// For APIs that implement `addListener` and `removeListener` methods that may\n// not use the same arguments or return EventEmitter values\n// such as React Native\nexport interface NodeCompatibleEventEmitter {\n addListener: (eventName: string, handler: NodeEventHandler) => void | {};\n removeListener: (eventName: string, handler: NodeEventHandler) => void | {};\n}\n\nexport interface JQueryStyleEventEmitter {\n on: (eventName: string, handler: Function) => void;\n off: (eventName: string, handler: Function) => void;\n}\n\nexport interface HasEventTargetAddRemove {\n addEventListener(type: string, listener: ((evt: E) => void) | null, options?: boolean | AddEventListenerOptions): void;\n removeEventListener(type: string, listener?: ((evt: E) => void) | null, options?: EventListenerOptions | boolean): void;\n}\n\nexport type EventTargetLike = HasEventTargetAddRemove | NodeStyleEventEmitter | NodeCompatibleEventEmitter | JQueryStyleEventEmitter;\n\nexport type FromEventTarget = EventTargetLike | ArrayLike>;\n\nexport interface EventListenerOptions {\n capture?: boolean;\n passive?: boolean;\n once?: boolean;\n}\n\nexport interface AddEventListenerOptions extends EventListenerOptions {\n once?: boolean;\n passive?: boolean;\n}\n\n/* tslint:disable:max-line-length */\nexport function fromEvent(target: FromEventTarget, eventName: string): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function fromEvent(target: FromEventTarget, eventName: string, resultSelector: (...args: any[]) => T): Observable;\nexport function fromEvent(target: FromEventTarget, eventName: string, options: EventListenerOptions): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function fromEvent(target: FromEventTarget, eventName: string, options: EventListenerOptions, resultSelector: (...args: any[]) => T): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Creates an Observable that emits events of a specific type coming from the\n * given event target.\n *\n * Creates an Observable from DOM events, or Node.js\n * EventEmitter events or others.\n *\n * ![](fromEvent.png)\n *\n * `fromEvent` accepts as a first argument event target, which is an object with methods\n * for registering event handler functions. As a second argument it takes string that indicates\n * type of event we want to listen for. `fromEvent` supports selected types of event targets,\n * which are described in detail below. If your event target does not match any of the ones listed,\n * you should use {@link fromEventPattern}, which can be used on arbitrary APIs.\n * When it comes to APIs supported by `fromEvent`, their methods for adding and removing event\n * handler functions have different names, but they all accept a string describing event type\n * and function itself, which will be called whenever said event happens.\n *\n * Every time resulting Observable is subscribed, event handler function will be registered\n * to event target on given event type. When that event fires, value\n * passed as a first argument to registered function will be emitted by output Observable.\n * When Observable is unsubscribed, function will be unregistered from event target.\n *\n * Note that if event target calls registered function with more than one argument, second\n * and following arguments will not appear in resulting stream. In order to get access to them,\n * you can pass to `fromEvent` optional project function, which will be called with all arguments\n * passed to event handler. Output Observable will then emit value returned by project function,\n * instead of the usual value.\n *\n * Remember that event targets listed below are checked via duck typing. It means that\n * no matter what kind of object you have and no matter what environment you work in,\n * you can safely use `fromEvent` on that object if it exposes described methods (provided\n * of course they behave as was described above). So for example if Node.js library exposes\n * event target which has the same method names as DOM EventTarget, `fromEvent` is still\n * a good choice.\n *\n * If the API you use is more callback then event handler oriented (subscribed\n * callback function fires only once and thus there is no need to manually\n * unregister it), you should use {@link bindCallback} or {@link bindNodeCallback}\n * instead.\n *\n * `fromEvent` supports following types of event targets:\n *\n * **DOM EventTarget**\n *\n * This is an object with `addEventListener` and `removeEventListener` methods.\n *\n * In the browser, `addEventListener` accepts - apart from event type string and event\n * handler function arguments - optional third parameter, which is either an object or boolean,\n * both used for additional configuration how and when passed function will be called. When\n * `fromEvent` is used with event target of that type, you can provide this values\n * as third parameter as well.\n *\n * **Node.js EventEmitter**\n *\n * An object with `addListener` and `removeListener` methods.\n *\n * **JQuery-style event target**\n *\n * An object with `on` and `off` methods\n *\n * **DOM NodeList**\n *\n * List of DOM Nodes, returned for example by `document.querySelectorAll` or `Node.childNodes`.\n *\n * Although this collection is not event target in itself, `fromEvent` will iterate over all Nodes\n * it contains and install event handler function in every of them. When returned Observable\n * is unsubscribed, function will be removed from all Nodes.\n *\n * **DOM HtmlCollection**\n *\n * Just as in case of NodeList it is a collection of DOM nodes. Here as well event handler function is\n * installed and removed in each of elements.\n *\n *\n * ## Examples\n * ### Emits clicks happening on the DOM document\n * ```ts\n * import { fromEvent } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * clicks.subscribe(x => console.log(x));\n *\n * // Results in:\n * // MouseEvent object logged to console every time a click\n * // occurs on the document.\n * ```\n *\n * ### Use addEventListener with capture option\n * ```ts\n * import { fromEvent } from 'rxjs';\n *\n * const clicksInDocument = fromEvent(document, 'click', true); // note optional configuration parameter\n * // which will be passed to addEventListener\n * const clicksInDiv = fromEvent(someDivInDocument, 'click');\n *\n * clicksInDocument.subscribe(() => console.log('document'));\n * clicksInDiv.subscribe(() => console.log('div'));\n *\n * // By default events bubble UP in DOM tree, so normally\n * // when we would click on div in document\n * // \"div\" would be logged first and then \"document\".\n * // Since we specified optional `capture` option, document\n * // will catch event when it goes DOWN DOM tree, so console\n * // will log \"document\" and then \"div\".\n * ```\n *\n * @see {@link bindCallback}\n * @see {@link bindNodeCallback}\n * @see {@link fromEventPattern}\n *\n * @param {FromEventTarget} target The DOM EventTarget, Node.js\n * EventEmitter, JQuery-like event target, NodeList or HTMLCollection to attach the event handler to.\n * @param {string} eventName The event name of interest, being emitted by the\n * `target`.\n * @param {EventListenerOptions} [options] Options to pass through to addEventListener\n * @return {Observable}\n * @name fromEvent\n */\nexport function fromEvent(\n target: FromEventTarget,\n eventName: string,\n options?: EventListenerOptions | ((...args: any[]) => T),\n resultSelector?: ((...args: any[]) => T)\n): Observable {\n\n if (isFunction(options)) {\n // DEPRECATED PATH\n resultSelector = options;\n options = undefined;\n }\n if (resultSelector) {\n // DEPRECATED PATH\n return fromEvent(target, eventName, options).pipe(\n map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))\n );\n }\n\n return new Observable(subscriber => {\n function handler(e: T) {\n if (arguments.length > 1) {\n subscriber.next(Array.prototype.slice.call(arguments));\n } else {\n subscriber.next(e);\n }\n }\n setupSubscription(target, eventName, handler, subscriber, options as EventListenerOptions);\n });\n}\n\nfunction setupSubscription(sourceObj: FromEventTarget, eventName: string,\n handler: (...args: any[]) => void, subscriber: Subscriber,\n options?: EventListenerOptions) {\n let unsubscribe: () => void;\n if (isEventTarget(sourceObj)) {\n const source = sourceObj;\n sourceObj.addEventListener(eventName, handler, options);\n unsubscribe = () => source.removeEventListener(eventName, handler, options);\n } else if (isJQueryStyleEventEmitter(sourceObj)) {\n const source = sourceObj;\n sourceObj.on(eventName, handler);\n unsubscribe = () => source.off(eventName, handler);\n } else if (isNodeStyleEventEmitter(sourceObj)) {\n const source = sourceObj;\n sourceObj.addListener(eventName, handler as NodeEventHandler);\n unsubscribe = () => source.removeListener(eventName, handler as NodeEventHandler);\n } else if (sourceObj && (sourceObj as any).length) {\n for (let i = 0, len = (sourceObj as any).length; i < len; i++) {\n setupSubscription(sourceObj[i], eventName, handler, subscriber, options);\n }\n } else {\n throw new TypeError('Invalid event target');\n }\n\n subscriber.add(unsubscribe);\n}\n\nfunction isNodeStyleEventEmitter(sourceObj: any): sourceObj is NodeStyleEventEmitter {\n return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';\n}\n\nfunction isJQueryStyleEventEmitter(sourceObj: any): sourceObj is JQueryStyleEventEmitter {\n return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';\n}\n\nfunction isEventTarget(sourceObj: any): sourceObj is HasEventTargetAddRemove {\n return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';\n}\n","import { Observable } from '../Observable';\nimport { isArray } from '../util/isArray';\nimport { isFunction } from '../util/isFunction';\nimport { NodeEventHandler } from './fromEvent';\nimport { map } from '../operators/map';\n\n/* tslint:disable:max-line-length */\nexport function fromEventPattern(addHandler: (handler: NodeEventHandler) => any, removeHandler?: (handler: NodeEventHandler, signal?: any) => void): Observable;\n/** @deprecated resultSelector no longer supported, pipe to map instead */\nexport function fromEventPattern(addHandler: (handler: NodeEventHandler) => any, removeHandler?: (handler: NodeEventHandler, signal?: any) => void, resultSelector?: (...args: any[]) => T): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Creates an Observable from an arbitrary API for registering event handlers.\n *\n * When that method for adding event handler was something {@link fromEvent}\n * was not prepared for.\n *\n * ![](fromEventPattern.png)\n *\n * `fromEventPattern` allows you to convert into an Observable any API that supports registering handler functions\n * for events. It is similar to {@link fromEvent}, but far\n * more flexible. In fact, all use cases of {@link fromEvent} could be easily handled by\n * `fromEventPattern` (although in slightly more verbose way).\n *\n * This operator accepts as a first argument an `addHandler` function, which will be injected with\n * handler parameter. That handler is actually an event handler function that you now can pass\n * to API expecting it. `addHandler` will be called whenever Observable\n * returned by the operator is subscribed, so registering handler in API will not\n * necessarily happen when `fromEventPattern` is called.\n *\n * After registration, every time an event that we listen to happens,\n * Observable returned by `fromEventPattern` will emit value that event handler\n * function was called with. Note that if event handler was called with more\n * then one argument, second and following arguments will not appear in the Observable.\n *\n * If API you are using allows to unregister event handlers as well, you can pass to `fromEventPattern`\n * another function - `removeHandler` - as a second parameter. It will be injected\n * with the same handler function as before, which now you can use to unregister\n * it from the API. `removeHandler` will be called when consumer of resulting Observable\n * unsubscribes from it.\n *\n * In some APIs unregistering is actually handled differently. Method registering an event handler\n * returns some kind of token, which is later used to identify which function should\n * be unregistered or it itself has method that unregisters event handler.\n * If that is the case with your API, make sure token returned\n * by registering method is returned by `addHandler`. Then it will be passed\n * as a second argument to `removeHandler`, where you will be able to use it.\n *\n * If you need access to all event handler parameters (not only the first one),\n * or you need to transform them in any way, you can call `fromEventPattern` with optional\n * third parameter - project function which will accept all arguments passed to\n * event handler when it is called. Whatever is returned from project function will appear on\n * resulting stream instead of usual event handlers first argument. This means\n * that default project can be thought of as function that takes its first parameter\n * and ignores the rest.\n *\n * ## Example\n * ### Emits clicks happening on the DOM document\n *\n * ```ts\n * import { fromEventPattern } from 'rxjs';\n *\n * function addClickHandler(handler) {\n * document.addEventListener('click', handler);\n * }\n *\n * function removeClickHandler(handler) {\n * document.removeEventListener('click', handler);\n * }\n *\n * const clicks = fromEventPattern(\n * addClickHandler,\n * removeClickHandler\n * );\n * clicks.subscribe(x => console.log(x));\n *\n * // Whenever you click anywhere in the browser, DOM MouseEvent\n * // object will be logged.\n * ```\n *\n * ## Example\n * ### Use with API that returns cancellation token\n *\n * ```ts\n * import { fromEventPattern } from 'rxjs';\n *\n * const token = someAPI.registerEventHandler(function() {});\n * someAPI.unregisterEventHandler(token); // this APIs cancellation method accepts\n * // not handler itself, but special token.\n *\n * const someAPIObservable = fromEventPattern(\n * function(handler) { return someAPI.registerEventHandler(handler); }, // Note that we return the token here...\n * function(handler, token) { someAPI.unregisterEventHandler(token); } // ...to then use it here.\n * );\n * ```\n *\n * ## Example\n * ### Use with project function\n *\n * ```ts\n * import { fromEventPattern } from 'rxjs';\n *\n * someAPI.registerEventHandler((eventType, eventMessage) => {\n * console.log(eventType, eventMessage); // Logs \"EVENT_TYPE\" \"EVENT_MESSAGE\" to console.\n * });\n *\n * const someAPIObservable = fromEventPattern(\n * handler => someAPI.registerEventHandler(handler),\n * handler => someAPI.unregisterEventHandler(handler)\n * (eventType, eventMessage) => eventType + \" --- \" + eventMessage // without that function only \"EVENT_TYPE\"\n * ); // would be emitted by the Observable\n *\n * someAPIObservable.subscribe(value => console.log(value));\n *\n * // Logs:\n * // \"EVENT_TYPE --- EVENT_MESSAGE\"\n * ```\n *\n * @see {@link fromEvent}\n * @see {@link bindCallback}\n * @see {@link bindNodeCallback}\n *\n * @param {function(handler: Function): any} addHandler A function that takes\n * a `handler` function as argument and attaches it somehow to the actual\n * source of events.\n * @param {function(handler: Function, token?: any): void} [removeHandler] A function that\n * takes a `handler` function as an argument and removes it from the event source. If `addHandler`\n * returns some kind of token, `removeHandler` function will have it as a second parameter.\n * @param {function(...args: any): T} [project] A function to\n * transform results. It takes the arguments from the event handler and\n * should return a single value.\n * @return {Observable} Observable which, when an event happens, emits first parameter\n * passed to registered event handler. Alternatively it emits whatever project function returns\n * at that moment.\n * @static true\n * @name fromEventPattern\n * @owner Observable\n */\n\nexport function fromEventPattern(addHandler: (handler: NodeEventHandler) => any,\n removeHandler?: (handler: NodeEventHandler, signal?: any) => void,\n resultSelector?: (...args: any[]) => T): Observable {\n\n if (resultSelector) {\n // DEPRECATED PATH\n return fromEventPattern(addHandler, removeHandler).pipe(\n map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))\n );\n }\n\n return new Observable(subscriber => {\n const handler = (...e: T[]) => subscriber.next(e.length === 1 ? e[0] : e);\n\n let retValue: any;\n try {\n retValue = addHandler(handler);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n\n if (!isFunction(removeHandler)) {\n return undefined;\n }\n\n return () => removeHandler(handler, retValue) ;\n });\n}\n","import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { identity } from '../util/identity';\nimport { SchedulerAction, SchedulerLike } from '../types';\nimport { isScheduler } from '../util/isScheduler';\n\nexport type ConditionFunc = (state: S) => boolean;\nexport type IterateFunc = (state: S) => S;\nexport type ResultFunc = (state: S) => T;\n\ninterface SchedulerState {\n needIterate?: boolean;\n state: S;\n subscriber: Subscriber;\n condition?: ConditionFunc;\n iterate: IterateFunc;\n resultSelector: ResultFunc;\n}\n\nexport interface GenerateBaseOptions {\n /**\n * Initial state.\n */\n initialState: S;\n /**\n * Condition function that accepts state and returns boolean.\n * When it returns false, the generator stops.\n * If not specified, a generator never stops.\n */\n condition?: ConditionFunc;\n /**\n * Iterate function that accepts state and returns new state.\n */\n iterate: IterateFunc;\n /**\n * SchedulerLike to use for generation process.\n * By default, a generator starts immediately.\n */\n scheduler?: SchedulerLike;\n}\n\nexport interface GenerateOptions extends GenerateBaseOptions {\n /**\n * Result selection function that accepts state and returns a value to emit.\n */\n resultSelector: ResultFunc;\n}\n\n/**\n * Generates an observable sequence by running a state-driven loop\n * producing the sequence's elements, using the specified scheduler\n * to send out observer messages.\n *\n * ![](generate.png)\n *\n * @example Produces sequence of 0, 1, 2, ... 9, then completes.\n * const res = generate(0, x => x < 10, x => x + 1, x => x);\n *\n * @example Using asap scheduler, produces sequence of 2, 3, 5, then completes.\n * const res = generate(1, x => x < 5, x => x * 2, x => x + 1, asap);\n *\n * @see {@link from}\n * @see {@link Observable}\n *\n * @param {S} initialState Initial state.\n * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).\n * @param {function (state: S): S} iterate Iteration step function.\n * @param {function (state: S): T} resultSelector Selector function for results produced in the sequence. (deprecated)\n * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} on which to run the generator loop. If not provided, defaults to emit immediately.\n * @returns {Observable} The generated sequence.\n */\n export function generate(initialState: S,\n condition: ConditionFunc,\n iterate: IterateFunc,\n resultSelector: ResultFunc,\n scheduler?: SchedulerLike): Observable;\n\n/**\n * Generates an Observable by running a state-driven loop\n * that emits an element on each iteration.\n *\n * Use it instead of nexting values in a for loop.\n *\n * \n *\n * `generate` allows you to create stream of values generated with a loop very similar to\n * traditional for loop. First argument of `generate` is a beginning value. Second argument\n * is a function that accepts this value and tests if some condition still holds. If it does,\n * loop continues, if not, it stops. Third value is a function which takes previously defined\n * value and modifies it in some way on each iteration. Note how these three parameters\n * are direct equivalents of three expressions in regular for loop: first expression\n * initializes some state (for example numeric index), second tests if loop can make next\n * iteration (for example if index is lower than 10) and third states how defined value\n * will be modified on every step (index will be incremented by one).\n *\n * Return value of a `generate` operator is an Observable that on each loop iteration\n * emits a value. First, condition function is ran. If it returned true, Observable\n * emits currently stored value (initial value at the first iteration) and then updates\n * that value with iterate function. If at some point condition returned false, Observable\n * completes at that moment.\n *\n * Optionally you can pass fourth parameter to `generate` - a result selector function which allows you\n * to immediately map value that would normally be emitted by an Observable.\n *\n * If you find three anonymous functions in `generate` call hard to read, you can provide\n * single object to the operator instead. That object has properties: `initialState`,\n * `condition`, `iterate` and `resultSelector`, which should have respective values that you\n * would normally pass to `generate`. `resultSelector` is still optional, but that form\n * of calling `generate` allows you to omit `condition` as well. If you omit it, that means\n * condition always holds, so output Observable will never complete.\n *\n * Both forms of `generate` can optionally accept a scheduler. In case of multi-parameter call,\n * scheduler simply comes as a last argument (no matter if there is resultSelector\n * function or not). In case of single-parameter call, you can provide it as a\n * `scheduler` property on object passed to the operator. In both cases scheduler decides when\n * next iteration of the loop will happen and therefore when next value will be emitted\n * by the Observable. For example to ensure that each value is pushed to the observer\n * on separate task in event loop, you could use `async` scheduler. Note that\n * by default (when no scheduler is passed) values are simply emitted synchronously.\n *\n *\n * @example Use with condition and iterate functions.\n * const generated = generate(0, x => x < 3, x => x + 1);\n *\n * generated.subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('Yo!')\n * );\n *\n * // Logs:\n * // 0\n * // 1\n * // 2\n * // \"Yo!\"\n *\n *\n * @example Use with condition, iterate and resultSelector functions.\n * const generated = generate(0, x => x < 3, x => x + 1, x => x * 1000);\n *\n * generated.subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('Yo!')\n * );\n *\n * // Logs:\n * // 0\n * // 1000\n * // 2000\n * // \"Yo!\"\n *\n *\n * @example Use with options object.\n * const generated = generate({\n * initialState: 0,\n * condition(value) { return value < 3; },\n * iterate(value) { return value + 1; },\n * resultSelector(value) { return value * 1000; }\n * });\n *\n * generated.subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('Yo!')\n * );\n *\n * // Logs:\n * // 0\n * // 1000\n * // 2000\n * // \"Yo!\"\n *\n * @example Use options object without condition function.\n * const generated = generate({\n * initialState: 0,\n * iterate(value) { return value + 1; },\n * resultSelector(value) { return value * 1000; }\n * });\n *\n * generated.subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('Yo!') // This will never run.\n * );\n *\n * // Logs:\n * // 0\n * // 1000\n * // 2000\n * // 3000\n * // ...and never stops.\n *\n *\n * @see {@link from}\n * @see {@link index/Observable.create}\n *\n * @param {S} initialState Initial state.\n * @param {function (state: S): boolean} condition Condition to terminate generation (upon returning false).\n * @param {function (state: S): S} iterate Iteration step function.\n * @param {function (state: S): T} [resultSelector] Selector function for results produced in the sequence.\n * @param {Scheduler} [scheduler] A {@link Scheduler} on which to run the generator loop. If not provided, defaults to emitting immediately.\n * @return {Observable} The generated sequence.\n */\nexport function generate(initialState: S,\n condition: ConditionFunc,\n iterate: IterateFunc,\n scheduler?: SchedulerLike): Observable;\n\n/**\n * Generates an observable sequence by running a state-driven loop\n * producing the sequence's elements, using the specified scheduler\n * to send out observer messages.\n * The overload accepts options object that might contain initial state, iterate,\n * condition and scheduler.\n *\n * ![](generate.png)\n *\n * @example Produces sequence of 0, 1, 2, ... 9, then completes.\n * const res = generate({\n * initialState: 0,\n * condition: x => x < 10,\n * iterate: x => x + 1,\n * });\n *\n * @see {@link from}\n * @see {@link Observable}\n *\n * @param {GenerateBaseOptions} options Object that must contain initialState, iterate and might contain condition and scheduler.\n * @returns {Observable} The generated sequence.\n */\nexport function generate(options: GenerateBaseOptions): Observable;\n\n/**\n * Generates an observable sequence by running a state-driven loop\n * producing the sequence's elements, using the specified scheduler\n * to send out observer messages.\n * The overload accepts options object that might contain initial state, iterate,\n * condition, result selector and scheduler.\n *\n * ![](generate.png)\n *\n * @example Produces sequence of 0, 1, 2, ... 9, then completes.\n * const res = generate({\n * initialState: 0,\n * condition: x => x < 10,\n * iterate: x => x + 1,\n * resultSelector: x => x,\n * });\n *\n * @see {@link from}\n * @see {@link Observable}\n *\n * @param {GenerateOptions} options Object that must contain initialState, iterate, resultSelector and might contain condition and scheduler.\n * @returns {Observable} The generated sequence.\n */\nexport function generate(options: GenerateOptions): Observable;\n\nexport function generate(initialStateOrOptions: S | GenerateOptions,\n condition?: ConditionFunc,\n iterate?: IterateFunc,\n resultSelectorOrObservable?: (ResultFunc) | SchedulerLike,\n scheduler?: SchedulerLike): Observable {\n\n let resultSelector: ResultFunc;\n let initialState: S;\n\n if (arguments.length == 1) {\n const options = initialStateOrOptions as GenerateOptions;\n initialState = options.initialState;\n condition = options.condition;\n iterate = options.iterate;\n resultSelector = options.resultSelector || identity as ResultFunc;\n scheduler = options.scheduler;\n } else if (resultSelectorOrObservable === undefined || isScheduler(resultSelectorOrObservable)) {\n initialState = initialStateOrOptions as S;\n resultSelector = identity as ResultFunc;\n scheduler = resultSelectorOrObservable as SchedulerLike;\n } else {\n initialState = initialStateOrOptions as S;\n resultSelector = resultSelectorOrObservable as ResultFunc;\n }\n\n return new Observable(subscriber => {\n let state = initialState;\n if (scheduler) {\n return scheduler.schedule>(dispatch, 0, {\n subscriber,\n iterate,\n condition,\n resultSelector,\n state\n });\n }\n\n do {\n if (condition) {\n let conditionResult: boolean;\n try {\n conditionResult = condition(state);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n if (!conditionResult) {\n subscriber.complete();\n break;\n }\n }\n let value: T;\n try {\n value = resultSelector(state);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n subscriber.next(value);\n if (subscriber.closed) {\n break;\n }\n try {\n state = iterate(state);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n } while (true);\n\n return undefined;\n });\n}\n\nfunction dispatch(this: SchedulerAction>, state: SchedulerState) {\n const { subscriber, condition } = state;\n if (subscriber.closed) {\n return undefined;\n }\n if (state.needIterate) {\n try {\n state.state = state.iterate(state.state);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n } else {\n state.needIterate = true;\n }\n if (condition) {\n let conditionResult: boolean;\n try {\n conditionResult = condition(state.state);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n if (!conditionResult) {\n subscriber.complete();\n return undefined;\n }\n if (subscriber.closed) {\n return undefined;\n }\n }\n let value: T;\n try {\n value = state.resultSelector(state.state);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n if (subscriber.closed) {\n return undefined;\n }\n subscriber.next(value);\n if (subscriber.closed) {\n return undefined;\n }\n return this.schedule(state);\n}\n","import { Observable } from '../Observable';\nimport { defer } from './defer';\nimport { EMPTY } from './empty';\nimport { SubscribableOrPromise } from '../types';\n\n/**\n * Decides at subscription time which Observable will actually be subscribed.\n *\n * `If` statement for Observables.\n *\n * `iif` accepts a condition function and two Observables. When\n * an Observable returned by the operator is subscribed, condition function will be called.\n * Based on what boolean it returns at that moment, consumer will subscribe either to\n * the first Observable (if condition was true) or to the second (if condition was false). Condition\n * function may also not return anything - in that case condition will be evaluated as false and\n * second Observable will be subscribed.\n *\n * Note that Observables for both cases (true and false) are optional. If condition points to an Observable that\n * was left undefined, resulting stream will simply complete immediately. That allows you to, rather\n * then controlling which Observable will be subscribed, decide at runtime if consumer should have access\n * to given Observable or not.\n *\n * If you have more complex logic that requires decision between more than two Observables, {@link defer}\n * will probably be a better choice. Actually `iif` can be easily implemented with {@link defer}\n * and exists only for convenience and readability reasons.\n *\n *\n * ## Examples\n * ### Change at runtime which Observable will be subscribed\n * ```ts\n * import { iif, of } from 'rxjs';\n *\n * let subscribeToFirst;\n * const firstOrSecond = iif(\n * () => subscribeToFirst,\n * of('first'),\n * of('second'),\n * );\n *\n * subscribeToFirst = true;\n * firstOrSecond.subscribe(value => console.log(value));\n *\n * // Logs:\n * // \"first\"\n *\n * subscribeToFirst = false;\n * firstOrSecond.subscribe(value => console.log(value));\n *\n * // Logs:\n * // \"second\"\n *\n * ```\n *\n * ### Control an access to an Observable\n * ```ts\n * let accessGranted;\n * const observableIfYouHaveAccess = iif(\n * () => accessGranted,\n * of('It seems you have an access...'), // Note that only one Observable is passed to the operator.\n * );\n *\n * accessGranted = true;\n * observableIfYouHaveAccess.subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('The end'),\n * );\n *\n * // Logs:\n * // \"It seems you have an access...\"\n * // \"The end\"\n *\n * accessGranted = false;\n * observableIfYouHaveAccess.subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('The end'),\n * );\n *\n * // Logs:\n * // \"The end\"\n * ```\n *\n * @see {@link defer}\n *\n * @param {function(): boolean} condition Condition which Observable should be chosen.\n * @param {Observable} [trueObservable] An Observable that will be subscribed if condition is true.\n * @param {Observable} [falseObservable] An Observable that will be subscribed if condition is false.\n * @return {Observable} Either first or second Observable, depending on condition.\n * @static true\n * @name iif\n * @owner Observable\n */\nexport function iif(\n condition: () => boolean,\n trueResult: SubscribableOrPromise = EMPTY,\n falseResult: SubscribableOrPromise = EMPTY\n): Observable {\n return defer(() => condition() ? trueResult : falseResult);\n}\n","import { Observable } from '../Observable';\nimport { async } from '../scheduler/async';\nimport { SchedulerAction, SchedulerLike } from '../types';\nimport { isNumeric } from '../util/isNumeric';\nimport { Subscriber } from '../Subscriber';\n\n/**\n * Creates an Observable that emits sequential numbers every specified\n * interval of time, on a specified {@link SchedulerLike}.\n *\n * Emits incremental numbers periodically in time.\n * \n *\n * ![](interval.png)\n *\n * `interval` returns an Observable that emits an infinite sequence of\n * ascending integers, with a constant interval of time of your choosing\n * between those emissions. The first emission is not sent immediately, but\n * only after the first period has passed. By default, this operator uses the\n * `async` {@link SchedulerLike} to provide a notion of time, but you may pass any\n * {@link SchedulerLike} to it.\n *\n * ## Example\n * Emits ascending numbers, one every second (1000ms) up to the number 3\n * ```ts\n * import { interval } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * const numbers = interval(1000);\n *\n * const takeFourNumbers = numbers.pipe(take(4));\n *\n * takeFourNumbers.subscribe(x => console.log('Next: ', x));\n *\n * // Logs:\n * // Next: 0\n * // Next: 1\n * // Next: 2\n * // Next: 3\n * ```\n *\n * @see {@link timer}\n * @see {@link delay}\n *\n * @param {number} [period=0] The interval size in milliseconds (by default)\n * or the time unit determined by the scheduler's clock.\n * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for scheduling\n * the emission of values, and providing a notion of \"time\".\n * @return {Observable} An Observable that emits a sequential number each time\n * interval.\n * @static true\n * @name interval\n * @owner Observable\n */\nexport function interval(period = 0,\n scheduler: SchedulerLike = async): Observable {\n if (!isNumeric(period) || period < 0) {\n period = 0;\n }\n\n if (!scheduler || typeof scheduler.schedule !== 'function') {\n scheduler = async;\n }\n\n return new Observable(subscriber => {\n subscriber.add(\n scheduler.schedule(dispatch, period, { subscriber, counter: 0, period })\n );\n return subscriber;\n });\n}\n\nfunction dispatch(this: SchedulerAction, state: IntervalState) {\n const { subscriber, counter, period } = state;\n subscriber.next(counter);\n this.schedule({ subscriber, counter: counter + 1, period }, period);\n}\n\ninterface IntervalState {\n subscriber: Subscriber;\n counter: number;\n period: number;\n}\n","import { isArray } from './isArray';\n\nexport function isNumeric(val: any): val is number | string {\n // parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n // subtraction forces infinities to NaN\n // adding 1 corrects loss of precision from parseFloat (#15100)\n return !isArray(val) && (val - parseFloat(val) + 1) >= 0;\n}\n","import { Observable } from '../Observable';\nimport { ObservableInput, SchedulerLike} from '../types';\nimport { isScheduler } from '../util/isScheduler';\nimport { mergeAll } from '../operators/mergeAll';\nimport { fromArray } from './fromArray';\n\n/* tslint:disable:max-line-length */\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, scheduler: SchedulerLike): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, concurrent: number, scheduler: SchedulerLike): Observable;\n\nexport function merge(v1: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, concurrent?: number): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput): Observable;\nexport function merge(v1: ObservableInput, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, concurrent?: number): Observable;\nexport function merge(...observables: (ObservableInput | number)[]): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(...observables: (ObservableInput | SchedulerLike | number)[]): Observable;\nexport function merge(...observables: (ObservableInput | number)[]): Observable;\n/** @deprecated use {@link scheduled} and {@link mergeAll} (e.g. `scheduled([ob1, ob2, ob3], scheduled).pipe(mergeAll())*/\nexport function merge(...observables: (ObservableInput | SchedulerLike | number)[]): Observable;\n/* tslint:enable:max-line-length */\n/**\n * Creates an output Observable which concurrently emits all values from every\n * given input Observable.\n *\n * Flattens multiple Observables together by blending\n * their values into one Observable.\n *\n * ![](merge.png)\n *\n * `merge` subscribes to each given input Observable (as arguments), and simply\n * forwards (without doing any transformation) all the values from all the input\n * Observables to the output Observable. The output Observable only completes\n * once all input Observables have completed. Any error delivered by an input\n * Observable will be immediately emitted on the output Observable.\n *\n * ## Examples\n * ### Merge together two Observables: 1s interval and clicks\n * ```ts\n * import { merge, fromEvent, interval } from 'rxjs';\n *\n * const clicks = fromEvent(document, 'click');\n * const timer = interval(1000);\n * const clicksOrTimer = merge(clicks, timer);\n * clicksOrTimer.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // timer will emit ascending values, one every second(1000ms) to console\n * // clicks logs MouseEvents to console everytime the \"document\" is clicked\n * // Since the two streams are merged you see these happening\n * // as they occur.\n * ```\n *\n * ### Merge together 3 Observables, but only 2 run concurrently\n * ```ts\n * import { merge, interval } from 'rxjs';\n * import { take } from 'rxjs/operators';\n *\n * const timer1 = interval(1000).pipe(take(10));\n * const timer2 = interval(2000).pipe(take(6));\n * const timer3 = interval(500).pipe(take(10));\n * const concurrent = 2; // the argument\n * const merged = merge(timer1, timer2, timer3, concurrent);\n * merged.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // - First timer1 and timer2 will run concurrently\n * // - timer1 will emit a value every 1000ms for 10 iterations\n * // - timer2 will emit a value every 2000ms for 6 iterations\n * // - after timer1 hits it's max iteration, timer2 will\n * // continue, and timer3 will start to run concurrently with timer2\n * // - when timer2 hits it's max iteration it terminates, and\n * // timer3 will continue to emit a value every 500ms until it is complete\n * ```\n *\n * @see {@link mergeAll}\n * @see {@link mergeMap}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n *\n * @param {...ObservableInput} observables Input Observables to merge together.\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @param {SchedulerLike} [scheduler=null] The {@link SchedulerLike} to use for managing\n * concurrency of input Observables.\n * @return {Observable} an Observable that emits items that are the result of\n * every input Observable.\n * @static true\n * @name merge\n * @owner Observable\n */\nexport function merge(...observables: Array | SchedulerLike | number>): Observable {\n let concurrent = Number.POSITIVE_INFINITY;\n let scheduler: SchedulerLike = null;\n let last: any = observables[observables.length - 1];\n if (isScheduler(last)) {\n scheduler = observables.pop();\n if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n concurrent = observables.pop();\n }\n } else if (typeof last === 'number') {\n concurrent = observables.pop();\n }\n\n if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable) {\n return >observables[0];\n }\n\n return mergeAll(concurrent)(fromArray(observables, scheduler));\n}\n","import { Observable } from '../Observable';\nimport { noop } from '../util/noop';\n\n/**\n * An Observable that emits no items to the Observer and never completes.\n *\n * ![](never.png)\n *\n * A simple Observable that emits neither values nor errors nor the completion\n * notification. It can be used for testing purposes or for composing with other\n * Observables. Please note that by never emitting a complete notification, this\n * Observable keeps the subscription from being disposed automatically.\n * Subscriptions need to be manually disposed.\n *\n * ## Example\n * ### Emit the number 7, then never emit anything else (not even complete)\n * ```ts\n * import { NEVER } from 'rxjs';\n * import { startWith } from 'rxjs/operators';\n *\n * function info() {\n * console.log('Will not be called');\n * }\n * const result = NEVER.pipe(startWith(7));\n * result.subscribe(x => console.log(x), info, info);\n *\n * ```\n *\n * @see {@link Observable}\n * @see {@link index/EMPTY}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const NEVER = new Observable(noop);\n\n/**\n * @deprecated Deprecated in favor of using {@link NEVER} constant.\n */\nexport function never () {\n return NEVER;\n}\n","import { Observable } from '../Observable';\nimport { ObservableInput } from '../types';\nimport { from } from './from';\nimport { isArray } from '../util/isArray';\nimport { EMPTY } from './empty';\n\n/* tslint:disable:max-line-length */\nexport function onErrorResumeNext(v: ObservableInput): Observable;\nexport function onErrorResumeNext(v2: ObservableInput, v3: ObservableInput): Observable;\nexport function onErrorResumeNext(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput): Observable;\nexport function onErrorResumeNext(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput): Observable;\nexport function onErrorResumeNext(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput): Observable;\n\nexport function onErrorResumeNext(...observables: Array | ((...values: Array) => R)>): Observable;\nexport function onErrorResumeNext(array: ObservableInput[]): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * When any of the provided Observable emits an complete or error notification, it immediately subscribes to the next one\n * that was passed.\n *\n * Execute series of Observables no matter what, even if it means swallowing errors.\n *\n * ![](onErrorResumeNext.png)\n *\n * `onErrorResumeNext` Will subscribe to each observable source it is provided, in order.\n * If the source it's subscribed to emits an error or completes, it will move to the next source\n * without error.\n *\n * If `onErrorResumeNext` is provided no arguments, or a single, empty array, it will return {@link index/EMPTY}.\n *\n * `onErrorResumeNext` is basically {@link concat}, only it will continue, even if one of its\n * sources emits an error.\n *\n * Note that there is no way to handle any errors thrown by sources via the resuult of\n * `onErrorResumeNext`. If you want to handle errors thrown in any given source, you can\n * always use the {@link catchError} operator on them before passing them into `onErrorResumeNext`.\n *\n * ## Example\n * Subscribe to the next Observable after map fails\n * ```ts\n * import { onErrorResumeNext, of } from 'rxjs';\n * import { map } from 'rxjs/operators';\n *\n * onErrorResumeNext(\n * of(1, 2, 3, 0).pipe(\n * map(x => {\n * if (x === 0) throw Error();\n * return 10 / x;\n * })\n * ),\n * of(1, 2, 3),\n * )\n * .subscribe(\n * val => console.log(val),\n * err => console.log(err), // Will never be called.\n * () => console.log('done'),\n * );\n *\n * // Logs:\n * // 10\n * // 5\n * // 3.3333333333333335\n * // 1\n * // 2\n * // 3\n * // \"done\"\n * ```\n *\n * @see {@link concat}\n * @see {@link catchError}\n *\n * @param {...ObservableInput} sources Observables (or anything that *is* observable) passed either directly or as an array.\n * @return {Observable} An Observable that concatenates all sources, one after the other,\n * ignoring all errors, such that any error causes it to move on to the next source.\n */\nexport function onErrorResumeNext(...sources: Array |\n Array> |\n ((...values: Array) => R)>): Observable {\n\n if (sources.length === 0) {\n return EMPTY;\n }\n\n const [ first, ...remainder ] = sources;\n\n if (sources.length === 1 && isArray(first)) {\n return onErrorResumeNext(...first);\n }\n\n return new Observable(subscriber => {\n const subNext = () => subscriber.add(\n onErrorResumeNext(...remainder).subscribe(subscriber)\n );\n\n return from(first).subscribe({\n next(value) { subscriber.next(value); },\n error: subNext,\n complete: subNext,\n });\n });\n}\n","import { Observable } from '../Observable';\nimport { SchedulerAction, SchedulerLike } from '../types';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\n\n/**\n * Convert an object into an Observable of `[key, value]` pairs.\n *\n * Turn entries of an object into a stream.\n *\n * \n *\n * `pairs` takes an arbitrary object and returns an Observable that emits arrays. Each\n * emitted array has exactly two elements - the first is a key from the object\n * and the second is a value corresponding to that key. Keys are extracted from\n * an object via `Object.keys` function, which means that they will be only\n * enumerable keys that are present on an object directly - not ones inherited\n * via prototype chain.\n *\n * By default these arrays are emitted synchronously. To change that you can\n * pass a {@link SchedulerLike} as a second argument to `pairs`.\n *\n * @example Converts a javascript object to an Observable\n * ```ts\n * import { pairs } from 'rxjs';\n *\n * const obj = {\n * foo: 42,\n * bar: 56,\n * baz: 78\n * };\n *\n * pairs(obj)\n * .subscribe(\n * value => console.log(value),\n * err => {},\n * () => console.log('the end!')\n * );\n *\n * // Logs:\n * // [\"foo\", 42],\n * // [\"bar\", 56],\n * // [\"baz\", 78],\n * // \"the end!\"\n * ```\n *\n * @param {Object} obj The object to inspect and turn into an\n * Observable sequence.\n * @param {Scheduler} [scheduler] An optional IScheduler to schedule\n * when resulting Observable will emit values.\n * @returns {(Observable>)} An observable sequence of\n * [key, value] pairs from the object.\n */\nexport function pairs(obj: Object, scheduler?: SchedulerLike): Observable<[string, T]> {\n if (!scheduler) {\n return new Observable<[string, T]>(subscriber => {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length && !subscriber.closed; i++) {\n const key = keys[i];\n if (obj.hasOwnProperty(key)) {\n subscriber.next([key, obj[key]]);\n }\n }\n subscriber.complete();\n });\n } else {\n return new Observable<[string, T]>(subscriber => {\n const keys = Object.keys(obj);\n const subscription = new Subscription();\n subscription.add(\n scheduler.schedule<{ keys: string[], index: number, subscriber: Subscriber<[string, T]>, subscription: Subscription, obj: Object }>\n (dispatch, 0, { keys, index: 0, subscriber, subscription, obj }));\n return subscription;\n });\n }\n}\n\n/** @internal */\nexport function dispatch(this: SchedulerAction,\n state: { keys: string[], index: number, subscriber: Subscriber<[string, T]>, subscription: Subscription, obj: Object }) {\n const { keys, index, subscriber, subscription, obj } = state;\n if (!subscriber.closed) {\n if (index < keys.length) {\n const key = keys[index];\n subscriber.next([key, obj[key]]);\n subscription.add(this.schedule({ keys, index: index + 1, subscriber, subscription, obj }));\n } else {\n subscriber.complete();\n }\n }\n}\n","import { not } from '../util/not';\nimport { subscribeTo } from '../util/subscribeTo';\nimport { filter } from '../operators/filter';\nimport { ObservableInput } from '../types';\nimport { Observable } from '../Observable';\n\n/**\n * Splits the source Observable into two, one with values that satisfy a\n * predicate, and another with values that don't satisfy the predicate.\n *\n * It's like {@link filter}, but returns two Observables:\n * one like the output of {@link filter}, and the other with values that did not\n * pass the condition.\n *\n * ![](partition.png)\n *\n * `partition` outputs an array with two Observables that partition the values\n * from the source Observable through the given `predicate` function. The first\n * Observable in that array emits source values for which the predicate argument\n * returns true. The second Observable emits source values for which the\n * predicate returns false. The first behaves like {@link filter} and the second\n * behaves like {@link filter} with the predicate negated.\n *\n * ## Example\n * Partition a set of numbers into odds and evens observables\n * ```ts\n * import { of, partition } from 'rxjs';\n *\n * const observableValues = of(1, 2, 3, 4, 5, 6);\n * const [evens$, odds$] = partition(observableValues, (value, index) => value % 2 === 0);\n *\n * odds$.subscribe(x => console.log('odds', x));\n * evens$.subscribe(x => console.log('evens', x));\n *\n * // Logs:\n * // odds 1\n * // odds 3\n * // odds 5\n * // evens 2\n * // evens 4\n * // evens 6\n * ```\n *\n * @see {@link filter}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted on the first Observable in the returned array, if\n * `false` the value is emitted on the second Observable in the array. The\n * `index` parameter is the number `i` for the i-th source emission that has\n * happened since the subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {[Observable, Observable]} An array with two Observables: one\n * with values that passed the predicate, and another with values that did not\n * pass the predicate.\n */\nexport function partition(\n source: ObservableInput,\n predicate: (value: T, index: number) => boolean,\n thisArg?: any\n): [Observable, Observable] {\n return [\n filter(predicate, thisArg)(new Observable(subscribeTo(source))),\n filter(not(predicate, thisArg) as any)(new Observable(subscribeTo(source)))\n ] as [Observable, Observable];\n}\n","export function not(pred: Function, thisArg: any): Function {\n function notPred(): any {\n return !(( notPred).pred.apply(( notPred).thisArg, arguments));\n }\n ( notPred).pred = pred;\n ( notPred).thisArg = thisArg;\n return notPred;\n}","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { OperatorFunction, MonoTypeOperatorFunction, TeardownLogic } from '../types';\n\n/* tslint:disable:max-line-length */\nexport function filter(predicate: (value: T, index: number) => value is S,\n thisArg?: any): OperatorFunction;\nexport function filter(predicate: (value: T, index: number) => boolean,\n thisArg?: any): MonoTypeOperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.\n *\n * ![](filter.png)\n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * ## Example\n * Emit only click events whose target was a DIV element\n * ```ts\n * import { fromEvent } from 'rxjs';\n * import { filter } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const clicksOnDivs = clicks.pipe(filter(ev => ev.target.tagName === 'DIV'));\n * clicksOnDivs.subscribe(x => console.log(x));\n * ```\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nexport function filter(predicate: (value: T, index: number) => boolean,\n thisArg?: any): MonoTypeOperatorFunction {\n return function filterOperatorFunction(source: Observable): Observable {\n return source.lift(new FilterOperator(predicate, thisArg));\n };\n}\n\nclass FilterOperator implements Operator {\n constructor(private predicate: (value: T, index: number) => boolean,\n private thisArg?: any) {\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass FilterSubscriber extends Subscriber {\n\n count: number = 0;\n\n constructor(destination: Subscriber,\n private predicate: (value: T, index: number) => boolean,\n private thisArg: any) {\n super(destination);\n }\n\n // the try catch block below is left specifically for\n // optimization and perf reasons. a tryCatcher is not necessary here.\n protected _next(value: T) {\n let result: any;\n try {\n result = this.predicate.call(this.thisArg, value, this.count++);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n if (result) {\n this.destination.next(value);\n }\n }\n}\n","import { Observable } from '../Observable';\nimport { isArray } from '../util/isArray';\nimport { fromArray } from './fromArray';\nimport { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { TeardownLogic, ObservableInput } from '../types';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\n\n// tslint:disable:max-line-length\nexport function race(arg: [ObservableInput]): Observable;\nexport function race(arg: [ObservableInput, ObservableInput]): Observable;\nexport function race(arg: [ObservableInput, ObservableInput, ObservableInput]): Observable;\nexport function race(arg: [ObservableInput, ObservableInput, ObservableInput, ObservableInput]): Observable;\nexport function race(arg: [ObservableInput, ObservableInput, ObservableInput, ObservableInput, ObservableInput]): Observable;\nexport function race(arg: ObservableInput[]): Observable;\nexport function race(arg: ObservableInput[]): Observable<{}>;\n\nexport function race(a: ObservableInput): Observable;\nexport function race(a: ObservableInput, b: ObservableInput): Observable;\nexport function race(a: ObservableInput, b: ObservableInput, c: ObservableInput): Observable;\nexport function race(a: ObservableInput, b: ObservableInput, c: ObservableInput, d: ObservableInput): Observable;\nexport function race(a: ObservableInput, b: ObservableInput, c: ObservableInput, d: ObservableInput, e: ObservableInput): Observable;\n// tslint:enable:max-line-length\n\nexport function race(observables: ObservableInput[]): Observable;\nexport function race(observables: ObservableInput[]): Observable<{}>;\nexport function race(...observables: ObservableInput[]): Observable;\nexport function race(...observables: ObservableInput[]): Observable<{}>;\n\n/**\n * Returns an Observable that mirrors the first source Observable to emit an item.\n *\n * ## Example\n * ### Subscribes to the observable that was the first to start emitting.\n *\n * ```ts\n * import { race, interval } from 'rxjs';\n * import { mapTo } from 'rxjs/operators';\n *\n * const obs1 = interval(1000).pipe(mapTo('fast one'));\n * const obs2 = interval(3000).pipe(mapTo('medium one'));\n * const obs3 = interval(5000).pipe(mapTo('slow one'));\n *\n * race(obs3, obs1, obs2)\n * .subscribe(\n * winner => console.log(winner)\n * );\n *\n * // result:\n * // a series of 'fast one'\n * ```\n *\n * @param {...Observables} ...observables sources used to race for which Observable emits first.\n * @return {Observable} an Observable that mirrors the output of the first Observable to emit an item.\n * @static true\n * @name race\n * @owner Observable\n */\nexport function race(...observables: ObservableInput[]): Observable {\n // if the only argument is an array, it was most likely called with\n // `race([obs1, obs2, ...])`\n if (observables.length === 1) {\n if (isArray(observables[0])) {\n observables = observables[0] as Observable[];\n } else {\n return observables[0] as Observable;\n }\n }\n\n return fromArray(observables, undefined).lift(new RaceOperator());\n}\n\nexport class RaceOperator implements Operator {\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new RaceSubscriber(subscriber));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class RaceSubscriber extends OuterSubscriber {\n private hasFirst: boolean = false;\n private observables: Observable[] = [];\n private subscriptions: Subscription[] = [];\n\n constructor(destination: Subscriber) {\n super(destination);\n }\n\n protected _next(observable: any): void {\n this.observables.push(observable);\n }\n\n protected _complete() {\n const observables = this.observables;\n const len = observables.length;\n\n if (len === 0) {\n this.destination.complete();\n } else {\n for (let i = 0; i < len && !this.hasFirst; i++) {\n let observable = observables[i];\n let subscription = subscribeToResult(this, observable, observable as any, i);\n\n if (this.subscriptions) {\n this.subscriptions.push(subscription);\n }\n this.add(subscription);\n }\n this.observables = null;\n }\n }\n\n notifyNext(outerValue: T, innerValue: T,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n if (!this.hasFirst) {\n this.hasFirst = true;\n\n for (let i = 0; i < this.subscriptions.length; i++) {\n if (i !== outerIndex) {\n let subscription = this.subscriptions[i];\n\n subscription.unsubscribe();\n this.remove(subscription);\n }\n }\n\n this.subscriptions = null;\n }\n\n this.destination.next(innerValue);\n }\n}\n","import { SchedulerAction, SchedulerLike } from '../types';\nimport { Observable } from '../Observable';\n\n/**\n * Creates an Observable that emits a sequence of numbers within a specified\n * range.\n *\n * Emits a sequence of numbers in a range.\n *\n * ![](range.png)\n *\n * `range` operator emits a range of sequential integers, in order, where you\n * select the `start` of the range and its `length`. By default, uses no\n * {@link SchedulerLike} and just delivers the notifications synchronously, but may use\n * an optional {@link SchedulerLike} to regulate those deliveries.\n *\n * ## Example\n * Emits the numbers 1 to 10\n * ```ts\n * import { range } from 'rxjs';\n *\n * const numbers = range(1, 10);\n * numbers.subscribe(x => console.log(x));\n * ```\n * @see {@link timer}\n * @see {@link index/interval}\n *\n * @param {number} [start=0] The value of the first integer in the sequence.\n * @param {number} count The number of sequential integers to generate.\n * @param {SchedulerLike} [scheduler] A {@link SchedulerLike} to use for scheduling\n * the emissions of the notifications.\n * @return {Observable} An Observable of numbers that emits a finite range of\n * sequential integers.\n * @static true\n * @name range\n * @owner Observable\n */\nexport function range(start: number = 0,\n count?: number,\n scheduler?: SchedulerLike): Observable {\n return new Observable(subscriber => {\n if (count === undefined) {\n count = start;\n start = 0;\n }\n\n let index = 0;\n let current = start;\n\n if (scheduler) {\n return scheduler.schedule(dispatch, 0, {\n index, count, start, subscriber\n });\n } else {\n do {\n if (index++ >= count) {\n subscriber.complete();\n break;\n }\n subscriber.next(current++);\n if (subscriber.closed) {\n break;\n }\n } while (true);\n }\n\n return undefined;\n });\n}\n\n/** @internal */\nexport function dispatch(this: SchedulerAction, state: any) {\n const { start, index, count, subscriber } = state;\n\n if (index >= count) {\n subscriber.complete();\n return;\n }\n\n subscriber.next(start);\n\n if (subscriber.closed) {\n return;\n }\n\n state.index = index + 1;\n state.start = start + 1;\n\n this.schedule(state);\n}\n","import { Observable } from '../Observable';\nimport { SchedulerAction, SchedulerLike } from '../types';\nimport { async } from '../scheduler/async';\nimport { isNumeric } from '../util/isNumeric';\nimport { isScheduler } from '../util/isScheduler';\nimport { Subscriber } from '../Subscriber';\n\n/**\n * Creates an Observable that starts emitting after an `dueTime` and\n * emits ever increasing numbers after each `period` of time thereafter.\n *\n * Its like {@link index/interval}, but you can specify when\n * should the emissions start.\n *\n * ![](timer.png)\n *\n * `timer` returns an Observable that emits an infinite sequence of ascending\n * integers, with a constant interval of time, `period` of your choosing\n * between those emissions. The first emission happens after the specified\n * `dueTime`. The initial delay may be a `Date`. By default, this\n * operator uses the {@link asyncScheduler} {@link SchedulerLike} to provide a notion of time, but you\n * may pass any {@link SchedulerLike} to it. If `period` is not specified, the output\n * Observable emits only one value, `0`. Otherwise, it emits an infinite\n * sequence.\n *\n * ## Examples\n * ### Emits ascending numbers, one every second (1000ms), starting after 3 seconds\n * ```ts\n * import { timer } from 'rxjs';\n *\n * const numbers = timer(3000, 1000);\n * numbers.subscribe(x => console.log(x));\n * ```\n *\n * ### Emits one number after five seconds\n * ```ts\n * import { timer } from 'rxjs';\n *\n * const numbers = timer(5000);\n * numbers.subscribe(x => console.log(x));\n * ```\n * @see {@link index/interval}\n * @see {@link delay}\n *\n * @param {number|Date} [dueTime] The initial delay time specified as a Date object or as an integer denoting\n * milliseconds to wait before emitting the first value of 0`.\n * @param {number|SchedulerLike} [periodOrScheduler] The period of time between emissions of the\n * subsequent numbers.\n * @param {SchedulerLike} [scheduler=async] The {@link SchedulerLike} to use for scheduling\n * the emission of values, and providing a notion of \"time\".\n * @return {Observable} An Observable that emits a `0` after the\n * `dueTime` and ever increasing numbers after each `period` of time\n * thereafter.\n * @static true\n * @name timer\n * @owner Observable\n */\nexport function timer(dueTime: number | Date = 0,\n periodOrScheduler?: number | SchedulerLike,\n scheduler?: SchedulerLike): Observable {\n let period = -1;\n if (isNumeric(periodOrScheduler)) {\n period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);\n } else if (isScheduler(periodOrScheduler)) {\n scheduler = periodOrScheduler as any;\n }\n\n if (!isScheduler(scheduler)) {\n scheduler = async;\n }\n\n return new Observable(subscriber => {\n const due = isNumeric(dueTime)\n ? (dueTime as number)\n : (+dueTime - scheduler.now());\n\n return scheduler.schedule(dispatch, due, {\n index: 0, period, subscriber\n });\n });\n}\n\ninterface TimerState {\n index: number;\n period: number;\n subscriber: Subscriber;\n}\n\nfunction dispatch(this: SchedulerAction, state: TimerState) {\n const { index, period, subscriber } = state;\n subscriber.next(index);\n\n if (subscriber.closed) {\n return;\n } else if (period === -1) {\n return subscriber.complete();\n }\n\n state.index = index + 1;\n this.schedule(state, period);\n}\n","import { Observable } from '../Observable';\nimport { Unsubscribable, ObservableInput } from '../types';\nimport { from } from './from'; // from from from! LAWL\nimport { EMPTY } from './empty';\n\n/**\n * Creates an Observable that uses a resource which will be disposed at the same time as the Observable.\n *\n * Use it when you catch yourself cleaning up after an Observable.\n *\n * `using` is a factory operator, which accepts two functions. First function returns a disposable resource.\n * It can be an arbitrary object that implements `unsubscribe` method. Second function will be injected with\n * that object and should return an Observable. That Observable can use resource object during its execution.\n * Both functions passed to `using` will be called every time someone subscribes - neither an Observable nor\n * resource object will be shared in any way between subscriptions.\n *\n * When Observable returned by `using` is subscribed, Observable returned from the second function will be subscribed\n * as well. All its notifications (nexted values, completion and error events) will be emitted unchanged by the output\n * Observable. If however someone unsubscribes from the Observable or source Observable completes or errors by itself,\n * the `unsubscribe` method on resource object will be called. This can be used to do any necessary clean up, which\n * otherwise would have to be handled by hand. Note that complete or error notifications are not emitted when someone\n * cancels subscription to an Observable via `unsubscribe`, so `using` can be used as a hook, allowing you to make\n * sure that all resources which need to exist during an Observable execution will be disposed at appropriate time.\n *\n * @see {@link defer}\n *\n * @param {function(): ISubscription} resourceFactory A function which creates any resource object\n * that implements `unsubscribe` method.\n * @param {function(resource: ISubscription): Observable} observableFactory A function which\n * creates an Observable, that can use injected resource object.\n * @return {Observable} An Observable that behaves the same as Observable returned by `observableFactory`, but\n * which - when completed, errored or unsubscribed - will also call `unsubscribe` on created resource object.\n */\nexport function using(resourceFactory: () => Unsubscribable | void,\n observableFactory: (resource: Unsubscribable | void) => ObservableInput | void): Observable {\n return new Observable(subscriber => {\n let resource: Unsubscribable | void;\n\n try {\n resource = resourceFactory();\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n\n let result: ObservableInput | void;\n try {\n result = observableFactory(resource);\n } catch (err) {\n subscriber.error(err);\n return undefined;\n }\n\n const source = result ? from(result) : EMPTY;\n const subscription = source.subscribe(subscriber);\n return () => {\n subscription.unsubscribe();\n if (resource) {\n resource.unsubscribe();\n }\n };\n });\n}\n","import { Observable } from '../Observable';\nimport { fromArray } from './fromArray';\nimport { isArray } from '../util/isArray';\nimport { Operator } from '../Operator';\nimport { ObservableInput, PartialObserver, ObservedValueOf } from '../types';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { iterator as Symbol_iterator } from '../../internal/symbol/iterator';\n\n/* tslint:disable:max-line-length */\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip, R>(v1: O1, resultSelector: (v1: ObservedValueOf) => R): Observable;\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip, O2 extends ObservableInput, R>(v1: O1, v2: O2, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf) => R): Observable;\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf) => R): Observable;\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, v4: O4, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf) => R): Observable;\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf, v5: ObservedValueOf) => R): Observable;\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput, R>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6, resultSelector: (v1: ObservedValueOf, v2: ObservedValueOf, v3: ObservedValueOf, v4: ObservedValueOf, v5: ObservedValueOf, v6: ObservedValueOf) => R): Observable;\n\nexport function zip, O2 extends ObservableInput>(v1: O1, v2: O2): Observable<[ObservedValueOf, ObservedValueOf]>;\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput>(v1: O1, v2: O2, v3: O3): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\nexport function zip, O2 extends ObservableInput, O3 extends ObservableInput, O4 extends ObservableInput, O5 extends ObservableInput, O6 extends ObservableInput>(v1: O1, v2: O2, v3: O3, v4: O4, v5: O5, v6: O6): Observable<[ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf, ObservedValueOf]>;\n\nexport function zip>(array: O[]): Observable[]>;\nexport function zip(array: ObservableInput[]): Observable;\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip, R>(array: O[], resultSelector: (...values: ObservedValueOf[]) => R): Observable;\n/** @deprecated resultSelector is no longer supported, pipe to map instead */\nexport function zip(array: ObservableInput[], resultSelector: (...values: any[]) => R): Observable;\n\nexport function zip>(...observables: O[]): Observable[]>;\nexport function zip, R>(...observables: Array[]) => R)>): Observable;\nexport function zip(...observables: Array | ((...values: Array) => R)>): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Combines multiple Observables to create an Observable whose values are calculated from the values, in order, of each\n * of its input Observables.\n *\n * If the last parameter is a function, this function is used to compute the created value from the input values.\n * Otherwise, an array of the input values is returned.\n *\n * ## Example\n * Combine age and name from different sources\n * ```ts\n * import { zip, of } from 'rxjs';\n * import { map } from 'rxjs/operators';\n *\n * let age$ = of(27, 25, 29);\n * let name$ = of('Foo', 'Bar', 'Beer');\n * let isDev$ = of(true, true, false);\n *\n * zip(age$, name$, isDev$).pipe(\n * map(([age, name, isDev]) => ({ age, name, isDev })),\n * )\n * .subscribe(x => console.log(x));\n *\n * // outputs\n * // { age: 27, name: 'Foo', isDev: true }\n * // { age: 25, name: 'Bar', isDev: true }\n * // { age: 29, name: 'Beer', isDev: false }\n * ```\n * @param observables\n * @return {Observable}\n * @static true\n * @name zip\n * @owner Observable\n */\nexport function zip, R>(\n ...observables: Array[]) => R)>\n): Observable[]|R> {\n const resultSelector = <((...ys: Array) => R)> observables[observables.length - 1];\n if (typeof resultSelector === 'function') {\n observables.pop();\n }\n return fromArray(observables, undefined).lift(new ZipOperator(resultSelector));\n}\n\nexport class ZipOperator implements Operator {\n\n resultSelector: (...values: Array) => R;\n\n constructor(resultSelector?: (...values: Array) => R) {\n this.resultSelector = resultSelector;\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class ZipSubscriber extends Subscriber {\n private values: any;\n private resultSelector: (...values: Array) => R;\n private iterators: LookAheadIterator[] = [];\n private active = 0;\n\n constructor(destination: Subscriber,\n resultSelector?: (...values: Array) => R,\n values: any = Object.create(null)) {\n super(destination);\n this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;\n this.values = values;\n }\n\n protected _next(value: any) {\n const iterators = this.iterators;\n if (isArray(value)) {\n iterators.push(new StaticArrayIterator(value));\n } else if (typeof value[Symbol_iterator] === 'function') {\n iterators.push(new StaticIterator(value[Symbol_iterator]()));\n } else {\n iterators.push(new ZipBufferIterator(this.destination, this, value));\n }\n }\n\n protected _complete() {\n const iterators = this.iterators;\n const len = iterators.length;\n\n this.unsubscribe();\n\n if (len === 0) {\n this.destination.complete();\n return;\n }\n\n this.active = len;\n for (let i = 0; i < len; i++) {\n let iterator: ZipBufferIterator = iterators[i];\n if (iterator.stillUnsubscribed) {\n const destination = this.destination as Subscription;\n destination.add(iterator.subscribe(iterator, i));\n } else {\n this.active--; // not an observable\n }\n }\n }\n\n notifyInactive() {\n this.active--;\n if (this.active === 0) {\n this.destination.complete();\n }\n }\n\n checkIterators() {\n const iterators = this.iterators;\n const len = iterators.length;\n const destination = this.destination;\n\n // abort if not all of them have values\n for (let i = 0; i < len; i++) {\n let iterator = iterators[i];\n if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {\n return;\n }\n }\n\n let shouldComplete = false;\n const args: any[] = [];\n for (let i = 0; i < len; i++) {\n let iterator = iterators[i];\n let result = iterator.next();\n\n // check to see if it's completed now that you've gotten\n // the next value.\n if (iterator.hasCompleted()) {\n shouldComplete = true;\n }\n\n if (result.done) {\n destination.complete();\n return;\n }\n\n args.push(result.value);\n }\n\n if (this.resultSelector) {\n this._tryresultSelector(args);\n } else {\n destination.next(args);\n }\n\n if (shouldComplete) {\n destination.complete();\n }\n }\n\n protected _tryresultSelector(args: any[]) {\n let result: any;\n try {\n result = this.resultSelector.apply(this, args);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n}\n\ninterface LookAheadIterator extends Iterator {\n hasValue(): boolean;\n hasCompleted(): boolean;\n}\n\nclass StaticIterator implements LookAheadIterator {\n private nextResult: IteratorResult;\n\n constructor(private iterator: Iterator) {\n this.nextResult = iterator.next();\n }\n\n hasValue() {\n return true;\n }\n\n next(): IteratorResult {\n const result = this.nextResult;\n this.nextResult = this.iterator.next();\n return result;\n }\n\n hasCompleted() {\n const nextResult = this.nextResult;\n return nextResult && nextResult.done;\n }\n}\n\nclass StaticArrayIterator implements LookAheadIterator {\n private index = 0;\n private length = 0;\n\n constructor(private array: T[]) {\n this.length = array.length;\n }\n\n [Symbol_iterator]() {\n return this;\n }\n\n next(value?: any): IteratorResult {\n const i = this.index++;\n const array = this.array;\n return i < this.length ? { value: array[i], done: false } : { value: null, done: true };\n }\n\n hasValue() {\n return this.array.length > this.index;\n }\n\n hasCompleted() {\n return this.array.length === this.index;\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass ZipBufferIterator extends OuterSubscriber implements LookAheadIterator {\n stillUnsubscribed = true;\n buffer: T[] = [];\n isComplete = false;\n\n constructor(destination: PartialObserver,\n private parent: ZipSubscriber,\n private observable: Observable) {\n super(destination);\n }\n\n [Symbol_iterator]() {\n return this;\n }\n\n // NOTE: there is actually a name collision here with Subscriber.next and Iterator.next\n // this is legit because `next()` will never be called by a subscription in this case.\n next(): IteratorResult {\n const buffer = this.buffer;\n if (buffer.length === 0 && this.isComplete) {\n return { value: null, done: true };\n } else {\n return { value: buffer.shift(), done: false };\n }\n }\n\n hasValue() {\n return this.buffer.length > 0;\n }\n\n hasCompleted() {\n return this.buffer.length === 0 && this.isComplete;\n }\n\n notifyComplete() {\n if (this.buffer.length > 0) {\n this.isComplete = true;\n this.parent.notifyInactive();\n } else {\n this.destination.complete();\n }\n }\n\n notifyNext(outerValue: T, innerValue: any,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n this.buffer.push(innerValue);\n this.parent.checkIterators();\n }\n\n subscribe(value: any, index: number) {\n return subscribeToResult(this, this.observable, this, index);\n }\n}\n","// Polyfills\n\nif ( Number.EPSILON === undefined ) {\n\n\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n}\n\nif ( Number.isInteger === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n\n\tNumber.isInteger = function ( value ) {\n\n\t\treturn typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;\n\n\t};\n\n}\n\n//\n\nif ( Math.sign === undefined ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\tMath.sign = function ( x ) {\n\n\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t};\n\n}\n\nif ( 'name' in Function.prototype === false ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\tget: function () {\n\n\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t}\n\n\t} );\n\n}\n\nif ( Object.assign === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t( function () {\n\n\t\tObject.assign = function ( target ) {\n\n\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t}\n\n\t\t\tvar output = Object( target );\n\n\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn output;\n\n\t\t};\n\n\t} )();\n\n}\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nfunction EventDispatcher() {}\n\nObject.assign( EventDispatcher.prototype, {\n\n\taddEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tvar listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t},\n\n\thasEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tvar listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t},\n\n\tremoveEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tvar listeners = this._listeners;\n\t\tvar listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tdispatchEvent: function ( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tvar listeners = this._listeners;\n\t\tvar listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\tvar array = listenerArray.slice( 0 );\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nvar REVISION = '106';\nvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\nvar CullFaceNone = 0;\nvar CullFaceBack = 1;\nvar CullFaceFront = 2;\nvar CullFaceFrontBack = 3;\nvar FrontFaceDirectionCW = 0;\nvar FrontFaceDirectionCCW = 1;\nvar BasicShadowMap = 0;\nvar PCFShadowMap = 1;\nvar PCFSoftShadowMap = 2;\nvar FrontSide = 0;\nvar BackSide = 1;\nvar DoubleSide = 2;\nvar FlatShading = 1;\nvar SmoothShading = 2;\nvar NoColors = 0;\nvar FaceColors = 1;\nvar VertexColors = 2;\nvar NoBlending = 0;\nvar NormalBlending = 1;\nvar AdditiveBlending = 2;\nvar SubtractiveBlending = 3;\nvar MultiplyBlending = 4;\nvar CustomBlending = 5;\nvar AddEquation = 100;\nvar SubtractEquation = 101;\nvar ReverseSubtractEquation = 102;\nvar MinEquation = 103;\nvar MaxEquation = 104;\nvar ZeroFactor = 200;\nvar OneFactor = 201;\nvar SrcColorFactor = 202;\nvar OneMinusSrcColorFactor = 203;\nvar SrcAlphaFactor = 204;\nvar OneMinusSrcAlphaFactor = 205;\nvar DstAlphaFactor = 206;\nvar OneMinusDstAlphaFactor = 207;\nvar DstColorFactor = 208;\nvar OneMinusDstColorFactor = 209;\nvar SrcAlphaSaturateFactor = 210;\nvar NeverDepth = 0;\nvar AlwaysDepth = 1;\nvar LessDepth = 2;\nvar LessEqualDepth = 3;\nvar EqualDepth = 4;\nvar GreaterEqualDepth = 5;\nvar GreaterDepth = 6;\nvar NotEqualDepth = 7;\nvar MultiplyOperation = 0;\nvar MixOperation = 1;\nvar AddOperation = 2;\nvar NoToneMapping = 0;\nvar LinearToneMapping = 1;\nvar ReinhardToneMapping = 2;\nvar Uncharted2ToneMapping = 3;\nvar CineonToneMapping = 4;\nvar ACESFilmicToneMapping = 5;\n\nvar UVMapping = 300;\nvar CubeReflectionMapping = 301;\nvar CubeRefractionMapping = 302;\nvar EquirectangularReflectionMapping = 303;\nvar EquirectangularRefractionMapping = 304;\nvar SphericalReflectionMapping = 305;\nvar CubeUVReflectionMapping = 306;\nvar CubeUVRefractionMapping = 307;\nvar RepeatWrapping = 1000;\nvar ClampToEdgeWrapping = 1001;\nvar MirroredRepeatWrapping = 1002;\nvar NearestFilter = 1003;\nvar NearestMipMapNearestFilter = 1004;\nvar NearestMipMapLinearFilter = 1005;\nvar LinearFilter = 1006;\nvar LinearMipMapNearestFilter = 1007;\nvar LinearMipMapLinearFilter = 1008;\nvar UnsignedByteType = 1009;\nvar ByteType = 1010;\nvar ShortType = 1011;\nvar UnsignedShortType = 1012;\nvar IntType = 1013;\nvar UnsignedIntType = 1014;\nvar FloatType = 1015;\nvar HalfFloatType = 1016;\nvar UnsignedShort4444Type = 1017;\nvar UnsignedShort5551Type = 1018;\nvar UnsignedShort565Type = 1019;\nvar UnsignedInt248Type = 1020;\nvar AlphaFormat = 1021;\nvar RGBFormat = 1022;\nvar RGBAFormat = 1023;\nvar LuminanceFormat = 1024;\nvar LuminanceAlphaFormat = 1025;\nvar RGBEFormat = RGBAFormat;\nvar DepthFormat = 1026;\nvar DepthStencilFormat = 1027;\nvar RedFormat = 1028;\nvar RGB_S3TC_DXT1_Format = 33776;\nvar RGBA_S3TC_DXT1_Format = 33777;\nvar RGBA_S3TC_DXT3_Format = 33778;\nvar RGBA_S3TC_DXT5_Format = 33779;\nvar RGB_PVRTC_4BPPV1_Format = 35840;\nvar RGB_PVRTC_2BPPV1_Format = 35841;\nvar RGBA_PVRTC_4BPPV1_Format = 35842;\nvar RGBA_PVRTC_2BPPV1_Format = 35843;\nvar RGB_ETC1_Format = 36196;\nvar RGBA_ASTC_4x4_Format = 37808;\nvar RGBA_ASTC_5x4_Format = 37809;\nvar RGBA_ASTC_5x5_Format = 37810;\nvar RGBA_ASTC_6x5_Format = 37811;\nvar RGBA_ASTC_6x6_Format = 37812;\nvar RGBA_ASTC_8x5_Format = 37813;\nvar RGBA_ASTC_8x6_Format = 37814;\nvar RGBA_ASTC_8x8_Format = 37815;\nvar RGBA_ASTC_10x5_Format = 37816;\nvar RGBA_ASTC_10x6_Format = 37817;\nvar RGBA_ASTC_10x8_Format = 37818;\nvar RGBA_ASTC_10x10_Format = 37819;\nvar RGBA_ASTC_12x10_Format = 37820;\nvar RGBA_ASTC_12x12_Format = 37821;\nvar LoopOnce = 2200;\nvar LoopRepeat = 2201;\nvar LoopPingPong = 2202;\nvar InterpolateDiscrete = 2300;\nvar InterpolateLinear = 2301;\nvar InterpolateSmooth = 2302;\nvar ZeroCurvatureEnding = 2400;\nvar ZeroSlopeEnding = 2401;\nvar WrapAroundEnding = 2402;\nvar TrianglesDrawMode = 0;\nvar TriangleStripDrawMode = 1;\nvar TriangleFanDrawMode = 2;\nvar LinearEncoding = 3000;\nvar sRGBEncoding = 3001;\nvar GammaEncoding = 3007;\nvar RGBEEncoding = 3002;\nvar LogLuvEncoding = 3003;\nvar RGBM7Encoding = 3004;\nvar RGBM16Encoding = 3005;\nvar RGBDEncoding = 3006;\nvar BasicDepthPacking = 3200;\nvar RGBADepthPacking = 3201;\nvar TangentSpaceNormalMap = 0;\nvar ObjectSpaceNormalMap = 1;\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar _Math = {\n\n\tDEG2RAD: Math.PI / 180,\n\tRAD2DEG: 180 / Math.PI,\n\n\tgenerateUUID: ( function () {\n\n\t\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\t\tvar lut = [];\n\n\t\tfor ( var i = 0; i < 256; i ++ ) {\n\n\t\t\tlut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n\t\t}\n\n\t\treturn function generateUUID() {\n\n\t\t\tvar d0 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d1 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d2 = Math.random() * 0xffffffff | 0;\n\t\t\tvar d3 = Math.random() * 0xffffffff | 0;\n\t\t\tvar uuid = lut[ d0 & 0xff ] + lut[ d0 >> 8 & 0xff ] + lut[ d0 >> 16 & 0xff ] + lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t\tlut[ d1 & 0xff ] + lut[ d1 >> 8 & 0xff ] + '-' + lut[ d1 >> 16 & 0x0f | 0x40 ] + lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t\tlut[ d2 & 0x3f | 0x80 ] + lut[ d2 >> 8 & 0xff ] + '-' + lut[ d2 >> 16 & 0xff ] + lut[ d2 >> 24 & 0xff ] +\n\t\t\t\tlut[ d3 & 0xff ] + lut[ d3 >> 8 & 0xff ] + lut[ d3 >> 16 & 0xff ] + lut[ d3 >> 24 & 0xff ];\n\n\t\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\t\treturn uuid.toUpperCase();\n\n\t\t};\n\n\t} )(),\n\n\tclamp: function ( value, min, max ) {\n\n\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t},\n\n\t// compute euclidian modulo of m % n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\teuclideanModulo: function ( n, m ) {\n\n\t\treturn ( ( n % m ) + m ) % m;\n\n\t},\n\n\t// Linear mapping from range to range \n\n\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t},\n\n\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\tlerp: function ( x, y, t ) {\n\n\t\treturn ( 1 - t ) * x + t * y;\n\n\t},\n\n\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\tsmoothstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * ( 3 - 2 * x );\n\n\t},\n\n\tsmootherstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t},\n\n\t// Random integer from interval\n\n\trandInt: function ( low, high ) {\n\n\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t},\n\n\t// Random float from interval\n\n\trandFloat: function ( low, high ) {\n\n\t\treturn low + Math.random() * ( high - low );\n\n\t},\n\n\t// Random float from <-range/2, range/2> interval\n\n\trandFloatSpread: function ( range ) {\n\n\t\treturn range * ( 0.5 - Math.random() );\n\n\t},\n\n\tdegToRad: function ( degrees ) {\n\n\t\treturn degrees * _Math.DEG2RAD;\n\n\t},\n\n\tradToDeg: function ( radians ) {\n\n\t\treturn radians * _Math.RAD2DEG;\n\n\t},\n\n\tisPowerOfTwo: function ( value ) {\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t},\n\n\tceilPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n\t},\n\n\tfloorPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author philogb / http://blog.thejit.org/\n * @author egraether / http://egraether.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n */\n\nfunction Vector2( x, y ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\n}\n\nObject.defineProperties( Vector2.prototype, {\n\n\t\"width\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t}\n\n\t},\n\n\t\"height\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tisVector2: true,\n\n\tset: function ( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tvar x = this.x, y = this.y;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function ( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t},\n\n\tcross: function ( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tangle: function () {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\treturn angle;\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t},\n\n\trotateAround: function ( center, angle ) {\n\n\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tvar x = this.x - center.x;\n\t\tvar y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n */\n\nfunction Quaternion( x, y, z, w ) {\n\n\tthis._x = x || 0;\n\tthis._y = y || 0;\n\tthis._z = z || 0;\n\tthis._w = ( w !== undefined ) ? w : 1;\n\n}\n\nObject.assign( Quaternion, {\n\n\tslerp: function ( qa, qb, qm, t ) {\n\n\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t},\n\n\tslerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tvar s = 1 - t,\n\n\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tvar tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n} );\n\nObject.defineProperties( Quaternion.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tw: {\n\n\t\tget: function () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Quaternion.prototype, {\n\n\tisQuaternion: true,\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t},\n\n\tcopy: function ( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromEuler: function ( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tvar x = euler._x, y = euler._y, z = euler._z, order = euler.order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tvar cos = Math.cos;\n\t\tvar sin = Math.sin;\n\n\t\tvar c1 = cos( x / 2 );\n\t\tvar c2 = cos( y / 2 );\n\t\tvar c3 = cos( z / 2 );\n\n\t\tvar s1 = sin( x / 2 );\n\t\tvar s2 = sin( y / 2 );\n\t\tvar s3 = sin( z / 2 );\n\n\t\tif ( order === 'XYZ' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t} else if ( order === 'YZX' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t} else if ( order === 'XZY' ) {\n\n\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33,\n\t\t\ts;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromUnitVectors: function ( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tvar EPS = 0.000001;\n\n\t\tvar r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < EPS ) {\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t},\n\n\tangleTo: function ( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( _Math.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t},\n\n\trotateTowards: function ( q, step ) {\n\n\t\tvar angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tvar t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t},\n\n\tinverse: function () {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t},\n\n\tconjugate: function () {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\tvar l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t},\n\n\tpremultiply: function ( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t},\n\n\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tslerp: function ( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tvar s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t},\n\n\t_onChange: function ( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\t_onChangeCallback: function () {}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author kile / http://kile.stravaganza.org/\n * @author philogb / http://blog.thejit.org/\n * @author mikael emtinger / http://gomo.se/\n * @author egraether / http://egraether.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Vector3( x, y, z ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n\n}\n\nObject.assign( Vector3.prototype, {\n\n\tisVector3: true,\n\n\tset: function ( x, y, z ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyVectors: function ( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyEuler: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function applyEuler( euler ) {\n\n\t\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t};\n\n\t}(),\n\n\tapplyAxisAngle: function () {\n\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t};\n\n\t}(),\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tvar w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tvar ix = qw * x + qy * z - qz * y;\n\t\tvar iy = qw * y + qz * x - qx * z;\n\t\tvar iz = qw * z + qx * y - qy * x;\n\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t},\n\n\tproject: function ( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t},\n\n\tunproject: function ( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t},\n\n\ttransformDirection: function ( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tvar x = this.x, y = this.y, z = this.z;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function ( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t},\n\n\t// TODO lengthSquared?\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tcross: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t},\n\n\tcrossVectors: function ( a, b ) {\n\n\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t},\n\n\tprojectOnVector: function ( vector ) {\n\n\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t},\n\n\tprojectOnPlane: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\treturn this.sub( v1 );\n\n\t\t};\n\n\t}(),\n\n\treflect: function () {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function reflect( normal ) {\n\n\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t};\n\n\t}(),\n\n\tangleTo: function ( v ) {\n\n\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t},\n\n\tsetFromSpherical: function ( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t},\n\n\tsetFromSphericalCoords: function ( radius, phi, theta ) {\n\n\t\tvar sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCylindrical: function ( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t},\n\n\tsetFromCylindricalCoords: function ( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixPosition: function ( m ) {\n\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixScale: function ( m ) {\n\n\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n * @author tschw\n */\n\nfunction Matrix3() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0,\n\t\t0, 1, 0,\n\t\t0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix3.prototype, {\n\n\tisMatrix3: true,\n\n\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrix4: function ( m ) {\n\n\t\tvar me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tapplyToBufferAttribute: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t}\n\n\t\t\treturn attribute;\n\n\t\t};\n\n\t}(),\n\n\tmultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tvar ae = a.elements;\n\t\tvar be = b.elements;\n\t\tvar te = this.elements;\n\n\t\tvar a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tvar a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tvar a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tvar b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tvar b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tvar b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tdeterminant: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t},\n\n\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\tconsole.error( \"THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.\" );\n\n\t\t}\n\n\t\tvar me = matrix.elements,\n\t\t\tte = this.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) {\n\n\t\t\tvar msg = \"THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\tthrow new Error( msg );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( msg );\n\n\t\t\t}\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tvar detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\ttranspose: function () {\n\n\t\tvar tmp, m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t},\n\n\ttransposeIntoArray: function ( r ) {\n\n\t\tvar m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tvar c = Math.cos( rotation );\n\t\tvar s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t},\n\n\tscale: function ( sx, sy ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t},\n\n\trotate: function ( theta ) {\n\n\t\tvar c = Math.cos( theta );\n\t\tvar s = Math.sin( theta );\n\n\t\tvar te = this.elements;\n\n\t\tvar a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tvar a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( tx, ty ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = matrix.elements;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tvar te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author szimek / https://github.com/szimek/\n */\n\nvar _canvas;\n\nvar ImageUtils = {\n\n\tgetDataURL: function ( image ) {\n\n\t\tvar canvas;\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t} else if ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tvar context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author szimek / https://github.com/szimek/\n */\n\nvar textureId = 0;\n\nfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\n\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\tthis.mipmaps = [];\n\n\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\tthis.format = format !== undefined ? format : RGBAFormat;\n\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\tthis.offset = new Vector2( 0, 0 );\n\tthis.repeat = new Vector2( 1, 1 );\n\tthis.center = new Vector2( 0, 0 );\n\tthis.rotation = 0;\n\n\tthis.matrixAutoUpdate = true;\n\tthis.matrix = new Matrix3();\n\n\tthis.generateMipmaps = true;\n\tthis.premultiplyAlpha = false;\n\tthis.flipY = true;\n\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t//\n\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\tthis.version = 0;\n\tthis.onUpdate = null;\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Texture,\n\n\tisTexture: true,\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tvar output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tvar image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tvar url;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\t// process array of images e.g. CubeTexture\n\n\t\t\t\t\turl = [];\n\n\t\t\t\t\tfor ( var i = 0, l = image.length; i < l; i ++ ) {\n\n\t\t\t\t\t\turl.push( ImageUtils.getDataURL( image[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// process single image\n\n\t\t\t\t\turl = ImageUtils.getDataURL( image );\n\n\t\t\t\t}\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: url\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t},\n\n\ttransformUv: function ( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n} );\n\nObject.defineProperty( Texture.prototype, \"needsUpdate\", {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\n/**\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author philogb / http://blog.thejit.org/\n * @author mikael emtinger / http://gomo.se/\n * @author egraether / http://egraether.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Vector4( x, y, z, w ) {\n\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n\tthis.w = ( w !== undefined ) ? w : 1;\n\n}\n\nObject.defineProperties( Vector4.prototype, {\n\n\t\"width\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.z = value;\n\n\t\t}\n\n\t},\n\n\t\"height\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.w;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.w = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Vector4.prototype, {\n\n\tisVector4: true,\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tvar e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function () {\n\n\t\tvar min, max;\n\n\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\tif ( min === undefined ) {\n\n\t\t\t\tmin = new Vector4();\n\t\t\t\tmax = new Vector4();\n\n\t\t\t}\n\n\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\treturn this.clamp( min, max );\n\n\t\t};\n\n\t}(),\n\n\tclampLength: function ( min, max ) {\n\n\t\tvar length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author szimek / https://github.com/szimek/\n * @author alteredq / http://alteredqualia.com/\n * @author Marius Kintel / https://github.com/kintel\n */\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nfunction WebGLRenderTarget( width, height, options ) {\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.scissor = new Vector4( 0, 0, width, height );\n\tthis.scissorTest = false;\n\n\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\toptions = options || {};\n\n\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\tthis.texture.image = {};\n\tthis.texture.image.width = width;\n\tthis.texture.image.height = height;\n\n\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n}\n\nWebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: WebGLRenderTarget,\n\n\tisWebGLRenderTarget: true,\n\n\tsetSize: function ( width, height ) {\n\n\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n * @author Matt DesLauriers / @mattdesl\n */\n\nfunction WebGLMultisampleRenderTarget( width, height, options ) {\n\n\tWebGLRenderTarget.call( this, width, height, options );\n\n\tthis.samples = 4;\n\n}\n\nWebGLMultisampleRenderTarget.prototype = Object.assign( Object.create( WebGLRenderTarget.prototype ), {\n\n\tconstructor: WebGLMultisampleRenderTarget,\n\n\tisWebGLMultisampleRenderTarget: true,\n\n\tcopy: function ( source ) {\n\n\t\tWebGLRenderTarget.prototype.copy.call( this, source );\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author philogb / http://blog.thejit.org/\n * @author jordi_ros / http://plattsoft.com\n * @author D1plo1d / http://github.com/D1plo1d\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author timknip / http://www.floorplanner.com/\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Matrix4() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0, 0,\n\t\t0, 1, 0, 0,\n\t\t0, 0, 1, 0,\n\t\t0, 0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix4.prototype, {\n\n\tisMatrix4: true,\n\n\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t},\n\n\tcopyPosition: function ( m ) {\n\n\t\tvar te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\textractRotation: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function extractRotation( m ) {\n\n\t\t\t// this method does not support reflection matrices\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\t\tte[ 3 ] = 0;\n\n\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\t\tte[ 7 ] = 0;\n\n\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmakeRotationFromEuler: function ( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tvar te = this.elements;\n\n\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationFromQuaternion: function () {\n\n\t\tvar zero = new Vector3( 0, 0, 0 );\n\t\tvar one = new Vector3( 1, 1, 1 );\n\n\t\treturn function makeRotationFromQuaternion( q ) {\n\n\t\t\treturn this.compose( zero, q, one );\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar x = new Vector3();\n\t\tvar y = new Vector3();\n\t\tvar z = new Vector3();\n\n\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tz.subVectors( eye, target );\n\n\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t// eye and target are in the same position\n\n\t\t\t\tz.z = 1;\n\n\t\t\t}\n\n\t\t\tz.normalize();\n\t\t\tx.crossVectors( up, z );\n\n\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t// up and z are parallel\n\n\t\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t\tz.x += 0.0001;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz.z += 0.0001;\n\n\t\t\t\t}\n\n\t\t\t\tz.normalize();\n\t\t\t\tx.crossVectors( up, z );\n\n\t\t\t}\n\n\t\t\tx.normalize();\n\t\t\ty.crossVectors( z, x );\n\n\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmultiply: function ( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tvar ae = a.elements;\n\t\tvar be = b.elements;\n\t\tvar te = this.elements;\n\n\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tvar te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tapplyToBufferAttribute: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t}\n\n\t\t\treturn attribute;\n\n\t\t};\n\n\t}(),\n\n\tdeterminant: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t},\n\n\ttranspose: function () {\n\n\t\tvar te = this.elements;\n\t\tvar tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tsetPosition: function ( x, y, z ) {\n\n\t\tvar te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tvar te = this.elements,\n\t\t\tme = m.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) {\n\n\t\t\tvar msg = \"THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\tthrow new Error( msg );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( msg );\n\n\t\t\t}\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tvar detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( v ) {\n\n\t\tvar te = this.elements;\n\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t},\n\n\tgetMaxScaleOnAxis: function () {\n\n\t\tvar te = this.elements;\n\n\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t},\n\n\tmakeTranslation: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationX: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationY: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationZ: function ( theta ) {\n\n\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tvar c = Math.cos( angle );\n\t\tvar s = Math.sin( angle );\n\t\tvar t = 1 - c;\n\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\tvar tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\t return this;\n\n\t},\n\n\tmakeScale: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeShear: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, y, z, 0,\n\t\t\tx, 1, z, 0,\n\t\t\tx, y, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tcompose: function ( position, quaternion, scale ) {\n\n\t\tvar te = this.elements;\n\n\t\tvar x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tvar x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tvar sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tdecompose: function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t// if determine is negative, we need to invert one scale\n\t\t\tvar det = this.determinant();\n\t\t\tif ( det < 0 ) sx = - sx;\n\n\t\t\tposition.x = te[ 12 ];\n\t\t\tposition.y = te[ 13 ];\n\t\t\tposition.z = te[ 14 ];\n\n\t\t\t// scale the rotation part\n\t\t\tmatrix.copy( this );\n\n\t\t\tvar invSX = 1 / sx;\n\t\t\tvar invSY = 1 / sy;\n\t\t\tvar invSZ = 1 / sz;\n\n\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\tscale.x = sx;\n\t\t\tscale.y = sy;\n\t\t\tscale.z = sz;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tvar te = this.elements;\n\t\tvar x = 2 * near / ( right - left );\n\t\tvar y = 2 * near / ( top - bottom );\n\n\t\tvar a = ( right + left ) / ( right - left );\n\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\tvar c = - ( far + near ) / ( far - near );\n\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t},\n\n\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\tvar te = this.elements;\n\t\tvar w = 1.0 / ( right - left );\n\t\tvar h = 1.0 / ( top - bottom );\n\t\tvar p = 1.0 / ( far - near );\n\n\t\tvar x = ( right + left ) * w;\n\t\tvar y = ( top + bottom ) * h;\n\t\tvar z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tvar te = this.elements;\n\t\tvar me = matrix.elements;\n\n\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tvar te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author bhouston / http://clara.io\n */\n\nfunction Euler( x, y, z, order ) {\n\n\tthis._x = x || 0;\n\tthis._y = y || 0;\n\tthis._z = z || 0;\n\tthis._order = order || Euler.DefaultOrder;\n\n}\n\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nEuler.DefaultOrder = 'XYZ';\n\nObject.defineProperties( Euler.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\torder: {\n\n\t\tget: function () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Euler.prototype, {\n\n\tisEuler: true,\n\n\tset: function ( x, y, z, order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order || this._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t},\n\n\tcopy: function ( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\tvar clamp = _Math.clamp;\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tvar te = m.elements;\n\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\torder = order || this._order;\n\n\t\tif ( order === 'XYZ' ) {\n\n\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\tthis._z = 0;\n\n\t\t\t}\n\n\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\tthis._z = 0;\n\n\t\t\t}\n\n\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'YZX' ) {\n\n\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t}\n\n\t\t} else if ( order === 'XZY' ) {\n\n\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\tthis._y = 0;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromQuaternion: function () {\n\n\t\tvar matrix = new Matrix4();\n\n\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t};\n\n\t}(),\n\n\tsetFromVector3: function ( v, order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t},\n\n\treorder: function () {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\tvar q = new Quaternion();\n\n\t\treturn function reorder( newOrder ) {\n\n\t\t\tq.setFromEuler( this );\n\n\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t};\n\n\t}(),\n\n\tequals: function ( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t},\n\n\tfromArray: function ( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t},\n\n\ttoVector3: function ( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t},\n\n\t_onChange: function ( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\t_onChangeCallback: function () {}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Layers() {\n\n\tthis.mask = 1 | 0;\n\n}\n\nObject.assign( Layers.prototype, {\n\n\tset: function ( channel ) {\n\n\t\tthis.mask = 1 << channel | 0;\n\n\t},\n\n\tenable: function ( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t},\n\n\ttoggle: function ( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t},\n\n\tdisable: function ( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t},\n\n\ttest: function ( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author elephantatwork / www.elephantatwork.ch\n */\n\nvar object3DId = 0;\n\nfunction Object3D() {\n\n\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Object3D';\n\n\tthis.parent = null;\n\tthis.children = [];\n\n\tthis.up = Object3D.DefaultUp.clone();\n\n\tvar position = new Vector3();\n\tvar rotation = new Euler();\n\tvar quaternion = new Quaternion();\n\tvar scale = new Vector3( 1, 1, 1 );\n\n\tfunction onRotationChange() {\n\n\t\tquaternion.setFromEuler( rotation, false );\n\n\t}\n\n\tfunction onQuaternionChange() {\n\n\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t}\n\n\trotation._onChange( onRotationChange );\n\tquaternion._onChange( onQuaternionChange );\n\n\tObject.defineProperties( this, {\n\t\tposition: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: position\n\t\t},\n\t\trotation: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: rotation\n\t\t},\n\t\tquaternion: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: quaternion\n\t\t},\n\t\tscale: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: scale\n\t\t},\n\t\tmodelViewMatrix: {\n\t\t\tvalue: new Matrix4()\n\t\t},\n\t\tnormalMatrix: {\n\t\t\tvalue: new Matrix3()\n\t\t}\n\t} );\n\n\tthis.matrix = new Matrix4();\n\tthis.matrixWorld = new Matrix4();\n\n\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\tthis.matrixWorldNeedsUpdate = false;\n\n\tthis.layers = new Layers();\n\tthis.visible = true;\n\n\tthis.castShadow = false;\n\tthis.receiveShadow = false;\n\n\tthis.frustumCulled = true;\n\tthis.renderOrder = 0;\n\n\tthis.userData = {};\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Object3D,\n\n\tisObject3D: true,\n\n\tonBeforeRender: function () {},\n\tonAfterRender: function () {},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t},\n\n\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t},\n\n\tsetRotationFromEuler: function ( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t},\n\n\tsetRotationFromMatrix: function ( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t},\n\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t},\n\n\trotateOnAxis: function () {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\tvar q1 = new Quaternion();\n\n\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateOnWorldAxis: function () {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\tvar q1 = new Quaternion();\n\n\t\treturn function rotateOnWorldAxis( axis, angle ) {\n\n\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\tthis.quaternion.premultiply( q1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateX: function () {\n\n\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t};\n\n\t}(),\n\n\ttranslateOnAxis: function () {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslateX: function () {\n\n\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\treturn function translateX( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\ttranslateY: function () {\n\n\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\treturn function translateY( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\ttranslateZ: function () {\n\n\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\treturn function translateZ( distance ) {\n\n\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t};\n\n\t}(),\n\n\tlocalToWorld: function ( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t},\n\n\tworldToLocal: function () {\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function worldToLocal( vector ) {\n\n\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tvar q1 = new Quaternion();\n\t\tvar m1 = new Matrix4();\n\t\tvar target = new Vector3();\n\t\tvar position = new Vector3();\n\n\t\treturn function lookAt( x, y, z ) {\n\n\t\t\tif ( x.isVector3 ) {\n\n\t\t\t\ttarget.copy( x );\n\n\t\t\t} else {\n\n\t\t\t\ttarget.set( x, y, z );\n\n\t\t\t}\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tthis.updateWorldMatrix( true, false );\n\n\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t\tm1.lookAt( position, target, this.up );\n\n\t\t\t} else {\n\n\t\t\t\tm1.lookAt( target, position, this.up );\n\n\t\t\t}\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\tif ( parent ) {\n\n\t\t\t\tm1.extractRotation( parent.matrixWorld );\n\t\t\t\tq1.setFromRotationMatrix( m1 );\n\t\t\t\tthis.quaternion.premultiply( q1.inverse() );\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\tadd: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t} else {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tremove: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tattach: function () {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\tvar m = new Matrix4();\n\n\t\treturn function attach( object ) {\n\n\t\t\tthis.updateWorldMatrix( true, false );\n\n\t\t\tm.getInverse( this.matrixWorld );\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t\tm.multiply( object.parent.matrixWorld );\n\n\t\t\t}\n\n\t\t\tobject.applyMatrix( m );\n\n\t\t\tobject.updateWorldMatrix( false, false );\n\n\t\t\tthis.add( object );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tgetObjectById: function ( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t},\n\n\tgetObjectByName: function ( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t},\n\n\tgetObjectByProperty: function ( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tvar child = this.children[ i ];\n\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t},\n\n\tgetWorldPosition: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldPosition() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t},\n\n\tgetWorldQuaternion: function () {\n\n\t\tvar position = new Vector3();\n\t\tvar scale = new Vector3();\n\n\t\treturn function getWorldQuaternion( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );\n\t\t\t\ttarget = new Quaternion();\n\n\t\t\t}\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.matrixWorld.decompose( position, target, scale );\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tgetWorldScale: function () {\n\n\t\tvar position = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\n\t\treturn function getWorldScale( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .getWorldScale() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.matrixWorld.decompose( position, quaternion, target );\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tgetWorldDirection: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldDirection() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\tvar e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t},\n\n\traycast: function () {},\n\n\ttraverse: function ( callback ) {\n\n\t\tcallback( this );\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseVisible: function ( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseAncestors: function ( callback ) {\n\n\t\tvar parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t},\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tvar children = this.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t},\n\n\tupdateWorldMatrix: function ( updateParents, updateChildren ) {\n\n\t\tvar parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tvar isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tvar output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tvar object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isMesh && this.drawMode !== TrianglesDrawMode ) object.drawMode = this.drawMode;\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tvar parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tvar shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tvar shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tvar uuids = [];\n\n\t\t\t\tfor ( var i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\tvar images = extractFromCache( meta.images );\n\t\t\tvar shapes = extractFromCache( meta.shapes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tvar values = [];\n\t\t\tfor ( var key in cache ) {\n\n\t\t\t\tvar data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\t\t\treturn values;\n\n\t\t}\n\n\t},\n\n\tclone: function ( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t},\n\n\tcopy: function ( source, recursive ) {\n\n\t\tif ( recursive === undefined ) recursive = true;\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tvar child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Scene() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Scene';\n\n\tthis.background = null;\n\tthis.fog = null;\n\tthis.overrideMaterial = null;\n\n\tthis.autoUpdate = true; // checked by the renderer\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef\n\n\t}\n\n}\n\nScene.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Scene,\n\n\tisScene: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Box3( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n}\n\nObject.assign( Box3.prototype, {\n\n\tisBox3: true,\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromArray: function ( array ) {\n\n\t\tvar minX = + Infinity;\n\t\tvar minY = + Infinity;\n\t\tvar minZ = + Infinity;\n\n\t\tvar maxX = - Infinity;\n\t\tvar maxY = - Infinity;\n\t\tvar maxZ = - Infinity;\n\n\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tvar x = array[ i ];\n\t\t\tvar y = array[ i + 1 ];\n\t\t\tvar z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\tvar minX = + Infinity;\n\t\tvar minY = + Infinity;\n\t\tvar minZ = + Infinity;\n\n\t\tvar maxX = - Infinity;\n\t\tvar maxY = - Infinity;\n\t\tvar maxZ = - Infinity;\n\n\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tvar x = attribute.getX( i );\n\t\t\tvar y = attribute.getY( i );\n\t\t\tvar z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetFromObject: function ( object ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getSize() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\texpandByObject: function () {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tvar scope, i, l;\n\n\t\tvar v1 = new Vector3();\n\n\t\tfunction traverse( node ) {\n\n\t\t\tvar geometry = node.geometry;\n\n\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function expandByObject( object ) {\n\n\t\t\tscope = this;\n\n\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\tobject.traverse( traverse );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getParameter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t},\n\n\tintersectsSphere: ( function () {\n\n\t\tvar closestPoint = new Vector3();\n\n\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t};\n\n\t} )(),\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tvar min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t},\n\n\tintersectsTriangle: ( function () {\n\n\t\t// triangle centered vertices\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\t// triangle edge vectors\n\t\tvar f0 = new Vector3();\n\t\tvar f1 = new Vector3();\n\t\tvar f2 = new Vector3();\n\n\t\tvar testAxis = new Vector3();\n\n\t\tvar center = new Vector3();\n\t\tvar extents = new Vector3();\n\n\t\tvar triangleNormal = new Vector3();\n\n\t\tfunction satForAxes( axes ) {\n\n\t\t\tvar i, j;\n\n\t\t\tfor ( i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t\t\ttestAxis.fromArray( axes, i );\n\t\t\t\t// project the aabb onto the seperating axis\n\t\t\t\tvar r = extents.x * Math.abs( testAxis.x ) + extents.y * Math.abs( testAxis.y ) + extents.z * Math.abs( testAxis.z );\n\t\t\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\t\t\tvar p0 = v0.dot( testAxis );\n\t\t\t\tvar p1 = v1.dot( testAxis );\n\t\t\t\tvar p2 = v2.dot( testAxis );\n\t\t\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\t\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t\t\t// the axis is seperating and we can exit\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn function intersectsTriangle( triangle ) {\n\n\t\t\tif ( this.isEmpty() ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// compute box center and extents\n\t\t\tthis.getCenter( center );\n\t\t\textents.subVectors( this.max, center );\n\n\t\t\t// translate triangle to aabb origin\n\t\t\tv0.subVectors( triangle.a, center );\n\t\t\tv1.subVectors( triangle.b, center );\n\t\t\tv2.subVectors( triangle.c, center );\n\n\t\t\t// compute edge vectors for triangle\n\t\t\tf0.subVectors( v1, v0 );\n\t\t\tf1.subVectors( v2, v1 );\n\t\t\tf2.subVectors( v0, v2 );\n\n\t\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\t\tvar axes = [\n\t\t\t\t0, - f0.z, f0.y, 0, - f1.z, f1.y, 0, - f2.z, f2.y,\n\t\t\t\tf0.z, 0, - f0.x, f1.z, 0, - f1.x, f2.z, 0, - f2.x,\n\t\t\t\t- f0.y, f0.x, 0, - f1.y, f1.x, 0, - f2.y, f2.x, 0\n\t\t\t];\n\t\t\tif ( ! satForAxes( axes ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// test 3 face normals from the aabb\n\t\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\t\tif ( ! satForAxes( axes ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\t// finally testing the face normal of the triangle\n\t\t\t// use already existing triangle edge vectors here\n\t\t\ttriangleNormal.crossVectors( f0, f1 );\n\t\t\taxes = [ triangleNormal.x, triangleNormal.y, triangleNormal.z ];\n\t\t\treturn satForAxes( axes );\n\n\t\t};\n\n\t} )(),\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function distanceToPoint( point ) {\n\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t};\n\n\t}(),\n\n\tgetBoundingSphere: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function getBoundingSphere( target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.Box3: .getBoundingSphere() target is now required' );\n\t\t\t\t//target = new Sphere(); // removed to avoid cyclic dependency\n\n\t\t\t}\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function () {\n\n\t\tvar points = [\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3(),\n\t\t\tnew Vector3()\n\t\t];\n\n\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t// transform of empty box is an empty box.\n\t\t\tif ( this.isEmpty() ) return this;\n\n\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Sphere( center, radius ) {\n\n\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n}\n\nObject.assign( Sphere.prototype, {\n\n\tset: function ( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\tvar center = this.center;\n\n\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t} else {\n\n\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t}\n\n\t\t\tvar maxRadiusSq = 0;\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t}\n\n\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t},\n\n\tempty: function () {\n\n\t\treturn ( this.radius <= 0 );\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t},\n\n\tgetBoundingBox: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .getBoundingBox() target is now required' );\n\t\t\ttarget = new Box3();\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Ray( origin, direction ) {\n\n\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n}\n\nObject.assign( Ray.prototype, {\n\n\tset: function ( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t},\n\n\tlookAt: function ( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\trecast: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function recast( t ) {\n\n\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclosestPointToPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tvar directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t},\n\n\tdistanceSqToPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t// point behind the ray\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t}\n\n\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\treturn v1.distanceToSquared( point );\n\n\t\t};\n\n\t}(),\n\n\tdistanceSqToSegment: function () {\n\n\t\tvar segCenter = new Vector3();\n\t\tvar segDir = new Vector3();\n\t\tvar diff = new Vector3();\n\n\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t// defined by v0 and v1\n\t\t\t// It can also set two optional targets :\n\t\t\t// - The closest point on the ray\n\t\t\t// - The closest point on the segment\n\n\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\tvar c = diff.lengthSq();\n\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\tif ( det > 0 ) {\n\n\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\textDet = segExtent * det;\n\n\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t}\n\n\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t}\n\n\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t}\n\n\t\t\treturn sqrDist;\n\n\t\t};\n\n\t}(),\n\n\tintersectSphere: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function intersectSphere( sphere, target ) {\n\n\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\tvar tca = v1.dot( this.direction );\n\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\tvar t0 = tca - thc;\n\n\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\tvar t1 = tca + thc;\n\n\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t// test to see if t0 is behind the ray:\n\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\treturn this.at( t0, target );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t},\n\n\tdistanceToPlane: function ( plane ) {\n\n\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t},\n\n\tintersectPlane: function ( plane, target ) {\n\n\t\tvar t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t},\n\n\tintersectBox: function ( box, target ) {\n\n\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tvar invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tvar origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t},\n\n\tintersectsBox: ( function () {\n\n\t\tvar v = new Vector3();\n\n\t\treturn function intersectsBox( box ) {\n\n\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t};\n\n\t} )(),\n\n\tintersectTriangle: function () {\n\n\t\t// Compute the offset origin, edges, and normal.\n\t\tvar diff = new Vector3();\n\t\tvar edge1 = new Vector3();\n\t\tvar edge2 = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\treturn function intersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\tedge1.subVectors( b, a );\n\t\t\tedge2.subVectors( c, a );\n\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\tvar sign;\n\n\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\tsign = 1;\n\n\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\tsign = - 1;\n\t\t\t\tDdN = - DdN;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tdiff.subVectors( this.origin, a );\n\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t// b1 < 0, no intersection\n\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t// b2 < 0, no intersection\n\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// b1+b2 > 1, no intersection\n\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// Line intersects triangle, check if ray does.\n\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t// t < 0, no intersection\n\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\t// Ray intersects triangle.\n\t\t\treturn this.at( QdN / DdN, target );\n\n\t\t};\n\n\t}(),\n\n\tapplyMatrix4: function ( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Triangle( a, b, c ) {\n\n\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n}\n\nObject.assign( Triangle, {\n\n\tgetNormal: function () {\n\n\t\tvar v0 = new Vector3();\n\n\t\treturn function getNormal( a, b, c, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .getNormal() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\ttarget.subVectors( c, b );\n\t\t\tv0.subVectors( a, b );\n\t\t\ttarget.cross( v0 );\n\n\t\t\tvar targetLengthSq = target.lengthSq();\n\t\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t\t}\n\n\t\t\treturn target.set( 0, 0, 0 );\n\n\t\t};\n\n\t}(),\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tgetBarycoord: function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function getBarycoord( point, a, b, c, target ) {\n\n\t\t\tv0.subVectors( c, a );\n\t\t\tv1.subVectors( b, a );\n\t\t\tv2.subVectors( point, a );\n\n\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .getBarycoord() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\t// collinear or singular triangle\n\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t\t}\n\n\t\t\tvar invDenom = 1 / denom;\n\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t// barycentric coordinates must always sum to 1\n\t\t\treturn target.set( 1 - u - v, v, u );\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\tTriangle.getBarycoord( point, a, b, c, v1 );\n\n\t\t\treturn ( v1.x >= 0 ) && ( v1.y >= 0 ) && ( ( v1.x + v1.y ) <= 1 );\n\n\t\t};\n\n\t}(),\n\n\tgetUV: function () {\n\n\t\tvar barycoord = new Vector3();\n\n\t\treturn function getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\t\tthis.getBarycoord( point, p1, p2, p3, barycoord );\n\n\t\t\ttarget.set( 0, 0 );\n\t\t\ttarget.addScaledVector( uv1, barycoord.x );\n\t\t\ttarget.addScaledVector( uv2, barycoord.y );\n\t\t\ttarget.addScaledVector( uv3, barycoord.z );\n\n\t\t\treturn target;\n\n\t\t};\n\n\t}(),\n\n\tisFrontFacing: function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\n\t\treturn function isFrontFacing( a, b, c, direction ) {\n\n\t\t\tv0.subVectors( c, b );\n\t\t\tv1.subVectors( a, b );\n\n\t\t\t// strictly front facing\n\t\t\treturn ( v0.cross( v1 ).dot( direction ) < 0 ) ? true : false;\n\n\t\t};\n\n\t}()\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tset: function ( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t},\n\n\tgetArea: function () {\n\n\t\tvar v0 = new Vector3();\n\t\tvar v1 = new Vector3();\n\n\t\treturn function getArea() {\n\n\t\t\tv0.subVectors( this.c, this.b );\n\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t};\n\n\t}(),\n\n\tgetMidpoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getMidpoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t},\n\n\tgetNormal: function ( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t},\n\n\tgetPlane: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getPlane() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t},\n\n\tgetBarycoord: function ( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t},\n\n\tgetUV: function ( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t},\n\n\tisFrontFacing: function ( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t},\n\n\tclosestPointToPoint: function () {\n\n\t\tvar vab = new Vector3();\n\t\tvar vac = new Vector3();\n\t\tvar vbc = new Vector3();\n\t\tvar vap = new Vector3();\n\t\tvar vbp = new Vector3();\n\t\tvar vcp = new Vector3();\n\n\t\treturn function closestPointToPoint( p, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tvar a = this.a, b = this.b, c = this.c;\n\t\t\tvar v, w;\n\n\t\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t\tvab.subVectors( b, a );\n\t\t\tvac.subVectors( c, a );\n\t\t\tvap.subVectors( p, a );\n\t\t\tvar d1 = vab.dot( vap );\n\t\t\tvar d2 = vac.dot( vap );\n\t\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\t\treturn target.copy( a );\n\n\t\t\t}\n\n\t\t\tvbp.subVectors( p, b );\n\t\t\tvar d3 = vab.dot( vbp );\n\t\t\tvar d4 = vac.dot( vbp );\n\t\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\t\treturn target.copy( b );\n\n\t\t\t}\n\n\t\t\tvar vc = d1 * d4 - d3 * d2;\n\t\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\t\treturn target.copy( a ).addScaledVector( vab, v );\n\n\t\t\t}\n\n\t\t\tvcp.subVectors( p, c );\n\t\t\tvar d5 = vab.dot( vcp );\n\t\t\tvar d6 = vac.dot( vcp );\n\t\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\t\treturn target.copy( c );\n\n\t\t\t}\n\n\t\t\tvar vb = d5 * d2 - d1 * d6;\n\t\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\t\treturn target.copy( a ).addScaledVector( vac, w );\n\n\t\t\t}\n\n\t\t\tvar va = d3 * d6 - d5 * d4;\n\t\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t\tvbc.subVectors( c, b );\n\t\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\t\treturn target.copy( b ).addScaledVector( vbc, w ); // edge region of BC\n\n\t\t\t}\n\n\t\t\t// face region\n\t\t\tvar denom = 1 / ( va + vb + vc );\n\t\t\t// u = va * denom\n\t\t\tv = vb * denom;\n\t\t\tw = vc * denom;\n\t\t\treturn target.copy( a ).addScaledVector( vab, v ).addScaledVector( vac, w );\n\n\t\t};\n\n\t}(),\n\n\tequals: function ( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nfunction Color( r, g, b ) {\n\n\tif ( g === undefined && b === undefined ) {\n\n\t\t// r is THREE.Color, hex or string\n\t\treturn this.set( r );\n\n\t}\n\n\treturn this.setRGB( r, g, b );\n\n}\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nObject.assign( Color.prototype, {\n\n\tisColor: true,\n\n\tr: 1, g: 1, b: 1,\n\n\tset: function ( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetHex: function ( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t},\n\n\tsetRGB: function ( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t},\n\n\tsetHSL: function ( h, s, l ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = _Math.euclideanModulo( h, 1 );\n\t\ts = _Math.clamp( s, 0, 1 );\n\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetStyle: function ( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tvar color;\n\t\t\tvar name = m[ 1 ];\n\t\t\tvar components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tvar hex = m[ 1 ];\n\t\t\tvar size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\t// color keywords\n\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t// red\n\t\t\t\tthis.setHex( hex );\n\n\t\t\t} else {\n\n\t\t\t\t// unknown color\n\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t},\n\n\tcopy: function ( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t},\n\n\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\treturn this;\n\n\t},\n\n\tconvertGammaToLinear: function ( gammaFactor ) {\n\n\t\tthis.copyGammaToLinear( this, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tconvertLinearToGamma: function ( gammaFactor ) {\n\n\t\tthis.copyLinearToGamma( this, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tcopySRGBToLinear: function ( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t},\n\n\tcopyLinearToSRGB: function ( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t},\n\n\tconvertSRGBToLinear: function () {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t},\n\n\tconvertLinearToSRGB: function () {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t},\n\n\tgetHex: function () {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t},\n\n\tgetHexString: function () {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t},\n\n\tgetHSL: function ( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Color: .getHSL() target is now required' );\n\t\t\ttarget = { h: 0, s: 0, l: 0 };\n\n\t\t}\n\n\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\tvar max = Math.max( r, g, b );\n\t\tvar min = Math.min( r, g, b );\n\n\t\tvar hue, saturation;\n\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tvar delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t},\n\n\tgetStyle: function () {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t},\n\n\toffsetHSL: function () {\n\n\t\tvar hsl = {};\n\n\t\treturn function ( h, s, l ) {\n\n\t\t\tthis.getHSL( hsl );\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tadd: function ( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t},\n\n\taddColors: function ( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t},\n\n\tlerp: function ( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpHSL: function () {\n\n\t\tvar hslA = { h: 0, s: 0, l: 0 };\n\t\tvar hslB = { h: 0, s: 0, l: 0 };\n\n\t\treturn function lerpHSL( color, alpha ) {\n\n\t\t\tthis.getHSL( hslA );\n\t\t\tcolor.getHSL( hslB );\n\n\t\t\tvar h = _Math.lerp( hslA.h, hslB.h, alpha );\n\t\t\tvar s = _Math.lerp( hslA.s, hslB.s, alpha );\n\t\t\tvar l = _Math.lerp( hslA.l, hslB.l, alpha );\n\n\t\t\tthis.setHSL( h, s, l );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tequals: function ( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn this.getHex();\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\tthis.a = a;\n\tthis.b = b;\n\tthis.c = c;\n\n\tthis.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();\n\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\tthis.color = ( color && color.isColor ) ? color : new Color();\n\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n}\n\nObject.assign( Face3.prototype, {\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.a = source.a;\n\t\tthis.b = source.b;\n\t\tthis.c = source.c;\n\n\t\tthis.normal.copy( source.normal );\n\t\tthis.color.copy( source.color );\n\n\t\tthis.materialIndex = source.materialIndex;\n\n\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t}\n\n\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nvar materialId = 0;\n\nfunction Material() {\n\n\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Material';\n\n\tthis.fog = true;\n\tthis.lights = true;\n\n\tthis.blending = NormalBlending;\n\tthis.side = FrontSide;\n\tthis.flatShading = false;\n\tthis.vertexTangents = false;\n\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\tthis.opacity = 1;\n\tthis.transparent = false;\n\n\tthis.blendSrc = SrcAlphaFactor;\n\tthis.blendDst = OneMinusSrcAlphaFactor;\n\tthis.blendEquation = AddEquation;\n\tthis.blendSrcAlpha = null;\n\tthis.blendDstAlpha = null;\n\tthis.blendEquationAlpha = null;\n\n\tthis.depthFunc = LessEqualDepth;\n\tthis.depthTest = true;\n\tthis.depthWrite = true;\n\n\tthis.clippingPlanes = null;\n\tthis.clipIntersection = false;\n\tthis.clipShadows = false;\n\n\tthis.shadowSide = null;\n\n\tthis.colorWrite = true;\n\n\tthis.precision = null; // override the renderer's default precision for this material\n\n\tthis.polygonOffset = false;\n\tthis.polygonOffsetFactor = 0;\n\tthis.polygonOffsetUnits = 0;\n\n\tthis.dithering = false;\n\n\tthis.alphaTest = 0;\n\tthis.premultipliedAlpha = false;\n\n\tthis.visible = true;\n\n\tthis.userData = {};\n\n\tthis.needsUpdate = true;\n\n}\n\nMaterial.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Material,\n\n\tisMaterial: true,\n\n\tonBeforeCompile: function () {},\n\n\tsetValues: function ( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( var key in values ) {\n\n\t\t\tvar newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\t\t\tdata.refractionRatio = this.refractionRatio;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\t\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\n\t\t}\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.morphTargets === true ) data.morphTargets = true;\n\t\tif ( this.morphNormals === true ) data.morphNormals = true;\n\t\tif ( this.skinning === true ) data.skinning = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tvar values = [];\n\n\t\t\tfor ( var key in cache ) {\n\n\t\t\t\tvar data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.flatShading = source.flatShading;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.clipShadows = source.clipShadows;\n\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\tdstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tvar n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * depthTest: ,\n * depthWrite: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: \n * }\n */\n\nfunction MeshBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshBasicMaterial';\n\n\tthis.color = new Color( 0xffffff ); // emissive\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshBasicMaterial.prototype = Object.create( Material.prototype );\nMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction BufferAttribute( array, itemSize, normalized ) {\n\n\tif ( Array.isArray( array ) ) {\n\n\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t}\n\n\tthis.name = '';\n\n\tthis.array = array;\n\tthis.itemSize = itemSize;\n\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\tthis.normalized = normalized === true;\n\n\tthis.dynamic = false;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( BufferAttribute.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( BufferAttribute.prototype, {\n\n\tisBufferAttribute: true,\n\n\tonUploadCallback: function () {},\n\n\tsetArray: function ( array ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\tthis.array = array;\n\n\t\treturn this;\n\n\t},\n\n\tsetDynamic: function ( value ) {\n\n\t\tthis.dynamic = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.dynamic = source.dynamic;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyArray: function ( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t},\n\n\tcopyColorsArray: function ( colors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tvar color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector2sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector3sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector4sArray: function ( vectors ) {\n\n\t\tvar array = this.array, offset = 0;\n\n\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tvar vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t},\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t}\n\n} );\n\n//\n\nfunction Int8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );\n\n}\n\nInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\nfunction Uint8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );\n\n}\n\nUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\nfunction Uint8ClampedBufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );\n\n}\n\nUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\nfunction Int16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );\n\n}\n\nInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\nfunction Uint16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );\n\n}\n\nUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\nfunction Int32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );\n\n}\n\nInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\nfunction Uint32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );\n\n}\n\nUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\nfunction Float32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );\n\n}\n\nFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\nfunction Float64BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );\n\n}\n\nFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction DirectGeometry() {\n\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.colors = [];\n\tthis.uvs = [];\n\tthis.uvs2 = [];\n\n\tthis.groups = [];\n\n\tthis.morphTargets = {};\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\t// this.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.verticesNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nObject.assign( DirectGeometry.prototype, {\n\n\tcomputeGroups: function ( geometry ) {\n\n\t\tvar group;\n\t\tvar groups = [];\n\t\tvar materialIndex = undefined;\n\n\t\tvar faces = geometry.faces;\n\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\t// materials\n\n\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t}\n\n\t\t\t\tgroup = {\n\t\t\t\t\tstart: i * 3,\n\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( group !== undefined ) {\n\n\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\tgroups.push( group );\n\n\t\t}\n\n\t\tthis.groups = groups;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tvar faces = geometry.faces;\n\t\tvar vertices = geometry.vertices;\n\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t// morphs\n\n\t\tvar morphTargets = geometry.morphTargets;\n\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\tvar morphTargetsPosition;\n\n\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\tmorphTargetsPosition = [];\n\n\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsPosition[ i ] = {\n\t\t\t\t\tname: morphTargets[ i ].name,\n\t\t\t\t \tdata: []\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t}\n\n\t\tvar morphNormals = geometry.morphNormals;\n\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\tvar morphTargetsNormal;\n\n\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\tmorphTargetsNormal = [];\n\n\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsNormal[ i ] = {\n\t\t\t\t\tname: morphNormals[ i ].name,\n\t\t\t\t \tdata: []\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t}\n\n\t\t// skins\n\n\t\tvar skinIndices = geometry.skinIndices;\n\t\tvar skinWeights = geometry.skinWeights;\n\n\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t//\n\n\t\tif ( vertices.length > 0 && faces.length === 0 ) {\n\n\t\t\tconsole.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t}\n\n\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tvar color = face.color;\n\n\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morphs\n\n\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\tmorphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\tmorphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t}\n\n\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeGroups( geometry );\n\n\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tvar max = array[ 0 ];\n\n\tfor ( var i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id\n\nfunction BufferGeometry() {\n\n\tObject.defineProperty( this, 'id', { value: bufferGeometryId += 2 } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'BufferGeometry';\n\n\tthis.index = null;\n\tthis.attributes = {};\n\n\tthis.morphAttributes = {};\n\n\tthis.groups = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\tthis.drawRange = { start: 0, count: Infinity };\n\n\tthis.userData = {};\n\n}\n\nBufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: BufferGeometry,\n\n\tisBufferGeometry: true,\n\n\tgetIndex: function () {\n\n\t\treturn this.index;\n\n\t},\n\n\tsetIndex: function ( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t},\n\n\taddAttribute: function ( name, attribute ) {\n\n\t\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\treturn this.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t}\n\n\t\tif ( name === 'index' ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\tthis.setIndex( attribute );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t},\n\n\tgetAttribute: function ( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t},\n\n\tremoveAttribute: function ( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t},\n\n\taddGroup: function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t} );\n\n\t},\n\n\tclearGroups: function () {\n\n\t\tthis.groups = [];\n\n\t},\n\n\tsetDrawRange: function ( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t},\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tvar position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tvar normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tvar tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t// Tangent is vec4, but the '.w' component is a sign value (+1/-1).\n\t\t\tnormalMatrix.applyToBufferAttribute( tangent );\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function () {\n\n\t\t// rotate geometry around world x-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\tm1.makeRotationX( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\t// rotate geometry around world y-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\tm1.makeRotationY( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\t// rotate geometry around world z-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\tm1.makeRotationZ( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function () {\n\n\t\t// translate geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function translate( x, y, z ) {\n\n\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tscale: function () {\n\n\t\t// scale geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function scale( x, y, z ) {\n\n\t\t\tm1.makeScale( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar obj = new Object3D();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tobj.lookAt( vector );\n\n\t\t\tobj.updateMatrix();\n\n\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t};\n\n\t}(),\n\n\tcenter: function () {\n\n\t\tvar offset = new Vector3();\n\n\t\treturn function center() {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tthis.boundingBox.getCenter( offset ).negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tsetFromObject: function ( object ) {\n\n\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t} else if ( object.isMesh ) {\n\n\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tvar position = [];\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t},\n\n\tupdateFromObject: function ( object ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\tdirect = undefined;\n\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( direct === undefined ) {\n\n\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\tgeometry = direct;\n\n\t\t}\n\n\t\tvar attribute;\n\n\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.position;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.normal;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\tattribute = this.attributes.color;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\tattribute = this.attributes.uv;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t},\n\n\tfromDirectGeometry: function ( geometry ) {\n\n\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t}\n\n\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t}\n\n\t\t// groups\n\n\t\tthis.groups = geometry.groups;\n\n\t\t// morphs\n\n\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\tvar array = [];\n\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 );\n\t\t\t\tattribute.name = morphTarget.name;\n\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget.data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// skinning\n\n\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t}\n\n\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function computeBoundingBox() {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\t\t\tvar morphAttributesPosition = this.morphAttributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t\t// process morph attributes if present\n\n\t\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\t\tfor ( var i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t\tbox.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( box.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( box.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\tcomputeBoundingSphere: function () {\n\n\t\tvar box = new Box3();\n\t\tvar boxMorphTargets = new Box3();\n\t\tvar vector = new Vector3();\n\n\t\treturn function computeBoundingSphere() {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\t\t\tvar morphAttributesPosition = this.morphAttributes.position;\n\n\t\t\tif ( position ) {\n\n\t\t\t\t// first, find the center of the bounding sphere\n\n\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\tbox.setFromBufferAttribute( position );\n\n\t\t\t\t// process morph attributes if present\n\n\t\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\t\tfor ( var i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t\tboxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\t\tbox.expandByPoint( boxMorphTargets.min );\n\t\t\t\t\t\tbox.expandByPoint( boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\tvector.fromBufferAttribute( position, i );\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t}\n\n\t\t\t\t// process morph attributes if present\n\n\t\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\t\tfor ( var i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar morphAttribute = morphAttributesPosition[ i ];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvector.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\tcomputeFaceNormals: function () {\n\n\t\t// backwards compatibility\n\n\t},\n\n\tcomputeVertexNormals: function () {\n\n\t\tvar index = this.index;\n\t\tvar attributes = this.attributes;\n\n\t\tif ( attributes.position ) {\n\n\t\t\tvar positions = attributes.position.array;\n\n\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar normals = attributes.normal.array;\n\n\t\t\tvar vA, vB, vC;\n\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tvar indices = index.array;\n\n\t\t\t\tfor ( var i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t}\n\n\t},\n\n\tmerge: function ( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tvar attribute1 = attributes[ key ];\n\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\tvar attributeOffset = attribute2.itemSize * offset;\n\t\t\tvar length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( var i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tnormalizeNormals: function () {\n\n\t\tvar vector = new Vector3();\n\n\t\treturn function normalizeNormals() {\n\n\t\t\tvar normals = this.attributes.normal;\n\n\t\t\tfor ( var i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t\tvector.x = normals.getX( i );\n\t\t\t\tvector.y = normals.getY( i );\n\t\t\t\tvector.z = normals.getZ( i );\n\n\t\t\t\tvector.normalize();\n\n\t\t\t\tnormals.setXYZ( i, vector.x, vector.y, vector.z );\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoNonIndexed: function () {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tvar array = attribute.array;\n\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tvar index = 0, index2 = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tvar geometry2 = new BufferGeometry();\n\n\t\tvar indices = this.index.array;\n\t\tvar attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( var name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\n\t\t\tvar newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.addAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tvar morphAttributes = this.morphAttributes;\n\n\t\tfor ( name in morphAttributes ) {\n\n\t\t\tvar morphArray = [];\n\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( var i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tvar attribute = morphAttribute[ i ];\n\n\t\t\t\tvar newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\t// groups\n\n\t\tvar groups = this.groups;\n\n\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tdata.data = { attributes: {} };\n\n\t\tvar index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tvar attributes = this.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\n\t\t\tvar attributeData = attribute.toJSON();\n\n\t\t\tif ( attribute.name !== '' ) attributeData.name = attribute.name;\n\n\t\t\tdata.data.attributes[ key ] = attributeData;\n\n\t\t}\n\n\t\tvar morphAttributes = {};\n\t\tvar hasMorphAttributes = false;\n\n\t\tfor ( var key in this.morphAttributes ) {\n\n\t\t\tvar attributeArray = this.morphAttributes[ key ];\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tvar attribute = attributeArray[ i ];\n\n\t\t\t\tvar attributeData = attribute.toJSON();\n\n\t\t\t\tif ( attribute.name !== '' ) attributeData.name = attribute.name;\n\n\t\t\t\tarray.push( attributeData );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) data.data.morphAttributes = morphAttributes;\n\n\t\tvar groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tvar boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t var parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t var values = [];\n\n\t\t for ( var key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new BufferGeometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tvar name, i, l;\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tvar index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tvar attributes = source.attributes;\n\n\t\tfor ( name in attributes ) {\n\n\t\t\tvar attribute = attributes[ name ];\n\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tvar morphAttributes = source.morphAttributes;\n\n\t\tfor ( name in morphAttributes ) {\n\n\t\t\tvar array = [];\n\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// groups\n\n\t\tvar groups = source.groups;\n\n\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tvar group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tvar boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tvar boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author jonobr1 / http://jonobr1.com/\n */\n\nfunction Mesh( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Mesh';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\tthis.drawMode = TrianglesDrawMode;\n\n\tthis.updateMorphTargets();\n\n}\n\nMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Mesh,\n\n\tisMesh: true,\n\n\tsetDrawMode: function ( value ) {\n\n\t\tthis.drawMode = value;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.drawMode = source.drawMode;\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tvar geometry = this.geometry;\n\t\tvar m, ml, name;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\t\t\tvar keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tvar morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tname = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\tvar vA = new Vector3();\n\t\tvar vB = new Vector3();\n\t\tvar vC = new Vector3();\n\n\t\tvar tempA = new Vector3();\n\t\tvar tempB = new Vector3();\n\t\tvar tempC = new Vector3();\n\n\t\tvar morphA = new Vector3();\n\t\tvar morphB = new Vector3();\n\t\tvar morphC = new Vector3();\n\n\t\tvar uvA = new Vector2();\n\t\tvar uvB = new Vector2();\n\t\tvar uvC = new Vector2();\n\n\t\tvar intersectionPoint = new Vector3();\n\t\tvar intersectionPointWorld = new Vector3();\n\n\t\tfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\tvar intersect;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t} else {\n\n\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t}\n\n\t\t\tif ( intersect === null ) return null;\n\n\t\t\tintersectionPointWorld.copy( point );\n\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\treturn {\n\t\t\t\tdistance: distance,\n\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\tobject: object\n\t\t\t};\n\n\t\t}\n\n\t\tfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, uv, a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\tvar morphInfluences = object.morphTargetInfluences;\n\n\t\t\tif ( material.morphTargets && morphPosition && morphInfluences ) {\n\n\t\t\t\tmorphA.set( 0, 0, 0 );\n\t\t\t\tmorphB.set( 0, 0, 0 );\n\t\t\t\tmorphC.set( 0, 0, 0 );\n\n\t\t\t\tfor ( var i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar influence = morphInfluences[ i ];\n\t\t\t\t\tvar morphAttribute = morphPosition[ i ];\n\n\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\ttempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t\t\ttempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t\t\ttempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\t\t\tmorphA.addScaledVector( tempA.sub( vA ), influence );\n\t\t\t\t\tmorphB.addScaledVector( tempB.sub( vB ), influence );\n\t\t\t\t\tmorphC.addScaledVector( tempC.sub( vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t\tvA.add( morphA );\n\t\t\t\tvB.add( morphB );\n\t\t\t\tvC.add( morphC );\n\n\t\t\t}\n\n\t\t\tvar intersection = checkIntersection( object, material, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\tif ( intersection ) {\n\n\t\t\t\tif ( uv ) {\n\n\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\tintersection.uv = Triangle.getUV( intersectionPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t\tvar face = new Face3( a, b, c );\n\t\t\t\tTriangle.getNormal( vA, vB, vC, face.normal );\n\n\t\t\t\tintersection.face = face;\n\n\t\t\t}\n\n\t\t\treturn intersection;\n\n\t\t}\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar material = this.material;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\tif ( material === undefined ) return;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t// Check boundingBox before continuing\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t}\n\n\t\t\tvar intersection;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar a, b, c;\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\tvar morphPosition = geometry.morphAttributes.position;\n\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\tvar groups = geometry.groups;\n\t\t\t\tvar drawRange = geometry.drawRange;\n\t\t\t\tvar i, j, il, jl;\n\t\t\t\tvar group, groupMaterial;\n\t\t\t\tvar start, end;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tgroup = groups[ i ];\n\t\t\t\t\t\t\tgroupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, morphPosition, uv, a, b, c );\n\n\t\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\t\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, morphPosition, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tgroup = groups[ i ];\n\t\t\t\t\t\t\tgroupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\t\ta = j;\n\t\t\t\t\t\t\t\tb = j + 1;\n\t\t\t\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, ray, position, morphPosition, uv, a, b, c );\n\n\t\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\t\t\t\tend = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, ray, position, morphPosition, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\tvar isMultiMaterial = Array.isArray( material );\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar faces = geometry.faces;\n\t\t\t\tvar uvs;\n\n\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\tvar faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;\n\n\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\tintersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tif ( uvs && uvs[ f ] ) {\n\n\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\tintersection.uv = Triangle.getUV( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC, new Vector2() );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author kile / http://kile.stravaganza.org/\n * @author alteredq / http://alteredqualia.com/\n * @author mikael emtinger / http://gomo.se/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author bhouston / http://clara.io\n */\n\nvar geometryId = 0; // Geometry uses even numbers as Id\n\nfunction Geometry() {\n\n\tObject.defineProperty( this, 'id', { value: geometryId += 2 } );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Geometry';\n\n\tthis.vertices = [];\n\tthis.colors = [];\n\tthis.faces = [];\n\tthis.faceVertexUvs = [[]];\n\n\tthis.morphTargets = [];\n\tthis.morphNormals = [];\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\tthis.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.elementsNeedUpdate = false;\n\tthis.verticesNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.lineDistancesNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Geometry,\n\n\tisGeometry: true,\n\n\tapplyMatrix: function ( matrix ) {\n\n\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tvar vertex = this.vertices[ i ];\n\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t}\n\n\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tvar face = this.faces[ i ];\n\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.verticesNeedUpdate = true;\n\t\tthis.normalsNeedUpdate = true;\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function () {\n\n\t\t// rotate geometry around world x-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateX( angle ) {\n\n\t\t\tm1.makeRotationX( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateY: function () {\n\n\t\t// rotate geometry around world y-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateY( angle ) {\n\n\t\t\tm1.makeRotationY( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\trotateZ: function () {\n\n\t\t// rotate geometry around world z-axis\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function rotateZ( angle ) {\n\n\t\t\tm1.makeRotationZ( angle );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function () {\n\n\t\t// translate geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function translate( x, y, z ) {\n\n\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tscale: function () {\n\n\t\t// scale geometry\n\n\t\tvar m1 = new Matrix4();\n\n\t\treturn function scale( x, y, z ) {\n\n\t\t\tm1.makeScale( x, y, z );\n\n\t\t\tthis.applyMatrix( m1 );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tlookAt: function () {\n\n\t\tvar obj = new Object3D();\n\n\t\treturn function lookAt( vector ) {\n\n\t\t\tobj.lookAt( vector );\n\n\t\t\tobj.updateMatrix();\n\n\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t};\n\n\t}(),\n\n\tfromBufferGeometry: function ( geometry ) {\n\n\t\tvar scope = this;\n\n\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\tvar attributes = geometry.attributes;\n\n\t\tvar positions = attributes.position.array;\n\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\tfor ( var i = 0; i < positions.length; i += 3 ) {\n\n\t\t\tscope.vertices.push( new Vector3().fromArray( positions, i ) );\n\n\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\tscope.colors.push( new Color().fromArray( colors, i ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\tvar vertexColors = ( colors === undefined ) ? [] : [\n\t\t\t\tscope.colors[ a ].clone(),\n\t\t\t\tscope.colors[ b ].clone(),\n\t\t\t\tscope.colors[ c ].clone() ];\n\n\t\t\tvar vertexNormals = ( normals === undefined ) ? [] : [\n\t\t\t\tnew Vector3().fromArray( normals, a * 3 ),\n\t\t\t\tnew Vector3().fromArray( normals, b * 3 ),\n\t\t\t\tnew Vector3().fromArray( normals, c * 3 )\n\t\t\t];\n\n\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\tscope.faces.push( face );\n\n\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [\n\t\t\t\t\tnew Vector2().fromArray( uvs, a * 2 ),\n\t\t\t\t\tnew Vector2().fromArray( uvs, b * 2 ),\n\t\t\t\t\tnew Vector2().fromArray( uvs, c * 2 )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 1 ].push( [\n\t\t\t\t\tnew Vector2().fromArray( uvs2, a * 2 ),\n\t\t\t\t\tnew Vector2().fromArray( uvs2, b * 2 ),\n\t\t\t\t\tnew Vector2().fromArray( uvs2, c * 2 )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar groups = geometry.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\tvar start = group.start;\n\t\t\t\tvar count = group.count;\n\n\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\taddFace( j, j + 1, j + 2, group.materialIndex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeFaceNormals();\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcenter: function () {\n\n\t\tvar offset = new Vector3();\n\n\t\treturn function center() {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tthis.boundingBox.getCenter( offset ).negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tnormalize: function () {\n\n\t\tthis.computeBoundingSphere();\n\n\t\tvar center = this.boundingSphere.center;\n\t\tvar radius = this.boundingSphere.radius;\n\n\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\tvar matrix = new Matrix4();\n\t\tmatrix.set(\n\t\t\ts, 0, 0, - s * center.x,\n\t\t\t0, s, 0, - s * center.y,\n\t\t\t0, 0, s, - s * center.z,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\tthis.applyMatrix( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tcomputeFaceNormals: function () {\n\n\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tvar face = this.faces[ f ];\n\n\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\tcb.subVectors( vC, vB );\n\t\t\tab.subVectors( vA, vB );\n\t\t\tcb.cross( ab );\n\n\t\t\tcb.normalize();\n\n\t\t\tface.normal.copy( cb );\n\n\t\t}\n\n\t},\n\n\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\tvar v, vl, f, fl, face, vertices;\n\n\t\tvertices = new Array( this.vertices.length );\n\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ] = new Vector3();\n\n\t\t}\n\n\t\tif ( areaWeighted ) {\n\n\t\t\t// vertex normals weighted by triangle areas\n\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\tvar vA, vB, vC;\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ].normalize();\n\n\t\t}\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeFlatVertexNormals: function () {\n\n\t\tvar f, fl, face;\n\n\t\tthis.computeFaceNormals();\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeMorphNormals: function () {\n\n\t\tvar i, il, f, fl, face;\n\n\t\t// save original normals\n\t\t// - create temp variables on first access\n\t\t// otherwise just copy (for faster repeated calls)\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t} else {\n\n\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t}\n\n\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\tvar tmpGeo = new Geometry();\n\t\ttmpGeo.faces = this.faces;\n\n\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t// create on first access\n\n\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t// set vertices to morph target\n\n\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t// compute morph normals\n\n\t\t\ttmpGeo.computeFaceNormals();\n\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t// store morph normals\n\n\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restore original normals\n\n\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tface = this.faces[ f ];\n\n\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t},\n\n\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\tif ( ! ( geometry && geometry.isGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\tif ( matrix !== undefined ) {\n\n\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t}\n\n\t\t// vertices\n\n\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\tvertices1.push( vertexCopy );\n\n\t\t}\n\n\t\t// colors\n\n\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t}\n\n\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t}\n\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\tfaces1.push( faceCopy );\n\n\t\t}\n\n\t\t// uvs\n\n\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\tif ( uv === undefined ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t}\n\n\t\t\tuvs1.push( uvCopy );\n\n\t\t}\n\n\t},\n\n\tmergeMesh: function ( mesh ) {\n\n\t\tif ( ! ( mesh && mesh.isMesh ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( mesh.matrixAutoUpdate ) mesh.updateMatrix();\n\n\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t},\n\n\t/*\n\t * Checks for duplicate vertices with hashmap.\n\t * Duplicated vertices are removed\n\t * and faces' vertices are updated.\n\t */\n\n\tmergeVertices: function () {\n\n\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\tvar unique = [], changes = [];\n\n\t\tvar v, key;\n\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\tvar i, il, face;\n\t\tvar indices, j, jl;\n\n\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tv = this.vertices[ i ];\n\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// if faces are completely degenerate after merging vertices, we\n\t\t// have to remove them from the geometry.\n\t\tvar faceIndicesToRemove = [];\n\n\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tface = this.faces[ i ];\n\n\t\t\tface.a = changes[ face.a ];\n\t\t\tface.b = changes[ face.b ];\n\t\t\tface.c = changes[ face.c ];\n\n\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t// we have to remove the face as nothing can be saved\n\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Use unique set of vertices\n\n\t\tvar diff = this.vertices.length - unique.length;\n\t\tthis.vertices = unique;\n\t\treturn diff;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.vertices = [];\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tthis.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsortFacesByMaterialIndex: function () {\n\n\t\tvar faces = this.faces;\n\t\tvar length = faces.length;\n\n\t\t// tag faces\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tfaces[ i ]._id = i;\n\n\t\t}\n\n\t\t// sort faces\n\n\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t}\n\n\t\tfaces.sort( materialIndexSort );\n\n\t\t// sort uvs\n\n\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\tvar newUvs1, newUvs2;\n\n\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar id = faces[ i ]._id;\n\n\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t}\n\n\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Geometry',\n\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Geometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tvar parameters = this.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tvar vertices = [];\n\n\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\tvar vertex = this.vertices[ i ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tvar faces = [];\n\t\tvar normals = [];\n\t\tvar normalsHash = {};\n\t\tvar colors = [];\n\t\tvar colorsHash = {};\n\t\tvar uvs = [];\n\t\tvar uvsHash = {};\n\n\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\tvar face = this.faces[ i ];\n\n\t\t\tvar hasMaterial = true;\n\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\tvar faceType = 0;\n\n\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\tfaces.push( faceType );\n\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\tfaces.push( face.materialIndex );\n\n\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t}\n\n\t\tfunction getNormalIndex( normal ) {\n\n\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\treturn normalsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getColorIndex( color ) {\n\n\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\tcolors.push( color.getHex() );\n\n\t\t\treturn colorsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getUvIndex( uv ) {\n\n\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\treturn uvsHash[ hash ];\n\n\t\t}\n\n\t\tdata.data = {};\n\n\t\tdata.data.vertices = vertices;\n\t\tdata.data.normals = normals;\n\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\tdata.data.faces = faces;\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t var parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t var values = [];\n\n\t\t for ( var key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new Geometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tvar i, il, j, jl, k, kl;\n\n\t\t// reset\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\t\tthis.lineDistances = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// vertices\n\n\t\tvar vertices = source.vertices;\n\n\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t}\n\n\t\t// colors\n\n\t\tvar colors = source.colors;\n\n\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tvar faces = source.faces;\n\n\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t}\n\n\t\t// face vertex uvs\n\n\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tvar morphTargets = source.morphTargets;\n\n\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tvar morphTarget = {};\n\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t// vertices\n\n\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// normals\n\n\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t}\n\n\t\t// morph normals\n\n\t\tvar morphNormals = source.morphNormals;\n\n\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\tvar morphNormal = {};\n\n\t\t\t// vertex normals\n\n\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// face normals\n\n\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t}\n\n\t\t// skin weights\n\n\t\tvar skinWeights = source.skinWeights;\n\n\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t}\n\n\t\t// skin indices\n\n\t\tvar skinIndices = source.skinIndices;\n\n\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t}\n\n\t\t// line distances\n\n\t\tvar lineDistances = source.lineDistances;\n\n\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tvar boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tvar boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// BoxGeometry\n\nfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'BoxGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdepth: depth,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tdepthSegments: depthSegments\n\t};\n\n\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\tthis.mergeVertices();\n\n}\n\nBoxGeometry.prototype = Object.create( Geometry.prototype );\nBoxGeometry.prototype.constructor = BoxGeometry;\n\n// BoxBufferGeometry\n\nfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'BoxBufferGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdepth: depth,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tdepthSegments: depthSegments\n\t};\n\n\tvar scope = this;\n\n\twidth = width || 1;\n\theight = height || 1;\n\tdepth = depth || 1;\n\n\t// segments\n\n\twidthSegments = Math.floor( widthSegments ) || 1;\n\theightSegments = Math.floor( heightSegments ) || 1;\n\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar numberOfVertices = 0;\n\tvar groupStart = 0;\n\n\t// build each side of the box geometry\n\n\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\tvar segmentWidth = width / gridX;\n\t\tvar segmentHeight = height / gridY;\n\n\t\tvar widthHalf = width / 2;\n\t\tvar heightHalf = height / 2;\n\t\tvar depthHalf = depth / 2;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar vertexCounter = 0;\n\t\tvar groupCount = 0;\n\n\t\tvar ix, iy;\n\n\t\tvar vector = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t// set values to correct vector component\n\n\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t// set values to correct vector component\n\n\t\t\t\tvector[ u ] = 0;\n\t\t\t\tvector[ v ] = 0;\n\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t// uvs\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t// counters\n\n\t\t\t\tvertexCounter += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\t// 1. you need three indices to draw a single face\n\t\t// 2. a single segment consists of two faces\n\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t// increase counter\n\n\t\t\t\tgroupCount += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t\t// update total number of vertices\n\n\t\tnumberOfVertices += vertexCounter;\n\n\t}\n\n}\n\nBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tvar dst = {};\n\n\tfor ( var u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( var p in src[ u ] ) {\n\n\t\t\tvar property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tvar merged = {};\n\n\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\tvar tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( var p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nvar UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * defines: { \"label\" : \"value\" },\n * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n * fragmentShader: ,\n * vertexShader: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * lights: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction ShaderMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShaderMaterial';\n\n\tthis.defines = {};\n\tthis.uniforms = {};\n\n\tthis.vertexShader = default_vertex;\n\tthis.fragmentShader = default_fragment;\n\n\tthis.linewidth = 1;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false; // set to use scene fog\n\tthis.lights = false; // set to use scene lights\n\tthis.clipping = false; // set to use user-defined clipping planes\n\n\tthis.skinning = false; // set to use skinning attribute streams\n\tthis.morphTargets = false; // set to use morph targets\n\tthis.morphNormals = false; // set to use morph normals\n\n\tthis.extensions = {\n\t\tderivatives: false, // set to use derivatives\n\t\tfragDepth: false, // set to use fragment depth values\n\t\tdrawBuffers: false, // set to use draw buffers\n\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t};\n\n\t// When rendered geometry doesn't include these attributes but the material does,\n\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\tthis.defaultAttributeValues = {\n\t\t'color': [ 1, 1, 1 ],\n\t\t'uv': [ 0, 0 ],\n\t\t'uv2': [ 0, 0 ]\n\t};\n\n\tthis.index0AttributeName = undefined;\n\tthis.uniformsNeedUpdate = false;\n\n\tif ( parameters !== undefined ) {\n\n\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nShaderMaterial.prototype = Object.create( Material.prototype );\nShaderMaterial.prototype.constructor = ShaderMaterial;\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nShaderMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.fragmentShader = source.fragmentShader;\n\tthis.vertexShader = source.vertexShader;\n\n\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\tthis.defines = Object.assign( {}, source.defines );\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.lights = source.lights;\n\tthis.clipping = source.clipping;\n\n\tthis.skinning = source.skinning;\n\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\tthis.extensions = source.extensions;\n\n\treturn this;\n\n};\n\nShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\tdata.uniforms = {};\n\n\tfor ( var name in this.uniforms ) {\n\n\t\tvar uniform = this.uniforms[ name ];\n\t\tvar value = uniform.value;\n\n\t\tif ( value && value.isTexture ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 't',\n\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t};\n\n\t\t} else if ( value && value.isColor ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'c',\n\t\t\t\tvalue: value.getHex()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v2',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v3',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v4',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'm3',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'm4',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\tvalue: value\n\t\t\t};\n\n\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t}\n\n\t}\n\n\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\tdata.vertexShader = this.vertexShader;\n\tdata.fragmentShader = this.fragmentShader;\n\n\tvar extensions = {};\n\n\tfor ( var key in this.extensions ) {\n\n\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t}\n\n\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\treturn data;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n * @author WestLangley / http://github.com/WestLangley\n*/\n\nfunction Camera() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Camera';\n\n\tthis.matrixWorldInverse = new Matrix4();\n\n\tthis.projectionMatrix = new Matrix4();\n\tthis.projectionMatrixInverse = new Matrix4();\n\n}\n\nCamera.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Camera,\n\n\tisCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t},\n\n\tgetWorldDirection: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Camera: .getWorldDirection() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\tvar e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tthis.matrixWorldInverse.getInverse( this.matrixWorld );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author greggman / http://games.greggman.com/\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author tschw\n */\n\nfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'PerspectiveCamera';\n\n\tthis.fov = fov !== undefined ? fov : 50;\n\tthis.zoom = 1;\n\n\tthis.near = near !== undefined ? near : 0.1;\n\tthis.far = far !== undefined ? far : 2000;\n\tthis.focus = 10;\n\n\tthis.aspect = aspect !== undefined ? aspect : 1;\n\tthis.view = null;\n\n\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\tthis.updateProjectionMatrix();\n\n}\n\nPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: PerspectiveCamera,\n\n\tisPerspectiveCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength: function ( focalLength ) {\n\n\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength: function () {\n\n\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t},\n\n\tgetEffectiveFOV: function () {\n\n\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t},\n\n\tgetFilmWidth: function () {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t},\n\n\tgetFilmHeight: function () {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t},\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * var w = 1920;\n\t * var h = 1080;\n\t * var fullWidth = w * 3;\n\t * var fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tvar near = this.near,\n\t\t\ttop = near * Math.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\theight = 2 * top,\n\t\t\twidth = this.aspect * height,\n\t\t\tleft = - 0.5 * width,\n\t\t\tview = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tvar skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.getInverse( this.projectionMatrix );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * Camera for rendering cube maps\n *\t- renders scene into axis-aligned cube\n *\n * @author alteredq / http://alteredqualia.com/\n */\n\nvar fov = 90, aspect = 1;\n\nfunction CubeCamera( near, far, cubeResolution, options ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'CubeCamera';\n\n\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPX.up.set( 0, - 1, 0 );\n\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\tthis.add( cameraPX );\n\n\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNX.up.set( 0, - 1, 0 );\n\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\tthis.add( cameraNX );\n\n\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPY.up.set( 0, 0, 1 );\n\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\tthis.add( cameraPY );\n\n\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNY.up.set( 0, 0, - 1 );\n\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\tthis.add( cameraNY );\n\n\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPZ.up.set( 0, - 1, 0 );\n\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\tthis.add( cameraPZ );\n\n\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNZ.up.set( 0, - 1, 0 );\n\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\tthis.add( cameraNZ );\n\n\toptions = options || { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\tthis.renderTarget.texture.name = \"CubeCamera\";\n\n\tthis.update = function ( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tvar currentRenderTarget = renderer.getRenderTarget();\n\n\t\tvar renderTarget = this.renderTarget;\n\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t};\n\n\tthis.clear = function ( renderer, color, depth, stencil ) {\n\n\t\tvar currentRenderTarget = renderer.getRenderTarget();\n\n\t\tvar renderTarget = this.renderTarget;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( renderTarget, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t};\n\n}\n\nCubeCamera.prototype = Object.create( Object3D.prototype );\nCubeCamera.prototype.constructor = CubeCamera;\n\n/**\n * @author alteredq / http://alteredqualia.com\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction WebGLRenderTargetCube( width, height, options ) {\n\n\tWebGLRenderTarget.call( this, width, height, options );\n\n}\n\nWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\nWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\nWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\nWebGLRenderTargetCube.prototype.fromEquirectangularTexture = function ( renderer, texture ) {\n\n\tthis.texture.type = texture.type;\n\tthis.texture.format = texture.format;\n\tthis.texture.encoding = texture.encoding;\n\n\tvar scene = new Scene();\n\n\tvar shader = {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t\"varying vec3 vWorldDirection;\",\n\n\t\t\t\"vec3 transformDirection( in vec3 dir, in mat4 matrix ) {\",\n\n\t\t\t\"\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\",\n\n\t\t\t\"}\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\"\tvWorldDirection = transformDirection( position, modelMatrix );\",\n\n\t\t\t\"\t#include \",\n\t\t\t\"\t#include \",\n\n\t\t\t\"}\"\n\n\t\t].join( '\\n' ),\n\n\t\tfragmentShader: [\n\n\t\t\t\"uniform sampler2D tEquirect;\",\n\n\t\t\t\"varying vec3 vWorldDirection;\",\n\n\t\t\t\"#define RECIPROCAL_PI 0.31830988618\",\n\t\t\t\"#define RECIPROCAL_PI2 0.15915494\",\n\n\t\t\t\"void main() {\",\n\n\t\t\t\"\tvec3 direction = normalize( vWorldDirection );\",\n\n\t\t\t\"\tvec2 sampleUV;\",\n\n\t\t\t\"\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\",\n\n\t\t\t\"\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\",\n\n\t\t\t\"\tgl_FragColor = texture2D( tEquirect, sampleUV );\",\n\n\t\t\t\"}\"\n\n\t\t].join( '\\n' ),\n\t};\n\n\tvar material = new ShaderMaterial( {\n\n\t\ttype: 'CubemapFromEquirect',\n\n\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader,\n\t\tside: BackSide,\n\t\tblending: NoBlending\n\n\t} );\n\n\tmaterial.uniforms.tEquirect.value = texture;\n\n\tvar mesh = new Mesh( new BoxBufferGeometry( 5, 5, 5 ), material );\n\n\tscene.add( mesh );\n\n\tvar camera = new CubeCamera( 1, 10, 1 );\n\n\tcamera.renderTarget = this;\n\tcamera.renderTarget.texture.name = 'CubeCameraTexture';\n\n\tcamera.update( renderer, scene );\n\n\tmesh.geometry.dispose();\n\tmesh.material.dispose();\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { data: data, width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\tthis.unpackAlignment = 1;\n\n}\n\nDataTexture.prototype = Object.create( Texture.prototype );\nDataTexture.prototype.constructor = DataTexture;\n\nDataTexture.prototype.isDataTexture = true;\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Plane( normal, constant ) {\n\n\t// normal is assumed to be normalized\n\n\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n}\n\nObject.assign( Plane.prototype, {\n\n\tisPlane: true,\n\n\tset: function ( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponents: function ( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCoplanarPoints: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t},\n\n\tnormalize: function () {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t},\n\n\tdistanceToSphere: function ( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t},\n\n\tprojectPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .projectPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t},\n\n\tintersectLine: function () {\n\n\t\tvar v1 = new Vector3();\n\n\t\treturn function intersectLine( line, target ) {\n\n\t\t\tif ( target === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Plane: .intersectLine() target is now required' );\n\t\t\t\ttarget = new Vector3();\n\n\t\t\t}\n\n\t\t\tvar direction = line.delta( v1 );\n\n\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\treturn target.copy( line.start );\n\n\t\t\t\t}\n\n\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t};\n\n\t}(),\n\n\tintersectsLine: function ( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tvar startSign = this.distanceToPoint( line.start );\n\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t},\n\n\tcoplanarPoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .coplanarPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t},\n\n\tapplyMatrix4: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar m1 = new Matrix3();\n\n\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\n\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author bhouston / http://clara.io\n */\n\nfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\tthis.planes = [\n\n\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t];\n\n}\n\nObject.assign( Frustum.prototype, {\n\n\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tvar planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( frustum ) {\n\n\t\tvar planes = this.planes;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrix: function ( m ) {\n\n\t\tvar planes = this.planes;\n\t\tvar me = m.elements;\n\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\tintersectsObject: function () {\n\n\t\tvar sphere = new Sphere();\n\n\t\treturn function intersectsObject( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSprite: function () {\n\n\t\tvar sphere = new Sphere();\n\n\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t};\n\n\t}(),\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tvar planes = this.planes;\n\t\tvar center = sphere.center;\n\t\tvar negRadius = - sphere.radius;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tintersectsBox: function () {\n\n\t\tvar p = new Vector3();\n\n\t\treturn function intersectsBox( box ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t// corner at max distance\n\n\t\t\t\tp.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\tp.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\tp.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\tif ( plane.distanceToPoint( p ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t};\n\n\t}(),\n\n\tcontainsPoint: function ( point ) {\n\n\t\tvar planes = this.planes;\n\n\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n} );\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n#else\\n\\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t}\\n\\treturn 1.0;\\n#endif\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\\n\\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\\n\\treturn Fr * fresnel + F0;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\\n\\treturn specularColor * brdf.x + brdf.y;\\n}\\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\\n\\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\\n\\tvec3 FssEss = F * brdf.x + brdf.y;\\n\\tfloat Ess = brdf.x + brdf.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG ) && ! defined( MATCAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale = bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = normalMatrix * objectNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = normalMatrix * objectTangent;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar encodings_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\\n\\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract( Le );\\n\\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\\n\\treturn vec4( max( vRGB, 0.0 ), 1.0 );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\tuniform int maxMipLevel;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tfogDepth = -mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float fogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\nvIndirectFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n\\tvIndirectBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar lights_pars_begin = \"uniform vec3 ambientLightColor;\\nuniform vec3 lightProbe[ 9 ];\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\\n\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t\\tfloat shadowCameraNear;\\n\\t\\tfloat shadowCameraFar;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef ENVMAP_TYPE_CUBE_UV\\n\\t\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#endif\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\tfloat clearCoatInv = 1.0 - clearCoatDHR;\\n\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec3 singleScattering = vec3( 0.0 );\\n\\t\\tvec3 multiScattering = vec3( 0.0 );\\n\\t\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t\\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\\n\\t\\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\\n\\t\\treflectedLight.indirectSpecular += clearCoatInv * radiance * singleScattering;\\n\\t\\treflectedLight.indirectDiffuse += multiScattering * cosineWeightedIrradiance;\\n\\t\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n\\t#else\\n\\t\\treflectedLight.indirectSpecular += clearCoatInv * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\\n\\t#ifndef STANDARD\\n\\t\\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, irradiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\tgl_Position.z *= gl_Position.w;\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\tvec4 mapTexel = texture2D( map, uv );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\";\n\nvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform mat3 uvTransform;\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n\\t#ifdef USE_TANGENT\\n\\t\\tvec3 tangent = normalize( vTangent );\\n\\t\\tvec3 bitangent = normalize( vBitangent );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t\\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP\\n\\t#ifdef OBJECTSPACE_NORMALMAP\\n\\t\\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\t#ifdef FLIP_SIDED\\n\\t\\t\\tnormal = - normal;\\n\\t\\t#endif\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t#endif\\n\\t\\tnormal = normalize( normalMatrix * normal );\\n\\t#else\\n\\t\\t#ifdef USE_TANGENT\\n\\t\\t\\tmat3 vTBN = mat3( tangent, bitangent, normal );\\n\\t\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\t\\tnormal = normalize( vTBN * mapN );\\n\\t\\t#else\\n\\t\\t\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n\\t\\t#endif\\n\\t#endif\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\t#ifdef OBJECTSPACE_NORMALMAP\\n\\t\\tuniform mat3 normalMatrix;\\n\\t#else\\n\\t\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\t\\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\\n\\t\\t\\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\\n\\t\\t\\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\\n\\t\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\t\\tmapN.xy *= normalScale;\\n\\t\\t\\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t\\treturn normalize( tsn * mapN );\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#if defined( DITHERING )\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#if defined( DITHERING )\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\t#pragma unroll_loop\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform highp sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n\\t#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( ( color * ( 2.51 * color + 0.03 ) ) / ( color * ( 2.43 * color + 0.59 ) + 0.14 ) );\\n}\";\n\nvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n#endif\";\n\nvar background_frag = \"uniform sampler2D t2D;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\tgl_FragColor = mapTexelToLinear( texColor );\\n\\t#include \\n\\t#include \\n}\";\n\nvar background_vert = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = mapTexelToLinear( texColor );\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nvar cube_vert = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\";\n\nvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar distanceRGBA_frag = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nvar distanceRGBA_vert = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nvar equirect_frag = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tvec4 texColor = texture2D( tEquirect, sampleUV );\\n\\tgl_FragColor = mapTexelToLinear( texColor );\\n\\t#include \\n\\t#include \\n}\";\n\nvar equirect_vert = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vIndirectFront;\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshmatcap_frag = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t\\tmatcapColor = matcapTexelToLinear( matcapColor );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshmatcap_vert = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifndef FLAT_SHADED\\n\\t\\tvNormal = normalize( transformedNormal );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\";\n\nvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar shadow_frag = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n}\";\n\nvar shadow_vert = \"#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar sprite_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar sprite_vert = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_frag: background_frag,\n\tbackground_vert: background_vert,\n\tcube_frag: cube_frag,\n\tcube_vert: cube_vert,\n\tdepth_frag: depth_frag,\n\tdepth_vert: depth_vert,\n\tdistanceRGBA_frag: distanceRGBA_frag,\n\tdistanceRGBA_vert: distanceRGBA_vert,\n\tequirect_frag: equirect_frag,\n\tequirect_vert: equirect_vert,\n\tlinedashed_frag: linedashed_frag,\n\tlinedashed_vert: linedashed_vert,\n\tmeshbasic_frag: meshbasic_frag,\n\tmeshbasic_vert: meshbasic_vert,\n\tmeshlambert_frag: meshlambert_frag,\n\tmeshlambert_vert: meshlambert_vert,\n\tmeshmatcap_frag: meshmatcap_frag,\n\tmeshmatcap_vert: meshmatcap_vert,\n\tmeshphong_frag: meshphong_frag,\n\tmeshphong_vert: meshphong_vert,\n\tmeshphysical_frag: meshphysical_frag,\n\tmeshphysical_vert: meshphysical_vert,\n\tnormal_frag: normal_frag,\n\tnormal_vert: normal_vert,\n\tpoints_frag: points_frag,\n\tpoints_vert: points_vert,\n\tshadow_frag: shadow_frag,\n\tshadow_vert: shadow_vert,\n\tsprite_frag: sprite_frag,\n\tsprite_vert: sprite_vert\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nvar UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 },\n\t\trefractionRatio: { value: 0.98 },\n\t\tmaxMipLevel: { value: 0 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {},\n\n\t\t\tshadow: {},\n\t\t\tshadowBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author mikael emtinger / http://gomo.se/\n */\n\nvar ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 0.5 },\n\t\t\t\tmetalness: { value: 0.5 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.normal_vert,\n\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: - 1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearCoat: { value: 0 },\n\t\t\tclearCoatRoughness: { value: 0 }\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLAnimation() {\n\n\tvar context = null;\n\tvar isAnimating = false;\n\tvar animationLoop = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tif ( isAnimating === false ) return;\n\n\t\tanimationLoop( time, frame );\n\n\t\tcontext.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\tcontext.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLAttributes( gl ) {\n\n\tvar buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tvar array = attribute.array;\n\t\tvar usage = attribute.dynamic ? 35048 : 35044;\n\n\t\tvar buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tvar type = 5126;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = 5126;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\ttype = 5123;\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = 5122;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = 5125;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = 5124;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = 5120;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = 5121;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tvar array = attribute.array;\n\t\tvar updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( attribute.dynamic === false ) {\n\n\t\t\tgl.bufferData( bufferType, array, 35044 );\n\n\t\t} else if ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else if ( updateRange.count === 0 ) {\n\n\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t} else {\n\n\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tvar data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tvar data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// PlaneGeometry\n\nfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PlaneGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\tthis.mergeVertices();\n\n}\n\nPlaneGeometry.prototype = Object.create( Geometry.prototype );\nPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n// PlaneBufferGeometry\n\nfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PlaneBufferGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\twidth = width || 1;\n\theight = height || 1;\n\n\tvar width_half = width / 2;\n\tvar height_half = height / 2;\n\n\tvar gridX = Math.floor( widthSegments ) || 1;\n\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\tvar gridX1 = gridX + 1;\n\tvar gridY1 = gridY + 1;\n\n\tvar segment_width = width / gridX;\n\tvar segment_height = height / gridY;\n\n\tvar ix, iy;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tvar y = iy * segment_height - height_half;\n\n\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\tuvs.push( ix / gridX );\n\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tvar a = ix + gridX1 * iy;\n\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLBackground( renderer, state, objects, premultipliedAlpha ) {\n\n\tvar clearColor = new Color( 0x000000 );\n\tvar clearAlpha = 0;\n\n\tvar planeMesh;\n\tvar boxMesh;\n\t// Store the current background texture and its `version`\n\t// so we can recompile the material accordingly.\n\tvar currentBackground = null;\n\tvar currentBackgroundVersion = 0;\n\n\tfunction render( renderList, scene, camera, forceClear ) {\n\n\t\tvar background = scene.background;\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tvar vr = renderer.vr;\n\t\tvar session = vr.getSession && vr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\t\t\tcurrentBackground = null;\n\t\t\tcurrentBackgroundVersion = 0;\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\t\t\tcurrentBackground = null;\n\t\t\tcurrentBackgroundVersion = 0;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.isWebGLRenderTargetCube ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxBufferGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\ttype: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.removeAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.removeAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.tCube.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tvar texture = background.isWebGLRenderTargetCube ? background.texture : background;\n\t\t\tboxMesh.material.uniforms.tCube.value = texture;\n\t\t\tboxMesh.material.uniforms.tFlip.value = ( background.isWebGLRenderTargetCube ) ? 1 : - 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t currentBackgroundVersion !== texture.version ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = texture.version;\n\n\t\t\t}\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\ttype: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.removeAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\t currentBackgroundVersion !== background.version ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\n\t\t\t}\n\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha !== undefined ? alpha : 1;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tvar mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode );\n\n\t}\n\n\tfunction renderInstances( geometry, start, count ) {\n\n\t\tvar extension;\n\n\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\textension = gl;\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ capabilities.isWebGL2 ? 'drawArraysInstanced' : 'drawArraysInstancedANGLE' ]( mode, start, count, geometry.maxInstancedCount );\n\n\t\tinfo.update( count, mode, geometry.maxInstancedCount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tvar maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 &&\n\t\t\t gl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 &&\n\t\t\t gl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tvar isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n\n\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tvar maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tvar maxTextures = gl.getParameter( 34930 );\n\tvar maxVertexTextures = gl.getParameter( 35660 );\n\tvar maxTextureSize = gl.getParameter( 3379 );\n\tvar maxCubemapSize = gl.getParameter( 34076 );\n\n\tvar maxAttributes = gl.getParameter( 34921 );\n\tvar maxVertexUniforms = gl.getParameter( 36347 );\n\tvar maxVaryings = gl.getParameter( 36348 );\n\tvar maxFragmentUniforms = gl.getParameter( 36349 );\n\n\tvar vertexTextures = maxVertexTextures > 0;\n\tvar floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' );\n\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tvar maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\n/**\n * @author tschw\n */\n\nfunction WebGLClipping() {\n\n\tvar scope = this,\n\n\t\tglobalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false,\n\n\t\tplane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tvar enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tcache.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\tdstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLExtensions( gl ) {\n\n\tvar extensions = {};\n\n\treturn {\n\n\t\tget: function ( name ) {\n\n\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\treturn extensions[ name ];\n\n\t\t\t}\n\n\t\t\tvar extension;\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t}\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\textensions[ name ] = extension;\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLGeometries( gl, attributes, info ) {\n\n\tvar geometries = {};\n\tvar wireframeAttributes = {};\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tvar geometry = event.target;\n\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\tattributes.remove( buffergeometry.index );\n\n\t\t}\n\n\t\tfor ( var name in buffergeometry.attributes ) {\n\n\t\t\tattributes.remove( buffergeometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tvar attribute = wireframeAttributes[ buffergeometry.id ];\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\tdelete wireframeAttributes[ buffergeometry.id ];\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\tif ( buffergeometry ) return buffergeometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tbuffergeometry = geometry;\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t}\n\n\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t}\n\n\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tvar index = geometry.index;\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, 34963 );\n\n\t\t}\n\n\t\tfor ( var name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], 34962 );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( var name in morphAttributes ) {\n\n\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tvar attribute = wireframeAttributes[ geometry.id ];\n\n\t\tif ( attribute ) return attribute;\n\n\t\tvar indices = [];\n\n\t\tvar geometryIndex = geometry.index;\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t// console.time( 'wireframe' );\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tvar array = geometryIndex.array;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar array = geometryAttributes.position.array;\n\n\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tvar a = i + 0;\n\t\t\t\tvar b = i + 1;\n\t\t\t\tvar c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// console.timeEnd( 'wireframe' );\n\n\t\tattribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\tattributes.update( attribute, 34963 );\n\n\t\twireframeAttributes[ geometry.id ] = attribute;\n\n\t\treturn attribute;\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tvar mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tvar type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode );\n\n\t}\n\n\tfunction renderInstances( geometry, start, count ) {\n\n\t\tvar extension;\n\n\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\textension = gl;\n\n\t\t} else {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ capabilities.isWebGL2 ? 'drawElementsInstanced' : 'drawElementsInstancedANGLE' ]( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount );\n\n\t\tinfo.update( count, mode, geometry.maxInstancedCount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WebGLInfo( gl ) {\n\n\tvar memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tvar render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\tinstanceCount = instanceCount || 1;\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 4:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase 5:\n\t\t\tcase 6:\n\t\t\t\trender.triangles += instanceCount * ( count - 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction WebGLMorphtargets( gl ) {\n\n\tvar influencesList = {};\n\tvar morphInfluences = new Float32Array( 8 );\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tvar objectInfluences = object.morphTargetInfluences;\n\n\t\tvar length = objectInfluences.length;\n\n\t\tvar influences = influencesList[ geometry.id ];\n\n\t\tif ( influences === undefined ) {\n\n\t\t\t// initialise list\n\n\t\t\tinfluences = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t}\n\n\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t}\n\n\t\tvar morphTargets = material.morphTargets && geometry.morphAttributes.position;\n\t\tvar morphNormals = material.morphNormals && geometry.morphAttributes.normal;\n\n\t\t// Remove current morphAttributes\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tif ( influence[ 1 ] !== 0 ) {\n\n\t\t\t\tif ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\tif ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Collect influences\n\n\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tinfluence[ 0 ] = i;\n\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t}\n\n\t\tinfluences.sort( absNumericalSort );\n\n\t\t// Add morphAttributes\n\n\t\tfor ( var i = 0; i < 8; i ++ ) {\n\n\t\t\tvar influence = influences[ i ];\n\n\t\t\tif ( influence ) {\n\n\t\t\t\tvar index = influence[ 0 ];\n\t\t\t\tvar value = influence[ 1 ];\n\n\t\t\t\tif ( value ) {\n\n\t\t\t\t\tif ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\t\t\t\t\tif ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLObjects( geometries, info ) {\n\n\tvar updateList = {};\n\n\tfunction update( object ) {\n\n\t\tvar frame = info.render.frame;\n\n\t\tvar geometry = object.geometry;\n\t\tvar buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateList[ buffergeometry.id ] !== frame ) {\n\n\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\tbuffergeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateList[ buffergeometry.id ] = frame;\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\timages = images !== undefined ? images : [];\n\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\tformat = format !== undefined ? format : RGBFormat;\n\n\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.flipY = false;\n\n}\n\nCubeTexture.prototype = Object.create( Texture.prototype );\nCubeTexture.prototype.constructor = CubeTexture;\n\nCubeTexture.prototype.isCubeTexture = true;\n\nObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\tget: function () {\n\n\t\treturn this.image;\n\n\t},\n\n\tset: function ( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n} );\n\n/**\n * @author Takahiro https://github.com/takahirox\n */\n\nfunction DataTexture2DArray( data, width, height, depth ) {\n\n\tTexture.call( this, null );\n\n\tthis.image = { data: data, width: width, height: height, depth: depth };\n\n\tthis.magFilter = NearestFilter;\n\tthis.minFilter = NearestFilter;\n\n\tthis.wrapR = ClampToEdgeWrapping;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\n}\n\nDataTexture2DArray.prototype = Object.create( Texture.prototype );\nDataTexture2DArray.prototype.constructor = DataTexture2DArray;\nDataTexture2DArray.prototype.isDataTexture2DArray = true;\n\n/**\n * @author Artur Trzesiok\n */\n\nfunction DataTexture3D( data, width, height, depth ) {\n\n\t// We're going to add .setXXX() methods for setting properties later.\n\t// Users can still set in DataTexture3D directly.\n\t//\n\t//\tvar texture = new THREE.DataTexture3D( data, width, height, depth );\n\t// \ttexture.anisotropy = 16;\n\t//\n\t// See #14839\n\n\tTexture.call( this, null );\n\n\tthis.image = { data: data, width: width, height: height, depth: depth };\n\n\tthis.magFilter = NearestFilter;\n\tthis.minFilter = NearestFilter;\n\n\tthis.wrapR = ClampToEdgeWrapping;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\n}\n\nDataTexture3D.prototype = Object.create( Texture.prototype );\nDataTexture3D.prototype.constructor = DataTexture3D;\nDataTexture3D.prototype.isDataTexture3D = true;\n\n/**\n * @author tschw\n * @author Mugen87 / https://github.com/Mugen87\n * @author mrdoob / http://mrdoob.com/\n *\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nvar emptyTexture = new Texture();\nvar emptyTexture2dArray = new DataTexture2DArray();\nvar emptyTexture3d = new DataTexture3D();\nvar emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nvar arrayCacheF32 = [];\nvar arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nvar mat4array = new Float32Array( 16 );\nvar mat3array = new Float32Array( 9 );\nvar mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tvar firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tvar n = nBlocks * blockSize,\n\t\tr = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( var i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( var i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tvar r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( var i = 0; i !== n; ++ i )\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tvar cache = this.cache;\n\tvar elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tvar cache = this.cache;\n\tvar unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tvar cache = this.cache;\n\tvar unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyTexture2dArray, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tvar cache = this.cache;\n\tvar unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || emptyTexture3d, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tvar cache = this.cache;\n\tvar unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTextureCube( v || emptyCubeTexture, unit );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\nfunction setValueV1i( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\nfunction setValueV2i( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tvar cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES\n\t\tcase 0x8b5f: return setValueT3D1; // SAMPLER_3D\n\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\t\tcase 0x8DC1: return setValueT2DArray1; // SAMPLER_2D_ARRAY\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t}\n\n}\n\n// Array of scalars\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n\n// Array of vectors (flat or from THREE classes)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tvar data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tvar data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tvar data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (flat or from THREE clases)\n\nfunction setValueM2Array( gl, v ) {\n\n\tvar data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tvar data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tvar data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of textures (2D / Cube)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tvar n = v.length;\n\n\tvar units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tvar n = v.length;\n\n\tvar units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x8b5e: return setValueT1Array; // SAMPLER_2D\n\t\tcase 0x8b60: return setValueT6Array; // SAMPLER_CUBE\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nPureArrayUniform.prototype.updateCache = function ( data ) {\n\n\tvar cache = this.cache;\n\n\tif ( data instanceof Float32Array && cache.length !== data.length ) {\n\n\t\tthis.cache = new Float32Array( data.length );\n\n\t}\n\n\tcopyArray( cache, data );\n\n};\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tvar seq = this.seq;\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tvar path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tvar match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\tid = match[ 1 ],\n\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tvar map = container.map, next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tvar n = gl.getProgramParameter( program, 35718 );\n\n\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tvar u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tvar v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tvar r = [];\n\n\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tvar u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLShader( gl, type, string ) {\n\n\tvar shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar programIdCount = 0;\n\nfunction addLineNumbers( string ) {\n\n\tvar lines = string.split( '\\n' );\n\n\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tcase RGBEEncoding:\n\t\t\treturn [ 'RGBE', '( value )' ];\n\t\tcase RGBM7Encoding:\n\t\t\treturn [ 'RGBM', '( value, 7.0 )' ];\n\t\tcase RGBM16Encoding:\n\t\t\treturn [ 'RGBM', '( value, 16.0 )' ];\n\t\tcase RGBDEncoding:\n\t\t\treturn [ 'RGBD', '( value, 256.0 )' ];\n\t\tcase GammaEncoding:\n\t\t\treturn [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];\n\t\tdefault:\n\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tvar status = gl.getShaderParameter( shader, 35713 );\n\tvar log = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && log === '' ) return '';\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\tvar source = gl.getShaderSource( shader );\n\n\treturn 'THREE.WebGLShader: gl.getShaderInfoLog() ' + type + '\\n' + log + addLineNumbers( source );\n\n}\n\nfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\tvar components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tvar components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tvar toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase Uncharted2ToneMapping:\n\t\t\ttoneMappingName = 'Uncharted2';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\textensions = extensions || {};\n\n\tvar chunks = [\n\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || ( parameters.normalMap && ! parameters.objectSpaceNormalMap ) || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tvar chunks = [];\n\n\tfor ( var name in defines ) {\n\n\t\tvar value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tvar attributes = {};\n\n\tvar n = gl.getProgramParameter( program, 35721 );\n\n\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\tvar info = gl.getActiveAttrib( program, i );\n\t\tvar name = info.name;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\nfunction parseIncludes( string ) {\n\n\tvar pattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\n\tfunction replace( match, include ) {\n\n\t\tvar replace = ShaderChunk[ include ];\n\n\t\tif ( replace === undefined ) {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t\treturn parseIncludes( replace );\n\n\t}\n\n\treturn string.replace( pattern, replace );\n\n}\n\nfunction unrollLoops( string ) {\n\n\tvar pattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\tfunction replace( match, start, end, snippet ) {\n\n\t\tvar unroll = '';\n\n\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t}\n\n\t\treturn unroll;\n\n\t}\n\n\treturn string.replace( pattern, replace );\n\n}\n\nfunction WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities ) {\n\n\tvar gl = renderer.context;\n\n\tvar defines = material.defines;\n\n\tvar vertexShader = shader.vertexShader;\n\tvar fragmentShader = shader.fragmentShader;\n\n\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t}\n\n\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t\tcase EquirectangularReflectionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\tbreak;\n\n\t\t\tcase SphericalReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tswitch ( material.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t// console.log( 'building new program ' );\n\n\t//\n\n\tvar customExtensions = capabilities.isWebGL2 ? '' : generateExtensions( material.extensions, parameters, extensions );\n\n\tvar customDefines = generateDefines( defines );\n\n\t//\n\n\tvar program = gl.createProgram();\n\n\tvar prefixVertex, prefixFragment;\n\n\tif ( material.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\tparameters.logarithmicDepthBuffer && ( capabilities.isWebGL2 || extensions.get( 'EXT_frag_depth' ) ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\tparameters.envMap && ( capabilities.isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\n\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.matcapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ?\n\t\t\t\tShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\tparameters.matcapEncoding ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '',\n\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ) : '',\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + material.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = parseIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = parseIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( capabilities.isWebGL2 && ! material.isRawShaderMaterial ) {\n\n\t\tvar isGLSL3ShaderMaterial = false;\n\n\t\tvar versionRegex = /^\\s*#version\\s+300\\s+es\\s*\\n/;\n\n\t\tif ( material.isShaderMaterial &&\n\t\t\tvertexShader.match( versionRegex ) !== null &&\n\t\t\tfragmentShader.match( versionRegex ) !== null ) {\n\n\t\t\tisGLSL3ShaderMaterial = true;\n\n\t\t\tvertexShader = vertexShader.replace( versionRegex, '' );\n\t\t\tfragmentShader = fragmentShader.replace( versionRegex, '' );\n\n\t\t}\n\n\t\t// GLSL 3.0 conversion\n\t\tprefixVertex = [\n\t\t\t'#version 300 es\\n',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#version 300 es\\n',\n\t\t\t'#define varying in',\n\t\t\tisGLSL3ShaderMaterial ? '' : 'out highp vec4 pc_fragColor;',\n\t\t\tisGLSL3ShaderMaterial ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tvar vertexGlsl = prefixVertex + vertexShader;\n\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tvar glVertexShader = WebGLShader( gl, 35633, vertexGlsl );\n\tvar glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( material.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tvar programLog = gl.getProgramInfoLog( program ).trim();\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, 35714 ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tvar vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tvar fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter( program, 35715 ), 'gl.getProgramInfoLog', programLog, vertexErrors, fragmentErrors );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// clean up\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tvar cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tvar cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = shader.name;\n\tthis.id = programIdCount ++;\n\tthis.code = code;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLPrograms( renderer, extensions, capabilities ) {\n\n\tvar programs = [];\n\n\tvar shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'phong',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tvar parameterNames = [\n\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"matcap\", \"matcapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"objectSpaceNormalMap\", \"displacementMap\", \"specularMap\",\n\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"vertexTangents\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\", \"dithering\"\n\t];\n\n\n\tfunction allocateBones( object ) {\n\n\t\tvar skeleton = object.skeleton;\n\t\tvar bones = skeleton.bones;\n\n\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t// - leave some extra space for other uniforms\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t// (up to 54 should be safe)\n\n\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tvar maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\tvar encoding;\n\n\t\tif ( ! map ) {\n\n\t\t\tencoding = LinearEncoding;\n\n\t\t} else if ( map.isTexture ) {\n\n\t\t\tencoding = map.encoding;\n\n\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\tencoding = map.texture.encoding;\n\n\t\t}\n\n\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\tencoding = GammaEncoding;\n\n\t\t}\n\n\t\treturn encoding;\n\n\t}\n\n\tthis.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tvar maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;\n\t\tvar precision = capabilities.precision;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar currentRenderTarget = renderer.getRenderTarget();\n\n\t\tvar parameters = {\n\n\t\t\tshaderID: shaderID,\n\n\t\t\tprecision: precision,\n\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\tmap: !! material.map,\n\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\tmatcap: !! material.matcap,\n\t\t\tmatcapEncoding: getTextureEncodingFromMap( material.matcap, renderer.gammaInput ),\n\t\t\tenvMap: !! material.envMap,\n\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( material.normalMap && material.vertexTangents ),\n\t\t\tvertexColors: material.vertexColors,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\tskinning: material.skinning && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: capabilities.floatVertexTextures,\n\n\t\t\tmorphTargets: material.morphTargets,\n\t\t\tmorphNormals: material.morphNormals,\n\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\talphaTest: material.alphaTest,\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t};\n\n\t\treturn parameters;\n\n\t};\n\n\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\tvar array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( material.fragmentShader );\n\t\t\tarray.push( material.vertexShader );\n\n\t\t}\n\n\t\tif ( material.defines !== undefined ) {\n\n\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t}\n\n\t\tarray.push( material.onBeforeCompile.toString() );\n\n\t\tarray.push( renderer.gammaOutput );\n\n\t\tarray.push( renderer.gammaFactor );\n\n\t\treturn array.join();\n\n\t};\n\n\tthis.acquireProgram = function ( material, shader, parameters, code ) {\n\n\t\tvar program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tvar programInfo = programs[ p ];\n\n\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\tprogram = programInfo;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, extensions, code, material, shader, parameters, capabilities );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t};\n\n\tthis.releaseProgram = function ( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tvar i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t};\n\n\t// Exposed for resource monitoring & error feedback via renderer.info:\n\tthis.programs = programs;\n\n}\n\n/**\n * @author fordacious / fordacious.github.io\n */\n\nfunction WebGLProperties() {\n\n\tvar properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tvar map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.program !== b.program ) {\n\n\t\treturn a.program.id - b.program.id;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tvar renderItems = [];\n\tvar renderItemsIndex = 0;\n\n\tvar opaque = [];\n\tvar transparent = [];\n\n\tvar defaultProgram = { id: - 1 };\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tvar renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tprogram: material.program || defaultProgram,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.program = material.program || defaultProgram;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tvar renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\t( material.transparent === true ? transparent : opaque ).push( renderItem );\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tvar renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\t( material.transparent === true ? transparent : opaque ).unshift( renderItem );\n\n\t}\n\n\tfunction sort() {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( painterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );\n\n\t}\n\n\treturn {\n\t\topaque: opaque,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tvar lists = {};\n\n\tfunction onSceneDispose( event ) {\n\n\t\tvar scene = event.target;\n\n\t\tscene.removeEventListener( 'dispose', onSceneDispose );\n\n\t\tdelete lists[ scene.id ];\n\n\t}\n\n\tfunction get( scene, camera ) {\n\n\t\tvar cameras = lists[ scene.id ];\n\t\tvar list;\n\t\tif ( cameras === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists[ scene.id ] = {};\n\t\t\tlists[ scene.id ][ camera.id ] = list;\n\n\t\t\tscene.addEventListener( 'dispose', onSceneDispose );\n\n\t\t} else {\n\n\t\t\tlist = cameras[ camera.id ];\n\t\t\tif ( list === undefined ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tcameras[ camera.id ] = list;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = {};\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction UniformsCache() {\n\n\tvar lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tvar uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nvar nextVersion = 0;\n\nfunction WebGLLights() {\n\n\tvar cache = new UniformsCache();\n\n\tvar state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\t\t\tshadowsLength: - 1,\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\tpoint: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( var i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tvar vector3 = new Vector3();\n\tvar matrix4 = new Matrix4();\n\tvar matrix42 = new Matrix4();\n\n\tfunction setup( lights, shadows, camera ) {\n\n\t\tvar r = 0, g = 0, b = 0;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tvar directionalLength = 0;\n\t\tvar pointLength = 0;\n\t\tvar spotLength = 0;\n\t\tvar rectAreaLength = 0;\n\t\tvar hemiLength = 0;\n\n\t\tvar viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tvar light = lights[ i ];\n\n\t\t\tvar color = light.color;\n\t\t\tvar intensity = light.intensity;\n\t\t\tvar distance = light.distance;\n\n\t\t\tvar shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( var j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tuniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tuniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t}\n\n\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tvar hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.shadowsLength !== shadows.length ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\t\t\thash.shadowsLength = shadows.length;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tstate: state\n\t};\n\n}\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WebGLRenderState() {\n\n\tvar lights = new WebGLLights();\n\n\tvar lightsArray = [];\n\tvar shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( camera ) {\n\n\t\tlights.setup( lightsArray, shadowsArray, camera );\n\n\t}\n\n\tvar state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates() {\n\n\tvar renderStates = {};\n\n\tfunction onSceneDispose( event ) {\n\n\t\tvar scene = event.target;\n\n\t\tscene.removeEventListener( 'dispose', onSceneDispose );\n\n\t\tdelete renderStates[ scene.id ];\n\n\t}\n\n\tfunction get( scene, camera ) {\n\n\t\tvar renderState;\n\n\t\tif ( renderStates[ scene.id ] === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState();\n\t\t\trenderStates[ scene.id ] = {};\n\t\t\trenderStates[ scene.id ][ camera.id ] = renderState;\n\n\t\t\tscene.addEventListener( 'dispose', onSceneDispose );\n\n\t\t} else {\n\n\t\t\tif ( renderStates[ scene.id ][ camera.id ] === undefined ) {\n\n\t\t\t\trenderState = new WebGLRenderState();\n\t\t\t\trenderStates[ scene.id ][ camera.id ] = renderState;\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates[ scene.id ][ camera.id ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = {};\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author bhouston / https://clara.io\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n *\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n * }\n */\n\nfunction MeshDepthMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDepthMaterial';\n\n\tthis.depthPacking = BasicDepthPacking;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDepthMaterial.prototype = Object.create( Material.prototype );\nMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.depthPacking = source.depthPacking;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n *\n * referencePosition: ,\n * nearDistance: ,\n * farDistance: ,\n *\n * skinning: ,\n * morphTargets: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: \n *\n * }\n */\n\nfunction MeshDistanceMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDistanceMaterial';\n\n\tthis.referencePosition = new Vector3();\n\tthis.nearDistance = 1;\n\tthis.farDistance = 1000;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDistanceMaterial.prototype = Object.create( Material.prototype );\nMeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nMeshDistanceMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.referencePosition.copy( source.referencePosition );\n\tthis.nearDistance = source.nearDistance;\n\tthis.farDistance = source.farDistance;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLShadowMap( _renderer, _objects, maxTextureSize ) {\n\n\tvar _frustum = new Frustum(),\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_shadowMapSize = new Vector2(),\n\t\t_maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ),\n\n\t\t_lookTarget = new Vector3(),\n\t\t_lightPositionWorld = new Vector3(),\n\n\t\t_MorphingFlag = 1,\n\t\t_SkinningFlag = 2,\n\n\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t_materialCache = {};\n\n\tvar shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tvar cubeDirections = [\n\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t];\n\n\tvar cubeUps = [\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t];\n\n\tvar cube2DViewPorts = [\n\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\tnew Vector4(), new Vector4(), new Vector4()\n\t];\n\n\t// init\n\n\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\tvar depthMaterial = new MeshDepthMaterial( {\n\n\t\t\tdepthPacking: RGBADepthPacking,\n\n\t\t\tmorphTargets: useMorphing,\n\t\t\tskinning: useSkinning\n\n\t\t} );\n\n\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t//\n\n\t\tvar distanceMaterial = new MeshDistanceMaterial( {\n\n\t\t\tmorphTargets: useMorphing,\n\t\t\tskinning: useSkinning\n\n\t\t} );\n\n\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t}\n\n\t//\n\n\tvar scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tvar currentRenderTarget = _renderer.getRenderTarget();\n\t\tvar activeCubeFace = _renderer.getActiveCubeFace();\n\t\tvar activeMipMapLevel = _renderer.getActiveMipMapLevel();\n\n\t\tvar _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tvar faceCount;\n\n\t\tfor ( var i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tvar light = lights[ i ];\n\t\t\tvar shadow = light.shadow;\n\t\t\tvar isPointLight = light && light.isPointLight;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t// following orientation:\n\t\t\t\t//\n\t\t\t\t// xzXZ\n\t\t\t\t// y Y\n\t\t\t\t//\n\t\t\t\t// X - Positive x direction\n\t\t\t\t// x - Negative x direction\n\t\t\t\t// Y - Positive y direction\n\t\t\t\t// y - Negative y direction\n\t\t\t\t// Z - Positive z direction\n\t\t\t\t// z - Negative z direction\n\n\t\t\t\t// positive X\n\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// negative X\n\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// positive Z\n\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// negative Z\n\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t// positive Y\n\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t// negative Y\n\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + \".shadowMap\";\n\n\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\tshadow.update( light );\n\n\t\t\t}\n\n\t\t\tvar shadowMap = shadow.map;\n\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tfaceCount = 6;\n\n\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t// equal to inverse of the light's position\n\n\t\t\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t\t} else {\n\n\t\t\t\tfaceCount = 1;\n\n\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t// compute shadow matrix\n\n\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t);\n\n\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t_renderer.clear();\n\n\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t// run a single pass if not\n\n\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t}\n\n\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\trenderObject( scene, camera, shadowCamera, isPointLight );\n\n\t\t\t}\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipMapLevel );\n\n\t};\n\n\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) {\n\n\t\tvar geometry = object.geometry;\n\n\t\tvar result = null;\n\n\t\tvar materialVariants = _depthMaterials;\n\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\tif ( isPointLight ) {\n\n\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t}\n\n\t\tif ( ! customMaterial ) {\n\n\t\t\tvar useMorphing = false;\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isSkinnedMesh && material.skinning === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );\n\n\t\t\t}\n\n\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\tvar variantIndex = 0;\n\n\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t} else {\n\n\t\t\tresult = customMaterial;\n\n\t\t}\n\n\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\tmaterial.clipShadows === true &&\n\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tresult.side = ( material.shadowSide != null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( isPointLight && result.isMeshDistanceMaterial ) {\n\n\t\t\tresult.referencePosition.copy( lightPositionWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, isPointLight ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tvar visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\tvar material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, isPointLight );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLState( gl, extensions, utils, capabilities ) {\n\n\tfunction ColorBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar color = new Vector4();\n\t\tvar currentColorMask = null;\n\t\tvar currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar currentDepthMask = null;\n\t\tvar currentDepthFunc = null;\n\t\tvar currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( 2929 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2929 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 512 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 519 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 513 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 514 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 518 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 516 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 517 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tvar locked = false;\n\n\t\tvar currentStencilMask = null;\n\t\tvar currentStencilFunc = null;\n\t\tvar currentStencilRef = null;\n\t\tvar currentStencilFuncMask = null;\n\t\tvar currentStencilFail = null;\n\t\tvar currentStencilZFail = null;\n\t\tvar currentStencilZPass = null;\n\t\tvar currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\tenable( 2960 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2960 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar colorBuffer = new ColorBuffer();\n\tvar depthBuffer = new DepthBuffer();\n\tvar stencilBuffer = new StencilBuffer();\n\n\tvar maxVertexAttributes = gl.getParameter( 34921 );\n\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\tvar enabledCapabilities = {};\n\n\tvar compressedTextureFormats = null;\n\n\tvar currentProgram = null;\n\n\tvar currentBlendingEnabled = null;\n\tvar currentBlending = null;\n\tvar currentBlendEquation = null;\n\tvar currentBlendSrc = null;\n\tvar currentBlendDst = null;\n\tvar currentBlendEquationAlpha = null;\n\tvar currentBlendSrcAlpha = null;\n\tvar currentBlendDstAlpha = null;\n\tvar currentPremultipledAlpha = false;\n\n\tvar currentFlipSided = null;\n\tvar currentCullFace = null;\n\n\tvar currentLineWidth = null;\n\n\tvar currentPolygonOffsetFactor = null;\n\tvar currentPolygonOffsetUnits = null;\n\n\tvar maxTextures = gl.getParameter( 35661 );\n\n\tvar lineWidthAvailable = false;\n\tvar version = 0;\n\tvar glVersion = gl.getParameter( 7938 );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL\\ ES\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tvar currentTextureSlot = null;\n\tvar currentBoundTextures = {};\n\n\tvar currentScissor = new Vector4();\n\tvar currentViewport = new Vector4();\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tvar texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, 10241, 9728 );\n\t\tgl.texParameteri( type, 10240, 9728 );\n\n\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tvar emptyTextures = {};\n\temptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 );\n\temptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( 2929 );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( 2884 );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction initAttributes() {\n\n\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tvar extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction getCompressedTextureFormats() {\n\n\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\tcompressedTextureFormats = [];\n\n\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_etc1' ) ||\n\t\t\t extensions.get( 'WEBGL_compressed_texture_astc' ) ) {\n\n\t\t\t\tvar formats = gl.getParameter( 34467 );\n\n\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn compressedTextureFormats;\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled ) {\n\n\t\t\t\tdisable( 3042 );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( ! currentBlendingEnabled ) {\n\n\t\t\tenable( 3042 );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( 32774 );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 1, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 0, 769, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 768, 0, 770 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 770, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 770, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 769 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 768 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( 2884 )\n\t\t\t: enable( 2884 );\n\n\t\tvar flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( 2304 );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( 2305 );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( 2884 );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( 1029 );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( 1028 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( 1032 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 2884 );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( 32823 );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 32823 );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( 3089 );\n\n\t\t} else {\n\n\t\t\tdisable( 3089 );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tenabledCapabilities = {};\n\n\t\tcompressedTextureFormats = null;\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlending = null;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\tenable: enable,\n\t\tdisable: disable,\n\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tvar _videoTextures = {};\n\tvar _canvas;\n\n\t//\n\n\tvar useOffscreenCanvas = typeof OffscreenCanvas !== 'undefined';\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) :\n\t\t\tdocument.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tvar scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tvar floor = needsPowerOfTwo ? _Math.floorPowerOfTwo : Math.floor;\n\n\t\t\t\tvar width = floor( scale * image.width );\n\t\t\t\tvar height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tvar canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( capabilities.isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target, texture, width, height ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\ttextureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E;\n\n\t}\n\n\tfunction getInternalFormat( glFormat, glType ) {\n\n\t\tif ( ! capabilities.isWebGL2 ) return glFormat;\n\n\t\tvar internalFormat = glFormat;\n\n\t\tif ( glFormat === 6403 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33326;\n\t\t\tif ( glType === 5131 ) internalFormat = 33325;\n\t\t\tif ( glType === 5121 ) internalFormat = 33321;\n\n\t\t}\n\n\t\tif ( glFormat === 6407 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34837;\n\t\t\tif ( glType === 5131 ) internalFormat = 34843;\n\t\t\tif ( glType === 5121 ) internalFormat = 32849;\n\n\t\t}\n\n\t\tif ( glFormat === 6408 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34836;\n\t\t\tif ( glType === 5131 ) internalFormat = 34842;\n\t\t\tif ( glType === 5121 ) internalFormat = 32856;\n\n\t\t}\n\n\t\tif ( internalFormat === 33325 || internalFormat === 33326 ||\n\t\t\tinternalFormat === 34842 || internalFormat === 34836 ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t} else if ( internalFormat === 34843 || internalFormat === 34837 ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Floating point textures with RGB format not supported. Please use RGBA instead.' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\treturn 9728;\n\n\t\t}\n\n\t\treturn 9729;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tvar texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\tdelete _videoTextures[ texture.id ];\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tvar renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget.texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tvar textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tvar textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tvar image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 35866, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 32879, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tvar textureProperties = properties.get( texture );\n\n\t\tif ( texture.image.length === 6 ) {\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tinitTexture( textureProperties, texture );\n\n\t\t\t\tstate.activeTexture( 33984 + slot );\n\t\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\n\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\tvar cubeImage = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, capabilities.maxCubemapSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tsupportsMips = isPowerOfTwo( image ) || capabilities.isWebGL2,\n\t\t\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\t\tglInternalFormat = getInternalFormat( glFormat, glType );\n\n\t\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\t\tgenerateMipmap( 34067, texture, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t} else {\n\n\t\t\t\tstate.activeTexture( 33984 + slot );\n\t\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, properties.get( texture ).__webglTexture );\n\n\t}\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tvar extension;\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, 10242, utils.convert( texture.wrapS ) );\n\t\t\t_gl.texParameteri( textureType, 10243, utils.convert( texture.wrapT ) );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, utils.convert( texture.wrapR ) );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, utils.convert( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, utils.convert( texture.minFilter ) );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, 10242, 33071 );\n\t\t\t_gl.texParameteri( textureType, 10243, 33071 );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, 33071 );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension ) {\n\n\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\tif ( texture.type === HalfFloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return;\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tvar textureType = 3553;\n\n\t\tif ( texture.isDataTexture2DArray ) textureType = 35866;\n\t\tif ( texture.isDataTexture3D ) textureType = 32879;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\n\t\tvar needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;\n\t\tvar image = resizeImage( texture.image, needsPowerOfTwo, false, capabilities.maxTextureSize );\n\n\t\tvar supportsMips = isPowerOfTwo( image ) || capabilities.isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\tglType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( glFormat, glType );\n\n\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tglInternalFormat = 6402;\n\n\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\tif ( ! capabilities.isWebGL2 ) throw new Error( 'Float Depth Texture only supported in WebGL2.0' );\n\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t} else if ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\tglInternalFormat = 33189;\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\tglInternalFormat = 34041;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\tstate.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t} else if ( texture.isDataTexture2DArray ) {\n\n\t\t\tstate.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t} else if ( texture.isDataTexture3D ) {\n\n\t\t\tstate.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tgenerateMipmap( 3553, texture, image.width, image.height );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\tvar glFormat = utils.convert( renderTarget.texture.format );\n\t\tvar glType = utils.convert( renderTarget.texture.type );\n\t\tvar glInternalFormat = getInternalFormat( glFormat, glType );\n\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\t\t_gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t_gl.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( 36161, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tvar samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 33189, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 33189, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tvar samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer );\n\n\t\t} else {\n\n\t\t\tvar glFormat = utils.convert( renderTarget.texture.format );\n\t\t\tvar glType = utils.convert( renderTarget.texture.type );\n\t\t\tvar glInternalFormat = getInternalFormat( glFormat, glType );\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tvar samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 );\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\tinfo.memory.textures ++;\n\n\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\tvar isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );\n\t\tvar supportsMips = isPowerOfTwo( renderTarget ) || capabilities.isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t\tvar glFormat = utils.convert( renderTarget.texture.format );\n\t\t\t\t\tvar glType = utils.convert( renderTarget.texture.type );\n\t\t\t\t\tvar glInternalFormat = getInternalFormat( glFormat, glType );\n\t\t\t\t\tvar samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, null );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 34067, renderTarget.texture, supportsMips );\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, 36064, 34069 + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 34067, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( 34067, null );\n\n\t\t} else {\n\n\t\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 3553, renderTarget.texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 36064, 3553 );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 3553, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( 3553, null );\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tvar texture = renderTarget.texture;\n\t\tvar supportsMips = isPowerOfTwo( renderTarget ) || capabilities.isWebGL2;\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tvar target = renderTarget.isWebGLRenderTargetCube ? 34067 : 3553;\n\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\tgenerateMipmap( target, texture, renderTarget.width, renderTarget.height );\n\t\t\tstate.bindTexture( target, null );\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.isWebGLMultisampleRenderTarget ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\t_gl.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t_gl.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tvar width = renderTarget.width;\n\t\t\t\tvar height = renderTarget.height;\n\t\t\t\tvar mask = 16384;\n\n\t\t\t\tif ( renderTarget.depthBuffer ) mask |= 256;\n\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= 1024;\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn ( capabilities.isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ?\n\t\t\tMath.min( capabilities.maxSamples, renderTarget.samples ) : 0;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tvar id = texture.id;\n\t\tvar frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures[ id ] !== frame ) {\n\n\t\t\t_videoTextures[ id ] = frame;\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\t// backwards compatibility\n\n\tvar warnedTexture2D = false;\n\tvar warnedTextureCube = false;\n\n\tfunction safeSetTexture2D( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\tif ( warnedTexture2D === false ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\twarnedTexture2D = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\tsetTexture2D( texture, slot );\n\n\t}\n\n\tfunction safeSetTextureCube( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\tif ( warnedTextureCube === false ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\twarnedTextureCube = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t// TODO: unify these code paths\n\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t// this function alone should take care of cube textures\n\t\t\tsetTextureCube( texture, slot );\n\n\t\t} else {\n\n\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\t\t\tsetTextureCubeDynamic( texture, slot );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\n\tthis.safeSetTexture2D = safeSetTexture2D;\n\tthis.safeSetTextureCube = safeSetTextureCube;\n\n}\n\n/**\n * @author thespite / http://www.twitter.com/thespite\n */\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tfunction convert( p ) {\n\n\t\tvar extension;\n\n\t\tif ( p === RepeatWrapping ) return 10497;\n\t\tif ( p === ClampToEdgeWrapping ) return 33071;\n\t\tif ( p === MirroredRepeatWrapping ) return 33648;\n\n\t\tif ( p === NearestFilter ) return 9728;\n\t\tif ( p === NearestMipMapNearestFilter ) return 9984;\n\t\tif ( p === NearestMipMapLinearFilter ) return 9986;\n\n\t\tif ( p === LinearFilter ) return 9729;\n\t\tif ( p === LinearMipMapNearestFilter ) return 9985;\n\t\tif ( p === LinearMipMapLinearFilter ) return 9987;\n\n\t\tif ( p === UnsignedByteType ) return 5121;\n\t\tif ( p === UnsignedShort4444Type ) return 32819;\n\t\tif ( p === UnsignedShort5551Type ) return 32820;\n\t\tif ( p === UnsignedShort565Type ) return 33635;\n\n\t\tif ( p === ByteType ) return 5120;\n\t\tif ( p === ShortType ) return 5122;\n\t\tif ( p === UnsignedShortType ) return 5123;\n\t\tif ( p === IntType ) return 5124;\n\t\tif ( p === UnsignedIntType ) return 5125;\n\t\tif ( p === FloatType ) return 5126;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) return 5131;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return 6406;\n\t\tif ( p === RGBFormat ) return 6407;\n\t\tif ( p === RGBAFormat ) return 6408;\n\t\tif ( p === LuminanceFormat ) return 6409;\n\t\tif ( p === LuminanceAlphaFormat ) return 6410;\n\t\tif ( p === DepthFormat ) return 6402;\n\t\tif ( p === DepthStencilFormat ) return 34041;\n\t\tif ( p === RedFormat ) return 6403;\n\n\t\tif ( p === AddEquation ) return 32774;\n\t\tif ( p === SubtractEquation ) return 32778;\n\t\tif ( p === ReverseSubtractEquation ) return 32779;\n\n\t\tif ( p === ZeroFactor ) return 0;\n\t\tif ( p === OneFactor ) return 1;\n\t\tif ( p === SrcColorFactor ) return 768;\n\t\tif ( p === OneMinusSrcColorFactor ) return 769;\n\t\tif ( p === SrcAlphaFactor ) return 770;\n\t\tif ( p === OneMinusSrcAlphaFactor ) return 771;\n\t\tif ( p === DstAlphaFactor ) return 772;\n\t\tif ( p === OneMinusDstAlphaFactor ) return 773;\n\n\t\tif ( p === DstColorFactor ) return 774;\n\t\tif ( p === OneMinusDstColorFactor ) return 775;\n\t\tif ( p === SrcAlphaSaturateFactor ) return 776;\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t}\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tif ( p === MinEquation ) return 32775;\n\t\t\t\tif ( p === MaxEquation ) return 32776;\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) return 34042;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t}\n\n\t\treturn 0;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Group() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Group';\n\n}\n\nGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Group,\n\n\tisGroup: true\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction ArrayCamera( array ) {\n\n\tPerspectiveCamera.call( this );\n\n\tthis.cameras = array || [];\n\n}\n\nArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {\n\n\tconstructor: ArrayCamera,\n\n\tisArrayCamera: true\n\n} );\n\n/**\n * @author jsantell / https://www.jsantell.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar cameraLPos = new Vector3();\nvar cameraRPos = new Vector3();\n\n/**\n * Assumes 2 cameras that are parallel and share an X-axis, and that\n * the cameras' projection and world matrices have already been set.\n * And that near and far planes are identical for both cameras.\n * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n */\nfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\tvar ipd = cameraLPos.distanceTo( cameraRPos );\n\n\tvar projL = cameraL.projectionMatrix.elements;\n\tvar projR = cameraR.projectionMatrix.elements;\n\n\t// VR systems will have identical far and near planes, and\n\t// most likely identical top and bottom frustum extents.\n\t// Use the left camera for these values.\n\tvar near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\tvar far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\tvar topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\tvar bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\tvar leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\tvar rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\tvar left = near * leftFov;\n\tvar right = near * rightFov;\n\n\t// Calculate the new camera's position offset from the\n\t// left camera. xOffset should be roughly half `ipd`.\n\tvar zOffset = ipd / ( - leftFov + rightFov );\n\tvar xOffset = zOffset * - leftFov;\n\n\t// TODO: Better way to apply this offset?\n\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\tcamera.translateX( xOffset );\n\tcamera.translateZ( zOffset );\n\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t// Find the union of the frustum values of the cameras and scale\n\t// the values so that the near plane's position does not change in world space,\n\t// although must now be relative to the new union camera.\n\tvar near2 = near + zOffset;\n\tvar far2 = far + zOffset;\n\tvar left2 = left - xOffset;\n\tvar right2 = right + ( ipd - xOffset );\n\tvar top2 = topFov * far / far2 * near2;\n\tvar bottom2 = bottomFov * far / far2 * near2;\n\n\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebVRManager( renderer ) {\n\n\tvar renderWidth, renderHeight;\n\tvar scope = this;\n\n\tvar device = null;\n\tvar frameData = null;\n\n\tvar poseTarget = null;\n\n\tvar controllers = [];\n\tvar standingMatrix = new Matrix4();\n\tvar standingMatrixInverse = new Matrix4();\n\n\tvar framebufferScaleFactor = 1.0;\n\n\tvar referenceSpaceType = 'local-floor';\n\n\tif ( typeof window !== 'undefined' && 'VRFrameData' in window ) {\n\n\t\tframeData = new window.VRFrameData();\n\t\twindow.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );\n\n\t}\n\n\tvar matrixWorldInverse = new Matrix4();\n\tvar tempQuaternion = new Quaternion();\n\tvar tempPosition = new Vector3();\n\n\tvar cameraL = new PerspectiveCamera();\n\tcameraL.viewport = new Vector4();\n\tcameraL.layers.enable( 1 );\n\n\tvar cameraR = new PerspectiveCamera();\n\tcameraR.viewport = new Vector4();\n\tcameraR.layers.enable( 2 );\n\n\tvar cameraVR = new ArrayCamera( [ cameraL, cameraR ] );\n\tcameraVR.layers.enable( 1 );\n\tcameraVR.layers.enable( 2 );\n\n\t//\n\n\tfunction isPresenting() {\n\n\t\treturn device !== null && device.isPresenting === true;\n\n\t}\n\n\tvar currentSize = new Vector2(), currentPixelRatio;\n\n\tfunction onVRDisplayPresentChange() {\n\n\t\tif ( isPresenting() ) {\n\n\t\t\tvar eyeParameters = device.getEyeParameters( 'left' );\n\t\t\trenderWidth = 2 * eyeParameters.renderWidth * framebufferScaleFactor;\n\t\t\trenderHeight = eyeParameters.renderHeight * framebufferScaleFactor;\n\n\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\trenderer.getSize( currentSize );\n\n\t\t\trenderer.setDrawingBufferSize( renderWidth, renderHeight, 1 );\n\n\t\t\tcameraL.viewport.set( 0, 0, renderWidth / 2, renderHeight );\n\t\t\tcameraR.viewport.set( renderWidth / 2, 0, renderWidth / 2, renderHeight );\n\n\t\t\tanimation.start();\n\n\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t} else {\n\n\t\t\tif ( scope.enabled ) {\n\n\t\t\t\trenderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio );\n\n\t\t\t}\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tvar triggers = [];\n\n\tfunction findGamepad( id ) {\n\n\t\tvar gamepads = navigator.getGamepads && navigator.getGamepads();\n\n\t\tfor ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) {\n\n\t\t\tvar gamepad = gamepads[ i ];\n\n\t\t\tif ( gamepad && ( gamepad.id === 'Daydream Controller' ||\n\t\t\t\tgamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' ||\n\t\t\t\tgamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) ||\n\t\t\t\tgamepad.id.startsWith( 'HTC Vive Focus' ) ||\n\t\t\t\tgamepad.id.startsWith( 'Spatial Controller' ) ) ) {\n\n\t\t\t\tif ( j === id ) return gamepad;\n\n\t\t\t\tj ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateControllers() {\n\n\t\tfor ( var i = 0; i < controllers.length; i ++ ) {\n\n\t\t\tvar controller = controllers[ i ];\n\n\t\t\tvar gamepad = findGamepad( i );\n\n\t\t\tif ( gamepad !== undefined && gamepad.pose !== undefined ) {\n\n\t\t\t\tif ( gamepad.pose === null ) return;\n\n\t\t\t\t// Pose\n\n\t\t\t\tvar pose = gamepad.pose;\n\n\t\t\t\tif ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 );\n\n\t\t\t\tif ( pose.position !== null ) controller.position.fromArray( pose.position );\n\t\t\t\tif ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation );\n\t\t\t\tcontroller.matrix.compose( controller.position, controller.quaternion, controller.scale );\n\t\t\t\tcontroller.matrix.premultiply( standingMatrix );\n\t\t\t\tcontroller.matrix.decompose( controller.position, controller.quaternion, controller.scale );\n\t\t\t\tcontroller.matrixWorldNeedsUpdate = true;\n\t\t\t\tcontroller.visible = true;\n\n\t\t\t\t// Trigger\n\n\t\t\t\tvar buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1;\n\n\t\t\t\tif ( triggers[ i ] === undefined ) triggers[ i ] = false;\n\n\t\t\t\tif ( triggers[ i ] !== gamepad.buttons[ buttonId ].pressed ) {\n\n\t\t\t\t\ttriggers[ i ] = gamepad.buttons[ buttonId ].pressed;\n\n\t\t\t\t\tif ( triggers[ i ] === true ) {\n\n\t\t\t\t\t\tcontroller.dispatchEvent( { type: 'selectstart' } );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tcontroller.dispatchEvent( { type: 'selectend' } );\n\t\t\t\t\t\tcontroller.dispatchEvent( { type: 'select' } );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcontroller.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateViewportFromBounds( viewport, bounds ) {\n\n\t\tif ( bounds !== null && bounds.length === 4 ) {\n\n\t\t\tviewport.set( bounds[ 0 ] * renderWidth, bounds[ 1 ] * renderHeight, bounds[ 2 ] * renderWidth, bounds[ 3 ] * renderHeight );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.enabled = false;\n\n\tthis.getController = function ( id ) {\n\n\t\tvar controller = controllers[ id ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new Group();\n\t\t\tcontroller.matrixAutoUpdate = false;\n\t\t\tcontroller.visible = false;\n\n\t\t\tcontrollers[ id ] = controller;\n\n\t\t}\n\n\t\treturn controller;\n\n\t};\n\n\tthis.getDevice = function () {\n\n\t\treturn device;\n\n\t};\n\n\tthis.setDevice = function ( value ) {\n\n\t\tif ( value !== undefined ) device = value;\n\n\t\tanimation.setContext( value );\n\n\t};\n\n\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\tframebufferScaleFactor = value;\n\n\t};\n\n\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\treferenceSpaceType = value;\n\n\t};\n\n\tthis.setPoseTarget = function ( object ) {\n\n\t\tif ( object !== undefined ) poseTarget = object;\n\n\t};\n\n\tthis.getCamera = function ( camera ) {\n\n\t\tvar userHeight = referenceSpaceType === 'local-floor' ? 1.6 : 0;\n\n\t\tif ( isPresenting() === false ) {\n\n\t\t\tcamera.position.set( 0, userHeight, 0 );\n\t\t\tcamera.rotation.set( 0, 0, 0 );\n\n\t\t\treturn camera;\n\n\t\t}\n\n\t\tdevice.depthNear = camera.near;\n\t\tdevice.depthFar = camera.far;\n\n\t\tdevice.getFrameData( frameData );\n\n\t\t//\n\n\t\tif ( referenceSpaceType === 'local-floor' ) {\n\n\t\t\tvar stageParameters = device.stageParameters;\n\n\t\t\tif ( stageParameters ) {\n\n\t\t\t\tstandingMatrix.fromArray( stageParameters.sittingToStandingTransform );\n\n\t\t\t} else {\n\n\t\t\t\tstandingMatrix.makeTranslation( 0, userHeight, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar pose = frameData.pose;\n\t\tvar poseObject = poseTarget !== null ? poseTarget : camera;\n\n\t\t// We want to manipulate poseObject by its position and quaternion components since users may rely on them.\n\t\tposeObject.matrix.copy( standingMatrix );\n\t\tposeObject.matrix.decompose( poseObject.position, poseObject.quaternion, poseObject.scale );\n\n\t\tif ( pose.orientation !== null ) {\n\n\t\t\ttempQuaternion.fromArray( pose.orientation );\n\t\t\tposeObject.quaternion.multiply( tempQuaternion );\n\n\t\t}\n\n\t\tif ( pose.position !== null ) {\n\n\t\t\ttempQuaternion.setFromRotationMatrix( standingMatrix );\n\t\t\ttempPosition.fromArray( pose.position );\n\t\t\ttempPosition.applyQuaternion( tempQuaternion );\n\t\t\tposeObject.position.add( tempPosition );\n\n\t\t}\n\n\t\tposeObject.updateMatrixWorld();\n\n\t\t//\n\n\t\tcameraL.near = camera.near;\n\t\tcameraR.near = camera.near;\n\n\t\tcameraL.far = camera.far;\n\t\tcameraR.far = camera.far;\n\n\t\tcameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );\n\t\tcameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );\n\n\t\t// TODO (mrdoob) Double check this code\n\n\t\tstandingMatrixInverse.getInverse( standingMatrix );\n\n\t\tif ( referenceSpaceType === 'local-floor' ) {\n\n\t\t\tcameraL.matrixWorldInverse.multiply( standingMatrixInverse );\n\t\t\tcameraR.matrixWorldInverse.multiply( standingMatrixInverse );\n\n\t\t}\n\n\t\tvar parent = poseObject.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\n\t\t\tcameraL.matrixWorldInverse.multiply( matrixWorldInverse );\n\t\t\tcameraR.matrixWorldInverse.multiply( matrixWorldInverse );\n\n\t\t}\n\n\t\t// envMap and Mirror needs camera.matrixWorld\n\n\t\tcameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse );\n\t\tcameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse );\n\n\t\tcameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );\n\t\tcameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );\n\n\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t//\n\n\t\tvar layers = device.getLayers();\n\n\t\tif ( layers.length ) {\n\n\t\t\tvar layer = layers[ 0 ];\n\n\t\t\tupdateViewportFromBounds( cameraL.viewport, layer.leftBounds );\n\t\t\tupdateViewportFromBounds( cameraR.viewport, layer.rightBounds );\n\n\t\t}\n\n\t\tupdateControllers();\n\n\t\treturn cameraVR;\n\n\t};\n\n\tthis.getStandingMatrix = function () {\n\n\t\treturn standingMatrix;\n\n\t};\n\n\tthis.isPresenting = isPresenting;\n\n\t// Animation Loop\n\n\tvar animation = new WebGLAnimation();\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tanimation.setAnimationLoop( callback );\n\n\t\tif ( isPresenting() ) animation.start();\n\n\t};\n\n\tthis.submitFrame = function () {\n\n\t\tif ( isPresenting() ) device.submitFrame();\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\tif ( typeof window !== 'undefined' ) {\n\n\t\t\twindow.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange );\n\n\t\t}\n\n\t};\n\n\t// DEPRECATED\n\n\tthis.setFrameOfReferenceType = function () {\n\n\t\tconsole.warn( 'THREE.WebVRManager: setFrameOfReferenceType() has been deprecated.' );\n\n\t};\n\n}\n\nObject.assign( WebVRManager.prototype, EventDispatcher.prototype );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction WebXRManager( renderer ) {\n\n\tvar scope = this;\n\n\tvar gl = renderer.context;\n\n\tvar session = null;\n\n\tvar referenceSpace = null;\n\tvar referenceSpaceType = 'local-floor';\n\n\tvar pose = null;\n\n\tvar controllers = [];\n\tvar inputSources = [];\n\n\tfunction isPresenting() {\n\n\t\treturn session !== null && referenceSpace !== null;\n\n\t}\n\n\t//\n\n\tvar cameraL = new PerspectiveCamera();\n\tcameraL.layers.enable( 1 );\n\tcameraL.viewport = new Vector4();\n\n\tvar cameraR = new PerspectiveCamera();\n\tcameraR.layers.enable( 2 );\n\tcameraR.viewport = new Vector4();\n\n\tvar cameraVR = new ArrayCamera( [ cameraL, cameraR ] );\n\tcameraVR.layers.enable( 1 );\n\tcameraVR.layers.enable( 2 );\n\n\t//\n\n\tthis.enabled = false;\n\n\tthis.getController = function ( id ) {\n\n\t\tvar controller = controllers[ id ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new Group();\n\t\t\tcontroller.matrixAutoUpdate = false;\n\t\t\tcontroller.visible = false;\n\n\t\t\tcontrollers[ id ] = controller;\n\n\t\t}\n\n\t\treturn controller;\n\n\t};\n\n\t//\n\n\tfunction onSessionEvent( event ) {\n\n\t\tfor ( var i = 0; i < controllers.length; i ++ ) {\n\n\t\t\tif ( inputSources[ i ] === event.inputSource ) {\n\n\t\t\t\tcontrollers[ i ].dispatchEvent( { type: event.type } );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction onSessionEnd() {\n\n\t\trenderer.setFramebuffer( null );\n\t\trenderer.setRenderTarget( renderer.getRenderTarget() ); // Hack #15830\n\t\tanimation.stop();\n\n\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t}\n\n\tfunction onRequestReferenceSpace( value ) {\n\n\t\treferenceSpace = value;\n\n\t\tanimation.setContext( session );\n\t\tanimation.start();\n\n\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t}\n\n\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t};\n\n\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\treferenceSpaceType = value;\n\n\t};\n\n\tthis.getSession = function () {\n\n\t\treturn session;\n\n\t};\n\n\tthis.setSession = function ( value ) {\n\n\t\tsession = value;\n\n\t\tif ( session !== null ) {\n\n\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\n\t\t\tsession.updateRenderState( { baseLayer: new XRWebGLLayer( session, gl ) } );\n\n\t\t\tsession.requestReferenceSpace( referenceSpaceType ).then( onRequestReferenceSpace );\n\n\t\t\t//\n\n\t\t\tinputSources = session.inputSources;\n\n\t\t\tsession.addEventListener( 'inputsourceschange', function () {\n\n\t\t\t\tinputSources = session.inputSources;\n\t\t\t\tconsole.log( inputSources );\n\n\t\t\t\tfor ( var i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\tvar controller = controllers[ i ];\n\t\t\t\t\tcontroller.userData.inputSource = inputSources[ i ];\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t};\n\n\tfunction updateCamera( camera, parent ) {\n\n\t\tif ( parent === null ) {\n\n\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t} else {\n\n\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t}\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t}\n\n\tthis.getCamera = function ( camera ) {\n\n\t\tif ( isPresenting() ) {\n\n\t\t\tvar parent = camera.parent;\n\t\t\tvar cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( var i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update camera and its children\n\n\t\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\t\tvar children = camera.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\treturn cameraVR;\n\n\t\t}\n\n\t\treturn camera;\n\n\t};\n\n\tthis.isPresenting = isPresenting;\n\n\t// Animation Loop\n\n\tvar onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tpose = frame.getViewerPose( referenceSpace );\n\n\t\tif ( pose !== null ) {\n\n\t\t\tvar views = pose.views;\n\t\t\tvar baseLayer = session.renderState.baseLayer;\n\n\t\t\trenderer.setFramebuffer( baseLayer.framebuffer );\n\n\t\t\tfor ( var i = 0; i < views.length; i ++ ) {\n\n\t\t\t\tvar view = views[ i ];\n\t\t\t\tvar viewport = baseLayer.getViewport( view );\n\t\t\t\tvar viewMatrix = view.transform.inverse.matrix;\n\n\t\t\t\tvar camera = cameraVR.cameras[ i ];\n\t\t\t\tcamera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix );\n\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfor ( var i = 0; i < controllers.length; i ++ ) {\n\n\t\t\tvar controller = controllers[ i ];\n\n\t\t\tvar inputSource = inputSources[ i ];\n\n\t\t\tif ( inputSource ) {\n\n\t\t\t\tvar inputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\tcontroller.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\tcontroller.matrix.decompose( controller.position, controller.rotation, controller.scale );\n\t\t\t\t\tcontroller.visible = true;\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcontroller.visible = false;\n\n\t\t}\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tvar animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\n\t};\n\n\tthis.dispose = function () {};\n\n\t// DEPRECATED\n\n\tthis.getStandingMatrix = function () {\n\n\t\tconsole.warn( 'THREE.WebXRManager: getStandingMatrix() is no longer needed.' );\n\t\treturn new Matrix4();\n\n\t};\n\n\tthis.getDevice = function () {\n\n\t\tconsole.warn( 'THREE.WebXRManager: getDevice() has been deprecated.' );\n\n\t};\n\n\tthis.setDevice = function () {\n\n\t\tconsole.warn( 'THREE.WebXRManager: setDevice() has been deprecated.' );\n\n\t};\n\n\tthis.setFrameOfReferenceType = function () {\n\n\t\tconsole.warn( 'THREE.WebXRManager: setFrameOfReferenceType() has been deprecated.' );\n\n\t};\n\n\tthis.submitFrame = function () {};\n\n}\n\nObject.assign( WebXRManager.prototype, EventDispatcher.prototype );\n\n/**\n * @author supereggbert / http://www.paulbrunt.co.uk/\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n * @author szimek / https://github.com/szimek/\n * @author tschw\n */\n\nfunction WebGLRenderer( parameters ) {\n\n\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\tparameters = parameters || {};\n\n\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tvar currentRenderList = null;\n\tvar currentRenderState = null;\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\tthis.context = null;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\tthis.gammaInput = false;\n\tthis.gammaOutput = false;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = LinearToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\tthis.toneMappingWhitePoint = 1.0;\n\n\t// morphs\n\n\tthis.maxMorphTargets = 8;\n\tthis.maxMorphNormals = 4;\n\n\t// internal properties\n\n\tvar _this = this,\n\n\t\t_isContextLost = false,\n\n\t\t// internal state cache\n\n\t\t_framebuffer = null,\n\n\t\t_currentActiveCubeFace = 0,\n\t\t_currentActiveMipmapLevel = 0,\n\t\t_currentRenderTarget = null,\n\t\t_currentFramebuffer = null,\n\t\t_currentMaterialId = - 1,\n\n\t\t// geometry and program caching\n\n\t\t_currentGeometryProgram = {\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false\n\t\t},\n\n\t\t_currentCamera = null,\n\t\t_currentArrayCamera = null,\n\n\t\t_currentViewport = new Vector4(),\n\t\t_currentScissor = new Vector4(),\n\t\t_currentScissorTest = null,\n\n\t\t//\n\n\t\t_width = _canvas.width,\n\t\t_height = _canvas.height,\n\n\t\t_pixelRatio = 1,\n\n\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t_scissorTest = false,\n\n\t\t// frustum\n\n\t\t_frustum = new Frustum(),\n\n\t\t// clipping\n\n\t\t_clipping = new WebGLClipping(),\n\t\t_clippingEnabled = false,\n\t\t_localClippingEnabled = false,\n\n\t\t// camera matrices cache\n\n\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t_vector3 = new Vector3();\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tvar _gl;\n\n\ttry {\n\n\t\tvar contextAttributes = {\n\t\t\talpha: _alpha,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat,\n\t\t\txrCompatible: true\n\t\t};\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\t_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tvar extensions, capabilities, state, info;\n\tvar properties, textures, attributes, geometries, objects;\n\tvar programCache, renderLists, renderStates;\n\n\tvar background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tvar utils;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tif ( ! capabilities.isWebGL2 ) {\n\n\t\t\textensions.get( 'WEBGL_depth_texture' );\n\t\t\textensions.get( 'OES_texture_float' );\n\t\t\textensions.get( 'OES_texture_half_float' );\n\t\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\t\textensions.get( 'OES_standard_derivatives' );\n\t\t\textensions.get( 'OES_element_index_uint' );\n\t\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t}\n\n\t\textensions.get( 'OES_texture_float_linear' );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, utils, capabilities );\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tattributes = new WebGLAttributes( _gl );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info );\n\t\tobjects = new WebGLObjects( geometries, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl );\n\t\tprogramCache = new WebGLPrograms( _this, extensions, capabilities );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates();\n\n\t\tbackground = new WebGLBackground( _this, state, objects, _premultipliedAlpha );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.context = _gl;\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// vr\n\n\tvar vr = ( typeof navigator !== 'undefined' && 'xr' in navigator && 'supportsSession' in navigator.xr ) ? new WebXRManager( _this ) : new WebVRManager( _this );\n\n\tthis.vr = vr;\n\n\t// shadow map\n\n\tvar shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );\n\n\tthis.shadowMap = shadowMap;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getsize() now requires a Vector2 as an argument' );\n\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( vr.isPresenting() ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument' );\n\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument' );\n\n\t\t\ttarget = new Vector4();\n\n\t\t}\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function () {\n\n\t\treturn background.getClearColor();\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tvar bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= 16384;\n\t\tif ( depth === undefined || depth ) bits |= 256;\n\t\tif ( stencil === undefined || stencil ) bits |= 1024;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tobjects.dispose();\n\n\t\tvr.dispose();\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tinitGLContext();\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tvar material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReference( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReference( material ) {\n\n\t\tvar programInfo = properties.get( material ).program;\n\n\t\tmaterial.program = undefined;\n\n\t\tif ( programInfo !== undefined ) {\n\n\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tfunction renderObjectImmediate( object, program ) {\n\n\t\tobject.render( function ( object ) {\n\n\t\t\t_this.renderBufferImmediate( object, program );\n\n\t\t} );\n\n\t}\n\n\tthis.renderBufferImmediate = function ( object, program ) {\n\n\t\tstate.initAttributes();\n\n\t\tvar buffers = properties.get( object );\n\n\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tif ( object.hasPositions ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.position );\n\t\t\t_gl.bufferData( 34962, object.positionArray, 35048 );\n\n\t\t\tstate.enableAttribute( programAttributes.position );\n\t\t\t_gl.vertexAttribPointer( programAttributes.position, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasNormals ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.normal );\n\t\t\t_gl.bufferData( 34962, object.normalArray, 35048 );\n\n\t\t\tstate.enableAttribute( programAttributes.normal );\n\t\t\t_gl.vertexAttribPointer( programAttributes.normal, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasUvs ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.uv );\n\t\t\t_gl.bufferData( 34962, object.uvArray, 35048 );\n\n\t\t\tstate.enableAttribute( programAttributes.uv );\n\t\t\t_gl.vertexAttribPointer( programAttributes.uv, 2, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasColors ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.color );\n\t\t\t_gl.bufferData( 34962, object.colorArray, 35048 );\n\n\t\t\tstate.enableAttribute( programAttributes.color );\n\t\t\t_gl.vertexAttribPointer( programAttributes.color, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tstate.disableUnusedAttributes();\n\n\t\t_gl.drawArrays( 4, 0, object.count );\n\n\t\tobject.count = 0;\n\n\t};\n\n\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\tvar frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\tvar program = setProgram( camera, fog, material, object );\n\n\t\tvar updateBuffers = false;\n\n\t\tif ( _currentGeometryProgram.geometry !== geometry.id ||\n\t\t\t_currentGeometryProgram.program !== program.id ||\n\t\t\t_currentGeometryProgram.wireframe !== ( material.wireframe === true ) ) {\n\n\t\t\t_currentGeometryProgram.geometry = geometry.id;\n\t\t\t_currentGeometryProgram.program = program.id;\n\t\t\t_currentGeometryProgram.wireframe = material.wireframe === true;\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\t//\n\n\t\tvar index = geometry.index;\n\t\tvar position = geometry.attributes.position;\n\t\tvar rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tvar attribute;\n\t\tvar renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t_gl.bindBuffer( 34963, attribute.buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tvar dataCount = Infinity;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdataCount = index.count;\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\tdataCount = position.count;\n\n\t\t}\n\n\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else {\n\n\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\trenderer.setMode( 4 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\trenderer.setMode( 5 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\trenderer.setMode( 6 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( 2 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 3 );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( 0 );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( 4 );\n\n\t\t}\n\n\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\tfunction setupVertexAttributes( material, program, geometry ) {\n\n\t\tif ( geometry && geometry.isInstancedBufferGeometry && ! capabilities.isWebGL2 ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.initAttributes();\n\n\t\tvar geometryAttributes = geometry.attributes;\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( var name in programAttributes ) {\n\n\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\tvar attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tvar buffer = attribute.buffer;\n\t\t\t\t\tvar type = attribute.type;\n\t\t\t\t\tvar bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.bindBuffer( 34962, buffer );\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.bindBuffer( 34962, buffer );\n\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.disableUnusedAttributes();\n\n\t}\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.material ) {\n\n\t\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\t\tfor ( var i = 0; i < object.material.length; i ++ ) {\n\n\t\t\t\t\t\tinitMaterial( object.material[ i ], scene.fog, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinitMaterial( object.material, scene.fog, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t};\n\n\t// Animation Loop\n\n\tvar onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( vr.isPresenting() ) return;\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tvar animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof window !== 'undefined' ) animation.setContext( window );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\tvr.setAnimationLoop( callback );\n\n\t\tanimation.start();\n\n\t};\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tvar renderTarget, forceClear;\n\n\t\tif ( arguments[ 2 ] !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.' );\n\t\t\trenderTarget = arguments[ 2 ];\n\n\t\t}\n\n\t\tif ( arguments[ 3 ] !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.' );\n\t\t\tforceClear = arguments[ 3 ];\n\n\t\t}\n\n\t\tif ( ! ( camera && camera.isCamera ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost ) return;\n\n\t\t// reset caching for this frame\n\n\t\t_currentGeometryProgram.geometry = null;\n\t\t_currentGeometryProgram.program = null;\n\t\t_currentGeometryProgram.wireframe = false;\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( vr.enabled ) {\n\n\t\t\tcamera = vr.getCamera( camera );\n\n\t\t}\n\n\t\t//\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\tscene.onBeforeRender( _this, scene, camera, renderTarget || _currentRenderTarget );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, camera );\n\t\tcurrentRenderList.init();\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort();\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\tvar shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset ) this.info.reset();\n\n\t\tif ( renderTarget !== undefined ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene, camera, forceClear );\n\n\t\t// render scene\n\n\t\tvar opaqueObjects = currentRenderList.opaque;\n\t\tvar transparentObjects = currentRenderList.transparent;\n\n\t\tif ( scene.overrideMaterial ) {\n\n\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t} else {\n\n\t\t\t// opaque pass (front-to-back order)\n\n\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );\n\n\t\t\t// transparent pass (back-to-front order)\n\n\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tscene.onAfterRender( _this, scene, camera );\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t}\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\tif ( vr.enabled ) {\n\n\t\t\tvr.submitFrame();\n\n\t\t}\n\n\t\t// _gl.finish();\n\n\t\tcurrentRenderList = null;\n\t\tcurrentRenderState = null;\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tvar visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar geometry = objects.update( object );\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentRenderList.push( object, null, object.material, groupOrder, _vector3.z, null );\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar geometry = objects.update( object );\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\tvar object = renderItem.object;\n\t\t\tvar geometry = renderItem.geometry;\n\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\tvar group = renderItem.group;\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t_currentArrayCamera = camera;\n\n\t\t\t\tvar cameras = camera.cameras;\n\n\t\t\t\tfor ( var j = 0, jl = cameras.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar camera2 = cameras[ j ];\n\n\t\t\t\t\tif ( object.layers.test( camera2.layers ) ) {\n\n\t\t\t\t\t\tstate.viewport( _currentViewport.copy( camera2.viewport ) );\n\n\t\t\t\t\t\tcurrentRenderState.setupLights( camera2 );\n\n\t\t\t\t\t\trenderObject( object, scene, camera2, geometry, material, group );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_currentArrayCamera = null;\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\tstate.setMaterial( material );\n\n\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t_currentGeometryProgram.geometry = null;\n\t\t\t_currentGeometryProgram.program = null;\n\t\t\t_currentGeometryProgram.wireframe = false;\n\n\t\t\trenderObjectImmediate( object, program );\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t}\n\n\tfunction initMaterial( material, fog, object ) {\n\n\t\tvar materialProperties = properties.get( material );\n\n\t\tvar lights = currentRenderState.state.lights;\n\t\tvar shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tvar lightsStateVersion = lights.state.version;\n\n\t\tvar parameters = programCache.getParameters(\n\t\t\tmaterial, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\tvar program = materialProperties.program;\n\t\tvar programChange = true;\n\n\t\tif ( program === undefined ) {\n\n\t\t\t// new material\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t} else if ( program.code !== code ) {\n\n\t\t\t// changed glsl or parameters\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t} else if ( materialProperties.lightsStateVersion !== lightsStateVersion ) {\n\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tprogramChange = false;\n\n\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t// same glsl and uniform list\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// only rebuild uniform list\n\t\t\tprogramChange = false;\n\n\t\t}\n\n\t\tif ( programChange ) {\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\tname: material.type,\n\t\t\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\tname: material.type,\n\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tmaterial.onBeforeCompile( materialProperties.shader, _this );\n\n\t\t\t// Computing code again as onBeforeCompile may have changed the shaders\n\t\t\tcode = programCache.getProgramCode( material, parameters );\n\n\t\t\tprogram = programCache.acquireProgram( material, materialProperties.shader, parameters, code );\n\n\t\t\tmaterialProperties.program = program;\n\t\t\tmaterial.program = program;\n\n\t\t}\n\n\t\tvar programAttributes = program.getAttributes();\n\n\t\tif ( material.morphTargets ) {\n\n\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.morphNormals ) {\n\n\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar uniforms = materialProperties.shader.uniforms;\n\n\t\tif ( ! material.isShaderMaterial &&\n\t\t\t! material.isRawShaderMaterial ||\n\t\t\tmaterial.clipping === true ) {\n\n\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t}\n\n\t\tmaterialProperties.fog = fog;\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( material.lights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\tuniformsList =\n\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t}\n\n\tfunction setProgram( camera, fog, material, object ) {\n\n\t\ttextures.resetTextureUnits();\n\n\t\tvar materialProperties = properties.get( material );\n\t\tvar lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled ) {\n\n\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\tvar useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\t_clipping.setState(\n\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.needsUpdate === false ) {\n\n\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( material.lights && materialProperties.lightsStateVersion !== lights.state.version ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.needsUpdate ) {\n\n\t\t\tinitMaterial( material, fog, object );\n\t\t\tmaterial.needsUpdate = false;\n\n\t\t}\n\n\t\tvar refreshProgram = false;\n\t\tvar refreshMaterial = false;\n\t\tvar refreshLights = false;\n\n\t\tvar program = materialProperties.program,\n\t\t\tp_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.shader.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t// not sure why, but otherwise weird things happen\n\n\t\tif ( material.skinning ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tvar skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tvar bones = skeleton.bones;\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === undefined ) {\n\n\t\t\t\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\t\t\t\tvar size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\t\t\t\tsize = _Math.ceilPowerOfTwo( size );\n\t\t\t\t\t\tsize = Math.max( size, 4 );\n\n\t\t\t\t\t\tvar boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\t\t\t\t\tboneMatrices.set( skeleton.boneMatrices ); // copy current values\n\n\t\t\t\t\t\tvar boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\t\t\t\t\tboneTexture.needsUpdate = true;\n\n\t\t\t\t\t\tskeleton.boneMatrices = boneMatrices;\n\t\t\t\t\t\tskeleton.boneTexture = boneTexture;\n\t\t\t\t\t\tskeleton.boneTextureSize = size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\tif ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\trefreshUniformsMatcap( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsDepth( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsDistance( m_uniforms, material );\n\n\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\t\trefreshUniformsSprites( m_uniforms, material );\n\n\t\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\t\tm_uniforms.color.value.copy( material.color );\n\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t}\n\n\t\t\t// RectAreaLight Texture\n\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\tif ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1;\n\t\t\tif ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2;\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// Uniforms (refresh uniforms objects)\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\tuniforms.flipEnvMap.value = material.envMap.isCubeTexture ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t\tuniforms.maxMipLevel.value = properties.get( material.envMap ).__maxMipLevel;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. normal map\n\t\t// 4. bump map\n\t\t// 5. alpha map\n\t\t// 6. emissive map\n\n\t\tvar uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\tuniforms.scale.value = _height * 0.5;\n\n\t\tuniforms.map.value = material.map;\n\n\t\tif ( material.map !== null ) {\n\n\t\t\tif ( material.map.matrixAutoUpdate === true ) {\n\n\t\t\t\tmaterial.map.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( material.map.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\t\tuniforms.map.value = material.map;\n\n\t\tif ( material.map !== null ) {\n\n\t\t\tif ( material.map.matrixAutoUpdate === true ) {\n\n\t\t\t\tmaterial.map.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( material.map.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\trefreshUniformsPhong( uniforms, material );\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\trefreshUniformsStandard( uniforms, material );\n\n\t\tuniforms.reflectivity.value = material.reflectivity; // also part of uniforms common\n\n\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\t//\n\tthis.setFramebuffer = function ( value ) {\n\n\t\tif ( _framebuffer !== value ) _gl.bindFramebuffer( 36160, value );\n\n\t\t_framebuffer = value;\n\n\t};\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipMapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace, activeMipMapLevel ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipMapLevel;\n\n\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t}\n\n\t\tvar framebuffer = _framebuffer;\n\t\tvar isCube = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tvar __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace || 0 ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( renderTarget.isWebGLMultisampleRenderTarget ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( 36160, 36064, 34069 + ( activeCubeFace || 0 ), textureProperties.__webglTexture, activeMipMapLevel || 0 );\n\n\t\t}\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLRenderTargetCube && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tvar restore = false;\n\n\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\n\t\t\t\trestore = true;\n\n\t\t\t}\n\n\t\t\ttry {\n\n\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( 36160 ) === 36053 ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, _currentFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level ) {\n\n\t\tvar width = texture.image.width;\n\t\tvar height = texture.image.height;\n\t\tvar glFormat = utils.convert( texture.format );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexImage2D( 3553, level || 0, glFormat, position.x, position.y, width, height, 0 );\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) {\n\n\t\tvar width = srcTexture.image.width;\n\t\tvar height = srcTexture.image.height;\n\t\tvar glFormat = utils.convert( dstTexture.format );\n\t\tvar glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( 3553, level || 0, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\t_gl.texSubImage2D( 3553, level || 0, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t}\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef\n\n\t}\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction FogExp2( color, density ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n}\n\nObject.assign( FogExp2.prototype, {\n\n\tisFogExp2: true,\n\n\tclone: function () {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t},\n\n\ttoJSON: function ( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Fog( color, near, far ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\n\tthis.near = ( near !== undefined ) ? near : 1;\n\tthis.far = ( far !== undefined ) ? far : 1000;\n\n}\n\nObject.assign( Fog.prototype, {\n\n\tisFog: true,\n\n\tclone: function () {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t},\n\n\ttoJSON: function ( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InterleavedBuffer( array, stride ) {\n\n\tthis.array = array;\n\tthis.stride = stride;\n\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\tthis.dynamic = false;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( InterleavedBuffer.prototype, {\n\n\tisInterleavedBuffer: true,\n\n\tonUploadCallback: function () {},\n\n\tsetArray: function ( array ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\tthis.array = array;\n\n\t\treturn this;\n\n\t},\n\n\tsetDynamic: function ( value ) {\n\n\t\tthis.dynamic = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.dynamic = source.dynamic;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\tthis.data = interleavedBuffer;\n\tthis.itemSize = itemSize;\n\tthis.offset = offset;\n\n\tthis.normalized = normalized === true;\n\n}\n\nObject.defineProperties( InterleavedBufferAttribute.prototype, {\n\n\tcount: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.count;\n\n\t\t}\n\n\t},\n\n\tarray: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.array;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( InterleavedBufferAttribute.prototype, {\n\n\tisInterleavedBufferAttribute: true,\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * map: new THREE.Texture( ),\n * rotation: ,\n * sizeAttenuation: \n * }\n */\n\nfunction SpriteMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'SpriteMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\tthis.map = null;\n\n\tthis.rotation = 0;\n\n\tthis.sizeAttenuation = true;\n\n\tthis.lights = false;\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nSpriteMaterial.prototype = Object.create( Material.prototype );\nSpriteMaterial.prototype.constructor = SpriteMaterial;\nSpriteMaterial.prototype.isSpriteMaterial = true;\n\nSpriteMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.map = source.map;\n\n\tthis.rotation = source.rotation;\n\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\treturn this;\n\n};\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n */\n\nvar geometry;\n\nfunction Sprite( material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Sprite';\n\n\tif ( geometry === undefined ) {\n\n\t\tgeometry = new BufferGeometry();\n\n\t\tvar float32Array = new Float32Array( [\n\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t] );\n\n\t\tvar interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\tgeometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\tgeometry.addAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\tgeometry.addAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t}\n\n\tthis.geometry = geometry;\n\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\tthis.center = new Vector2( 0.5, 0.5 );\n\n}\n\nSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Sprite,\n\n\tisSprite: true,\n\n\traycast: ( function () {\n\n\t\tvar intersectPoint = new Vector3();\n\t\tvar worldScale = new Vector3();\n\t\tvar mvPosition = new Vector3();\n\n\t\tvar alignedPosition = new Vector2();\n\t\tvar rotatedPosition = new Vector2();\n\t\tvar viewWorldMatrix = new Matrix4();\n\n\t\tvar vA = new Vector3();\n\t\tvar vB = new Vector3();\n\t\tvar vC = new Vector3();\n\n\t\tvar uvA = new Vector2();\n\t\tvar uvB = new Vector2();\n\t\tvar uvC = new Vector2();\n\n\t\tfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t\t\t// compute position in camera space\n\t\t\talignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t\t\t// to check if rotation is not zero\n\t\t\tif ( sin !== undefined ) {\n\n\t\t\t\trotatedPosition.x = ( cos * alignedPosition.x ) - ( sin * alignedPosition.y );\n\t\t\t\trotatedPosition.y = ( sin * alignedPosition.x ) + ( cos * alignedPosition.y );\n\n\t\t\t} else {\n\n\t\t\t\trotatedPosition.copy( alignedPosition );\n\n\t\t\t}\n\n\n\t\t\tvertexPosition.copy( mvPosition );\n\t\t\tvertexPosition.x += rotatedPosition.x;\n\t\t\tvertexPosition.y += rotatedPosition.y;\n\n\t\t\t// transform to world space\n\t\t\tvertexPosition.applyMatrix4( viewWorldMatrix );\n\n\t\t}\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tworldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t\tviewWorldMatrix.copy( raycaster._camera.matrixWorld );\n\t\t\tthis.modelViewMatrix.multiplyMatrices( raycaster._camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t\tmvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\t\tif ( raycaster._camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t\tworldScale.multiplyScalar( - mvPosition.z );\n\n\t\t\t}\n\n\t\t\tvar rotation = this.material.rotation;\n\t\t\tvar sin, cos;\n\t\t\tif ( rotation !== 0 ) {\n\n\t\t\t\tcos = Math.cos( rotation );\n\t\t\t\tsin = Math.sin( rotation );\n\n\t\t\t}\n\n\t\t\tvar center = this.center;\n\n\t\t\ttransformVertex( vA.set( - 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos );\n\t\t\ttransformVertex( vB.set( 0.5, - 0.5, 0 ), mvPosition, center, worldScale, sin, cos );\n\t\t\ttransformVertex( vC.set( 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos );\n\n\t\t\tuvA.set( 0, 0 );\n\t\t\tuvB.set( 1, 0 );\n\t\t\tuvC.set( 1, 1 );\n\n\t\t\t// check first triangle\n\t\t\tvar intersect = raycaster.ray.intersectTriangle( vA, vB, vC, false, intersectPoint );\n\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\t// check second triangle\n\t\t\t\ttransformVertex( vB.set( - 0.5, 0.5, 0 ), mvPosition, center, worldScale, sin, cos );\n\t\t\t\tuvB.set( 0, 1 );\n\n\t\t\t\tintersect = raycaster.ray.intersectTriangle( vA, vC, vB, false, intersectPoint );\n\t\t\t\tif ( intersect === null ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\tintersects.push( {\n\n\t\t\t\tdistance: distance,\n\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\tuv: Triangle.getUV( intersectPoint, vA, vB, vC, uvA, uvB, uvC, new Vector2() ),\n\t\t\t\tface: null,\n\t\t\t\tobject: this\n\n\t\t\t} );\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.material ).copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\treturn this;\n\n\t}\n\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LOD() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'LOD';\n\n\tObject.defineProperties( this, {\n\t\tlevels: {\n\t\t\tenumerable: true,\n\t\t\tvalue: []\n\t\t}\n\t} );\n\n\tthis.autoUpdate = true;\n\n}\n\nLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: LOD,\n\n\tisLOD: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\tvar levels = source.levels;\n\n\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tvar level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\taddLevel: function ( object, distance ) {\n\n\t\tif ( distance === undefined ) distance = 0;\n\n\t\tdistance = Math.abs( distance );\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t},\n\n\tgetObjectForDistance: function ( distance ) {\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn levels[ i - 1 ].object;\n\n\t},\n\n\traycast: ( function () {\n\n\t\tvar matrixPosition = new Vector3();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t};\n\n\t}() ),\n\n\tupdate: function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\n\t\treturn function update( camera ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}(),\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.levels = [];\n\n\t\tvar levels = this.levels;\n\n\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tvar level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author ikerr / http://verold.com\n */\n\nfunction SkinnedMesh( geometry, material ) {\n\n\tif ( geometry && geometry.isGeometry ) {\n\n\t\tconsole.error( 'THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t}\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'SkinnedMesh';\n\n\tthis.bindMode = 'attached';\n\tthis.bindMatrix = new Matrix4();\n\tthis.bindMatrixInverse = new Matrix4();\n\n}\n\nSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: SkinnedMesh,\n\n\tisSkinnedMesh: true,\n\n\tbind: function ( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t},\n\n\tpose: function () {\n\n\t\tthis.skeleton.pose();\n\n\t},\n\n\tnormalizeSkinWeights: function () {\n\n\t\tvar vector = new Vector4();\n\n\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( var i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.x = skinWeight.getX( i );\n\t\t\tvector.y = skinWeight.getY( i );\n\t\t\tvector.z = skinWeight.getZ( i );\n\t\t\tvector.w = skinWeight.getW( i );\n\n\t\t\tvar scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tMesh.prototype.updateMatrixWorld.call( this, force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author michael guerrero / http://realitymeltdown.com\n * @author ikerr / http://verold.com\n */\n\nfunction Skeleton( bones, boneInverses ) {\n\n\t// copy the bone array\n\n\tbones = bones || [];\n\n\tthis.bones = bones.slice( 0 );\n\tthis.boneMatrices = new Float32Array( this.bones.length * 16 );\n\n\t// use the supplied bone inverses or calculate the inverses\n\n\tif ( boneInverses === undefined ) {\n\n\t\tthis.calculateInverses();\n\n\t} else {\n\n\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Skeleton boneInverses is the wrong length.' );\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Skeleton.prototype, {\n\n\tcalculateInverses: function () {\n\n\t\tthis.boneInverses = [];\n\n\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tvar inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.getInverse( this.bones[ i ].matrixWorld );\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t},\n\n\tpose: function () {\n\n\t\tvar bone, i, il;\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tbone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tbone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdate: ( function () {\n\n\t\tvar offsetMatrix = new Matrix4();\n\t\tvar identityMatrix = new Matrix4();\n\n\t\treturn function update() {\n\n\t\t\tvar bones = this.bones;\n\t\t\tvar boneInverses = this.boneInverses;\n\t\t\tvar boneMatrices = this.boneMatrices;\n\t\t\tvar boneTexture = this.boneTexture;\n\n\t\t\t// flatten bone matrices to array\n\n\t\t\tfor ( var i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\tvar matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix;\n\n\t\t\t\toffsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t\toffsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t\t}\n\n\t\t\tif ( boneTexture !== undefined ) {\n\n\t\t\t\tboneTexture.needsUpdate = true;\n\n\t\t\t}\n\n\t\t};\n\n\t} )(),\n\n\tclone: function () {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t},\n\n\tgetBoneByName: function ( name ) {\n\n\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tvar bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n} );\n\n/**\n * @author mikael emtinger / http://gomo.se/\n * @author alteredq / http://alteredqualia.com/\n * @author ikerr / http://verold.com\n */\n\nfunction Bone() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Bone';\n\n}\n\nBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Bone,\n\n\tisBone: true\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n * linecap: \"round\",\n * linejoin: \"round\"\n * }\n */\n\nfunction LineBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'LineBasicMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.linewidth = 1;\n\tthis.linecap = 'round';\n\tthis.linejoin = 'round';\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nLineBasicMaterial.prototype = Object.create( Material.prototype );\nLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\nLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\nLineBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.linewidth = source.linewidth;\n\tthis.linecap = source.linecap;\n\tthis.linejoin = source.linejoin;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Line( geometry, material, mode ) {\n\n\tif ( mode === 1 ) {\n\n\t\tconsole.error( 'THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.' );\n\n\t}\n\n\tObject3D.call( this );\n\n\tthis.type = 'Line';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n}\n\nLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Line,\n\n\tisLine: true,\n\n\tcomputeLineDistances: ( function () {\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t// we assume non-indexed geometry\n\n\t\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\t\tvar positionAttribute = geometry.attributes.position;\n\t\t\t\t\tvar lineDistances = [ 0 ];\n\n\t\t\t\t\tfor ( var i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\tstart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t\t\tend.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\t\tlineDistances[ i ] += start.distanceTo( end );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar lineDistances = geometry.lineDistances;\n\n\t\t\t\tlineDistances[ 0 ] = 0;\n\n\t\t\t\tfor ( var i = 1, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() ),\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar precision = raycaster.linePrecision;\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\t\t\tsphere.radius += precision;\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\tvar localPrecision = precision / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\tvar localPrecisionSq = localPrecision * localPrecision;\n\n\t\t\tvar vStart = new Vector3();\n\t\t\tvar vEnd = new Vector3();\n\t\t\tvar interSegment = new Vector3();\n\t\t\tvar interRay = new Vector3();\n\t\t\tvar step = ( this && this.isLineSegments ) ? 2 : 1;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > localPrecisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > localPrecisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localPrecisionSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LineSegments( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineSegments';\n\n}\n\nLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineSegments,\n\n\tisLineSegments: true,\n\n\tcomputeLineDistances: ( function () {\n\n\t\tvar start = new Vector3();\n\t\tvar end = new Vector3();\n\n\t\treturn function computeLineDistances() {\n\n\t\t\tvar geometry = this.geometry;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t// we assume non-indexed geometry\n\n\t\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\t\tvar positionAttribute = geometry.attributes.position;\n\t\t\t\t\tvar lineDistances = [];\n\n\t\t\t\t\tfor ( var i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t\t\tstart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t\tend.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.addAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t\t}\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\tvar lineDistances = geometry.lineDistances;\n\n\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i += 2 ) {\n\n\t\t\t\t\tstart.copy( vertices[ i ] );\n\t\t\t\t\tend.copy( vertices[ i + 1 ] );\n\n\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + start.distanceTo( end );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}() )\n\n} );\n\n/**\n * @author mgreter / http://github.com/mgreter\n */\n\nfunction LineLoop( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineLoop';\n\n}\n\nLineLoop.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineLoop,\n\n\tisLineLoop: true,\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * size: ,\n * sizeAttenuation: \n *\n * morphTargets: \n * }\n */\n\nfunction PointsMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'PointsMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\n\tthis.size = 1;\n\tthis.sizeAttenuation = true;\n\n\tthis.morphTargets = false;\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nPointsMaterial.prototype = Object.create( Material.prototype );\nPointsMaterial.prototype.constructor = PointsMaterial;\n\nPointsMaterial.prototype.isPointsMaterial = true;\n\nPointsMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.size = source.size;\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Points( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Points';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\tthis.updateMorphTargets();\n\n}\n\nPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Points,\n\n\tisPoints: true,\n\n\traycast: ( function () {\n\n\t\tvar inverseMatrix = new Matrix4();\n\t\tvar ray = new Ray();\n\t\tvar sphere = new Sphere();\n\n\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\tvar object = this;\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\tsphere.applyMatrix4( matrixWorld );\n\t\t\tsphere.radius += threshold;\n\n\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t//\n\n\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\tvar position = new Vector3();\n\t\t\tvar intersectPoint = new Vector3();\n\n\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\tray.closestPointToPoint( point, intersectPoint );\n\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar index = geometry.index;\n\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}() ),\n\n\tupdateMorphTargets: function () {\n\n\t\tvar geometry = this.geometry;\n\t\tvar m, ml, name;\n\n\t\tvar morphAttributes = geometry.morphAttributes;\n\t\tvar keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tvar morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tname = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.format = format !== undefined ? format : RGBFormat;\n\n\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\tthis.generateMipmaps = false;\n\n}\n\nVideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {\n\n\tconstructor: VideoTexture,\n\n\tisVideoTexture: true,\n\n\tupdate: function () {\n\n\t\tvar video = this.image;\n\n\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { width: width, height: height };\n\tthis.mipmaps = mipmaps;\n\n\t// no flipping for cube textures\n\t// (also flipping doesn't work for compressed textures )\n\n\tthis.flipY = false;\n\n\t// can't generate mipmaps for compressed textures\n\t// mips must be embedded in DDS files\n\n\tthis.generateMipmaps = false;\n\n}\n\nCompressedTexture.prototype = Object.create( Texture.prototype );\nCompressedTexture.prototype.constructor = CompressedTexture;\n\nCompressedTexture.prototype.isCompressedTexture = true;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.needsUpdate = true;\n\n}\n\nCanvasTexture.prototype = Object.create( Texture.prototype );\nCanvasTexture.prototype.constructor = CanvasTexture;\nCanvasTexture.prototype.isCanvasTexture = true;\n\n/**\n * @author Matt DesLauriers / @mattdesl\n * @author atix / arthursilber.de\n */\n\nfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\tformat = format !== undefined ? format : DepthFormat;\n\n\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t}\n\n\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.image = { width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.flipY = false;\n\tthis.generateMipmaps\t= false;\n\n}\n\nDepthTexture.prototype = Object.create( Texture.prototype );\nDepthTexture.prototype.constructor = DepthTexture;\nDepthTexture.prototype.isDepthTexture = true;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction WireframeGeometry( geometry ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'WireframeGeometry';\n\n\t// buffer\n\n\tvar vertices = [];\n\n\t// helper variables\n\n\tvar i, j, l, o, ol;\n\tvar edge = [ 0, 0 ], edges = {}, e, edge1, edge2;\n\tvar key, keys = [ 'a', 'b', 'c' ];\n\tvar vertex;\n\n\t// different logic for Geometry and BufferGeometry\n\n\tif ( geometry && geometry.isGeometry ) {\n\n\t\t// create a data structure that contains all edges without duplicates\n\n\t\tvar faces = geometry.faces;\n\n\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\te = edges[ key ];\n\n\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\tvar position, indices, groups;\n\t\tvar group, start, count;\n\t\tvar index1, index2;\n\n\t\tvertex = new Vector3();\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\t// indexed BufferGeometry\n\n\t\t\tposition = geometry.attributes.position;\n\t\t\tindices = geometry.index;\n\t\t\tgroups = geometry.groups;\n\n\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t}\n\n\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\tstart = group.start;\n\t\t\t\tcount = group.count;\n\n\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tedge1 = indices.getX( i + j );\n\t\t\t\t\t\tedge2 = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// non-indexed BufferGeometry\n\n\t\t\tposition = geometry.attributes.position;\n\n\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\nWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n/**\n * @author zz85 / https://github.com/zz85\n * @author Mugen87 / https://github.com/Mugen87\n *\n * Parametric Surfaces Geometry\n * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n */\n\n// ParametricGeometry\n\nfunction ParametricGeometry( func, slices, stacks ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ParametricGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\tthis.mergeVertices();\n\n}\n\nParametricGeometry.prototype = Object.create( Geometry.prototype );\nParametricGeometry.prototype.constructor = ParametricGeometry;\n\n// ParametricBufferGeometry\n\nfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ParametricBufferGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\tvar EPS = 0.00001;\n\n\tvar normal = new Vector3();\n\n\tvar p0 = new Vector3(), p1 = new Vector3();\n\tvar pu = new Vector3(), pv = new Vector3();\n\n\tvar i, j;\n\n\tif ( func.length < 3 ) {\n\n\t\tconsole.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' );\n\n\t}\n\n\t// generate vertices, normals and uvs\n\n\tvar sliceCount = slices + 1;\n\n\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\tvar v = i / stacks;\n\n\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\tvar u = j / slices;\n\n\t\t\t// vertex\n\n\t\t\tfunc( u, v, p0 );\n\t\t\tvertices.push( p0.x, p0.y, p0.z );\n\n\t\t\t// normal\n\n\t\t\t// approximate tangent vectors via finite differences\n\n\t\t\tif ( u - EPS >= 0 ) {\n\n\t\t\t\tfunc( u - EPS, v, p1 );\n\t\t\t\tpu.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u + EPS, v, p1 );\n\t\t\t\tpu.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\tif ( v - EPS >= 0 ) {\n\n\t\t\t\tfunc( u, v - EPS, p1 );\n\t\t\t\tpv.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u, v + EPS, p1 );\n\t\t\t\tpv.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\t// cross product of tangent vectors returns surface normal\n\n\t\t\tnormal.crossVectors( pu, pv ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u, v );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\tvar a = i * sliceCount + j;\n\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t// faces one and two\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n/**\n * @author clockworkgeek / https://github.com/clockworkgeek\n * @author timothypratley / https://github.com/timothypratley\n * @author WestLangley / http://github.com/WestLangley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// PolyhedronGeometry\n\nfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PolyhedronGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\nPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n// PolyhedronBufferGeometry\n\nfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PolyhedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tradius = radius || 1;\n\tdetail = detail || 0;\n\n\t// default buffer data\n\n\tvar vertexBuffer = [];\n\tvar uvBuffer = [];\n\n\t// the subdivision creates the vertex buffer data\n\n\tsubdivide( detail );\n\n\t// all vertices should lie on a conceptual sphere with a given radius\n\n\tappplyRadius( radius );\n\n\t// finally, create the uv data\n\n\tgenerateUVs();\n\n\t// build non-indexed geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\tif ( detail === 0 ) {\n\n\t\tthis.computeVertexNormals(); // flat normals\n\n\t} else {\n\n\t\tthis.normalizeNormals(); // smooth normals\n\n\t}\n\n\t// helper functions\n\n\tfunction subdivide( detail ) {\n\n\t\tvar a = new Vector3();\n\t\tvar b = new Vector3();\n\t\tvar c = new Vector3();\n\n\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t// get the vertices of the face\n\n\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t// perform subdivision\n\n\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t}\n\n\t}\n\n\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\tvar cols = Math.pow( 2, detail );\n\n\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\tvar v = [];\n\n\t\tvar i, j;\n\n\t\t// construct all of the vertices for this subdivision\n\n\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\tv[ i ] = [];\n\n\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\tvar rows = cols - i;\n\n\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// construct all of the faces\n\n\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction appplyRadius( radius ) {\n\n\t\tvar vertex = new Vector3();\n\n\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tvar vertex = new Vector3();\n\n\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t}\n\n\t\tcorrectUVs();\n\n\t\tcorrectSeam();\n\n\t}\n\n\tfunction correctSeam() {\n\n\t\t// handle case when face straddles the seam, see #3269\n\n\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t// uv data of a single face\n\n\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction pushVertex( vertex ) {\n\n\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t}\n\n\tfunction getVertexByIndex( index, vertex ) {\n\n\t\tvar stride = index * 3;\n\n\t\tvertex.x = vertices[ stride + 0 ];\n\t\tvertex.y = vertices[ stride + 1 ];\n\t\tvertex.z = vertices[ stride + 2 ];\n\n\t}\n\n\tfunction correctUVs() {\n\n\t\tvar a = new Vector3();\n\t\tvar b = new Vector3();\n\t\tvar c = new Vector3();\n\n\t\tvar centroid = new Vector3();\n\n\t\tvar uvA = new Vector2();\n\t\tvar uvB = new Vector2();\n\t\tvar uvC = new Vector2();\n\n\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\tvar azi = azimuth( centroid );\n\n\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t}\n\n\t}\n\n\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t}\n\n\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t}\n\n\t}\n\n\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\tfunction azimuth( vector ) {\n\n\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t}\n\n\n\t// Angle above the XZ plane.\n\n\tfunction inclination( vector ) {\n\n\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t}\n\n}\n\nPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// TetrahedronGeometry\n\nfunction TetrahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TetrahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\nTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n// TetrahedronBufferGeometry\n\nfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\tvar vertices = [\n\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t];\n\n\tvar indices = [\n\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'TetrahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// OctahedronGeometry\n\nfunction OctahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'OctahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nOctahedronGeometry.prototype = Object.create( Geometry.prototype );\nOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n// OctahedronBufferGeometry\n\nfunction OctahedronBufferGeometry( radius, detail ) {\n\n\tvar vertices = [\n\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t];\n\n\tvar indices = [\n\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t1, 3, 4,\t1, 4, 2\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'OctahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n/**\n * @author timothypratley / https://github.com/timothypratley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// IcosahedronGeometry\n\nfunction IcosahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'IcosahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\nIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n// IcosahedronBufferGeometry\n\nfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\tvar vertices = [\n\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t 0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t t, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t];\n\n\tvar indices = [\n\t\t 0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t 1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t 3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t 4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'IcosahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n/**\n * @author Abe Pazos / https://hamoid.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// DodecahedronGeometry\n\nfunction DodecahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'DodecahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\nDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n// DodecahedronBufferGeometry\n\nfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\tvar r = 1 / t;\n\n\tvar vertices = [\n\n\t\t// (±1, ±1, ±1)\n\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t// (0, ±1/φ, ±φ)\n\t\t 0, - r, - t, 0, - r, t,\n\t\t 0, r, - t, 0, r, t,\n\n\t\t// (±1/φ, ±φ, 0)\n\t\t- r, - t, 0, - r, t, 0,\n\t\t r, - t, 0, r, t, 0,\n\n\t\t// (±φ, 0, ±1/φ)\n\t\t- t, 0, - r, t, 0, - r,\n\t\t- t, 0, r, t, 0, r\n\t];\n\n\tvar indices = [\n\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'DodecahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n/**\n * @author oosmoxiecode / https://github.com/oosmoxiecode\n * @author WestLangley / https://github.com/WestLangley\n * @author zz85 / https://github.com/zz85\n * @author miningold / https://github.com/miningold\n * @author jonobr1 / https://github.com/jonobr1\n * @author Mugen87 / https://github.com/Mugen87\n *\n */\n\n// TubeGeometry\n\nfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TubeGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = bufferGeometry.tangents;\n\tthis.normals = bufferGeometry.normals;\n\tthis.binormals = bufferGeometry.binormals;\n\n\t// create geometry\n\n\tthis.fromBufferGeometry( bufferGeometry );\n\tthis.mergeVertices();\n\n}\n\nTubeGeometry.prototype = Object.create( Geometry.prototype );\nTubeGeometry.prototype.constructor = TubeGeometry;\n\n// TubeBufferGeometry\n\nfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TubeBufferGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\ttubularSegments = tubularSegments || 64;\n\tradius = radius || 1;\n\tradialSegments = radialSegments || 8;\n\tclosed = closed || false;\n\n\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = frames.tangents;\n\tthis.normals = frames.normals;\n\tthis.binormals = frames.binormals;\n\n\t// helper variables\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\tvar uv = new Vector2();\n\tvar P = new Vector3();\n\n\tvar i, j;\n\n\t// buffer\n\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\tvar indices = [];\n\n\t// create buffer data\n\n\tgenerateBufferData();\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// functions\n\n\tfunction generateBufferData() {\n\n\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\tgenerateSegment( i );\n\n\t\t}\n\n\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t// at the regular position on the given path\n\t\t//\n\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t// uvs are generated in a separate function.\n\t\t// this makes it easy compute correct values for closed geometries\n\n\t\tgenerateUVs();\n\n\t\t// finally create faces\n\n\t\tgenerateIndices();\n\n\t}\n\n\tfunction generateSegment( i ) {\n\n\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t// retrieve corresponding normal and binormal\n\n\t\tvar N = frames.normals[ i ];\n\t\tvar B = frames.binormals[ i ];\n\n\t\t// generate normals and vertices for the current segment\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\tvar sin = Math.sin( v );\n\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t// normal\n\n\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\tnormal.normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\tfunction generateIndices() {\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\nTubeBufferGeometry.prototype.toJSON = function () {\n\n\tvar data = BufferGeometry.prototype.toJSON.call( this );\n\n\tdata.path = this.parameters.path.toJSON();\n\n\treturn data;\n\n};\n\n/**\n * @author oosmoxiecode\n * @author Mugen87 / https://github.com/Mugen87\n *\n * based on http://www.blackpawn.com/texts/pqtorus/\n */\n\n// TorusKnotGeometry\n\nfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusKnotGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\tthis.mergeVertices();\n\n}\n\nTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\nTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n// TorusKnotBufferGeometry\n\nfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusKnotBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\tp = p || 2;\n\tq = q || 3;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar i, j;\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\tvar P1 = new Vector3();\n\tvar P2 = new Vector3();\n\n\tvar B = new Vector3();\n\tvar T = new Vector3();\n\tvar N = new Vector3();\n\n\t// generate vertices, normals and uvs\n\n\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t// calculate orthonormal basis\n\n\t\tT.subVectors( P2, P1 );\n\t\tN.addVectors( P2, P1 );\n\t\tB.crossVectors( T, N );\n\t\tN.crossVectors( B, T );\n\n\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\tB.normalize();\n\t\tN.normalize();\n\n\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t// now calculate the final vertex position.\n\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// this function calculates the current position on the torus curve\n\n\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\tvar cu = Math.cos( u );\n\t\tvar su = Math.sin( u );\n\t\tvar quOverP = q / p * u;\n\t\tvar cs = Math.cos( quOverP );\n\n\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t}\n\n}\n\nTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n/**\n * @author oosmoxiecode\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// TorusGeometry\n\nfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\tthis.mergeVertices();\n\n}\n\nTorusGeometry.prototype = Object.create( Geometry.prototype );\nTorusGeometry.prototype.constructor = TorusGeometry;\n\n// TorusBufferGeometry\n\nfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\tarc = arc || Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar center = new Vector3();\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\tvar j, i;\n\n\t// generate vertices, normals and uvs\n\n\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tvar u = i / tubularSegments * arc;\n\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n * Port from https://github.com/mapbox/earcut (v2.1.5)\n */\n\nvar Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim ) {\n\n\t\tdim = dim || 2;\n\n\t\tvar hasHoles = holeIndices && holeIndices.length,\n\t\t\touterLen = hasHoles ? holeIndices[ 0 ] * dim : data.length,\n\t\t\touterNode = linkedList( data, 0, outerLen, dim, true ),\n\t\t\ttriangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tvar minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( var i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tvar i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tvar p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tvar stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( ear, triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tvar a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tvar p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tvar a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tvar minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\tvar minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\tvar p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tvar p = start;\n\tdo {\n\n\t\tvar a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn p;\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tvar a = start;\n\tdo {\n\n\t\tvar b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tvar c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tvar queue = [],\n\t\ti, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\tif ( outerNode ) {\n\n\t\tvar b = splitPolygon( outerNode, hole );\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tvar p = outerNode,\n\t\thx = hole.x,\n\t\thy = hole.y,\n\t\tqx = - Infinity,\n\t\tm;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tvar x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m.prev; // hole touches outer segment; pick lower endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tvar stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y,\n\t\ttanMin = Infinity,\n\t\ttan;\n\n\tp = m.next;\n\n\twhile ( p !== stop ) {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( ( tan < tanMin || ( tan === tanMin && p.x > m.x ) ) && locallyInside( p, hole ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t}\n\n\treturn m;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tvar p = start;\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tvar i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tvar p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t\t ( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t\t ( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) &&\n\t\t locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b );\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tif ( ( equals( p1, p2 ) && equals( q1, q2 ) ) ||\n\t\t( equals( p1, q2 ) && equals( p2, q1 ) ) ) return true;\n\treturn area( p1, q1, p2 ) > 0 !== area( p1, q1, q2 ) > 0 &&\n\t\t area( p2, q2, p1 ) > 0 !== area( p2, q2, q1 ) > 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tvar p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tvar p = a,\n\t\tinside = false,\n\t\tpx = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tvar a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tvar p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tvar sum = 0;\n\tfor ( var i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n */\n\nvar ShapeUtils = {\n\n\t// calculate area of the contour polygon\n\n\tarea: function ( contour ) {\n\n\t\tvar n = contour.length;\n\t\tvar a = 0.0;\n\n\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t},\n\n\tisClockWise: function ( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t},\n\n\ttriangulateShape: function ( contour, holes ) {\n\n\t\tvar vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tvar holeIndices = []; // array of hole indices\n\t\tvar faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tvar holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( var i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tvar triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( var i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n};\n\nfunction removeDupEndPts( points ) {\n\n\tvar l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( var i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\n// ExtrudeGeometry\n\nfunction ExtrudeGeometry( shapes, options ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ExtrudeGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tthis.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );\n\tthis.mergeVertices();\n\n}\n\nExtrudeGeometry.prototype = Object.create( Geometry.prototype );\nExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\nExtrudeGeometry.prototype.toJSON = function () {\n\n\tvar data = Geometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\tvar options = this.parameters.options;\n\n\treturn toJSON( shapes, options, data );\n\n};\n\n// ExtrudeBufferGeometry\n\nfunction ExtrudeBufferGeometry( shapes, options ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ExtrudeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\tvar scope = this;\n\n\tvar verticesArray = [];\n\tvar uvArray = [];\n\n\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\tvar shape = shapes[ i ];\n\t\taddShape( shape );\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\tthis.computeVertexNormals();\n\n\t// functions\n\n\tfunction addShape( shape ) {\n\n\t\tvar placeholder = [];\n\n\t\t// options\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\t\tvar depth = options.depth !== undefined ? options.depth : 100;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;\n\t\tvar bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar extrudePath = options.extrudePath;\n\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t// deprecated options\n\n\t\tif ( options.amount !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' );\n\t\t\tdepth = options.amount;\n\n\t\t}\n\n\t\t//\n\n\t\tvar extrudePts, extrudeByPath = false;\n\t\tvar splineTube, binormal, normal, position2;\n\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\t\t\tbevelOffset = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x,\n\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x,\n\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false; // assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [],\n\t\t\toneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize + bevelOffset;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tvar start = verticesArray.length / 3;\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar start = verticesArray.length / 3;\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0,\n\t\t\t\t\tsl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tplaceholder.push( x );\n\t\t\tplaceholder.push( y );\n\t\t\tplaceholder.push( z );\n\n\t\t}\n\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( d );\n\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\t\t\taddVertex( d );\n\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t}\n\n\t\tfunction addVertex( index ) {\n\n\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t}\n\n\n\t\tfunction addUV( vector2 ) {\n\n\t\t\tuvArray.push( vector2.x );\n\t\t\tuvArray.push( vector2.y );\n\n\t\t}\n\n\t}\n\n}\n\nExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;\n\nExtrudeBufferGeometry.prototype.toJSON = function () {\n\n\tvar data = BufferGeometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\tvar options = this.parameters.options;\n\n\treturn toJSON( shapes, options, data );\n\n};\n\n//\n\nvar WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tvar a_x = vertices[ indexA * 3 ];\n\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\tvar b_x = vertices[ indexB * 3 ];\n\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\tvar c_x = vertices[ indexC * 3 ];\n\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tvar a_x = vertices[ indexA * 3 ];\n\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\tvar a_z = vertices[ indexA * 3 + 2 ];\n\t\tvar b_x = vertices[ indexB * 3 ];\n\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\tvar b_z = vertices[ indexB * 3 + 2 ];\n\t\tvar c_x = vertices[ indexC * 3 ];\n\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\t\tvar c_z = vertices[ indexC * 3 + 2 ];\n\t\tvar d_x = vertices[ indexD * 3 ];\n\t\tvar d_y = vertices[ indexD * 3 + 1 ];\n\t\tvar d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < 0.01 ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n};\n\nfunction toJSON( shapes, options, data ) {\n\n\t//\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tvar shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\t//\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author alteredq / http://alteredqualia.com/\n *\n * Text = 3D Text\n *\n * parameters = {\n * font: , // font\n *\n * size: , // size of the text\n * height: , // thickness to extrude text\n * curveSegments: , // number of points on the curves\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into text bevel goes\n * bevelSize: , // how far from text outline (including bevelOffset) is bevel\n * bevelOffset: // how far from text outline does bevel start\n * }\n */\n\n// TextGeometry\n\nfunction TextGeometry( text, parameters ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TextGeometry';\n\n\tthis.parameters = {\n\t\ttext: text,\n\t\tparameters: parameters\n\t};\n\n\tthis.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );\n\tthis.mergeVertices();\n\n}\n\nTextGeometry.prototype = Object.create( Geometry.prototype );\nTextGeometry.prototype.constructor = TextGeometry;\n\n// TextBufferGeometry\n\nfunction TextBufferGeometry( text, parameters ) {\n\n\tparameters = parameters || {};\n\n\tvar font = parameters.font;\n\n\tif ( ! ( font && font.isFont ) ) {\n\n\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\treturn new Geometry();\n\n\t}\n\n\tvar shapes = font.generateShapes( text, parameters.size );\n\n\t// translate parameters to ExtrudeGeometry API\n\n\tparameters.depth = parameters.height !== undefined ? parameters.height : 50;\n\n\t// defaults\n\n\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\tExtrudeBufferGeometry.call( this, shapes, parameters );\n\n\tthis.type = 'TextBufferGeometry';\n\n}\n\nTextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );\nTextBufferGeometry.prototype.constructor = TextBufferGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author benaadams / https://twitter.com/ben_a_adams\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// SphereGeometry\n\nfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'SphereGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nSphereGeometry.prototype = Object.create( Geometry.prototype );\nSphereGeometry.prototype.constructor = SphereGeometry;\n\n// SphereBufferGeometry\n\nfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'SphereBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\n\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\tphiStart = phiStart !== undefined ? phiStart : 0;\n\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\tvar thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\tvar ix, iy;\n\n\tvar index = 0;\n\tvar grid = [];\n\n\tvar vertex = new Vector3();\n\tvar normal = new Vector3();\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\tvar verticesRow = [];\n\n\t\tvar v = iy / heightSegments;\n\n\t\t// special case for the poles\n\n\t\tvar uOffset = 0;\n\n\t\tif ( iy == 0 && thetaStart == 0 ) {\n\n\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t} else if ( iy == heightSegments && thetaEnd == Math.PI ) {\n\n\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t}\n\n\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\tvar u = ix / widthSegments;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormal.copy( vertex ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\tverticesRow.push( index ++ );\n\n\t\t}\n\n\t\tgrid.push( verticesRow );\n\n\t}\n\n\t// indices\n\n\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n/**\n * @author Kaleb Murphy\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// RingGeometry\n\nfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'RingGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nRingGeometry.prototype = Object.create( Geometry.prototype );\nRingGeometry.prototype.constructor = RingGeometry;\n\n// RingBufferGeometry\n\nfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'RingBufferGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tinnerRadius = innerRadius || 0.5;\n\touterRadius = outerRadius || 1;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// some helper variables\n\n\tvar segment;\n\tvar radius = innerRadius;\n\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\tvar j, i;\n\n\t// generate vertices, normals and uvs\n\n\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// increase the radius for next row of vertices\n\n\t\tradius += radiusStep;\n\n\t}\n\n\t// indices\n\n\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\tvar a = segment;\n\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\tvar d = segment + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n/**\n * @author zz85 / https://github.com/zz85\n * @author bhouston / http://clara.io\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// LatheGeometry\n\nfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'LatheGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\tthis.mergeVertices();\n\n}\n\nLatheGeometry.prototype = Object.create( Geometry.prototype );\nLatheGeometry.prototype.constructor = LatheGeometry;\n\n// LatheBufferGeometry\n\nfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'LatheBufferGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tsegments = Math.floor( segments ) || 12;\n\tphiStart = phiStart || 0;\n\tphiLength = phiLength || Math.PI * 2;\n\n\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar base;\n\tvar inverseSegments = 1.0 / segments;\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\tvar i, j;\n\n\t// generate vertices and uvs\n\n\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\tvar sin = Math.sin( phi );\n\t\tvar cos = Math.cos( phi );\n\n\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\tvertex.y = points[ j ].y;\n\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// uv\n\n\t\t\tuv.x = i / segments;\n\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\tbase = j + i * points.length;\n\n\t\t\tvar a = base;\n\t\t\tvar b = base + points.length;\n\t\t\tvar c = base + points.length + 1;\n\t\t\tvar d = base + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// generate normals\n\n\tthis.computeVertexNormals();\n\n\t// if the geometry is closed, we need to average the normals along the seam.\n\t// because the corresponding vertices are identical (but still have different UVs).\n\n\tif ( phiLength === Math.PI * 2 ) {\n\n\t\tvar normals = this.attributes.normal.array;\n\t\tvar n1 = new Vector3();\n\t\tvar n2 = new Vector3();\n\t\tvar n = new Vector3();\n\n\t\t// this is the buffer offset for the last line of vertices\n\n\t\tbase = segments * points.length * 3;\n\n\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t// select the normal of the vertex in the first line\n\n\t\t\tn1.x = normals[ j + 0 ];\n\t\t\tn1.y = normals[ j + 1 ];\n\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t// select the normal of the vertex in the last line\n\n\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t// average normals\n\n\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t// assign the new values to both normals\n\n\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t}\n\n\t}\n\n}\n\nLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n/**\n * @author jonobr1 / http://jonobr1.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// ShapeGeometry\n\nfunction ShapeGeometry( shapes, curveSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ShapeGeometry';\n\n\tif ( typeof curveSegments === 'object' ) {\n\n\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\tcurveSegments = curveSegments.curveSegments;\n\n\t}\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\tthis.mergeVertices();\n\n}\n\nShapeGeometry.prototype = Object.create( Geometry.prototype );\nShapeGeometry.prototype.constructor = ShapeGeometry;\n\nShapeGeometry.prototype.toJSON = function () {\n\n\tvar data = Geometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\n\treturn toJSON$1( shapes, data );\n\n};\n\n// ShapeBufferGeometry\n\nfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ShapeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tcurveSegments = curveSegments || 12;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar groupStart = 0;\n\tvar groupCount = 0;\n\n\t// allow single and array values for \"shapes\" parameter\n\n\tif ( Array.isArray( shapes ) === false ) {\n\n\t\taddShape( shapes );\n\n\t} else {\n\n\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\taddShape( shapes[ i ] );\n\n\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\tgroupStart += groupCount;\n\t\t\tgroupCount = 0;\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t// helper functions\n\n\tfunction addShape( shape ) {\n\n\t\tvar i, l, shapeHole;\n\n\t\tvar indexOffset = vertices.length / 3;\n\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\tvar shapeVertices = points.shape;\n\t\tvar shapeHoles = points.holes;\n\n\t\t// check direction of vertices\n\n\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t}\n\n\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t// join vertices of inner and outer paths to a single array\n\n\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t}\n\n\t\t// vertices, normals, uvs\n\n\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\tnormals.push( 0, 0, 1 );\n\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t}\n\n\t\t// incides\n\n\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\tindices.push( a, b, c );\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t}\n\n}\n\nShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\nShapeBufferGeometry.prototype.toJSON = function () {\n\n\tvar data = BufferGeometry.prototype.toJSON.call( this );\n\n\tvar shapes = this.parameters.shapes;\n\n\treturn toJSON$1( shapes, data );\n\n};\n\n//\n\nfunction toJSON$1( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( var i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tvar shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'EdgesGeometry';\n\n\tthis.parameters = {\n\t\tthresholdAngle: thresholdAngle\n\t};\n\n\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t// buffer\n\n\tvar vertices = [];\n\n\t// helper variables\n\n\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\tvar edge = [ 0, 0 ], edges = {}, edge1, edge2;\n\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t// prepare source geometry\n\n\tvar geometry2;\n\n\tif ( geometry.isBufferGeometry ) {\n\n\t\tgeometry2 = new Geometry();\n\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t} else {\n\n\t\tgeometry2 = geometry.clone();\n\n\t}\n\n\tgeometry2.mergeVertices();\n\tgeometry2.computeFaceNormals();\n\n\tvar sourceVertices = geometry2.vertices;\n\tvar faces = geometry2.faces;\n\n\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tvar face = faces[ i ];\n\n\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\tedge[ 0 ] = Math.min( edge1, edge2 );\n\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t} else {\n\n\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// generate vertices\n\n\tfor ( key in edges ) {\n\n\t\tvar e = edges[ key ];\n\n\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\nEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\n// CylinderGeometry\n\nfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CylinderGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCylinderGeometry.prototype = Object.create( Geometry.prototype );\nCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n// CylinderBufferGeometry\n\nfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CylinderBufferGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tvar scope = this;\n\n\tradiusTop = radiusTop !== undefined ? radiusTop : 1;\n\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 1;\n\theight = height || 1;\n\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\theightSegments = Math.floor( heightSegments ) || 1;\n\n\topenEnded = openEnded !== undefined ? openEnded : false;\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar index = 0;\n\tvar indexArray = [];\n\tvar halfHeight = height / 2;\n\tvar groupStart = 0;\n\n\t// generate geometry\n\n\tgenerateTorso();\n\n\tif ( openEnded === false ) {\n\n\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\tfunction generateTorso() {\n\n\t\tvar x, y;\n\t\tvar normal = new Vector3();\n\t\tvar vertex = new Vector3();\n\n\t\tvar groupCount = 0;\n\n\t\t// this will be used to calculate the normal\n\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tvar indexRow = [];\n\n\t\t\tvar v = y / heightSegments;\n\n\t\t\t// calculate the radius of the current row\n\n\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\t// now save vertices of the row in our index array\n\n\t\t\tindexArray.push( indexRow );\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t// update group counter\n\n\t\t\t\tgroupCount += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n\tfunction generateCap( top ) {\n\n\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\tvar uv = new Vector2();\n\t\tvar vertex = new Vector3();\n\n\t\tvar groupCount = 0;\n\n\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t// save the index of the first center vertex\n\t\tcenterIndexStart = index;\n\n\t\t// first we generate the center vertex data of the cap.\n\t\t// because the geometry needs one set of uvs per face,\n\t\t// we must generate a center vertex per face/segment\n\n\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// save the index of the last center vertex\n\n\t\tcenterIndexEnd = index;\n\n\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\tvar u = x / radialSegments;\n\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * sinTheta;\n\t\t\tvertex.y = halfHeight * sign;\n\t\t\tvertex.z = radius * cosTheta;\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tvar c = centerIndexStart + x;\n\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\tif ( top === true ) {\n\n\t\t\t\t// face top\n\n\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t} else {\n\n\t\t\t\t// face bottom\n\n\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t}\n\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n}\n\nCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n/**\n * @author abelnation / http://github.com/abelnation\n */\n\n// ConeGeometry\n\nfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\nConeGeometry.prototype.constructor = ConeGeometry;\n\n// ConeBufferGeometry\n\nfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\nConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n * @author Mugen87 / https://github.com/Mugen87\n * @author hughes\n */\n\n// CircleGeometry\n\nfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CircleGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCircleGeometry.prototype = Object.create( Geometry.prototype );\nCircleGeometry.prototype.constructor = CircleGeometry;\n\n// CircleBufferGeometry\n\nfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CircleBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tvar indices = [];\n\tvar vertices = [];\n\tvar normals = [];\n\tvar uvs = [];\n\n\t// helper variables\n\n\tvar i, s;\n\tvar vertex = new Vector3();\n\tvar uv = new Vector2();\n\n\t// center point\n\n\tvertices.push( 0, 0, 0 );\n\tnormals.push( 0, 0, 1 );\n\tuvs.push( 0.5, 0.5 );\n\n\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t// vertex\n\n\t\tvertex.x = radius * Math.cos( segment );\n\t\tvertex.y = radius * Math.sin( segment );\n\n\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t// normal\n\n\t\tnormals.push( 0, 0, 1 );\n\n\t\t// uvs\n\n\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\tuvs.push( uv.x, uv.y );\n\n\t}\n\n\t// indices\n\n\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\tindices.push( i, i + 1, 0 );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\tWireframeGeometry: WireframeGeometry,\n\tParametricGeometry: ParametricGeometry,\n\tParametricBufferGeometry: ParametricBufferGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeBufferGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusBufferGeometry,\n\tTextGeometry: TextGeometry,\n\tTextBufferGeometry: TextBufferGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereBufferGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingBufferGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneBufferGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheBufferGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeBufferGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeBufferGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeBufferGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderBufferGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleBufferGeometry,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxBufferGeometry\n});\n\n/**\n * @author mrdoob / http://mrdoob.com/\n *\n * parameters = {\n * color: \n * }\n */\n\nfunction ShadowMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShadowMaterial';\n\n\tthis.color = new Color( 0x000000 );\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nShadowMaterial.prototype = Object.create( Material.prototype );\nShadowMaterial.prototype.constructor = ShadowMaterial;\n\nShadowMaterial.prototype.isShadowMaterial = true;\n\nShadowMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction RawShaderMaterial( parameters ) {\n\n\tShaderMaterial.call( this, parameters );\n\n\tthis.type = 'RawShaderMaterial';\n\n}\n\nRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\nRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * color: ,\n * roughness: ,\n * metalness: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * roughnessMap: new THREE.Texture( ),\n *\n * metalnessMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * envMapIntensity: \n *\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshStandardMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.type = 'MeshStandardMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.roughness = 0.5;\n\tthis.metalness = 0.5;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.roughnessMap = null;\n\n\tthis.metalnessMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.envMapIntensity = 1.0;\n\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshStandardMaterial.prototype = Object.create( Material.prototype );\nMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\nMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\nMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.color.copy( source.color );\n\tthis.roughness = source.roughness;\n\tthis.metalness = source.metalness;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.roughnessMap = source.roughnessMap;\n\n\tthis.metalnessMap = source.metalnessMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.envMapIntensity = source.envMapIntensity;\n\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * reflectivity: \n * clearCoat: \n * clearCoatRoughness: \n * }\n */\n\nfunction MeshPhysicalMaterial( parameters ) {\n\n\tMeshStandardMaterial.call( this );\n\n\tthis.defines = { 'PHYSICAL': '' };\n\n\tthis.type = 'MeshPhysicalMaterial';\n\n\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\tthis.clearCoat = 0.0;\n\tthis.clearCoatRoughness = 0.0;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\nMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\nMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\nMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'PHYSICAL': '' };\n\n\tthis.reflectivity = source.reflectivity;\n\n\tthis.clearCoat = source.clearCoat;\n\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * specular: ,\n * shininess: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshPhongMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshPhongMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.specular = new Color( 0x111111 );\n\tthis.shininess = 30;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhongMaterial.prototype = Object.create( Material.prototype );\nMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\nMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\nMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.specular.copy( source.specular );\n\tthis.shininess = source.shininess;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author takahirox / http://github.com/takahirox\n *\n * parameters = {\n * gradientMap: new THREE.Texture( )\n * }\n */\n\nfunction MeshToonMaterial( parameters ) {\n\n\tMeshPhongMaterial.call( this );\n\n\tthis.defines = { 'TOON': '' };\n\n\tthis.type = 'MeshToonMaterial';\n\n\tthis.gradientMap = null;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\nMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\nMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\nMeshToonMaterial.prototype.copy = function ( source ) {\n\n\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\tthis.gradientMap = source.gradientMap;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * opacity: ,\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshNormalMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshNormalMaterial';\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\tthis.lights = false;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshNormalMaterial.prototype = Object.create( Material.prototype );\nMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\nMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\nMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshLambertMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshLambertMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshLambertMaterial.prototype = Object.create( Material.prototype );\nMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\nMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\nMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * matcap: new THREE.Texture( ),\n *\n * map: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * alphaMap: new THREE.Texture( ),\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshMatcapMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'MATCAP': '' };\n\n\tthis.type = 'MeshMatcapMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.matcap = null;\n\n\tthis.map = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.alphaMap = null;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.lights = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshMatcapMaterial.prototype = Object.create( Material.prototype );\nMeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial;\n\nMeshMatcapMaterial.prototype.isMeshMatcapMaterial = true;\n\nMeshMatcapMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'MATCAP': '' };\n\n\tthis.color.copy( source.color );\n\n\tthis.matcap = source.matcap;\n\n\tthis.map = source.map;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n *\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n *\n * scale: ,\n * dashSize: ,\n * gapSize: \n * }\n */\n\nfunction LineDashedMaterial( parameters ) {\n\n\tLineBasicMaterial.call( this );\n\n\tthis.type = 'LineDashedMaterial';\n\n\tthis.scale = 1;\n\tthis.dashSize = 3;\n\tthis.gapSize = 1;\n\n\tthis.setValues( parameters );\n\n}\n\nLineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );\nLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\nLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\nLineDashedMaterial.prototype.copy = function ( source ) {\n\n\tLineBasicMaterial.prototype.copy.call( this, source );\n\n\tthis.scale = source.scale;\n\tthis.dashSize = source.dashSize;\n\tthis.gapSize = source.gapSize;\n\n\treturn this;\n\n};\n\n\n\nvar Materials = /*#__PURE__*/Object.freeze({\n\tShadowMaterial: ShadowMaterial,\n\tSpriteMaterial: SpriteMaterial,\n\tRawShaderMaterial: RawShaderMaterial,\n\tShaderMaterial: ShaderMaterial,\n\tPointsMaterial: PointsMaterial,\n\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\tMeshStandardMaterial: MeshStandardMaterial,\n\tMeshPhongMaterial: MeshPhongMaterial,\n\tMeshToonMaterial: MeshToonMaterial,\n\tMeshNormalMaterial: MeshNormalMaterial,\n\tMeshLambertMaterial: MeshLambertMaterial,\n\tMeshDepthMaterial: MeshDepthMaterial,\n\tMeshDistanceMaterial: MeshDistanceMaterial,\n\tMeshBasicMaterial: MeshBasicMaterial,\n\tMeshMatcapMaterial: MeshMatcapMaterial,\n\tLineDashedMaterial: LineDashedMaterial,\n\tLineBasicMaterial: LineBasicMaterial,\n\tMaterial: Material\n});\n\n/**\n * @author tschw\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n */\n\nvar AnimationUtils = {\n\n\t// same as Array.prototype.slice, but also works on typed arrays\n\tarraySlice: function ( array, from, to ) {\n\n\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t}\n\n\t\treturn array.slice( from, to );\n\n\t},\n\n\t// converts an array to a specific type\n\tconvertArray: function ( array, type, forceClone ) {\n\n\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\treturn new type( array ); // create typed array\n\n\t\t}\n\n\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t},\n\n\tisTypedArray: function ( object ) {\n\n\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t! ( object instanceof DataView );\n\n\t},\n\n\t// returns an array by which times and values can be sorted\n\tgetKeyframeOrder: function ( times ) {\n\n\t\tfunction compareTime( i, j ) {\n\n\t\t\treturn times[ i ] - times[ j ];\n\n\t\t}\n\n\t\tvar n = times.length;\n\t\tvar result = new Array( n );\n\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\tresult.sort( compareTime );\n\n\t\treturn result;\n\n\t},\n\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\tsortedArray: function ( values, stride, order ) {\n\n\t\tvar nValues = values.length;\n\t\tvar result = new values.constructor( nValues );\n\n\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// function for parsing AOS keyframe formats\n\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t}\n\n\t\tif ( key === undefined ) return; // no data\n\n\t\tvar value = key[ valuePropertyName ];\n\t\tif ( value === undefined ) return; // no data\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t// ...assume THREE.Math-ish\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else {\n\n\t\t\t// otherwise push as-is\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t}\n\n\t}\n\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n * @author tschw\n */\n\nfunction Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tthis.parameterPositions = parameterPositions;\n\tthis._cachedIndex = 0;\n\n\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\tthis.sampleValues = sampleValues;\n\tthis.valueSize = sampleSize;\n\n}\n\nObject.assign( Interpolant.prototype, {\n\n\tevaluate: function ( t ) {\n\n\t\tvar pp = this.parameterPositions,\n\t\t\ti1 = this._cachedIndex,\n\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tvar right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t},\n\n\tsettings: null, // optional, subclass-specific settings structure\n\t// Note: The indirection allows central control of many interpolants.\n\n\t// --- Protected interface\n\n\tDefaultSettings_: {},\n\n\tgetSettings_: function () {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t},\n\n\tcopySampleValue_: function ( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// Template methods for derived classes:\n\n\tinterpolate_: function ( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t},\n\n\tintervalChanged_: function ( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n} );\n\n//!\\ DECLARE ALIAS AFTER assign prototype !\nObject.assign( Interpolant.prototype, {\n\n\t//( 0, t, t0 ), returns this.resultBuffer\n\tbeforeStart_: Interpolant.prototype.copySampleValue_,\n\n\t//( N-1, tN-1, t ), returns this.resultBuffer\n\tafterEnd_: Interpolant.prototype.copySampleValue_,\n\n} );\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @author tschw\n */\n\nfunction CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\tthis._weightPrev = - 0;\n\tthis._offsetPrev = - 0;\n\tthis._weightNext = - 0;\n\tthis._offsetNext = - 0;\n\n}\n\nCubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: CubicInterpolant,\n\n\tDefaultSettings_: {\n\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\n\t},\n\n\tintervalChanged_: function ( i1, t0, t1 ) {\n\n\t\tvar pp = this.parameterPositions,\n\t\t\tiPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t},\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tvar sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tvar s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tvar s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tvar sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n * @author tschw\n */\n\nfunction LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: LinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceeding\n * the parameter.\n *\n * @author tschw\n */\n\nfunction DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nDiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: DiscreteInterpolant,\n\n\tinterpolate_: function ( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n} );\n\n/**\n *\n * A timed sequence of keyframes for a specific property.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\tthis.name = name;\n\n\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n}\n\n// Static methods\n\nObject.assign( KeyframeTrack, {\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\ttoJSON: function ( track ) {\n\n\t\tvar trackType = track.constructor;\n\n\t\tvar json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n} );\n\nObject.assign( KeyframeTrack.prototype, {\n\n\tconstructor: KeyframeTrack,\n\n\tTimeBufferType: Float32Array,\n\n\tValueBufferType: Float32Array,\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tsetInterpolation: function ( interpolation ) {\n\n\t\tvar factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t},\n\n\tgetInterpolation: function () {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t},\n\n\tgetValueSize: function () {\n\n\t\treturn this.values.length / this.times.length;\n\n\t},\n\n\t// move all keyframes either forwards or backwards in time\n\tshift: function ( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tvar times = this.times;\n\n\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale: function ( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tvar times = this.times;\n\n\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim: function ( startTime, endTime ) {\n\n\t\tvar times = this.times,\n\t\t\tnKeys = times.length,\n\t\t\tfrom = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\tvar stride = this.getValueSize();\n\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\tthis.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate: function () {\n\n\t\tvar valid = true;\n\n\t\tvar valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tvar times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tvar prevTime = null;\n\n\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tvar currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize: function () {\n\n\t\tvar times = this.times,\n\t\t\tvalues = this.values,\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\twriteIndex = 1,\n\t\t\tlastIndex = times.length - 1;\n\n\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tvar keep = false;\n\n\t\t\tvar time = times[ i ];\n\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\tvar times = AnimationUtils.arraySlice( this.times, 0 );\n\t\tvar values = AnimationUtils.arraySlice( this.values, 0 );\n\n\t\tvar TypedKeyframeTrack = this.constructor;\n\t\tvar track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n} );\n\n/**\n *\n * A Track of Boolean keyframe values.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction BooleanKeyframeTrack( name, times, values ) {\n\n\tKeyframeTrack.call( this, name, times, values );\n\n}\n\nBooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: BooleanKeyframeTrack,\n\n\tValueTypeName: 'bool',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\tInterpolantFactoryMethodSmooth: undefined\n\n\t// Note: Actually this track could have a optimized / compressed\n\t// representation of a single value and a custom interpolant that\n\t// computes \"firstValue ^ isOdd( index )\".\n\n} );\n\n/**\n *\n * A Track of keyframe values that represent color.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: ColorKeyframeTrack,\n\n\tValueTypeName: 'color'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n\t// Note: Very basic implementation and nothing special yet.\n\t// However, this is the place for color space parameterization.\n\n} );\n\n/**\n *\n * A Track of numeric keyframe values.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nNumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: NumberKeyframeTrack,\n\n\tValueTypeName: 'number'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @author tschw\n */\n\nfunction QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nQuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: QuaternionLinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset = i1 * stride,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * A Track of quaternion keyframe values.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nQuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: QuaternionKeyframeTrack,\n\n\tValueTypeName: 'quaternion',\n\n\t// ValueBufferType is inherited\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n} );\n\n/**\n *\n * A Track that interpolates Strings\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nStringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: StringKeyframeTrack,\n\n\tValueTypeName: 'string',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\n\tInterpolantFactoryMethodSmooth: undefined\n\n} );\n\n/**\n *\n * A Track of vectored keyframe values.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nVectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: VectorKeyframeTrack,\n\n\tValueTypeName: 'vector'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n *\n * Reusable set of Tracks that represent an animation.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n */\n\nfunction AnimationClip( name, duration, tracks ) {\n\n\tthis.name = name;\n\tthis.tracks = tracks;\n\tthis.duration = ( duration !== undefined ) ? duration : - 1;\n\n\tthis.uuid = _Math.generateUUID();\n\n\t// this means it should figure out its duration by scanning the tracks\n\tif ( this.duration < 0 ) {\n\n\t\tthis.resetDuration();\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tvar trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tvar times = [], values = [];\n\n\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nObject.assign( AnimationClip, {\n\n\tparse: function ( json ) {\n\n\t\tvar tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t},\n\n\ttoJSON: function ( clip ) {\n\n\t\tvar tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tvar json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid\n\n\t\t};\n\n\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t},\n\n\tCreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\tvar tracks = [];\n\n\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tvar times = [];\n\t\t\tvar values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( name, - 1, tracks );\n\n\t},\n\n\tfindByName: function ( objectOrClipArray, name ) {\n\n\t\tvar clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tvar o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\tCreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {\n\n\t\tvar animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar clips = [];\n\n\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t},\n\n\t// parse the animation.hierarchy format\n\tparseAnimation: function ( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tvar tracks = [];\n\n\t\tvar clipName = animation.name || 'default';\n\t\t// automatic length determination in AnimationClip.\n\t\tvar duration = animation.length || - 1;\n\t\tvar fps = animation.fps || 30;\n\n\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tvar morphTargetNames = {};\n\n\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tfor ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tvar animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\treturn clip;\n\n\t}\n\n} );\n\nObject.assign( AnimationClip.prototype, {\n\n\tresetDuration: function () {\n\n\t\tvar tracks = this.tracks, duration = 0;\n\n\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tvar track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t},\n\n\ttrim: function () {\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tvalidate: function () {\n\n\t\tvar valid = true;\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\toptimize: function () {\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\n\tclone: function () {\n\n\t\tvar tracks = [];\n\n\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new AnimationClip( this.name, this.duration, tracks );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\tvar scope = this;\n\n\tvar isLoading = false;\n\tvar itemsLoaded = 0;\n\tvar itemsTotal = 0;\n\tvar urlModifier = undefined;\n\n\t// Refer to #5689 for the reason why we don't set .onStart\n\t// in the constructor\n\n\tthis.onStart = undefined;\n\tthis.onLoad = onLoad;\n\tthis.onProgress = onProgress;\n\tthis.onError = onError;\n\n\tthis.itemStart = function ( url ) {\n\n\t\titemsTotal ++;\n\n\t\tif ( isLoading === false ) {\n\n\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tisLoading = true;\n\n\t};\n\n\tthis.itemEnd = function ( url ) {\n\n\t\titemsLoaded ++;\n\n\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t}\n\n\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\tisLoading = false;\n\n\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\tscope.onLoad();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.itemError = function ( url ) {\n\n\t\tif ( scope.onError !== undefined ) {\n\n\t\t\tscope.onError( url );\n\n\t\t}\n\n\t};\n\n\tthis.resolveURL = function ( url ) {\n\n\t\tif ( urlModifier ) {\n\n\t\t\treturn urlModifier( url );\n\n\t\t}\n\n\t\treturn url;\n\n\t};\n\n\tthis.setURLModifier = function ( transform ) {\n\n\t\turlModifier = transform;\n\t\treturn this;\n\n\t};\n\n}\n\nvar DefaultLoadingManager = new LoadingManager();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar loading = {};\n\nfunction FileLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( FileLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Check for data: URI\n\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\tif ( dataUriRegexResult ) {\n\n\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\tdata = decodeURIComponent( data );\n\n\t\t\tif ( isBase64 ) data = atob( data );\n\n\t\t\ttry {\n\n\t\t\t\tvar response;\n\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\tvar view = new Uint8Array( data.length );\n\n\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\tresponse = new Blob( [ view.buffer ], { type: mimeType } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tresponse = view.buffer;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Initialise array for duplicate requests\n\n\t\t\tloading[ url ] = [];\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\tvar request = new XMLHttpRequest();\n\n\t\t\trequest.open( 'GET', url, true );\n\n\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\tvar response = this.response;\n\n\t\t\t\tCache.add( url, response );\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tif ( this.status === 200 || this.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( response );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'abort', function ( event ) {\n\n\t\t\t\tvar callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( var i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\tfor ( var header in this.requestHeader ) {\n\n\t\t\t\trequest.setRequestHeader( header, this.requestHeader[ header ] );\n\n\t\t\t}\n\n\t\t\trequest.send( null );\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\treturn request;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t},\n\n\tsetResponseType: function ( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t},\n\n\tsetWithCredentials: function ( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t},\n\n\tsetMimeType: function ( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t},\n\n\tsetRequestHeader: function ( value ) {\n\n\t\tthis.requestHeader = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io/\n */\n\nfunction AnimationLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( AnimationLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tvar animations = [];\n\n\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n *\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n */\n\nfunction CompressedTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t// override in sub classes\n\tthis._parser = null;\n\n}\n\nObject.assign( CompressedTextureLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar images = [];\n\n\t\tvar texture = new CompressedTexture();\n\t\ttexture.image = images;\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author Nikos M. / https://github.com/foo123/\n *\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n */\n\nfunction DataTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t// override in sub classes\n\tthis._parser = null;\n\n}\n\nObject.assign( DataTextureLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texture = new DataTexture();\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction ImageLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( ImageLoader.prototype, {\n\n\tcrossOrigin: 'anonymous',\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.substr( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction CubeTextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( CubeTextureLoader.prototype, {\n\n\tcrossOrigin: 'anonymous',\n\n\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\tvar texture = new CubeTexture();\n\n\t\tvar loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tvar loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction TextureLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( TextureLoader.prototype, {\n\n\tcrossOrigin: 'anonymous',\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar texture = new Texture();\n\n\t\tvar loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\n\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\tvar isJPEG = url.search( /\\.jpe?g($|\\?)/i ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Extensible curve object\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\n/**************************************************************\n *\tAbstract Curve base class\n **************************************************************/\n\nfunction Curve() {\n\n\tthis.type = 'Curve';\n\n\tthis.arcLengthDivisions = 200;\n\n}\n\nObject.assign( Curve.prototype, {\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint: function ( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t},\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt: function ( u, optionalTarget ) {\n\n\t\tvar t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t},\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tvar points = [];\n\n\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tvar points = [];\n\n\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get total curve arc length\n\n\tgetLength: function () {\n\n\t\tvar lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t},\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = this.arcLengthDivisions;\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tvar cache = [];\n\t\tvar current, last = this.getPoint( 0 );\n\t\tvar p, sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t},\n\n\tupdateArcLengths: function () {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t},\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping: function ( u, distance ) {\n\n\t\tvar arcLengths = this.getLengths();\n\n\t\tvar i = 0, il = arcLengths.length;\n\n\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tvar low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tvar lengthBefore = arcLengths[ i ];\n\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t},\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent: function ( t ) {\n\n\t\tvar delta = 0.0001;\n\t\tvar t1 = t - delta;\n\t\tvar t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tvar pt1 = this.getPoint( t1 );\n\t\tvar pt2 = this.getPoint( t2 );\n\n\t\tvar vec = pt2.clone().sub( pt1 );\n\t\treturn vec.normalize();\n\n\t},\n\n\tgetTangentAt: function ( u ) {\n\n\t\tvar t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t );\n\n\t},\n\n\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tvar normal = new Vector3();\n\n\t\tvar tangents = [];\n\t\tvar normals = [];\n\t\tvar binormals = [];\n\n\t\tvar vec = new Vector3();\n\t\tvar mat = new Matrix4();\n\n\t\tvar i, u, theta;\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tu = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\ttangents[ i ].normalize();\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tvar min = Number.MAX_VALUE;\n\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'EllipseCurve';\n\n\tthis.aX = aX || 0;\n\tthis.aY = aY || 0;\n\n\tthis.xRadius = xRadius || 1;\n\tthis.yRadius = yRadius || 1;\n\n\tthis.aStartAngle = aStartAngle || 0;\n\tthis.aEndAngle = aEndAngle || 2 * Math.PI;\n\n\tthis.aClockwise = aClockwise || false;\n\n\tthis.aRotation = aRotation || 0;\n\n}\n\nEllipseCurve.prototype = Object.create( Curve.prototype );\nEllipseCurve.prototype.constructor = EllipseCurve;\n\nEllipseCurve.prototype.isEllipseCurve = true;\n\nEllipseCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar twoPi = Math.PI * 2;\n\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t// ensures that deltaAngle is 0 .. 2 PI\n\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\tif ( samePoints ) {\n\n\t\t\tdeltaAngle = 0;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = twoPi;\n\n\t\t}\n\n\t}\n\n\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\tdeltaAngle = - twoPi;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t}\n\n\t}\n\n\tvar angle = this.aStartAngle + t * deltaAngle;\n\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\tif ( this.aRotation !== 0 ) {\n\n\t\tvar cos = Math.cos( this.aRotation );\n\t\tvar sin = Math.sin( this.aRotation );\n\n\t\tvar tx = x - this.aX;\n\t\tvar ty = y - this.aY;\n\n\t\t// Rotate the point about the center of the ellipse.\n\t\tx = tx * cos - ty * sin + this.aX;\n\t\ty = tx * sin + ty * cos + this.aY;\n\n\t}\n\n\treturn point.set( x, y );\n\n};\n\nEllipseCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.aX = source.aX;\n\tthis.aY = source.aY;\n\n\tthis.xRadius = source.xRadius;\n\tthis.yRadius = source.yRadius;\n\n\tthis.aStartAngle = source.aStartAngle;\n\tthis.aEndAngle = source.aEndAngle;\n\n\tthis.aClockwise = source.aClockwise;\n\n\tthis.aRotation = source.aRotation;\n\n\treturn this;\n\n};\n\n\nEllipseCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.aX = this.aX;\n\tdata.aY = this.aY;\n\n\tdata.xRadius = this.xRadius;\n\tdata.yRadius = this.yRadius;\n\n\tdata.aStartAngle = this.aStartAngle;\n\tdata.aEndAngle = this.aEndAngle;\n\n\tdata.aClockwise = this.aClockwise;\n\n\tdata.aRotation = this.aRotation;\n\n\treturn data;\n\n};\n\nEllipseCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.aX = json.aX;\n\tthis.aY = json.aY;\n\n\tthis.xRadius = json.xRadius;\n\tthis.yRadius = json.yRadius;\n\n\tthis.aStartAngle = json.aStartAngle;\n\tthis.aEndAngle = json.aEndAngle;\n\n\tthis.aClockwise = json.aClockwise;\n\n\tthis.aRotation = json.aRotation;\n\n\treturn this;\n\n};\n\nfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\tthis.type = 'ArcCurve';\n\n}\n\nArcCurve.prototype = Object.create( EllipseCurve.prototype );\nArcCurve.prototype.constructor = ArcCurve;\n\nArcCurve.prototype.isArcCurve = true;\n\n/**\n * @author zz85 https://github.com/zz85\n *\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tvar t2 = t * t;\n\t\t\tvar t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nvar tmp = new Vector3();\nvar px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly();\n\nfunction CatmullRomCurve3( points, closed, curveType, tension ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CatmullRomCurve3';\n\n\tthis.points = points || [];\n\tthis.closed = closed || false;\n\tthis.curveType = curveType || 'centripetal';\n\tthis.tension = tension || 0.5;\n\n}\n\nCatmullRomCurve3.prototype = Object.create( Curve.prototype );\nCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\nCatmullRomCurve3.prototype.isCatmullRomCurve3 = true;\n\nCatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar points = this.points;\n\tvar l = points.length;\n\n\tvar p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\tvar intPoint = Math.floor( p );\n\tvar weight = p - intPoint;\n\n\tif ( this.closed ) {\n\n\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\tintPoint = l - 2;\n\t\tweight = 1;\n\n\t}\n\n\tvar p0, p1, p2, p3; // 4 points\n\n\tif ( this.closed || intPoint > 0 ) {\n\n\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate first point\n\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\tp0 = tmp;\n\n\t}\n\n\tp1 = points[ intPoint % l ];\n\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate last point\n\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\tp3 = tmp;\n\n\t}\n\n\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t// init Centripetal / Chordal Catmull-Rom\n\t\tvar pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t// safety check for repeated points\n\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t}\n\n\tpoint.set(\n\t\tpx.calc( weight ),\n\t\tpy.calc( weight ),\n\t\tpz.calc( weight )\n\t);\n\n\treturn point;\n\n};\n\nCatmullRomCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tvar point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\tthis.closed = source.closed;\n\tthis.curveType = source.curveType;\n\tthis.tension = source.tension;\n\n\treturn this;\n\n};\n\nCatmullRomCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( var i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tvar point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\tdata.closed = this.closed;\n\tdata.curveType = this.curveType;\n\tdata.tension = this.tension;\n\n\treturn data;\n\n};\n\nCatmullRomCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tvar point = json.points[ i ];\n\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t}\n\n\tthis.closed = json.closed;\n\tthis.curveType = json.curveType;\n\tthis.tension = json.tension;\n\n\treturn this;\n\n};\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n * Bezier Curves formulas obtained from\n * http://en.wikipedia.org/wiki/Bézier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tvar v0 = ( p2 - p0 ) * 0.5;\n\tvar v1 = ( p3 - p1 ) * 0.5;\n\tvar t2 = t * t;\n\tvar t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tvar k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tvar k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tvar k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\tthis.v3 = v3 || new Vector2();\n\n}\n\nCubicBezierCurve.prototype = Object.create( Curve.prototype );\nCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\nCubicBezierCurve.prototype.isCubicBezierCurve = true;\n\nCubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\tthis.v3 = v3 || new Vector3();\n\n}\n\nCubicBezierCurve3.prototype = Object.create( Curve.prototype );\nCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nCubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction LineCurve( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve';\n\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nLineCurve.prototype = Object.create( Curve.prototype );\nLineCurve.prototype.constructor = LineCurve;\n\nLineCurve.prototype.isLineCurve = true;\n\nLineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve.prototype.getTangent = function ( /* t */ ) {\n\n\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\treturn tangent.normalize();\n\n};\n\nLineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction LineCurve3( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve3';\n\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nLineCurve3.prototype = Object.create( Curve.prototype );\nLineCurve3.prototype.constructor = LineCurve3;\n\nLineCurve3.prototype.isLineCurve3 = true;\n\nLineCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve3.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\nQuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;\n\nQuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nQuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve3.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'SplineCurve';\n\n\tthis.points = points || [];\n\n}\n\nSplineCurve.prototype = Object.create( Curve.prototype );\nSplineCurve.prototype.constructor = SplineCurve;\n\nSplineCurve.prototype.isSplineCurve = true;\n\nSplineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector2();\n\n\tvar points = this.points;\n\tvar p = ( points.length - 1 ) * t;\n\n\tvar intPoint = Math.floor( p );\n\tvar weight = p - intPoint;\n\n\tvar p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\tvar p1 = points[ intPoint ];\n\tvar p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\tvar p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\tpoint.set(\n\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t);\n\n\treturn point;\n\n};\n\nSplineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tvar point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\treturn this;\n\n};\n\nSplineCurve.prototype.toJSON = function () {\n\n\tvar data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( var i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tvar point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\treturn data;\n\n};\n\nSplineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( var i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tvar point = json.points[ i ];\n\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t}\n\n\treturn this;\n\n};\n\n\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n *\n **/\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nfunction CurvePath() {\n\n\tCurve.call( this );\n\n\tthis.type = 'CurvePath';\n\n\tthis.curves = [];\n\tthis.autoClose = false; // Automatically closes the path\n\n}\n\nCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\tconstructor: CurvePath,\n\n\tadd: function ( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t},\n\n\tclosePath: function () {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t},\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint: function ( t ) {\n\n\t\tvar d = t * this.getLength();\n\t\tvar curveLengths = this.getCurveLengths();\n\t\tvar i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurve.prototype.copy.call( this, source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( var i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = Curve.prototype.toJSON.call( this );\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( var i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurve.prototype.fromJSON.call( this, json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( var i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tvar curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Creates free form 2d path using series of points, lines or curves.\n **/\n\nfunction Path( points ) {\n\n\tCurvePath.call( this );\n\n\tthis.type = 'Path';\n\n\tthis.currentPoint = new Vector2();\n\n\tif ( points ) {\n\n\t\tthis.setFromPoints( points );\n\n\t}\n\n}\n\nPath.prototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\tconstructor: Path,\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( var i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t},\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tvar curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tvar curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t},\n\n\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tvar curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t},\n\n\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tvar x0 = this.currentPoint.x;\n\t\tvar y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t},\n\n\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t},\n\n\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tvar x0 = this.currentPoint.x;\n\t\tvar y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t},\n\n\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tvar lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurvePath.prototype.copy.call( this, source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = CurvePath.prototype.toJSON.call( this );\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurvePath.prototype.fromJSON.call( this, json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * Defines a 2d shape plane using paths.\n **/\n\n// STEP 1 Create a path.\n// STEP 2 Turn path into shape.\n// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n// STEP 3a - Extract points from each shape, turn to vertices\n// STEP 3b - Triangulate each shape, add faces.\n\nfunction Shape( points ) {\n\n\tPath.call( this, points );\n\n\tthis.uuid = _Math.generateUUID();\n\n\tthis.type = 'Shape';\n\n\tthis.holes = [];\n\n}\n\nShape.prototype = Object.assign( Object.create( Path.prototype ), {\n\n\tconstructor: Shape,\n\n\tgetPointsHoles: function ( divisions ) {\n\n\t\tvar holesPts = [];\n\n\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t},\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints: function ( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tPath.prototype.copy.call( this, source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( var i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = Path.prototype.toJSON.call( this );\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tPath.prototype.fromJSON.call( this, json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( var i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tvar hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Light( color, intensity ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Light';\n\n\tthis.color = new Color( color );\n\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\tthis.receiveShadow = undefined;\n\n}\n\nLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Light,\n\n\tisLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\tLight.call( this, skyColor, intensity );\n\n\tthis.type = 'HemisphereLight';\n\n\tthis.castShadow = undefined;\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.groundColor = new Color( groundColor );\n\n}\n\nHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: HemisphereLight,\n\n\tisHemisphereLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction LightShadow( camera ) {\n\n\tthis.camera = camera;\n\n\tthis.bias = 0;\n\tthis.radius = 1;\n\n\tthis.mapSize = new Vector2( 512, 512 );\n\n\tthis.map = null;\n\tthis.matrix = new Matrix4();\n\n}\n\nObject.assign( LightShadow.prototype, {\n\n\tcopy: function ( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction SpotLightShadow() {\n\n\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n}\n\nSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: SpotLightShadow,\n\n\tisSpotLightShadow: true,\n\n\tupdate: function ( light ) {\n\n\t\tvar camera = this.camera;\n\n\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\tvar far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'SpotLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / Math.PI;\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new SpotLightShadow();\n\n}\n\nSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: SpotLight,\n\n\tisSpotLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction PointLight( color, intensity, distance, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'PointLight';\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n}\n\nPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: PointLight,\n\n\tisPointLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author arose / http://github.com/arose\n */\n\nfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'OrthographicCamera';\n\n\tthis.zoom = 1;\n\tthis.view = null;\n\n\tthis.left = ( left !== undefined ) ? left : - 1;\n\tthis.right = ( right !== undefined ) ? right : 1;\n\tthis.top = ( top !== undefined ) ? top : 1;\n\tthis.bottom = ( bottom !== undefined ) ? bottom : - 1;\n\n\tthis.near = ( near !== undefined ) ? near : 0.1;\n\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\tthis.updateProjectionMatrix();\n\n}\n\nOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: OrthographicCamera,\n\n\tisOrthographicCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t},\n\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tvar cx = ( this.right + this.left ) / 2;\n\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\tvar left = cx - dx;\n\t\tvar right = cx + dx;\n\t\tvar top = cy + dy;\n\t\tvar bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.getInverse( this.projectionMatrix );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction DirectionalLightShadow( ) {\n\n\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n}\n\nDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: DirectionalLightShadow\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction DirectionalLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'DirectionalLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tthis.shadow = new DirectionalLightShadow();\n\n}\n\nDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: DirectionalLight,\n\n\tisDirectionalLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AmbientLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'AmbientLight';\n\n\tthis.castShadow = undefined;\n\n}\n\nAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: AmbientLight,\n\n\tisAmbientLight: true\n\n} );\n\n/**\n * @author abelnation / http://github.com/abelnation\n */\n\nfunction RectAreaLight( color, intensity, width, height ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'RectAreaLight';\n\n\tthis.width = ( width !== undefined ) ? width : 10;\n\tthis.height = ( height !== undefined ) ? height : 10;\n\n}\n\nRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: RectAreaLight,\n\n\tisRectAreaLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Light.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction MaterialLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\tthis.textures = {};\n\n}\n\nObject.assign( MaterialLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tvar textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tvar material = new Materials[ json.type ]();\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\t\tif ( json.morphNormals !== undefined ) material.morphNormals = json.morphNormals;\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( var name in json.uniforms ) {\n\n\t\t\t\tvar uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( var key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\tmaterial.transparent = true;\n\n\t\t}\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tvar normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\treturn material;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t},\n\n\tsetTextures: function ( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author Don McCurdy / https://www.donmccurdy.com\n */\n\nvar LoaderUtils = {\n\n\tdecodeText: function ( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tvar s = '';\n\n\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t},\n\n\textractUrlBase: function ( url ) {\n\n\t\tvar index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.substr( 0, index + 1 );\n\n\t}\n\n};\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedBufferGeometry() {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'InstancedBufferGeometry';\n\tthis.maxInstancedCount = undefined;\n\n}\n\nInstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {\n\n\tconstructor: InstancedBufferGeometry,\n\n\tisInstancedBufferGeometry: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferGeometry.prototype.copy.call( this, source );\n\n\t\tthis.maxInstancedCount = source.maxInstancedCount;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tvar data = BufferGeometry.prototype.toJSON.call( this );\n\n\t\tdata.maxInstancedCount = this.maxInstancedCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) {\n\n\tif ( typeof ( normalized ) === 'number' ) {\n\n\t\tmeshPerAttribute = normalized;\n\n\t\tnormalized = false;\n\n\t\tconsole.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' );\n\n\t}\n\n\tBufferAttribute.call( this, array, itemSize, normalized );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {\n\n\tconstructor: InstancedBufferAttribute,\n\n\tisInstancedBufferAttribute: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ()\t{\n\n\t\tvar data = BufferAttribute.prototype.toJSON.call( this );\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction BufferGeometryLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( BufferGeometryLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tvar geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tvar index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tvar attributes = json.data.attributes;\n\n\t\tfor ( var key in attributes ) {\n\n\t\t\tvar attribute = attributes[ key ];\n\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\t\t\tvar bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\tvar bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tgeometry.addAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tvar morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( var key in morphAttributes ) {\n\n\t\t\t\tvar attributeArray = morphAttributes[ key ];\n\n\t\t\t\tvar array = [];\n\n\t\t\t\tfor ( var i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar attribute = attributeArray[ i ];\n\t\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\t\tvar bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tvar center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\nvar TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\t// Workaround for IE11 pre KB2929437. See #11440\n\tUint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction ObjectLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\tthis.resourcePath = '';\n\n}\n\nObject.assign( ObjectLoader.prototype, {\n\n\tcrossOrigin: 'anonymous',\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar path = ( this.path === undefined ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t},\n\n\tsetResourcePath: function ( value ) {\n\n\t\tthis.resourcePath = value;\n\t\treturn this;\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t},\n\n\tparse: function ( json, onLoad ) {\n\n\t\tvar shapes = this.parseShape( json.shapes );\n\t\tvar geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tvar textures = this.parseTextures( json.textures, images );\n\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\tif ( json.animations ) {\n\n\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t}\n\n\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t},\n\n\tparseShape: function ( json ) {\n\n\t\tvar shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t},\n\n\tparseGeometries: function ( json, shapes ) {\n\n\t\tvar geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar geometry;\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\tcase 'DodecahedronBufferGeometry':\n\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\tcase 'IcosahedronBufferGeometry':\n\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\tcase 'OctahedronBufferGeometry':\n\t\t\t\t\tcase 'TetrahedronGeometry':\n\t\t\t\t\tcase 'TetrahedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TubeGeometry':\n\t\t\t\t\tcase 'TubeBufferGeometry':\n\n\t\t\t\t\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t\t\t\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.closed\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PolyhedronGeometry':\n\t\t\t\t\tcase 'PolyhedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.vertices,\n\t\t\t\t\t\t\tdata.indices,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.details\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ShapeGeometry':\n\t\t\t\t\tcase 'ShapeBufferGeometry':\n\n\t\t\t\t\t\tvar geometryShapes = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.curveSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tcase 'ExtrudeGeometry':\n\t\t\t\t\tcase 'ExtrudeBufferGeometry':\n\n\t\t\t\t\t\tvar geometryShapes = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar extrudePath = data.options.extrudePath;\n\n\t\t\t\t\t\tif ( extrudePath !== undefined ) {\n\n\t\t\t\t\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.options\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tif ( 'THREE' in window && 'LegacyJSONLoader' in THREE ) {\n\n\t\t\t\t\t\t\tvar geometryLoader = new THREE.LegacyJSONLoader();\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data, this.resourcePath ).geometry;\n\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: You have to import LegacyJSONLoader in order load geometry data of type \"Geometry\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t},\n\n\tparseMaterials: function ( json, textures ) {\n\n\t\tvar cache = {}; // MultiMaterial\n\t\tvar materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tvar loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tvar array = [];\n\n\t\t\t\t\tfor ( var j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tvar material = data.materials[ j ];\n\n\t\t\t\t\t\tif ( cache[ material.uuid ] === undefined ) {\n\n\t\t\t\t\t\t\tcache[ material.uuid ] = loader.parse( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarray.push( cache[ material.uuid ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t},\n\n\tparseAnimations: function ( json ) {\n\n\t\tvar animations = [];\n\n\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\tvar data = json[ i ];\n\n\t\t\tvar clip = AnimationClip.parse( data );\n\n\t\t\tif ( data.uuid !== undefined ) clip.uuid = data.uuid;\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t},\n\n\tparseImages: function ( json, onLoad ) {\n\n\t\tvar scope = this;\n\t\tvar images = {};\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\tvar loader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( var i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tvar image = json[ i ];\n\t\t\t\tvar url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\timages[ image.uuid ] = [];\n\n\t\t\t\t\tfor ( var j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar currentUrl = url[ j ];\n\n\t\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( currentUrl ) ? currentUrl : scope.resourcePath + currentUrl;\n\n\t\t\t\t\t\timages[ image.uuid ].push( loadImage( path ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.resourcePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t},\n\n\tparseTextures: function ( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tvar textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tvar data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tvar texture;\n\n\t\t\t\tif ( Array.isArray( images[ data.image ] ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture( images[ data.image ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = new Texture( images[ data.image ] );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t},\n\n\tparseObject: function ( data, geometries, materials ) {\n\n\t\tvar object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tvar array = [];\n\n\t\t\t\tfor ( var i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.drawMode !== undefined ) object.setDrawMode( data.drawMode );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tvar children = data.children;\n\n\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tvar levels = data.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tvar level = levels[ l ];\n\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n} );\n\nvar TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tSphericalReflectionMapping: SphericalReflectionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\tCubeUVRefractionMapping: CubeUVRefractionMapping\n};\n\nvar TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nvar TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n};\n\n/**\n * @author thespite / http://clicktorelease.com/\n */\n\n\nfunction ImageBitmapLoader( manager ) {\n\n\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t}\n\n\tif ( typeof fetch === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t}\n\n\tthis.manager = manager !== undefined ? manager : DefaultLoadingManager;\n\tthis.options = undefined;\n\n}\n\nImageBitmapLoader.prototype = {\n\n\tconstructor: ImageBitmapLoader,\n\n\tsetOptions: function setOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t},\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tvar scope = this;\n\n\t\tvar cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tfetch( url ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\tif ( scope.options === undefined ) {\n\n\t\t\t\t// Workaround for FireFox. It causes an error if you pass options.\n\t\t\t\treturn createImageBitmap( blob );\n\n\t\t\t} else {\n\n\t\t\t\treturn createImageBitmap( blob, scope.options );\n\n\t\t\t}\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t},\n\n\tsetCrossOrigin: function ( /* value */ ) {\n\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n};\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n **/\n\nfunction ShapePath() {\n\n\tthis.type = 'ShapePath';\n\n\tthis.color = new Color();\n\n\tthis.subPaths = [];\n\tthis.currentPath = null;\n\n}\n\nObject.assign( ShapePath.prototype, {\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t},\n\n\tsplineThru: function ( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t},\n\n\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tvar inside = false;\n\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tvar edgeLowPt = inPolygon[ p ];\n\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\tvar subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tvar betterShapeHoles = [];\n\t\tvar newShapes = [];\n\t\tvar newShapeHoles = [];\n\t\tvar mainIdx = 0;\n\t\tvar tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tvar ambiguous = false;\n\t\t\tvar toChange = [];\n\n\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar tmpHoles;\n\n\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\n/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author mrdoob / http://mrdoob.com/\n */\n\n\nfunction Font( data ) {\n\n\tthis.type = 'Font';\n\n\tthis.data = data;\n\n}\n\nObject.assign( Font.prototype, {\n\n\tisFont: true,\n\n\tgenerateShapes: function ( text, size ) {\n\n\t\tif ( size === undefined ) size = 100;\n\n\t\tvar shapes = [];\n\t\tvar paths = createPaths( text, size, this.data );\n\n\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\nfunction createPaths( text, size, data ) {\n\n\tvar chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // see #13988\n\tvar scale = size / data.resolution;\n\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tvar paths = [];\n\n\tvar offsetX = 0, offsetY = 0;\n\n\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\tvar char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tvar ret = createPath( char, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tvar glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) return;\n\n\tvar path = new ShapePath();\n\n\tvar x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\tvar action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction FontLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( FontLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t}\n\n\t\t\tvar font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\treturn new Font( json );\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Loader() {}\n\nLoader.Handlers = {\n\n\thandlers: [],\n\n\tadd: function ( regex, loader ) {\n\n\t\tthis.handlers.push( regex, loader );\n\n\t},\n\n\tget: function ( file ) {\n\n\t\tvar handlers = this.handlers;\n\n\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\tvar regex = handlers[ i ];\n\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\treturn loader;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n};\n\nObject.assign( Loader.prototype, {\n\n\tcrossOrigin: 'anonymous',\n\n\tonLoadStart: function () {},\n\n\tonLoadProgress: function () {},\n\n\tonLoadComplete: function () {},\n\n\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\tvar array = [];\n\n\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t}\n\n\t\treturn array;\n\n\t},\n\n\tcreateMaterial: ( function () {\n\n\t\tvar BlendingMode = {\n\t\t\tNoBlending: NoBlending,\n\t\t\tNormalBlending: NormalBlending,\n\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\tCustomBlending: CustomBlending\n\t\t};\n\n\t\tvar color = new Color();\n\t\tvar textureLoader = new TextureLoader();\n\t\tvar materialLoader = new MaterialLoader();\n\n\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t// convert from old material format\n\n\t\t\tvar textures = {};\n\n\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\tvar texture;\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t}\n\n\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t}\n\n\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t}\n\n\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\treturn uuid;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar json = {\n\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t};\n\n\t\t\tfor ( var name in m ) {\n\n\t\t\t\tvar value = m[ name ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\tjson.normalScale = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\tcase 'opacity':\n\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\tcase 'transparent':\n\t\t\t\t\tcase 'visible':\n\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\treturn materialLoader.parse( json );\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nvar context;\n\nvar AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\tcontext = value;\n\n\t}\n\n};\n\n/**\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\n */\n\nfunction AudioLoader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n}\n\nObject.assign( AudioLoader.prototype, {\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\tvar bufferCopy = buffer.slice( 0 );\n\n\t\t\tvar context = AudioContext.getContext();\n\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t} );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tsetPath: function ( value ) {\n\n\t\tthis.path = value;\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n *\n * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nfunction SphericalHarmonics3() {\n\n\tthis.coefficients = [];\n\n\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\tthis.coefficients.push( new Vector3() );\n\n\t}\n\n}\n\nObject.assign( SphericalHarmonics3.prototype, {\n\n\tisSphericalHarmonics3: true,\n\n\tset: function ( coefficients ) {\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tzero: function () {\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt: function ( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tvar x = normal.x, y = normal.y, z = normal.z;\n\n\t\tvar coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScale( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScale( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScale( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScale( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScale( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScale( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScale( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScale( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t},\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt: function ( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tvar x = normal.x, y = normal.y, z = normal.z;\n\n\t\tvar coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScale( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScale( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScale( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScale( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScale( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScale( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScale( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScale( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t},\n\n\tadd: function ( sh ) {\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\n\tscale: function ( s ) {\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tlerp: function ( sh, alpha ) {\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( sh ) {\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tcopy: function ( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tfromArray: function ( array ) {\n\n\t\tvar coefficients = this.coefficients;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, i * 3 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function () {\n\n\t\tvar array = [];\n\t\tvar coefficients = this.coefficients;\n\n\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, i * 3 );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n} );\n\nObject.assign( SphericalHarmonics3, {\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tgetBasisAt: function ( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tvar x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n} );\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n *\n * A LightProbe is a source of indirect-diffuse light\n */\n\nfunction LightProbe( sh, intensity ) {\n\n\tLight.call( this, undefined, intensity );\n\n\tthis.sh = ( sh !== undefined ) ? sh : new SphericalHarmonics3();\n\n}\n\nLightProbe.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: LightProbe,\n\n\tisLightProbe: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.sh.copy( source.sh );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = Light.prototype.toJSON.call( this, meta );\n\n\t\t// data.sh = this.sh.toArray(); // todo\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction HemisphereLightProbe( skyColor, groundColor, intensity ) {\n\n\tLightProbe.call( this, undefined, intensity );\n\n\tvar color1 = new Color().set( skyColor );\n\tvar color2 = new Color().set( groundColor );\n\n\tvar sky = new Vector3( color1.r, color1.g, color1.b );\n\tvar ground = new Vector3( color2.r, color2.g, color2.b );\n\n\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\tvar c0 = Math.sqrt( Math.PI );\n\tvar c1 = c0 * Math.sqrt( 0.75 );\n\n\tthis.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );\n\tthis.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );\n\n}\n\nHemisphereLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), {\n\n\tconstructor: HemisphereLightProbe,\n\n\tisHemisphereLightProbe: true,\n\n\tcopy: function ( source ) { // modifying colors not currently supported\n\n\t\tLightProbe.prototype.copy.call( this, source );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = LightProbe.prototype.toJSON.call( this, meta );\n\n\t\t// data.sh = this.sh.toArray(); // todo\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction AmbientLightProbe( color, intensity ) {\n\n\tLightProbe.call( this, undefined, intensity );\n\n\tvar color1 = new Color().set( color );\n\n\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\tthis.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );\n\n}\n\nAmbientLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), {\n\n\tconstructor: AmbientLightProbe,\n\n\tisAmbientLightProbe: true,\n\n\tcopy: function ( source ) { // modifying color not currently supported\n\n\t\tLightProbe.prototype.copy.call( this, source );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tvar data = LightProbe.prototype.toJSON.call( this, meta );\n\n\t\t// data.sh = this.sh.toArray(); // todo\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction StereoCamera() {\n\n\tthis.type = 'StereoCamera';\n\n\tthis.aspect = 1;\n\n\tthis.eyeSep = 0.064;\n\n\tthis.cameraL = new PerspectiveCamera();\n\tthis.cameraL.layers.enable( 1 );\n\tthis.cameraL.matrixAutoUpdate = false;\n\n\tthis.cameraR = new PerspectiveCamera();\n\tthis.cameraR.layers.enable( 2 );\n\tthis.cameraR.matrixAutoUpdate = false;\n\n}\n\nObject.assign( StereoCamera.prototype, {\n\n\tupdate: ( function () {\n\n\t\tvar instance, focus, fov, aspect, near, far, zoom, eyeSep;\n\n\t\tvar eyeRight = new Matrix4();\n\t\tvar eyeLeft = new Matrix4();\n\n\t\treturn function update( camera ) {\n\n\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;\n\n\t\t\tif ( needsUpdate ) {\n\n\t\t\t\tinstance = this;\n\t\t\t\tfocus = camera.focus;\n\t\t\t\tfov = camera.fov;\n\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\tnear = camera.near;\n\t\t\t\tfar = camera.far;\n\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\teyeSep = this.eyeSep / 2;\n\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t// translate xOffset\n\n\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t// for left eye\n\n\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t// for right eye\n\n\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t}\n\n\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction Clock( autoStart ) {\n\n\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\tthis.startTime = 0;\n\tthis.oldTime = 0;\n\tthis.elapsedTime = 0;\n\n\tthis.running = false;\n\n}\n\nObject.assign( Clock.prototype, {\n\n\tstart: function () {\n\n\t\tthis.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t},\n\n\tgetElapsedTime: function () {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t},\n\n\tgetDelta: function () {\n\n\t\tvar diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tvar newTime = ( typeof performance === 'undefined' ? Date : performance ).now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AudioListener() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'AudioListener';\n\n\tthis.context = AudioContext.getContext();\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( this.context.destination );\n\n\tthis.filter = null;\n\n\tthis.timeDelta = 0;\n\n}\n\nAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: AudioListener,\n\n\tgetInput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tremoveFilter: function ( ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.filter;\n\n\t},\n\n\tsetFilter: function ( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t},\n\n\tgetMasterVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetMasterVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t},\n\n\tupdateMatrixWorld: ( function () {\n\n\t\tvar position = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3();\n\n\t\tvar orientation = new Vector3();\n\t\tvar clock = new Clock();\n\n\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tvar listener = this.context.listener;\n\t\t\tvar up = this.up;\n\n\t\t\tthis.timeDelta = clock.getDelta();\n\n\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t// code path for Chrome (see #14393)\n\n\t\t\t\tvar endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\t\tlistener.positionX.linearRampToValueAtTime( position.x, endTime );\n\t\t\t\tlistener.positionY.linearRampToValueAtTime( position.y, endTime );\n\t\t\t\tlistener.positionZ.linearRampToValueAtTime( position.z, endTime );\n\t\t\t\tlistener.forwardX.linearRampToValueAtTime( orientation.x, endTime );\n\t\t\t\tlistener.forwardY.linearRampToValueAtTime( orientation.y, endTime );\n\t\t\t\tlistener.forwardZ.linearRampToValueAtTime( orientation.z, endTime );\n\t\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t\t} else {\n\n\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Reece Aaron Lecrivain / http://reecenotes.com/\n */\n\nfunction Audio( listener ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Audio';\n\n\tthis.listener = listener;\n\tthis.context = listener.context;\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( listener.getInput() );\n\n\tthis.autoplay = false;\n\n\tthis.buffer = null;\n\tthis.detune = 0;\n\tthis.loop = false;\n\tthis.startTime = 0;\n\tthis.offset = 0;\n\tthis.playbackRate = 1;\n\tthis.isPlaying = false;\n\tthis.hasPlaybackControl = true;\n\tthis.sourceType = 'empty';\n\n\tthis.filters = [];\n\n}\n\nAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Audio,\n\n\tgetOutput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tsetNodeSource: function ( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetMediaElementSource: function ( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetBuffer: function ( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t},\n\n\tplay: function () {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar source = this.context.createBufferSource();\n\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tthis.startTime = this.context.currentTime;\n\t\tsource.start( this.startTime, this.offset );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t},\n\n\tpause: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\t\t\tthis.offset += ( this.context.currentTime - this.startTime ) * this.playbackRate;\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.source.stop();\n\t\tthis.source.onended = null;\n\t\tthis.offset = 0;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t},\n\n\tconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tdisconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilters: function () {\n\n\t\treturn this.filters;\n\n\t},\n\n\tsetFilters: function ( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value;\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetDetune: function ( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetDetune: function () {\n\n\t\treturn this.detune;\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t},\n\n\tsetFilter: function ( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t},\n\n\tsetPlaybackRate: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetPlaybackRate: function () {\n\n\t\treturn this.playbackRate;\n\n\t},\n\n\tonEnded: function () {\n\n\t\tthis.isPlaying = false;\n\n\t},\n\n\tgetLoop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t},\n\n\tsetLoop: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction PositionalAudio( listener ) {\n\n\tAudio.call( this, listener );\n\n\tthis.panner = this.context.createPanner();\n\tthis.panner.panningModel = 'HRTF';\n\tthis.panner.connect( this.gain );\n\n}\n\nPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\tconstructor: PositionalAudio,\n\n\tgetOutput: function () {\n\n\t\treturn this.panner;\n\n\t},\n\n\tgetRefDistance: function () {\n\n\t\treturn this.panner.refDistance;\n\n\t},\n\n\tsetRefDistance: function ( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t},\n\n\tgetRolloffFactor: function () {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t},\n\n\tsetRolloffFactor: function ( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t},\n\n\tgetDistanceModel: function () {\n\n\t\treturn this.panner.distanceModel;\n\n\t},\n\n\tsetDistanceModel: function ( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t},\n\n\tgetMaxDistance: function () {\n\n\t\treturn this.panner.maxDistance;\n\n\t},\n\n\tsetMaxDistance: function ( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t},\n\n\tsetDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t},\n\n\tupdateMatrixWorld: ( function () {\n\n\t\tvar position = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3();\n\n\t\tvar orientation = new Vector3();\n\n\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\torientation.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\tvar panner = this.panner;\n\n\t\t\tif ( panner.positionX ) {\n\n\t\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\t\tvar endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\t\tpanner.positionX.linearRampToValueAtTime( position.x, endTime );\n\t\t\t\tpanner.positionY.linearRampToValueAtTime( position.y, endTime );\n\t\t\t\tpanner.positionZ.linearRampToValueAtTime( position.z, endTime );\n\t\t\t\tpanner.orientationX.linearRampToValueAtTime( orientation.x, endTime );\n\t\t\t\tpanner.orientationY.linearRampToValueAtTime( orientation.y, endTime );\n\t\t\t\tpanner.orientationZ.linearRampToValueAtTime( orientation.z, endTime );\n\n\t\t\t} else {\n\n\t\t\t\tpanner.setPosition( position.x, position.y, position.z );\n\t\t\t\tpanner.setOrientation( orientation.x, orientation.y, orientation.z );\n\n\t\t\t}\n\n\t\t};\n\n\t} )()\n\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AudioAnalyser( audio, fftSize ) {\n\n\tthis.analyser = audio.context.createAnalyser();\n\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\taudio.getOutput().connect( this.analyser );\n\n}\n\nObject.assign( AudioAnalyser.prototype, {\n\n\tgetFrequencyData: function () {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t},\n\n\tgetAverageFrequency: function () {\n\n\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n} );\n\n/**\n *\n * Buffered scene graph property that allows weighted accumulation.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\tthis.binding = binding;\n\tthis.valueSize = valueSize;\n\n\tvar bufferType = Float64Array,\n\t\tmixFunction;\n\n\tswitch ( typeName ) {\n\n\t\tcase 'quaternion':\n\t\t\tmixFunction = this._slerp;\n\t\t\tbreak;\n\n\t\tcase 'string':\n\t\tcase 'bool':\n\t\t\tbufferType = Array;\n\t\t\tmixFunction = this._select;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tmixFunction = this._lerp;\n\n\t}\n\n\tthis.buffer = new bufferType( valueSize * 4 );\n\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t//\n\t// interpolators can use .buffer as their .result\n\t// the data then goes to 'incoming'\n\t//\n\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t// the cumulative result and are compared to detect\n\t// changes\n\t//\n\t// 'orig' stores the original state of the property\n\n\tthis._mixBufferRegion = mixFunction;\n\n\tthis.cumulativeWeight = 0;\n\n\tthis.useCount = 0;\n\tthis.referenceCount = 0;\n\n}\n\nObject.assign( PropertyMixer.prototype, {\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate: function ( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tvar buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tvar mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t},\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply: function ( accuIndex ) {\n\n\t\tvar stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState: function () {\n\n\t\tvar binding = this.binding;\n\n\t\tvar buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * 3;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\tthis.cumulativeWeight = 0;\n\n\t},\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState: function () {\n\n\t\tvar originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t},\n\n\n\t// mix functions\n\n\t_select: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_slerp: function ( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t},\n\n\t_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tvar s = 1 - t;\n\n\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\tvar j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n *\n * A reference to a real property in the scene graph.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\n// Characters [].:/ are reserved for track binding syntax.\nvar RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\n\nfunction Composite( targetGroup, path, optionalParsedPath ) {\n\n\tvar parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis._targetGroup = targetGroup;\n\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n}\n\nObject.assign( Composite.prototype, {\n\n\tgetValue: function ( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t},\n\n\tsetValue: function ( array, offset ) {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t},\n\n\tbind: function () {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t},\n\n\tunbind: function () {\n\n\t\tvar bindings = this._bindings;\n\n\t\tfor ( var i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n} );\n\n\nfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\tthis.path = path;\n\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\tthis.rootNode = rootNode;\n\n}\n\nObject.assign( PropertyBinding, {\n\n\tComposite: Composite,\n\n\tcreate: function ( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t},\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tsanitizeNodeName: ( function () {\n\n\t\tvar reservedRe = new RegExp( '[' + RESERVED_CHARS_RE + ']', 'g' );\n\n\t\treturn function sanitizeNodeName( name ) {\n\n\t\t\treturn name.replace( /\\s/g, '_' ).replace( reservedRe, '' );\n\n\t\t};\n\n\t}() ),\n\n\tparseTrackName: function () {\n\n\t\t// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n\t\t// only latin characters, and the unicode \\p{L} is not yet supported. So\n\t\t// instead, we exclude reserved characters and match everything else.\n\t\tvar wordChar = '[^' + RESERVED_CHARS_RE + ']';\n\t\tvar wordCharOrDot = '[^' + RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n\t\t// Parent directories, delimited by '/' or ':'. Currently unused, but must\n\t\t// be matched to parse the rest of the track name.\n\t\tvar directoryRe = /((?:WC+[\\/:])*)/.source.replace( 'WC', wordChar );\n\n\t\t// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\n\t\tvar nodeRe = /(WCOD+)?/.source.replace( 'WCOD', wordCharOrDot );\n\n\t\t// Object on target node, and accessor. May not contain reserved\n\t\t// characters. Accessor may contain any character except closing bracket.\n\t\tvar objectRe = /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', wordChar );\n\n\t\t// Property and accessor. May not contain reserved characters. Accessor may\n\t\t// contain any non-bracket characters.\n\t\tvar propertyRe = /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', wordChar );\n\n\t\tvar trackRe = new RegExp( ''\n\t\t\t+ '^'\n\t\t\t+ directoryRe\n\t\t\t+ nodeRe\n\t\t\t+ objectRe\n\t\t\t+ propertyRe\n\t\t\t+ '$'\n\t\t);\n\n\t\tvar supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\n\t\treturn function parseTrackName( trackName ) {\n\n\t\t\tvar matches = trackRe.exec( trackName );\n\n\t\t\tif ( ! matches ) {\n\n\t\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t\t}\n\n\t\t\tvar results = {\n\t\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\t\tnodeName: matches[ 2 ],\n\t\t\t\tobjectName: matches[ 3 ],\n\t\t\t\tobjectIndex: matches[ 4 ],\n\t\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\t\tpropertyIndex: matches[ 6 ]\n\t\t\t};\n\n\t\t\tvar lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\t\tvar objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t\t// Object names must be checked against a whitelist. Otherwise, there\n\t\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t\t// include '.' characters).\n\t\t\t\tif ( supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\t\tresults.objectName = objectName;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t\t}\n\n\t\t\treturn results;\n\n\t\t};\n\n\t}(),\n\n\tfindNode: function ( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tvar bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tvar searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n} );\n\nObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable: function () {},\n\t_setValue_unavailable: function () {},\n\n\tBindingType: {\n\t\tDirect: 0,\n\t\tEntireArray: 1,\n\t\tArrayElement: 2,\n\t\tHasFromToArray: 3\n\t},\n\n\tVersioning: {\n\t\tNone: 0,\n\t\tNeedsUpdate: 1,\n\t\tMatrixWorldNeedsUpdate: 2\n\t},\n\n\tGetterByBindingType: [\n\n\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t},\n\n\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\tvar source = this.resolvedProperty;\n\n\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t}\n\n\t\t},\n\n\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t},\n\n\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t}\n\n\t],\n\n\tSetterByBindingTypeAndVersioning: [\n\n\t\t[\n\t\t\t// Direct\n\n\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// EntireArray\n\n\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// ArrayElement\n\n\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// HasToFromArray\n\n\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t]\n\n\t],\n\n\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t// prototype version of these methods with one that represents\n\t\t// the bound state. When the property is not found, the methods\n\t\t// become no-ops.\n\n\t},\n\n\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t},\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind: function () {\n\n\t\tvar targetObject = this.node,\n\t\t\tparsedPath = this.parsedPath,\n\n\t\t\tobjectName = parsedPath.objectName,\n\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tvar versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tvar bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t},\n\n\tunbind: function () {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n} );\n\n//!\\ DECLARE ALIAS AFTER assign prototype !\nObject.assign( PropertyBinding.prototype, {\n\n\t// initial state of these methods that calls 'bind'\n\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n} );\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n *\n * @author tschw\n */\n\nfunction AnimationObjectGroup() {\n\n\tthis.uuid = _Math.generateUUID();\n\n\t// cached objects followed by the active ones\n\tthis._objects = Array.prototype.slice.call( arguments );\n\n\tthis.nCachedObjects_ = 0; // threshold\n\t// note: read by PropertyBinding.Composite\n\n\tvar indices = {};\n\tthis._indicesByUUID = indices; // for bookkeeping\n\n\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t}\n\n\tthis._paths = []; // inside: string\n\tthis._parsedPaths = []; // inside: { we don't care, here }\n\tthis._bindings = []; // inside: Array< PropertyBinding >\n\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\tvar scope = this;\n\n\tthis.stats = {\n\n\t\tobjects: {\n\t\t\tget total() {\n\n\t\t\t\treturn scope._objects.length;\n\n\t\t\t},\n\t\t\tget inUse() {\n\n\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t}\n\t\t},\n\t\tget bindingsPerObject() {\n\n\t\t\treturn scope._bindings.length;\n\n\t\t}\n\n\t};\n\n}\n\nObject.assign( AnimationObjectGroup.prototype, {\n\n\tisAnimationObjectGroup: true,\n\n\tadd: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length,\n\t\t\tknownObject = undefined;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\tremove: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// remove & forget\n\tuncache: function () {\n\n\t\tvar objects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tvar object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_: function ( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ],\n\t\t\tbindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tvar paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tvar object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t},\n\n\tunsubscribe_: function ( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n *\n * Action provided by AnimationMixer for scheduling clip playback on specific\n * objects.\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n *\n */\n\nfunction AnimationAction( mixer, clip, localRoot ) {\n\n\tthis._mixer = mixer;\n\tthis._clip = clip;\n\tthis._localRoot = localRoot || null;\n\n\tvar tracks = clip.tracks,\n\t\tnTracks = tracks.length,\n\t\tinterpolants = new Array( nTracks );\n\n\tvar interpolantSettings = {\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\t};\n\n\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\tinterpolants[ i ] = interpolant;\n\t\tinterpolant.settings = interpolantSettings;\n\n\t}\n\n\tthis._interpolantSettings = interpolantSettings;\n\n\tthis._interpolants = interpolants; // bound by the mixer\n\n\t// inside: PropertyMixer (managed by the mixer)\n\tthis._propertyBindings = new Array( nTracks );\n\n\tthis._cacheIndex = null; // for the memory manager\n\tthis._byClipCacheIndex = null; // for the memory manager\n\n\tthis._timeScaleInterpolant = null;\n\tthis._weightInterpolant = null;\n\n\tthis.loop = LoopRepeat;\n\tthis._loopCount = - 1;\n\n\t// global mixer time when the action is to be started\n\t// it's set back to 'null' upon start of the action\n\tthis._startTime = null;\n\n\t// scaled local time of the action\n\t// gets clamped or wrapped to 0..clip.duration according to loop\n\tthis.time = 0;\n\n\tthis.timeScale = 1;\n\tthis._effectiveTimeScale = 1;\n\n\tthis.weight = 1;\n\tthis._effectiveWeight = 1;\n\n\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\tthis.paused = false; // true -> zero effective time scale\n\tthis.enabled = true; // false -> zero effective weight\n\n\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n}\n\nObject.assign( AnimationAction.prototype, {\n\n\t// State & Scheduling\n\n\tplay: function () {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t},\n\n\treset: function () {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t},\n\n\tisRunning: function () {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t},\n\n\t// return true when play has been called\n\tisScheduled: function () {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t},\n\n\tstartAt: function ( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t},\n\n\tsetLoop: function ( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t},\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight: function ( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t},\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight: function () {\n\n\t\treturn this._effectiveWeight;\n\n\t},\n\n\tfadeIn: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t},\n\n\tfadeOut: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t},\n\n\tcrossFadeFrom: function ( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcrossFadeTo: function ( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t},\n\n\tstopFading: function () {\n\n\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale: function ( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale: function () {\n\n\t\treturn this._effectiveTimeScale;\n\n\t},\n\n\tsetDuration: function ( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\tsyncWith: function ( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\thalt: function ( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t},\n\n\twarp: function ( startTimeScale, endTimeScale, duration ) {\n\n\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tvar times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t},\n\n\tstopWarping: function () {\n\n\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Object Accessors\n\n\tgetMixer: function () {\n\n\t\treturn this._mixer;\n\n\t},\n\n\tgetClip: function () {\n\n\t\treturn this._clip;\n\n\t},\n\n\tgetRoot: function () {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t},\n\n\t// Interna\n\n\t_update: function ( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tvar weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tvar interpolants = this._interpolants;\n\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_updateWeight: function ( time ) {\n\n\t\tvar weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t},\n\n\t_updateTimeScale: function ( time ) {\n\n\t\tvar timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t},\n\n\t_updateTime: function ( deltaTime ) {\n\n\t\tvar time = this.time + deltaTime;\n\t\tvar duration = this._clip.duration;\n\t\tvar loop = this.loop;\n\t\tvar loopCount = this._loopCount;\n\n\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t},\n\n\t_setEndings: function ( atStart, atEnd, pingPong ) {\n\n\t\tvar settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_scheduleFading: function ( duration, weightNow, weightThen ) {\n\n\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\tinterpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tvar times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n *\n * Player for AnimationClips.\n *\n *\n * @author Ben Houston / http://clara.io/\n * @author David Sarno / http://lighthaus.us/\n * @author tschw\n */\n\nfunction AnimationMixer( root ) {\n\n\tthis._root = root;\n\tthis._initMemoryManager();\n\tthis._accuIndex = 0;\n\n\tthis.time = 0;\n\n\tthis.timeScale = 1.0;\n\n}\n\nAnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: AnimationMixer,\n\n\t_bindAction: function ( action, prototypeAction ) {\n\n\t\tvar root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar track = tracks[ i ],\n\t\t\t\ttrackName = track.name,\n\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t},\n\n\t_activateAction: function ( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t},\n\n\t_deactivateAction: function ( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t},\n\n\t// Memory manager\n\n\t_initMemoryManager: function () {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t},\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction: function ( action ) {\n\n\t\tvar index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t},\n\n\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\tvar actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t},\n\n\t_removeInactiveAction: function ( action ) {\n\n\t\tvar actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tvar clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t},\n\n\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\tvar bindings = action._propertyBindings;\n\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tvar binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_lendAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tvar actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t},\n\n\t_takeBackAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tvar actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t},\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tbindings = this._bindings;\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t},\n\n\t_removeInactiveBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t},\n\n\t_lendBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t},\n\n\t_takeBackBinding: function ( binding ) {\n\n\t\tvar bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t},\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant: function () {\n\n\t\tvar interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t},\n\n\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\tvar interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t},\n\n\t_controlInterpolantsResultBuffer: new Float32Array( 1 ),\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction: function ( clip, optionalRoot ) {\n\n\t\tvar root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\tprototypeAction = null;\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tvar existingAction =\n\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t},\n\n\t// get an existing action\n\texistingAction: function ( clip, optionalRoot ) {\n\n\t\tvar root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction: function () {\n\n\t\tvar actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tthis._nActiveActions = 0;\n\t\tthis._nActiveBindings = 0;\n\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\tactions[ i ].reset();\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].useCount = 0;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// advance the time and update apply the animation\n\tupdate: function ( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tvar actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\tvar action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tvar bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// return this mixer's root target object\n\tgetRoot: function () {\n\n\t\treturn this._root;\n\n\t},\n\n\t// free all resources specific to a particular clip\n\tuncacheClip: function ( clip ) {\n\n\t\tvar actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t},\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot: function ( root ) {\n\n\t\tvar rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remove a targeted clip from the cache\n\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Uniform( value ) {\n\n\tif ( typeof value === 'string' ) {\n\n\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\tvalue = arguments[ 1 ];\n\n\t}\n\n\tthis.value = value;\n\n}\n\nUniform.prototype.clone = function () {\n\n\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n};\n\n/**\n * @author benaadams / https://twitter.com/ben_a_adams\n */\n\nfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\tInterleavedBuffer.call( this, array, stride );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {\n\n\tconstructor: InstancedInterleavedBuffer,\n\n\tisInstancedInterleavedBuffer: true,\n\n\tcopy: function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author bhouston / http://clara.io/\n * @author stephomi / http://stephaneginier.com/\n */\n\nfunction Raycaster( origin, direction, near, far ) {\n\n\tthis.ray = new Ray( origin, direction );\n\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\tthis.near = near || 0;\n\tthis.far = far || Infinity;\n\n\tthis.params = {\n\t\tMesh: {},\n\t\tLine: {},\n\t\tLOD: {},\n\t\tPoints: { threshold: 1 },\n\t\tSprite: {}\n\t};\n\n\tObject.defineProperties( this.params, {\n\t\tPointCloud: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\treturn this.Points;\n\n\t\t\t}\n\t\t}\n\t} );\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.visible === false ) return;\n\n\tobject.raycast( raycaster, intersects );\n\n\tif ( recursive === true ) {\n\n\t\tvar children = object.children;\n\n\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Raycaster.prototype, {\n\n\tlinePrecision: 1,\n\n\tset: function ( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t},\n\n\tsetFromCamera: function ( coords, camera ) {\n\n\t\tif ( ( camera && camera.isPerspectiveCamera ) ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis._camera = camera;\n\n\t\t} else if ( ( camera && camera.isOrthographicCamera ) ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis._camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t}\n\n\t},\n\n\tintersectObject: function ( object, recursive, optionalTarget ) {\n\n\t\tvar intersects = optionalTarget || [];\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t},\n\n\tintersectObjects: function ( objects, recursive, optionalTarget ) {\n\n\t\tvar intersects = optionalTarget || [];\n\n\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\treturn intersects;\n\n\t\t}\n\n\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n * @author WestLangley / http://github.com/WestLangley\n *\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axiz.\n */\n\nfunction Spherical( radius, phi, theta ) {\n\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\tthis.phi = ( phi !== undefined ) ? phi : 0; // polar angle\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // azimuthal angle\n\n\treturn this;\n\n}\n\nObject.assign( Spherical.prototype, {\n\n\tset: function ( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t},\n\n\t// restrict phi to be betwee EPS and PI-EPS\n\tmakeSafe: function () {\n\n\t\tvar EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromVector3: function ( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t},\n\n\tsetFromCartesianCoords: function ( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( _Math.clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author Mugen87 / https://github.com/Mugen87\n *\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n *\n */\n\nfunction Cylindrical( radius, theta, y ) {\n\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\treturn this;\n\n}\n\nObject.assign( Cylindrical.prototype, {\n\n\tset: function ( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromVector3: function ( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t},\n\n\tsetFromCartesianCoords: function ( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Box2( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n}\n\nObject.assign( Box2.prototype, {\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function () {\n\n\t\tvar v1 = new Vector2();\n\n\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}(),\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getCenter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getSize() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getParameter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function () {\n\n\t\tvar v1 = new Vector2();\n\n\t\treturn function distanceToPoint( point ) {\n\n\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t};\n\n\t}(),\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\n/**\n * @author bhouston / http://clara.io\n */\n\nfunction Line3( start, end ) {\n\n\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n}\n\nObject.assign( Line3.prototype, {\n\n\tset: function ( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t},\n\n\tdelta: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .delta() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t},\n\n\tdistanceSq: function () {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t},\n\n\tdistance: function () {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tclosestPointToPointParameter: function () {\n\n\t\tvar startP = new Vector3();\n\t\tvar startEnd = new Vector3();\n\n\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\tstartP.subVectors( point, this.start );\n\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\tif ( clampToLine ) {\n\n\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t}\n\n\t\t\treturn t;\n\n\t\t};\n\n\t}(),\n\n\tclosestPointToPoint: function ( point, clampToLine, target ) {\n\n\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n} );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nfunction ImmediateRenderObject( material ) {\n\n\tObject3D.call( this );\n\n\tthis.material = material;\n\tthis.render = function ( /* renderCallback */ ) {};\n\n}\n\nImmediateRenderObject.prototype = Object.create( Object3D.prototype );\nImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\nImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\tthis.object = object;\n\n\tthis.size = ( size !== undefined ) ? size : 1;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t//\n\n\tvar nNormals = 0;\n\n\tvar objGeometry = this.object.geometry;\n\n\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\tnNormals = objGeometry.faces.length * 3;\n\n\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t}\n\n\t//\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\tgeometry.addAttribute( 'position', positions );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t//\n\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n}\n\nVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\nVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\nVertexNormalsHelper.prototype.update = ( function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar normalMatrix = new Matrix3();\n\n\treturn function update() {\n\n\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\tvar position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\tvar idx = 0;\n\n\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t};\n\n}() );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction SpotLightHelper( light, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = [\n\t\t0, 0, 0, \t0, 0, 1,\n\t\t0, 0, 0, \t1, 0, 1,\n\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t0, 0, 0, \t0, 1, 1,\n\t\t0, 0, 0, \t0, - 1, 1\n\t];\n\n\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\tpositions.push(\n\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t);\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tthis.cone = new LineSegments( geometry, material );\n\tthis.add( this.cone );\n\n\tthis.update();\n\n}\n\nSpotLightHelper.prototype = Object.create( Object3D.prototype );\nSpotLightHelper.prototype.constructor = SpotLightHelper;\n\nSpotLightHelper.prototype.dispose = function () {\n\n\tthis.cone.geometry.dispose();\n\tthis.cone.material.dispose();\n\n};\n\nSpotLightHelper.prototype.update = function () {\n\n\tvar vector = new Vector3();\n\n\treturn function update() {\n\n\t\tthis.light.updateMatrixWorld();\n\n\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\tvector.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( vector );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t};\n\n}();\n\n/**\n * @author Sean Griffin / http://twitter.com/sgrif\n * @author Michael Guerrero / http://realitymeltdown.com\n * @author mrdoob / http://mrdoob.com/\n * @author ikerr / http://verold.com\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction getBoneList( object ) {\n\n\tvar boneList = [];\n\n\tif ( object && object.isBone ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nfunction SkeletonHelper( object ) {\n\n\tvar bones = getBoneList( object );\n\n\tvar geometry = new BufferGeometry();\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar color1 = new Color( 0, 0, 1 );\n\tvar color2 = new Color( 0, 1, 0 );\n\n\tfor ( var i = 0; i < bones.length; i ++ ) {\n\n\t\tvar bone = bones[ i ];\n\n\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.root = object;\n\tthis.bones = bones;\n\n\tthis.matrix = object.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n}\n\nSkeletonHelper.prototype = Object.create( LineSegments.prototype );\nSkeletonHelper.prototype.constructor = SkeletonHelper;\n\nSkeletonHelper.prototype.updateMatrixWorld = function () {\n\n\tvar vector = new Vector3();\n\n\tvar boneMatrix = new Matrix4();\n\tvar matrixWorldInv = new Matrix4();\n\n\treturn function updateMatrixWorld( force ) {\n\n\t\tvar bones = this.bones;\n\n\t\tvar geometry = this.geometry;\n\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\tfor ( var i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tvar bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t};\n\n}();\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction PointLightHelper( light, sphereSize, color ) {\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.color = color;\n\n\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\n\tMesh.call( this, geometry, material );\n\n\tthis.matrix = this.light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n\n\t/*\n\tvar distanceGeometry = new THREE.IcosahedronBufferGeometry( 1, 2 );\n\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tvar d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n}\n\nPointLightHelper.prototype = Object.create( Mesh.prototype );\nPointLightHelper.prototype.constructor = PointLightHelper;\n\nPointLightHelper.prototype.dispose = function () {\n\n\tthis.geometry.dispose();\n\tthis.material.dispose();\n\n};\n\nPointLightHelper.prototype.update = function () {\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.material.color.copy( this.light.color );\n\n\t}\n\n\t/*\n\tvar d = this.light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.visible = true;\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\t*/\n\n};\n\n/**\n * @author abelnation / http://github.com/abelnation\n * @author Mugen87 / http://github.com/Mugen87\n * @author WestLangley / http://github.com/WestLangley\n *\n * This helper must be added as a child of the light\n */\n\nfunction RectAreaLightHelper( light, color ) {\n\n\tthis.type = 'RectAreaLightHelper';\n\n\tthis.light = light;\n\n\tthis.color = color; // optional hardwired color for the helper\n\n\tvar positions = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\tgeometry.computeBoundingSphere();\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tLine.call( this, geometry, material );\n\n\t//\n\n\tvar positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\tvar geometry2 = new BufferGeometry();\n\tgeometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\tgeometry2.computeBoundingSphere();\n\n\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { side: BackSide, fog: false } ) ) );\n\n\tthis.update();\n\n}\n\nRectAreaLightHelper.prototype = Object.create( Line.prototype );\nRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\nRectAreaLightHelper.prototype.update = function () {\n\n\tthis.scale.set( 0.5 * this.light.width, 0.5 * this.light.height, 1 );\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.material.color.set( this.color );\n\t\tthis.children[ 0 ].material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t// prevent hue shift\n\t\tvar c = this.material.color;\n\t\tvar max = Math.max( c.r, c.g, c.b );\n\t\tif ( max > 1 ) c.multiplyScalar( 1 / max );\n\n\t\tthis.children[ 0 ].material.color.copy( this.material.color );\n\n\t}\n\n};\n\nRectAreaLightHelper.prototype.dispose = function () {\n\n\tthis.geometry.dispose();\n\tthis.material.dispose();\n\tthis.children[ 0 ].geometry.dispose();\n\tthis.children[ 0 ].material.dispose();\n\n};\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / https://github.com/Mugen87\n */\n\nfunction HemisphereLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tvar geometry = new OctahedronBufferGeometry( size );\n\tgeometry.rotateY( Math.PI * 0.5 );\n\n\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\tif ( this.color === undefined ) this.material.vertexColors = VertexColors;\n\n\tvar position = geometry.getAttribute( 'position' );\n\tvar colors = new Float32Array( position.count * 3 );\n\n\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\tthis.add( new Mesh( geometry, this.material ) );\n\n\tthis.update();\n\n}\n\nHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\nHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\nHemisphereLightHelper.prototype.dispose = function () {\n\n\tthis.children[ 0 ].geometry.dispose();\n\tthis.children[ 0 ].material.dispose();\n\n};\n\nHemisphereLightHelper.prototype.update = function () {\n\n\tvar vector = new Vector3();\n\n\tvar color1 = new Color();\n\tvar color2 = new Color();\n\n\treturn function update() {\n\n\t\tvar mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\tcolor1.copy( this.light.color );\n\t\t\tcolor2.copy( this.light.groundColor );\n\n\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t};\n\n}();\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction LightProbeHelper( lightProbe, size ) {\n\n\tthis.lightProbe = lightProbe;\n\n\tthis.size = size;\n\n\tvar defines = {};\n\tdefines[ 'GAMMA_OUTPUT' ] = \"\";\n\n\t// material\n\tvar material = new ShaderMaterial( {\n\n\t\tdefines: defines,\n\n\t\tuniforms: {\n\n\t\t\tsh: { value: this.lightProbe.sh.coefficients }, // by reference\n\n\t\t\tintensity: { value: this.lightProbe.intensity }\n\n\t\t},\n\n\t\tvertexShader: [\n\n\t\t\t'varying vec3 vNormal;',\n\n\t\t\t'void main() {',\n\n\t\t\t'\tvNormal = normalize( normalMatrix * normal );',\n\n\t\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\n\t\t\t'}',\n\n\t\t].join( '\\n' ),\n\n\t\tfragmentShader: [\n\n\t\t\t'#define RECIPROCAL_PI 0.318309886',\n\n\t\t\t'vec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {',\n\n\t\t\t'\t// matrix is assumed to be orthogonal',\n\n\t\t\t'\treturn normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );',\n\n\t\t\t'}',\n\n\t\t\t'vec3 linearToOutput( in vec3 a ) {',\n\n\t\t\t'\t#ifdef GAMMA_OUTPUT',\n\n\t\t\t'\t\treturn pow( a, vec3( 1.0 / float( GAMMA_FACTOR ) ) );',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\treturn a;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'}',\n\n\t\t\t'// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf',\n\t\t\t'vec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {',\n\n\t\t\t'\t// normal is assumed to have unit length',\n\n\t\t\t'\tfloat x = normal.x, y = normal.y, z = normal.z;',\n\n\t\t\t'\t// band 0',\n\t\t\t'\tvec3 result = shCoefficients[ 0 ] * 0.886227;',\n\n\t\t\t'\t// band 1',\n\t\t\t'\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;',\n\t\t\t'\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;',\n\t\t\t'\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;',\n\n\t\t\t'\t// band 2',\n\t\t\t'\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;',\n\t\t\t'\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;',\n\t\t\t'\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );',\n\t\t\t'\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;',\n\t\t\t'\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );',\n\n\t\t\t'\treturn result;',\n\n\t\t\t'}',\n\n\t\t\t'uniform vec3 sh[ 9 ]; // sh coefficients',\n\n\t\t\t'uniform float intensity; // light probe intensity',\n\n\t\t\t'varying vec3 vNormal;',\n\n\t\t\t'void main() {',\n\n\t\t\t'\tvec3 normal = normalize( vNormal );',\n\n\t\t\t'\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );',\n\n\t\t\t'\tvec3 irradiance = shGetIrradianceAt( worldNormal, sh );',\n\n\t\t\t'\tvec3 outgoingLight = RECIPROCAL_PI * irradiance * intensity;',\n\n\t\t\t'\toutgoingLight = linearToOutput( outgoingLight );',\n\n\t\t\t'\tgl_FragColor = vec4( outgoingLight, 1.0 );',\n\n\t\t\t'}'\n\n\t\t].join( '\\n' )\n\n\t} );\n\n\tvar geometry = new SphereBufferGeometry( 1, 32, 16 );\n\n\tMesh.call( this, geometry, material );\n\n\tthis.onBeforeRender();\n\n}\n\nLightProbeHelper.prototype = Object.create( Mesh.prototype );\nLightProbeHelper.prototype.constructor = LightProbeHelper;\n\nLightProbeHelper.prototype.dispose = function () {\n\n\tthis.geometry.dispose();\n\tthis.material.dispose();\n\n};\n\nLightProbeHelper.prototype.onBeforeRender = function () {\n\n\treturn function update() {\n\n\t\tthis.position.copy( this.lightProbe.position );\n\n\t\tthis.scale.set( 1, 1, 1 ).multiplyScalar( this.size );\n\n\t\tthis.material.uniforms.intensity.value = this.lightProbe.intensity;\n\n\t};\n\n}();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction GridHelper( size, divisions, color1, color2 ) {\n\n\tsize = size || 10;\n\tdivisions = divisions || 10;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tvar center = divisions / 2;\n\tvar step = size / divisions;\n\tvar halfSize = size / 2;\n\n\tvar vertices = [], colors = [];\n\n\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\tvar color = i === center ? color1 : color2;\n\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\n\t}\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nGridHelper.prototype = Object.assign( Object.create( LineSegments.prototype ), {\n\n\tconstructor: GridHelper,\n\n\tcopy: function ( source ) {\n\n\t\tLineSegments.prototype.copy.call( this, source );\n\n\t\tthis.geometry.copy( source.geometry );\n\t\tthis.material.copy( source.material );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n * @author Hectate / http://www.github.com/Hectate\n */\n\nfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\tradius = radius || 10;\n\tradials = radials || 16;\n\tcircles = circles || 8;\n\tdivisions = divisions || 64;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar x, z;\n\tvar v, i, j, r, color;\n\n\t// create the radials\n\n\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\tx = Math.sin( v ) * radius;\n\t\tz = Math.cos( v ) * radius;\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tvertices.push( x, 0, z );\n\n\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\tcolors.push( color.r, color.g, color.b );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t}\n\n\t// create the circles\n\n\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\tr = radius - ( radius / circles * i );\n\n\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t// first vertex\n\n\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * r;\n\t\t\tz = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t// second vertex\n\n\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * r;\n\t\t\tz = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t}\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nPolarGridHelper.prototype = Object.create( LineSegments.prototype );\nPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n/**\n * @author Mugen87 / http://github.com/Mugen87\n */\n\nfunction PositionalAudioHelper( audio, range, divisionsInnerAngle, divisionsOuterAngle ) {\n\n\tthis.audio = audio;\n\tthis.range = range || 1;\n\tthis.divisionsInnerAngle = divisionsInnerAngle || 16;\n\tthis.divisionsOuterAngle = divisionsOuterAngle || 2;\n\n\tvar geometry = new BufferGeometry();\n\tvar divisions = this.divisionsInnerAngle + this.divisionsOuterAngle * 2;\n\tvar positions = new Float32Array( ( divisions * 3 + 3 ) * 3 );\n\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\tvar materialInnerAngle = new LineBasicMaterial( { color: 0x00ff00 } );\n\tvar materialOuterAngle = new LineBasicMaterial( { color: 0xffff00 } );\n\n\tLine.call( this, geometry, [ materialOuterAngle, materialInnerAngle ] );\n\n\tthis.update();\n\n}\n\nPositionalAudioHelper.prototype = Object.create( Line.prototype );\nPositionalAudioHelper.prototype.constructor = PositionalAudioHelper;\n\nPositionalAudioHelper.prototype.update = function () {\n\n\tvar audio = this.audio;\n\tvar range = this.range;\n\tvar divisionsInnerAngle = this.divisionsInnerAngle;\n\tvar divisionsOuterAngle = this.divisionsOuterAngle;\n\n\tvar coneInnerAngle = _Math.degToRad( audio.panner.coneInnerAngle );\n\tvar coneOuterAngle = _Math.degToRad( audio.panner.coneOuterAngle );\n\n\tvar halfConeInnerAngle = coneInnerAngle / 2;\n\tvar halfConeOuterAngle = coneOuterAngle / 2;\n\n\tvar start = 0;\n\tvar count = 0;\n\tvar i, stride;\n\n\tvar geometry = this.geometry;\n\tvar positionAttribute = geometry.attributes.position;\n\n\tgeometry.clearGroups();\n\n\t//\n\n\tfunction generateSegment( from, to, divisions, materialIndex ) {\n\n\t\tvar step = ( to - from ) / divisions;\n\n\t\tpositionAttribute.setXYZ( start, 0, 0, 0 );\n\t\tcount ++;\n\n\t\tfor ( i = from; i < to; i += step ) {\n\n\t\t\tstride = start + count;\n\n\t\t\tpositionAttribute.setXYZ( stride, Math.sin( i ) * range, 0, Math.cos( i ) * range );\n\t\t\tpositionAttribute.setXYZ( stride + 1, Math.sin( Math.min( i + step, to ) ) * range, 0, Math.cos( Math.min( i + step, to ) ) * range );\n\t\t\tpositionAttribute.setXYZ( stride + 2, 0, 0, 0 );\n\n\t\t\tcount += 3;\n\n\t\t}\n\n\t\tgeometry.addGroup( start, count, materialIndex );\n\n\t\tstart += count;\n\t\tcount = 0;\n\n\t}\n\n\t//\n\n\tgenerateSegment( - halfConeOuterAngle, - halfConeInnerAngle, divisionsOuterAngle, 0 );\n\tgenerateSegment( - halfConeInnerAngle, halfConeInnerAngle, divisionsInnerAngle, 1 );\n\tgenerateSegment( halfConeInnerAngle, halfConeOuterAngle, divisionsOuterAngle, 0 );\n\n\t//\n\n\tpositionAttribute.needsUpdate = true;\n\n\tif ( coneInnerAngle === coneOuterAngle ) this.material[ 0 ].visible = false;\n\n};\n\nPositionalAudioHelper.prototype.dispose = function () {\n\n\tthis.geometry.dispose();\n\tthis.material[ 0 ].dispose();\n\tthis.material[ 1 ].dispose();\n\n};\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t// FaceNormalsHelper only supports THREE.Geometry\n\n\tthis.object = object;\n\n\tthis.size = ( size !== undefined ) ? size : 1;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t//\n\n\tvar nNormals = 0;\n\n\tvar objGeometry = this.object.geometry;\n\n\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\tnNormals = objGeometry.faces.length;\n\n\t} else {\n\n\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t}\n\n\t//\n\n\tvar geometry = new BufferGeometry();\n\n\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\tgeometry.addAttribute( 'position', positions );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t//\n\n\tthis.matrixAutoUpdate = false;\n\tthis.update();\n\n}\n\nFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\nFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\nFaceNormalsHelper.prototype.update = ( function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar normalMatrix = new Matrix3();\n\n\treturn function update() {\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\tvar position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tvar vertices = objGeometry.vertices;\n\n\t\tvar faces = objGeometry.faces;\n\n\t\tvar idx = 0;\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tvar normal = face.normal;\n\n\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t.divideScalar( 3 )\n\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t};\n\n}() );\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction DirectionalLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tif ( size === undefined ) size = 1;\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t- size, size, 0,\n\t\tsize, size, 0,\n\t\tsize, - size, 0,\n\t\t- size, - size, 0,\n\t\t- size, size, 0\n\t], 3 ) );\n\n\tvar material = new LineBasicMaterial( { fog: false } );\n\n\tthis.lightPlane = new Line( geometry, material );\n\tthis.add( this.lightPlane );\n\n\tgeometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\tthis.targetLine = new Line( geometry, material );\n\tthis.add( this.targetLine );\n\n\tthis.update();\n\n}\n\nDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\nDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\nDirectionalLightHelper.prototype.dispose = function () {\n\n\tthis.lightPlane.geometry.dispose();\n\tthis.lightPlane.material.dispose();\n\tthis.targetLine.geometry.dispose();\n\tthis.targetLine.material.dispose();\n\n};\n\nDirectionalLightHelper.prototype.update = function () {\n\n\tvar v1 = new Vector3();\n\tvar v2 = new Vector3();\n\tvar v3 = new Vector3();\n\n\treturn function update() {\n\n\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\tv3.subVectors( v2, v1 );\n\n\t\tthis.lightPlane.lookAt( v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( v2 );\n\t\tthis.targetLine.scale.z = v3.length();\n\n\t};\n\n}();\n\n/**\n * @author alteredq / http://alteredqualia.com/\n * @author Mugen87 / https://github.com/Mugen87\n *\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n */\n\nfunction CameraHelper( camera ) {\n\n\tvar geometry = new BufferGeometry();\n\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\tvar vertices = [];\n\tvar colors = [];\n\n\tvar pointMap = {};\n\n\t// colors\n\n\tvar colorFrustum = new Color( 0xffaa00 );\n\tvar colorCone = new Color( 0xff0000 );\n\tvar colorUp = new Color( 0x00aaff );\n\tvar colorTarget = new Color( 0xffffff );\n\tvar colorCross = new Color( 0x333333 );\n\n\t// near\n\n\taddLine( 'n1', 'n2', colorFrustum );\n\taddLine( 'n2', 'n4', colorFrustum );\n\taddLine( 'n4', 'n3', colorFrustum );\n\taddLine( 'n3', 'n1', colorFrustum );\n\n\t// far\n\n\taddLine( 'f1', 'f2', colorFrustum );\n\taddLine( 'f2', 'f4', colorFrustum );\n\taddLine( 'f4', 'f3', colorFrustum );\n\taddLine( 'f3', 'f1', colorFrustum );\n\n\t// sides\n\n\taddLine( 'n1', 'f1', colorFrustum );\n\taddLine( 'n2', 'f2', colorFrustum );\n\taddLine( 'n3', 'f3', colorFrustum );\n\taddLine( 'n4', 'f4', colorFrustum );\n\n\t// cone\n\n\taddLine( 'p', 'n1', colorCone );\n\taddLine( 'p', 'n2', colorCone );\n\taddLine( 'p', 'n3', colorCone );\n\taddLine( 'p', 'n4', colorCone );\n\n\t// up\n\n\taddLine( 'u1', 'u2', colorUp );\n\taddLine( 'u2', 'u3', colorUp );\n\taddLine( 'u3', 'u1', colorUp );\n\n\t// target\n\n\taddLine( 'c', 't', colorTarget );\n\taddLine( 'p', 'c', colorCross );\n\n\t// cross\n\n\taddLine( 'cn1', 'cn2', colorCross );\n\taddLine( 'cn3', 'cn4', colorCross );\n\n\taddLine( 'cf1', 'cf2', colorCross );\n\taddLine( 'cf3', 'cf4', colorCross );\n\n\tfunction addLine( a, b, color ) {\n\n\t\taddPoint( a, color );\n\t\taddPoint( b, color );\n\n\t}\n\n\tfunction addPoint( id, color ) {\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\tpointMap[ id ] = [];\n\n\t\t}\n\n\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t}\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.camera = camera;\n\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\tthis.matrix = camera.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.pointMap = pointMap;\n\n\tthis.update();\n\n}\n\nCameraHelper.prototype = Object.create( LineSegments.prototype );\nCameraHelper.prototype.constructor = CameraHelper;\n\nCameraHelper.prototype.update = function () {\n\n\tvar geometry, pointMap;\n\n\tvar vector = new Vector3();\n\tvar camera = new Camera();\n\n\tfunction setPoint( point, x, y, z ) {\n\n\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\tvar points = pointMap[ point ];\n\n\t\tif ( points !== undefined ) {\n\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn function update() {\n\n\t\tgeometry = this.geometry;\n\t\tpointMap = this.pointMap;\n\n\t\tvar w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\tcamera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', 0, 0, - 1 );\n\t\tsetPoint( 't', 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', - w, - h, - 1 );\n\t\tsetPoint( 'n2', w, - h, - 1 );\n\t\tsetPoint( 'n3', - w, h, - 1 );\n\t\tsetPoint( 'n4', w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', - w, - h, 1 );\n\t\tsetPoint( 'f2', w, - h, 1 );\n\t\tsetPoint( 'f3', - w, h, 1 );\n\t\tsetPoint( 'f4', w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', - w, 0, 1 );\n\t\tsetPoint( 'cf2', w, 0, 1 );\n\t\tsetPoint( 'cf3', 0, - h, 1 );\n\t\tsetPoint( 'cf4', 0, h, 1 );\n\n\t\tsetPoint( 'cn1', - w, 0, - 1 );\n\t\tsetPoint( 'cn2', w, 0, - 1 );\n\t\tsetPoint( 'cn3', 0, - h, - 1 );\n\t\tsetPoint( 'cn4', 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t};\n\n}();\n\n/**\n * @author mrdoob / http://mrdoob.com/\n * @author Mugen87 / http://github.com/Mugen87\n */\n\nfunction BoxHelper( object, color ) {\n\n\tthis.object = object;\n\n\tif ( color === undefined ) color = 0xffff00;\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\tvar positions = new Float32Array( 8 * 3 );\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n}\n\nBoxHelper.prototype = Object.create( LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new Box3();\n\n\treturn function update( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\tbox.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tvar min = box.min;\n\t\tvar max = box.max;\n\n\t\t/*\n\t\t 5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tvar position = this.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t};\n\n} )();\n\nBoxHelper.prototype.setFromObject = function ( object ) {\n\n\tthis.object = object;\n\tthis.update();\n\n\treturn this;\n\n};\n\nBoxHelper.prototype.copy = function ( source ) {\n\n\tLineSegments.prototype.copy.call( this, source );\n\n\tthis.object = source.object;\n\n\treturn this;\n\n};\n\nBoxHelper.prototype.clone = function () {\n\n\treturn new this.constructor().copy( this );\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction Box3Helper( box, color ) {\n\n\tthis.type = 'Box3Helper';\n\n\tthis.box = box;\n\n\tcolor = color || 0xffff00;\n\n\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\tvar positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\tvar geometry = new BufferGeometry();\n\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\tthis.geometry.computeBoundingSphere();\n\n}\n\nBox3Helper.prototype = Object.create( LineSegments.prototype );\nBox3Helper.prototype.constructor = Box3Helper;\n\nBox3Helper.prototype.updateMatrixWorld = function ( force ) {\n\n\tvar box = this.box;\n\n\tif ( box.isEmpty() ) return;\n\n\tbox.getCenter( this.position );\n\n\tbox.getSize( this.scale );\n\n\tthis.scale.multiplyScalar( 0.5 );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n */\n\nfunction PlaneHelper( plane, size, hex ) {\n\n\tthis.type = 'PlaneHelper';\n\n\tthis.plane = plane;\n\n\tthis.size = ( size === undefined ) ? 1 : size;\n\n\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tvar positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\tgeometry.computeBoundingSphere();\n\n\tLine.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t//\n\n\tvar positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\tvar geometry2 = new BufferGeometry();\n\tgeometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\tgeometry2.computeBoundingSphere();\n\n\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) );\n\n}\n\nPlaneHelper.prototype = Object.create( Line.prototype );\nPlaneHelper.prototype.constructor = PlaneHelper;\n\nPlaneHelper.prototype.updateMatrixWorld = function ( force ) {\n\n\tvar scale = - this.plane.constant;\n\n\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\tthis.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here\n\n\tthis.lookAt( this.plane.normal );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\n/**\n * @author WestLangley / http://github.com/WestLangley\n * @author zz85 / http://github.com/zz85\n * @author bhouston / http://clara.io\n *\n * Creates an arrow for visualizing directions\n *\n * Parameters:\n * dir - Vector3\n * origin - Vector3\n * length - Number\n * color - color in hex value\n * headLength - Number\n * headWidth - Number\n */\n\nvar lineGeometry, coneGeometry;\n\nfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t// dir is assumed to be normalized\n\n\tObject3D.call( this );\n\n\tif ( dir === undefined ) dir = new Vector3( 0, 0, 1 );\n\tif ( origin === undefined ) origin = new Vector3( 0, 0, 0 );\n\tif ( length === undefined ) length = 1;\n\tif ( color === undefined ) color = 0xffff00;\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tif ( lineGeometry === undefined ) {\n\n\t\tlineGeometry = new BufferGeometry();\n\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t}\n\n\tthis.position.copy( origin );\n\n\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\tthis.line.matrixAutoUpdate = false;\n\tthis.add( this.line );\n\n\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\tthis.cone.matrixAutoUpdate = false;\n\tthis.add( this.cone );\n\n\tthis.setDirection( dir );\n\tthis.setLength( length, headLength, headWidth );\n\n}\n\nArrowHelper.prototype = Object.create( Object3D.prototype );\nArrowHelper.prototype.constructor = ArrowHelper;\n\nArrowHelper.prototype.setDirection = ( function () {\n\n\tvar axis = new Vector3();\n\tvar radians;\n\n\treturn function setDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tradians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t}\n\n\t};\n\n}() );\n\nArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\tthis.line.updateMatrix();\n\n\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\tthis.cone.position.y = length;\n\tthis.cone.updateMatrix();\n\n};\n\nArrowHelper.prototype.setColor = function ( color ) {\n\n\tthis.line.material.color.set( color );\n\tthis.cone.material.color.set( color );\n\n};\n\nArrowHelper.prototype.copy = function ( source ) {\n\n\tObject3D.prototype.copy.call( this, source, false );\n\n\tthis.line.copy( source.line );\n\tthis.cone.copy( source.cone );\n\n\treturn this;\n\n};\n\nArrowHelper.prototype.clone = function () {\n\n\treturn new this.constructor().copy( this );\n\n};\n\n/**\n * @author sroucheray / http://sroucheray.org/\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction AxesHelper( size ) {\n\n\tsize = size || 1;\n\n\tvar vertices = [\n\t\t0, 0, 0,\tsize, 0, 0,\n\t\t0, 0, 0,\t0, size, 0,\n\t\t0, 0, 0,\t0, 0, size\n\t];\n\n\tvar colors = [\n\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t0, 0, 1,\t0, 0.6, 1\n\t];\n\n\tvar geometry = new BufferGeometry();\n\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\tLineSegments.call( this, geometry, material );\n\n}\n\nAxesHelper.prototype = Object.create( LineSegments.prototype );\nAxesHelper.prototype.constructor = AxesHelper;\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n}\n\nvar LineStrip = 0;\n\nvar LinePieces = 1;\n\nfunction MeshFaceMaterial( materials ) {\n\n\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\treturn materials;\n\n}\n\nfunction MultiMaterial( materials ) {\n\n\tif ( materials === undefined ) materials = [];\n\n\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\tmaterials.isMultiMaterial = true;\n\tmaterials.materials = materials;\n\tmaterials.clone = function () {\n\n\t\treturn materials.slice();\n\n\t};\n\treturn materials;\n\n}\n\nfunction PointCloud( geometry, material ) {\n\n\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction Particle( material ) {\n\n\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\treturn new Sprite( material );\n\n}\n\nfunction ParticleSystem( geometry, material ) {\n\n\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction PointCloudMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleBasicMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleSystemMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction Vertex( x, y, z ) {\n\n\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\treturn new Vector3( x, y, z );\n\n}\n\n//\n\nfunction DynamicBufferAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n}\n\nfunction Int8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\treturn new Int8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\treturn new Uint8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n}\n\nfunction Int16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\treturn new Int16BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\treturn new Uint16BufferAttribute( array, itemSize );\n\n}\n\nfunction Int32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\treturn new Int32BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\treturn new Uint32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\treturn new Float32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float64Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\treturn new Float64BufferAttribute( array, itemSize );\n\n}\n\n//\n\nCurve.create = function ( construct, getPoint ) {\n\n\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\tconstruct.prototype = Object.create( Curve.prototype );\n\tconstruct.prototype.constructor = construct;\n\tconstruct.prototype.getPoint = getPoint;\n\n\treturn construct;\n\n};\n\n//\n\nObject.assign( CurvePath.prototype, {\n\n\tcreatePointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from path points (for Line or Points objects)\n\n\t\tvar pts = this.getPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from equidistant sampling along the path\n\n\t\tvar pts = this.getSpacedPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateGeometry: function ( points ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\tvar geometry = new Geometry();\n\n\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tvar point = points[ i ];\n\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\n//\n\nObject.assign( Path.prototype, {\n\n\tfromPoints: function ( points ) {\n\n\t\tconsole.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );\n\t\tthis.setFromPoints( points );\n\n\t}\n\n} );\n\n//\n\nfunction ClosedSplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\tthis.closed = true;\n\n}\n\nClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction SplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction Spline( points ) {\n\n\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\nObject.assign( Spline.prototype, {\n\n\tinitFromArray: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t},\n\tgetControlPointsArray: function ( /* optionalTarget */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t},\n\treparametrizeByArcLength: function ( /* samplingCoef */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nfunction AxisHelper( size ) {\n\n\tconsole.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );\n\treturn new AxesHelper( size );\n\n}\n\nfunction BoundingBoxHelper( object, color ) {\n\n\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\treturn new BoxHelper( object, color );\n\n}\n\nfunction EdgesHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\nGridHelper.prototype.setColors = function () {\n\n\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n};\n\nSkeletonHelper.prototype.update = function () {\n\n\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n};\n\nfunction WireframeHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\n//\n\nObject.assign( Loader.prototype, {\n\n\textractUrlBase: function ( url ) {\n\n\t\tconsole.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );\n\t\treturn LoaderUtils.extractUrlBase( url );\n\n\t}\n\n} );\n\nfunction XHRLoader( manager ) {\n\n\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\treturn new FileLoader( manager );\n\n}\n\nfunction BinaryTextureLoader( manager ) {\n\n\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\treturn new DataTextureLoader( manager );\n\n}\n\nObject.assign( ObjectLoader.prototype, {\n\n\tsetTexturePath: function ( value ) {\n\n\t\tconsole.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );\n\t\treturn this.setResourcePath( value );\n\n\t}\n\n} );\n\n//\n\nObject.assign( Box2.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nObject.assign( Box3.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nLine3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nObject.assign( _Math, {\n\n\trandom16: function () {\n\n\t\tconsole.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t},\n\n\tnearestPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' );\n\t\treturn _Math.floorPowerOfTwo( value );\n\n\t},\n\n\tnextPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' );\n\t\treturn _Math.ceilPowerOfTwo( value );\n\n\t}\n\n} );\n\nObject.assign( Matrix3.prototype, {\n\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\treturn vector.applyMatrix3( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );\n\n\t},\n\tapplyToBuffer: function ( buffer /*, offset, length */ ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\treturn this.applyToBufferAttribute( buffer );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t}\n\n} );\n\nObject.assign( Matrix4.prototype, {\n\n\textractPosition: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\treturn this.copyPosition( m );\n\n\t},\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tgetPosition: function () {\n\n\t\tvar v1;\n\n\t\treturn function getPosition() {\n\n\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t};\n\n\t}(),\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\treturn this.makeRotationFromQuaternion( q );\n\n\t},\n\tmultiplyToArray: function () {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector4: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );\n\n\t},\n\trotateAxis: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\tv.transformDirection( this );\n\n\t},\n\tcrossVector: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\ttranslate: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t},\n\trotateX: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t},\n\trotateY: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t},\n\trotateZ: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t},\n\trotateByAxis: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t},\n\tapplyToBuffer: function ( buffer /*, offset, length */ ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\treturn this.applyToBufferAttribute( buffer );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t},\n\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t}\n\n} );\n\nPlane.prototype.isIntersectionLine = function ( line ) {\n\n\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\treturn this.intersectsLine( line );\n\n};\n\nQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\treturn vector.applyQuaternion( this );\n\n};\n\nObject.assign( Ray.prototype, {\n\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionPlane: function ( plane ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\treturn this.intersectsPlane( plane );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t}\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tarea: function () {\n\n\t\tconsole.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );\n\t\treturn this.getArea();\n\n\t},\n\tbarycoordFromPoint: function ( point, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn this.getBarycoord( point, target );\n\n\t},\n\tmidpoint: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );\n\t\treturn this.getMidpoint( target );\n\n\t},\n\tnormal: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn this.getNormal( target );\n\n\t},\n\tplane: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );\n\t\treturn this.getPlane( target );\n\n\t}\n\n} );\n\nObject.assign( Triangle, {\n\n\tbarycoordFromPoint: function ( point, a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn Triangle.getBarycoord( point, a, b, c, target );\n\n\t},\n\tnormal: function ( a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn Triangle.getNormal( a, b, c, target );\n\n\t}\n\n} );\n\nObject.assign( Shape.prototype, {\n\n\textractAllPoints: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );\n\t\treturn this.extractPoints( divisions );\n\n\t},\n\textrude: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\treturn new ExtrudeGeometry( this, options );\n\n\t},\n\tmakeGeometry: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\treturn new ShapeGeometry( this, options );\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector3.prototype, {\n\n\tsetEulerFromRotationMatrix: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t},\n\tsetEulerFromQuaternion: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t},\n\tgetPositionFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\treturn this.setFromMatrixPosition( m );\n\n\t},\n\tgetScaleFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\treturn this.setFromMatrixScale( m );\n\n\t},\n\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t},\n\tapplyProjection: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\treturn this.applyMatrix4( m );\n\n\t},\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector4.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\n//\n\nObject.assign( Geometry.prototype, {\n\n\tcomputeTangents: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeLineDistances: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );\n\n\t}\n\n} );\n\nObject.assign( Object3D.prototype, {\n\n\tgetChildByName: function ( name ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\treturn this.getObjectByName( name );\n\n\t},\n\trenderDepth: function () {\n\n\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t},\n\ttranslate: function ( distance, axis ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\treturn this.translateOnAxis( axis, distance );\n\n\t},\n\tgetWorldRotation: function () {\n\n\t\tconsole.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );\n\n\t}\n\n} );\n\nObject.defineProperties( Object3D.prototype, {\n\n\teulerOrder: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\treturn this.rotation.order;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\tthis.rotation.order = value;\n\n\t\t}\n\t},\n\tuseQuaternion: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( LOD.prototype, {\n\n\tobjects: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\treturn this.levels;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperty( Skeleton.prototype, 'useVertexTexture', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t},\n\tset: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t}\n\n} );\n\nSkinnedMesh.prototype.initBones = function () {\n\n\tconsole.error( 'THREE.SkinnedMesh: initBones() has been removed.' );\n\n};\n\nObject.defineProperty( Curve.prototype, '__arcLengthDivisions', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\treturn this.arcLengthDivisions;\n\n\t},\n\tset: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\tthis.arcLengthDivisions = value;\n\n\t}\n\n} );\n\n//\n\nPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\tthis.setFocalLength( focalLength );\n\n};\n\n//\n\nObject.defineProperties( Light.prototype, {\n\tonlyShadow: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t}\n\t},\n\tshadowCameraFov: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\tthis.shadow.camera.fov = value;\n\n\t\t}\n\t},\n\tshadowCameraLeft: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\tthis.shadow.camera.left = value;\n\n\t\t}\n\t},\n\tshadowCameraRight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\tthis.shadow.camera.right = value;\n\n\t\t}\n\t},\n\tshadowCameraTop: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\tthis.shadow.camera.top = value;\n\n\t\t}\n\t},\n\tshadowCameraBottom: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t}\n\t},\n\tshadowCameraNear: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\tthis.shadow.camera.near = value;\n\n\t\t}\n\t},\n\tshadowCameraFar: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\tthis.shadow.camera.far = value;\n\n\t\t}\n\t},\n\tshadowCameraVisible: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t}\n\t},\n\tshadowBias: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\tthis.shadow.bias = value;\n\n\t\t}\n\t},\n\tshadowDarkness: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t}\n\t},\n\tshadowMapWidth: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t}\n\t},\n\tshadowMapHeight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t}\n\t}\n} );\n\n//\n\nObject.defineProperties( BufferAttribute.prototype, {\n\n\tlength: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\treturn this.array.length;\n\n\t\t}\n\t},\n\tcopyIndicesArray: function ( /* indices */ ) {\n\n\t\tconsole.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );\n\n\t}\n\n} );\n\nObject.assign( BufferGeometry.prototype, {\n\n\taddIndex: function ( index ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\tthis.setIndex( index );\n\n\t},\n\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\tif ( indexOffset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t}\n\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\tthis.addGroup( start, count );\n\n\t},\n\tclearDrawCalls: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\tthis.clearGroups();\n\n\t},\n\tcomputeTangents: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeOffsets: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperties( BufferGeometry.prototype, {\n\n\tdrawcalls: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t},\n\toffsets: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( ExtrudeBufferGeometry.prototype, {\n\n\tgetArrays: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' );\n\n\t},\n\n\taddShapeList: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' );\n\n\t},\n\n\taddShape: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Uniform.prototype, {\n\n\tdynamic: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t}\n\t},\n\tonUpdate: {\n\t\tvalue: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\treturn this;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Material.prototype, {\n\n\twrapAround: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t}\n\t},\n\n\toverdraw: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t}\n\t},\n\n\twrapRGB: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\treturn new Color();\n\n\t\t}\n\t},\n\n\tshading: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\tmetal: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( ShaderMaterial.prototype, {\n\n\tderivatives: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\treturn this.extensions.derivatives;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\tthis.extensions.derivatives = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( WebGLRenderer.prototype, {\n\n\tclearTarget: function ( renderTarget, color, depth, stencil ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );\n\t\tthis.setRenderTarget( renderTarget );\n\t\tthis.clear( color, depth, stencil );\n\n\t},\n\tanimate: function ( callback ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );\n\t\tthis.setAnimationLoop( callback );\n\n\t},\n\tgetCurrentRenderTarget: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\t\treturn this.getRenderTarget();\n\n\t},\n\tgetMaxAnisotropy: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\t\treturn this.capabilities.getMaxAnisotropy();\n\n\t},\n\tgetPrecision: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\t\treturn this.capabilities.precision;\n\n\t},\n\tresetGLState: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );\n\t\treturn this.state.reset();\n\n\t},\n\tsupportsFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t},\n\tsupportsHalfFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t},\n\tsupportsStandardDerivatives: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t},\n\tsupportsCompressedTextureS3TC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t},\n\tsupportsCompressedTexturePVRTC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t},\n\tsupportsBlendMinMax: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t},\n\tsupportsVertexTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\treturn this.capabilities.vertexTextures;\n\n\t},\n\tsupportsInstancedArrays: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t},\n\tenableScissorTest: function ( boolean ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\tthis.setScissorTest( boolean );\n\n\t},\n\tinitMaterial: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t},\n\taddPrePlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t},\n\taddPostPlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t},\n\tupdateShadowMap: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t},\n\tsetFaceCulling: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );\n\n\t},\n\tallocTextureUnit: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );\n\n\t},\n\tsetTexture: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );\n\n\t},\n\tsetTexture2D: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );\n\n\t},\n\tsetTextureCube: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );\n\n\t}\n\n} );\n\nObject.defineProperties( WebGLRenderer.prototype, {\n\n\tshadowMapEnabled: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.enabled;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\tthis.shadowMap.enabled = value;\n\n\t\t}\n\t},\n\tshadowMapType: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\tthis.shadowMap.type = value;\n\n\t\t}\n\t},\n\tshadowMapCullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n} );\n\nObject.defineProperties( WebGLShadowMap.prototype, {\n\n\tcullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* cullFace */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderReverseSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderSingleSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( WebGLRenderTargetCube.prototype, {\n\n\tactiveCubeFace: {\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTargetCube: .activeCubeFace has been removed. It is now the second parameter of WebGLRenderer.setRenderTarget().' );\n\n\t\t}\n\t},\n\tactiveMipMapLevel: {\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTargetCube: .activeMipMapLevel has been removed. It is now the third parameter of WebGLRenderer.setRenderTarget().' );\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\twrapS: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\treturn this.texture.wrapS;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\tthis.texture.wrapS = value;\n\n\t\t}\n\t},\n\twrapT: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\treturn this.texture.wrapT;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\tthis.texture.wrapT = value;\n\n\t\t}\n\t},\n\tmagFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\treturn this.texture.magFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\tthis.texture.magFilter = value;\n\n\t\t}\n\t},\n\tminFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\treturn this.texture.minFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\tthis.texture.minFilter = value;\n\n\t\t}\n\t},\n\tanisotropy: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\treturn this.texture.anisotropy;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\tthis.texture.anisotropy = value;\n\n\t\t}\n\t},\n\toffset: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\treturn this.texture.offset;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\tthis.texture.offset = value;\n\n\t\t}\n\t},\n\trepeat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\treturn this.texture.repeat;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\tthis.texture.repeat = value;\n\n\t\t}\n\t},\n\tformat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\treturn this.texture.format;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\tthis.texture.format = value;\n\n\t\t}\n\t},\n\ttype: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\treturn this.texture.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\tthis.texture.type = value;\n\n\t\t}\n\t},\n\tgenerateMipmaps: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\treturn this.texture.generateMipmaps;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( WebVRManager.prototype, {\n\n\tstanding: {\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebVRManager: .standing has been removed.' );\n\n\t\t}\n\t},\n\tuserHeight: {\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebVRManager: .userHeight has been removed.' );\n\n\t\t}\n\t}\n\n} );\n\n//\n\nAudio.prototype.load = function ( file ) {\n\n\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\tvar scope = this;\n\tvar audioLoader = new AudioLoader();\n\taudioLoader.load( file, function ( buffer ) {\n\n\t\tscope.setBuffer( buffer );\n\n\t} );\n\treturn this;\n\n};\n\nAudioAnalyser.prototype.getData = function () {\n\n\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\treturn this.getFrequencyData();\n\n};\n\n//\n\nCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\treturn this.update( renderer, scene );\n\n};\n\n//\n\nvar GeometryUtils = {\n\n\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\tvar matrix;\n\n\t\tif ( geometry2.isMesh ) {\n\n\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\tmatrix = geometry2.matrix;\n\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t}\n\n\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t},\n\n\tcenter: function ( geometry ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\treturn geometry.center();\n\n\t}\n\n};\n\nImageUtils.crossOrigin = undefined;\n\nImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\tvar loader = new TextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\tvar loader = new CubeTextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadCompressedTexture = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\nImageUtils.loadCompressedTextureCube = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\n//\n\nfunction CanvasRenderer() {\n\n\tconsole.error( 'THREE.CanvasRenderer has been removed' );\n\n}\n\n//\n\nfunction JSONLoader() {\n\n\tconsole.error( 'THREE.JSONLoader has been removed.' );\n\n}\n\n//\n\nvar SceneUtils = {\n\n\tcreateMultiMaterialObject: function ( /* geometry, materials */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t},\n\n\tdetach: function ( /* child, parent, scene */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t},\n\n\tattach: function ( /* child, scene, parent */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js' );\n\n\t}\n\n};\n\n//\n\nfunction LensFlare() {\n\n\tconsole.error( 'THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js' );\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AlphaFormat, AlwaysDepth, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, AxisHelper, BackSide, BasicDepthPacking, BasicShadowMap, BinaryTextureLoader, Bone, BooleanKeyframeTrack, BoundingBoxHelper, Box2, Box3, Box3Helper, BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasRenderer, CanvasTexture, CatmullRomCurve3, CineonToneMapping, CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, ClosedSplineCurve3, Color, ColorKeyframeTrack, CompressedTexture, CompressedTextureLoader, ConeBufferGeometry, ConeGeometry, CubeCamera, BoxGeometry as CubeGeometry, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubeUVRefractionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CylinderBufferGeometry, CylinderGeometry, Cylindrical, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DirectionalLightShadow, DiscreteInterpolant, DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicBufferAttribute, EdgesGeometry, EdgesHelper, EllipseCurve, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeBufferGeometry, ExtrudeGeometry, Face3, Face4, FaceColors, FaceNormalsHelper, FileLoader, FlatShading, Float32Attribute, Float32BufferAttribute, Float64Attribute, Float64BufferAttribute, FloatType, Fog, FogExp2, Font, FontLoader, FrontFaceDirectionCCW, FrontFaceDirectionCW, FrontSide, Frustum, GammaEncoding, Geometry, GeometryUtils, GreaterDepth, GreaterEqualDepth, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, Int16Attribute, Int16BufferAttribute, Int32Attribute, Int32BufferAttribute, Int8Attribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, JSONLoader, KeyframeTrack, LOD, LatheBufferGeometry, LatheGeometry, Layers, LensFlare, LessDepth, LessEqualDepth, Light, LightProbe, LightProbeHelper, LightShadow, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LinePieces, LineSegments, LineStrip, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LogLuvEncoding, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, _Math as Math, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshFaceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiMaterial, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverDepth, NoBlending, NoColors, NoToneMapping, NormalBlending, NotEqualDepth, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, ParametricBufferGeometry, ParametricGeometry, Particle, ParticleBasicMaterial, ParticleSystem, ParticleSystemMaterial, Path, PerspectiveCamera, Plane, PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointCloud, PointCloudMaterial, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PositionalAudioHelper, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDEncoding, RGBEEncoding, RGBEFormat, RGBFormat, RGBM16Encoding, RGBM7Encoding, RGB_ETC1_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RectAreaLightHelper, RedFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, RingBufferGeometry, RingGeometry, Scene, SceneUtils, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, SmoothShading, Sphere, SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, SphericalReflectionMapping, Spline, SplineCurve, SplineCurve3, SpotLight, SpotLightHelper, SpotLightShadow, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StereoCamera, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, TetrahedronBufferGeometry, TetrahedronGeometry, TextBufferGeometry, TextGeometry, Texture, TextureLoader, TorusBufferGeometry, TorusGeometry, TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeBufferGeometry, TubeGeometry, UVMapping, Uint16Attribute, Uint16BufferAttribute, Uint32Attribute, Uint32BufferAttribute, Uint8Attribute, Uint8BufferAttribute, Uint8ClampedAttribute, Uint8ClampedBufferAttribute, Uncharted2ToneMapping, Uniform, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShort565Type, UnsignedShortType, Vector2, Vector3, Vector4, VectorKeyframeTrack, Vertex, VertexColors, VertexNormalsHelper, VideoTexture, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderTargetCube, WebGLRenderer, WebGLUtils, WireframeGeometry, WireframeHelper, WrapAroundEnding, XHRLoader, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, sRGBEncoding };\n","/**\n * @author Rich Tibbett / https://github.com/richtr\n * @author mrdoob / http://mrdoob.com/\n * @author Tony Parisi / http://www.tonyparisi.com/\n * @author Takahiro / https://github.com/takahirox\n * @author Don McCurdy / https://www.donmccurdy.com\n */\n\nvar THREE = require( 'three' );\n\n\nvar _GLTFLoader = ( function () {\n\n\tfunction GLTFLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\t\tthis.dracoLoader = null;\n\t\tthis.ddsLoader = null;\n\n\t}\n\n\tGLTFLoader.prototype = {\n\n\t\tconstructor: GLTFLoader,\n\n\t\tcrossOrigin: 'anonymous',\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar resourcePath;\n\n\t\t\tif ( this.resourcePath !== undefined ) {\n\n\t\t\t\tresourcePath = this.resourcePath;\n\n\t\t\t} else if ( this.path !== undefined ) {\n\n\t\t\t\tresourcePath = this.path;\n\n\t\t\t} else {\n\n\t\t\t\tresourcePath = THREE.LoaderUtils.extractUrlBase( url );\n\n\t\t\t}\n\n\t\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tvar _onError = function ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\n\t\t\tvar loader = new THREE.FileLoader( scope.manager );\n\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tif ( scope.crossOrigin === 'use-credentials' ) {\n\n\t\t\t\tloader.setWithCredentials( true );\n\n\t\t\t}\n\n\t\t\tloader.load( url, function ( data ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, _onError );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t_onError( e );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, _onError );\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResourcePath: function ( value ) {\n\n\t\t\tthis.resourcePath = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetDRACOLoader: function ( dracoLoader ) {\n\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetDDSLoader: function ( ddsLoader ) {\n\n\t\t\tthis.ddsLoader = ddsLoader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tparse: function ( data, path, onLoad, onError ) {\n\n\t\t\tvar content;\n\t\t\tvar extensions = {};\n\n\t\t\tif ( typeof data === 'string' ) {\n\n\t\t\t\tcontent = data;\n\n\t\t\t} else {\n\n\t\t\t\tvar magic = THREE.LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) );\n\n\t\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontent = THREE.LoaderUtils.decodeText( new Uint8Array( data ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar json = JSON.parse( content );\n\n\t\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported. Use LegacyGLTFLoader instead.' ) );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( json.extensionsUsed ) {\n\n\t\t\t\tfor ( var i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\t\tvar extensionName = json.extensionsUsed[ i ];\n\t\t\t\t\tvar extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_LIGHTS_PUNCTUAL:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFLightsExtension( json );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.MSFT_TEXTURE_DDS:\n\t\t\t\t\t\t\textensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] = new GLTFTextureDDSExtension( this.ddsLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\t\textensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar parser = new GLTFParser( json, extensions, {\n\n\t\t\t\tpath: path || this.resourcePath || '',\n\t\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\t\tmanager: this.manager\n\n\t\t\t} );\n\n\t\t\tparser.parse( onLoad, onError );\n\n\t\t}\n\n\t};\n\n\t/* GLTFREGISTRY */\n\n\tfunction GLTFRegistry() {\n\n\t\tvar objects = {};\n\n\t\treturn\t{\n\n\t\t\tget: function ( key ) {\n\n\t\t\t\treturn objects[ key ];\n\n\t\t\t},\n\n\t\t\tadd: function ( key, object ) {\n\n\t\t\t\tobjects[ key ] = object;\n\n\t\t\t},\n\n\t\t\tremove: function ( key ) {\n\n\t\t\t\tdelete objects[ key ];\n\n\t\t\t},\n\n\t\t\tremoveAll: function () {\n\n\t\t\t\tobjects = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/*********************************/\n\t/********** EXTENSIONS ***********/\n\t/*********************************/\n\n\tvar EXTENSIONS = {\n\t\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\t\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\t\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\t\tKHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n\t\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\t\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\t\tMSFT_TEXTURE_DDS: 'MSFT_texture_dds'\n\t};\n\n\t/**\n\t * DDS Texture Extension\n\t *\n\t * Specification:\n\t * https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds\n\t *\n\t */\n\tfunction GLTFTextureDDSExtension( ddsLoader ) {\n\n\t\tif ( ! ddsLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Attempting to load .dds texture without importing THREE.DDSLoader' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.MSFT_TEXTURE_DDS;\n\t\tthis.ddsLoader = ddsLoader;\n\n\t}\n\n\t/**\n\t * Lights Extension\n\t *\n\t * Specification: PENDING\n\t */\n\tfunction GLTFLightsExtension( json ) {\n\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\tvar extension = ( json.extensions && json.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ] ) || {};\n\t\tthis.lightDefs = extension.lights || [];\n\n\t}\n\n\tGLTFLightsExtension.prototype.loadLight = function ( lightIndex ) {\n\n\t\tvar lightDef = this.lightDefs[ lightIndex ];\n\t\tvar lightNode;\n\n\t\tvar color = new THREE.Color( 0xffffff );\n\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\n\t\tvar range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new THREE.DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new THREE.PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new THREE.SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type, \"' + lightDef.type + '\".' );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = lightDef.name || ( 'light_' + lightIndex );\n\n\t\treturn Promise.resolve( lightNode );\n\n\t};\n\n\t/**\n\t * Unlit Materials Extension (pending)\n\t *\n\t * PR: https://github.com/KhronosGroup/glTF/pull/1163\n\t */\n\tfunction GLTFMaterialsUnlitExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tGLTFMaterialsUnlitExtension.prototype.getMaterialType = function () {\n\n\t\treturn THREE.MeshBasicMaterial;\n\n\t};\n\n\tGLTFMaterialsUnlitExtension.prototype.extendParams = function ( materialParams, materialDef, parser ) {\n\n\t\tvar pending = [];\n\n\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tvar metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tvar array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/* BINARY EXTENSION */\n\tvar BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\n\tvar BINARY_EXTENSION_HEADER_LENGTH = 12;\n\tvar BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\n\tfunction GLTFBinaryExtension( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tvar headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\n\t\tthis.header = {\n\t\t\tmagic: THREE.LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected. Use LegacyGLTFLoader instead.' );\n\n\t\t}\n\n\t\tvar chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tvar chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkView.byteLength ) {\n\n\t\t\tvar chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tvar chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tvar contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = THREE.LoaderUtils.decodeText( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tvar byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * DRACO Mesh Compression Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/pull/874\n\t */\n\tfunction GLTFDracoMeshCompressionExtension( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\n\t}\n\n\tGLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function ( primitive, parser ) {\n\n\t\tvar json = this.json;\n\t\tvar dracoLoader = this.dracoLoader;\n\t\tvar bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tvar gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tvar threeAttributeMap = {};\n\t\tvar attributeNormalizedMap = {};\n\t\tvar attributeTypeMap = {};\n\n\t\tfor ( var attributeName in gltfAttributeMap ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( attributeName in primitive.attributes ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tvar accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tvar componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( var attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tvar attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tvar normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t} );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Texture Transform Extension\n\t *\n\t * Specification:\n\t */\n\tfunction GLTFTextureTransformExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\tGLTFTextureTransformExtension.prototype.extendTexture = function ( texture, transform ) {\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t};\n\n\t/**\n\t * Specular-Glossiness Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n\t */\n\tfunction GLTFMaterialsPbrSpecularGlossinessExtension() {\n\n\t\treturn {\n\n\t\t\tname: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,\n\n\t\t\tspecularGlossinessParams: [\n\t\t\t\t'color',\n\t\t\t\t'map',\n\t\t\t\t'lightMap',\n\t\t\t\t'lightMapIntensity',\n\t\t\t\t'aoMap',\n\t\t\t\t'aoMapIntensity',\n\t\t\t\t'emissive',\n\t\t\t\t'emissiveIntensity',\n\t\t\t\t'emissiveMap',\n\t\t\t\t'bumpMap',\n\t\t\t\t'bumpScale',\n\t\t\t\t'normalMap',\n\t\t\t\t'displacementMap',\n\t\t\t\t'displacementScale',\n\t\t\t\t'displacementBias',\n\t\t\t\t'specularMap',\n\t\t\t\t'specular',\n\t\t\t\t'glossinessMap',\n\t\t\t\t'glossiness',\n\t\t\t\t'alphaMap',\n\t\t\t\t'envMap',\n\t\t\t\t'envMapIntensity',\n\t\t\t\t'refractionRatio',\n\t\t\t],\n\n\t\t\tgetMaterialType: function () {\n\n\t\t\t\treturn THREE.ShaderMaterial;\n\n\t\t\t},\n\n\t\t\textendParams: function ( materialParams, materialDef, parser ) {\n\n\t\t\t\tvar pbrSpecularGlossiness = materialDef.extensions[ this.name ];\n\n\t\t\t\tvar shader = THREE.ShaderLib[ 'standard' ];\n\n\t\t\t\tvar uniforms = THREE.UniformsUtils.clone( shader.uniforms );\n\n\t\t\t\tvar specularMapParsFragmentChunk = [\n\t\t\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t\t\t'\tuniform sampler2D specularMap;',\n\t\t\t\t\t'#endif'\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tvar glossinessMapParsFragmentChunk = [\n\t\t\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t\t\t'\tuniform sampler2D glossinessMap;',\n\t\t\t\t\t'#endif'\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tvar specularMapFragmentChunk = [\n\t\t\t\t\t'vec3 specularFactor = specular;',\n\t\t\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t\t\t'\tvec4 texelSpecular = texture2D( specularMap, vUv );',\n\t\t\t\t\t'\ttexelSpecular = sRGBToLinear( texelSpecular );',\n\t\t\t\t\t'\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t\t\t'\tspecularFactor *= texelSpecular.rgb;',\n\t\t\t\t\t'#endif'\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tvar glossinessMapFragmentChunk = [\n\t\t\t\t\t'float glossinessFactor = glossiness;',\n\t\t\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t\t\t'\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );',\n\t\t\t\t\t'\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t\t\t'\tglossinessFactor *= texelGlossiness.a;',\n\t\t\t\t\t'#endif'\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tvar lightPhysicalFragmentChunk = [\n\t\t\t\t\t'PhysicalMaterial material;',\n\t\t\t\t\t'material.diffuseColor = diffuseColor.rgb;',\n\t\t\t\t\t'material.specularRoughness = clamp( 1.0 - glossinessFactor, 0.04, 1.0 );',\n\t\t\t\t\t'material.specularColor = specularFactor.rgb;',\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tvar fragmentShader = shader.fragmentShader\n\t\t\t\t\t.replace( 'uniform float roughness;', 'uniform vec3 specular;' )\n\t\t\t\t\t.replace( 'uniform float metalness;', 'uniform float glossiness;' )\n\t\t\t\t\t.replace( '#include ', specularMapParsFragmentChunk )\n\t\t\t\t\t.replace( '#include ', glossinessMapParsFragmentChunk )\n\t\t\t\t\t.replace( '#include ', specularMapFragmentChunk )\n\t\t\t\t\t.replace( '#include ', glossinessMapFragmentChunk )\n\t\t\t\t\t.replace( '#include ', lightPhysicalFragmentChunk );\n\n\t\t\t\tdelete uniforms.roughness;\n\t\t\t\tdelete uniforms.metalness;\n\t\t\t\tdelete uniforms.roughnessMap;\n\t\t\t\tdelete uniforms.metalnessMap;\n\n\t\t\t\tuniforms.specular = { value: new THREE.Color().setHex( 0x111111 ) };\n\t\t\t\tuniforms.glossiness = { value: 0.5 };\n\t\t\t\tuniforms.specularMap = { value: null };\n\t\t\t\tuniforms.glossinessMap = { value: null };\n\n\t\t\t\tmaterialParams.vertexShader = shader.vertexShader;\n\t\t\t\tmaterialParams.fragmentShader = fragmentShader;\n\t\t\t\tmaterialParams.uniforms = uniforms;\n\t\t\t\tmaterialParams.defines = { 'STANDARD': '' };\n\n\t\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\t\tvar pending = [];\n\n\t\t\t\tif ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {\n\n\t\t\t\t\tvar array = pbrSpecularGlossiness.diffuseFactor;\n\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams.emissive = new THREE.Color( 0.0, 0.0, 0.0 );\n\t\t\t\tmaterialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;\n\t\t\t\tmaterialParams.specular = new THREE.Color( 1.0, 1.0, 1.0 );\n\n\t\t\t\tif ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {\n\n\t\t\t\t\tmaterialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );\n\n\t\t\t\t}\n\n\t\t\t\tif ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {\n\n\t\t\t\t\tvar specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t},\n\n\t\t\tcreateMaterial: function ( params ) {\n\n\t\t\t\t// setup material properties based on MeshStandardMaterial for Specular-Glossiness\n\n\t\t\t\tvar material = new THREE.ShaderMaterial( {\n\t\t\t\t\tdefines: params.defines,\n\t\t\t\t\tvertexShader: params.vertexShader,\n\t\t\t\t\tfragmentShader: params.fragmentShader,\n\t\t\t\t\tuniforms: params.uniforms,\n\t\t\t\t\tfog: true,\n\t\t\t\t\tlights: true,\n\t\t\t\t\topacity: params.opacity,\n\t\t\t\t\ttransparent: params.transparent\n\t\t\t\t} );\n\n\t\t\t\tmaterial.isGLTFSpecularGlossinessMaterial = true;\n\n\t\t\t\tmaterial.color = params.color;\n\n\t\t\t\tmaterial.map = params.map === undefined ? null : params.map;\n\n\t\t\t\tmaterial.lightMap = null;\n\t\t\t\tmaterial.lightMapIntensity = 1.0;\n\n\t\t\t\tmaterial.aoMap = params.aoMap === undefined ? null : params.aoMap;\n\t\t\t\tmaterial.aoMapIntensity = 1.0;\n\n\t\t\t\tmaterial.emissive = params.emissive;\n\t\t\t\tmaterial.emissiveIntensity = 1.0;\n\t\t\t\tmaterial.emissiveMap = params.emissiveMap === undefined ? null : params.emissiveMap;\n\n\t\t\t\tmaterial.bumpMap = params.bumpMap === undefined ? null : params.bumpMap;\n\t\t\t\tmaterial.bumpScale = 1;\n\n\t\t\t\tmaterial.normalMap = params.normalMap === undefined ? null : params.normalMap;\n\n\t\t\t\tif ( params.normalScale ) material.normalScale = params.normalScale;\n\n\t\t\t\tmaterial.displacementMap = null;\n\t\t\t\tmaterial.displacementScale = 1;\n\t\t\t\tmaterial.displacementBias = 0;\n\n\t\t\t\tmaterial.specularMap = params.specularMap === undefined ? null : params.specularMap;\n\t\t\t\tmaterial.specular = params.specular;\n\n\t\t\t\tmaterial.glossinessMap = params.glossinessMap === undefined ? null : params.glossinessMap;\n\t\t\t\tmaterial.glossiness = params.glossiness;\n\n\t\t\t\tmaterial.alphaMap = null;\n\n\t\t\t\tmaterial.envMap = params.envMap === undefined ? null : params.envMap;\n\t\t\t\tmaterial.envMapIntensity = 1.0;\n\n\t\t\t\tmaterial.refractionRatio = 0.98;\n\n\t\t\t\tmaterial.extensions.derivatives = true;\n\n\t\t\t\treturn material;\n\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Clones a GLTFSpecularGlossinessMaterial instance. The ShaderMaterial.copy() method can\n\t\t\t * copy only properties it knows about or inherits, and misses many properties that would\n\t\t\t * normally be defined by MeshStandardMaterial.\n\t\t\t *\n\t\t\t * This method allows GLTFSpecularGlossinessMaterials to be cloned in the process of\n\t\t\t * loading a glTF model, but cloning later (e.g. by the user) would require these changes\n\t\t\t * AND also updating `.onBeforeRender` on the parent mesh.\n\t\t\t *\n\t\t\t * @param {THREE.ShaderMaterial} source\n\t\t\t * @return {THREE.ShaderMaterial}\n\t\t\t */\n\t\t\tcloneMaterial: function ( source ) {\n\n\t\t\t\tvar target = source.clone();\n\n\t\t\t\ttarget.isGLTFSpecularGlossinessMaterial = true;\n\n\t\t\t\tvar params = this.specularGlossinessParams;\n\n\t\t\t\tfor ( var i = 0, il = params.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar value = source[ params[ i ] ];\n\t\t\t\t\ttarget[ params[ i ] ] = ( value && value.isColor ) ? value.clone() : value;\n\n\t\t\t\t}\n\n\t\t\t\treturn target;\n\n\t\t\t},\n\n\t\t\t// Here's based on refreshUniformsCommon() and refreshUniformsStandard() in WebGLRenderer.\n\t\t\trefreshUniforms: function ( renderer, scene, camera, geometry, material ) {\n\n\t\t\t\tif ( material.isGLTFSpecularGlossinessMaterial !== true ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms = material.uniforms;\n\t\t\t\tvar defines = material.defines;\n\n\t\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\t\tuniforms.diffuse.value.copy( material.color );\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t\tuniforms.map.value = material.map;\n\t\t\t\tuniforms.specularMap.value = material.specularMap;\n\t\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t\t// uv repeat and offset setting priorities\n\t\t\t\t// 1. color map\n\t\t\t\t// 2. specular map\n\t\t\t\t// 3. normal map\n\t\t\t\t// 4. bump map\n\t\t\t\t// 5. alpha map\n\t\t\t\t// 6. emissive map\n\n\t\t\t\tvar uvScaleMap;\n\n\t\t\t\tif ( material.map ) {\n\n\t\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t\t} else if ( material.glossinessMap ) {\n\n\t\t\t\t\tuvScaleMap = material.glossinessMap;\n\n\t\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t\t// backwards compatibility\n\t\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.envMap ) {\n\n\t\t\t\t\tuniforms.envMap.value = material.envMap;\n\t\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t\t\t// WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t\t\t// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\t\t\tuniforms.flipEnvMap.value = material.envMap.isCubeTexture ? - 1 : 1;\n\n\t\t\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t\t\t\tuniforms.maxMipLevel.value = renderer.properties.get( material.envMap ).__maxMipLevel;\n\n\t\t\t\t}\n\n\t\t\t\tuniforms.specular.value.copy( material.specular );\n\t\t\t\tuniforms.glossiness.value = material.glossiness;\n\n\t\t\t\tuniforms.glossinessMap.value = material.glossinessMap;\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t\tif ( uniforms.glossinessMap.value !== null && defines.USE_GLOSSINESSMAP === undefined ) {\n\n\t\t\t\t\tdefines.USE_GLOSSINESSMAP = '';\n\t\t\t\t\t// set USE_ROUGHNESSMAP to enable vUv\n\t\t\t\t\tdefines.USE_ROUGHNESSMAP = '';\n\n\t\t\t\t}\n\n\t\t\t\tif ( uniforms.glossinessMap.value === null && defines.USE_GLOSSINESSMAP !== undefined ) {\n\n\t\t\t\t\tdelete defines.USE_GLOSSINESSMAP;\n\t\t\t\t\tdelete defines.USE_ROUGHNESSMAP;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/*********************************/\n\t/********** INTERPOLATION ********/\n\t/*********************************/\n\n\t// Spline Interpolation\n\t// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\n\tfunction GLTFCubicSplineInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tTHREE.Interpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tGLTFCubicSplineInterpolant.prototype = Object.create( THREE.Interpolant.prototype );\n\tGLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant;\n\n\tGLTFCubicSplineInterpolant.prototype.copySampleValue_ = function ( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( var i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\tGLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer;\n\t\tvar values = this.sampleValues;\n\t\tvar stride = this.valueSize;\n\n\t\tvar stride2 = stride * 2;\n\t\tvar stride3 = stride * 3;\n\n\t\tvar td = t1 - t0;\n\n\t\tvar p = ( t - t0 ) / td;\n\t\tvar pp = p * p;\n\t\tvar ppp = pp * p;\n\n\t\tvar offset1 = i1 * stride3;\n\t\tvar offset0 = offset1 - stride3;\n\n\t\tvar s2 = - 2 * ppp + 3 * pp;\n\t\tvar s3 = ppp - pp;\n\t\tvar s0 = 1 - s2;\n\t\tvar s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( var i = 0; i !== stride; i ++ ) {\n\n\t\t\tvar p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tvar m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tvar p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tvar m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\t/*********************************/\n\t/********** INTERNALS ************/\n\t/*********************************/\n\n\t/* CONSTANTS */\n\n\tvar WEBGL_CONSTANTS = {\n\t\tFLOAT: 5126,\n\t\t//FLOAT_MAT2: 35674,\n\t\tFLOAT_MAT3: 35675,\n\t\tFLOAT_MAT4: 35676,\n\t\tFLOAT_VEC2: 35664,\n\t\tFLOAT_VEC3: 35665,\n\t\tFLOAT_VEC4: 35666,\n\t\tLINEAR: 9729,\n\t\tREPEAT: 10497,\n\t\tSAMPLER_2D: 35678,\n\t\tPOINTS: 0,\n\t\tLINES: 1,\n\t\tLINE_LOOP: 2,\n\t\tLINE_STRIP: 3,\n\t\tTRIANGLES: 4,\n\t\tTRIANGLE_STRIP: 5,\n\t\tTRIANGLE_FAN: 6,\n\t\tUNSIGNED_BYTE: 5121,\n\t\tUNSIGNED_SHORT: 5123\n\t};\n\n\tvar WEBGL_COMPONENT_TYPES = {\n\t\t5120: Int8Array,\n\t\t5121: Uint8Array,\n\t\t5122: Int16Array,\n\t\t5123: Uint16Array,\n\t\t5125: Uint32Array,\n\t\t5126: Float32Array\n\t};\n\n\tvar WEBGL_FILTERS = {\n\t\t9728: THREE.NearestFilter,\n\t\t9729: THREE.LinearFilter,\n\t\t9984: THREE.NearestMipMapNearestFilter,\n\t\t9985: THREE.LinearMipMapNearestFilter,\n\t\t9986: THREE.NearestMipMapLinearFilter,\n\t\t9987: THREE.LinearMipMapLinearFilter\n\t};\n\n\tvar WEBGL_WRAPPINGS = {\n\t\t33071: THREE.ClampToEdgeWrapping,\n\t\t33648: THREE.MirroredRepeatWrapping,\n\t\t10497: THREE.RepeatWrapping\n\t};\n\n\tvar WEBGL_TYPE_SIZES = {\n\t\t'SCALAR': 1,\n\t\t'VEC2': 2,\n\t\t'VEC3': 3,\n\t\t'VEC4': 4,\n\t\t'MAT2': 4,\n\t\t'MAT3': 9,\n\t\t'MAT4': 16\n\t};\n\n\tvar ATTRIBUTES = {\n\t\tPOSITION: 'position',\n\t\tNORMAL: 'normal',\n\t\tTANGENT: 'tangent',\n\t\tTEXCOORD_0: 'uv',\n\t\tTEXCOORD_1: 'uv2',\n\t\tCOLOR_0: 'color',\n\t\tWEIGHTS_0: 'skinWeight',\n\t\tJOINTS_0: 'skinIndex',\n\t};\n\n\tvar PATH_PROPERTIES = {\n\t\tscale: 'scale',\n\t\ttranslation: 'position',\n\t\trotation: 'quaternion',\n\t\tweights: 'morphTargetInfluences'\n\t};\n\n\tvar INTERPOLATION = {\n\t\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\t\tLINEAR: THREE.InterpolateLinear,\n\t\tSTEP: THREE.InterpolateDiscrete\n\t};\n\n\tvar ALPHA_MODES = {\n\t\tOPAQUE: 'OPAQUE',\n\t\tMASK: 'MASK',\n\t\tBLEND: 'BLEND'\n\t};\n\n\tvar MIME_TYPE_FORMATS = {\n\t\t'image/png': THREE.RGBAFormat,\n\t\t'image/jpeg': THREE.RGBFormat\n\t};\n\n\t/* UTILITY FUNCTIONS */\n\n\tfunction resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n\tvar defaultMaterial;\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n\t */\n\tfunction createDefaultMaterial() {\n\n\t\tdefaultMaterial = defaultMaterial || new THREE.MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: THREE.FrontSide\n\t\t} );\n\n\t\treturn defaultMaterial;\n\n\t}\n\n\tfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t\t// Add unknown glTF extensions to an object's userData.\n\n\t\tfor ( var name in objectDef.extensions ) {\n\n\t\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|THREE.Material|THREE.BufferGeometry} object\n\t * @param {GLTF.definition} gltfDef\n\t */\n\tfunction assignExtrasToUserData( object, gltfDef ) {\n\n\t\tif ( gltfDef.extras !== undefined ) {\n\n\t\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n\t *\n\t * @param {THREE.BufferGeometry} geometry\n\t * @param {Array} targets\n\t * @param {GLTFParser} parser\n\t * @return {Promise}\n\t */\n\tfunction addMorphTargets( geometry, targets, parser ) {\n\n\t\tvar hasMorphPosition = false;\n\t\tvar hasMorphNormal = false;\n\n\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tvar target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\n\t\t\tif ( hasMorphPosition && hasMorphNormal ) break;\n\n\t\t}\n\n\t\tif ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry );\n\n\t\tvar pendingPositionAccessors = [];\n\t\tvar pendingNormalAccessors = [];\n\n\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tvar target = targets[ i ];\n\n\t\t\tif ( hasMorphPosition ) {\n\n\t\t\t\tvar pendingAccessor = target.POSITION !== undefined\n\t\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t\t: geometry.attributes.position;\n\n\t\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t\tif ( hasMorphNormal ) {\n\n\t\t\t\tvar pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t\t: geometry.attributes.normal;\n\n\t\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( [\n\t\t\tPromise.all( pendingPositionAccessors ),\n\t\t\tPromise.all( pendingNormalAccessors )\n\t\t] ).then( function ( accessors ) {\n\n\t\t\tvar morphPositions = accessors[ 0 ];\n\t\t\tvar morphNormals = accessors[ 1 ];\n\n\t\t\t// Clone morph target accessors before modifying them.\n\n\t\t\tfor ( var i = 0, il = morphPositions.length; i < il; i ++ ) {\n\n\t\t\t\tif ( geometry.attributes.position === morphPositions[ i ] ) continue;\n\n\t\t\t\tmorphPositions[ i ] = cloneBufferAttribute( morphPositions[ i ] );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tif ( geometry.attributes.normal === morphNormals[ i ] ) continue;\n\n\t\t\t\tmorphNormals[ i ] = cloneBufferAttribute( morphNormals[ i ] );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\t\tvar target = targets[ i ];\n\t\t\t\tvar attributeName = 'morphTarget' + i;\n\n\t\t\t\tif ( hasMorphPosition ) {\n\n\t\t\t\t\t// Three.js morph position is absolute value. The formula is\n\t\t\t\t\t// basePosition\n\t\t\t\t\t// + weight0 * ( morphPosition0 - basePosition )\n\t\t\t\t\t// + weight1 * ( morphPosition1 - basePosition )\n\t\t\t\t\t// ...\n\t\t\t\t\t// while the glTF one is relative\n\t\t\t\t\t// basePosition\n\t\t\t\t\t// + weight0 * glTFmorphPosition0\n\t\t\t\t\t// + weight1 * glTFmorphPosition1\n\t\t\t\t\t// ...\n\t\t\t\t\t// then we need to convert from relative to absolute here.\n\n\t\t\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\t\t\tvar positionAttribute = morphPositions[ i ];\n\t\t\t\t\t\tpositionAttribute.name = attributeName;\n\n\t\t\t\t\t\tvar position = geometry.attributes.position;\n\n\t\t\t\t\t\tfor ( var j = 0, jl = positionAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpositionAttribute.setXYZ(\n\t\t\t\t\t\t\t\tj,\n\t\t\t\t\t\t\t\tpositionAttribute.getX( j ) + position.getX( j ),\n\t\t\t\t\t\t\t\tpositionAttribute.getY( j ) + position.getY( j ),\n\t\t\t\t\t\t\t\tpositionAttribute.getZ( j ) + position.getZ( j )\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasMorphNormal ) {\n\n\t\t\t\t\t// see target.POSITION's comment\n\n\t\t\t\t\tif ( target.NORMAL !== undefined ) {\n\n\t\t\t\t\t\tvar normalAttribute = morphNormals[ i ];\n\t\t\t\t\t\tnormalAttribute.name = attributeName;\n\n\t\t\t\t\t\tvar normal = geometry.attributes.normal;\n\n\t\t\t\t\t\tfor ( var j = 0, jl = normalAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tnormalAttribute.setXYZ(\n\t\t\t\t\t\t\t\tj,\n\t\t\t\t\t\t\t\tnormalAttribute.getX( j ) + normal.getX( j ),\n\t\t\t\t\t\t\t\tnormalAttribute.getY( j ) + normal.getY( j ),\n\t\t\t\t\t\t\t\tnormalAttribute.getZ( j ) + normal.getZ( j )\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\n\t\t\treturn geometry;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * @param {THREE.Mesh} mesh\n\t * @param {GLTF.Mesh} meshDef\n\t */\n\tfunction updateMorphTargets( mesh, meshDef ) {\n\n\t\tmesh.updateMorphTargets();\n\n\t\tif ( meshDef.weights !== undefined ) {\n\n\t\t\tfor ( var i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\t\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\t\tvar targetNames = meshDef.extras.targetNames;\n\n\t\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createPrimitiveKey( primitiveDef ) {\n\n\t\tvar dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\t\tvar geometryKey;\n\n\t\tif ( dracoExtension ) {\n\n\t\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t\t} else {\n\n\t\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t\t}\n\n\t\treturn geometryKey;\n\n\t}\n\n\tfunction createAttributesKey( attributes ) {\n\n\t\tvar attributesKey = '';\n\n\t\tvar keys = Object.keys( attributes ).sort();\n\n\t\tfor ( var i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t\t}\n\n\t\treturn attributesKey;\n\n\t}\n\n\tfunction cloneBufferAttribute( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tvar count = attribute.count;\n\t\t\tvar itemSize = attribute.itemSize;\n\t\t\tvar array = attribute.array.slice( 0, count * itemSize );\n\n\t\t\tfor ( var i = 0, j = 0; i < count; ++ i ) {\n\n\t\t\t\tarray[ j ++ ] = attribute.getX( i );\n\t\t\t\tif ( itemSize >= 2 ) array[ j ++ ] = attribute.getY( i );\n\t\t\t\tif ( itemSize >= 3 ) array[ j ++ ] = attribute.getZ( i );\n\t\t\t\tif ( itemSize >= 4 ) array[ j ++ ] = attribute.getW( i );\n\n\t\t\t}\n\n\t\t\treturn new THREE.BufferAttribute( array, itemSize, attribute.normalized );\n\n\t\t}\n\n\t\treturn attribute.clone();\n\n\t}\n\n\t/* GLTF PARSER */\n\n\tfunction GLTFParser( json, extensions, options ) {\n\n\t\tthis.json = json || {};\n\t\tthis.extensions = extensions || {};\n\t\tthis.options = options || {};\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\tthis.textureLoader = new THREE.TextureLoader( this.options.manager );\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\n\t\tthis.fileLoader = new THREE.FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tGLTFParser.prototype.parse = function ( onLoad, onError ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis.markDefs();\n\n\t\tPromise.all( [\n\n\t\t\tthis.getDependencies( 'scene' ),\n\t\t\tthis.getDependencies( 'animation' ),\n\t\t\tthis.getDependencies( 'camera' ),\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tvar result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\tonLoad( result );\n\n\t\t} ).catch( onError );\n\n\t};\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\tGLTFParser.prototype.markDefs = function () {\n\n\t\tvar nodeDefs = this.json.nodes || [];\n\t\tvar skinDefs = this.json.skins || [];\n\t\tvar meshDefs = this.json.meshes || [];\n\n\t\tvar meshReferences = {};\n\t\tvar meshUses = {};\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tvar joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( var i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Meshes can (and should) be reused by multiple nodes in a glTF asset. To\n\t\t// avoid having more than one THREE.Mesh with the same name, count\n\t\t// references and rename instances below.\n\t\t//\n\t\t// Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t\tfor ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tvar nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tif ( meshReferences[ nodeDef.mesh ] === undefined ) {\n\n\t\t\t\t\tmeshReferences[ nodeDef.mesh ] = meshUses[ nodeDef.mesh ] = 0;\n\n\t\t\t\t}\n\n\t\t\t\tmeshReferences[ nodeDef.mesh ] ++;\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.json.meshReferences = meshReferences;\n\t\tthis.json.meshUses = meshUses;\n\n\t};\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.getDependency = function ( type, index ) {\n\n\t\tvar cacheKey = type + ':' + index;\n\t\tvar dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this.loadNode( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this.loadMesh( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this.loadBufferView( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this.loadMaterial( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this.loadTexture( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this.loadAnimation( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'light':\n\t\t\t\t\tdependency = this.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].loadLight( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t};\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise>}\n\t */\n\tGLTFParser.prototype.getDependencies = function ( type ) {\n\n\t\tvar dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tvar parser = this;\n\t\t\tvar defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadBuffer = function ( bufferIndex ) {\n\n\t\tvar bufferDef = this.json.buffers[ bufferIndex ];\n\t\tvar loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tvar options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadBufferView = function ( bufferViewIndex ) {\n\n\t\tvar bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tvar byteLength = bufferViewDef.byteLength || 0;\n\t\t\tvar byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadAccessor = function ( accessorIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\n\t\tvar accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t// information about attributes coming from another source (e.g. Draco\n\t\t\t// compression extension).\n\t\t\treturn Promise.resolve( null );\n\n\t\t}\n\n\t\tvar pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tvar bufferView = bufferViews[ 0 ];\n\n\t\t\tvar itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tvar TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tvar elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tvar itemBytes = elementBytes * itemSize;\n\t\t\tvar byteOffset = accessorDef.byteOffset || 0;\n\t\t\tvar byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tvar normalized = accessorDef.normalized === true;\n\t\t\tvar array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\tvar ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType;\n\t\t\t\tvar ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\t// Use the full buffer if it's interleaved.\n\t\t\t\t\tarray = new TypedArray( bufferView );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new THREE.InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new THREE.InterleavedBufferAttribute( ib, itemSize, byteOffset / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new THREE.BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tvar itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tvar TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tvar byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tvar byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tvar sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tvar sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute.setArray( bufferAttribute.array.slice() );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadTexture = function ( textureIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar options = this.options;\n\t\tvar textureLoader = this.textureLoader;\n\n\t\tvar URL = window.URL || window.webkitURL;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tvar textureExtensions = textureDef.extensions || {};\n\n\t\tvar source;\n\n\t\tif ( textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] ) {\n\n\t\t\tsource = json.images[ textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].source ];\n\n\t\t} else {\n\n\t\t\tsource = json.images[ textureDef.source ];\n\n\t\t}\n\n\t\tvar sourceURI = source.uri;\n\t\tvar isObjectURL = false;\n\n\t\tif ( source.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tvar blob = new Blob( [ bufferView ], { type: source.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\t// Load Texture resource.\n\n\t\t\tvar loader = THREE.Loader.Handlers.get( sourceURI );\n\n\t\t\tif ( ! loader ) {\n\n\t\t\t\tloader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ]\n\t\t\t\t\t? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader\n\t\t\t\t\t: textureLoader;\n\n\t\t\t}\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tloader.load( resolveURL( sourceURI, options.path ), resolve, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( textureDef.name !== undefined ) texture.name = textureDef.name;\n\n\t\t\t// Ignore unknown mime types, like DDS files.\n\t\t\tif ( source.mimeType in MIME_TYPE_FORMATS ) {\n\n\t\t\t\ttexture.format = MIME_TYPE_FORMATS[ source.mimeType ];\n\n\t\t\t}\n\n\t\t\tvar samplers = json.samplers || {};\n\t\t\tvar sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.LinearMipMapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.assignTexture = function ( materialParams, mapName, mapDef ) {\n\n\t\tvar parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture.isCompressedTexture ) {\n\n\t\t\t\tswitch ( mapName ) {\n\n\t\t\t\t\tcase 'aoMap':\n\t\t\t\t\tcase 'emissiveMap':\n\t\t\t\t\tcase 'metalnessMap':\n\t\t\t\t\tcase 'normalMap':\n\t\t\t\t\tcase 'roughnessMap':\n\t\t\t\t\t\ttexture.format = THREE.RGBFormat;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tvar transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accomodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {THREE.Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tGLTFParser.prototype.assignFinalMaterial = function ( mesh ) {\n\n\t\tvar geometry = mesh.geometry;\n\t\tvar material = mesh.material;\n\t\tvar extensions = this.extensions;\n\n\t\tvar useVertexTangents = geometry.attributes.tangent !== undefined;\n\t\tvar useVertexColors = geometry.attributes.color !== undefined;\n\t\tvar useFlatShading = geometry.attributes.normal === undefined;\n\t\tvar useSkinning = mesh.isSkinnedMesh === true;\n\t\tvar useMorphTargets = Object.keys( geometry.morphAttributes ).length > 0;\n\t\tvar useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tvar cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tvar pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new THREE.PointsMaterial();\n\t\t\t\tTHREE.Material.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.lights = false; // PointsMaterial doesn't support lights yet\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tvar cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tvar lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new THREE.LineBasicMaterial();\n\t\t\t\tTHREE.Material.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.lights = false; // LineBasicMaterial doesn't support lights yet\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets ) {\n\n\t\t\tvar cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';\n\t\t\tif ( useSkinning ) cacheKey += 'skinning:';\n\t\t\tif ( useVertexTangents ) cacheKey += 'vertex-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\t\t\tif ( useMorphTargets ) cacheKey += 'morph-targets:';\n\t\t\tif ( useMorphNormals ) cacheKey += 'morph-normals:';\n\n\t\t\tvar cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.isGLTFSpecularGlossinessMaterial\n\t\t\t\t\t? extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].cloneMaterial( material )\n\t\t\t\t\t: material.clone();\n\n\t\t\t\tif ( useSkinning ) cachedMaterial.skinning = true;\n\t\t\t\tif ( useVertexTangents ) cachedMaterial.vertexTangents = true;\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = THREE.VertexColors;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\t\t\t\tif ( useMorphTargets ) cachedMaterial.morphTargets = true;\n\t\t\t\tif ( useMorphNormals ) cachedMaterial.morphNormals = true;\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\t// workarounds for mesh and geometry\n\n\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\tconsole.log( 'THREE.GLTFLoader: Duplicating UVs to support aoMap.' );\n\t\t\tgeometry.addAttribute( 'uv2', new THREE.BufferAttribute( geometry.attributes.uv.array, 2 ) );\n\n\t\t}\n\n\t\tif ( material.isGLTFSpecularGlossinessMaterial ) {\n\n\t\t\t// for GLTFSpecularGlossinessMaterial(ShaderMaterial) uniforms runtime update\n\t\t\tmesh.onBeforeRender = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].refreshUniforms;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadMaterial = function ( materialIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\t\tvar materialDef = json.materials[ materialIndex ];\n\n\t\tvar materialType;\n\t\tvar materialParams = {};\n\t\tvar materialExtensions = materialDef.extensions || {};\n\n\t\tvar pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {\n\n\t\t\tvar sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];\n\t\t\tmaterialType = sgExtension.getMaterialType();\n\t\t\tpending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tvar kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tmaterialType = THREE.MeshStandardMaterial;\n\n\t\t\tvar metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new THREE.Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tvar array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = THREE.DoubleSide;\n\n\t\t}\n\n\t\tvar alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new THREE.Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tmaterialParams.normalScale.set( materialDef.normalTexture.scale, materialDef.normalTexture.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\tmaterialParams.emissive = new THREE.Color().fromArray( materialDef.emissiveFactor );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== THREE.MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tvar material;\n\n\t\t\tif ( materialType === THREE.ShaderMaterial ) {\n\n\t\t\t\tmaterial = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );\n\n\t\t\t} else {\n\n\t\t\t\tmaterial = new materialType( materialParams );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.name !== undefined ) material.name = materialDef.name;\n\n\t\t\t// baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.\n\t\t\tif ( material.map ) material.map.encoding = THREE.sRGBEncoding;\n\t\t\tif ( material.emissiveMap ) material.emissiveMap.encoding = THREE.sRGBEncoding;\n\t\t\tif ( material.specularMap ) material.specularMap.encoding = THREE.sRGBEncoding;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * @param {THREE.BufferGeometry} geometry\n\t * @param {GLTF.Primitive} primitiveDef\n\t * @param {GLTFParser} parser\n\t * @return {Promise}\n\t */\n\tfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\t\tvar attributes = primitiveDef.attributes;\n\n\t\tvar pending = [];\n\n\t\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t\t.then( function ( accessor ) {\n\n\t\t\t\t\tgeometry.addAttribute( attributeName, accessor );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tfor ( var gltfAttributeName in attributes ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t\t}\n\n\t\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\t\tvar accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setIndex( accessor );\n\n\t\t\t} );\n\n\t\t\tpending.push( accessor );\n\n\t\t}\n\n\t\tassignExtrasToUserData( geometry, primitiveDef );\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\treturn primitiveDef.targets !== undefined\n\t\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t\t: geometry;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array} primitives\n\t * @return {Promise>}\n\t */\n\tGLTFParser.prototype.loadGeometries = function ( primitives ) {\n\n\t\tvar parser = this;\n\t\tvar extensions = this.extensions;\n\t\tvar cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tvar primitive = primitives[ i ];\n\t\t\tvar cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tvar cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tvar geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new THREE.BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadMesh = function ( meshIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\n\t\tvar meshDef = json.meshes[ meshIndex ];\n\t\tvar primitives = meshDef.primitives;\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tvar material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial()\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( originalMaterials ) {\n\n\t\t\treturn parser.loadGeometries( primitives ).then( function ( geometries ) {\n\n\t\t\t\tvar meshes = [];\n\n\t\t\t\tfor ( var i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar geometry = geometries[ i ];\n\t\t\t\t\tvar primitive = primitives[ i ];\n\n\t\t\t\t\t// 1. create Mesh\n\n\t\t\t\t\tvar mesh;\n\n\t\t\t\t\tvar material = originalMaterials[ i ];\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See .markDefs()\n\t\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t\t? new THREE.SkinnedMesh( geometry, material )\n\t\t\t\t\t\t\t: new THREE.Mesh( geometry, material );\n\n\t\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\t\tmesh.drawMode = THREE.TriangleStripDrawMode;\n\n\t\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\t\tmesh.drawMode = THREE.TriangleFanDrawMode;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineSegments( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\t\tmesh = new THREE.Line( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\t\tmesh = new THREE.LineLoop( geometry, material );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\t\tmesh = new THREE.Points( geometry, material );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.name = meshDef.name || ( 'mesh_' + meshIndex );\n\n\t\t\t\t\tif ( geometries.length > 1 ) mesh.name += '_' + i;\n\n\t\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\t\tmeshes.push( mesh );\n\n\t\t\t\t}\n\n\t\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tvar group = new THREE.Group();\n\n\t\t\t\tfor ( var i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn group;\n\n\t\t\t} );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadCamera = function ( cameraIndex ) {\n\n\t\tvar camera;\n\t\tvar cameraDef = this.json.cameras[ cameraIndex ];\n\t\tvar params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new THREE.OrthographicCamera( params.xmag / - 2, params.xmag / 2, params.ymag / 2, params.ymag / - 2, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name !== undefined ) camera.name = cameraDef.name;\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadSkin = function ( skinIndex ) {\n\n\t\tvar skinDef = this.json.skins[ skinIndex ];\n\n\t\tvar skinEntry = { joints: skinDef.joints };\n\n\t\tif ( skinDef.inverseBindMatrices === undefined ) {\n\n\t\t\treturn Promise.resolve( skinEntry );\n\n\t\t}\n\n\t\treturn this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) {\n\n\t\t\tskinEntry.inverseBindMatrices = accessor;\n\n\t\t\treturn skinEntry;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadAnimation = function ( animationIndex ) {\n\n\t\tvar json = this.json;\n\n\t\tvar animationDef = json.animations[ animationIndex ];\n\n\t\tvar pendingNodes = [];\n\t\tvar pendingInputAccessors = [];\n\t\tvar pendingOutputAccessors = [];\n\t\tvar pendingSamplers = [];\n\t\tvar pendingTargets = [];\n\n\t\tfor ( var i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tvar channel = animationDef.channels[ i ];\n\t\t\tvar sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tvar target = channel.target;\n\t\t\tvar name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n\t\t\tvar input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tvar output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tvar nodes = dependencies[ 0 ];\n\t\t\tvar inputAccessors = dependencies[ 1 ];\n\t\t\tvar outputAccessors = dependencies[ 2 ];\n\t\t\tvar samplers = dependencies[ 3 ];\n\t\t\tvar targets = dependencies[ 4 ];\n\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tvar node = nodes[ i ];\n\t\t\t\tvar inputAccessor = inputAccessors[ i ];\n\t\t\t\tvar outputAccessor = outputAccessors[ i ];\n\t\t\t\tvar sampler = samplers[ i ];\n\t\t\t\tvar target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tnode.updateMatrix();\n\t\t\t\tnode.matrixAutoUpdate = true;\n\n\t\t\t\tvar TypedKeyframeTrack;\n\n\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\t\t\tTypedKeyframeTrack = THREE.NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\t\t\tTypedKeyframeTrack = THREE.QuaternionKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tTypedKeyframeTrack = THREE.VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tvar targetName = node.name ? node.name : node.uuid;\n\n\t\t\t\tvar interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear;\n\n\t\t\t\tvar targetNames = [];\n\n\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\t// Node may be a THREE.Group (glTF mesh with several primitives) or a THREE.Mesh.\n\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\tif ( object.isMesh === true && object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargetNames.push( targetName );\n\n\t\t\t\t}\n\n\t\t\t\tvar outputArray = outputAccessor.array;\n\n\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\tvar scale;\n\n\t\t\t\t\tif ( outputArray.constructor === Int8Array ) {\n\n\t\t\t\t\t\tscale = 1 / 127;\n\n\t\t\t\t\t} else if ( outputArray.constructor === Uint8Array ) {\n\n\t\t\t\t\t\tscale = 1 / 255;\n\n\t\t\t\t\t} else if ( outputArray.constructor == Int16Array ) {\n\n\t\t\t\t\t\tscale = 1 / 32767;\n\n\t\t\t\t\t} else if ( outputArray.constructor === Uint16Array ) {\n\n\t\t\t\t\t\tscale = 1 / 65535;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported output accessor component type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\tfor ( var j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar track = new TypedKeyframeTrack(\n\t\t\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\t\t\tinputAccessor.array,\n\t\t\t\t\t\toutputArray,\n\t\t\t\t\t\tinterpolation\n\t\t\t\t\t);\n\n\t\t\t\t\t// Override interpolation with custom factory method.\n\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\t\t\t\t\treturn new GLTFCubicSplineInterpolant( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar name = animationDef.name !== undefined ? animationDef.name : 'animation_' + animationIndex;\n\n\t\t\treturn new THREE.AnimationClip( name, undefined, tracks );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadNode = function ( nodeIndex ) {\n\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\t\tvar parser = this;\n\n\t\tvar meshReferences = json.meshReferences;\n\t\tvar meshUses = json.meshUses;\n\n\t\tvar nodeDef = json.nodes[ nodeIndex ];\n\n\t\treturn ( function () {\n\n\t\t\t// .isBone isn't in glTF spec. See .markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\treturn Promise.resolve( new THREE.Bone() );\n\n\t\t\t} else if ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\t\t\tvar node;\n\n\t\t\t\t\tif ( meshReferences[ nodeDef.mesh ] > 1 ) {\n\n\t\t\t\t\t\tvar instanceNum = meshUses[ nodeDef.mesh ] ++;\n\n\t\t\t\t\t\tnode = mesh.clone();\n\t\t\t\t\t\tnode.name += '_instance_' + instanceNum;\n\n\t\t\t\t\t\t// onBeforeRender copy for Specular-Glossiness\n\t\t\t\t\t\tnode.onBeforeRender = mesh.onBeforeRender;\n\n\t\t\t\t\t\tfor ( var i = 0, il = node.children.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tnode.children[ i ].name += '_instance_' + instanceNum;\n\t\t\t\t\t\t\tnode.children[ i ].onBeforeRender = mesh.children[ i ].onBeforeRender;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tnode = mesh;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn node;\n\n\t\t\t\t} );\n\n\t\t\t} else if ( nodeDef.camera !== undefined ) {\n\n\t\t\t\treturn parser.getDependency( 'camera', nodeDef.camera );\n\n\t\t\t} else if ( nodeDef.extensions\n\t\t\t\t&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ]\n\t\t\t\t&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light !== undefined ) {\n\n\t\t\t\treturn parser.getDependency( 'light', nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light );\n\n\t\t\t} else {\n\n\t\t\t\treturn Promise.resolve( new THREE.Object3D() );\n\n\t\t\t}\n\n\t\t}() ).then( function ( node ) {\n\n\t\t\tif ( nodeDef.name !== undefined ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = THREE.PropertyBinding.sanitizeNodeName( nodeDef.name );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tvar matrix = new THREE.Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadScene = function () {\n\n\t\t// scene node hierachy builder\n\n\t\tfunction buildNodeHierachy( nodeId, parentObject, json, parser ) {\n\n\t\t\tvar nodeDef = json.nodes[ nodeId ];\n\n\t\t\treturn parser.getDependency( 'node', nodeId ).then( function ( node ) {\n\n\t\t\t\tif ( nodeDef.skin === undefined ) return node;\n\n\t\t\t\t// build skeleton here as well\n\n\t\t\t\tvar skinEntry;\n\n\t\t\t\treturn parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) {\n\n\t\t\t\t\tskinEntry = skin;\n\n\t\t\t\t\tvar pendingJoints = [];\n\n\t\t\t\t\tfor ( var i = 0, il = skinEntry.joints.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tpendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Promise.all( pendingJoints );\n\n\t\t\t\t} ).then( function ( jointNodes ) {\n\n\t\t\t\t\tvar meshes = node.isGroup === true ? node.children : [ node ];\n\n\t\t\t\t\tfor ( var i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar mesh = meshes[ i ];\n\n\t\t\t\t\t\tvar bones = [];\n\t\t\t\t\t\tvar boneInverses = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = jointNodes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar jointNode = jointNodes[ j ];\n\n\t\t\t\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\t\t\t\tvar mat = new THREE.Matrix4();\n\n\t\t\t\t\t\t\t\tif ( skinEntry.inverseBindMatrices !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tmat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[ j ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn node;\n\n\t\t\t\t} );\n\n\t\t\t} ).then( function ( node ) {\n\n\t\t\t\t// build node hierachy\n\n\t\t\t\tparentObject.add( node );\n\n\t\t\t\tvar pending = [];\n\n\t\t\t\tif ( nodeDef.children ) {\n\n\t\t\t\t\tvar children = nodeDef.children;\n\n\t\t\t\t\tfor ( var i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar child = children[ i ];\n\t\t\t\t\t\tpending.push( buildNodeHierachy( child, node, json, parser ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn function loadScene( sceneIndex ) {\n\n\t\t\tvar json = this.json;\n\t\t\tvar extensions = this.extensions;\n\t\t\tvar sceneDef = this.json.scenes[ sceneIndex ];\n\t\t\tvar parser = this;\n\n\t\t\tvar scene = new THREE.Scene();\n\t\t\tif ( sceneDef.name !== undefined ) scene.name = sceneDef.name;\n\n\t\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\t\tvar nodeIds = sceneDef.nodes || [];\n\n\t\t\tvar pending = [];\n\n\t\t\tfor ( var i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\t\tpending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\treturn scene;\n\n\t\t\t} );\n\n\t\t};\n\n\t}();\n\n\treturn GLTFLoader;\n\n} )();\n\n\nmodule.exports = _GLTFLoader;\n",null,"/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// Used for setting prototype methods that IE8 chokes on.\nvar DELETE = 'delete';\n\n// Constants describing the size of trie nodes.\nvar SHIFT = 5; // Resulted in best performance after ______?\nvar SIZE = 1 << SHIFT;\nvar MASK = SIZE - 1;\n\n// A consistent shared value representing \"not set\" which equals nothing other\n// than itself, and nothing that could be provided externally.\nvar NOT_SET = {};\n\n// Boolean references, Rough equivalent of `bool &`.\nfunction MakeRef() {\n return { value: false };\n}\n\nfunction SetRef(ref) {\n if (ref) {\n ref.value = true;\n }\n}\n\n// A function which returns a value representing an \"owner\" for transient writes\n// to tries. The return value will only ever equal itself, and will not equal\n// the return of any subsequent call of this function.\nfunction OwnerID() {}\n\nfunction ensureSize(iter) {\n if (iter.size === undefined) {\n iter.size = iter.__iterate(returnTrue);\n }\n return iter.size;\n}\n\nfunction wrapIndex(iter, index) {\n // This implements \"is array index\" which the ECMAString spec defines as:\n //\n // A String property name P is an array index if and only if\n // ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal\n // to 2^32−1.\n //\n // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects\n if (typeof index !== 'number') {\n var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32\n if ('' + uint32Index !== index || uint32Index === 4294967295) {\n return NaN;\n }\n index = uint32Index;\n }\n return index < 0 ? ensureSize(iter) + index : index;\n}\n\nfunction returnTrue() {\n return true;\n}\n\nfunction wholeSlice(begin, end, size) {\n return (\n ((begin === 0 && !isNeg(begin)) ||\n (size !== undefined && begin <= -size)) &&\n (end === undefined || (size !== undefined && end >= size))\n );\n}\n\nfunction resolveBegin(begin, size) {\n return resolveIndex(begin, size, 0);\n}\n\nfunction resolveEnd(end, size) {\n return resolveIndex(end, size, size);\n}\n\nfunction resolveIndex(index, size, defaultIndex) {\n // Sanitize indices using this shorthand for ToInt32(argument)\n // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n return index === undefined\n ? defaultIndex\n : isNeg(index)\n ? size === Infinity\n ? size\n : Math.max(0, size + index) | 0\n : size === undefined || size === index\n ? index\n : Math.min(size, index) | 0;\n}\n\nfunction isNeg(value) {\n // Account for -0 which is negative, but not less than 0.\n return value < 0 || (value === 0 && 1 / value === -Infinity);\n}\n\n// Note: value is unchanged to not break immutable-devtools.\nvar IS_COLLECTION_SYMBOL = '@@__IMMUTABLE_ITERABLE__@@';\n\nfunction isCollection(maybeCollection) {\n return Boolean(maybeCollection && maybeCollection[IS_COLLECTION_SYMBOL]);\n}\n\nvar IS_KEYED_SYMBOL = '@@__IMMUTABLE_KEYED__@@';\n\nfunction isKeyed(maybeKeyed) {\n return Boolean(maybeKeyed && maybeKeyed[IS_KEYED_SYMBOL]);\n}\n\nvar IS_INDEXED_SYMBOL = '@@__IMMUTABLE_INDEXED__@@';\n\nfunction isIndexed(maybeIndexed) {\n return Boolean(maybeIndexed && maybeIndexed[IS_INDEXED_SYMBOL]);\n}\n\nfunction isAssociative(maybeAssociative) {\n return isKeyed(maybeAssociative) || isIndexed(maybeAssociative);\n}\n\nvar Collection = function Collection(value) {\n return isCollection(value) ? value : Seq(value);\n};\n\nvar KeyedCollection = /*@__PURE__*/(function (Collection) {\n function KeyedCollection(value) {\n return isKeyed(value) ? value : KeyedSeq(value);\n }\n\n if ( Collection ) KeyedCollection.__proto__ = Collection;\n KeyedCollection.prototype = Object.create( Collection && Collection.prototype );\n KeyedCollection.prototype.constructor = KeyedCollection;\n\n return KeyedCollection;\n}(Collection));\n\nvar IndexedCollection = /*@__PURE__*/(function (Collection) {\n function IndexedCollection(value) {\n return isIndexed(value) ? value : IndexedSeq(value);\n }\n\n if ( Collection ) IndexedCollection.__proto__ = Collection;\n IndexedCollection.prototype = Object.create( Collection && Collection.prototype );\n IndexedCollection.prototype.constructor = IndexedCollection;\n\n return IndexedCollection;\n}(Collection));\n\nvar SetCollection = /*@__PURE__*/(function (Collection) {\n function SetCollection(value) {\n return isCollection(value) && !isAssociative(value) ? value : SetSeq(value);\n }\n\n if ( Collection ) SetCollection.__proto__ = Collection;\n SetCollection.prototype = Object.create( Collection && Collection.prototype );\n SetCollection.prototype.constructor = SetCollection;\n\n return SetCollection;\n}(Collection));\n\nCollection.Keyed = KeyedCollection;\nCollection.Indexed = IndexedCollection;\nCollection.Set = SetCollection;\n\nvar IS_SEQ_SYMBOL = '@@__IMMUTABLE_SEQ__@@';\n\nfunction isSeq(maybeSeq) {\n return Boolean(maybeSeq && maybeSeq[IS_SEQ_SYMBOL]);\n}\n\nvar IS_RECORD_SYMBOL = '@@__IMMUTABLE_RECORD__@@';\n\nfunction isRecord(maybeRecord) {\n return Boolean(maybeRecord && maybeRecord[IS_RECORD_SYMBOL]);\n}\n\nfunction isImmutable(maybeImmutable) {\n return isCollection(maybeImmutable) || isRecord(maybeImmutable);\n}\n\nvar IS_ORDERED_SYMBOL = '@@__IMMUTABLE_ORDERED__@@';\n\nfunction isOrdered(maybeOrdered) {\n return Boolean(maybeOrdered && maybeOrdered[IS_ORDERED_SYMBOL]);\n}\n\nvar ITERATE_KEYS = 0;\nvar ITERATE_VALUES = 1;\nvar ITERATE_ENTRIES = 2;\n\nvar REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\n\nvar ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL;\n\nvar Iterator = function Iterator(next) {\n this.next = next;\n};\n\nIterator.prototype.toString = function toString () {\n return '[Iterator]';\n};\n\nIterator.KEYS = ITERATE_KEYS;\nIterator.VALUES = ITERATE_VALUES;\nIterator.ENTRIES = ITERATE_ENTRIES;\n\nIterator.prototype.inspect = Iterator.prototype.toSource = function() {\n return this.toString();\n};\nIterator.prototype[ITERATOR_SYMBOL] = function() {\n return this;\n};\n\nfunction iteratorValue(type, k, v, iteratorResult) {\n var value = type === 0 ? k : type === 1 ? v : [k, v];\n iteratorResult\n ? (iteratorResult.value = value)\n : (iteratorResult = {\n value: value,\n done: false,\n });\n return iteratorResult;\n}\n\nfunction iteratorDone() {\n return { value: undefined, done: true };\n}\n\nfunction hasIterator(maybeIterable) {\n return !!getIteratorFn(maybeIterable);\n}\n\nfunction isIterator(maybeIterator) {\n return maybeIterator && typeof maybeIterator.next === 'function';\n}\n\nfunction getIterator(iterable) {\n var iteratorFn = getIteratorFn(iterable);\n return iteratorFn && iteratorFn.call(iterable);\n}\n\nfunction getIteratorFn(iterable) {\n var iteratorFn =\n iterable &&\n ((REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) ||\n iterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction isArrayLike(value) {\n if (Array.isArray(value) || typeof value === 'string') {\n return true;\n }\n\n return (\n value &&\n typeof value === 'object' &&\n Number.isInteger(value.length) &&\n value.length >= 0 &&\n (value.length === 0\n ? // Only {length: 0} is considered Array-like.\n Object.keys(value).length === 1\n : // An object is only Array-like if it has a property where the last value\n // in the array-like may be found (which could be undefined).\n value.hasOwnProperty(value.length - 1))\n );\n}\n\nvar Seq = /*@__PURE__*/(function (Collection$$1) {\n function Seq(value) {\n return value === null || value === undefined\n ? emptySequence()\n : isImmutable(value)\n ? value.toSeq()\n : seqFromValue(value);\n }\n\n if ( Collection$$1 ) Seq.__proto__ = Collection$$1;\n Seq.prototype = Object.create( Collection$$1 && Collection$$1.prototype );\n Seq.prototype.constructor = Seq;\n\n Seq.prototype.toSeq = function toSeq () {\n return this;\n };\n\n Seq.prototype.toString = function toString () {\n return this.__toString('Seq {', '}');\n };\n\n Seq.prototype.cacheResult = function cacheResult () {\n if (!this._cache && this.__iterateUncached) {\n this._cache = this.entrySeq().toArray();\n this.size = this._cache.length;\n }\n return this;\n };\n\n // abstract __iterateUncached(fn, reverse)\n\n Seq.prototype.__iterate = function __iterate (fn, reverse) {\n var cache = this._cache;\n if (cache) {\n var size = cache.length;\n var i = 0;\n while (i !== size) {\n var entry = cache[reverse ? size - ++i : i++];\n if (fn(entry[1], entry[0], this) === false) {\n break;\n }\n }\n return i;\n }\n return this.__iterateUncached(fn, reverse);\n };\n\n // abstract __iteratorUncached(type, reverse)\n\n Seq.prototype.__iterator = function __iterator (type, reverse) {\n var cache = this._cache;\n if (cache) {\n var size = cache.length;\n var i = 0;\n return new Iterator(function () {\n if (i === size) {\n return iteratorDone();\n }\n var entry = cache[reverse ? size - ++i : i++];\n return iteratorValue(type, entry[0], entry[1]);\n });\n }\n return this.__iteratorUncached(type, reverse);\n };\n\n return Seq;\n}(Collection));\n\nvar KeyedSeq = /*@__PURE__*/(function (Seq) {\n function KeyedSeq(value) {\n return value === null || value === undefined\n ? emptySequence().toKeyedSeq()\n : isCollection(value)\n ? isKeyed(value)\n ? value.toSeq()\n : value.fromEntrySeq()\n : isRecord(value)\n ? value.toSeq()\n : keyedSeqFromValue(value);\n }\n\n if ( Seq ) KeyedSeq.__proto__ = Seq;\n KeyedSeq.prototype = Object.create( Seq && Seq.prototype );\n KeyedSeq.prototype.constructor = KeyedSeq;\n\n KeyedSeq.prototype.toKeyedSeq = function toKeyedSeq () {\n return this;\n };\n\n return KeyedSeq;\n}(Seq));\n\nvar IndexedSeq = /*@__PURE__*/(function (Seq) {\n function IndexedSeq(value) {\n return value === null || value === undefined\n ? emptySequence()\n : isCollection(value)\n ? isKeyed(value)\n ? value.entrySeq()\n : value.toIndexedSeq()\n : isRecord(value)\n ? value.toSeq().entrySeq()\n : indexedSeqFromValue(value);\n }\n\n if ( Seq ) IndexedSeq.__proto__ = Seq;\n IndexedSeq.prototype = Object.create( Seq && Seq.prototype );\n IndexedSeq.prototype.constructor = IndexedSeq;\n\n IndexedSeq.of = function of (/*...values*/) {\n return IndexedSeq(arguments);\n };\n\n IndexedSeq.prototype.toIndexedSeq = function toIndexedSeq () {\n return this;\n };\n\n IndexedSeq.prototype.toString = function toString () {\n return this.__toString('Seq [', ']');\n };\n\n return IndexedSeq;\n}(Seq));\n\nvar SetSeq = /*@__PURE__*/(function (Seq) {\n function SetSeq(value) {\n return (isCollection(value) && !isAssociative(value)\n ? value\n : IndexedSeq(value)\n ).toSetSeq();\n }\n\n if ( Seq ) SetSeq.__proto__ = Seq;\n SetSeq.prototype = Object.create( Seq && Seq.prototype );\n SetSeq.prototype.constructor = SetSeq;\n\n SetSeq.of = function of (/*...values*/) {\n return SetSeq(arguments);\n };\n\n SetSeq.prototype.toSetSeq = function toSetSeq () {\n return this;\n };\n\n return SetSeq;\n}(Seq));\n\nSeq.isSeq = isSeq;\nSeq.Keyed = KeyedSeq;\nSeq.Set = SetSeq;\nSeq.Indexed = IndexedSeq;\n\nSeq.prototype[IS_SEQ_SYMBOL] = true;\n\n// #pragma Root Sequences\n\nvar ArraySeq = /*@__PURE__*/(function (IndexedSeq) {\n function ArraySeq(array) {\n this._array = array;\n this.size = array.length;\n }\n\n if ( IndexedSeq ) ArraySeq.__proto__ = IndexedSeq;\n ArraySeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n ArraySeq.prototype.constructor = ArraySeq;\n\n ArraySeq.prototype.get = function get (index, notSetValue) {\n return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue;\n };\n\n ArraySeq.prototype.__iterate = function __iterate (fn, reverse) {\n var array = this._array;\n var size = array.length;\n var i = 0;\n while (i !== size) {\n var ii = reverse ? size - ++i : i++;\n if (fn(array[ii], ii, this) === false) {\n break;\n }\n }\n return i;\n };\n\n ArraySeq.prototype.__iterator = function __iterator (type, reverse) {\n var array = this._array;\n var size = array.length;\n var i = 0;\n return new Iterator(function () {\n if (i === size) {\n return iteratorDone();\n }\n var ii = reverse ? size - ++i : i++;\n return iteratorValue(type, ii, array[ii]);\n });\n };\n\n return ArraySeq;\n}(IndexedSeq));\n\nvar ObjectSeq = /*@__PURE__*/(function (KeyedSeq) {\n function ObjectSeq(object) {\n var keys = Object.keys(object);\n this._object = object;\n this._keys = keys;\n this.size = keys.length;\n }\n\n if ( KeyedSeq ) ObjectSeq.__proto__ = KeyedSeq;\n ObjectSeq.prototype = Object.create( KeyedSeq && KeyedSeq.prototype );\n ObjectSeq.prototype.constructor = ObjectSeq;\n\n ObjectSeq.prototype.get = function get (key, notSetValue) {\n if (notSetValue !== undefined && !this.has(key)) {\n return notSetValue;\n }\n return this._object[key];\n };\n\n ObjectSeq.prototype.has = function has (key) {\n return hasOwnProperty.call(this._object, key);\n };\n\n ObjectSeq.prototype.__iterate = function __iterate (fn, reverse) {\n var object = this._object;\n var keys = this._keys;\n var size = keys.length;\n var i = 0;\n while (i !== size) {\n var key = keys[reverse ? size - ++i : i++];\n if (fn(object[key], key, this) === false) {\n break;\n }\n }\n return i;\n };\n\n ObjectSeq.prototype.__iterator = function __iterator (type, reverse) {\n var object = this._object;\n var keys = this._keys;\n var size = keys.length;\n var i = 0;\n return new Iterator(function () {\n if (i === size) {\n return iteratorDone();\n }\n var key = keys[reverse ? size - ++i : i++];\n return iteratorValue(type, key, object[key]);\n });\n };\n\n return ObjectSeq;\n}(KeyedSeq));\nObjectSeq.prototype[IS_ORDERED_SYMBOL] = true;\n\nvar CollectionSeq = /*@__PURE__*/(function (IndexedSeq) {\n function CollectionSeq(collection) {\n this._collection = collection;\n this.size = collection.length || collection.size;\n }\n\n if ( IndexedSeq ) CollectionSeq.__proto__ = IndexedSeq;\n CollectionSeq.prototype = Object.create( IndexedSeq && IndexedSeq.prototype );\n CollectionSeq.prototype.constructor = CollectionSeq;\n\n CollectionSeq.prototype.__iterateUncached = function __iterateUncached (fn, reverse) {\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var collection = this._collection;\n var iterator = getIterator(collection);\n var iterations = 0;\n if (isIterator(iterator)) {\n var step;\n while (!(step = iterator.next()).done) {\n if (fn(step.value, iterations++, this) === false) {\n break;\n }\n }\n }\n return iterations;\n };\n\n CollectionSeq.prototype.__iteratorUncached = function __iteratorUncached (type, reverse) {\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var collection = this._collection;\n var iterator = getIterator(collection);\n if (!isIterator(iterator)) {\n return new Iterator(iteratorDone);\n }\n var iterations = 0;\n return new Iterator(function () {\n var step = iterator.next();\n return step.done ? step : iteratorValue(type, iterations++, step.value);\n });\n };\n\n return CollectionSeq;\n}(IndexedSeq));\n\n// # pragma Helper functions\n\nvar EMPTY_SEQ;\n\nfunction emptySequence() {\n return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([]));\n}\n\nfunction keyedSeqFromValue(value) {\n var seq = Array.isArray(value)\n ? new ArraySeq(value)\n : hasIterator(value)\n ? new CollectionSeq(value)\n : undefined;\n if (seq) {\n return seq.fromEntrySeq();\n }\n if (typeof value === 'object') {\n return new ObjectSeq(value);\n }\n throw new TypeError(\n 'Expected Array or collection object of [k, v] entries, or keyed object: ' +\n value\n );\n}\n\nfunction indexedSeqFromValue(value) {\n var seq = maybeIndexedSeqFromValue(value);\n if (seq) {\n return seq;\n }\n throw new TypeError(\n 'Expected Array or collection object of values: ' + value\n );\n}\n\nfunction seqFromValue(value) {\n var seq = maybeIndexedSeqFromValue(value);\n if (seq) {\n return seq;\n }\n if (typeof value === 'object') {\n return new ObjectSeq(value);\n }\n throw new TypeError(\n 'Expected Array or collection object of values, or keyed object: ' + value\n );\n}\n\nfunction maybeIndexedSeqFromValue(value) {\n return isArrayLike(value)\n ? new ArraySeq(value)\n : hasIterator(value)\n ? new CollectionSeq(value)\n : undefined;\n}\n\nvar IS_MAP_SYMBOL = '@@__IMMUTABLE_MAP__@@';\n\nfunction isMap(maybeMap) {\n return Boolean(maybeMap && maybeMap[IS_MAP_SYMBOL]);\n}\n\nfunction isOrderedMap(maybeOrderedMap) {\n return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap);\n}\n\nfunction isValueObject(maybeValue) {\n return Boolean(\n maybeValue &&\n typeof maybeValue.equals === 'function' &&\n typeof maybeValue.hashCode === 'function'\n );\n}\n\n/**\n * An extension of the \"same-value\" algorithm as [described for use by ES6 Map\n * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality)\n *\n * NaN is considered the same as NaN, however -0 and 0 are considered the same\n * value, which is different from the algorithm described by\n * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is).\n *\n * This is extended further to allow Objects to describe the values they\n * represent, by way of `valueOf` or `equals` (and `hashCode`).\n *\n * Note: because of this extension, the key equality of Immutable.Map and the\n * value equality of Immutable.Set will differ from ES6 Map and Set.\n *\n * ### Defining custom values\n *\n * The easiest way to describe the value an object represents is by implementing\n * `valueOf`. For example, `Date` represents a value by returning a unix\n * timestamp for `valueOf`:\n *\n * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ...\n * var date2 = new Date(1234567890000);\n * date1.valueOf(); // 1234567890000\n * assert( date1 !== date2 );\n * assert( Immutable.is( date1, date2 ) );\n *\n * Note: overriding `valueOf` may have other implications if you use this object\n * where JavaScript expects a primitive, such as implicit string coercion.\n *\n * For more complex types, especially collections, implementing `valueOf` may\n * not be performant. An alternative is to implement `equals` and `hashCode`.\n *\n * `equals` takes another object, presumably of similar type, and returns true\n * if it is equal. Equality is symmetrical, so the same result should be\n * returned if this and the argument are flipped.\n *\n * assert( a.equals(b) === b.equals(a) );\n *\n * `hashCode` returns a 32bit integer number representing the object which will\n * be used to determine how to store the value object in a Map or Set. You must\n * provide both or neither methods, one must not exist without the other.\n *\n * Also, an important relationship between these methods must be upheld: if two\n * values are equal, they *must* return the same hashCode. If the values are not\n * equal, they might have the same hashCode; this is called a hash collision,\n * and while undesirable for performance reasons, it is acceptable.\n *\n * if (a.equals(b)) {\n * assert( a.hashCode() === b.hashCode() );\n * }\n *\n * All Immutable collections are Value Objects: they implement `equals()`\n * and `hashCode()`.\n */\nfunction is(valueA, valueB) {\n if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n return true;\n }\n if (!valueA || !valueB) {\n return false;\n }\n if (\n typeof valueA.valueOf === 'function' &&\n typeof valueB.valueOf === 'function'\n ) {\n valueA = valueA.valueOf();\n valueB = valueB.valueOf();\n if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n return true;\n }\n if (!valueA || !valueB) {\n return false;\n }\n }\n return !!(\n isValueObject(valueA) &&\n isValueObject(valueB) &&\n valueA.equals(valueB)\n );\n}\n\nvar imul =\n typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2\n ? Math.imul\n : function imul(a, b) {\n a |= 0; // int\n b |= 0; // int\n var c = a & 0xffff;\n var d = b & 0xffff;\n // Shift by 0 fixes the sign on the high part.\n return (c * d + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0)) | 0; // int\n };\n\n// v8 has an optimization for storing 31-bit signed numbers.\n// Values which have either 00 or 11 as the high order bits qualify.\n// This function drops the highest order bit in a signed number, maintaining\n// the sign bit.\nfunction smi(i32) {\n return ((i32 >>> 1) & 0x40000000) | (i32 & 0xbfffffff);\n}\n\nvar defaultValueOf = Object.prototype.valueOf;\n\nfunction hash(o) {\n switch (typeof o) {\n case 'boolean':\n // The hash values for built-in constants are a 1 value for each 5-byte\n // shift region expect for the first, which encodes the value. This\n // reduces the odds of a hash collision for these common values.\n return o ? 0x42108421 : 0x42108420;\n case 'number':\n return hashNumber(o);\n case 'string':\n return o.length > STRING_HASH_CACHE_MIN_STRLEN\n ? cachedHashString(o)\n : hashString(o);\n case 'object':\n case 'function':\n if (o === null) {\n return 0x42108422;\n }\n if (typeof o.hashCode === 'function') {\n // Drop any high bits from accidentally long hash codes.\n return smi(o.hashCode(o));\n }\n if (o.valueOf !== defaultValueOf && typeof o.valueOf === 'function') {\n o = o.valueOf(o);\n }\n return hashJSObj(o);\n case 'undefined':\n return 0x42108423;\n default:\n if (typeof o.toString === 'function') {\n return hashString(o.toString());\n }\n throw new Error('Value type ' + typeof o + ' cannot be hashed.');\n }\n}\n\n// Compress arbitrarily large numbers into smi hashes.\nfunction hashNumber(n) {\n if (n !== n || n === Infinity) {\n return 0;\n }\n var hash = n | 0;\n if (hash !== n) {\n hash ^= n * 0xffffffff;\n }\n while (n > 0xffffffff) {\n n /= 0xffffffff;\n hash ^= n;\n }\n return smi(hash);\n}\n\nfunction cachedHashString(string) {\n var hashed = stringHashCache[string];\n if (hashed === undefined) {\n hashed = hashString(string);\n if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) {\n STRING_HASH_CACHE_SIZE = 0;\n stringHashCache = {};\n }\n STRING_HASH_CACHE_SIZE++;\n stringHashCache[string] = hashed;\n }\n return hashed;\n}\n\n// http://jsperf.com/hashing-strings\nfunction hashString(string) {\n // This is the hash from JVM\n // The hash code for a string is computed as\n // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n // where s[i] is the ith character of the string and n is the length of\n // the string. We \"mod\" the result to make it between 0 (inclusive) and 2^31\n // (exclusive) by dropping high bits.\n var hashed = 0;\n for (var ii = 0; ii < string.length; ii++) {\n hashed = (31 * hashed + string.charCodeAt(ii)) | 0;\n }\n return smi(hashed);\n}\n\nfunction hashJSObj(obj) {\n var hashed;\n if (usingWeakMap) {\n hashed = weakMap.get(obj);\n if (hashed !== undefined) {\n return hashed;\n }\n }\n\n hashed = obj[UID_HASH_KEY];\n if (hashed !== undefined) {\n return hashed;\n }\n\n if (!canDefineProperty) {\n hashed = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY];\n if (hashed !== undefined) {\n return hashed;\n }\n\n hashed = getIENodeHash(obj);\n if (hashed !== undefined) {\n return hashed;\n }\n }\n\n hashed = ++objHashUID;\n if (objHashUID & 0x40000000) {\n objHashUID = 0;\n }\n\n if (usingWeakMap) {\n weakMap.set(obj, hashed);\n } else if (isExtensible !== undefined && isExtensible(obj) === false) {\n throw new Error('Non-extensible objects are not allowed as keys.');\n } else if (canDefineProperty) {\n Object.defineProperty(obj, UID_HASH_KEY, {\n enumerable: false,\n configurable: false,\n writable: false,\n value: hashed,\n });\n } else if (\n obj.propertyIsEnumerable !== undefined &&\n obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable\n ) {\n // Since we can't define a non-enumerable property on the object\n // we'll hijack one of the less-used non-enumerable properties to\n // save our hash on it. Since this is a function it will not show up in\n // `JSON.stringify` which is what we want.\n obj.propertyIsEnumerable = function() {\n return this.constructor.prototype.propertyIsEnumerable.apply(\n this,\n arguments\n );\n };\n obj.propertyIsEnumerable[UID_HASH_KEY] = hashed;\n } else if (obj.nodeType !== undefined) {\n // At this point we couldn't get the IE `uniqueID` to use as a hash\n // and we couldn't use a non-enumerable property to exploit the\n // dontEnum bug so we simply add the `UID_HASH_KEY` on the node\n // itself.\n obj[UID_HASH_KEY] = hashed;\n } else {\n throw new Error('Unable to set a non-enumerable property on object.');\n }\n\n return hashed;\n}\n\n// Get references to ES5 object methods.\nvar isExtensible = Object.isExtensible;\n\n// True if Object.defineProperty works as expected. IE8 fails this test.\nvar canDefineProperty = (function() {\n try {\n Object.defineProperty({}, '@', {});\n return true;\n } catch (e) {\n return false;\n }\n})();\n\n// IE has a `uniqueID` property on DOM nodes. We can construct the hash from it\n// and avoid memory leaks from the IE cloneNode bug.\nfunction getIENodeHash(node) {\n if (node && node.nodeType > 0) {\n switch (node.nodeType) {\n case 1: // Element\n return node.uniqueID;\n case 9: // Document\n return node.documentElement && node.documentElement.uniqueID;\n }\n }\n}\n\n// If possible, use a WeakMap.\nvar usingWeakMap = typeof WeakMap === 'function';\nvar weakMap;\nif (usingWeakMap) {\n weakMap = new WeakMap();\n}\n\nvar objHashUID = 0;\n\nvar UID_HASH_KEY = '__immutablehash__';\nif (typeof Symbol === 'function') {\n UID_HASH_KEY = Symbol(UID_HASH_KEY);\n}\n\nvar STRING_HASH_CACHE_MIN_STRLEN = 16;\nvar STRING_HASH_CACHE_MAX_SIZE = 255;\nvar STRING_HASH_CACHE_SIZE = 0;\nvar stringHashCache = {};\n\nvar ToKeyedSequence = /*@__PURE__*/(function (KeyedSeq$$1) {\n function ToKeyedSequence(indexed, useKeys) {\n this._iter = indexed;\n this._useKeys = useKeys;\n this.size = indexed.size;\n }\n\n if ( KeyedSeq$$1 ) ToKeyedSequence.__proto__ = KeyedSeq$$1;\n ToKeyedSequence.prototype = Object.create( KeyedSeq$$1 && KeyedSeq$$1.prototype );\n ToKeyedSequence.prototype.constructor = ToKeyedSequence;\n\n ToKeyedSequence.prototype.get = function get (key, notSetValue) {\n return this._iter.get(key, notSetValue);\n };\n\n ToKeyedSequence.prototype.has = function has (key) {\n return this._iter.has(key);\n };\n\n ToKeyedSequence.prototype.valueSeq = function valueSeq () {\n return this._iter.valueSeq();\n };\n\n ToKeyedSequence.prototype.reverse = function reverse () {\n var this$1 = this;\n\n var reversedSequence = reverseFactory(this, true);\n if (!this._useKeys) {\n reversedSequence.valueSeq = function () { return this$1._iter.toSeq().reverse(); };\n }\n return reversedSequence;\n };\n\n ToKeyedSequence.prototype.map = function map (mapper, context) {\n var this$1 = this;\n\n var mappedSequence = mapFactory(this, mapper, context);\n if (!this._useKeys) {\n mappedSequence.valueSeq = function () { return this$1._iter.toSeq().map(mapper, context); };\n }\n return mappedSequence;\n };\n\n ToKeyedSequence.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n return this._iter.__iterate(function (v, k) { return fn(v, k, this$1); }, reverse);\n };\n\n ToKeyedSequence.prototype.__iterator = function __iterator (type, reverse) {\n return this._iter.__iterator(type, reverse);\n };\n\n return ToKeyedSequence;\n}(KeyedSeq));\nToKeyedSequence.prototype[IS_ORDERED_SYMBOL] = true;\n\nvar ToIndexedSequence = /*@__PURE__*/(function (IndexedSeq$$1) {\n function ToIndexedSequence(iter) {\n this._iter = iter;\n this.size = iter.size;\n }\n\n if ( IndexedSeq$$1 ) ToIndexedSequence.__proto__ = IndexedSeq$$1;\n ToIndexedSequence.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n ToIndexedSequence.prototype.constructor = ToIndexedSequence;\n\n ToIndexedSequence.prototype.includes = function includes (value) {\n return this._iter.includes(value);\n };\n\n ToIndexedSequence.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n var i = 0;\n reverse && ensureSize(this);\n return this._iter.__iterate(\n function (v) { return fn(v, reverse ? this$1.size - ++i : i++, this$1); },\n reverse\n );\n };\n\n ToIndexedSequence.prototype.__iterator = function __iterator (type, reverse) {\n var this$1 = this;\n\n var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n var i = 0;\n reverse && ensureSize(this);\n return new Iterator(function () {\n var step = iterator.next();\n return step.done\n ? step\n : iteratorValue(\n type,\n reverse ? this$1.size - ++i : i++,\n step.value,\n step\n );\n });\n };\n\n return ToIndexedSequence;\n}(IndexedSeq));\n\nvar ToSetSequence = /*@__PURE__*/(function (SetSeq$$1) {\n function ToSetSequence(iter) {\n this._iter = iter;\n this.size = iter.size;\n }\n\n if ( SetSeq$$1 ) ToSetSequence.__proto__ = SetSeq$$1;\n ToSetSequence.prototype = Object.create( SetSeq$$1 && SetSeq$$1.prototype );\n ToSetSequence.prototype.constructor = ToSetSequence;\n\n ToSetSequence.prototype.has = function has (key) {\n return this._iter.includes(key);\n };\n\n ToSetSequence.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n return this._iter.__iterate(function (v) { return fn(v, v, this$1); }, reverse);\n };\n\n ToSetSequence.prototype.__iterator = function __iterator (type, reverse) {\n var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n return new Iterator(function () {\n var step = iterator.next();\n return step.done\n ? step\n : iteratorValue(type, step.value, step.value, step);\n });\n };\n\n return ToSetSequence;\n}(SetSeq));\n\nvar FromEntriesSequence = /*@__PURE__*/(function (KeyedSeq$$1) {\n function FromEntriesSequence(entries) {\n this._iter = entries;\n this.size = entries.size;\n }\n\n if ( KeyedSeq$$1 ) FromEntriesSequence.__proto__ = KeyedSeq$$1;\n FromEntriesSequence.prototype = Object.create( KeyedSeq$$1 && KeyedSeq$$1.prototype );\n FromEntriesSequence.prototype.constructor = FromEntriesSequence;\n\n FromEntriesSequence.prototype.entrySeq = function entrySeq () {\n return this._iter.toSeq();\n };\n\n FromEntriesSequence.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n return this._iter.__iterate(function (entry) {\n // Check if entry exists first so array access doesn't throw for holes\n // in the parent iteration.\n if (entry) {\n validateEntry(entry);\n var indexedCollection = isCollection(entry);\n return fn(\n indexedCollection ? entry.get(1) : entry[1],\n indexedCollection ? entry.get(0) : entry[0],\n this$1\n );\n }\n }, reverse);\n };\n\n FromEntriesSequence.prototype.__iterator = function __iterator (type, reverse) {\n var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n return new Iterator(function () {\n while (true) {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n // Check if entry exists first so array access doesn't throw for holes\n // in the parent iteration.\n if (entry) {\n validateEntry(entry);\n var indexedCollection = isCollection(entry);\n return iteratorValue(\n type,\n indexedCollection ? entry.get(0) : entry[0],\n indexedCollection ? entry.get(1) : entry[1],\n step\n );\n }\n }\n });\n };\n\n return FromEntriesSequence;\n}(KeyedSeq));\n\nToIndexedSequence.prototype.cacheResult = ToKeyedSequence.prototype.cacheResult = ToSetSequence.prototype.cacheResult = FromEntriesSequence.prototype.cacheResult = cacheResultThrough;\n\nfunction flipFactory(collection) {\n var flipSequence = makeSequence(collection);\n flipSequence._iter = collection;\n flipSequence.size = collection.size;\n flipSequence.flip = function () { return collection; };\n flipSequence.reverse = function() {\n var reversedSequence = collection.reverse.apply(this); // super.reverse()\n reversedSequence.flip = function () { return collection.reverse(); };\n return reversedSequence;\n };\n flipSequence.has = function (key) { return collection.includes(key); };\n flipSequence.includes = function (key) { return collection.has(key); };\n flipSequence.cacheResult = cacheResultThrough;\n flipSequence.__iterateUncached = function(fn, reverse) {\n var this$1 = this;\n\n return collection.__iterate(function (v, k) { return fn(k, v, this$1) !== false; }, reverse);\n };\n flipSequence.__iteratorUncached = function(type, reverse) {\n if (type === ITERATE_ENTRIES) {\n var iterator = collection.__iterator(type, reverse);\n return new Iterator(function () {\n var step = iterator.next();\n if (!step.done) {\n var k = step.value[0];\n step.value[0] = step.value[1];\n step.value[1] = k;\n }\n return step;\n });\n }\n return collection.__iterator(\n type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES,\n reverse\n );\n };\n return flipSequence;\n}\n\nfunction mapFactory(collection, mapper, context) {\n var mappedSequence = makeSequence(collection);\n mappedSequence.size = collection.size;\n mappedSequence.has = function (key) { return collection.has(key); };\n mappedSequence.get = function (key, notSetValue) {\n var v = collection.get(key, NOT_SET);\n return v === NOT_SET\n ? notSetValue\n : mapper.call(context, v, key, collection);\n };\n mappedSequence.__iterateUncached = function(fn, reverse) {\n var this$1 = this;\n\n return collection.__iterate(\n function (v, k, c) { return fn(mapper.call(context, v, k, c), k, this$1) !== false; },\n reverse\n );\n };\n mappedSequence.__iteratorUncached = function(type, reverse) {\n var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n return new Iterator(function () {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n var key = entry[0];\n return iteratorValue(\n type,\n key,\n mapper.call(context, entry[1], key, collection),\n step\n );\n });\n };\n return mappedSequence;\n}\n\nfunction reverseFactory(collection, useKeys) {\n var this$1 = this;\n\n var reversedSequence = makeSequence(collection);\n reversedSequence._iter = collection;\n reversedSequence.size = collection.size;\n reversedSequence.reverse = function () { return collection; };\n if (collection.flip) {\n reversedSequence.flip = function() {\n var flipSequence = flipFactory(collection);\n flipSequence.reverse = function () { return collection.flip(); };\n return flipSequence;\n };\n }\n reversedSequence.get = function (key, notSetValue) { return collection.get(useKeys ? key : -1 - key, notSetValue); };\n reversedSequence.has = function (key) { return collection.has(useKeys ? key : -1 - key); };\n reversedSequence.includes = function (value) { return collection.includes(value); };\n reversedSequence.cacheResult = cacheResultThrough;\n reversedSequence.__iterate = function(fn, reverse) {\n var this$1 = this;\n\n var i = 0;\n reverse && ensureSize(collection);\n return collection.__iterate(\n function (v, k) { return fn(v, useKeys ? k : reverse ? this$1.size - ++i : i++, this$1); },\n !reverse\n );\n };\n reversedSequence.__iterator = function (type, reverse) {\n var i = 0;\n reverse && ensureSize(collection);\n var iterator = collection.__iterator(ITERATE_ENTRIES, !reverse);\n return new Iterator(function () {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n return iteratorValue(\n type,\n useKeys ? entry[0] : reverse ? this$1.size - ++i : i++,\n entry[1],\n step\n );\n });\n };\n return reversedSequence;\n}\n\nfunction filterFactory(collection, predicate, context, useKeys) {\n var filterSequence = makeSequence(collection);\n if (useKeys) {\n filterSequence.has = function (key) {\n var v = collection.get(key, NOT_SET);\n return v !== NOT_SET && !!predicate.call(context, v, key, collection);\n };\n filterSequence.get = function (key, notSetValue) {\n var v = collection.get(key, NOT_SET);\n return v !== NOT_SET && predicate.call(context, v, key, collection)\n ? v\n : notSetValue;\n };\n }\n filterSequence.__iterateUncached = function(fn, reverse) {\n var this$1 = this;\n\n var iterations = 0;\n collection.__iterate(function (v, k, c) {\n if (predicate.call(context, v, k, c)) {\n iterations++;\n return fn(v, useKeys ? k : iterations - 1, this$1);\n }\n }, reverse);\n return iterations;\n };\n filterSequence.__iteratorUncached = function(type, reverse) {\n var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n var iterations = 0;\n return new Iterator(function () {\n while (true) {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n var key = entry[0];\n var value = entry[1];\n if (predicate.call(context, value, key, collection)) {\n return iteratorValue(type, useKeys ? key : iterations++, value, step);\n }\n }\n });\n };\n return filterSequence;\n}\n\nfunction countByFactory(collection, grouper, context) {\n var groups = Map().asMutable();\n collection.__iterate(function (v, k) {\n groups.update(grouper.call(context, v, k, collection), 0, function (a) { return a + 1; });\n });\n return groups.asImmutable();\n}\n\nfunction groupByFactory(collection, grouper, context) {\n var isKeyedIter = isKeyed(collection);\n var groups = (isOrdered(collection) ? OrderedMap() : Map()).asMutable();\n collection.__iterate(function (v, k) {\n groups.update(\n grouper.call(context, v, k, collection),\n function (a) { return ((a = a || []), a.push(isKeyedIter ? [k, v] : v), a); }\n );\n });\n var coerce = collectionClass(collection);\n return groups.map(function (arr) { return reify(collection, coerce(arr)); }).asImmutable();\n}\n\nfunction sliceFactory(collection, begin, end, useKeys) {\n var originalSize = collection.size;\n\n if (wholeSlice(begin, end, originalSize)) {\n return collection;\n }\n\n var resolvedBegin = resolveBegin(begin, originalSize);\n var resolvedEnd = resolveEnd(end, originalSize);\n\n // begin or end will be NaN if they were provided as negative numbers and\n // this collection's size is unknown. In that case, cache first so there is\n // a known size and these do not resolve to NaN.\n if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) {\n return sliceFactory(collection.toSeq().cacheResult(), begin, end, useKeys);\n }\n\n // Note: resolvedEnd is undefined when the original sequence's length is\n // unknown and this slice did not supply an end and should contain all\n // elements after resolvedBegin.\n // In that case, resolvedSize will be NaN and sliceSize will remain undefined.\n var resolvedSize = resolvedEnd - resolvedBegin;\n var sliceSize;\n if (resolvedSize === resolvedSize) {\n sliceSize = resolvedSize < 0 ? 0 : resolvedSize;\n }\n\n var sliceSeq = makeSequence(collection);\n\n // If collection.size is undefined, the size of the realized sliceSeq is\n // unknown at this point unless the number of items to slice is 0\n sliceSeq.size =\n sliceSize === 0 ? sliceSize : (collection.size && sliceSize) || undefined;\n\n if (!useKeys && isSeq(collection) && sliceSize >= 0) {\n sliceSeq.get = function(index, notSetValue) {\n index = wrapIndex(this, index);\n return index >= 0 && index < sliceSize\n ? collection.get(index + resolvedBegin, notSetValue)\n : notSetValue;\n };\n }\n\n sliceSeq.__iterateUncached = function(fn, reverse) {\n var this$1 = this;\n\n if (sliceSize === 0) {\n return 0;\n }\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var skipped = 0;\n var isSkipping = true;\n var iterations = 0;\n collection.__iterate(function (v, k) {\n if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) {\n iterations++;\n return (\n fn(v, useKeys ? k : iterations - 1, this$1) !== false &&\n iterations !== sliceSize\n );\n }\n });\n return iterations;\n };\n\n sliceSeq.__iteratorUncached = function(type, reverse) {\n if (sliceSize !== 0 && reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n // Don't bother instantiating parent iterator if taking 0.\n if (sliceSize === 0) {\n return new Iterator(iteratorDone);\n }\n var iterator = collection.__iterator(type, reverse);\n var skipped = 0;\n var iterations = 0;\n return new Iterator(function () {\n while (skipped++ < resolvedBegin) {\n iterator.next();\n }\n if (++iterations > sliceSize) {\n return iteratorDone();\n }\n var step = iterator.next();\n if (useKeys || type === ITERATE_VALUES || step.done) {\n return step;\n }\n if (type === ITERATE_KEYS) {\n return iteratorValue(type, iterations - 1, undefined, step);\n }\n return iteratorValue(type, iterations - 1, step.value[1], step);\n });\n };\n\n return sliceSeq;\n}\n\nfunction takeWhileFactory(collection, predicate, context) {\n var takeSequence = makeSequence(collection);\n takeSequence.__iterateUncached = function(fn, reverse) {\n var this$1 = this;\n\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var iterations = 0;\n collection.__iterate(\n function (v, k, c) { return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$1); }\n );\n return iterations;\n };\n takeSequence.__iteratorUncached = function(type, reverse) {\n var this$1 = this;\n\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n var iterating = true;\n return new Iterator(function () {\n if (!iterating) {\n return iteratorDone();\n }\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n var k = entry[0];\n var v = entry[1];\n if (!predicate.call(context, v, k, this$1)) {\n iterating = false;\n return iteratorDone();\n }\n return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step);\n });\n };\n return takeSequence;\n}\n\nfunction skipWhileFactory(collection, predicate, context, useKeys) {\n var skipSequence = makeSequence(collection);\n skipSequence.__iterateUncached = function(fn, reverse) {\n var this$1 = this;\n\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var isSkipping = true;\n var iterations = 0;\n collection.__iterate(function (v, k, c) {\n if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) {\n iterations++;\n return fn(v, useKeys ? k : iterations - 1, this$1);\n }\n });\n return iterations;\n };\n skipSequence.__iteratorUncached = function(type, reverse) {\n var this$1 = this;\n\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var iterator = collection.__iterator(ITERATE_ENTRIES, reverse);\n var skipping = true;\n var iterations = 0;\n return new Iterator(function () {\n var step;\n var k;\n var v;\n do {\n step = iterator.next();\n if (step.done) {\n if (useKeys || type === ITERATE_VALUES) {\n return step;\n }\n if (type === ITERATE_KEYS) {\n return iteratorValue(type, iterations++, undefined, step);\n }\n return iteratorValue(type, iterations++, step.value[1], step);\n }\n var entry = step.value;\n k = entry[0];\n v = entry[1];\n skipping && (skipping = predicate.call(context, v, k, this$1));\n } while (skipping);\n return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step);\n });\n };\n return skipSequence;\n}\n\nfunction concatFactory(collection, values) {\n var isKeyedCollection = isKeyed(collection);\n var iters = [collection]\n .concat(values)\n .map(function (v) {\n if (!isCollection(v)) {\n v = isKeyedCollection\n ? keyedSeqFromValue(v)\n : indexedSeqFromValue(Array.isArray(v) ? v : [v]);\n } else if (isKeyedCollection) {\n v = KeyedCollection(v);\n }\n return v;\n })\n .filter(function (v) { return v.size !== 0; });\n\n if (iters.length === 0) {\n return collection;\n }\n\n if (iters.length === 1) {\n var singleton = iters[0];\n if (\n singleton === collection ||\n (isKeyedCollection && isKeyed(singleton)) ||\n (isIndexed(collection) && isIndexed(singleton))\n ) {\n return singleton;\n }\n }\n\n var concatSeq = new ArraySeq(iters);\n if (isKeyedCollection) {\n concatSeq = concatSeq.toKeyedSeq();\n } else if (!isIndexed(collection)) {\n concatSeq = concatSeq.toSetSeq();\n }\n concatSeq = concatSeq.flatten(true);\n concatSeq.size = iters.reduce(function (sum, seq) {\n if (sum !== undefined) {\n var size = seq.size;\n if (size !== undefined) {\n return sum + size;\n }\n }\n }, 0);\n return concatSeq;\n}\n\nfunction flattenFactory(collection, depth, useKeys) {\n var flatSequence = makeSequence(collection);\n flatSequence.__iterateUncached = function(fn, reverse) {\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var iterations = 0;\n var stopped = false;\n function flatDeep(iter, currentDepth) {\n iter.__iterate(function (v, k) {\n if ((!depth || currentDepth < depth) && isCollection(v)) {\n flatDeep(v, currentDepth + 1);\n } else {\n iterations++;\n if (fn(v, useKeys ? k : iterations - 1, flatSequence) === false) {\n stopped = true;\n }\n }\n return !stopped;\n }, reverse);\n }\n flatDeep(collection, 0);\n return iterations;\n };\n flatSequence.__iteratorUncached = function(type, reverse) {\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var iterator = collection.__iterator(type, reverse);\n var stack = [];\n var iterations = 0;\n return new Iterator(function () {\n while (iterator) {\n var step = iterator.next();\n if (step.done !== false) {\n iterator = stack.pop();\n continue;\n }\n var v = step.value;\n if (type === ITERATE_ENTRIES) {\n v = v[1];\n }\n if ((!depth || stack.length < depth) && isCollection(v)) {\n stack.push(iterator);\n iterator = v.__iterator(type, reverse);\n } else {\n return useKeys ? step : iteratorValue(type, iterations++, v, step);\n }\n }\n return iteratorDone();\n });\n };\n return flatSequence;\n}\n\nfunction flatMapFactory(collection, mapper, context) {\n var coerce = collectionClass(collection);\n return collection\n .toSeq()\n .map(function (v, k) { return coerce(mapper.call(context, v, k, collection)); })\n .flatten(true);\n}\n\nfunction interposeFactory(collection, separator) {\n var interposedSequence = makeSequence(collection);\n interposedSequence.size = collection.size && collection.size * 2 - 1;\n interposedSequence.__iterateUncached = function(fn, reverse) {\n var this$1 = this;\n\n var iterations = 0;\n collection.__iterate(\n function (v) { return (!iterations || fn(separator, iterations++, this$1) !== false) &&\n fn(v, iterations++, this$1) !== false; },\n reverse\n );\n return iterations;\n };\n interposedSequence.__iteratorUncached = function(type, reverse) {\n var iterator = collection.__iterator(ITERATE_VALUES, reverse);\n var iterations = 0;\n var step;\n return new Iterator(function () {\n if (!step || iterations % 2) {\n step = iterator.next();\n if (step.done) {\n return step;\n }\n }\n return iterations % 2\n ? iteratorValue(type, iterations++, separator)\n : iteratorValue(type, iterations++, step.value, step);\n });\n };\n return interposedSequence;\n}\n\nfunction sortFactory(collection, comparator, mapper) {\n if (!comparator) {\n comparator = defaultComparator;\n }\n var isKeyedCollection = isKeyed(collection);\n var index = 0;\n var entries = collection\n .toSeq()\n .map(function (v, k) { return [k, v, index++, mapper ? mapper(v, k, collection) : v]; })\n .valueSeq()\n .toArray();\n entries.sort(function (a, b) { return comparator(a[3], b[3]) || a[2] - b[2]; }).forEach(\n isKeyedCollection\n ? function (v, i) {\n entries[i].length = 2;\n }\n : function (v, i) {\n entries[i] = v[1];\n }\n );\n return isKeyedCollection\n ? KeyedSeq(entries)\n : isIndexed(collection)\n ? IndexedSeq(entries)\n : SetSeq(entries);\n}\n\nfunction maxFactory(collection, comparator, mapper) {\n if (!comparator) {\n comparator = defaultComparator;\n }\n if (mapper) {\n var entry = collection\n .toSeq()\n .map(function (v, k) { return [v, mapper(v, k, collection)]; })\n .reduce(function (a, b) { return (maxCompare(comparator, a[1], b[1]) ? b : a); });\n return entry && entry[0];\n }\n return collection.reduce(function (a, b) { return (maxCompare(comparator, a, b) ? b : a); });\n}\n\nfunction maxCompare(comparator, a, b) {\n var comp = comparator(b, a);\n // b is considered the new max if the comparator declares them equal, but\n // they are not equal and b is in fact a nullish value.\n return (\n (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) ||\n comp > 0\n );\n}\n\nfunction zipWithFactory(keyIter, zipper, iters, zipAll) {\n var zipSequence = makeSequence(keyIter);\n var sizes = new ArraySeq(iters).map(function (i) { return i.size; });\n zipSequence.size = zipAll ? sizes.max() : sizes.min();\n // Note: this a generic base implementation of __iterate in terms of\n // __iterator which may be more generically useful in the future.\n zipSequence.__iterate = function(fn, reverse) {\n /* generic:\n var iterator = this.__iterator(ITERATE_ENTRIES, reverse);\n var step;\n var iterations = 0;\n while (!(step = iterator.next()).done) {\n iterations++;\n if (fn(step.value[1], step.value[0], this) === false) {\n break;\n }\n }\n return iterations;\n */\n // indexed:\n var iterator = this.__iterator(ITERATE_VALUES, reverse);\n var step;\n var iterations = 0;\n while (!(step = iterator.next()).done) {\n if (fn(step.value, iterations++, this) === false) {\n break;\n }\n }\n return iterations;\n };\n zipSequence.__iteratorUncached = function(type, reverse) {\n var iterators = iters.map(\n function (i) { return ((i = Collection(i)), getIterator(reverse ? i.reverse() : i)); }\n );\n var iterations = 0;\n var isDone = false;\n return new Iterator(function () {\n var steps;\n if (!isDone) {\n steps = iterators.map(function (i) { return i.next(); });\n isDone = zipAll ? steps.every(function (s) { return s.done; }) : steps.some(function (s) { return s.done; });\n }\n if (isDone) {\n return iteratorDone();\n }\n return iteratorValue(\n type,\n iterations++,\n zipper.apply(null, steps.map(function (s) { return s.value; }))\n );\n });\n };\n return zipSequence;\n}\n\n// #pragma Helper Functions\n\nfunction reify(iter, seq) {\n return iter === seq ? iter : isSeq(iter) ? seq : iter.constructor(seq);\n}\n\nfunction validateEntry(entry) {\n if (entry !== Object(entry)) {\n throw new TypeError('Expected [K, V] tuple: ' + entry);\n }\n}\n\nfunction collectionClass(collection) {\n return isKeyed(collection)\n ? KeyedCollection\n : isIndexed(collection)\n ? IndexedCollection\n : SetCollection;\n}\n\nfunction makeSequence(collection) {\n return Object.create(\n (isKeyed(collection)\n ? KeyedSeq\n : isIndexed(collection)\n ? IndexedSeq\n : SetSeq\n ).prototype\n );\n}\n\nfunction cacheResultThrough() {\n if (this._iter.cacheResult) {\n this._iter.cacheResult();\n this.size = this._iter.size;\n return this;\n }\n return Seq.prototype.cacheResult.call(this);\n}\n\nfunction defaultComparator(a, b) {\n if (a === undefined && b === undefined) {\n return 0;\n }\n\n if (a === undefined) {\n return 1;\n }\n\n if (b === undefined) {\n return -1;\n }\n\n return a > b ? 1 : a < b ? -1 : 0;\n}\n\n// http://jsperf.com/copy-array-inline\nfunction arrCopy(arr, offset) {\n offset = offset || 0;\n var len = Math.max(0, arr.length - offset);\n var newArr = new Array(len);\n for (var ii = 0; ii < len; ii++) {\n newArr[ii] = arr[ii + offset];\n }\n return newArr;\n}\n\nfunction invariant(condition, error) {\n if (!condition) { throw new Error(error); }\n}\n\nfunction assertNotInfinite(size) {\n invariant(\n size !== Infinity,\n 'Cannot perform this action with an infinite size.'\n );\n}\n\nfunction coerceKeyPath(keyPath) {\n if (isArrayLike(keyPath) && typeof keyPath !== 'string') {\n return keyPath;\n }\n if (isOrdered(keyPath)) {\n return keyPath.toArray();\n }\n throw new TypeError(\n 'Invalid keyPath: expected Ordered Collection or Array: ' + keyPath\n );\n}\n\nfunction isPlainObj(value) {\n return (\n value &&\n (typeof value.constructor !== 'function' ||\n value.constructor.name === 'Object')\n );\n}\n\n/**\n * Returns true if the value is a potentially-persistent data structure, either\n * provided by Immutable.js or a plain Array or Object.\n */\nfunction isDataStructure(value) {\n return (\n typeof value === 'object' &&\n (isImmutable(value) || Array.isArray(value) || isPlainObj(value))\n );\n}\n\n/**\n * Converts a value to a string, adding quotes if a string was provided.\n */\nfunction quoteString(value) {\n try {\n return typeof value === 'string' ? JSON.stringify(value) : String(value);\n } catch (_ignoreError) {\n return JSON.stringify(value);\n }\n}\n\nfunction has(collection, key) {\n return isImmutable(collection)\n ? collection.has(key)\n : isDataStructure(collection) && hasOwnProperty.call(collection, key);\n}\n\nfunction get(collection, key, notSetValue) {\n return isImmutable(collection)\n ? collection.get(key, notSetValue)\n : !has(collection, key)\n ? notSetValue\n : typeof collection.get === 'function'\n ? collection.get(key)\n : collection[key];\n}\n\nfunction shallowCopy(from) {\n if (Array.isArray(from)) {\n return arrCopy(from);\n }\n var to = {};\n for (var key in from) {\n if (hasOwnProperty.call(from, key)) {\n to[key] = from[key];\n }\n }\n return to;\n}\n\nfunction remove(collection, key) {\n if (!isDataStructure(collection)) {\n throw new TypeError(\n 'Cannot update non-data-structure value: ' + collection\n );\n }\n if (isImmutable(collection)) {\n if (!collection.remove) {\n throw new TypeError(\n 'Cannot update immutable value without .remove() method: ' + collection\n );\n }\n return collection.remove(key);\n }\n if (!hasOwnProperty.call(collection, key)) {\n return collection;\n }\n var collectionCopy = shallowCopy(collection);\n if (Array.isArray(collectionCopy)) {\n collectionCopy.splice(key, 1);\n } else {\n delete collectionCopy[key];\n }\n return collectionCopy;\n}\n\nfunction set(collection, key, value) {\n if (!isDataStructure(collection)) {\n throw new TypeError(\n 'Cannot update non-data-structure value: ' + collection\n );\n }\n if (isImmutable(collection)) {\n if (!collection.set) {\n throw new TypeError(\n 'Cannot update immutable value without .set() method: ' + collection\n );\n }\n return collection.set(key, value);\n }\n if (hasOwnProperty.call(collection, key) && value === collection[key]) {\n return collection;\n }\n var collectionCopy = shallowCopy(collection);\n collectionCopy[key] = value;\n return collectionCopy;\n}\n\nfunction updateIn(collection, keyPath, notSetValue, updater) {\n if (!updater) {\n updater = notSetValue;\n notSetValue = undefined;\n }\n var updatedValue = updateInDeeply(\n isImmutable(collection),\n collection,\n coerceKeyPath(keyPath),\n 0,\n notSetValue,\n updater\n );\n return updatedValue === NOT_SET ? notSetValue : updatedValue;\n}\n\nfunction updateInDeeply(\n inImmutable,\n existing,\n keyPath,\n i,\n notSetValue,\n updater\n) {\n var wasNotSet = existing === NOT_SET;\n if (i === keyPath.length) {\n var existingValue = wasNotSet ? notSetValue : existing;\n var newValue = updater(existingValue);\n return newValue === existingValue ? existing : newValue;\n }\n if (!wasNotSet && !isDataStructure(existing)) {\n throw new TypeError(\n 'Cannot update within non-data-structure value in path [' +\n keyPath.slice(0, i).map(quoteString) +\n ']: ' +\n existing\n );\n }\n var key = keyPath[i];\n var nextExisting = wasNotSet ? NOT_SET : get(existing, key, NOT_SET);\n var nextUpdated = updateInDeeply(\n nextExisting === NOT_SET ? inImmutable : isImmutable(nextExisting),\n nextExisting,\n keyPath,\n i + 1,\n notSetValue,\n updater\n );\n return nextUpdated === nextExisting\n ? existing\n : nextUpdated === NOT_SET\n ? remove(existing, key)\n : set(\n wasNotSet ? (inImmutable ? emptyMap() : {}) : existing,\n key,\n nextUpdated\n );\n}\n\nfunction setIn(collection, keyPath, value) {\n return updateIn(collection, keyPath, NOT_SET, function () { return value; });\n}\n\nfunction setIn$1(keyPath, v) {\n return setIn(this, keyPath, v);\n}\n\nfunction removeIn(collection, keyPath) {\n return updateIn(collection, keyPath, function () { return NOT_SET; });\n}\n\nfunction deleteIn(keyPath) {\n return removeIn(this, keyPath);\n}\n\nfunction update(collection, key, notSetValue, updater) {\n return updateIn(collection, [key], notSetValue, updater);\n}\n\nfunction update$1(key, notSetValue, updater) {\n return arguments.length === 1\n ? key(this)\n : update(this, key, notSetValue, updater);\n}\n\nfunction updateIn$1(keyPath, notSetValue, updater) {\n return updateIn(this, keyPath, notSetValue, updater);\n}\n\nfunction merge() {\n var iters = [], len = arguments.length;\n while ( len-- ) iters[ len ] = arguments[ len ];\n\n return mergeIntoKeyedWith(this, iters);\n}\n\nfunction mergeWith(merger) {\n var iters = [], len = arguments.length - 1;\n while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n if (typeof merger !== 'function') {\n throw new TypeError('Invalid merger function: ' + merger);\n }\n return mergeIntoKeyedWith(this, iters, merger);\n}\n\nfunction mergeIntoKeyedWith(collection, collections, merger) {\n var iters = [];\n for (var ii = 0; ii < collections.length; ii++) {\n var collection$1 = KeyedCollection(collections[ii]);\n if (collection$1.size !== 0) {\n iters.push(collection$1);\n }\n }\n if (iters.length === 0) {\n return collection;\n }\n if (\n collection.toSeq().size === 0 &&\n !collection.__ownerID &&\n iters.length === 1\n ) {\n return collection.constructor(iters[0]);\n }\n return collection.withMutations(function (collection) {\n var mergeIntoCollection = merger\n ? function (value, key) {\n update(\n collection,\n key,\n NOT_SET,\n function (oldVal) { return (oldVal === NOT_SET ? value : merger(oldVal, value, key)); }\n );\n }\n : function (value, key) {\n collection.set(key, value);\n };\n for (var ii = 0; ii < iters.length; ii++) {\n iters[ii].forEach(mergeIntoCollection);\n }\n });\n}\n\nfunction merge$1(collection) {\n var sources = [], len = arguments.length - 1;\n while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n return mergeWithSources(collection, sources);\n}\n\nfunction mergeWith$1(merger, collection) {\n var sources = [], len = arguments.length - 2;\n while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ];\n\n return mergeWithSources(collection, sources, merger);\n}\n\nfunction mergeDeep(collection) {\n var sources = [], len = arguments.length - 1;\n while ( len-- > 0 ) sources[ len ] = arguments[ len + 1 ];\n\n return mergeDeepWithSources(collection, sources);\n}\n\nfunction mergeDeepWith(merger, collection) {\n var sources = [], len = arguments.length - 2;\n while ( len-- > 0 ) sources[ len ] = arguments[ len + 2 ];\n\n return mergeDeepWithSources(collection, sources, merger);\n}\n\nfunction mergeDeepWithSources(collection, sources, merger) {\n return mergeWithSources(collection, sources, deepMergerWith(merger));\n}\n\nfunction mergeWithSources(collection, sources, merger) {\n if (!isDataStructure(collection)) {\n throw new TypeError(\n 'Cannot merge into non-data-structure value: ' + collection\n );\n }\n if (isImmutable(collection)) {\n return typeof merger === 'function' && collection.mergeWith\n ? collection.mergeWith.apply(collection, [ merger ].concat( sources ))\n : collection.merge\n ? collection.merge.apply(collection, sources)\n : collection.concat.apply(collection, sources);\n }\n var isArray = Array.isArray(collection);\n var merged = collection;\n var Collection$$1 = isArray ? IndexedCollection : KeyedCollection;\n var mergeItem = isArray\n ? function (value) {\n // Copy on write\n if (merged === collection) {\n merged = shallowCopy(merged);\n }\n merged.push(value);\n }\n : function (value, key) {\n var hasVal = hasOwnProperty.call(merged, key);\n var nextVal =\n hasVal && merger ? merger(merged[key], value, key) : value;\n if (!hasVal || nextVal !== merged[key]) {\n // Copy on write\n if (merged === collection) {\n merged = shallowCopy(merged);\n }\n merged[key] = nextVal;\n }\n };\n for (var i = 0; i < sources.length; i++) {\n Collection$$1(sources[i]).forEach(mergeItem);\n }\n return merged;\n}\n\nfunction deepMergerWith(merger) {\n function deepMerger(oldValue, newValue, key) {\n return isDataStructure(oldValue) && isDataStructure(newValue)\n ? mergeWithSources(oldValue, [newValue], deepMerger)\n : merger\n ? merger(oldValue, newValue, key)\n : newValue;\n }\n return deepMerger;\n}\n\nfunction mergeDeep$1() {\n var iters = [], len = arguments.length;\n while ( len-- ) iters[ len ] = arguments[ len ];\n\n return mergeDeepWithSources(this, iters);\n}\n\nfunction mergeDeepWith$1(merger) {\n var iters = [], len = arguments.length - 1;\n while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n return mergeDeepWithSources(this, iters, merger);\n}\n\nfunction mergeIn(keyPath) {\n var iters = [], len = arguments.length - 1;\n while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n return updateIn(this, keyPath, emptyMap(), function (m) { return mergeWithSources(m, iters); });\n}\n\nfunction mergeDeepIn(keyPath) {\n var iters = [], len = arguments.length - 1;\n while ( len-- > 0 ) iters[ len ] = arguments[ len + 1 ];\n\n return updateIn(this, keyPath, emptyMap(), function (m) { return mergeDeepWithSources(m, iters); }\n );\n}\n\nfunction withMutations(fn) {\n var mutable = this.asMutable();\n fn(mutable);\n return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this;\n}\n\nfunction asMutable() {\n return this.__ownerID ? this : this.__ensureOwner(new OwnerID());\n}\n\nfunction asImmutable() {\n return this.__ensureOwner();\n}\n\nfunction wasAltered() {\n return this.__altered;\n}\n\nvar Map = /*@__PURE__*/(function (KeyedCollection$$1) {\n function Map(value) {\n return value === null || value === undefined\n ? emptyMap()\n : isMap(value) && !isOrdered(value)\n ? value\n : emptyMap().withMutations(function (map) {\n var iter = KeyedCollection$$1(value);\n assertNotInfinite(iter.size);\n iter.forEach(function (v, k) { return map.set(k, v); });\n });\n }\n\n if ( KeyedCollection$$1 ) Map.__proto__ = KeyedCollection$$1;\n Map.prototype = Object.create( KeyedCollection$$1 && KeyedCollection$$1.prototype );\n Map.prototype.constructor = Map;\n\n Map.of = function of () {\n var keyValues = [], len = arguments.length;\n while ( len-- ) keyValues[ len ] = arguments[ len ];\n\n return emptyMap().withMutations(function (map) {\n for (var i = 0; i < keyValues.length; i += 2) {\n if (i + 1 >= keyValues.length) {\n throw new Error('Missing value for key: ' + keyValues[i]);\n }\n map.set(keyValues[i], keyValues[i + 1]);\n }\n });\n };\n\n Map.prototype.toString = function toString () {\n return this.__toString('Map {', '}');\n };\n\n // @pragma Access\n\n Map.prototype.get = function get (k, notSetValue) {\n return this._root\n ? this._root.get(0, undefined, k, notSetValue)\n : notSetValue;\n };\n\n // @pragma Modification\n\n Map.prototype.set = function set (k, v) {\n return updateMap(this, k, v);\n };\n\n Map.prototype.remove = function remove (k) {\n return updateMap(this, k, NOT_SET);\n };\n\n Map.prototype.deleteAll = function deleteAll (keys) {\n var collection = Collection(keys);\n\n if (collection.size === 0) {\n return this;\n }\n\n return this.withMutations(function (map) {\n collection.forEach(function (key) { return map.remove(key); });\n });\n };\n\n Map.prototype.clear = function clear () {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = 0;\n this._root = null;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return emptyMap();\n };\n\n // @pragma Composition\n\n Map.prototype.sort = function sort (comparator) {\n // Late binding\n return OrderedMap(sortFactory(this, comparator));\n };\n\n Map.prototype.sortBy = function sortBy (mapper, comparator) {\n // Late binding\n return OrderedMap(sortFactory(this, comparator, mapper));\n };\n\n Map.prototype.map = function map (mapper, context) {\n return this.withMutations(function (map) {\n map.forEach(function (value, key) {\n map.set(key, mapper.call(context, value, key, map));\n });\n });\n };\n\n // @pragma Mutability\n\n Map.prototype.__iterator = function __iterator (type, reverse) {\n return new MapIterator(this, type, reverse);\n };\n\n Map.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n var iterations = 0;\n this._root &&\n this._root.iterate(function (entry) {\n iterations++;\n return fn(entry[1], entry[0], this$1);\n }, reverse);\n return iterations;\n };\n\n Map.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n if (!ownerID) {\n if (this.size === 0) {\n return emptyMap();\n }\n this.__ownerID = ownerID;\n this.__altered = false;\n return this;\n }\n return makeMap(this.size, this._root, ownerID, this.__hash);\n };\n\n return Map;\n}(KeyedCollection));\n\nMap.isMap = isMap;\n\nvar MapPrototype = Map.prototype;\nMapPrototype[IS_MAP_SYMBOL] = true;\nMapPrototype[DELETE] = MapPrototype.remove;\nMapPrototype.removeAll = MapPrototype.deleteAll;\nMapPrototype.setIn = setIn$1;\nMapPrototype.removeIn = MapPrototype.deleteIn = deleteIn;\nMapPrototype.update = update$1;\nMapPrototype.updateIn = updateIn$1;\nMapPrototype.merge = MapPrototype.concat = merge;\nMapPrototype.mergeWith = mergeWith;\nMapPrototype.mergeDeep = mergeDeep$1;\nMapPrototype.mergeDeepWith = mergeDeepWith$1;\nMapPrototype.mergeIn = mergeIn;\nMapPrototype.mergeDeepIn = mergeDeepIn;\nMapPrototype.withMutations = withMutations;\nMapPrototype.wasAltered = wasAltered;\nMapPrototype.asImmutable = asImmutable;\nMapPrototype['@@transducer/init'] = MapPrototype.asMutable = asMutable;\nMapPrototype['@@transducer/step'] = function(result, arr) {\n return result.set(arr[0], arr[1]);\n};\nMapPrototype['@@transducer/result'] = function(obj) {\n return obj.asImmutable();\n};\n\n// #pragma Trie Nodes\n\nvar ArrayMapNode = function ArrayMapNode(ownerID, entries) {\n this.ownerID = ownerID;\n this.entries = entries;\n};\n\nArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n var entries = this.entries;\n for (var ii = 0, len = entries.length; ii < len; ii++) {\n if (is(key, entries[ii][0])) {\n return entries[ii][1];\n }\n }\n return notSetValue;\n};\n\nArrayMapNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n var removed = value === NOT_SET;\n\n var entries = this.entries;\n var idx = 0;\n var len = entries.length;\n for (; idx < len; idx++) {\n if (is(key, entries[idx][0])) {\n break;\n }\n }\n var exists = idx < len;\n\n if (exists ? entries[idx][1] === value : removed) {\n return this;\n }\n\n SetRef(didAlter);\n (removed || !exists) && SetRef(didChangeSize);\n\n if (removed && entries.length === 1) {\n return; // undefined\n }\n\n if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {\n return createNodes(ownerID, entries, key, value);\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newEntries = isEditable ? entries : arrCopy(entries);\n\n if (exists) {\n if (removed) {\n idx === len - 1\n ? newEntries.pop()\n : (newEntries[idx] = newEntries.pop());\n } else {\n newEntries[idx] = [key, value];\n }\n } else {\n newEntries.push([key, value]);\n }\n\n if (isEditable) {\n this.entries = newEntries;\n return this;\n }\n\n return new ArrayMapNode(ownerID, newEntries);\n};\n\nvar BitmapIndexedNode = function BitmapIndexedNode(ownerID, bitmap, nodes) {\n this.ownerID = ownerID;\n this.bitmap = bitmap;\n this.nodes = nodes;\n};\n\nBitmapIndexedNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var bit = 1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK);\n var bitmap = this.bitmap;\n return (bitmap & bit) === 0\n ? notSetValue\n : this.nodes[popCount(bitmap & (bit - 1))].get(\n shift + SHIFT,\n keyHash,\n key,\n notSetValue\n );\n};\n\nBitmapIndexedNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n var bit = 1 << keyHashFrag;\n var bitmap = this.bitmap;\n var exists = (bitmap & bit) !== 0;\n\n if (!exists && value === NOT_SET) {\n return this;\n }\n\n var idx = popCount(bitmap & (bit - 1));\n var nodes = this.nodes;\n var node = exists ? nodes[idx] : undefined;\n var newNode = updateNode(\n node,\n ownerID,\n shift + SHIFT,\n keyHash,\n key,\n value,\n didChangeSize,\n didAlter\n );\n\n if (newNode === node) {\n return this;\n }\n\n if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {\n return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode);\n }\n\n if (\n exists &&\n !newNode &&\n nodes.length === 2 &&\n isLeafNode(nodes[idx ^ 1])\n ) {\n return nodes[idx ^ 1];\n }\n\n if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {\n return newNode;\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newBitmap = exists ? (newNode ? bitmap : bitmap ^ bit) : bitmap | bit;\n var newNodes = exists\n ? newNode\n ? setAt(nodes, idx, newNode, isEditable)\n : spliceOut(nodes, idx, isEditable)\n : spliceIn(nodes, idx, newNode, isEditable);\n\n if (isEditable) {\n this.bitmap = newBitmap;\n this.nodes = newNodes;\n return this;\n }\n\n return new BitmapIndexedNode(ownerID, newBitmap, newNodes);\n};\n\nvar HashArrayMapNode = function HashArrayMapNode(ownerID, count, nodes) {\n this.ownerID = ownerID;\n this.count = count;\n this.nodes = nodes;\n};\n\nHashArrayMapNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n var node = this.nodes[idx];\n return node\n ? node.get(shift + SHIFT, keyHash, key, notSetValue)\n : notSetValue;\n};\n\nHashArrayMapNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n var removed = value === NOT_SET;\n var nodes = this.nodes;\n var node = nodes[idx];\n\n if (removed && !node) {\n return this;\n }\n\n var newNode = updateNode(\n node,\n ownerID,\n shift + SHIFT,\n keyHash,\n key,\n value,\n didChangeSize,\n didAlter\n );\n if (newNode === node) {\n return this;\n }\n\n var newCount = this.count;\n if (!node) {\n newCount++;\n } else if (!newNode) {\n newCount--;\n if (newCount < MIN_HASH_ARRAY_MAP_SIZE) {\n return packNodes(ownerID, nodes, newCount, idx);\n }\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newNodes = setAt(nodes, idx, newNode, isEditable);\n\n if (isEditable) {\n this.count = newCount;\n this.nodes = newNodes;\n return this;\n }\n\n return new HashArrayMapNode(ownerID, newCount, newNodes);\n};\n\nvar HashCollisionNode = function HashCollisionNode(ownerID, keyHash, entries) {\n this.ownerID = ownerID;\n this.keyHash = keyHash;\n this.entries = entries;\n};\n\nHashCollisionNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n var entries = this.entries;\n for (var ii = 0, len = entries.length; ii < len; ii++) {\n if (is(key, entries[ii][0])) {\n return entries[ii][1];\n }\n }\n return notSetValue;\n};\n\nHashCollisionNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n\n var removed = value === NOT_SET;\n\n if (keyHash !== this.keyHash) {\n if (removed) {\n return this;\n }\n SetRef(didAlter);\n SetRef(didChangeSize);\n return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]);\n }\n\n var entries = this.entries;\n var idx = 0;\n var len = entries.length;\n for (; idx < len; idx++) {\n if (is(key, entries[idx][0])) {\n break;\n }\n }\n var exists = idx < len;\n\n if (exists ? entries[idx][1] === value : removed) {\n return this;\n }\n\n SetRef(didAlter);\n (removed || !exists) && SetRef(didChangeSize);\n\n if (removed && len === 2) {\n return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]);\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newEntries = isEditable ? entries : arrCopy(entries);\n\n if (exists) {\n if (removed) {\n idx === len - 1\n ? newEntries.pop()\n : (newEntries[idx] = newEntries.pop());\n } else {\n newEntries[idx] = [key, value];\n }\n } else {\n newEntries.push([key, value]);\n }\n\n if (isEditable) {\n this.entries = newEntries;\n return this;\n }\n\n return new HashCollisionNode(ownerID, this.keyHash, newEntries);\n};\n\nvar ValueNode = function ValueNode(ownerID, keyHash, entry) {\n this.ownerID = ownerID;\n this.keyHash = keyHash;\n this.entry = entry;\n};\n\nValueNode.prototype.get = function get (shift, keyHash, key, notSetValue) {\n return is(key, this.entry[0]) ? this.entry[1] : notSetValue;\n};\n\nValueNode.prototype.update = function update (ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n var removed = value === NOT_SET;\n var keyMatch = is(key, this.entry[0]);\n if (keyMatch ? value === this.entry[1] : removed) {\n return this;\n }\n\n SetRef(didAlter);\n\n if (removed) {\n SetRef(didChangeSize);\n return; // undefined\n }\n\n if (keyMatch) {\n if (ownerID && ownerID === this.ownerID) {\n this.entry[1] = value;\n return this;\n }\n return new ValueNode(ownerID, this.keyHash, [key, value]);\n }\n\n SetRef(didChangeSize);\n return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]);\n};\n\n// #pragma Iterators\n\nArrayMapNode.prototype.iterate = HashCollisionNode.prototype.iterate = function(\n fn,\n reverse\n) {\n var entries = this.entries;\n for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) {\n if (fn(entries[reverse ? maxIndex - ii : ii]) === false) {\n return false;\n }\n }\n};\n\nBitmapIndexedNode.prototype.iterate = HashArrayMapNode.prototype.iterate = function(\n fn,\n reverse\n) {\n var nodes = this.nodes;\n for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) {\n var node = nodes[reverse ? maxIndex - ii : ii];\n if (node && node.iterate(fn, reverse) === false) {\n return false;\n }\n }\n};\n\n// eslint-disable-next-line no-unused-vars\nValueNode.prototype.iterate = function(fn, reverse) {\n return fn(this.entry);\n};\n\nvar MapIterator = /*@__PURE__*/(function (Iterator$$1) {\n function MapIterator(map, type, reverse) {\n this._type = type;\n this._reverse = reverse;\n this._stack = map._root && mapIteratorFrame(map._root);\n }\n\n if ( Iterator$$1 ) MapIterator.__proto__ = Iterator$$1;\n MapIterator.prototype = Object.create( Iterator$$1 && Iterator$$1.prototype );\n MapIterator.prototype.constructor = MapIterator;\n\n MapIterator.prototype.next = function next () {\n var type = this._type;\n var stack = this._stack;\n while (stack) {\n var node = stack.node;\n var index = stack.index++;\n var maxIndex = (void 0);\n if (node.entry) {\n if (index === 0) {\n return mapIteratorValue(type, node.entry);\n }\n } else if (node.entries) {\n maxIndex = node.entries.length - 1;\n if (index <= maxIndex) {\n return mapIteratorValue(\n type,\n node.entries[this._reverse ? maxIndex - index : index]\n );\n }\n } else {\n maxIndex = node.nodes.length - 1;\n if (index <= maxIndex) {\n var subNode = node.nodes[this._reverse ? maxIndex - index : index];\n if (subNode) {\n if (subNode.entry) {\n return mapIteratorValue(type, subNode.entry);\n }\n stack = this._stack = mapIteratorFrame(subNode, stack);\n }\n continue;\n }\n }\n stack = this._stack = this._stack.__prev;\n }\n return iteratorDone();\n };\n\n return MapIterator;\n}(Iterator));\n\nfunction mapIteratorValue(type, entry) {\n return iteratorValue(type, entry[0], entry[1]);\n}\n\nfunction mapIteratorFrame(node, prev) {\n return {\n node: node,\n index: 0,\n __prev: prev,\n };\n}\n\nfunction makeMap(size, root, ownerID, hash$$1) {\n var map = Object.create(MapPrototype);\n map.size = size;\n map._root = root;\n map.__ownerID = ownerID;\n map.__hash = hash$$1;\n map.__altered = false;\n return map;\n}\n\nvar EMPTY_MAP;\nfunction emptyMap() {\n return EMPTY_MAP || (EMPTY_MAP = makeMap(0));\n}\n\nfunction updateMap(map, k, v) {\n var newRoot;\n var newSize;\n if (!map._root) {\n if (v === NOT_SET) {\n return map;\n }\n newSize = 1;\n newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]);\n } else {\n var didChangeSize = MakeRef();\n var didAlter = MakeRef();\n newRoot = updateNode(\n map._root,\n map.__ownerID,\n 0,\n undefined,\n k,\n v,\n didChangeSize,\n didAlter\n );\n if (!didAlter.value) {\n return map;\n }\n newSize = map.size + (didChangeSize.value ? (v === NOT_SET ? -1 : 1) : 0);\n }\n if (map.__ownerID) {\n map.size = newSize;\n map._root = newRoot;\n map.__hash = undefined;\n map.__altered = true;\n return map;\n }\n return newRoot ? makeMap(newSize, newRoot) : emptyMap();\n}\n\nfunction updateNode(\n node,\n ownerID,\n shift,\n keyHash,\n key,\n value,\n didChangeSize,\n didAlter\n) {\n if (!node) {\n if (value === NOT_SET) {\n return node;\n }\n SetRef(didAlter);\n SetRef(didChangeSize);\n return new ValueNode(ownerID, keyHash, [key, value]);\n }\n return node.update(\n ownerID,\n shift,\n keyHash,\n key,\n value,\n didChangeSize,\n didAlter\n );\n}\n\nfunction isLeafNode(node) {\n return (\n node.constructor === ValueNode || node.constructor === HashCollisionNode\n );\n}\n\nfunction mergeIntoNode(node, ownerID, shift, keyHash, entry) {\n if (node.keyHash === keyHash) {\n return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]);\n }\n\n var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK;\n var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n\n var newNode;\n var nodes =\n idx1 === idx2\n ? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)]\n : ((newNode = new ValueNode(ownerID, keyHash, entry)),\n idx1 < idx2 ? [node, newNode] : [newNode, node]);\n\n return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes);\n}\n\nfunction createNodes(ownerID, entries, key, value) {\n if (!ownerID) {\n ownerID = new OwnerID();\n }\n var node = new ValueNode(ownerID, hash(key), [key, value]);\n for (var ii = 0; ii < entries.length; ii++) {\n var entry = entries[ii];\n node = node.update(ownerID, 0, undefined, entry[0], entry[1]);\n }\n return node;\n}\n\nfunction packNodes(ownerID, nodes, count, excluding) {\n var bitmap = 0;\n var packedII = 0;\n var packedNodes = new Array(count);\n for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) {\n var node = nodes[ii];\n if (node !== undefined && ii !== excluding) {\n bitmap |= bit;\n packedNodes[packedII++] = node;\n }\n }\n return new BitmapIndexedNode(ownerID, bitmap, packedNodes);\n}\n\nfunction expandNodes(ownerID, nodes, bitmap, including, node) {\n var count = 0;\n var expandedNodes = new Array(SIZE);\n for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) {\n expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined;\n }\n expandedNodes[including] = node;\n return new HashArrayMapNode(ownerID, count + 1, expandedNodes);\n}\n\nfunction popCount(x) {\n x -= (x >> 1) & 0x55555555;\n x = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n x = (x + (x >> 4)) & 0x0f0f0f0f;\n x += x >> 8;\n x += x >> 16;\n return x & 0x7f;\n}\n\nfunction setAt(array, idx, val, canEdit) {\n var newArray = canEdit ? array : arrCopy(array);\n newArray[idx] = val;\n return newArray;\n}\n\nfunction spliceIn(array, idx, val, canEdit) {\n var newLen = array.length + 1;\n if (canEdit && idx + 1 === newLen) {\n array[idx] = val;\n return array;\n }\n var newArray = new Array(newLen);\n var after = 0;\n for (var ii = 0; ii < newLen; ii++) {\n if (ii === idx) {\n newArray[ii] = val;\n after = -1;\n } else {\n newArray[ii] = array[ii + after];\n }\n }\n return newArray;\n}\n\nfunction spliceOut(array, idx, canEdit) {\n var newLen = array.length - 1;\n if (canEdit && idx === newLen) {\n array.pop();\n return array;\n }\n var newArray = new Array(newLen);\n var after = 0;\n for (var ii = 0; ii < newLen; ii++) {\n if (ii === idx) {\n after = 1;\n }\n newArray[ii] = array[ii + after];\n }\n return newArray;\n}\n\nvar MAX_ARRAY_MAP_SIZE = SIZE / 4;\nvar MAX_BITMAP_INDEXED_SIZE = SIZE / 2;\nvar MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4;\n\nvar IS_LIST_SYMBOL = '@@__IMMUTABLE_LIST__@@';\n\nfunction isList(maybeList) {\n return Boolean(maybeList && maybeList[IS_LIST_SYMBOL]);\n}\n\nvar List = /*@__PURE__*/(function (IndexedCollection$$1) {\n function List(value) {\n var empty = emptyList();\n if (value === null || value === undefined) {\n return empty;\n }\n if (isList(value)) {\n return value;\n }\n var iter = IndexedCollection$$1(value);\n var size = iter.size;\n if (size === 0) {\n return empty;\n }\n assertNotInfinite(size);\n if (size > 0 && size < SIZE) {\n return makeList(0, size, SHIFT, null, new VNode(iter.toArray()));\n }\n return empty.withMutations(function (list) {\n list.setSize(size);\n iter.forEach(function (v, i) { return list.set(i, v); });\n });\n }\n\n if ( IndexedCollection$$1 ) List.__proto__ = IndexedCollection$$1;\n List.prototype = Object.create( IndexedCollection$$1 && IndexedCollection$$1.prototype );\n List.prototype.constructor = List;\n\n List.of = function of (/*...values*/) {\n return this(arguments);\n };\n\n List.prototype.toString = function toString () {\n return this.__toString('List [', ']');\n };\n\n // @pragma Access\n\n List.prototype.get = function get (index, notSetValue) {\n index = wrapIndex(this, index);\n if (index >= 0 && index < this.size) {\n index += this._origin;\n var node = listNodeFor(this, index);\n return node && node.array[index & MASK];\n }\n return notSetValue;\n };\n\n // @pragma Modification\n\n List.prototype.set = function set (index, value) {\n return updateList(this, index, value);\n };\n\n List.prototype.remove = function remove (index) {\n return !this.has(index)\n ? this\n : index === 0\n ? this.shift()\n : index === this.size - 1\n ? this.pop()\n : this.splice(index, 1);\n };\n\n List.prototype.insert = function insert (index, value) {\n return this.splice(index, 0, value);\n };\n\n List.prototype.clear = function clear () {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = this._origin = this._capacity = 0;\n this._level = SHIFT;\n this._root = this._tail = null;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return emptyList();\n };\n\n List.prototype.push = function push (/*...values*/) {\n var values = arguments;\n var oldSize = this.size;\n return this.withMutations(function (list) {\n setListBounds(list, 0, oldSize + values.length);\n for (var ii = 0; ii < values.length; ii++) {\n list.set(oldSize + ii, values[ii]);\n }\n });\n };\n\n List.prototype.pop = function pop () {\n return setListBounds(this, 0, -1);\n };\n\n List.prototype.unshift = function unshift (/*...values*/) {\n var values = arguments;\n return this.withMutations(function (list) {\n setListBounds(list, -values.length);\n for (var ii = 0; ii < values.length; ii++) {\n list.set(ii, values[ii]);\n }\n });\n };\n\n List.prototype.shift = function shift () {\n return setListBounds(this, 1);\n };\n\n // @pragma Composition\n\n List.prototype.concat = function concat (/*...collections*/) {\n var arguments$1 = arguments;\n\n var seqs = [];\n for (var i = 0; i < arguments.length; i++) {\n var argument = arguments$1[i];\n var seq = IndexedCollection$$1(\n typeof argument !== 'string' && hasIterator(argument)\n ? argument\n : [argument]\n );\n if (seq.size !== 0) {\n seqs.push(seq);\n }\n }\n if (seqs.length === 0) {\n return this;\n }\n if (this.size === 0 && !this.__ownerID && seqs.length === 1) {\n return this.constructor(seqs[0]);\n }\n return this.withMutations(function (list) {\n seqs.forEach(function (seq) { return seq.forEach(function (value) { return list.push(value); }); });\n });\n };\n\n List.prototype.setSize = function setSize (size) {\n return setListBounds(this, 0, size);\n };\n\n List.prototype.map = function map (mapper, context) {\n var this$1 = this;\n\n return this.withMutations(function (list) {\n for (var i = 0; i < this$1.size; i++) {\n list.set(i, mapper.call(context, list.get(i), i, list));\n }\n });\n };\n\n // @pragma Iteration\n\n List.prototype.slice = function slice (begin, end) {\n var size = this.size;\n if (wholeSlice(begin, end, size)) {\n return this;\n }\n return setListBounds(\n this,\n resolveBegin(begin, size),\n resolveEnd(end, size)\n );\n };\n\n List.prototype.__iterator = function __iterator (type, reverse) {\n var index = reverse ? this.size : 0;\n var values = iterateList(this, reverse);\n return new Iterator(function () {\n var value = values();\n return value === DONE\n ? iteratorDone()\n : iteratorValue(type, reverse ? --index : index++, value);\n });\n };\n\n List.prototype.__iterate = function __iterate (fn, reverse) {\n var index = reverse ? this.size : 0;\n var values = iterateList(this, reverse);\n var value;\n while ((value = values()) !== DONE) {\n if (fn(value, reverse ? --index : index++, this) === false) {\n break;\n }\n }\n return index;\n };\n\n List.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n if (!ownerID) {\n if (this.size === 0) {\n return emptyList();\n }\n this.__ownerID = ownerID;\n this.__altered = false;\n return this;\n }\n return makeList(\n this._origin,\n this._capacity,\n this._level,\n this._root,\n this._tail,\n ownerID,\n this.__hash\n );\n };\n\n return List;\n}(IndexedCollection));\n\nList.isList = isList;\n\nvar ListPrototype = List.prototype;\nListPrototype[IS_LIST_SYMBOL] = true;\nListPrototype[DELETE] = ListPrototype.remove;\nListPrototype.merge = ListPrototype.concat;\nListPrototype.setIn = setIn$1;\nListPrototype.deleteIn = ListPrototype.removeIn = deleteIn;\nListPrototype.update = update$1;\nListPrototype.updateIn = updateIn$1;\nListPrototype.mergeIn = mergeIn;\nListPrototype.mergeDeepIn = mergeDeepIn;\nListPrototype.withMutations = withMutations;\nListPrototype.wasAltered = wasAltered;\nListPrototype.asImmutable = asImmutable;\nListPrototype['@@transducer/init'] = ListPrototype.asMutable = asMutable;\nListPrototype['@@transducer/step'] = function(result, arr) {\n return result.push(arr);\n};\nListPrototype['@@transducer/result'] = function(obj) {\n return obj.asImmutable();\n};\n\nvar VNode = function VNode(array, ownerID) {\n this.array = array;\n this.ownerID = ownerID;\n};\n\n// TODO: seems like these methods are very similar\n\nVNode.prototype.removeBefore = function removeBefore (ownerID, level, index) {\n if (index === level ? 1 << level : this.array.length === 0) {\n return this;\n }\n var originIndex = (index >>> level) & MASK;\n if (originIndex >= this.array.length) {\n return new VNode([], ownerID);\n }\n var removingFirst = originIndex === 0;\n var newChild;\n if (level > 0) {\n var oldChild = this.array[originIndex];\n newChild =\n oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index);\n if (newChild === oldChild && removingFirst) {\n return this;\n }\n }\n if (removingFirst && !newChild) {\n return this;\n }\n var editable = editableVNode(this, ownerID);\n if (!removingFirst) {\n for (var ii = 0; ii < originIndex; ii++) {\n editable.array[ii] = undefined;\n }\n }\n if (newChild) {\n editable.array[originIndex] = newChild;\n }\n return editable;\n};\n\nVNode.prototype.removeAfter = function removeAfter (ownerID, level, index) {\n if (index === (level ? 1 << level : 0) || this.array.length === 0) {\n return this;\n }\n var sizeIndex = ((index - 1) >>> level) & MASK;\n if (sizeIndex >= this.array.length) {\n return this;\n }\n\n var newChild;\n if (level > 0) {\n var oldChild = this.array[sizeIndex];\n newChild =\n oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index);\n if (newChild === oldChild && sizeIndex === this.array.length - 1) {\n return this;\n }\n }\n\n var editable = editableVNode(this, ownerID);\n editable.array.splice(sizeIndex + 1);\n if (newChild) {\n editable.array[sizeIndex] = newChild;\n }\n return editable;\n};\n\nvar DONE = {};\n\nfunction iterateList(list, reverse) {\n var left = list._origin;\n var right = list._capacity;\n var tailPos = getTailOffset(right);\n var tail = list._tail;\n\n return iterateNodeOrLeaf(list._root, list._level, 0);\n\n function iterateNodeOrLeaf(node, level, offset) {\n return level === 0\n ? iterateLeaf(node, offset)\n : iterateNode(node, level, offset);\n }\n\n function iterateLeaf(node, offset) {\n var array = offset === tailPos ? tail && tail.array : node && node.array;\n var from = offset > left ? 0 : left - offset;\n var to = right - offset;\n if (to > SIZE) {\n to = SIZE;\n }\n return function () {\n if (from === to) {\n return DONE;\n }\n var idx = reverse ? --to : from++;\n return array && array[idx];\n };\n }\n\n function iterateNode(node, level, offset) {\n var values;\n var array = node && node.array;\n var from = offset > left ? 0 : (left - offset) >> level;\n var to = ((right - offset) >> level) + 1;\n if (to > SIZE) {\n to = SIZE;\n }\n return function () {\n while (true) {\n if (values) {\n var value = values();\n if (value !== DONE) {\n return value;\n }\n values = null;\n }\n if (from === to) {\n return DONE;\n }\n var idx = reverse ? --to : from++;\n values = iterateNodeOrLeaf(\n array && array[idx],\n level - SHIFT,\n offset + (idx << level)\n );\n }\n };\n }\n}\n\nfunction makeList(origin, capacity, level, root, tail, ownerID, hash) {\n var list = Object.create(ListPrototype);\n list.size = capacity - origin;\n list._origin = origin;\n list._capacity = capacity;\n list._level = level;\n list._root = root;\n list._tail = tail;\n list.__ownerID = ownerID;\n list.__hash = hash;\n list.__altered = false;\n return list;\n}\n\nvar EMPTY_LIST;\nfunction emptyList() {\n return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT));\n}\n\nfunction updateList(list, index, value) {\n index = wrapIndex(list, index);\n\n if (index !== index) {\n return list;\n }\n\n if (index >= list.size || index < 0) {\n return list.withMutations(function (list) {\n index < 0\n ? setListBounds(list, index).set(0, value)\n : setListBounds(list, 0, index + 1).set(index, value);\n });\n }\n\n index += list._origin;\n\n var newTail = list._tail;\n var newRoot = list._root;\n var didAlter = MakeRef();\n if (index >= getTailOffset(list._capacity)) {\n newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter);\n } else {\n newRoot = updateVNode(\n newRoot,\n list.__ownerID,\n list._level,\n index,\n value,\n didAlter\n );\n }\n\n if (!didAlter.value) {\n return list;\n }\n\n if (list.__ownerID) {\n list._root = newRoot;\n list._tail = newTail;\n list.__hash = undefined;\n list.__altered = true;\n return list;\n }\n return makeList(list._origin, list._capacity, list._level, newRoot, newTail);\n}\n\nfunction updateVNode(node, ownerID, level, index, value, didAlter) {\n var idx = (index >>> level) & MASK;\n var nodeHas = node && idx < node.array.length;\n if (!nodeHas && value === undefined) {\n return node;\n }\n\n var newNode;\n\n if (level > 0) {\n var lowerNode = node && node.array[idx];\n var newLowerNode = updateVNode(\n lowerNode,\n ownerID,\n level - SHIFT,\n index,\n value,\n didAlter\n );\n if (newLowerNode === lowerNode) {\n return node;\n }\n newNode = editableVNode(node, ownerID);\n newNode.array[idx] = newLowerNode;\n return newNode;\n }\n\n if (nodeHas && node.array[idx] === value) {\n return node;\n }\n\n if (didAlter) {\n SetRef(didAlter);\n }\n\n newNode = editableVNode(node, ownerID);\n if (value === undefined && idx === newNode.array.length - 1) {\n newNode.array.pop();\n } else {\n newNode.array[idx] = value;\n }\n return newNode;\n}\n\nfunction editableVNode(node, ownerID) {\n if (ownerID && node && ownerID === node.ownerID) {\n return node;\n }\n return new VNode(node ? node.array.slice() : [], ownerID);\n}\n\nfunction listNodeFor(list, rawIndex) {\n if (rawIndex >= getTailOffset(list._capacity)) {\n return list._tail;\n }\n if (rawIndex < 1 << (list._level + SHIFT)) {\n var node = list._root;\n var level = list._level;\n while (node && level > 0) {\n node = node.array[(rawIndex >>> level) & MASK];\n level -= SHIFT;\n }\n return node;\n }\n}\n\nfunction setListBounds(list, begin, end) {\n // Sanitize begin & end using this shorthand for ToInt32(argument)\n // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n if (begin !== undefined) {\n begin |= 0;\n }\n if (end !== undefined) {\n end |= 0;\n }\n var owner = list.__ownerID || new OwnerID();\n var oldOrigin = list._origin;\n var oldCapacity = list._capacity;\n var newOrigin = oldOrigin + begin;\n var newCapacity =\n end === undefined\n ? oldCapacity\n : end < 0\n ? oldCapacity + end\n : oldOrigin + end;\n if (newOrigin === oldOrigin && newCapacity === oldCapacity) {\n return list;\n }\n\n // If it's going to end after it starts, it's empty.\n if (newOrigin >= newCapacity) {\n return list.clear();\n }\n\n var newLevel = list._level;\n var newRoot = list._root;\n\n // New origin might need creating a higher root.\n var offsetShift = 0;\n while (newOrigin + offsetShift < 0) {\n newRoot = new VNode(\n newRoot && newRoot.array.length ? [undefined, newRoot] : [],\n owner\n );\n newLevel += SHIFT;\n offsetShift += 1 << newLevel;\n }\n if (offsetShift) {\n newOrigin += offsetShift;\n oldOrigin += offsetShift;\n newCapacity += offsetShift;\n oldCapacity += offsetShift;\n }\n\n var oldTailOffset = getTailOffset(oldCapacity);\n var newTailOffset = getTailOffset(newCapacity);\n\n // New size might need creating a higher root.\n while (newTailOffset >= 1 << (newLevel + SHIFT)) {\n newRoot = new VNode(\n newRoot && newRoot.array.length ? [newRoot] : [],\n owner\n );\n newLevel += SHIFT;\n }\n\n // Locate or create the new tail.\n var oldTail = list._tail;\n var newTail =\n newTailOffset < oldTailOffset\n ? listNodeFor(list, newCapacity - 1)\n : newTailOffset > oldTailOffset\n ? new VNode([], owner)\n : oldTail;\n\n // Merge Tail into tree.\n if (\n oldTail &&\n newTailOffset > oldTailOffset &&\n newOrigin < oldCapacity &&\n oldTail.array.length\n ) {\n newRoot = editableVNode(newRoot, owner);\n var node = newRoot;\n for (var level = newLevel; level > SHIFT; level -= SHIFT) {\n var idx = (oldTailOffset >>> level) & MASK;\n node = node.array[idx] = editableVNode(node.array[idx], owner);\n }\n node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail;\n }\n\n // If the size has been reduced, there's a chance the tail needs to be trimmed.\n if (newCapacity < oldCapacity) {\n newTail = newTail && newTail.removeAfter(owner, 0, newCapacity);\n }\n\n // If the new origin is within the tail, then we do not need a root.\n if (newOrigin >= newTailOffset) {\n newOrigin -= newTailOffset;\n newCapacity -= newTailOffset;\n newLevel = SHIFT;\n newRoot = null;\n newTail = newTail && newTail.removeBefore(owner, 0, newOrigin);\n\n // Otherwise, if the root has been trimmed, garbage collect.\n } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) {\n offsetShift = 0;\n\n // Identify the new top root node of the subtree of the old root.\n while (newRoot) {\n var beginIndex = (newOrigin >>> newLevel) & MASK;\n if ((beginIndex !== newTailOffset >>> newLevel) & MASK) {\n break;\n }\n if (beginIndex) {\n offsetShift += (1 << newLevel) * beginIndex;\n }\n newLevel -= SHIFT;\n newRoot = newRoot.array[beginIndex];\n }\n\n // Trim the new sides of the new root.\n if (newRoot && newOrigin > oldOrigin) {\n newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift);\n }\n if (newRoot && newTailOffset < oldTailOffset) {\n newRoot = newRoot.removeAfter(\n owner,\n newLevel,\n newTailOffset - offsetShift\n );\n }\n if (offsetShift) {\n newOrigin -= offsetShift;\n newCapacity -= offsetShift;\n }\n }\n\n if (list.__ownerID) {\n list.size = newCapacity - newOrigin;\n list._origin = newOrigin;\n list._capacity = newCapacity;\n list._level = newLevel;\n list._root = newRoot;\n list._tail = newTail;\n list.__hash = undefined;\n list.__altered = true;\n return list;\n }\n return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail);\n}\n\nfunction getTailOffset(size) {\n return size < SIZE ? 0 : ((size - 1) >>> SHIFT) << SHIFT;\n}\n\nvar OrderedMap = /*@__PURE__*/(function (Map$$1) {\n function OrderedMap(value) {\n return value === null || value === undefined\n ? emptyOrderedMap()\n : isOrderedMap(value)\n ? value\n : emptyOrderedMap().withMutations(function (map) {\n var iter = KeyedCollection(value);\n assertNotInfinite(iter.size);\n iter.forEach(function (v, k) { return map.set(k, v); });\n });\n }\n\n if ( Map$$1 ) OrderedMap.__proto__ = Map$$1;\n OrderedMap.prototype = Object.create( Map$$1 && Map$$1.prototype );\n OrderedMap.prototype.constructor = OrderedMap;\n\n OrderedMap.of = function of (/*...values*/) {\n return this(arguments);\n };\n\n OrderedMap.prototype.toString = function toString () {\n return this.__toString('OrderedMap {', '}');\n };\n\n // @pragma Access\n\n OrderedMap.prototype.get = function get (k, notSetValue) {\n var index = this._map.get(k);\n return index !== undefined ? this._list.get(index)[1] : notSetValue;\n };\n\n // @pragma Modification\n\n OrderedMap.prototype.clear = function clear () {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = 0;\n this._map.clear();\n this._list.clear();\n return this;\n }\n return emptyOrderedMap();\n };\n\n OrderedMap.prototype.set = function set (k, v) {\n return updateOrderedMap(this, k, v);\n };\n\n OrderedMap.prototype.remove = function remove (k) {\n return updateOrderedMap(this, k, NOT_SET);\n };\n\n OrderedMap.prototype.wasAltered = function wasAltered () {\n return this._map.wasAltered() || this._list.wasAltered();\n };\n\n OrderedMap.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n return this._list.__iterate(\n function (entry) { return entry && fn(entry[1], entry[0], this$1); },\n reverse\n );\n };\n\n OrderedMap.prototype.__iterator = function __iterator (type, reverse) {\n return this._list.fromEntrySeq().__iterator(type, reverse);\n };\n\n OrderedMap.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n var newMap = this._map.__ensureOwner(ownerID);\n var newList = this._list.__ensureOwner(ownerID);\n if (!ownerID) {\n if (this.size === 0) {\n return emptyOrderedMap();\n }\n this.__ownerID = ownerID;\n this._map = newMap;\n this._list = newList;\n return this;\n }\n return makeOrderedMap(newMap, newList, ownerID, this.__hash);\n };\n\n return OrderedMap;\n}(Map));\n\nOrderedMap.isOrderedMap = isOrderedMap;\n\nOrderedMap.prototype[IS_ORDERED_SYMBOL] = true;\nOrderedMap.prototype[DELETE] = OrderedMap.prototype.remove;\n\nfunction makeOrderedMap(map, list, ownerID, hash) {\n var omap = Object.create(OrderedMap.prototype);\n omap.size = map ? map.size : 0;\n omap._map = map;\n omap._list = list;\n omap.__ownerID = ownerID;\n omap.__hash = hash;\n return omap;\n}\n\nvar EMPTY_ORDERED_MAP;\nfunction emptyOrderedMap() {\n return (\n EMPTY_ORDERED_MAP ||\n (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList()))\n );\n}\n\nfunction updateOrderedMap(omap, k, v) {\n var map = omap._map;\n var list = omap._list;\n var i = map.get(k);\n var has = i !== undefined;\n var newMap;\n var newList;\n if (v === NOT_SET) {\n // removed\n if (!has) {\n return omap;\n }\n if (list.size >= SIZE && list.size >= map.size * 2) {\n newList = list.filter(function (entry, idx) { return entry !== undefined && i !== idx; });\n newMap = newList\n .toKeyedSeq()\n .map(function (entry) { return entry[0]; })\n .flip()\n .toMap();\n if (omap.__ownerID) {\n newMap.__ownerID = newList.__ownerID = omap.__ownerID;\n }\n } else {\n newMap = map.remove(k);\n newList = i === list.size - 1 ? list.pop() : list.set(i, undefined);\n }\n } else if (has) {\n if (v === list.get(i)[1]) {\n return omap;\n }\n newMap = map;\n newList = list.set(i, [k, v]);\n } else {\n newMap = map.set(k, list.size);\n newList = list.set(list.size, [k, v]);\n }\n if (omap.__ownerID) {\n omap.size = newMap.size;\n omap._map = newMap;\n omap._list = newList;\n omap.__hash = undefined;\n return omap;\n }\n return makeOrderedMap(newMap, newList);\n}\n\nvar IS_STACK_SYMBOL = '@@__IMMUTABLE_STACK__@@';\n\nfunction isStack(maybeStack) {\n return Boolean(maybeStack && maybeStack[IS_STACK_SYMBOL]);\n}\n\nvar Stack = /*@__PURE__*/(function (IndexedCollection$$1) {\n function Stack(value) {\n return value === null || value === undefined\n ? emptyStack()\n : isStack(value)\n ? value\n : emptyStack().pushAll(value);\n }\n\n if ( IndexedCollection$$1 ) Stack.__proto__ = IndexedCollection$$1;\n Stack.prototype = Object.create( IndexedCollection$$1 && IndexedCollection$$1.prototype );\n Stack.prototype.constructor = Stack;\n\n Stack.of = function of (/*...values*/) {\n return this(arguments);\n };\n\n Stack.prototype.toString = function toString () {\n return this.__toString('Stack [', ']');\n };\n\n // @pragma Access\n\n Stack.prototype.get = function get (index, notSetValue) {\n var head = this._head;\n index = wrapIndex(this, index);\n while (head && index--) {\n head = head.next;\n }\n return head ? head.value : notSetValue;\n };\n\n Stack.prototype.peek = function peek () {\n return this._head && this._head.value;\n };\n\n // @pragma Modification\n\n Stack.prototype.push = function push (/*...values*/) {\n var arguments$1 = arguments;\n\n if (arguments.length === 0) {\n return this;\n }\n var newSize = this.size + arguments.length;\n var head = this._head;\n for (var ii = arguments.length - 1; ii >= 0; ii--) {\n head = {\n value: arguments$1[ii],\n next: head,\n };\n }\n if (this.__ownerID) {\n this.size = newSize;\n this._head = head;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return makeStack(newSize, head);\n };\n\n Stack.prototype.pushAll = function pushAll (iter) {\n iter = IndexedCollection$$1(iter);\n if (iter.size === 0) {\n return this;\n }\n if (this.size === 0 && isStack(iter)) {\n return iter;\n }\n assertNotInfinite(iter.size);\n var newSize = this.size;\n var head = this._head;\n iter.__iterate(function (value) {\n newSize++;\n head = {\n value: value,\n next: head,\n };\n }, /* reverse */ true);\n if (this.__ownerID) {\n this.size = newSize;\n this._head = head;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return makeStack(newSize, head);\n };\n\n Stack.prototype.pop = function pop () {\n return this.slice(1);\n };\n\n Stack.prototype.clear = function clear () {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = 0;\n this._head = undefined;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return emptyStack();\n };\n\n Stack.prototype.slice = function slice (begin, end) {\n if (wholeSlice(begin, end, this.size)) {\n return this;\n }\n var resolvedBegin = resolveBegin(begin, this.size);\n var resolvedEnd = resolveEnd(end, this.size);\n if (resolvedEnd !== this.size) {\n // super.slice(begin, end);\n return IndexedCollection$$1.prototype.slice.call(this, begin, end);\n }\n var newSize = this.size - resolvedBegin;\n var head = this._head;\n while (resolvedBegin--) {\n head = head.next;\n }\n if (this.__ownerID) {\n this.size = newSize;\n this._head = head;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return makeStack(newSize, head);\n };\n\n // @pragma Mutability\n\n Stack.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n if (!ownerID) {\n if (this.size === 0) {\n return emptyStack();\n }\n this.__ownerID = ownerID;\n this.__altered = false;\n return this;\n }\n return makeStack(this.size, this._head, ownerID, this.__hash);\n };\n\n // @pragma Iteration\n\n Stack.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n if (reverse) {\n return new ArraySeq(this.toArray()).__iterate(\n function (v, k) { return fn(v, k, this$1); },\n reverse\n );\n }\n var iterations = 0;\n var node = this._head;\n while (node) {\n if (fn(node.value, iterations++, this) === false) {\n break;\n }\n node = node.next;\n }\n return iterations;\n };\n\n Stack.prototype.__iterator = function __iterator (type, reverse) {\n if (reverse) {\n return new ArraySeq(this.toArray()).__iterator(type, reverse);\n }\n var iterations = 0;\n var node = this._head;\n return new Iterator(function () {\n if (node) {\n var value = node.value;\n node = node.next;\n return iteratorValue(type, iterations++, value);\n }\n return iteratorDone();\n });\n };\n\n return Stack;\n}(IndexedCollection));\n\nStack.isStack = isStack;\n\nvar StackPrototype = Stack.prototype;\nStackPrototype[IS_STACK_SYMBOL] = true;\nStackPrototype.shift = StackPrototype.pop;\nStackPrototype.unshift = StackPrototype.push;\nStackPrototype.unshiftAll = StackPrototype.pushAll;\nStackPrototype.withMutations = withMutations;\nStackPrototype.wasAltered = wasAltered;\nStackPrototype.asImmutable = asImmutable;\nStackPrototype['@@transducer/init'] = StackPrototype.asMutable = asMutable;\nStackPrototype['@@transducer/step'] = function(result, arr) {\n return result.unshift(arr);\n};\nStackPrototype['@@transducer/result'] = function(obj) {\n return obj.asImmutable();\n};\n\nfunction makeStack(size, head, ownerID, hash) {\n var map = Object.create(StackPrototype);\n map.size = size;\n map._head = head;\n map.__ownerID = ownerID;\n map.__hash = hash;\n map.__altered = false;\n return map;\n}\n\nvar EMPTY_STACK;\nfunction emptyStack() {\n return EMPTY_STACK || (EMPTY_STACK = makeStack(0));\n}\n\nvar IS_SET_SYMBOL = '@@__IMMUTABLE_SET__@@';\n\nfunction isSet(maybeSet) {\n return Boolean(maybeSet && maybeSet[IS_SET_SYMBOL]);\n}\n\nfunction isOrderedSet(maybeOrderedSet) {\n return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet);\n}\n\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (\n !isCollection(b) ||\n (a.size !== undefined && b.size !== undefined && a.size !== b.size) ||\n (a.__hash !== undefined &&\n b.__hash !== undefined &&\n a.__hash !== b.__hash) ||\n isKeyed(a) !== isKeyed(b) ||\n isIndexed(a) !== isIndexed(b) ||\n isOrdered(a) !== isOrdered(b)\n ) {\n return false;\n }\n\n if (a.size === 0 && b.size === 0) {\n return true;\n }\n\n var notAssociative = !isAssociative(a);\n\n if (isOrdered(a)) {\n var entries = a.entries();\n return (\n b.every(function (v, k) {\n var entry = entries.next().value;\n return entry && is(entry[1], v) && (notAssociative || is(entry[0], k));\n }) && entries.next().done\n );\n }\n\n var flipped = false;\n\n if (a.size === undefined) {\n if (b.size === undefined) {\n if (typeof a.cacheResult === 'function') {\n a.cacheResult();\n }\n } else {\n flipped = true;\n var _ = a;\n a = b;\n b = _;\n }\n }\n\n var allEqual = true;\n var bSize = b.__iterate(function (v, k) {\n if (\n notAssociative\n ? !a.has(v)\n : flipped\n ? !is(v, a.get(k, NOT_SET))\n : !is(a.get(k, NOT_SET), v)\n ) {\n allEqual = false;\n return false;\n }\n });\n\n return allEqual && a.size === bSize;\n}\n\n/**\n * Contributes additional methods to a constructor\n */\nfunction mixin(ctor, methods) {\n var keyCopier = function (key) {\n ctor.prototype[key] = methods[key];\n };\n Object.keys(methods).forEach(keyCopier);\n Object.getOwnPropertySymbols &&\n Object.getOwnPropertySymbols(methods).forEach(keyCopier);\n return ctor;\n}\n\nfunction toJS(value) {\n if (!value || typeof value !== 'object') {\n return value;\n }\n if (!isCollection(value)) {\n if (!isDataStructure(value)) {\n return value;\n }\n value = Seq(value);\n }\n if (isKeyed(value)) {\n var result$1 = {};\n value.__iterate(function (v, k) {\n result$1[k] = toJS(v);\n });\n return result$1;\n }\n var result = [];\n value.__iterate(function (v) {\n result.push(toJS(v));\n });\n return result;\n}\n\nvar Set = /*@__PURE__*/(function (SetCollection$$1) {\n function Set(value) {\n return value === null || value === undefined\n ? emptySet()\n : isSet(value) && !isOrdered(value)\n ? value\n : emptySet().withMutations(function (set) {\n var iter = SetCollection$$1(value);\n assertNotInfinite(iter.size);\n iter.forEach(function (v) { return set.add(v); });\n });\n }\n\n if ( SetCollection$$1 ) Set.__proto__ = SetCollection$$1;\n Set.prototype = Object.create( SetCollection$$1 && SetCollection$$1.prototype );\n Set.prototype.constructor = Set;\n\n Set.of = function of (/*...values*/) {\n return this(arguments);\n };\n\n Set.fromKeys = function fromKeys (value) {\n return this(KeyedCollection(value).keySeq());\n };\n\n Set.intersect = function intersect (sets) {\n sets = Collection(sets).toArray();\n return sets.length\n ? SetPrototype.intersect.apply(Set(sets.pop()), sets)\n : emptySet();\n };\n\n Set.union = function union (sets) {\n sets = Collection(sets).toArray();\n return sets.length\n ? SetPrototype.union.apply(Set(sets.pop()), sets)\n : emptySet();\n };\n\n Set.prototype.toString = function toString () {\n return this.__toString('Set {', '}');\n };\n\n // @pragma Access\n\n Set.prototype.has = function has (value) {\n return this._map.has(value);\n };\n\n // @pragma Modification\n\n Set.prototype.add = function add (value) {\n return updateSet(this, this._map.set(value, value));\n };\n\n Set.prototype.remove = function remove (value) {\n return updateSet(this, this._map.remove(value));\n };\n\n Set.prototype.clear = function clear () {\n return updateSet(this, this._map.clear());\n };\n\n // @pragma Composition\n\n Set.prototype.map = function map (mapper, context) {\n var this$1 = this;\n\n var removes = [];\n var adds = [];\n this.forEach(function (value) {\n var mapped = mapper.call(context, value, value, this$1);\n if (mapped !== value) {\n removes.push(value);\n adds.push(mapped);\n }\n });\n return this.withMutations(function (set) {\n removes.forEach(function (value) { return set.remove(value); });\n adds.forEach(function (value) { return set.add(value); });\n });\n };\n\n Set.prototype.union = function union () {\n var iters = [], len = arguments.length;\n while ( len-- ) iters[ len ] = arguments[ len ];\n\n iters = iters.filter(function (x) { return x.size !== 0; });\n if (iters.length === 0) {\n return this;\n }\n if (this.size === 0 && !this.__ownerID && iters.length === 1) {\n return this.constructor(iters[0]);\n }\n return this.withMutations(function (set) {\n for (var ii = 0; ii < iters.length; ii++) {\n SetCollection$$1(iters[ii]).forEach(function (value) { return set.add(value); });\n }\n });\n };\n\n Set.prototype.intersect = function intersect () {\n var iters = [], len = arguments.length;\n while ( len-- ) iters[ len ] = arguments[ len ];\n\n if (iters.length === 0) {\n return this;\n }\n iters = iters.map(function (iter) { return SetCollection$$1(iter); });\n var toRemove = [];\n this.forEach(function (value) {\n if (!iters.every(function (iter) { return iter.includes(value); })) {\n toRemove.push(value);\n }\n });\n return this.withMutations(function (set) {\n toRemove.forEach(function (value) {\n set.remove(value);\n });\n });\n };\n\n Set.prototype.subtract = function subtract () {\n var iters = [], len = arguments.length;\n while ( len-- ) iters[ len ] = arguments[ len ];\n\n if (iters.length === 0) {\n return this;\n }\n iters = iters.map(function (iter) { return SetCollection$$1(iter); });\n var toRemove = [];\n this.forEach(function (value) {\n if (iters.some(function (iter) { return iter.includes(value); })) {\n toRemove.push(value);\n }\n });\n return this.withMutations(function (set) {\n toRemove.forEach(function (value) {\n set.remove(value);\n });\n });\n };\n\n Set.prototype.sort = function sort (comparator) {\n // Late binding\n return OrderedSet(sortFactory(this, comparator));\n };\n\n Set.prototype.sortBy = function sortBy (mapper, comparator) {\n // Late binding\n return OrderedSet(sortFactory(this, comparator, mapper));\n };\n\n Set.prototype.wasAltered = function wasAltered () {\n return this._map.wasAltered();\n };\n\n Set.prototype.__iterate = function __iterate (fn, reverse) {\n var this$1 = this;\n\n return this._map.__iterate(function (k) { return fn(k, k, this$1); }, reverse);\n };\n\n Set.prototype.__iterator = function __iterator (type, reverse) {\n return this._map.__iterator(type, reverse);\n };\n\n Set.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n var newMap = this._map.__ensureOwner(ownerID);\n if (!ownerID) {\n if (this.size === 0) {\n return this.__empty();\n }\n this.__ownerID = ownerID;\n this._map = newMap;\n return this;\n }\n return this.__make(newMap, ownerID);\n };\n\n return Set;\n}(SetCollection));\n\nSet.isSet = isSet;\n\nvar SetPrototype = Set.prototype;\nSetPrototype[IS_SET_SYMBOL] = true;\nSetPrototype[DELETE] = SetPrototype.remove;\nSetPrototype.merge = SetPrototype.concat = SetPrototype.union;\nSetPrototype.withMutations = withMutations;\nSetPrototype.asImmutable = asImmutable;\nSetPrototype['@@transducer/init'] = SetPrototype.asMutable = asMutable;\nSetPrototype['@@transducer/step'] = function(result, arr) {\n return result.add(arr);\n};\nSetPrototype['@@transducer/result'] = function(obj) {\n return obj.asImmutable();\n};\n\nSetPrototype.__empty = emptySet;\nSetPrototype.__make = makeSet;\n\nfunction updateSet(set, newMap) {\n if (set.__ownerID) {\n set.size = newMap.size;\n set._map = newMap;\n return set;\n }\n return newMap === set._map\n ? set\n : newMap.size === 0\n ? set.__empty()\n : set.__make(newMap);\n}\n\nfunction makeSet(map, ownerID) {\n var set = Object.create(SetPrototype);\n set.size = map ? map.size : 0;\n set._map = map;\n set.__ownerID = ownerID;\n return set;\n}\n\nvar EMPTY_SET;\nfunction emptySet() {\n return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap()));\n}\n\n/**\n * Returns a lazy seq of nums from start (inclusive) to end\n * (exclusive), by step, where start defaults to 0, step to 1, and end to\n * infinity. When start is equal to end, returns empty list.\n */\nvar Range = /*@__PURE__*/(function (IndexedSeq$$1) {\n function Range(start, end, step) {\n if (!(this instanceof Range)) {\n return new Range(start, end, step);\n }\n invariant(step !== 0, 'Cannot step a Range by 0');\n start = start || 0;\n if (end === undefined) {\n end = Infinity;\n }\n step = step === undefined ? 1 : Math.abs(step);\n if (end < start) {\n step = -step;\n }\n this._start = start;\n this._end = end;\n this._step = step;\n this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1);\n if (this.size === 0) {\n if (EMPTY_RANGE) {\n return EMPTY_RANGE;\n }\n EMPTY_RANGE = this;\n }\n }\n\n if ( IndexedSeq$$1 ) Range.__proto__ = IndexedSeq$$1;\n Range.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n Range.prototype.constructor = Range;\n\n Range.prototype.toString = function toString () {\n if (this.size === 0) {\n return 'Range []';\n }\n return (\n 'Range [ ' +\n this._start +\n '...' +\n this._end +\n (this._step !== 1 ? ' by ' + this._step : '') +\n ' ]'\n );\n };\n\n Range.prototype.get = function get (index, notSetValue) {\n return this.has(index)\n ? this._start + wrapIndex(this, index) * this._step\n : notSetValue;\n };\n\n Range.prototype.includes = function includes (searchValue) {\n var possibleIndex = (searchValue - this._start) / this._step;\n return (\n possibleIndex >= 0 &&\n possibleIndex < this.size &&\n possibleIndex === Math.floor(possibleIndex)\n );\n };\n\n Range.prototype.slice = function slice (begin, end) {\n if (wholeSlice(begin, end, this.size)) {\n return this;\n }\n begin = resolveBegin(begin, this.size);\n end = resolveEnd(end, this.size);\n if (end <= begin) {\n return new Range(0, 0);\n }\n return new Range(\n this.get(begin, this._end),\n this.get(end, this._end),\n this._step\n );\n };\n\n Range.prototype.indexOf = function indexOf (searchValue) {\n var offsetValue = searchValue - this._start;\n if (offsetValue % this._step === 0) {\n var index = offsetValue / this._step;\n if (index >= 0 && index < this.size) {\n return index;\n }\n }\n return -1;\n };\n\n Range.prototype.lastIndexOf = function lastIndexOf (searchValue) {\n return this.indexOf(searchValue);\n };\n\n Range.prototype.__iterate = function __iterate (fn, reverse) {\n var size = this.size;\n var step = this._step;\n var value = reverse ? this._start + (size - 1) * step : this._start;\n var i = 0;\n while (i !== size) {\n if (fn(value, reverse ? size - ++i : i++, this) === false) {\n break;\n }\n value += reverse ? -step : step;\n }\n return i;\n };\n\n Range.prototype.__iterator = function __iterator (type, reverse) {\n var size = this.size;\n var step = this._step;\n var value = reverse ? this._start + (size - 1) * step : this._start;\n var i = 0;\n return new Iterator(function () {\n if (i === size) {\n return iteratorDone();\n }\n var v = value;\n value += reverse ? -step : step;\n return iteratorValue(type, reverse ? size - ++i : i++, v);\n });\n };\n\n Range.prototype.equals = function equals (other) {\n return other instanceof Range\n ? this._start === other._start &&\n this._end === other._end &&\n this._step === other._step\n : deepEqual(this, other);\n };\n\n return Range;\n}(IndexedSeq));\n\nvar EMPTY_RANGE;\n\nfunction getIn(collection, searchKeyPath, notSetValue) {\n var keyPath = coerceKeyPath(searchKeyPath);\n var i = 0;\n while (i !== keyPath.length) {\n collection = get(collection, keyPath[i++], NOT_SET);\n if (collection === NOT_SET) {\n return notSetValue;\n }\n }\n return collection;\n}\n\nfunction getIn$1(searchKeyPath, notSetValue) {\n return getIn(this, searchKeyPath, notSetValue);\n}\n\nfunction hasIn(collection, keyPath) {\n return getIn(collection, keyPath, NOT_SET) !== NOT_SET;\n}\n\nfunction hasIn$1(searchKeyPath) {\n return hasIn(this, searchKeyPath);\n}\n\nfunction toObject() {\n assertNotInfinite(this.size);\n var object = {};\n this.__iterate(function (v, k) {\n object[k] = v;\n });\n return object;\n}\n\n// Note: all of these methods are deprecated.\nCollection.isIterable = isCollection;\nCollection.isKeyed = isKeyed;\nCollection.isIndexed = isIndexed;\nCollection.isAssociative = isAssociative;\nCollection.isOrdered = isOrdered;\n\nCollection.Iterator = Iterator;\n\nmixin(Collection, {\n // ### Conversion to other types\n\n toArray: function toArray() {\n assertNotInfinite(this.size);\n var array = new Array(this.size || 0);\n var useTuples = isKeyed(this);\n var i = 0;\n this.__iterate(function (v, k) {\n // Keyed collections produce an array of tuples.\n array[i++] = useTuples ? [k, v] : v;\n });\n return array;\n },\n\n toIndexedSeq: function toIndexedSeq() {\n return new ToIndexedSequence(this);\n },\n\n toJS: function toJS$1() {\n return toJS(this);\n },\n\n toKeyedSeq: function toKeyedSeq() {\n return new ToKeyedSequence(this, true);\n },\n\n toMap: function toMap() {\n // Use Late Binding here to solve the circular dependency.\n return Map(this.toKeyedSeq());\n },\n\n toObject: toObject,\n\n toOrderedMap: function toOrderedMap() {\n // Use Late Binding here to solve the circular dependency.\n return OrderedMap(this.toKeyedSeq());\n },\n\n toOrderedSet: function toOrderedSet() {\n // Use Late Binding here to solve the circular dependency.\n return OrderedSet(isKeyed(this) ? this.valueSeq() : this);\n },\n\n toSet: function toSet() {\n // Use Late Binding here to solve the circular dependency.\n return Set(isKeyed(this) ? this.valueSeq() : this);\n },\n\n toSetSeq: function toSetSeq() {\n return new ToSetSequence(this);\n },\n\n toSeq: function toSeq() {\n return isIndexed(this)\n ? this.toIndexedSeq()\n : isKeyed(this)\n ? this.toKeyedSeq()\n : this.toSetSeq();\n },\n\n toStack: function toStack() {\n // Use Late Binding here to solve the circular dependency.\n return Stack(isKeyed(this) ? this.valueSeq() : this);\n },\n\n toList: function toList() {\n // Use Late Binding here to solve the circular dependency.\n return List(isKeyed(this) ? this.valueSeq() : this);\n },\n\n // ### Common JavaScript methods and properties\n\n toString: function toString() {\n return '[Collection]';\n },\n\n __toString: function __toString(head, tail) {\n if (this.size === 0) {\n return head + tail;\n }\n return (\n head +\n ' ' +\n this.toSeq()\n .map(this.__toStringMapper)\n .join(', ') +\n ' ' +\n tail\n );\n },\n\n // ### ES6 Collection methods (ES6 Array and Map)\n\n concat: function concat() {\n var values = [], len = arguments.length;\n while ( len-- ) values[ len ] = arguments[ len ];\n\n return reify(this, concatFactory(this, values));\n },\n\n includes: function includes(searchValue) {\n return this.some(function (value) { return is(value, searchValue); });\n },\n\n entries: function entries() {\n return this.__iterator(ITERATE_ENTRIES);\n },\n\n every: function every(predicate, context) {\n assertNotInfinite(this.size);\n var returnValue = true;\n this.__iterate(function (v, k, c) {\n if (!predicate.call(context, v, k, c)) {\n returnValue = false;\n return false;\n }\n });\n return returnValue;\n },\n\n filter: function filter(predicate, context) {\n return reify(this, filterFactory(this, predicate, context, true));\n },\n\n find: function find(predicate, context, notSetValue) {\n var entry = this.findEntry(predicate, context);\n return entry ? entry[1] : notSetValue;\n },\n\n forEach: function forEach(sideEffect, context) {\n assertNotInfinite(this.size);\n return this.__iterate(context ? sideEffect.bind(context) : sideEffect);\n },\n\n join: function join(separator) {\n assertNotInfinite(this.size);\n separator = separator !== undefined ? '' + separator : ',';\n var joined = '';\n var isFirst = true;\n this.__iterate(function (v) {\n isFirst ? (isFirst = false) : (joined += separator);\n joined += v !== null && v !== undefined ? v.toString() : '';\n });\n return joined;\n },\n\n keys: function keys() {\n return this.__iterator(ITERATE_KEYS);\n },\n\n map: function map(mapper, context) {\n return reify(this, mapFactory(this, mapper, context));\n },\n\n reduce: function reduce$1(reducer, initialReduction, context) {\n return reduce(\n this,\n reducer,\n initialReduction,\n context,\n arguments.length < 2,\n false\n );\n },\n\n reduceRight: function reduceRight(reducer, initialReduction, context) {\n return reduce(\n this,\n reducer,\n initialReduction,\n context,\n arguments.length < 2,\n true\n );\n },\n\n reverse: function reverse() {\n return reify(this, reverseFactory(this, true));\n },\n\n slice: function slice(begin, end) {\n return reify(this, sliceFactory(this, begin, end, true));\n },\n\n some: function some(predicate, context) {\n return !this.every(not(predicate), context);\n },\n\n sort: function sort(comparator) {\n return reify(this, sortFactory(this, comparator));\n },\n\n values: function values() {\n return this.__iterator(ITERATE_VALUES);\n },\n\n // ### More sequential methods\n\n butLast: function butLast() {\n return this.slice(0, -1);\n },\n\n isEmpty: function isEmpty() {\n return this.size !== undefined ? this.size === 0 : !this.some(function () { return true; });\n },\n\n count: function count(predicate, context) {\n return ensureSize(\n predicate ? this.toSeq().filter(predicate, context) : this\n );\n },\n\n countBy: function countBy(grouper, context) {\n return countByFactory(this, grouper, context);\n },\n\n equals: function equals(other) {\n return deepEqual(this, other);\n },\n\n entrySeq: function entrySeq() {\n var collection = this;\n if (collection._cache) {\n // We cache as an entries array, so we can just return the cache!\n return new ArraySeq(collection._cache);\n }\n var entriesSequence = collection\n .toSeq()\n .map(entryMapper)\n .toIndexedSeq();\n entriesSequence.fromEntrySeq = function () { return collection.toSeq(); };\n return entriesSequence;\n },\n\n filterNot: function filterNot(predicate, context) {\n return this.filter(not(predicate), context);\n },\n\n findEntry: function findEntry(predicate, context, notSetValue) {\n var found = notSetValue;\n this.__iterate(function (v, k, c) {\n if (predicate.call(context, v, k, c)) {\n found = [k, v];\n return false;\n }\n });\n return found;\n },\n\n findKey: function findKey(predicate, context) {\n var entry = this.findEntry(predicate, context);\n return entry && entry[0];\n },\n\n findLast: function findLast(predicate, context, notSetValue) {\n return this.toKeyedSeq()\n .reverse()\n .find(predicate, context, notSetValue);\n },\n\n findLastEntry: function findLastEntry(predicate, context, notSetValue) {\n return this.toKeyedSeq()\n .reverse()\n .findEntry(predicate, context, notSetValue);\n },\n\n findLastKey: function findLastKey(predicate, context) {\n return this.toKeyedSeq()\n .reverse()\n .findKey(predicate, context);\n },\n\n first: function first(notSetValue) {\n return this.find(returnTrue, null, notSetValue);\n },\n\n flatMap: function flatMap(mapper, context) {\n return reify(this, flatMapFactory(this, mapper, context));\n },\n\n flatten: function flatten(depth) {\n return reify(this, flattenFactory(this, depth, true));\n },\n\n fromEntrySeq: function fromEntrySeq() {\n return new FromEntriesSequence(this);\n },\n\n get: function get(searchKey, notSetValue) {\n return this.find(function (_, key) { return is(key, searchKey); }, undefined, notSetValue);\n },\n\n getIn: getIn$1,\n\n groupBy: function groupBy(grouper, context) {\n return groupByFactory(this, grouper, context);\n },\n\n has: function has(searchKey) {\n return this.get(searchKey, NOT_SET) !== NOT_SET;\n },\n\n hasIn: hasIn$1,\n\n isSubset: function isSubset(iter) {\n iter = typeof iter.includes === 'function' ? iter : Collection(iter);\n return this.every(function (value) { return iter.includes(value); });\n },\n\n isSuperset: function isSuperset(iter) {\n iter = typeof iter.isSubset === 'function' ? iter : Collection(iter);\n return iter.isSubset(this);\n },\n\n keyOf: function keyOf(searchValue) {\n return this.findKey(function (value) { return is(value, searchValue); });\n },\n\n keySeq: function keySeq() {\n return this.toSeq()\n .map(keyMapper)\n .toIndexedSeq();\n },\n\n last: function last(notSetValue) {\n return this.toSeq()\n .reverse()\n .first(notSetValue);\n },\n\n lastKeyOf: function lastKeyOf(searchValue) {\n return this.toKeyedSeq()\n .reverse()\n .keyOf(searchValue);\n },\n\n max: function max(comparator) {\n return maxFactory(this, comparator);\n },\n\n maxBy: function maxBy(mapper, comparator) {\n return maxFactory(this, comparator, mapper);\n },\n\n min: function min(comparator) {\n return maxFactory(\n this,\n comparator ? neg(comparator) : defaultNegComparator\n );\n },\n\n minBy: function minBy(mapper, comparator) {\n return maxFactory(\n this,\n comparator ? neg(comparator) : defaultNegComparator,\n mapper\n );\n },\n\n rest: function rest() {\n return this.slice(1);\n },\n\n skip: function skip(amount) {\n return amount === 0 ? this : this.slice(Math.max(0, amount));\n },\n\n skipLast: function skipLast(amount) {\n return amount === 0 ? this : this.slice(0, -Math.max(0, amount));\n },\n\n skipWhile: function skipWhile(predicate, context) {\n return reify(this, skipWhileFactory(this, predicate, context, true));\n },\n\n skipUntil: function skipUntil(predicate, context) {\n return this.skipWhile(not(predicate), context);\n },\n\n sortBy: function sortBy(mapper, comparator) {\n return reify(this, sortFactory(this, comparator, mapper));\n },\n\n take: function take(amount) {\n return this.slice(0, Math.max(0, amount));\n },\n\n takeLast: function takeLast(amount) {\n return this.slice(-Math.max(0, amount));\n },\n\n takeWhile: function takeWhile(predicate, context) {\n return reify(this, takeWhileFactory(this, predicate, context));\n },\n\n takeUntil: function takeUntil(predicate, context) {\n return this.takeWhile(not(predicate), context);\n },\n\n update: function update(fn) {\n return fn(this);\n },\n\n valueSeq: function valueSeq() {\n return this.toIndexedSeq();\n },\n\n // ### Hashable Object\n\n hashCode: function hashCode() {\n return this.__hash || (this.__hash = hashCollection(this));\n },\n\n // ### Internal\n\n // abstract __iterate(fn, reverse)\n\n // abstract __iterator(type, reverse)\n});\n\nvar CollectionPrototype = Collection.prototype;\nCollectionPrototype[IS_COLLECTION_SYMBOL] = true;\nCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.values;\nCollectionPrototype.toJSON = CollectionPrototype.toArray;\nCollectionPrototype.__toStringMapper = quoteString;\nCollectionPrototype.inspect = CollectionPrototype.toSource = function() {\n return this.toString();\n};\nCollectionPrototype.chain = CollectionPrototype.flatMap;\nCollectionPrototype.contains = CollectionPrototype.includes;\n\nmixin(KeyedCollection, {\n // ### More sequential methods\n\n flip: function flip() {\n return reify(this, flipFactory(this));\n },\n\n mapEntries: function mapEntries(mapper, context) {\n var this$1 = this;\n\n var iterations = 0;\n return reify(\n this,\n this.toSeq()\n .map(function (v, k) { return mapper.call(context, [k, v], iterations++, this$1); })\n .fromEntrySeq()\n );\n },\n\n mapKeys: function mapKeys(mapper, context) {\n var this$1 = this;\n\n return reify(\n this,\n this.toSeq()\n .flip()\n .map(function (k, v) { return mapper.call(context, k, v, this$1); })\n .flip()\n );\n },\n});\n\nvar KeyedCollectionPrototype = KeyedCollection.prototype;\nKeyedCollectionPrototype[IS_KEYED_SYMBOL] = true;\nKeyedCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.entries;\nKeyedCollectionPrototype.toJSON = toObject;\nKeyedCollectionPrototype.__toStringMapper = function (v, k) { return quoteString(k) + ': ' + quoteString(v); };\n\nmixin(IndexedCollection, {\n // ### Conversion to other types\n\n toKeyedSeq: function toKeyedSeq() {\n return new ToKeyedSequence(this, false);\n },\n\n // ### ES6 Collection methods (ES6 Array and Map)\n\n filter: function filter(predicate, context) {\n return reify(this, filterFactory(this, predicate, context, false));\n },\n\n findIndex: function findIndex(predicate, context) {\n var entry = this.findEntry(predicate, context);\n return entry ? entry[0] : -1;\n },\n\n indexOf: function indexOf(searchValue) {\n var key = this.keyOf(searchValue);\n return key === undefined ? -1 : key;\n },\n\n lastIndexOf: function lastIndexOf(searchValue) {\n var key = this.lastKeyOf(searchValue);\n return key === undefined ? -1 : key;\n },\n\n reverse: function reverse() {\n return reify(this, reverseFactory(this, false));\n },\n\n slice: function slice(begin, end) {\n return reify(this, sliceFactory(this, begin, end, false));\n },\n\n splice: function splice(index, removeNum /*, ...values*/) {\n var numArgs = arguments.length;\n removeNum = Math.max(removeNum || 0, 0);\n if (numArgs === 0 || (numArgs === 2 && !removeNum)) {\n return this;\n }\n // If index is negative, it should resolve relative to the size of the\n // collection. However size may be expensive to compute if not cached, so\n // only call count() if the number is in fact negative.\n index = resolveBegin(index, index < 0 ? this.count() : this.size);\n var spliced = this.slice(0, index);\n return reify(\n this,\n numArgs === 1\n ? spliced\n : spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum))\n );\n },\n\n // ### More collection methods\n\n findLastIndex: function findLastIndex(predicate, context) {\n var entry = this.findLastEntry(predicate, context);\n return entry ? entry[0] : -1;\n },\n\n first: function first(notSetValue) {\n return this.get(0, notSetValue);\n },\n\n flatten: function flatten(depth) {\n return reify(this, flattenFactory(this, depth, false));\n },\n\n get: function get(index, notSetValue) {\n index = wrapIndex(this, index);\n return index < 0 ||\n (this.size === Infinity || (this.size !== undefined && index > this.size))\n ? notSetValue\n : this.find(function (_, key) { return key === index; }, undefined, notSetValue);\n },\n\n has: function has(index) {\n index = wrapIndex(this, index);\n return (\n index >= 0 &&\n (this.size !== undefined\n ? this.size === Infinity || index < this.size\n : this.indexOf(index) !== -1)\n );\n },\n\n interpose: function interpose(separator) {\n return reify(this, interposeFactory(this, separator));\n },\n\n interleave: function interleave(/*...collections*/) {\n var collections = [this].concat(arrCopy(arguments));\n var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, collections);\n var interleaved = zipped.flatten(true);\n if (zipped.size) {\n interleaved.size = zipped.size * collections.length;\n }\n return reify(this, interleaved);\n },\n\n keySeq: function keySeq() {\n return Range(0, this.size);\n },\n\n last: function last(notSetValue) {\n return this.get(-1, notSetValue);\n },\n\n skipWhile: function skipWhile(predicate, context) {\n return reify(this, skipWhileFactory(this, predicate, context, false));\n },\n\n zip: function zip(/*, ...collections */) {\n var collections = [this].concat(arrCopy(arguments));\n return reify(this, zipWithFactory(this, defaultZipper, collections));\n },\n\n zipAll: function zipAll(/*, ...collections */) {\n var collections = [this].concat(arrCopy(arguments));\n return reify(this, zipWithFactory(this, defaultZipper, collections, true));\n },\n\n zipWith: function zipWith(zipper /*, ...collections */) {\n var collections = arrCopy(arguments);\n collections[0] = this;\n return reify(this, zipWithFactory(this, zipper, collections));\n },\n});\n\nvar IndexedCollectionPrototype = IndexedCollection.prototype;\nIndexedCollectionPrototype[IS_INDEXED_SYMBOL] = true;\nIndexedCollectionPrototype[IS_ORDERED_SYMBOL] = true;\n\nmixin(SetCollection, {\n // ### ES6 Collection methods (ES6 Array and Map)\n\n get: function get(value, notSetValue) {\n return this.has(value) ? value : notSetValue;\n },\n\n includes: function includes(value) {\n return this.has(value);\n },\n\n // ### More sequential methods\n\n keySeq: function keySeq() {\n return this.valueSeq();\n },\n});\n\nSetCollection.prototype.has = CollectionPrototype.includes;\nSetCollection.prototype.contains = SetCollection.prototype.includes;\n\n// Mixin subclasses\n\nmixin(KeyedSeq, KeyedCollection.prototype);\nmixin(IndexedSeq, IndexedCollection.prototype);\nmixin(SetSeq, SetCollection.prototype);\n\n// #pragma Helper functions\n\nfunction reduce(collection, reducer, reduction, context, useFirst, reverse) {\n assertNotInfinite(collection.size);\n collection.__iterate(function (v, k, c) {\n if (useFirst) {\n useFirst = false;\n reduction = v;\n } else {\n reduction = reducer.call(context, reduction, v, k, c);\n }\n }, reverse);\n return reduction;\n}\n\nfunction keyMapper(v, k) {\n return k;\n}\n\nfunction entryMapper(v, k) {\n return [k, v];\n}\n\nfunction not(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n}\n\nfunction neg(predicate) {\n return function() {\n return -predicate.apply(this, arguments);\n };\n}\n\nfunction defaultZipper() {\n return arrCopy(arguments);\n}\n\nfunction defaultNegComparator(a, b) {\n return a < b ? 1 : a > b ? -1 : 0;\n}\n\nfunction hashCollection(collection) {\n if (collection.size === Infinity) {\n return 0;\n }\n var ordered = isOrdered(collection);\n var keyed = isKeyed(collection);\n var h = ordered ? 1 : 0;\n var size = collection.__iterate(\n keyed\n ? ordered\n ? function (v, k) {\n h = (31 * h + hashMerge(hash(v), hash(k))) | 0;\n }\n : function (v, k) {\n h = (h + hashMerge(hash(v), hash(k))) | 0;\n }\n : ordered\n ? function (v) {\n h = (31 * h + hash(v)) | 0;\n }\n : function (v) {\n h = (h + hash(v)) | 0;\n }\n );\n return murmurHashOfSize(size, h);\n}\n\nfunction murmurHashOfSize(size, h) {\n h = imul(h, 0xcc9e2d51);\n h = imul((h << 15) | (h >>> -15), 0x1b873593);\n h = imul((h << 13) | (h >>> -13), 5);\n h = ((h + 0xe6546b64) | 0) ^ size;\n h = imul(h ^ (h >>> 16), 0x85ebca6b);\n h = imul(h ^ (h >>> 13), 0xc2b2ae35);\n h = smi(h ^ (h >>> 16));\n return h;\n}\n\nfunction hashMerge(a, b) {\n return (a ^ (b + 0x9e3779b9 + (a << 6) + (a >> 2))) | 0; // int\n}\n\nvar OrderedSet = /*@__PURE__*/(function (Set$$1) {\n function OrderedSet(value) {\n return value === null || value === undefined\n ? emptyOrderedSet()\n : isOrderedSet(value)\n ? value\n : emptyOrderedSet().withMutations(function (set) {\n var iter = SetCollection(value);\n assertNotInfinite(iter.size);\n iter.forEach(function (v) { return set.add(v); });\n });\n }\n\n if ( Set$$1 ) OrderedSet.__proto__ = Set$$1;\n OrderedSet.prototype = Object.create( Set$$1 && Set$$1.prototype );\n OrderedSet.prototype.constructor = OrderedSet;\n\n OrderedSet.of = function of (/*...values*/) {\n return this(arguments);\n };\n\n OrderedSet.fromKeys = function fromKeys (value) {\n return this(KeyedCollection(value).keySeq());\n };\n\n OrderedSet.prototype.toString = function toString () {\n return this.__toString('OrderedSet {', '}');\n };\n\n return OrderedSet;\n}(Set));\n\nOrderedSet.isOrderedSet = isOrderedSet;\n\nvar OrderedSetPrototype = OrderedSet.prototype;\nOrderedSetPrototype[IS_ORDERED_SYMBOL] = true;\nOrderedSetPrototype.zip = IndexedCollectionPrototype.zip;\nOrderedSetPrototype.zipWith = IndexedCollectionPrototype.zipWith;\n\nOrderedSetPrototype.__empty = emptyOrderedSet;\nOrderedSetPrototype.__make = makeOrderedSet;\n\nfunction makeOrderedSet(map, ownerID) {\n var set = Object.create(OrderedSetPrototype);\n set.size = map ? map.size : 0;\n set._map = map;\n set.__ownerID = ownerID;\n return set;\n}\n\nvar EMPTY_ORDERED_SET;\nfunction emptyOrderedSet() {\n return (\n EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap()))\n );\n}\n\nvar Record = function Record(defaultValues, name) {\n var hasInitialized;\n\n var RecordType = function Record(values) {\n var this$1 = this;\n\n if (values instanceof RecordType) {\n return values;\n }\n if (!(this instanceof RecordType)) {\n return new RecordType(values);\n }\n if (!hasInitialized) {\n hasInitialized = true;\n var keys = Object.keys(defaultValues);\n var indices = (RecordTypePrototype._indices = {});\n // Deprecated: left to attempt not to break any external code which\n // relies on a ._name property existing on record instances.\n // Use Record.getDescriptiveName() instead\n RecordTypePrototype._name = name;\n RecordTypePrototype._keys = keys;\n RecordTypePrototype._defaultValues = defaultValues;\n for (var i = 0; i < keys.length; i++) {\n var propName = keys[i];\n indices[propName] = i;\n if (RecordTypePrototype[propName]) {\n /* eslint-disable no-console */\n typeof console === 'object' &&\n console.warn &&\n console.warn(\n 'Cannot define ' +\n recordName(this) +\n ' with property \"' +\n propName +\n '\" since that property name is part of the Record API.'\n );\n /* eslint-enable no-console */\n } else {\n setProp(RecordTypePrototype, propName);\n }\n }\n }\n this.__ownerID = undefined;\n this._values = List().withMutations(function (l) {\n l.setSize(this$1._keys.length);\n KeyedCollection(values).forEach(function (v, k) {\n l.set(this$1._indices[k], v === this$1._defaultValues[k] ? undefined : v);\n });\n });\n };\n\n var RecordTypePrototype = (RecordType.prototype = Object.create(\n RecordPrototype\n ));\n RecordTypePrototype.constructor = RecordType;\n\n if (name) {\n RecordType.displayName = name;\n }\n\n return RecordType;\n};\n\nRecord.prototype.toString = function toString () {\n var str = recordName(this) + ' { ';\n var keys = this._keys;\n var k;\n for (var i = 0, l = keys.length; i !== l; i++) {\n k = keys[i];\n str += (i ? ', ' : '') + k + ': ' + quoteString(this.get(k));\n }\n return str + ' }';\n};\n\nRecord.prototype.equals = function equals (other) {\n return (\n this === other ||\n (other &&\n this._keys === other._keys &&\n recordSeq(this).equals(recordSeq(other)))\n );\n};\n\nRecord.prototype.hashCode = function hashCode () {\n return recordSeq(this).hashCode();\n};\n\n// @pragma Access\n\nRecord.prototype.has = function has (k) {\n return this._indices.hasOwnProperty(k);\n};\n\nRecord.prototype.get = function get (k, notSetValue) {\n if (!this.has(k)) {\n return notSetValue;\n }\n var index = this._indices[k];\n var value = this._values.get(index);\n return value === undefined ? this._defaultValues[k] : value;\n};\n\n// @pragma Modification\n\nRecord.prototype.set = function set (k, v) {\n if (this.has(k)) {\n var newValues = this._values.set(\n this._indices[k],\n v === this._defaultValues[k] ? undefined : v\n );\n if (newValues !== this._values && !this.__ownerID) {\n return makeRecord(this, newValues);\n }\n }\n return this;\n};\n\nRecord.prototype.remove = function remove (k) {\n return this.set(k);\n};\n\nRecord.prototype.clear = function clear () {\n var newValues = this._values.clear().setSize(this._keys.length);\n return this.__ownerID ? this : makeRecord(this, newValues);\n};\n\nRecord.prototype.wasAltered = function wasAltered () {\n return this._values.wasAltered();\n};\n\nRecord.prototype.toSeq = function toSeq () {\n return recordSeq(this);\n};\n\nRecord.prototype.toJS = function toJS$1 () {\n return toJS(this);\n};\n\nRecord.prototype.entries = function entries () {\n return this.__iterator(ITERATE_ENTRIES);\n};\n\nRecord.prototype.__iterator = function __iterator (type, reverse) {\n return recordSeq(this).__iterator(type, reverse);\n};\n\nRecord.prototype.__iterate = function __iterate (fn, reverse) {\n return recordSeq(this).__iterate(fn, reverse);\n};\n\nRecord.prototype.__ensureOwner = function __ensureOwner (ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n var newValues = this._values.__ensureOwner(ownerID);\n if (!ownerID) {\n this.__ownerID = ownerID;\n this._values = newValues;\n return this;\n }\n return makeRecord(this, newValues, ownerID);\n};\n\nRecord.isRecord = isRecord;\nRecord.getDescriptiveName = recordName;\nvar RecordPrototype = Record.prototype;\nRecordPrototype[IS_RECORD_SYMBOL] = true;\nRecordPrototype[DELETE] = RecordPrototype.remove;\nRecordPrototype.deleteIn = RecordPrototype.removeIn = deleteIn;\nRecordPrototype.getIn = getIn$1;\nRecordPrototype.hasIn = CollectionPrototype.hasIn;\nRecordPrototype.merge = merge;\nRecordPrototype.mergeWith = mergeWith;\nRecordPrototype.mergeIn = mergeIn;\nRecordPrototype.mergeDeep = mergeDeep$1;\nRecordPrototype.mergeDeepWith = mergeDeepWith$1;\nRecordPrototype.mergeDeepIn = mergeDeepIn;\nRecordPrototype.setIn = setIn$1;\nRecordPrototype.update = update$1;\nRecordPrototype.updateIn = updateIn$1;\nRecordPrototype.withMutations = withMutations;\nRecordPrototype.asMutable = asMutable;\nRecordPrototype.asImmutable = asImmutable;\nRecordPrototype[ITERATOR_SYMBOL] = RecordPrototype.entries;\nRecordPrototype.toJSON = RecordPrototype.toObject =\n CollectionPrototype.toObject;\nRecordPrototype.inspect = RecordPrototype.toSource = function() {\n return this.toString();\n};\n\nfunction makeRecord(likeRecord, values, ownerID) {\n var record = Object.create(Object.getPrototypeOf(likeRecord));\n record._values = values;\n record.__ownerID = ownerID;\n return record;\n}\n\nfunction recordName(record) {\n return record.constructor.displayName || record.constructor.name || 'Record';\n}\n\nfunction recordSeq(record) {\n return keyedSeqFromValue(record._keys.map(function (k) { return [k, record.get(k)]; }));\n}\n\nfunction setProp(prototype, name) {\n try {\n Object.defineProperty(prototype, name, {\n get: function() {\n return this.get(name);\n },\n set: function(value) {\n invariant(this.__ownerID, 'Cannot set on an immutable record.');\n this.set(name, value);\n },\n });\n } catch (error) {\n // Object.defineProperty failed. Probably IE8.\n }\n}\n\n/**\n * Returns a lazy Seq of `value` repeated `times` times. When `times` is\n * undefined, returns an infinite sequence of `value`.\n */\nvar Repeat = /*@__PURE__*/(function (IndexedSeq$$1) {\n function Repeat(value, times) {\n if (!(this instanceof Repeat)) {\n return new Repeat(value, times);\n }\n this._value = value;\n this.size = times === undefined ? Infinity : Math.max(0, times);\n if (this.size === 0) {\n if (EMPTY_REPEAT) {\n return EMPTY_REPEAT;\n }\n EMPTY_REPEAT = this;\n }\n }\n\n if ( IndexedSeq$$1 ) Repeat.__proto__ = IndexedSeq$$1;\n Repeat.prototype = Object.create( IndexedSeq$$1 && IndexedSeq$$1.prototype );\n Repeat.prototype.constructor = Repeat;\n\n Repeat.prototype.toString = function toString () {\n if (this.size === 0) {\n return 'Repeat []';\n }\n return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]';\n };\n\n Repeat.prototype.get = function get (index, notSetValue) {\n return this.has(index) ? this._value : notSetValue;\n };\n\n Repeat.prototype.includes = function includes (searchValue) {\n return is(this._value, searchValue);\n };\n\n Repeat.prototype.slice = function slice (begin, end) {\n var size = this.size;\n return wholeSlice(begin, end, size)\n ? this\n : new Repeat(\n this._value,\n resolveEnd(end, size) - resolveBegin(begin, size)\n );\n };\n\n Repeat.prototype.reverse = function reverse () {\n return this;\n };\n\n Repeat.prototype.indexOf = function indexOf (searchValue) {\n if (is(this._value, searchValue)) {\n return 0;\n }\n return -1;\n };\n\n Repeat.prototype.lastIndexOf = function lastIndexOf (searchValue) {\n if (is(this._value, searchValue)) {\n return this.size;\n }\n return -1;\n };\n\n Repeat.prototype.__iterate = function __iterate (fn, reverse) {\n var size = this.size;\n var i = 0;\n while (i !== size) {\n if (fn(this._value, reverse ? size - ++i : i++, this) === false) {\n break;\n }\n }\n return i;\n };\n\n Repeat.prototype.__iterator = function __iterator (type, reverse) {\n var this$1 = this;\n\n var size = this.size;\n var i = 0;\n return new Iterator(\n function () { return i === size\n ? iteratorDone()\n : iteratorValue(type, reverse ? size - ++i : i++, this$1._value); }\n );\n };\n\n Repeat.prototype.equals = function equals (other) {\n return other instanceof Repeat\n ? is(this._value, other._value)\n : deepEqual(other);\n };\n\n return Repeat;\n}(IndexedSeq));\n\nvar EMPTY_REPEAT;\n\nfunction fromJS(value, converter) {\n return fromJSWith(\n [],\n converter || defaultConverter,\n value,\n '',\n converter && converter.length > 2 ? [] : undefined,\n { '': value }\n );\n}\n\nfunction fromJSWith(stack, converter, value, key, keyPath, parentValue) {\n var toSeq = Array.isArray(value)\n ? IndexedSeq\n : isPlainObj(value)\n ? KeyedSeq\n : null;\n if (toSeq) {\n if (~stack.indexOf(value)) {\n throw new TypeError('Cannot convert circular structure to Immutable');\n }\n stack.push(value);\n keyPath && key !== '' && keyPath.push(key);\n var converted = converter.call(\n parentValue,\n key,\n toSeq(value).map(function (v, k) { return fromJSWith(stack, converter, v, k, keyPath, value); }\n ),\n keyPath && keyPath.slice()\n );\n stack.pop();\n keyPath && keyPath.pop();\n return converted;\n }\n return value;\n}\n\nfunction defaultConverter(k, v) {\n return isKeyed(v) ? v.toMap() : v.toList();\n}\n\nvar version = \"4.0.0-rc.11\";\n\nvar Immutable = {\n version: version,\n\n Collection: Collection,\n // Note: Iterable is deprecated\n Iterable: Collection,\n\n Seq: Seq,\n Map: Map,\n OrderedMap: OrderedMap,\n List: List,\n Stack: Stack,\n Set: Set,\n OrderedSet: OrderedSet,\n\n Record: Record,\n Range: Range,\n Repeat: Repeat,\n\n is: is,\n fromJS: fromJS,\n hash: hash,\n\n isImmutable: isImmutable,\n isCollection: isCollection,\n isKeyed: isKeyed,\n isIndexed: isIndexed,\n isAssociative: isAssociative,\n isOrdered: isOrdered,\n isValueObject: isValueObject,\n isSeq: isSeq,\n isList: isList,\n isMap: isMap,\n isOrderedMap: isOrderedMap,\n isStack: isStack,\n isSet: isSet,\n isOrderedSet: isOrderedSet,\n isRecord: isRecord,\n\n get: get,\n getIn: getIn,\n has: has,\n hasIn: hasIn,\n merge: merge$1,\n mergeDeep: mergeDeep,\n mergeWith: mergeWith$1,\n mergeDeepWith: mergeDeepWith,\n remove: remove,\n removeIn: removeIn,\n set: set,\n setIn: setIn,\n update: update,\n updateIn: updateIn,\n};\n\n// Note: Iterable is deprecated\nvar Iterable = Collection;\n\nexport default Immutable;\nexport { version, Collection, Iterable, Seq, Map, OrderedMap, List, Stack, Set, OrderedSet, Record, Range, Repeat, is, fromJS, hash, isImmutable, isCollection, isKeyed, isIndexed, isAssociative, isOrdered, isValueObject, get, getIn, has, hasIn, merge$1 as merge, mergeDeep, mergeWith$1 as mergeWith, mergeDeepWith, remove, removeIn, set, setIn, update, updateIn };\n",null,"/*!\n * howler.js v2.1.2\n * howlerjs.com\n *\n * (c) 2013-2019, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Create the global controller. All contained methods and properties apply\n * to all sounds that are currently playing or will be in the future.\n */\n var HowlerGlobal = function() {\n this.init();\n };\n HowlerGlobal.prototype = {\n /**\n * Initialize the global Howler object.\n * @return {Howler}\n */\n init: function() {\n var self = this || Howler;\n\n // Create a global ID counter.\n self._counter = 1000;\n\n // Pool of unlocked HTML5 Audio objects.\n self._html5AudioPool = [];\n self.html5PoolSize = 10;\n\n // Internal properties.\n self._codecs = {};\n self._howls = [];\n self._muted = false;\n self._volume = 1;\n self._canPlayEvent = 'canplaythrough';\n self._navigator = (typeof window !== 'undefined' && window.navigator) ? window.navigator : null;\n\n // Public properties.\n self.masterGain = null;\n self.noAudio = false;\n self.usingWebAudio = true;\n self.autoSuspend = true;\n self.ctx = null;\n\n // Set to false to disable the auto audio unlocker.\n self.autoUnlock = true;\n\n // Setup the various state values for global tracking.\n self._setup();\n\n return self;\n },\n\n /**\n * Get/set the global volume for all sounds.\n * @param {Float} vol Volume from 0.0 to 1.0.\n * @return {Howler/Float} Returns self or current volume.\n */\n volume: function(vol) {\n var self = this || Howler;\n vol = parseFloat(vol);\n\n // If we don't have an AudioContext created yet, run the setup.\n if (!self.ctx) {\n setupAudioContext();\n }\n\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n self._volume = vol;\n\n // Don't update any of the nodes if we are muted.\n if (self._muted) {\n return self;\n }\n\n // When using Web Audio, we just need to adjust the master gain.\n if (self.usingWebAudio) {\n self.masterGain.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n }\n\n // Loop through and change volume for all HTML5 audio nodes.\n for (var i=0; i=0; i--) {\n self._howls[i].unload();\n }\n\n // Create a new AudioContext to make sure it is fully reset.\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {\n self.ctx.close();\n self.ctx = null;\n setupAudioContext();\n }\n\n return self;\n },\n\n /**\n * Check for codec support of specific extension.\n * @param {String} ext Audio file extention.\n * @return {Boolean}\n */\n codecs: function(ext) {\n return (this || Howler)._codecs[ext.replace(/^x-/, '')];\n },\n\n /**\n * Setup various state values for global tracking.\n * @return {Howler}\n */\n _setup: function() {\n var self = this || Howler;\n\n // Keeps track of the suspend/resume state of the AudioContext.\n self.state = self.ctx ? self.ctx.state || 'suspended' : 'suspended';\n\n // Automatically begin the 30-second suspend process\n self._autoSuspend();\n\n // Check if audio is available.\n if (!self.usingWebAudio) {\n // No audio is available on this system if noAudio is set to true.\n if (typeof Audio !== 'undefined') {\n try {\n var test = new Audio();\n\n // Check if the canplaythrough event is available.\n if (typeof test.oncanplaythrough === 'undefined') {\n self._canPlayEvent = 'canplay';\n }\n } catch(e) {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n // Test to make sure audio isn't disabled in Internet Explorer.\n try {\n var test = new Audio();\n if (test.muted) {\n self.noAudio = true;\n }\n } catch (e) {}\n\n // Check for supported codecs.\n if (!self.noAudio) {\n self._setupCodecs();\n }\n\n return self;\n },\n\n /**\n * Check for browser support for various codecs and cache the results.\n * @return {Howler}\n */\n _setupCodecs: function() {\n var self = this || Howler;\n var audioTest = null;\n\n // Must wrap in a try/catch because IE11 in server mode throws an error.\n try {\n audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;\n } catch (err) {\n return self;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== 'function') {\n return self;\n }\n\n var mpegTest = audioTest.canPlayType('audio/mpeg;').replace(/^no$/, '');\n\n // Opera version <33 has mixed MP3 support, so we need to check for and block it.\n var checkOpera = self._navigator && self._navigator.userAgent.match(/OPR\\/([0-6].)/g);\n var isOldOpera = (checkOpera && parseInt(checkOpera[0].split('/')[1], 10) < 33);\n\n self._codecs = {\n mp3: !!(!isOldOpera && (mpegTest || audioTest.canPlayType('audio/mp3;').replace(/^no$/, ''))),\n mpeg: !!mpegTest,\n opus: !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\n ogg: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n oga: !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\n wav: !!audioTest.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/, ''),\n aac: !!audioTest.canPlayType('audio/aac;').replace(/^no$/, ''),\n caf: !!audioTest.canPlayType('audio/x-caf;').replace(/^no$/, ''),\n m4a: !!(audioTest.canPlayType('audio/x-m4a;') || audioTest.canPlayType('audio/m4a;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n mp4: !!(audioTest.canPlayType('audio/x-mp4;') || audioTest.canPlayType('audio/mp4;') || audioTest.canPlayType('audio/aac;')).replace(/^no$/, ''),\n weba: !!audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, ''),\n webm: !!audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, ''),\n dolby: !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, ''),\n flac: !!(audioTest.canPlayType('audio/x-flac;') || audioTest.canPlayType('audio/flac;')).replace(/^no$/, '')\n };\n\n return self;\n },\n\n /**\n * Some browsers/devices will only allow audio to be played after a user interaction.\n * Attempt to automatically unlock audio on the first user interaction.\n * Concept from: http://paulbakaus.com/tutorials/html5/web-audio-on-ios/\n * @return {Howler}\n */\n _unlockAudio: function() {\n var self = this || Howler;\n\n // Only run this if Web Audio is supported and it hasn't already been unlocked.\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n // Some mobile devices/platforms have distortion issues when opening/closing tabs and/or web views.\n // Bugs in the browser (especially Mobile Safari) can cause the sampleRate to change from 44100 to 48000.\n // By calling Howler.unload(), we create a new AudioContext with the correct sampleRate.\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n // Scratch buffer for enabling iOS to dispose of web audio buffers correctly, as per:\n // http://stackoverflow.com/questions/24119684\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n // Call this method on touch start to create and play a buffer,\n // then check if the audio actually played to determine if\n // audio has now been unlocked on iOS, Android, etc.\n var unlock = function(e) {\n // Create a pool of unlocked HTML5 Audio objects that can\n // be used for playing sounds without user interaction. HTML5\n // Audio objects must be individually unlocked, as opposed\n // to the WebAudio API which only needs a single activation.\n // This must occur before WebAudio setup or the source.onended\n // event will not fire.\n for (var i=0; i= 55.\n if (typeof self.ctx.resume === 'function') {\n self.ctx.resume();\n }\n\n // Setup a timeout to check that we are unlocked on the next event loop.\n source.onended = function() {\n source.disconnect(0);\n\n // Update the unlocked state and prevent this check from happening again.\n self._audioUnlocked = true;\n\n // Remove the touch start listener.\n document.removeEventListener('touchstart', unlock, true);\n document.removeEventListener('touchend', unlock, true);\n document.removeEventListener('click', unlock, true);\n\n // Let all sounds know that audio has been unlocked.\n for (var i=0; i 0 ? sound._seek : self._sprite[sprite][0] / 1000);\n var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);\n var timeout = (duration * 1000) / Math.abs(sound._rate);\n var start = self._sprite[sprite][0] / 1000;\n var stop = (self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000;\n var loop = !!(sound._loop || self._sprite[sprite][2]);\n sound._sprite = sprite;\n\n // Mark the sound as ended instantly so that this async playback\n // doesn't get grabbed by another call to play while this one waits to start.\n sound._ended = false;\n\n // Update the parameters of the sound.\n var setParams = function() {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = loop;\n };\n\n // End the sound instantly if seek is at the end.\n if (seek >= stop) {\n self._ended(sound);\n return;\n }\n\n // Begin the actual playback.\n var node = sound._node;\n if (self._webAudio) {\n // Fire this when the sound is ready to play to begin Web Audio playback.\n var playWebAudio = function() {\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n // Setup the playback params.\n var vol = (sound._muted || self._muted) ? 0 : sound._volume;\n node.gain.setValueAtTime(vol, Howler.ctx.currentTime);\n sound._playStart = Howler.ctx.currentTime;\n\n // Play the sound using the supported method.\n if (typeof node.bufferSource.start === 'undefined') {\n sound._loop ? node.bufferSource.noteGrainOn(0, seek, 86400) : node.bufferSource.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? node.bufferSource.start(0, seek, 86400) : node.bufferSource.start(0, seek, duration);\n }\n\n // Start a new timer if none is present.\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n if (!internal) {\n setTimeout(function() {\n self._emit('play', sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (Howler.state === 'running') {\n playWebAudio();\n } else {\n self._playLock = true;\n\n // Wait for the audio context to resume before playing.\n self.once('resume', playWebAudio);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n } else {\n // Fire this when the sound is ready to play to begin HTML5 Audio playback.\n var playHtml5 = function() {\n node.currentTime = seek;\n node.muted = sound._muted || self._muted || Howler._muted || node.muted;\n node.volume = sound._volume * Howler.volume();\n node.playbackRate = sound._rate;\n\n // Some browsers will throw an error if this is called without user interaction.\n try {\n var play = node.play();\n\n // Support older browsers that don't support promises, and thus don't have this issue.\n if (play && typeof Promise !== 'undefined' && (play instanceof Promise || typeof play.then === 'function')) {\n // Implements a lock to prevent DOMException: The play() request was interrupted by a call to pause().\n self._playLock = true;\n\n // Set param values immediately.\n setParams();\n\n // Releases the lock and executes queued actions.\n play\n .then(function() {\n self._playLock = false;\n node._unlocked = true;\n if (!internal) {\n self._emit('play', sound._id);\n self._loadQueue();\n }\n })\n .catch(function() {\n self._playLock = false;\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n\n // Reset the ended and paused values.\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit('play', sound._id);\n self._loadQueue();\n }\n\n // Setting rate before playing won't work in IE, so we set it again here.\n node.playbackRate = sound._rate;\n\n // If the node is still paused, then we can assume there was a playback issue.\n if (node.paused) {\n self._emit('playerror', sound._id, 'Playback was unable to start. This is most commonly an issue ' +\n 'on mobile devices and Chrome where playback was not within a user interaction.');\n return;\n }\n\n // Setup the end timer on sprites or listen for the ended event.\n if (sprite !== '__default' || sound._loop) {\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n } else {\n self._endTimers[sound._id] = function() {\n // Fire ended on this audio node.\n self._ended(sound);\n\n // Clear this listener.\n node.removeEventListener('ended', self._endTimers[sound._id], false);\n };\n node.addEventListener('ended', self._endTimers[sound._id], false);\n }\n } catch (err) {\n self._emit('playerror', sound._id, err);\n }\n };\n\n // If this is streaming audio, make sure the src is set and load again.\n if (node.src === 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA') {\n node.src = self._src;\n node.load();\n }\n\n // Play immediately if ready, or wait for the 'canplaythrough'e vent.\n var loadedNoReadyState = (window && window.ejecta) || (!node.readyState && Howler._navigator.isCocoonJS);\n if (node.readyState >= 3 || loadedNoReadyState) {\n playHtml5();\n } else {\n self._playLock = true;\n\n var listener = function() {\n // Begin playback.\n playHtml5();\n\n // Clear this listener.\n node.removeEventListener(Howler._canPlayEvent, listener, false);\n };\n node.addEventListener(Howler._canPlayEvent, listener, false);\n\n // Cancel the end timer.\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n },\n\n /**\n * Pause playback and save current position.\n * @param {Number} id The sound ID (empty to pause all in group).\n * @return {Howl}\n */\n pause: function(id) {\n var self = this;\n\n // If the sound hasn't loaded or a play() promise is pending, add it to the load queue to pause when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'pause',\n action: function() {\n self.pause(id);\n }\n });\n\n return self;\n }\n\n // If no id is passed, get all ID's to be paused.\n var ids = self._getSoundIds(id);\n\n for (var i=0; i Returns the group's volume value.\n * volume(id) -> Returns the sound id's current volume.\n * volume(vol) -> Sets the volume of all sounds in this Howl group.\n * volume(vol, id) -> Sets the volume of passed sound id.\n * @return {Howl/Number} Returns self or current volume.\n */\n volume: function() {\n var self = this;\n var args = arguments;\n var vol, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the value of the groups' volume.\n return self._volume;\n } else if (args.length === 1 || args.length === 2 && typeof args[1] === 'undefined') {\n // First check if this is an ID, and if not, assume it is a new volume.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n vol = parseFloat(args[0]);\n }\n } else if (args.length >= 2) {\n vol = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the volume or return the current volume.\n var sound;\n if (typeof vol !== 'undefined' && vol >= 0 && vol <= 1) {\n // If the sound hasn't loaded, add it to the load queue to change volume when capable.\n if (self._state !== 'loaded'|| self._playLock) {\n self._queue.push({\n event: 'volume',\n action: function() {\n self.volume.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group volume.\n if (typeof id === 'undefined') {\n self._volume = vol;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i 0) ? len / steps : len);\n var lastTick = Date.now();\n\n // Store the value being faded to.\n sound._fadeTo = to;\n\n // Update the volume value on each interval tick.\n sound._interval = setInterval(function() {\n // Update the volume based on the time since the last tick.\n var tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n // Make sure the volume is in the right bounds.\n vol = Math.max(0, vol);\n vol = Math.min(1, vol);\n\n // Round to within 2 decimal points.\n vol = Math.round(vol * 100) / 100;\n\n // Change the volume.\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n // Set the group's volume.\n if (isGroup) {\n self._volume = vol;\n }\n\n // When the fade is complete, stop it and fire event.\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = null;\n sound._fadeTo = null;\n self.volume(to, sound._id);\n self._emit('fade', sound._id);\n }\n }, stepLen);\n },\n\n /**\n * Internal method that stops the currently playing fade when\n * a new fade starts, volume is changed or the sound is stopped.\n * @param {Number} id The sound id.\n * @return {Howl}\n */\n _stopFade: function(id) {\n var self = this;\n var sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio) {\n sound._node.gain.cancelScheduledValues(Howler.ctx.currentTime);\n }\n\n clearInterval(sound._interval);\n sound._interval = null;\n self.volume(sound._fadeTo, id);\n sound._fadeTo = null;\n self._emit('fade', id);\n }\n\n return self;\n },\n\n /**\n * Get/set the loop parameter on a sound. This method can optionally take 0, 1 or 2 arguments.\n * loop() -> Returns the group's loop value.\n * loop(id) -> Returns the sound id's loop value.\n * loop(loop) -> Sets the loop value for all sounds in this Howl group.\n * loop(loop, id) -> Sets the loop value of passed sound id.\n * @return {Howl/Boolean} Returns self or current loop value.\n */\n loop: function() {\n var self = this;\n var args = arguments;\n var loop, id, sound;\n\n // Determine the values for loop and id.\n if (args.length === 0) {\n // Return the grou's loop value.\n return self._loop;\n } else if (args.length === 1) {\n if (typeof args[0] === 'boolean') {\n loop = args[0];\n self._loop = loop;\n } else {\n // Return this sound's loop value.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._loop : false;\n }\n } else if (args.length === 2) {\n loop = args[0];\n id = parseInt(args[1], 10);\n }\n\n // If no id is passed, get all ID's to be looped.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current playback rate.\n * rate(id) -> Returns the sound id's current playback rate.\n * rate(rate) -> Sets the playback rate of all sounds in this Howl group.\n * rate(rate, id) -> Sets the playback rate of passed sound id.\n * @return {Howl/Number} Returns self or the current playback rate.\n */\n rate: function() {\n var self = this;\n var args = arguments;\n var rate, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current rate of the first node.\n id = self._sounds[0]._id;\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new rate value.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else {\n rate = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n rate = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // Update the playback rate or return the current value.\n var sound;\n if (typeof rate === 'number') {\n // If the sound hasn't loaded, add it to the load queue to change playback rate when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'rate',\n action: function() {\n self.rate.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Set the group rate.\n if (typeof id === 'undefined') {\n self._rate = rate;\n }\n\n // Update one or all volumes.\n id = self._getSoundIds(id);\n for (var i=0; i Returns the first sound node's current seek position.\n * seek(id) -> Returns the sound id's current seek position.\n * seek(seek) -> Sets the seek position of the first sound node.\n * seek(seek, id) -> Sets the seek position of passed sound id.\n * @return {Howl/Number} Returns self or the current seek position.\n */\n seek: function() {\n var self = this;\n var args = arguments;\n var seek, id;\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // We will simply return the current position of the first node.\n id = self._sounds[0]._id;\n } else if (args.length === 1) {\n // First check if this is an ID, and if not, assume it is a new seek position.\n var ids = self._getSoundIds();\n var index = ids.indexOf(args[0]);\n if (index >= 0) {\n id = parseInt(args[0], 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]._id;\n seek = parseFloat(args[0]);\n }\n } else if (args.length === 2) {\n seek = parseFloat(args[0]);\n id = parseInt(args[1], 10);\n }\n\n // If there is no ID, bail out.\n if (typeof id === 'undefined') {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to seek when capable.\n if (self._state !== 'loaded' || self._playLock) {\n self._queue.push({\n event: 'seek',\n action: function() {\n self.seek.apply(self, args);\n }\n });\n\n return self;\n }\n\n // Get the sound.\n var sound = self._soundById(id);\n\n if (sound) {\n if (typeof seek === 'number' && seek >= 0) {\n // Pause the sound and update position for restarting playback.\n var playing = self.playing(id);\n if (playing) {\n self.pause(id, true);\n }\n\n // Move the position of the track and cancel timer.\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n // Update the seek position for HTML5 Audio.\n if (!self._webAudio && sound._node && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n // Seek and emit when ready.\n var seekAndEmit = function() {\n self._emit('seek', id);\n\n // Restart the playback if the sound was playing.\n if (playing) {\n self.play(id, true);\n }\n };\n\n // Wait for the play lock to be unset before emitting (HTML5 Audio).\n if (playing && !self._webAudio) {\n var emitSeek = function() {\n if (!self._playLock) {\n seekAndEmit();\n } else {\n setTimeout(emitSeek, 0);\n }\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n } else {\n if (self._webAudio) {\n var realTime = self.playing(id) ? Howler.ctx.currentTime - sound._playStart : 0;\n var rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n } else {\n return sound._node.currentTime;\n }\n }\n }\n\n return self;\n },\n\n /**\n * Check if a specific sound is currently playing or not (if id is provided), or check if at least one of the sounds in the group is playing or not.\n * @param {Number} id The sound id to check. If none is passed, the whole sound group is checked.\n * @return {Boolean} True if playing and false if not.\n */\n playing: function(id) {\n var self = this;\n\n // Check the passed sound ID (if any).\n if (typeof id === 'number') {\n var sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n // Otherwise, loop through all sounds and check if any are playing.\n for (var i=0; i= 0) {\n Howler._howls.splice(index, 1);\n }\n\n // Delete this sound from the cache (if no other Howl is using it).\n var remCache = true;\n for (i=0; i= 0) {\n remCache = false;\n break;\n }\n }\n\n if (cache && remCache) {\n delete cache[self._src];\n }\n\n // Clear global errors.\n Howler.noAudio = false;\n\n // Clear out `self`.\n self._state = 'unloaded';\n self._sounds = [];\n self = null;\n\n return null;\n },\n\n /**\n * Listen to a custom event.\n * @param {String} event Event name.\n * @param {Function} fn Listener to call.\n * @param {Number} id (optional) Only listen to events for this sound.\n * @param {Number} once (INTERNAL) Marks event to fire only once.\n * @return {Howl}\n */\n on: function(event, fn, id, once) {\n var self = this;\n var events = self['_on' + event];\n\n if (typeof fn === 'function') {\n events.push(once ? {id: id, fn: fn, once: once} : {id: id, fn: fn});\n }\n\n return self;\n },\n\n /**\n * Remove a custom event. Call without parameters to remove all events.\n * @param {String} event Event name.\n * @param {Function} fn Listener to remove. Leave empty to remove all.\n * @param {Number} id (optional) Only remove events for this sound.\n * @return {Howl}\n */\n off: function(event, fn, id) {\n var self = this;\n var events = self['_on' + event];\n var i = 0;\n\n // Allow passing just an event and ID.\n if (typeof fn === 'number') {\n id = fn;\n fn = null;\n }\n\n if (fn || id) {\n // Loop through event store and remove the passed function.\n for (i=0; i=0; i--) {\n // Only fire the listener if the correct ID is used.\n if (!events[i].id || events[i].id === id || event === 'load') {\n setTimeout(function(fn) {\n fn.call(this, id, msg);\n }.bind(self, events[i].fn), 0);\n\n // If this event was setup with `once`, remove it.\n if (events[i].once) {\n self.off(event, events[i].fn, events[i].id);\n }\n }\n }\n\n // Pass the event type into load queue so that it can continue stepping.\n self._loadQueue(event);\n\n return self;\n },\n\n /**\n * Queue of actions initiated before the sound has loaded.\n * These will be called in sequence, with the next only firing\n * after the previous has finished executing (even if async like play).\n * @return {Howl}\n */\n _loadQueue: function(event) {\n var self = this;\n\n if (self._queue.length > 0) {\n var task = self._queue[0];\n\n // Remove this task if a matching event was passed.\n if (task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n\n // Run the task if no event type is passed.\n if (!event) {\n task.action();\n }\n }\n\n return self;\n },\n\n /**\n * Fired when playback ends at the end of the duration.\n * @param {Sound} sound The sound object to work with.\n * @return {Howl}\n */\n _ended: function(sound) {\n var self = this;\n var sprite = sound._sprite;\n\n // If we are using IE and there was network latency we may be clipping\n // audio before it completes playing. Lets check the node to make sure it\n // believes it has completed, before ending the playback.\n if (!self._webAudio && sound._node && !sound._node.paused && !sound._node.ended && sound._node.currentTime < sound._stop) {\n setTimeout(self._ended.bind(self, sound), 100);\n return self;\n }\n\n // Should this sound loop?\n var loop = !!(sound._loop || self._sprite[sprite][2]);\n\n // Fire the ended event.\n self._emit('end', sound._id);\n\n // Restart the playback for HTML5 Audio loop.\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n // Restart this timer if on a Web Audio loop.\n if (self._webAudio && loop) {\n self._emit('play', sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = Howler.ctx.currentTime;\n\n var timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(self._ended.bind(self, sound), timeout);\n }\n\n // Mark the node as paused.\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n\n // Clean up the buffer source.\n self._cleanBuffer(sound._node);\n\n // Attempt to auto-suspend AudioContext if no sounds are still playing.\n Howler._autoSuspend();\n }\n\n // When using a sprite, end the track.\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n },\n\n /**\n * Clear the end timer for a sound playback.\n * @param {Number} id The sound ID.\n * @return {Howl}\n */\n _clearTimer: function(id) {\n var self = this;\n\n if (self._endTimers[id]) {\n // Clear the timeout or remove the ended listener.\n if (typeof self._endTimers[id] !== 'function') {\n clearTimeout(self._endTimers[id]);\n } else {\n var sound = self._soundById(id);\n if (sound && sound._node) {\n sound._node.removeEventListener('ended', self._endTimers[id], false);\n }\n }\n\n delete self._endTimers[id];\n }\n\n return self;\n },\n\n /**\n * Return the sound identified by this ID, or return null.\n * @param {Number} id Sound ID\n * @return {Object} Sound object or null.\n */\n _soundById: function(id) {\n var self = this;\n\n // Loop through all sounds and find the one with this ID.\n for (var i=0; i=0; i--) {\n if (cnt <= limit) {\n return;\n }\n\n if (self._sounds[i]._ended) {\n // Disconnect the audio source when using Web Audio.\n if (self._webAudio && self._sounds[i]._node) {\n self._sounds[i]._node.disconnect(0);\n }\n\n // Remove sounds until we have the pool size.\n self._sounds.splice(i, 1);\n cnt--;\n }\n }\n },\n\n /**\n * Get all ID's from the sounds pool.\n * @param {Number} id Only return one ID if one is passed.\n * @return {Array} Array of IDs.\n */\n _getSoundIds: function(id) {\n var self = this;\n\n if (typeof id === 'undefined') {\n var ids = [];\n for (var i=0; i= 0;\n\n if (Howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try { node.bufferSource.buffer = Howler._scratchBuffer; } catch(e) {}\n }\n }\n node.bufferSource = null;\n\n return self;\n },\n\n /**\n * Set the source to a 0-second silence to stop any downloading (except in IE).\n * @param {Object} node Audio node to clear.\n */\n _clearSound: function(node) {\n var checkIE = /MSIE |Trident\\//.test(Howler._navigator && Howler._navigator.userAgent);\n if (!checkIE) {\n node.src = 'data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA';\n }\n }\n };\n\n /** Single Sound Methods **/\n /***************************************************************************/\n\n /**\n * Setup the sound object, which each node attached to a Howl group is contained in.\n * @param {Object} howl The Howl parent group.\n */\n var Sound = function(howl) {\n this._parent = howl;\n this.init();\n };\n Sound.prototype = {\n /**\n * Initialize a new Sound object.\n * @return {Sound}\n */\n init: function() {\n var self = this;\n var parent = self._parent;\n\n // Setup the default parameters.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a unique ID for this sound.\n self._id = ++Howler._counter;\n\n // Add itself to the parent's pool.\n parent._sounds.push(self);\n\n // Create the new node.\n self.create();\n\n return self;\n },\n\n /**\n * Create and setup a new sound object, whether HTML5 Audio or Web Audio.\n * @return {Sound}\n */\n create: function() {\n var self = this;\n var parent = self._parent;\n var volume = (Howler._muted || self._muted || self._parent._muted) ? 0 : self._volume;\n\n if (parent._webAudio) {\n // Create the gain node for controlling volume (the source will connect to this).\n self._node = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n self._node.gain.setValueAtTime(volume, Howler.ctx.currentTime);\n self._node.paused = true;\n self._node.connect(Howler.masterGain);\n } else {\n // Get an unlocked Audio object from the pool.\n self._node = Howler._obtainHtml5Audio();\n\n // Listen for errors (http://dev.w3.org/html5/spec-author-view/spec.html#mediaerror).\n self._errorFn = self._errorListener.bind(self);\n self._node.addEventListener('error', self._errorFn, false);\n\n // Listen for 'canplaythrough' event to let us know the sound is ready.\n self._loadFn = self._loadListener.bind(self);\n self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);\n\n // Setup the new audio node.\n self._node.src = parent._src;\n self._node.preload = 'auto';\n self._node.volume = volume * Howler.volume();\n\n // Begin loading the source.\n self._node.load();\n }\n\n return self;\n },\n\n /**\n * Reset the parameters of this sound to the original state (for recycle).\n * @return {Sound}\n */\n reset: function() {\n var self = this;\n var parent = self._parent;\n\n // Reset all of the parameters of this sound.\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = '__default';\n\n // Generate a new ID so that it isn't confused with the previous sound.\n self._id = ++Howler._counter;\n\n return self;\n },\n\n /**\n * HTML5 Audio error listener callback.\n */\n _errorListener: function() {\n var self = this;\n\n // Fire an error event and pass back the code.\n self._parent._emit('loaderror', self._id, self._node.error ? self._node.error.code : 0);\n\n // Clear the event listener.\n self._node.removeEventListener('error', self._errorFn, false);\n },\n\n /**\n * HTML5 Audio canplaythrough listener callback.\n */\n _loadListener: function() {\n var self = this;\n var parent = self._parent;\n\n // Round up the duration to account for the lower precision in HTML5 Audio.\n parent._duration = Math.ceil(self._node.duration * 10) / 10;\n\n // Setup a sprite if none is defined.\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = {__default: [0, parent._duration * 1000]};\n }\n\n if (parent._state !== 'loaded') {\n parent._state = 'loaded';\n parent._emit('load');\n parent._loadQueue();\n }\n\n // Clear the event listener.\n self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);\n }\n };\n\n /** Helper Methods **/\n /***************************************************************************/\n\n var cache = {};\n\n /**\n * Buffer a sound from URL, Data URI or cache and decode to audio source (Web Audio API).\n * @param {Howl} self\n */\n var loadBuffer = function(self) {\n var url = self._src;\n\n // Check if the buffer has already been cached and use it instead.\n if (cache[url]) {\n // Set the duration from the cache.\n self._duration = cache[url].duration;\n\n // Load the sound into this Howl.\n loadSound(self);\n\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n // Decode the base64 data URI without XHR, since some browsers don't support it.\n var data = atob(url.split(',')[1]);\n var dataView = new Uint8Array(data.length);\n for (var i=0; i 0) {\n cache[self._src] = buffer;\n loadSound(self, buffer);\n } else {\n error();\n }\n };\n\n // Decode the buffer into an audio source.\n if (typeof Promise !== 'undefined' && Howler.ctx.decodeAudioData.length === 1) {\n Howler.ctx.decodeAudioData(arraybuffer).then(success).catch(error);\n } else {\n Howler.ctx.decodeAudioData(arraybuffer, success, error);\n }\n }\n\n /**\n * Sound is now loaded, so finish setting everything up and fire the loaded event.\n * @param {Howl} self\n * @param {Object} buffer The decoded buffer sound source.\n */\n var loadSound = function(self, buffer) {\n // Set the duration.\n if (buffer && !self._duration) {\n self._duration = buffer.duration;\n }\n\n // Setup a sprite if none is defined.\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = {__default: [0, self._duration * 1000]};\n }\n\n // Fire the loaded event.\n if (self._state !== 'loaded') {\n self._state = 'loaded';\n self._emit('load');\n self._loadQueue();\n }\n };\n\n /**\n * Setup the audio context when available, or switch to HTML5 Audio mode.\n */\n var setupAudioContext = function() {\n // If we have already detected that Web Audio isn't supported, don't run this step again.\n if (!Howler.usingWebAudio) {\n return;\n }\n\n // Check if we are using Web Audio and setup the AudioContext if we are.\n try {\n if (typeof AudioContext !== 'undefined') {\n Howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== 'undefined') {\n Howler.ctx = new webkitAudioContext();\n } else {\n Howler.usingWebAudio = false;\n }\n } catch(e) {\n Howler.usingWebAudio = false;\n }\n\n // If the audio context creation still failed, set using web audio to false.\n if (!Howler.ctx) {\n Howler.usingWebAudio = false;\n }\n\n // Check if a webview is being used on iOS8 or earlier (rather than the browser).\n // If it is, disable Web Audio as it causes crashing.\n var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));\n var appVersion = Howler._navigator && Howler._navigator.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n var version = appVersion ? parseInt(appVersion[1], 10) : null;\n if (iOS && version && version < 9) {\n var safari = /safari/.test(Howler._navigator && Howler._navigator.userAgent.toLowerCase());\n if (Howler._navigator && Howler._navigator.standalone && !safari || Howler._navigator && !Howler._navigator.standalone && !safari) {\n Howler.usingWebAudio = false;\n }\n }\n\n // Create and expose the master GainNode when using Web Audio (useful for plugins or advanced usage).\n if (Howler.usingWebAudio) {\n Howler.masterGain = (typeof Howler.ctx.createGain === 'undefined') ? Howler.ctx.createGainNode() : Howler.ctx.createGain();\n Howler.masterGain.gain.setValueAtTime(Howler._muted ? 0 : 1, Howler.ctx.currentTime);\n Howler.masterGain.connect(Howler.ctx.destination);\n }\n\n // Re-run the setup on Howler.\n Howler._setup();\n };\n\n // Add support for AMD (Asynchronous Module Definition) libraries such as require.js.\n if (typeof define === 'function' && define.amd) {\n define([], function() {\n return {\n Howler: Howler,\n Howl: Howl\n };\n });\n }\n\n // Add support for CommonJS libraries such as browserify.\n if (typeof exports !== 'undefined') {\n exports.Howler = Howler;\n exports.Howl = Howl;\n }\n\n // Define globally in case AMD is not available or unused.\n if (typeof window !== 'undefined') {\n window.HowlerGlobal = HowlerGlobal;\n window.Howler = Howler;\n window.Howl = Howl;\n window.Sound = Sound;\n } else if (typeof global !== 'undefined') { // Add to global in Node.js (for testing, etc).\n global.HowlerGlobal = HowlerGlobal;\n global.Howler = Howler;\n global.Howl = Howl;\n global.Sound = Sound;\n }\n})();\n\n\n/*!\n * Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.\n * \n * howler.js v2.1.2\n * howlerjs.com\n *\n * (c) 2013-2019, James Simpson of GoldFire Studios\n * goldfirestudios.com\n *\n * MIT License\n */\n\n(function() {\n\n 'use strict';\n\n // Setup default properties.\n HowlerGlobal.prototype._pos = [0, 0, 0];\n HowlerGlobal.prototype._orientation = [0, 0, -1, 0, 1, 0];\n\n /** Global Methods **/\n /***************************************************************************/\n\n /**\n * Helper method to update the stereo panning position of all current Howls.\n * Future Howls will not use this value unless explicitly set.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @return {Howler/Number} Self or current stereo panning value.\n */\n HowlerGlobal.prototype.stereo = function(pan) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Loop through all Howls and update their stereo panning.\n for (var i=self._howls.length-1; i>=0; i--) {\n self._howls[i].stereo(pan);\n }\n\n return self;\n };\n\n /**\n * Get/set the position of the listener in 3D cartesian space. Sounds using\n * 3D position will be relative to the listener's position.\n * @param {Number} x The x-position of the listener.\n * @param {Number} y The y-position of the listener.\n * @param {Number} z The z-position of the listener.\n * @return {Howler/Array} Self or current listener position.\n */\n HowlerGlobal.prototype.pos = function(x, y, z) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n y = (typeof y !== 'number') ? self._pos[1] : y;\n z = (typeof z !== 'number') ? self._pos[2] : z;\n\n if (typeof x === 'number') {\n self._pos = [x, y, z];\n\n if (typeof self.ctx.listener.positionX !== 'undefined') {\n self.ctx.listener.positionX.setTargetAtTime(self._pos[0], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionY.setTargetAtTime(self._pos[1], Howler.ctx.currentTime, 0.1);\n self.ctx.listener.positionZ.setTargetAtTime(self._pos[2], Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setPosition(self._pos[0], self._pos[1], self._pos[2]);\n }\n } else {\n return self._pos;\n }\n\n return self;\n };\n\n /**\n * Get/set the direction the listener is pointing in the 3D cartesian space.\n * A front and up vector must be provided. The front is the direction the\n * face of the listener is pointing, and up is the direction the top of the\n * listener is pointing. Thus, these values are expected to be at right angles\n * from each other.\n * @param {Number} x The x-orientation of the listener.\n * @param {Number} y The y-orientation of the listener.\n * @param {Number} z The z-orientation of the listener.\n * @param {Number} xUp The x-orientation of the top of the listener.\n * @param {Number} yUp The y-orientation of the top of the listener.\n * @param {Number} zUp The z-orientation of the top of the listener.\n * @return {Howler/Array} Returns self or the current orientation vectors.\n */\n HowlerGlobal.prototype.orientation = function(x, y, z, xUp, yUp, zUp) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self.ctx || !self.ctx.listener) {\n return self;\n }\n\n // Set the defaults for optional 'y' & 'z'.\n var or = self._orientation;\n y = (typeof y !== 'number') ? or[1] : y;\n z = (typeof z !== 'number') ? or[2] : z;\n xUp = (typeof xUp !== 'number') ? or[3] : xUp;\n yUp = (typeof yUp !== 'number') ? or[4] : yUp;\n zUp = (typeof zUp !== 'number') ? or[5] : zUp;\n\n if (typeof x === 'number') {\n self._orientation = [x, y, z, xUp, yUp, zUp];\n\n if (typeof self.ctx.listener.forwardX !== 'undefined') {\n self.ctx.listener.forwardX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.forwardZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upX.setTargetAtTime(x, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upY.setTargetAtTime(y, Howler.ctx.currentTime, 0.1);\n self.ctx.listener.upZ.setTargetAtTime(z, Howler.ctx.currentTime, 0.1);\n } else {\n self.ctx.listener.setOrientation(x, y, z, xUp, yUp, zUp);\n }\n } else {\n return or;\n }\n\n return self;\n };\n\n /** Group Methods **/\n /***************************************************************************/\n\n /**\n * Add new properties to the core init.\n * @param {Function} _super Core init method.\n * @return {Howl}\n */\n Howl.prototype.init = (function(_super) {\n return function(o) {\n var self = this;\n\n // Setup user-defined default properties.\n self._orientation = o.orientation || [1, 0, 0];\n self._stereo = o.stereo || null;\n self._pos = o.pos || null;\n self._pannerAttr = {\n coneInnerAngle: typeof o.coneInnerAngle !== 'undefined' ? o.coneInnerAngle : 360,\n coneOuterAngle: typeof o.coneOuterAngle !== 'undefined' ? o.coneOuterAngle : 360,\n coneOuterGain: typeof o.coneOuterGain !== 'undefined' ? o.coneOuterGain : 0,\n distanceModel: typeof o.distanceModel !== 'undefined' ? o.distanceModel : 'inverse',\n maxDistance: typeof o.maxDistance !== 'undefined' ? o.maxDistance : 10000,\n panningModel: typeof o.panningModel !== 'undefined' ? o.panningModel : 'HRTF',\n refDistance: typeof o.refDistance !== 'undefined' ? o.refDistance : 1,\n rolloffFactor: typeof o.rolloffFactor !== 'undefined' ? o.rolloffFactor : 1\n };\n\n // Setup event listeners.\n self._onstereo = o.onstereo ? [{fn: o.onstereo}] : [];\n self._onpos = o.onpos ? [{fn: o.onpos}] : [];\n self._onorientation = o.onorientation ? [{fn: o.onorientation}] : [];\n\n // Complete initilization with howler.js core's init function.\n return _super.call(this, o);\n };\n })(Howl.prototype.init);\n\n /**\n * Get/set the stereo panning of the audio source for this sound or all in the group.\n * @param {Number} pan A value of -1.0 is all the way left and 1.0 is all the way right.\n * @param {Number} id (optional) The sound ID. If none is passed, all in group will be updated.\n * @return {Howl/Number} Returns self or the current stereo panning value.\n */\n Howl.prototype.stereo = function(pan, id) {\n var self = this;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // If the sound hasn't loaded, add it to the load queue to change stereo pan when capable.\n if (self._state !== 'loaded') {\n self._queue.push({\n event: 'stereo',\n action: function() {\n self.stereo(pan, id);\n }\n });\n\n return self;\n }\n\n // Check for PannerStereoNode support and fallback to PannerNode if it doesn't exist.\n var pannerType = (typeof Howler.ctx.createStereoPanner === 'undefined') ? 'spatial' : 'stereo';\n\n // Setup the group's stereo panning if no ID is passed.\n if (typeof id === 'undefined') {\n // Return the group's stereo panning if no parameters are passed.\n if (typeof pan === 'number') {\n self._stereo = pan;\n self._pos = [pan, 0, 0];\n } else {\n return self._stereo;\n }\n }\n\n // Change the streo panning of one or all sounds in group.\n var ids = self._getSoundIds(id);\n for (var i=0; i Returns the group's values.\n * pannerAttr(id) -> Returns the sound id's values.\n * pannerAttr(o) -> Set's the values of all sounds in this Howl group.\n * pannerAttr(o, id) -> Set's the values of passed sound id.\n *\n * Attributes:\n * coneInnerAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * inside of which there will be no volume reduction.\n * coneOuterAngle - (360 by default) A parameter for directional audio sources, this is an angle, in degrees,\n * outside of which the volume will be reduced to a constant value of `coneOuterGain`.\n * coneOuterGain - (0 by default) A parameter for directional audio sources, this is the gain outside of the\n * `coneOuterAngle`. It is a linear value in the range `[0, 1]`.\n * distanceModel - ('inverse' by default) Determines algorithm used to reduce volume as audio moves away from\n * listener. Can be `linear`, `inverse` or `exponential.\n * maxDistance - (10000 by default) The maximum distance between source and listener, after which the volume\n * will not be reduced any further.\n * refDistance - (1 by default) A reference distance for reducing volume as source moves further from the listener.\n * This is simply a variable of the distance model and has a different effect depending on which model\n * is used and the scale of your coordinates. Generally, volume will be equal to 1 at this distance.\n * rolloffFactor - (1 by default) How quickly the volume reduces as source moves from listener. This is simply a\n * variable of the distance model and can be in the range of `[0, 1]` with `linear` and `[0, ∞]`\n * with `inverse` and `exponential`.\n * panningModel - ('HRTF' by default) Determines which spatialization algorithm is used to position audio.\n * Can be `HRTF` or `equalpower`.\n *\n * @return {Howl/Object} Returns self or current panner attributes.\n */\n Howl.prototype.pannerAttr = function() {\n var self = this;\n var args = arguments;\n var o, id, sound;\n\n // Stop right here if not using Web Audio.\n if (!self._webAudio) {\n return self;\n }\n\n // Determine the values based on arguments.\n if (args.length === 0) {\n // Return the group's panner attribute values.\n return self._pannerAttr;\n } else if (args.length === 1) {\n if (typeof args[0] === 'object') {\n o = args[0];\n\n // Set the grou's panner attribute values.\n if (typeof id === 'undefined') {\n if (!o.pannerAttr) {\n o.pannerAttr = {\n coneInnerAngle: o.coneInnerAngle,\n coneOuterAngle: o.coneOuterAngle,\n coneOuterGain: o.coneOuterGain,\n distanceModel: o.distanceModel,\n maxDistance: o.maxDistance,\n refDistance: o.refDistance,\n rolloffFactor: o.rolloffFactor,\n panningModel: o.panningModel\n };\n }\n\n self._pannerAttr = {\n coneInnerAngle: typeof o.pannerAttr.coneInnerAngle !== 'undefined' ? o.pannerAttr.coneInnerAngle : self._coneInnerAngle,\n coneOuterAngle: typeof o.pannerAttr.coneOuterAngle !== 'undefined' ? o.pannerAttr.coneOuterAngle : self._coneOuterAngle,\n coneOuterGain: typeof o.pannerAttr.coneOuterGain !== 'undefined' ? o.pannerAttr.coneOuterGain : self._coneOuterGain,\n distanceModel: typeof o.pannerAttr.distanceModel !== 'undefined' ? o.pannerAttr.distanceModel : self._distanceModel,\n maxDistance: typeof o.pannerAttr.maxDistance !== 'undefined' ? o.pannerAttr.maxDistance : self._maxDistance,\n refDistance: typeof o.pannerAttr.refDistance !== 'undefined' ? o.pannerAttr.refDistance : self._refDistance,\n rolloffFactor: typeof o.pannerAttr.rolloffFactor !== 'undefined' ? o.pannerAttr.rolloffFactor : self._rolloffFactor,\n panningModel: typeof o.pannerAttr.panningModel !== 'undefined' ? o.pannerAttr.panningModel : self._panningModel\n };\n }\n } else {\n // Return this sound's panner attribute values.\n sound = self._soundById(parseInt(args[0], 10));\n return sound ? sound._pannerAttr : self._pannerAttr;\n }\n } else if (args.length === 2) {\n o = args[0];\n id = parseInt(args[1], 10);\n }\n\n // Update the values of the specified sounds.\n var ids = self._getSoundIds(id);\n for (var i=0; i {\n if (typeof window !== 'undefined' && (window as any)[\"botchatDebug\"] && message)\n console.log(message, ... optionalParams);\n }\n}\n\nexport interface IBotConnection {\n connectionStatus$: BehaviorSubject,\n activity$: Observable,\n end(): void,\n referenceGrammarId?: string,\n postActivity(activity: Activity): Observable,\n getSessionId? : () => Observable\n}\n\nexport class DirectLine implements IBotConnection {\n public connectionStatus$ = new BehaviorSubject(ConnectionStatus.Uninitialized);\n public activity$: Observable;\n\n private domain = \"https://directline.botframework.com/v3/directline\";\n private webSocket: boolean;\n\n private conversationId: string;\n private expiredTokenExhaustion: Function;\n private secret: string;\n private token: string;\n private watermark = '';\n private streamUrl: string;\n private _botAgent = '';\n private _userAgent: string;\n public referenceGrammarId: string;\n\n private pollingInterval: number = 1000; //ms\n\n private tokenRefreshSubscription: Subscription;\n\n constructor(options: DirectLineOptions) {\n this.secret = options.secret;\n this.token = options.secret || options.token;\n this.webSocket = (options.webSocket === undefined ? true : options.webSocket) && typeof WebSocket !== 'undefined' && WebSocket !== undefined;\n\n if (options.domain) {\n this.domain = options.domain;\n }\n\n if (options.conversationId) {\n this.conversationId = options.conversationId;\n }\n\n if (options.watermark) {\n this.watermark = options.watermark;\n }\n\n if (options.streamUrl) {\n if (options.token && options.conversationId) {\n this.streamUrl = options.streamUrl;\n } else {\n console.warn('DirectLineJS: streamUrl was ignored: you need to provide a token and a conversationid');\n }\n }\n\n this._botAgent = this.getBotAgent(options.botAgent);\n\n const parsedPollingInterval = ~~options.pollingInterval;\n\n if (parsedPollingInterval < POLLING_INTERVAL_LOWER_BOUND) {\n if (typeof options.pollingInterval !== 'undefined') {\n console.warn(`DirectLineJS: provided pollingInterval (${ options.pollingInterval }) is under lower bound (200ms), using default of 1000ms`);\n }\n } else {\n this.pollingInterval = parsedPollingInterval;\n }\n\n this.expiredTokenExhaustion = this.setConnectionStatusFallback(\n ConnectionStatus.ExpiredToken,\n ConnectionStatus.FailedToConnect,\n 5\n );\n\n this.activity$ = (this.webSocket\n ? this.webSocketActivity$()\n : this.pollingGetActivity$()\n ).share();\n }\n\n // Every time we're about to make a Direct Line REST call, we call this first to see check the current connection status.\n // Either throws an error (indicating an error state) or emits a null, indicating a (presumably) healthy connection\n private checkConnection(once = false) {\n let obs = this.connectionStatus$\n .flatMap(connectionStatus => {\n if (connectionStatus === ConnectionStatus.Uninitialized) {\n this.connectionStatus$.next(ConnectionStatus.Connecting);\n\n //if token and streamUrl are defined it means reconnect has already been done. Skipping it.\n if (this.token && this.streamUrl) {\n this.connectionStatus$.next(ConnectionStatus.Online);\n return Observable.of(connectionStatus);\n } else {\n return this.startConversation().do(conversation => {\n this.conversationId = conversation.conversationId;\n this.token = this.secret || conversation.token;\n this.streamUrl = conversation.streamUrl;\n this.referenceGrammarId = conversation.referenceGrammarId;\n if (!this.secret)\n this.refreshTokenLoop();\n\n this.connectionStatus$.next(ConnectionStatus.Online);\n }, error => {\n this.connectionStatus$.next(ConnectionStatus.FailedToConnect);\n })\n .map(_ => connectionStatus);\n }\n }\n else {\n return Observable.of(connectionStatus);\n }\n })\n .filter(connectionStatus => connectionStatus != ConnectionStatus.Uninitialized && connectionStatus != ConnectionStatus.Connecting)\n .flatMap(connectionStatus => {\n switch (connectionStatus) {\n case ConnectionStatus.Ended:\n return Observable.throw(errorConversationEnded);\n\n case ConnectionStatus.FailedToConnect:\n return Observable.throw(errorFailedToConnect);\n\n case ConnectionStatus.ExpiredToken:\n return Observable.of(connectionStatus);\n\n default:\n return Observable.of(connectionStatus);\n }\n })\n\n return once ? obs.take(1) : obs;\n }\n\n setConnectionStatusFallback(\n connectionStatusFrom: ConnectionStatus,\n connectionStatusTo: ConnectionStatus,\n maxAttempts = 5\n ) {\n maxAttempts--;\n let attempts = 0;\n let currStatus = null;\n return (status: ConnectionStatus): ConnectionStatus => {\n if (status === connectionStatusFrom && currStatus === status && attempts >= maxAttempts) {\n attempts = 0\n return connectionStatusTo;\n }\n attempts++;\n currStatus = status;\n return status;\n };\n }\n\n private expiredToken() {\n const connectionStatus = this.connectionStatus$.getValue();\n if (connectionStatus != ConnectionStatus.Ended && connectionStatus != ConnectionStatus.FailedToConnect)\n this.connectionStatus$.next(ConnectionStatus.ExpiredToken);\n\n const protectedConnectionStatus = this.expiredTokenExhaustion(this.connectionStatus$.getValue());\n this.connectionStatus$.next(protectedConnectionStatus);\n }\n\n private startConversation() {\n //if conversationid is set here, it means we need to call the reconnect api, else it is a new conversation\n const url = this.conversationId\n ? `${this.domain}/conversations/${this.conversationId}?watermark=${this.watermark}`\n : `${this.domain}/conversations`;\n const method = this.conversationId ? \"GET\" : \"POST\";\n\n return Observable.ajax({\n method,\n url,\n timeout,\n headers: {\n \"Accept\": \"application/json\",\n ...this.commonHeaders()\n }\n })\n// .do(ajaxResponse => konsole.log(\"conversation ajaxResponse\", ajaxResponse.response))\n .map(ajaxResponse => ajaxResponse.response as Conversation)\n .retryWhen(error$ =>\n // for now we deem 4xx and 5xx errors as unrecoverable\n // for everything else (timeouts), retry for a while\n error$.mergeMap(error => error.status >= 400 && error.status < 600\n ? Observable.throw(error)\n : Observable.of(error)\n )\n .delay(timeout)\n .take(retries)\n )\n }\n\n private refreshTokenLoop() {\n this.tokenRefreshSubscription = Observable.interval(intervalRefreshToken)\n .flatMap(_ => this.refreshToken())\n .subscribe(token => {\n konsole.log(\"refreshing token\", token, \"at\", new Date());\n this.token = token;\n });\n }\n\n private refreshToken() {\n return this.checkConnection(true)\n .flatMap(_ =>\n Observable.ajax({\n method: \"POST\",\n url: `${this.domain}/tokens/refresh`,\n timeout,\n headers: {\n ...this.commonHeaders()\n }\n })\n .map(ajaxResponse => ajaxResponse.response.token as string)\n .retryWhen(error$ => error$\n .mergeMap(error => {\n if (error.status === 403) {\n // if the token is expired there's no reason to keep trying\n this.expiredToken();\n return Observable.throw(error);\n } else if (error.status === 404) {\n // If the bot is gone, we should stop retrying\n return Observable.throw(error);\n }\n\n return Observable.of(error);\n })\n .delay(timeout)\n .take(retries)\n )\n )\n }\n\n public reconnect(conversation: Conversation) {\n this.token = conversation.token;\n this.streamUrl = conversation.streamUrl;\n if (this.connectionStatus$.getValue() === ConnectionStatus.ExpiredToken)\n this.connectionStatus$.next(ConnectionStatus.Online);\n }\n\n end() {\n if (this.tokenRefreshSubscription)\n this.tokenRefreshSubscription.unsubscribe();\n try {\n this.connectionStatus$.next(ConnectionStatus.Ended);\n } catch (e) {\n if (e === errorConversationEnded)\n return;\n throw(e);\n }\n }\n\n getSessionId(): Observable {\n // If we're not connected to the bot, get connected\n // Will throw an error if we are not connected\n konsole.log(\"getSessionId\");\n return this.checkConnection(true)\n .flatMap(_ =>\n Observable.ajax({\n method: \"GET\",\n url: `${this.domain}/session/getsessionid`,\n withCredentials: true,\n timeout,\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.commonHeaders()\n }\n })\n .map(ajaxResponse => {\n if (ajaxResponse && ajaxResponse.response && ajaxResponse.response.sessionId) {\n konsole.log(\"getSessionId response: \" + ajaxResponse.response.sessionId);\n return ajaxResponse.response.sessionId as string;\n }\n return '';\n })\n .catch(error => {\n konsole.log(\"getSessionId error: \" + error.status);\n return Observable.of('');\n })\n )\n .catch(error => this.catchExpiredToken(error));\n }\n\n postActivity(activity: Activity) {\n // Use postMessageWithAttachments for messages with attachments that are local files (e.g. an image to upload)\n // Technically we could use it for *all* activities, but postActivity is much lighter weight\n // So, since WebChat is partially a reference implementation of Direct Line, we implement both.\n if (activity.type === \"message\" && activity.attachments && activity.attachments.length > 0)\n return this.postMessageWithAttachments(activity);\n\n // If we're not connected to the bot, get connected\n // Will throw an error if we are not connected\n konsole.log(\"postActivity\", activity);\n return this.checkConnection(true)\n .flatMap(_ =>\n Observable.ajax({\n method: \"POST\",\n url: `${this.domain}/conversations/${this.conversationId}/activities`,\n body: activity,\n timeout,\n headers: {\n \"Content-Type\": \"application/json\",\n ...this.commonHeaders()\n },\n })\n .map(ajaxResponse => ajaxResponse.response.id as string)\n .catch(error => this.catchPostError(error))\n )\n .catch(error => this.catchExpiredToken(error));\n }\n\n private postMessageWithAttachments({ attachments, ... messageWithoutAttachments }: Message) {\n let formData: FormData;\n\n // If we're not connected to the bot, get connected\n // Will throw an error if we are not connected\n return this.checkConnection(true)\n .flatMap(_ => {\n // To send this message to DirectLine we need to deconstruct it into a \"template\" activity\n // and one blob for each attachment.\n formData = new FormData();\n formData.append('activity', new Blob([JSON.stringify(messageWithoutAttachments)], { type: 'application/vnd.microsoft.activity' }));\n\n return Observable.from(attachments || [])\n .flatMap((media: Media) =>\n Observable.ajax({\n method: \"GET\",\n url: media.contentUrl,\n responseType: 'arraybuffer'\n })\n .do(ajaxResponse =>\n formData.append('file', new Blob([ajaxResponse.response], { type: media.contentType }), media.name)\n )\n )\n .count()\n })\n .flatMap(_ =>\n Observable.ajax({\n method: \"POST\",\n url: `${this.domain}/conversations/${this.conversationId}/upload?userId=${messageWithoutAttachments.from.id}`,\n body: formData,\n timeout,\n headers: {\n ...this.commonHeaders()\n }\n })\n .map(ajaxResponse => ajaxResponse.response.id as string)\n .catch(error => this.catchPostError(error))\n )\n .catch(error => this.catchPostError(error));\n }\n\n private catchPostError(error: any) {\n if (error.status === 403)\n // token has expired (will fall through to return \"retry\")\n this.expiredToken();\n else if (error.status >= 400 && error.status < 500)\n // more unrecoverable errors\n return Observable.throw(error);\n return Observable.of(\"retry\");\n }\n\n private catchExpiredToken(error: any) {\n return error === errorExpiredToken\n ? Observable.of(\"retry\")\n : Observable.throw(error);\n }\n\n private pollingGetActivity$() {\n const poller$: Observable = Observable.create((subscriber: Subscriber) => {\n // A BehaviorSubject to trigger polling. Since it is a BehaviorSubject\n // the first event is produced immediately.\n const trigger$ = new BehaviorSubject({});\n\n trigger$.subscribe(() => {\n if (this.connectionStatus$.getValue() === ConnectionStatus.Online) {\n const startTimestamp = Date.now();\n\n Observable.ajax({\n headers: {\n Accept: 'application/json',\n ...this.commonHeaders()\n },\n method: 'GET',\n url: `${ this.domain }/conversations/${ this.conversationId }/activities?watermark=${ this.watermark }`,\n timeout\n }).subscribe(\n (result: AjaxResponse) => {\n subscriber.next(result);\n setTimeout(() => trigger$.next(null), Math.max(0, this.pollingInterval - Date.now() + startTimestamp));\n },\n (error: any) => {\n switch (error.status) {\n case 403:\n this.connectionStatus$.next(ConnectionStatus.ExpiredToken);\n setTimeout(() => trigger$.next(null), this.pollingInterval);\n break;\n\n case 404:\n this.connectionStatus$.next(ConnectionStatus.Ended);\n break;\n\n default:\n // propagate the error\n subscriber.error(error);\n break;\n }\n }\n );\n }\n });\n });\n\n return this.checkConnection()\n .flatMap(_ => poller$\n .catch(() => Observable.empty())\n .map(ajaxResponse => ajaxResponse.response as ActivityGroup)\n .flatMap(activityGroup => this.observableFromActivityGroup(activityGroup)));\n }\n\n private observableFromActivityGroup(activityGroup: ActivityGroup) {\n if (activityGroup.watermark)\n this.watermark = activityGroup.watermark;\n return Observable.from(activityGroup.activities);\n }\n\n private webSocketActivity$(): Observable {\n return this.checkConnection()\n .flatMap(_ =>\n this.observableWebSocket()\n // WebSockets can be closed by the server or the browser. In the former case we need to\n // retrieve a new streamUrl. In the latter case we could first retry with the current streamUrl,\n // but it's simpler just to always fetch a new one.\n .retryWhen(error$ => error$.delay(this.getRetryDelay()).mergeMap(error => this.reconnectToConversation()))\n )\n .flatMap(activityGroup => this.observableFromActivityGroup(activityGroup))\n }\n\n // Returns the delay duration in milliseconds\n private getRetryDelay() {\n return Math.floor(3000 + Math.random() * 12000);\n }\n\n // Originally we used Observable.webSocket, but it's fairly opionated and I ended up writing\n // a lot of code to work around their implemention details. Since WebChat is meant to be a reference\n // implementation, I decided roll the below, where the logic is more purposeful. - @billba\n private observableWebSocket() {\n return Observable.create((subscriber: Subscriber) => {\n konsole.log(\"creating WebSocket\", this.streamUrl);\n const ws = new WebSocket(this.streamUrl);\n let sub: Subscription;\n\n ws.onopen = open => {\n konsole.log(\"WebSocket open\", open);\n // Chrome is pretty bad at noticing when a WebSocket connection is broken.\n // If we periodically ping the server with empty messages, it helps Chrome\n // realize when connection breaks, and close the socket. We then throw an\n // error, and that give us the opportunity to attempt to reconnect.\n sub = Observable.interval(timeout).subscribe(_ => {\n try {\n ws.send(\"\")\n } catch(e) {\n konsole.log(\"Ping error\", e);\n }\n });\n }\n\n ws.onclose = close => {\n konsole.log(\"WebSocket close\", close);\n if (sub) sub.unsubscribe();\n subscriber.error(close);\n }\n\n ws.onmessage = message => message.data && subscriber.next(JSON.parse(message.data));\n\n // This is the 'unsubscribe' method, which is called when this observable is disposed.\n // When the WebSocket closes itself, we throw an error, and this function is eventually called.\n // When the observable is closed first (e.g. when tearing down a WebChat instance) then\n // we need to manually close the WebSocket.\n return () => {\n if (ws.readyState === 0 || ws.readyState === 1) ws.close();\n }\n }) as Observable\n }\n\n private reconnectToConversation() {\n return this.checkConnection(true)\n .flatMap(_ =>\n Observable.ajax({\n method: \"GET\",\n url: `${this.domain}/conversations/${this.conversationId}?watermark=${this.watermark}`,\n timeout,\n headers: {\n \"Accept\": \"application/json\",\n ...this.commonHeaders()\n }\n })\n .do(result => {\n if (!this.secret)\n this.token = result.response.token;\n this.streamUrl = result.response.streamUrl;\n })\n .map(_ => null)\n .retryWhen(error$ => error$\n .mergeMap(error => {\n if (error.status === 403) {\n // token has expired. We can't recover from this here, but the embedding\n // website might eventually call reconnect() with a new token and streamUrl.\n this.expiredToken();\n } else if (error.status === 404) {\n return Observable.throw(errorConversationEnded);\n }\n\n return Observable.of(error);\n })\n .delay(timeout)\n .take(retries)\n )\n )\n }\n\n private commonHeaders() {\n return {\n \"Authorization\": `Bearer ${this.token}`,\n \"x-ms-bot-agent\": this._botAgent\n };\n }\n\n private getBotAgent(customAgent: string = ''): string {\n let clientAgent = 'directlinejs'\n\n if (customAgent) {\n clientAgent += `; ${customAgent}`\n }\n\n return `${DIRECT_LINE_VERSION} (${clientAgent})`;\n }\n}\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\n\nmodule.exports = _interopRequireDefault;","var objectWithoutPropertiesLoose = require(\"./objectWithoutPropertiesLoose\");\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutProperties;","function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;","var defineProperty = require(\"./defineProperty\");\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nmodule.exports = _objectSpread;","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, ISubscription } from './Subscription';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\n\n/**\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n if (subscription && !(subscription).closed) {\n subscriber.next(this._value);\n }\n return subscription;\n }\n\n getValue(): T {\n if (this.hasError) {\n throw this.thrownError;\n } else if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else {\n return this._value;\n }\n }\n\n next(value: T): void {\n super.next(this._value = value);\n }\n}\n","import { Operator } from './Operator';\nimport { Observer } from './Observer';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { ISubscription, Subscription, TeardownLogic } from './Subscription';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { SubjectSubscription } from './SubjectSubscription';\nimport { rxSubscriber as rxSubscriberSymbol } from './symbol/rxSubscriber';\n\n/**\n * @class SubjectSubscriber\n */\nexport class SubjectSubscriber extends Subscriber {\n constructor(protected destination: Subject) {\n super(destination);\n }\n}\n\n/**\n * @class Subject\n */\nexport class Subject extends Observable implements ISubscription {\n\n [rxSubscriberSymbol]() {\n return new SubjectSubscriber(this);\n }\n\n observers: Observer[] = [];\n\n closed = false;\n\n isStopped = false;\n\n hasError = false;\n\n thrownError: any = null;\n\n constructor() {\n super();\n }\n\n static create: Function = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n }\n\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator;\n return subject;\n }\n\n next(value?: T) {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n if (!this.isStopped) {\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].next(value);\n }\n }\n }\n\n error(err: any) {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n this.hasError = true;\n this.thrownError = err;\n this.isStopped = true;\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].error(err);\n }\n this.observers.length = 0;\n }\n\n complete() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n this.isStopped = true;\n const { observers } = this;\n const len = observers.length;\n const copy = observers.slice();\n for (let i = 0; i < len; i++) {\n copy[i].complete();\n }\n this.observers.length = 0;\n }\n\n unsubscribe() {\n this.isStopped = true;\n this.closed = true;\n this.observers = null;\n }\n\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else {\n return super._trySubscribe(subscriber);\n }\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): Subscription {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n } else if (this.hasError) {\n subscriber.error(this.thrownError);\n return Subscription.EMPTY;\n } else if (this.isStopped) {\n subscriber.complete();\n return Subscription.EMPTY;\n } else {\n this.observers.push(subscriber);\n return new SubjectSubscription(this, subscriber);\n }\n }\n\n asObservable(): Observable {\n const observable = new Observable();\n (observable).source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(protected destination?: Observer, source?: Observable) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n const { destination } = this;\n if (destination && destination.next) {\n destination.next(value);\n }\n }\n\n error(err: any) {\n const { destination } = this;\n if (destination && destination.error) {\n this.destination.error(err);\n }\n }\n\n complete() {\n const { destination } = this;\n if (destination && destination.complete) {\n this.destination.complete();\n }\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): Subscription {\n const { source } = this;\n if (source) {\n return this.source.subscribe(subscriber);\n } else {\n return Subscription.EMPTY;\n }\n }\n}\n","import { PartialObserver } from './Observer';\nimport { Operator } from './Operator';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, AnonymousSubscription, TeardownLogic } from './Subscription';\nimport { root } from './util/root';\nimport { toSubscriber } from './util/toSubscriber';\nimport { IfObservable } from './observable/IfObservable';\nimport { ErrorObservable } from './observable/ErrorObservable';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { OperatorFunction } from './interfaces';\nimport { pipeFromArray } from './util/pipe';\n\nexport interface Subscribable {\n subscribe(observerOrNext?: PartialObserver | ((value: T) => void),\n error?: (error: any) => void,\n complete?: () => void): AnonymousSubscription;\n}\n\nexport type SubscribableOrPromise = Subscribable | PromiseLike;\nexport type ObservableInput = SubscribableOrPromise | ArrayLike;\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n\n public _isScalar: boolean = false;\n\n /** @deprecated internal use only */ public source: Observable;\n protected operator: Operator;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new cold Observable by calling the Observable constructor\n * @static true\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new cold observable\n */\n static create: Function = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n }\n\n /**\n * Creates a new Observable, with this Observable as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param {Operator} operator the operator defining the operation to take on the observable\n * @return {Observable} a new observable with the Operator applied\n */\n lift(operator: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observer?: PartialObserver): Subscription;\n subscribe(next?: (value: T) => void, error?: (error: any) => void, complete?: () => void): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to a {@link create} static factory, but most of the time it is\n * a library implementation, which defines what and when will be emitted by an Observable. This means that calling\n * `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, that if `error` method is not provided, all errors will\n * be left uncaught.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where first function is equivalent\n * of a `next` method, second of an `error` method and third of a `complete` method. Just as in case of Observer,\n * if you do not need to listen for something, you can omit a function, preferably by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to `error` function, just as before, if not provided, errors emitted by an Observable will be thrown.\n *\n * Whatever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a {@link Scheduler}.\n *\n * @example Subscribe with an Observer\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() { // We actually could just remove this method,\n * }, // since we do not really care about errors right now.\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * Rx.Observable.of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // \"Adding: 1\"\n * // \"Adding: 2\"\n * // \"Adding: 3\"\n * // \"Sum equals: 6\"\n *\n *\n * @example Subscribe with functions\n * let sum = 0;\n *\n * Rx.Observable.of(1, 2, 3)\n * .subscribe(\n * function(value) {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * function() {\n * console.log('Sum equals: ' + sum);\n * }\n * );\n *\n * // Logs:\n * // \"Adding: 1\"\n * // \"Adding: 2\"\n * // \"Adding: 3\"\n * // \"Sum equals: 6\"\n *\n *\n * @example Cancel a subscription\n * const subscription = Rx.Observable.interval(1000).subscribe(\n * num => console.log(num),\n * undefined,\n * () => console.log('completed!') // Will not be called, even\n * ); // when cancelling subscription\n *\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // \"unsubscribed!\" after 2.5s\n *\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {ISubscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(observerOrNext?: PartialObserver | ((value: T) => void),\n error?: (error: any) => void,\n complete?: () => void): Subscription {\n\n const { operator } = this;\n const sink = toSubscriber(observerOrNext, error, complete);\n\n if (operator) {\n operator.call(sink, this.source);\n } else {\n sink.add(this.source || !sink.syncErrorThrowable ? this._subscribe(sink) : this._trySubscribe(sink));\n }\n\n if (sink.syncErrorThrowable) {\n sink.syncErrorThrowable = false;\n if (sink.syncErrorThrown) {\n throw sink.syncErrorValue;\n }\n }\n\n return sink;\n }\n\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n sink.syncErrorThrown = true;\n sink.syncErrorValue = err;\n sink.error(err);\n }\n }\n\n /**\n * @method forEach\n * @param {Function} next a handler for each value emitted by the observable\n * @param {PromiseConstructor} [PromiseCtor] a constructor function used to instantiate the Promise\n * @return {Promise} a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void, PromiseCtor?: typeof Promise): Promise {\n if (!PromiseCtor) {\n if (root.Rx && root.Rx.config && root.Rx.config.Promise) {\n PromiseCtor = root.Rx.config.Promise;\n } else if (root.Promise) {\n PromiseCtor = root.Promise;\n }\n }\n\n if (!PromiseCtor) {\n throw new Error('no Promise impl found');\n }\n\n return new PromiseCtor((resolve, reject) => {\n // Must be declared in a separate statement to avoid a RefernceError when\n // accessing subscription below in the closure due to Temporal Dead Zone.\n let subscription: Subscription;\n subscription = this.subscribe((value) => {\n if (subscription) {\n // if there is a subscription, then we can surmise\n // the next handling is asynchronous. Any errors thrown\n // need to be rejected explicitly and unsubscribe must be\n // called manually\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscription.unsubscribe();\n }\n } else {\n // if there is NO subscription, then we're getting a nexted\n // value synchronously during subscription. We can just call it.\n // If it errors, Observable's `subscribe` will ensure the\n // unsubscription logic is called, then synchronously rethrow the error.\n // After that, Promise will trap the error and send it\n // down the rejection path.\n next(value);\n }\n }, reject, resolve);\n });\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source.subscribe(subscriber);\n }\n\n // `if` and `throw` are special snow flakes, the compiler sees them as reserved words\n static if: typeof IfObservable.create;\n static throw: typeof ErrorObservable.create;\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable\n pipe(op1: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction): Observable\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction, op4: OperatorFunction, op5: OperatorFunction, op6: OperatorFunction, op7: OperatorFunction, op8: OperatorFunction, op9: OperatorFunction): Observable\n pipe(...operations: OperatorFunction[]): Observable\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * @example\n *\n * import { map, filter, scan } from 'rxjs/operators';\n *\n * Rx.Observable.interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x))\n */\n pipe(...operations: OperatorFunction[]): Observable {\n if (operations.length === 0) {\n return this as any;\n }\n\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n toPromise(this: Observable): Promise;\n toPromise(this: Observable, PromiseCtor: typeof Promise): Promise;\n toPromise(this: Observable, PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n toPromise(PromiseCtor?: PromiseConstructorLike) {\n if (!PromiseCtor) {\n if (root.Rx && root.Rx.config && root.Rx.config.Promise) {\n PromiseCtor = root.Rx.config.Promise;\n } else if (root.Promise) {\n PromiseCtor = root.Promise;\n }\n }\n\n if (!PromiseCtor) {\n throw new Error('no Promise impl found');\n }\n\n return new PromiseCtor((resolve, reject) => {\n let value: any;\n this.subscribe((x: T) => value = x, (err: any) => reject(err), () => resolve(value));\n }) as Promise;\n }\n}\n","declare let global: any;\n\n/**\n * @license\n * Copyright Google Inc. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\ndeclare var WorkerGlobalScope: any;\n// CommonJS / Node have global context exposed as \"global\" variable.\n// We don't want to include the whole node.d.ts this this compilation unit so we'll just fake\n// the global \"global\" var for now.\n\nconst __window = typeof window !== 'undefined' && window;\nconst __self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' &&\n self instanceof WorkerGlobalScope && self;\nconst __global = typeof global !== 'undefined' && global;\nconst _root: any = __window || __global || __self;\n\n// Workaround Closure Compiler restriction: The body of a goog.module cannot use throw.\n// This is needed when used with angular/tsickle which inserts a goog.module statement.\n// Wrap in IIFE\n(function () {\n if (!_root) {\n throw new Error('RxJS could not find any global context (window, self, global)');\n }\n})();\n\nexport { _root as root };","import { Subscriber } from '../Subscriber';\nimport { rxSubscriber as rxSubscriberSymbol } from '../symbol/rxSubscriber';\nimport { PartialObserver, empty as emptyObserver } from '../Observer';\n\nexport function toSubscriber(\n nextOrObserver?: PartialObserver | ((value: T) => void),\n error?: (error: any) => void,\n complete?: () => void): Subscriber {\n\n if (nextOrObserver) {\n if (nextOrObserver instanceof Subscriber) {\n return (> nextOrObserver);\n }\n\n if (nextOrObserver[rxSubscriberSymbol]) {\n return nextOrObserver[rxSubscriberSymbol]();\n }\n }\n\n if (!nextOrObserver && !error && !complete) {\n return new Subscriber(emptyObserver);\n }\n\n return new Subscriber(nextOrObserver, error, complete);\n}\n","import { isFunction } from './util/isFunction';\nimport { Observer, PartialObserver } from './Observer';\nimport { Subscription } from './Subscription';\nimport { empty as emptyObserver } from './Observer';\nimport { rxSubscriber as rxSubscriberSymbol } from './symbol/rxSubscriber';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n\n [rxSubscriberSymbol]() { return this; }\n\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param {function(x: ?T): void} [next] The `next` callback of an Observer.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n * @return {Subscriber} A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n */\n static create(next?: (x?: T) => void,\n error?: (e?: any) => void,\n complete?: () => void): Subscriber {\n const subscriber = new Subscriber(next, error, complete);\n subscriber.syncErrorThrowable = false;\n return subscriber;\n }\n\n public syncErrorValue: any = null;\n public syncErrorThrown: boolean = false;\n public syncErrorThrowable: boolean = false;\n\n protected isStopped: boolean = false;\n protected destination: PartialObserver; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @param {Observer|function(value: T): void} [destinationOrNext] A partially\n * defined Observer or a `next` callback function.\n * @param {function(e: ?any): void} [error] The `error` callback of an\n * Observer.\n * @param {function(): void} [complete] The `complete` callback of an\n * Observer.\n */\n constructor(destinationOrNext?: PartialObserver | ((value: T) => void),\n error?: (e?: any) => void,\n complete?: () => void) {\n super();\n\n switch (arguments.length) {\n case 0:\n this.destination = emptyObserver;\n break;\n case 1:\n if (!destinationOrNext) {\n this.destination = emptyObserver;\n break;\n }\n if (typeof destinationOrNext === 'object') {\n // HACK(benlesh): To resolve an issue where Node users may have multiple\n // copies of rxjs in their node_modules directory.\n if (isTrustedSubscriber(destinationOrNext)) {\n const trustedSubscriber = destinationOrNext[rxSubscriberSymbol]() as Subscriber;\n this.syncErrorThrowable = trustedSubscriber.syncErrorThrowable;\n this.destination = trustedSubscriber;\n trustedSubscriber.add(this);\n } else {\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, > destinationOrNext);\n }\n break;\n }\n default:\n this.syncErrorThrowable = true;\n this.destination = new SafeSubscriber(this, <((value: T) => void)> destinationOrNext, error, complete);\n break;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (!this.isStopped) {\n this._next(value);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached {@link Error}. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (!this.isStopped) {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (!this.isStopped) {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (this.closed) {\n return;\n }\n this.isStopped = true;\n super.unsubscribe();\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n this.destination.error(err);\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.destination.complete();\n this.unsubscribe();\n }\n\n /** @deprecated internal use only */ _unsubscribeAndRecycle(): Subscriber {\n const { _parent, _parents } = this;\n this._parent = null;\n this._parents = null;\n this.unsubscribe();\n this.closed = false;\n this.isStopped = false;\n this._parent = _parent;\n this._parents = _parents;\n return this;\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass SafeSubscriber extends Subscriber {\n\n private _context: any;\n\n constructor(private _parentSubscriber: Subscriber,\n observerOrNext?: PartialObserver | ((value: T) => void),\n error?: (e?: any) => void,\n complete?: () => void) {\n super();\n\n let next: ((value: T) => void);\n let context: any = this;\n\n if (isFunction(observerOrNext)) {\n next = (<((value: T) => void)> observerOrNext);\n } else if (observerOrNext) {\n next = (> observerOrNext).next;\n error = (> observerOrNext).error;\n complete = (> observerOrNext).complete;\n if (observerOrNext !== emptyObserver) {\n context = Object.create(observerOrNext);\n if (isFunction(context.unsubscribe)) {\n this.add(<() => void> context.unsubscribe.bind(context));\n }\n context.unsubscribe = this.unsubscribe.bind(this);\n }\n }\n\n this._context = context;\n this._next = next;\n this._error = error;\n this._complete = complete;\n }\n\n next(value?: T): void {\n if (!this.isStopped && this._next) {\n const { _parentSubscriber } = this;\n if (!_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(this._next, value);\n } else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {\n this.unsubscribe();\n }\n }\n }\n\n error(err?: any): void {\n if (!this.isStopped) {\n const { _parentSubscriber } = this;\n if (this._error) {\n if (!_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(this._error, err);\n this.unsubscribe();\n } else {\n this.__tryOrSetError(_parentSubscriber, this._error, err);\n this.unsubscribe();\n }\n } else if (!_parentSubscriber.syncErrorThrowable) {\n this.unsubscribe();\n throw err;\n } else {\n _parentSubscriber.syncErrorValue = err;\n _parentSubscriber.syncErrorThrown = true;\n this.unsubscribe();\n }\n }\n }\n\n complete(): void {\n if (!this.isStopped) {\n const { _parentSubscriber } = this;\n if (this._complete) {\n const wrappedComplete = () => this._complete.call(this._context);\n\n if (!_parentSubscriber.syncErrorThrowable) {\n this.__tryOrUnsub(wrappedComplete);\n this.unsubscribe();\n } else {\n this.__tryOrSetError(_parentSubscriber, wrappedComplete);\n this.unsubscribe();\n }\n } else {\n this.unsubscribe();\n }\n }\n }\n\n private __tryOrUnsub(fn: Function, value?: any): void {\n try {\n fn.call(this._context, value);\n } catch (err) {\n this.unsubscribe();\n throw err;\n }\n }\n\n private __tryOrSetError(parent: Subscriber, fn: Function, value?: any): boolean {\n try {\n fn.call(this._context, value);\n } catch (err) {\n parent.syncErrorValue = err;\n parent.syncErrorThrown = true;\n return true;\n }\n return false;\n }\n\n /** @deprecated internal use only */ _unsubscribe(): void {\n const { _parentSubscriber } = this;\n this._context = null;\n this._parentSubscriber = null;\n _parentSubscriber.unsubscribe();\n }\n}\n\nfunction isTrustedSubscriber(obj: any) {\n return obj instanceof Subscriber || ('syncErrorThrowable' in obj && obj[rxSubscriberSymbol]);\n}\n","export function isFunction(x: any): x is Function {\n return typeof x === 'function';\n}\n","import { isArray } from './util/isArray';\nimport { isObject } from './util/isObject';\nimport { isFunction } from './util/isFunction';\nimport { tryCatch } from './util/tryCatch';\nimport { errorObject } from './util/errorObject';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\n\nexport interface AnonymousSubscription {\n unsubscribe(): void;\n}\n\nexport type TeardownLogic = AnonymousSubscription | Function | void;\n\nexport interface ISubscription extends AnonymousSubscription {\n unsubscribe(): void;\n readonly closed: boolean;\n}\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements ISubscription {\n public static EMPTY: Subscription = (function(empty: any){\n empty.closed = true;\n return empty;\n }(new Subscription()));\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n * @type {boolean}\n */\n public closed: boolean = false;\n\n protected _parent: Subscription = null;\n protected _parents: Subscription[] = null;\n private _subscriptions: ISubscription[] = null;\n\n /**\n * @param {function(): void} [unsubscribe] A function describing how to\n * perform the disposal of resources when the `unsubscribe` method is called.\n */\n constructor(unsubscribe?: () => void) {\n if (unsubscribe) {\n ( this)._unsubscribe = unsubscribe;\n }\n }\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let hasErrors = false;\n let errors: any[];\n\n if (this.closed) {\n return;\n }\n\n let { _parent, _parents, _unsubscribe, _subscriptions } = ( this);\n\n this.closed = true;\n this._parent = null;\n this._parents = null;\n // null out _subscriptions first so any child subscriptions that attempt\n // to remove themselves from this subscription will noop\n this._subscriptions = null;\n\n let index = -1;\n let len = _parents ? _parents.length : 0;\n\n // if this._parent is null, then so is this._parents, and we\n // don't have to remove ourselves from any parent subscriptions.\n while (_parent) {\n _parent.remove(this);\n // if this._parents is null or index >= len,\n // then _parent is set to null, and the loop exits\n _parent = ++index < len && _parents[index] || null;\n }\n\n if (isFunction(_unsubscribe)) {\n let trial = tryCatch(_unsubscribe).call(this);\n if (trial === errorObject) {\n hasErrors = true;\n errors = errors || (\n errorObject.e instanceof UnsubscriptionError ?\n flattenUnsubscriptionErrors(errorObject.e.errors) : [errorObject.e]\n );\n }\n }\n\n if (isArray(_subscriptions)) {\n\n index = -1;\n len = _subscriptions.length;\n\n while (++index < len) {\n const sub = _subscriptions[index];\n if (isObject(sub)) {\n let trial = tryCatch(sub.unsubscribe).call(sub);\n if (trial === errorObject) {\n hasErrors = true;\n errors = errors || [];\n let err = errorObject.e;\n if (err instanceof UnsubscriptionError) {\n errors = errors.concat(flattenUnsubscriptionErrors(err.errors));\n } else {\n errors.push(err);\n }\n }\n }\n }\n }\n\n if (hasErrors) {\n throw new UnsubscriptionError(errors);\n }\n }\n\n /**\n * Adds a tear down to be called during the unsubscribe() of this\n * Subscription.\n *\n * If the tear down being added is a subscription that is already\n * unsubscribed, is the same reference `add` is being called on, or is\n * `Subscription.EMPTY`, it will not be added.\n *\n * If this subscription is already in an `closed` state, the passed\n * tear down logic will be executed immediately.\n *\n * @param {TeardownLogic} teardown The additional logic to execute on\n * teardown.\n * @return {Subscription} Returns the Subscription used or created to be\n * added to the inner subscriptions list. This Subscription can be used with\n * `remove()` to remove the passed teardown logic from the inner subscriptions\n * list.\n */\n add(teardown: TeardownLogic): Subscription {\n if (!teardown || (teardown === Subscription.EMPTY)) {\n return Subscription.EMPTY;\n }\n\n if (teardown === this) {\n return this;\n }\n\n let subscription = ( teardown);\n\n switch (typeof teardown) {\n case 'function':\n subscription = new Subscription(<(() => void) > teardown);\n case 'object':\n if (subscription.closed || typeof subscription.unsubscribe !== 'function') {\n return subscription;\n } else if (this.closed) {\n subscription.unsubscribe();\n return subscription;\n } else if (typeof subscription._addParent !== 'function' /* quack quack */) {\n const tmp = subscription;\n subscription = new Subscription();\n subscription._subscriptions = [tmp];\n }\n break;\n default:\n throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');\n }\n\n const subscriptions = this._subscriptions || (this._subscriptions = []);\n\n subscriptions.push(subscription);\n subscription._addParent(this);\n\n return subscription;\n }\n\n /**\n * Removes a Subscription from the internal list of subscriptions that will\n * unsubscribe during the unsubscribe process of this Subscription.\n * @param {Subscription} subscription The subscription to remove.\n * @return {void}\n */\n remove(subscription: Subscription): void {\n const subscriptions = this._subscriptions;\n if (subscriptions) {\n const subscriptionIndex = subscriptions.indexOf(subscription);\n if (subscriptionIndex !== -1) {\n subscriptions.splice(subscriptionIndex, 1);\n }\n }\n }\n\n private _addParent(parent: Subscription) {\n let { _parent, _parents } = this;\n if (!_parent || _parent === parent) {\n // If we don't have a parent, or the new parent is the same as the\n // current parent, then set this._parent to the new parent.\n this._parent = parent;\n } else if (!_parents) {\n // If there's already one parent, but not multiple, allocate an Array to\n // store the rest of the parent Subscriptions.\n this._parents = [parent];\n } else if (_parents.indexOf(parent) === -1) {\n // Only add the new parent to the _parents list if it's not already there.\n _parents.push(parent);\n }\n }\n}\n\nfunction flattenUnsubscriptionErrors(errors: any[]) {\n return errors.reduce((errs, err) => errs.concat((err instanceof UnsubscriptionError) ? err.errors : err), []);\n}\n","export const isArray = Array.isArray || ((x: any): x is T[] => x && typeof x.length === 'number');\n","export function isObject(x: any): x is Object {\n return x != null && typeof x === 'object';\n}\n","import { errorObject } from './errorObject';\n\nlet tryCatchTarget: Function;\n\nfunction tryCatcher(this: any): any {\n try {\n return tryCatchTarget.apply(this, arguments);\n } catch (e) {\n errorObject.e = e;\n return errorObject;\n }\n}\n\nexport function tryCatch(fn: T): T {\n tryCatchTarget = fn;\n return tryCatcher;\n};\n","// typeof any so that it we don't have to cast when comparing a result to the error object\nexport const errorObject: any = { e: {} };","/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport class UnsubscriptionError extends Error {\n constructor(public errors: any[]) {\n super();\n const err: any = Error.call(this, errors ?\n `${errors.length} errors occurred during unsubscription:\n ${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}` : '');\n ( this).name = err.name = 'UnsubscriptionError';\n ( this).stack = err.stack;\n ( this).message = err.message;\n }\n}\n","export interface NextObserver {\n closed?: boolean;\n next: (value: T) => void;\n error?: (err: any) => void;\n complete?: () => void;\n}\n\nexport interface ErrorObserver {\n closed?: boolean;\n next?: (value: T) => void;\n error: (err: any) => void;\n complete?: () => void;\n}\n\nexport interface CompletionObserver {\n closed?: boolean;\n next?: (value: T) => void;\n error?: (err: any) => void;\n complete: () => void;\n}\n\nexport type PartialObserver = NextObserver | ErrorObserver | CompletionObserver;\n\nexport interface Observer {\n closed?: boolean;\n next: (value: T) => void;\n error: (err: any) => void;\n complete: () => void;\n}\n\nexport const empty: Observer = {\n closed: true,\n next(value: any): void { /* noop */},\n error(err: any): void { throw err; },\n complete(): void { /*noop*/ }\n};\n","import { root } from '../util/root';\n\nconst Symbol: any = root.Symbol;\n\nexport const rxSubscriber = (typeof Symbol === 'function' && typeof Symbol.for === 'function') ?\n Symbol.for('rxSubscriber') : '@@rxSubscriber';\n\n/**\n * @deprecated use rxSubscriber instead\n */\nexport const $$rxSubscriber = rxSubscriber;\n","import { root } from '../util/root';\n\nexport function getSymbolObservable(context: any) {\n let $$observable: any;\n let Symbol = context.Symbol;\n\n if (typeof Symbol === 'function') {\n if (Symbol.observable) {\n $$observable = Symbol.observable;\n } else {\n $$observable = Symbol('observable');\n Symbol.observable = $$observable;\n }\n } else {\n $$observable = '@@observable';\n }\n\n return $$observable;\n}\n\nexport const observable = getSymbolObservable(root);\n\n/**\n * @deprecated use observable instead\n */\nexport const $$observable = observable;\n","import { noop } from './noop';\nimport { UnaryFunction } from '../interfaces';\n\n/* tslint:disable:max-line-length */\nexport function pipe(): UnaryFunction;\nexport function pipe(op1: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction, op3: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction, op3: UnaryFunction, op4: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction, op3: UnaryFunction, op4: UnaryFunction, op5: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction, op3: UnaryFunction, op4: UnaryFunction, op5: UnaryFunction, op6: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction, op3: UnaryFunction, op4: UnaryFunction, op5: UnaryFunction, op6: UnaryFunction, op7: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction, op3: UnaryFunction, op4: UnaryFunction, op5: UnaryFunction, op6: UnaryFunction, op7: UnaryFunction, op8: UnaryFunction): UnaryFunction;\nexport function pipe(op1: UnaryFunction, op2: UnaryFunction, op3: UnaryFunction, op4: UnaryFunction, op5: UnaryFunction, op6: UnaryFunction, op7: UnaryFunction, op8: UnaryFunction, op9: UnaryFunction): UnaryFunction;\n/* tslint:enable:max-line-length */\n\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/* @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (!fns) {\n return noop as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input);\n };\n}\n","/* tslint:disable:no-empty */\nexport function noop() { }\n","/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport class ObjectUnsubscribedError extends Error {\n constructor() {\n const err: any = super('object unsubscribed');\n ( this).name = err.name = 'ObjectUnsubscribedError';\n ( this).stack = err.stack;\n ( this).message = err.message;\n }\n}\n","import { Subject } from './Subject';\nimport { Observer } from './Observer';\nimport { Subscription } from './Subscription';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class SubjectSubscription extends Subscription {\n closed: boolean = false;\n\n constructor(public subject: Subject, public subscriber: Observer) {\n super();\n }\n\n unsubscribe() {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n\n const subject = this.subject;\n const observers = subject.observers;\n\n this.subject = null;\n\n if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n return;\n }\n\n const subscriberIndex = observers.indexOf(this.subscriber);\n\n if (subscriberIndex !== -1) {\n observers.splice(subscriberIndex, 1);\n }\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { _catch } from '../../operator/catch';\n\nObservable.prototype.catch = _catch;\nObservable.prototype._catch = _catch;\n\ndeclare module '../../Observable' {\n interface Observable {\n catch: typeof _catch;\n _catch: typeof _catch;\n }\n}","\nimport { Observable, ObservableInput } from '../Observable';\nimport { catchError as higherOrder } from '../operators/catchError';\n\n/**\n * Catches errors on the observable to be handled by returning a new observable or throwing an error.\n *\n * \n *\n * @example Continues with a different Observable when there's an error\n *\n * Observable.of(1, 2, 3, 4, 5)\n * .map(n => {\n * \t if (n == 4) {\n * \t throw 'four!';\n * }\n *\t return n;\n * })\n * .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V'))\n * .subscribe(x => console.log(x));\n * // 1, 2, 3, I, II, III, IV, V\n *\n * @example Retries the caught source Observable again in case of error, similar to retry() operator\n *\n * Observable.of(1, 2, 3, 4, 5)\n * .map(n => {\n * \t if (n === 4) {\n * \t throw 'four!';\n * }\n * \t return n;\n * })\n * .catch((err, caught) => caught)\n * .take(30)\n * .subscribe(x => console.log(x));\n * // 1, 2, 3, 1, 2, 3, ...\n *\n * @example Throws a new error when the source Observable throws an error\n *\n * Observable.of(1, 2, 3, 4, 5)\n * .map(n => {\n * if (n == 4) {\n * throw 'four!';\n * }\n * return n;\n * })\n * .catch(err => {\n * throw 'error in source. Details: ' + err;\n * })\n * .subscribe(\n * x => console.log(x),\n * err => console.log(err)\n * );\n * // 1, 2, 3, error in source. Details: four!\n *\n * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which\n * is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable\n * is returned by the `selector` will be used to continue the observable chain.\n * @return {Observable} An observable that originates from either the source or the observable returned by the\n * catch `selector` function.\n * @method catch\n * @name catch\n * @owner Observable\n */\nexport function _catch(this: Observable, selector: (err: any, caught: Observable) => ObservableInput): Observable {\n return higherOrder(selector)(this);\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable, ObservableInput } from '../Observable';\n\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { OperatorFunction } from '../interfaces';\n\n/**\n * Catches errors on the observable to be handled by returning a new observable or throwing an error.\n *\n * \n *\n * @example Continues with a different Observable when there's an error\n *\n * Observable.of(1, 2, 3, 4, 5)\n * .map(n => {\n * \t if (n == 4) {\n * \t throw 'four!';\n * }\n *\t return n;\n * })\n * .catch(err => Observable.of('I', 'II', 'III', 'IV', 'V'))\n * .subscribe(x => console.log(x));\n * // 1, 2, 3, I, II, III, IV, V\n *\n * @example Retries the caught source Observable again in case of error, similar to retry() operator\n *\n * Observable.of(1, 2, 3, 4, 5)\n * .map(n => {\n * \t if (n === 4) {\n * \t throw 'four!';\n * }\n * \t return n;\n * })\n * .catch((err, caught) => caught)\n * .take(30)\n * .subscribe(x => console.log(x));\n * // 1, 2, 3, 1, 2, 3, ...\n *\n * @example Throws a new error when the source Observable throws an error\n *\n * Observable.of(1, 2, 3, 4, 5)\n * .map(n => {\n * if (n == 4) {\n * throw 'four!';\n * }\n * return n;\n * })\n * .catch(err => {\n * throw 'error in source. Details: ' + err;\n * })\n * .subscribe(\n * x => console.log(x),\n * err => console.log(err)\n * );\n * // 1, 2, 3, error in source. Details: four!\n *\n * @param {function} selector a function that takes as arguments `err`, which is the error, and `caught`, which\n * is the source observable, in case you'd like to \"retry\" that observable by returning it again. Whatever observable\n * is returned by the `selector` will be used to continue the observable chain.\n * @return {Observable} An observable that originates from either the source or the observable returned by the\n * catch `selector` function.\n * @name catchError\n */\nexport function catchError(selector: (err: any, caught: Observable) => ObservableInput): OperatorFunction {\n return function catchErrorOperatorFunction(source: Observable): Observable {\n const operator = new CatchOperator(selector);\n const caught = source.lift(operator);\n return (operator.caught = caught as Observable);\n };\n}\n\nclass CatchOperator implements Operator {\n caught: Observable;\n\n constructor(private selector: (err: any, caught: Observable) => ObservableInput) {\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass CatchSubscriber extends OuterSubscriber {\n constructor(destination: Subscriber,\n private selector: (err: any, caught: Observable) => ObservableInput,\n private caught: Observable) {\n super(destination);\n }\n\n // NOTE: overriding `error` instead of `_error` because we don't want\n // to have this flag this subscriber as `isStopped`. We can mimic the\n // behavior of the RetrySubscriber (from the `retry` operator), where\n // we unsubscribe from our source chain, reset our Subscriber flags,\n // then subscribe to the selector result.\n error(err: any) {\n if (!this.isStopped) {\n let result: any;\n try {\n result = this.selector(err, this.caught);\n } catch (err2) {\n super.error(err2);\n return;\n }\n this._unsubscribeAndRecycle();\n this.add(subscribeToResult(this, result));\n }\n }\n}\n","import { Subscriber } from './Subscriber';\nimport { InnerSubscriber } from './InnerSubscriber';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class OuterSubscriber extends Subscriber {\n notifyNext(outerValue: T, innerValue: R,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n this.destination.next(innerValue);\n }\n\n notifyError(error: any, innerSub: InnerSubscriber): void {\n this.destination.error(error);\n }\n\n notifyComplete(innerSub: InnerSubscriber): void {\n this.destination.complete();\n }\n}\n","import { root } from './root';\nimport { isArrayLike } from './isArrayLike';\nimport { isPromise } from './isPromise';\nimport { isObject } from './isObject';\nimport { Subscriber } from '../Subscriber';\nimport { Observable, ObservableInput } from '../Observable';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { Subscription } from '../Subscription';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { observable as Symbol_observable } from '../symbol/observable';\n\nexport function subscribeToResult(outerSubscriber: OuterSubscriber,\n result: any,\n outerValue?: T,\n outerIndex?: number): Subscription;\nexport function subscribeToResult(outerSubscriber: OuterSubscriber,\n result: ObservableInput,\n outerValue?: T,\n outerIndex?: number): Subscription {\n let destination: Subscriber = new InnerSubscriber(outerSubscriber, outerValue, outerIndex);\n\n if (destination.closed) {\n return null;\n }\n\n if (result instanceof Observable) {\n if (result._isScalar) {\n destination.next((result).value);\n destination.complete();\n return null;\n } else {\n destination.syncErrorThrowable = true;\n return result.subscribe(destination);\n }\n } else if (isArrayLike(result)) {\n for (let i = 0, len = result.length; i < len && !destination.closed; i++) {\n destination.next(result[i]);\n }\n if (!destination.closed) {\n destination.complete();\n }\n } else if (isPromise(result)) {\n result.then(\n (value) => {\n if (!destination.closed) {\n destination.next(value);\n destination.complete();\n }\n },\n (err: any) => destination.error(err)\n )\n .then(null, (err: any) => {\n // Escaping the Promise trap: globally throw unhandled errors\n root.setTimeout(() => { throw err; });\n });\n return destination;\n } else if (result && typeof result[Symbol_iterator] === 'function') {\n const iterator = result[Symbol_iterator]();\n do {\n let item = iterator.next();\n if (item.done) {\n destination.complete();\n break;\n }\n destination.next(item.value);\n if (destination.closed) {\n break;\n }\n } while (true);\n } else if (result && typeof result[Symbol_observable] === 'function') {\n const obs = result[Symbol_observable]();\n if (typeof obs.subscribe !== 'function') {\n destination.error(new TypeError('Provided object does not correctly implement Symbol.observable'));\n } else {\n return obs.subscribe(new InnerSubscriber(outerSubscriber, outerValue, outerIndex));\n }\n } else {\n const value = isObject(result) ? 'an invalid object' : `'${result}'`;\n const msg = `You provided ${value} where a stream was expected.`\n + ' You can provide an Observable, Promise, Array, or Iterable.';\n destination.error(new TypeError(msg));\n }\n return null;\n}\n","export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number');","export function isPromise(value: any | Promise): value is Promise {\n return value && typeof (value).subscribe !== 'function' && typeof (value as any).then === 'function';\n}\n","import { root } from '../util/root';\n\nexport function symbolIteratorPonyfill(root: any) {\n const Symbol: any = root.Symbol;\n\n if (typeof Symbol === 'function') {\n if (!Symbol.iterator) {\n Symbol.iterator = Symbol('iterator polyfill');\n }\n return Symbol.iterator;\n } else {\n // [for Mozilla Gecko 27-35:](https://mzl.la/2ewE1zC)\n const { Set } = root;\n if (Set && typeof new Set()['@@iterator'] === 'function') {\n return '@@iterator';\n }\n const { Map } = root;\n // required for compatability with es6-shim\n if (Map) {\n let keys = Object.getOwnPropertyNames(Map.prototype);\n for (let i = 0; i < keys.length; ++i) {\n let key = keys[i];\n // according to spec, Map.prototype[@@iterator] and Map.orototype.entries must be equal.\n if (key !== 'entries' && key !== 'size' && Map.prototype[key] === Map.prototype['entries']) {\n return key;\n }\n }\n }\n return '@@iterator';\n }\n}\n\nexport const iterator = symbolIteratorPonyfill(root);\n\n/**\n * @deprecated use iterator instead\n */\nexport const $$iterator = iterator;\n","import { Subscriber } from './Subscriber';\nimport { OuterSubscriber } from './OuterSubscriber';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class InnerSubscriber extends Subscriber {\n private index: number = 0;\n\n constructor(private parent: OuterSubscriber, private outerValue: T, private outerIndex: number) {\n super();\n }\n\n protected _next(value: R): void {\n this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);\n }\n\n protected _error(error: any): void {\n this.parent.notifyError(error, this);\n this.unsubscribe();\n }\n\n protected _complete(): void {\n this.parent.notifyComplete(this);\n this.unsubscribe();\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { combineLatest } from '../../operator/combineLatest';\n\nObservable.prototype.combineLatest = combineLatest;\n\ndeclare module '../../Observable' {\n interface Observable {\n combineLatest: typeof combineLatest;\n }\n}","import { Observable, ObservableInput } from '../Observable';\nimport { combineLatest as higherOrder } from '../operators/combineLatest';\n\n/* tslint:disable:max-line-length */\nexport function combineLatest(this: Observable, project: (v1: T) => R): Observable;\nexport function combineLatest(this: Observable, v2: ObservableInput, project: (v1: T, v2: T2) => R): Observable;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput, project: (v1: T, v2: T2, v3: T3) => R): Observable;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): Observable;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): Observable;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): Observable ;\nexport function combineLatest(this: Observable, v2: ObservableInput): Observable<[T, T2]>;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput): Observable<[T, T2, T3]>;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput): Observable<[T, T2, T3, T4]>;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput): Observable<[T, T2, T3, T4, T5]>;\nexport function combineLatest(this: Observable, v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput): Observable<[T, T2, T3, T4, T5, T6]> ;\nexport function combineLatest(this: Observable, ...observables: Array | ((...values: Array) => R)>): Observable;\nexport function combineLatest(this: Observable, array: ObservableInput[]): Observable>;\nexport function combineLatest(this: Observable, array: ObservableInput[], project: (v1: T, ...values: Array) => R): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.\n *\n * \n *\n * `combineLatest` combines the values from this Observable with values from\n * Observables passed as arguments. This is done by subscribing to each\n * Observable, in order, and collecting an array of each of the most recent\n * values any time any of the input Observables emits, then either taking that\n * array and passing it as arguments to an optional `project` function and\n * emitting the return value of that, or just emitting the array of recent\n * values directly if there is no `project` function.\n *\n * @example Dynamically calculate the Body-Mass Index from an Observable of weight and one for height\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method combineLatest\n * @owner Observable\n */\nexport function combineLatest(this: Observable, ...observables: Array |\n Array> |\n ((...values: Array) => R)>): Observable {\n return higherOrder(...observables)(this);\n}","import { Observable, ObservableInput } from '../Observable';\nimport { ArrayObservable } from '../observable/ArrayObservable';\nimport { isArray } from '../util/isArray';\nimport { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { OperatorFunction } from '../interfaces';\n\nconst none = {};\n\n/* tslint:disable:max-line-length */\nexport function combineLatest(project: (v1: T) => R): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, project: (v1: T, v2: T2) => R): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput, project: (v1: T, v2: T2, v3: T3) => R): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, project: (v1: T, v2: T2, v3: T3, v4: T4) => R): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => R): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput, project: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => R): OperatorFunction ;\nexport function combineLatest(v2: ObservableInput): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput): OperatorFunction;\nexport function combineLatest(v2: ObservableInput, v3: ObservableInput, v4: ObservableInput, v5: ObservableInput, v6: ObservableInput): OperatorFunction ;\nexport function combineLatest(...observables: Array | ((...values: Array) => R)>): OperatorFunction;\nexport function combineLatest(array: ObservableInput[]): OperatorFunction>;\nexport function combineLatest(array: ObservableInput[], project: (v1: T, ...values: Array) => R): OperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Combines multiple Observables to create an Observable whose values are\n * calculated from the latest values of each of its input Observables.\n *\n * Whenever any input Observable emits a value, it\n * computes a formula using the latest values from all the inputs, then emits\n * the output of that formula.\n *\n * \n *\n * `combineLatest` combines the values from this Observable with values from\n * Observables passed as arguments. This is done by subscribing to each\n * Observable, in order, and collecting an array of each of the most recent\n * values any time any of the input Observables emits, then either taking that\n * array and passing it as arguments to an optional `project` function and\n * emitting the return value of that, or just emitting the array of recent\n * values directly if there is no `project` function.\n *\n * @example Dynamically calculate the Body-Mass Index from an Observable of weight and one for height\n * var weight = Rx.Observable.of(70, 72, 76, 79, 75);\n * var height = Rx.Observable.of(1.76, 1.77, 1.78);\n * var bmi = weight.combineLatest(height, (w, h) => w / (h * h));\n * bmi.subscribe(x => console.log('BMI is ' + x));\n *\n * // With output to console:\n * // BMI is 24.212293388429753\n * // BMI is 23.93948099205209\n * // BMI is 23.671253629592222\n *\n * @see {@link combineAll}\n * @see {@link merge}\n * @see {@link withLatestFrom}\n *\n * @param {ObservableInput} other An input Observable to combine with the source\n * Observable. More than one input Observables may be given as argument.\n * @param {function} [project] An optional function to project the values from\n * the combined latest values into a new value on the output Observable.\n * @return {Observable} An Observable of projected values from the most recent\n * values from each input Observable, or an array of the most recent values from\n * each input Observable.\n * @method combineLatest\n * @owner Observable\n */\nexport function combineLatest(...observables: Array |\n Array> |\n ((...values: Array) => R)>): OperatorFunction {\n let project: (...values: Array) => R = null;\n if (typeof observables[observables.length - 1] === 'function') {\n project = <(...values: Array) => R>observables.pop();\n }\n\n // if the first and only other argument besides the resultSelector is an array\n // assume it's been called with `combineLatest([obs1, obs2, obs3], project)`\n if (observables.length === 1 && isArray(observables[0])) {\n observables = (observables[0]).slice();\n }\n\n return (source: Observable) => source.lift.call(new ArrayObservable([source, ...observables]), new CombineLatestOperator(project));\n}\n\nexport class CombineLatestOperator implements Operator {\n constructor(private project?: (...values: Array) => R) {\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new CombineLatestSubscriber(subscriber, this.project));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class CombineLatestSubscriber extends OuterSubscriber {\n private active: number = 0;\n private values: any[] = [];\n private observables: any[] = [];\n private toRespond: number;\n\n constructor(destination: Subscriber, private project?: (...values: Array) => R) {\n super(destination);\n }\n\n protected _next(observable: any) {\n this.values.push(none);\n this.observables.push(observable);\n }\n\n protected _complete() {\n const observables = this.observables;\n const len = observables.length;\n if (len === 0) {\n this.destination.complete();\n } else {\n this.active = len;\n this.toRespond = len;\n for (let i = 0; i < len; i++) {\n const observable = observables[i];\n this.add(subscribeToResult(this, observable, observable, i));\n }\n }\n }\n\n notifyComplete(unused: Subscriber): void {\n if ((this.active -= 1) === 0) {\n this.destination.complete();\n }\n }\n\n notifyNext(outerValue: T, innerValue: R,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n const values = this.values;\n const oldVal = values[outerIndex];\n const toRespond = !this.toRespond\n ? 0\n : oldVal === none ? --this.toRespond : this.toRespond;\n values[outerIndex] = innerValue;\n\n if (toRespond === 0) {\n if (this.project) {\n this._tryProject(values);\n } else {\n this.destination.next(values.slice());\n }\n }\n }\n\n private _tryProject(values: any[]) {\n let result: any;\n try {\n result = this.project.apply(this, values);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n}\n","import { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { ScalarObservable } from './ScalarObservable';\nimport { EmptyObservable } from './EmptyObservable';\nimport { Subscriber } from '../Subscriber';\nimport { isScheduler } from '../util/isScheduler';\nimport { TeardownLogic } from '../Subscription';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class ArrayObservable extends Observable {\n\n static create(array: T[], scheduler?: IScheduler): Observable {\n return new ArrayObservable(array, scheduler);\n }\n\n static of(item1: T, scheduler?: IScheduler): Observable;\n static of(item1: T, item2: T, scheduler?: IScheduler): Observable;\n static of(item1: T, item2: T, item3: T, scheduler?: IScheduler): Observable;\n static of(item1: T, item2: T, item3: T, item4: T, scheduler?: IScheduler): Observable;\n static of(item1: T, item2: T, item3: T, item4: T, item5: T, scheduler?: IScheduler): Observable;\n static of(item1: T, item2: T, item3: T, item4: T, item5: T, item6: T, scheduler?: IScheduler): Observable;\n static of(...array: Array): Observable;\n /**\n * Creates an Observable that emits some values you specify as arguments,\n * immediately one after the other, and then emits a complete notification.\n *\n * Emits the arguments you provide, then completes.\n * \n *\n * \n *\n * This static operator is useful for creating a simple Observable that only\n * emits the arguments given, and the complete notification thereafter. It can\n * be used for composing with other Observables, such as with {@link concat}.\n * By default, it uses a `null` IScheduler, which means the `next`\n * notifications are sent synchronously, although with a different IScheduler\n * it is possible to determine when those notifications will be delivered.\n *\n * @example Emit 10, 20, 30, then 'a', 'b', 'c', then start ticking every second.\n * var numbers = Rx.Observable.of(10, 20, 30);\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var interval = Rx.Observable.interval(1000);\n * var result = numbers.concat(letters).concat(interval);\n * result.subscribe(x => console.log(x));\n *\n * @see {@link create}\n * @see {@link empty}\n * @see {@link never}\n * @see {@link throw}\n *\n * @param {...T} values Arguments that represent `next` values to be emitted.\n * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling\n * the emissions of the `next` notifications.\n * @return {Observable} An Observable that emits each given input value.\n * @static true\n * @name of\n * @owner Observable\n */\n static of(...array: Array): Observable {\n let scheduler = array[array.length - 1];\n if (isScheduler(scheduler)) {\n array.pop();\n } else {\n scheduler = null;\n }\n\n const len = array.length;\n if (len > 1) {\n return new ArrayObservable(array, scheduler);\n } else if (len === 1) {\n return new ScalarObservable(array[0], scheduler);\n } else {\n return new EmptyObservable(scheduler);\n }\n }\n\n static dispatch(state: any) {\n\n const { array, index, count, subscriber } = state;\n\n if (index >= count) {\n subscriber.complete();\n return;\n }\n\n subscriber.next(array[index]);\n\n if (subscriber.closed) {\n return;\n }\n\n state.index = index + 1;\n\n ( this).schedule(state);\n }\n\n // value used if Array has one value and _isScalar\n value: any;\n\n constructor(private array: T[], private scheduler?: IScheduler) {\n super();\n if (!scheduler && array.length === 1) {\n this._isScalar = true;\n this.value = array[0];\n }\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n let index = 0;\n const array = this.array;\n const count = array.length;\n const scheduler = this.scheduler;\n\n if (scheduler) {\n return scheduler.schedule(ArrayObservable.dispatch, 0, {\n array, index, count, subscriber\n });\n } else {\n for (let i = 0; i < count && !subscriber.closed; i++) {\n subscriber.next(array[i]);\n }\n subscriber.complete();\n }\n }\n}\n","import { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { TeardownLogic } from '../Subscription';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class ScalarObservable extends Observable {\n static create(value: T, scheduler?: IScheduler): ScalarObservable {\n return new ScalarObservable(value, scheduler);\n }\n\n static dispatch(state: any): void {\n const { done, value, subscriber } = state;\n\n if (done) {\n subscriber.complete();\n return;\n }\n\n subscriber.next(value);\n if (subscriber.closed) {\n return;\n }\n\n state.done = true;\n ( this).schedule(state);\n }\n\n _isScalar: boolean = true;\n\n constructor(public value: T, private scheduler?: IScheduler) {\n super();\n if (scheduler) {\n this._isScalar = false;\n }\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n const value = this.value;\n const scheduler = this.scheduler;\n\n if (scheduler) {\n return scheduler.schedule(ScalarObservable.dispatch, 0, {\n done: false, value, subscriber\n });\n } else {\n subscriber.next(value);\n if (!subscriber.closed) {\n subscriber.complete();\n }\n }\n }\n}\n","import { IScheduler } from '../Scheduler';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { TeardownLogic } from '../Subscription';\n\nexport interface DispatchArg {\n subscriber: Subscriber;\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class EmptyObservable extends Observable {\n\n /**\n * Creates an Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n * \n *\n * \n *\n * This static operator is useful for creating a simple Observable that only\n * emits the complete notification. It can be used for composing with other\n * Observables, such as in a {@link mergeMap}.\n *\n * @example Emit the number 7, then complete.\n * var result = Rx.Observable.empty().startWith(7);\n * result.subscribe(x => console.log(x));\n *\n * @example Map and flatten only odd numbers to the sequence 'a', 'b', 'c'\n * var interval = Rx.Observable.interval(1000);\n * var result = interval.mergeMap(x =>\n * x % 2 === 1 ? Rx.Observable.of('a', 'b', 'c') : Rx.Observable.empty()\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval eg(0,1,2,3,...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1 print abc\n * // if x % 2 is not equal to 1 nothing will be output\n *\n * @see {@link create}\n * @see {@link never}\n * @see {@link of}\n * @see {@link throw}\n *\n * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling\n * the emission of the complete notification.\n * @return {Observable} An \"empty\" Observable: emits only the complete\n * notification.\n * @static true\n * @name empty\n * @owner Observable\n */\n static create(scheduler?: IScheduler): Observable {\n return new EmptyObservable(scheduler);\n }\n\n static dispatch(arg: DispatchArg) {\n const { subscriber } = arg;\n subscriber.complete();\n }\n\n constructor(private scheduler?: IScheduler) {\n super();\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n\n const scheduler = this.scheduler;\n\n if (scheduler) {\n return scheduler.schedule(EmptyObservable.dispatch, 0, { subscriber });\n } else {\n subscriber.complete();\n }\n }\n}\n","import { Scheduler } from '../Scheduler';\nexport function isScheduler(value: any): value is Scheduler {\n return value && typeof (value).schedule === 'function';\n}\n","\nimport { Observable } from '../../Observable';\nimport { count } from '../../operator/count';\n\nObservable.prototype.count = count;\n\ndeclare module '../../Observable' {\n interface Observable {\n count: typeof count;\n }\n}","import { Observable } from '../Observable';\nimport { count as higherOrder } from '../operators/count';\n\n/**\n * Counts the number of emissions on the source and emits that number when the\n * source completes.\n *\n * Tells how many values were emitted, when the source\n * completes.\n *\n * \n *\n * `count` transforms an Observable that emits values into an Observable that\n * emits a single value that represents the number of values emitted by the\n * source Observable. If the source Observable terminates with an error, `count`\n * will pass this error notification along without emitting a value first. If\n * the source Observable does not terminate at all, `count` will neither emit\n * a value nor terminate. This operator takes an optional `predicate` function\n * as argument, in which case the output emission will represent the number of\n * source values that matched `true` with the `predicate`.\n *\n * @example Counts how many seconds have passed before the first click happened\n * var seconds = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var secondsBeforeClick = seconds.takeUntil(clicks);\n * var result = secondsBeforeClick.count();\n * result.subscribe(x => console.log(x));\n *\n * @example Counts how many odd numbers are there between 1 and 7\n * var numbers = Rx.Observable.range(1, 7);\n * var result = numbers.count(i => i % 2 === 1);\n * result.subscribe(x => console.log(x));\n *\n * // Results in:\n * // 4\n *\n * @see {@link max}\n * @see {@link min}\n * @see {@link reduce}\n *\n * @param {function(value: T, i: number, source: Observable): boolean} [predicate] A\n * boolean function to select what values are to be counted. It is provided with\n * arguments of:\n * - `value`: the value from the source Observable.\n * - `index`: the (zero-based) \"index\" of the value from the source Observable.\n * - `source`: the source Observable instance itself.\n * @return {Observable} An Observable of one number that represents the count as\n * described above.\n * @method count\n * @owner Observable\n */\nexport function count(this: Observable, predicate?: (value: T, index: number, source: Observable) => boolean): Observable {\n return higherOrder(predicate)(this);\n}\n","import { Observable } from '../Observable';\nimport { Operator } from '../Operator';\nimport { Observer } from '../Observer';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../interfaces';\n\n/**\n * Counts the number of emissions on the source and emits that number when the\n * source completes.\n *\n * Tells how many values were emitted, when the source\n * completes.\n *\n * \n *\n * `count` transforms an Observable that emits values into an Observable that\n * emits a single value that represents the number of values emitted by the\n * source Observable. If the source Observable terminates with an error, `count`\n * will pass this error notification along without emitting a value first. If\n * the source Observable does not terminate at all, `count` will neither emit\n * a value nor terminate. This operator takes an optional `predicate` function\n * as argument, in which case the output emission will represent the number of\n * source values that matched `true` with the `predicate`.\n *\n * @example Counts how many seconds have passed before the first click happened\n * var seconds = Rx.Observable.interval(1000);\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var secondsBeforeClick = seconds.takeUntil(clicks);\n * var result = secondsBeforeClick.count();\n * result.subscribe(x => console.log(x));\n *\n * @example Counts how many odd numbers are there between 1 and 7\n * var numbers = Rx.Observable.range(1, 7);\n * var result = numbers.count(i => i % 2 === 1);\n * result.subscribe(x => console.log(x));\n *\n * // Results in:\n * // 4\n *\n * @see {@link max}\n * @see {@link min}\n * @see {@link reduce}\n *\n * @param {function(value: T, i: number, source: Observable): boolean} [predicate] A\n * boolean function to select what values are to be counted. It is provided with\n * arguments of:\n * - `value`: the value from the source Observable.\n * - `index`: the (zero-based) \"index\" of the value from the source Observable.\n * - `source`: the source Observable instance itself.\n * @return {Observable} An Observable of one number that represents the count as\n * described above.\n * @method count\n * @owner Observable\n */\nexport function count(predicate?: (value: T, index: number, source: Observable) => boolean): OperatorFunction {\n return (source: Observable) => source.lift(new CountOperator(predicate, source));\n}\n\nclass CountOperator implements Operator {\n constructor(private predicate?: (value: T, index: number, source: Observable) => boolean,\n private source?: Observable) {\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass CountSubscriber extends Subscriber {\n private count: number = 0;\n private index: number = 0;\n\n constructor(destination: Observer,\n private predicate?: (value: T, index: number, source: Observable) => boolean,\n private source?: Observable) {\n super(destination);\n }\n\n protected _next(value: T): void {\n if (this.predicate) {\n this._tryPredicate(value);\n } else {\n this.count++;\n }\n }\n\n private _tryPredicate(value: T) {\n let result: any;\n\n try {\n result = this.predicate(value, this.index++, this.source);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n\n if (result) {\n this.count++;\n }\n }\n\n protected _complete(): void {\n this.destination.next(this.count);\n this.destination.complete();\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { delay } from '../../operator/delay';\n\nObservable.prototype.delay = delay;\n\ndeclare module '../../Observable' {\n interface Observable {\n delay: typeof delay;\n }\n}","import { async } from '../scheduler/async';\nimport { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { delay as higherOrder } from '../operators/delay';\n\n/**\n * Delays the emission of items from the source Observable by a given timeout or\n * until a given Date.\n *\n * Time shifts each item by some specified amount of\n * milliseconds.\n *\n * \n *\n * If the delay argument is a Number, this operator time shifts the source\n * Observable by that amount of time expressed in milliseconds. The relative\n * time intervals between the values are preserved.\n *\n * If the delay argument is a Date, this operator time shifts the start of the\n * Observable execution until the given date occurs.\n *\n * @example Delay each click by one second\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @example Delay all clicks until a future date happens\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var date = new Date('March 15, 2050 12:00:00'); // in the future\n * var delayedClicks = clicks.delay(date); // click emitted only after that date\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n *\n * @param {number|Date} delay The delay duration in milliseconds (a `number`) or\n * a `Date` until which the emission of the source items is delayed.\n * @param {Scheduler} [scheduler=async] The IScheduler to use for\n * managing the timers that handle the time-shift for each item.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified timeout or Date.\n * @method delay\n * @owner Observable\n */\nexport function delay(this: Observable, delay: number|Date,\n scheduler: IScheduler = async): Observable {\n return higherOrder(delay, scheduler)(this);\n}\n","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asap} scheduler.\n *\n * @example Use async scheduler to delay task\n * const task = () => console.log('it works!');\n *\n * Rx.Scheduler.async.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n *\n *\n * @example Use async scheduler to repeat task in intervals\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * Rx.Scheduler.async.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n *\n * @static true\n * @name async\n * @owner Scheduler\n */\n\nexport const async = new AsyncScheduler(AsyncAction);\n","import { root } from '../util/root';\nimport { Action } from './Action';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class AsyncAction extends Action {\n\n public id: any;\n public state: T;\n public delay: number;\n protected pending: boolean = false;\n protected work: (this: this, state?: T) => void;\n\n constructor(protected scheduler: AsyncScheduler,\n work: (this: AsyncAction, state?: T) => void) {\n super(scheduler, work);\n this.work = work;\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, id?: any, delay: number = 0): any {\n return root.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(scheduler: AsyncScheduler, id: any, delay: number = 0): any {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay !== null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n return root.clearInterval(id) && undefined || undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, delay: number): any {\n let errored: boolean = false;\n let errorValue: any = undefined;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n errorValue = !!e && e || new Error(e);\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n /** @deprecated internal use only */ _unsubscribe() {\n\n const id = this.id;\n const scheduler = this.scheduler;\n const actions = scheduler.actions;\n const index = actions.indexOf(this);\n\n this.work = null;\n this.state = null;\n this.pending = false;\n this.scheduler = null;\n\n if (index !== -1) {\n actions.splice(index, 1);\n }\n\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null;\n }\n}\n","import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\n\n/**\n * A unit of work to be executed in a {@link Scheduler}. An action is typically\n * created from within a Scheduler and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: Action, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent Scheduler for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n","import { Scheduler } from '../Scheduler';\nimport { AsyncAction } from './AsyncAction';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n */\n public active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n */\n public scheduled: any = undefined;\n\n public flush(action: AsyncAction): void {\n\n const {actions} = this;\n\n if (this.active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this.active = true;\n\n do {\n if (error = action.execute(action.state, action.delay)) {\n break;\n }\n } while (action = actions.shift()); // exhaust the scheduler queue\n\n this.active = false;\n\n if (error) {\n while (action = actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n","import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\n\nexport interface IScheduler {\n now(): number;\n schedule(work: (this: Action, state?: T) => void, delay?: number, state?: T): Subscription;\n}\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an {@link Action}.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n */\nexport class Scheduler implements IScheduler {\n\n public static now: () => number = Date.now ? Date.now : () => +new Date();\n\n constructor(private SchedulerAction: typeof Action,\n now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: Action, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.SchedulerAction(this, work).schedule(state, delay);\n }\n}\n","import { async } from '../scheduler/async';\nimport { isDate } from '../util/isDate';\nimport { Operator } from '../Operator';\nimport { IScheduler } from '../Scheduler';\nimport { Subscriber } from '../Subscriber';\nimport { Action } from '../scheduler/Action';\nimport { Notification } from '../Notification';\nimport { Observable } from '../Observable';\nimport { PartialObserver } from '../Observer';\nimport { TeardownLogic } from '../Subscription';\nimport { MonoTypeOperatorFunction } from '../interfaces';\n\n/**\n * Delays the emission of items from the source Observable by a given timeout or\n * until a given Date.\n *\n * Time shifts each item by some specified amount of\n * milliseconds.\n *\n * \n *\n * If the delay argument is a Number, this operator time shifts the source\n * Observable by that amount of time expressed in milliseconds. The relative\n * time intervals between the values are preserved.\n *\n * If the delay argument is a Date, this operator time shifts the start of the\n * Observable execution until the given date occurs.\n *\n * @example Delay each click by one second\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var delayedClicks = clicks.delay(1000); // each click emitted after 1 second\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @example Delay all clicks until a future date happens\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var date = new Date('March 15, 2050 12:00:00'); // in the future\n * var delayedClicks = clicks.delay(date); // click emitted only after that date\n * delayedClicks.subscribe(x => console.log(x));\n *\n * @see {@link debounceTime}\n * @see {@link delayWhen}\n *\n * @param {number|Date} delay The delay duration in milliseconds (a `number`) or\n * a `Date` until which the emission of the source items is delayed.\n * @param {Scheduler} [scheduler=async] The IScheduler to use for\n * managing the timers that handle the time-shift for each item.\n * @return {Observable} An Observable that delays the emissions of the source\n * Observable by the specified timeout or Date.\n * @method delay\n * @owner Observable\n */\nexport function delay(delay: number|Date,\n scheduler: IScheduler = async): MonoTypeOperatorFunction {\n const absoluteDelay = isDate(delay);\n const delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n return (source: Observable) => source.lift(new DelayOperator(delayFor, scheduler));\n}\n\nclass DelayOperator implements Operator {\n constructor(private delay: number,\n private scheduler: IScheduler) {\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n }\n}\n\ninterface DelayState {\n source: DelaySubscriber;\n destination: PartialObserver;\n scheduler: IScheduler;\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass DelaySubscriber extends Subscriber {\n private queue: Array> = [];\n private active: boolean = false;\n private errored: boolean = false;\n\n private static dispatch(this: Action>, state: DelayState): void {\n const source = state.source;\n const queue = source.queue;\n const scheduler = state.scheduler;\n const destination = state.destination;\n\n while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n queue.shift().notification.observe(destination);\n }\n\n if (queue.length > 0) {\n const delay = Math.max(0, queue[0].time - scheduler.now());\n this.schedule(state, delay);\n } else {\n this.unsubscribe();\n source.active = false;\n }\n }\n\n constructor(destination: Subscriber,\n private delay: number,\n private scheduler: IScheduler) {\n super(destination);\n }\n\n private _schedule(scheduler: IScheduler): void {\n this.active = true;\n this.add(scheduler.schedule>(DelaySubscriber.dispatch, this.delay, {\n source: this, destination: this.destination, scheduler: scheduler\n }));\n }\n\n private scheduleNotification(notification: Notification): void {\n if (this.errored === true) {\n return;\n }\n\n const scheduler = this.scheduler;\n const message = new DelayMessage(scheduler.now() + this.delay, notification);\n this.queue.push(message);\n\n if (this.active === false) {\n this._schedule(scheduler);\n }\n }\n\n protected _next(value: T) {\n this.scheduleNotification(Notification.createNext(value));\n }\n\n protected _error(err: any) {\n this.errored = true;\n this.queue = [];\n this.destination.error(err);\n }\n\n protected _complete() {\n this.scheduleNotification(Notification.createComplete());\n }\n}\n\nclass DelayMessage {\n constructor(public readonly time: number,\n public readonly notification: Notification) {\n }\n}\n","export function isDate(value: any): value is Date {\n return value instanceof Date && !isNaN(+value);\n}\n","import { PartialObserver } from './Observer';\nimport { Observable } from './Observable';\n\n/**\n * Represents a push-based event or value that an {@link Observable} can emit.\n * This class is particularly useful for operators that manage notifications,\n * like {@link materialize}, {@link dematerialize}, {@link observeOn}, and\n * others. Besides wrapping the actual delivered value, it also annotates it\n * with metadata of, for instance, what type of push message it is (`next`,\n * `error`, or `complete`).\n *\n * @see {@link materialize}\n * @see {@link dematerialize}\n * @see {@link observeOn}\n *\n * @class Notification\n */\nexport class Notification {\n hasValue: boolean;\n\n constructor(public kind: string, public value?: T, public error?: any) {\n this.hasValue = kind === 'N';\n }\n\n /**\n * Delivers to the given `observer` the value wrapped by this Notification.\n * @param {Observer} observer\n * @return\n */\n observe(observer: PartialObserver): any {\n switch (this.kind) {\n case 'N':\n return observer.next && observer.next(this.value);\n case 'E':\n return observer.error && observer.error(this.error);\n case 'C':\n return observer.complete && observer.complete();\n }\n }\n\n /**\n * Given some {@link Observer} callbacks, deliver the value represented by the\n * current Notification to the correctly corresponding callback.\n * @param {function(value: T): void} next An Observer `next` callback.\n * @param {function(err: any): void} [error] An Observer `error` callback.\n * @param {function(): void} [complete] An Observer `complete` callback.\n * @return {any}\n */\n do(next: (value: T) => void, error?: (err: any) => void, complete?: () => void): any {\n const kind = this.kind;\n switch (kind) {\n case 'N':\n return next && next(this.value);\n case 'E':\n return error && error(this.error);\n case 'C':\n return complete && complete();\n }\n }\n\n /**\n * Takes an Observer or its individual callback functions, and calls `observe`\n * or `do` methods accordingly.\n * @param {Observer|function(value: T): void} nextOrObserver An Observer or\n * the `next` callback.\n * @param {function(err: any): void} [error] An Observer `error` callback.\n * @param {function(): void} [complete] An Observer `complete` callback.\n * @return {any}\n */\n accept(nextOrObserver: PartialObserver | ((value: T) => void), error?: (err: any) => void, complete?: () => void) {\n if (nextOrObserver && typeof (>nextOrObserver).next === 'function') {\n return this.observe(>nextOrObserver);\n } else {\n return this.do(<(value: T) => void>nextOrObserver, error, complete);\n }\n }\n\n /**\n * Returns a simple Observable that just delivers the notification represented\n * by this Notification instance.\n * @return {any}\n */\n toObservable(): Observable {\n const kind = this.kind;\n switch (kind) {\n case 'N':\n return Observable.of(this.value);\n case 'E':\n return Observable.throw(this.error);\n case 'C':\n return Observable.empty();\n }\n throw new Error('unexpected notification kind value');\n }\n\n private static completeNotification: Notification = new Notification('C');\n private static undefinedValueNotification: Notification = new Notification('N', undefined);\n\n /**\n * A shortcut to create a Notification instance of the type `next` from a\n * given value.\n * @param {T} value The `next` value.\n * @return {Notification} The \"next\" Notification representing the\n * argument.\n */\n static createNext(value: T): Notification {\n if (typeof value !== 'undefined') {\n return new Notification('N', value);\n }\n return Notification.undefinedValueNotification;\n }\n\n /**\n * A shortcut to create a Notification instance of the type `error` from a\n * given error.\n * @param {any} [err] The `error` error.\n * @return {Notification} The \"error\" Notification representing the\n * argument.\n */\n static createError(err?: any): Notification {\n return new Notification('E', undefined, err);\n }\n\n /**\n * A shortcut to create a Notification instance of the type `complete`.\n * @return {Notification} The valueless \"complete\" Notification.\n */\n static createComplete(): Notification {\n return Notification.completeNotification;\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { _do } from '../../operator/do';\n\nObservable.prototype.do = _do;\nObservable.prototype._do = _do;\n\ndeclare module '../../Observable' {\n interface Observable {\n do: typeof _do;\n _do: typeof _do;\n }\n}","\nimport { Observable } from '../Observable';\nimport { PartialObserver } from '../Observer';\nimport { tap as higherOrder } from '../operators/tap';\n\n/* tslint:disable:max-line-length */\nexport function _do(this: Observable, next: (x: T) => void, error?: (e: any) => void, complete?: () => void): Observable;\nexport function _do(this: Observable, observer: PartialObserver): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Perform a side effect for every emission on the source Observable, but return\n * an Observable that is identical to the source.\n *\n * Intercepts each emission on the source and runs a\n * function, but returns an output which is identical to the source as long as errors don't occur.\n *\n * \n *\n * Returns a mirrored Observable of the source Observable, but modified so that\n * the provided Observer is called to perform a side effect for every value,\n * error, and completion emitted by the source. Any errors that are thrown in\n * the aforementioned Observer or handlers are safely sent down the error path\n * of the output Observable.\n *\n * This operator is useful for debugging your Observables for the correct values\n * or performing other side effects.\n *\n * Note: this is different to a `subscribe` on the Observable. If the Observable\n * returned by `do` is not subscribed, the side effects specified by the\n * Observer will never happen. `do` therefore simply spies on existing\n * execution, it does not trigger an execution to happen like `subscribe` does.\n *\n * @example Map every click to the clientX position of that click, while also logging the click event\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks\n * .do(ev => console.log(ev))\n * .map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link map}\n * @see {@link subscribe}\n *\n * @param {Observer|function} [nextOrObserver] A normal Observer object or a\n * callback for `next`.\n * @param {function} [error] Callback for errors in the source.\n * @param {function} [complete] Callback for the completion of the source.\n * @return {Observable} An Observable identical to the source, but runs the\n * specified Observer or callback(s) for each item.\n * @method do\n * @name do\n * @owner Observable\n */\nexport function _do(this: Observable, nextOrObserver?: PartialObserver | ((x: T) => void),\n error?: (e: any) => void,\n complete?: () => void): Observable {\n return higherOrder(nextOrObserver, error, complete)(this) as Observable;\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { PartialObserver } from '../Observer';\nimport { TeardownLogic } from '../Subscription';\nimport { MonoTypeOperatorFunction } from '../interfaces';\n\n/* tslint:disable:max-line-length */\nexport function tap(next: (x: T) => void, error?: (e: any) => void, complete?: () => void): MonoTypeOperatorFunction;\nexport function tap(observer: PartialObserver): MonoTypeOperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Perform a side effect for every emission on the source Observable, but return\n * an Observable that is identical to the source.\n *\n * Intercepts each emission on the source and runs a\n * function, but returns an output which is identical to the source as long as errors don't occur.\n *\n * \n *\n * Returns a mirrored Observable of the source Observable, but modified so that\n * the provided Observer is called to perform a side effect for every value,\n * error, and completion emitted by the source. Any errors that are thrown in\n * the aforementioned Observer or handlers are safely sent down the error path\n * of the output Observable.\n *\n * This operator is useful for debugging your Observables for the correct values\n * or performing other side effects.\n *\n * Note: this is different to a `subscribe` on the Observable. If the Observable\n * returned by `do` is not subscribed, the side effects specified by the\n * Observer will never happen. `do` therefore simply spies on existing\n * execution, it does not trigger an execution to happen like `subscribe` does.\n *\n * @example Map every click to the clientX position of that click, while also logging the click event\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks\n * .do(ev => console.log(ev))\n * .map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link map}\n * @see {@link subscribe}\n *\n * @param {Observer|function} [nextOrObserver] A normal Observer object or a\n * callback for `next`.\n * @param {function} [error] Callback for errors in the source.\n * @param {function} [complete] Callback for the completion of the source.\n * @return {Observable} An Observable identical to the source, but runs the\n * specified Observer or callback(s) for each item.\n * @name tap\n */\nexport function tap(nextOrObserver?: PartialObserver | ((x: T) => void),\n error?: (e: any) => void,\n complete?: () => void): MonoTypeOperatorFunction {\n return function tapOperatorFunction(source: Observable): Observable {\n return source.lift(new DoOperator(nextOrObserver, error, complete));\n };\n}\n\nclass DoOperator implements Operator {\n constructor(private nextOrObserver?: PartialObserver | ((x: T) => void),\n private error?: (e: any) => void,\n private complete?: () => void) {\n }\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new DoSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass DoSubscriber extends Subscriber {\n\n private safeSubscriber: Subscriber;\n\n constructor(destination: Subscriber,\n nextOrObserver?: PartialObserver | ((x: T) => void),\n error?: (e: any) => void,\n complete?: () => void) {\n super(destination);\n\n const safeSubscriber = new Subscriber(nextOrObserver, error, complete);\n safeSubscriber.syncErrorThrowable = true;\n this.add(safeSubscriber);\n this.safeSubscriber = safeSubscriber;\n }\n\n protected _next(value: T): void {\n const { safeSubscriber } = this;\n safeSubscriber.next(value);\n if (safeSubscriber.syncErrorThrown) {\n this.destination.error(safeSubscriber.syncErrorValue);\n } else {\n this.destination.next(value);\n }\n }\n\n protected _error(err: any): void {\n const { safeSubscriber } = this;\n safeSubscriber.error(err);\n if (safeSubscriber.syncErrorThrown) {\n this.destination.error(safeSubscriber.syncErrorValue);\n } else {\n this.destination.error(err);\n }\n }\n\n protected _complete(): void {\n const { safeSubscriber } = this;\n safeSubscriber.complete();\n if (safeSubscriber.syncErrorThrown) {\n this.destination.error(safeSubscriber.syncErrorValue);\n } else {\n this.destination.complete();\n }\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { filter } from '../../operator/filter';\n\nObservable.prototype.filter = filter;\n\ndeclare module '../../Observable' {\n interface Observable {\n filter: typeof filter;\n }\n}","\nimport { Observable } from '../Observable';\nimport { filter as higherOrderFilter } from '../operators/filter';\n\n/* tslint:disable:max-line-length */\nexport function filter(this: Observable,\n predicate: (value: T, index: number) => value is S,\n thisArg?: any): Observable;\nexport function filter(this: Observable,\n predicate: (value: T, index: number) => boolean,\n thisArg?: any): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.\n *\n * \n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * @example Emit only click events whose target was a DIV element\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');\n * clicksOnDivs.subscribe(x => console.log(x));\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nexport function filter(this: Observable, predicate: (value: T, index: number) => boolean,\n thisArg?: any): Observable {\n return higherOrderFilter(predicate, thisArg)(this);\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { TeardownLogic } from '../Subscription';\nimport { OperatorFunction, MonoTypeOperatorFunction } from '../interfaces';\n\n/* tslint:disable:max-line-length */\nexport function filter(predicate: (value: T, index: number) => value is S,\n thisArg?: any): OperatorFunction;\nexport function filter(predicate: (value: T, index: number) => boolean,\n thisArg?: any): MonoTypeOperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Filter items emitted by the source Observable by only emitting those that\n * satisfy a specified predicate.\n *\n * Like\n * [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter),\n * it only emits a value from the source if it passes a criterion function.\n *\n * \n *\n * Similar to the well-known `Array.prototype.filter` method, this operator\n * takes values from the source Observable, passes them through a `predicate`\n * function and only emits those values that yielded `true`.\n *\n * @example Emit only click events whose target was a DIV element\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var clicksOnDivs = clicks.filter(ev => ev.target.tagName === 'DIV');\n * clicksOnDivs.subscribe(x => console.log(x));\n *\n * @see {@link distinct}\n * @see {@link distinctUntilChanged}\n * @see {@link distinctUntilKeyChanged}\n * @see {@link ignoreElements}\n * @see {@link partition}\n * @see {@link skip}\n *\n * @param {function(value: T, index: number): boolean} predicate A function that\n * evaluates each value emitted by the source Observable. If it returns `true`,\n * the value is emitted, if `false` the value is not passed to the output\n * Observable. The `index` parameter is the number `i` for the i-th source\n * emission that has happened since the subscription, starting from the number\n * `0`.\n * @param {any} [thisArg] An optional argument to determine the value of `this`\n * in the `predicate` function.\n * @return {Observable} An Observable of values from the source that were\n * allowed by the `predicate` function.\n * @method filter\n * @owner Observable\n */\nexport function filter(predicate: (value: T, index: number) => boolean,\n thisArg?: any): MonoTypeOperatorFunction {\n return function filterOperatorFunction(source: Observable): Observable {\n return source.lift(new FilterOperator(predicate, thisArg));\n };\n}\n\nclass FilterOperator implements Operator {\n constructor(private predicate: (value: T, index: number) => boolean,\n private thisArg?: any) {\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass FilterSubscriber extends Subscriber {\n\n count: number = 0;\n\n constructor(destination: Subscriber,\n private predicate: (value: T, index: number) => boolean,\n private thisArg: any) {\n super(destination);\n }\n\n // the try catch block below is left specifically for\n // optimization and perf reasons. a tryCatcher is not necessary here.\n protected _next(value: T) {\n let result: any;\n try {\n result = this.predicate.call(this.thisArg, value, this.count++);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n if (result) {\n this.destination.next(value);\n }\n }\n}","\nimport { Observable } from '../../Observable';\nimport { map } from '../../operator/map';\n\nObservable.prototype.map = map;\n\ndeclare module '../../Observable' {\n interface Observable {\n map: typeof map;\n }\n}","import { map as higherOrderMap } from '../operators/map';\nimport { Observable } from '../Observable';\n\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.\n *\n * \n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * @example Map every click to the clientX position of that click\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks.map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nexport function map(this: Observable, project: (value: T, index: number) => R, thisArg?: any): Observable {\n return higherOrderMap(project, thisArg)(this);\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { OperatorFunction } from '../interfaces';\n\n/**\n * Applies a given `project` function to each value emitted by the source\n * Observable, and emits the resulting values as an Observable.\n *\n * Like [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map),\n * it passes each source value through a transformation function to get\n * corresponding output values.\n *\n * \n *\n * Similar to the well known `Array.prototype.map` function, this operator\n * applies a projection to each value and emits that projection in the output\n * Observable.\n *\n * @example Map every click to the clientX position of that click\n * var clicks = Rx.Observable.fromEvent(document, 'click');\n * var positions = clicks.map(ev => ev.clientX);\n * positions.subscribe(x => console.log(x));\n *\n * @see {@link mapTo}\n * @see {@link pluck}\n *\n * @param {function(value: T, index: number): R} project The function to apply\n * to each `value` emitted by the source Observable. The `index` parameter is\n * the number `i` for the i-th emission that has happened since the\n * subscription, starting from the number `0`.\n * @param {any} [thisArg] An optional argument to define what `this` is in the\n * `project` function.\n * @return {Observable} An Observable that emits the values from the source\n * Observable transformed by the given `project` function.\n * @method map\n * @owner Observable\n */\nexport function map(project: (value: T, index: number) => R, thisArg?: any): OperatorFunction {\n return function mapOperation(source: Observable): Observable {\n if (typeof project !== 'function') {\n throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n }\n return source.lift(new MapOperator(project, thisArg));\n };\n}\n\nexport class MapOperator implements Operator {\n constructor(private project: (value: T, index: number) => R, private thisArg: any) {\n }\n\n call(subscriber: Subscriber, source: any): any {\n return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass MapSubscriber extends Subscriber {\n count: number = 0;\n private thisArg: any;\n\n constructor(destination: Subscriber,\n private project: (value: T, index: number) => R,\n thisArg: any) {\n super(destination);\n this.thisArg = thisArg || this;\n }\n\n // NOTE: This looks unoptimized, but it's actually purposefully NOT\n // using try/catch optimizations.\n protected _next(value: T) {\n let result: any;\n try {\n result = this.project.call(this.thisArg, value, this.count++);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { mergeMap } from '../../operator/mergeMap';\n\nObservable.prototype.mergeMap = mergeMap;\nObservable.prototype.flatMap = mergeMap;\n\ndeclare module '../../Observable' {\n interface Observable {\n flatMap: typeof mergeMap;\n mergeMap: typeof mergeMap;\n }\n}","import { Observable, ObservableInput } from '../Observable';\nimport { mergeMap as higherOrderMergeMap } from '../operators/mergeMap';\n\n/* tslint:disable:max-line-length */\nexport function mergeMap(this: Observable, project: (value: T, index: number) => ObservableInput, concurrent?: number): Observable;\nexport function mergeMap(this: Observable, project: (value: T, index: number) => ObservableInput, resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R, concurrent?: number): Observable;\n/* tslint:enable:max-line-length */\n\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.\n *\n * \n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * @example Map and flatten each letter to an Observable ticking every 1 second\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var result = letters.mergeMap(x =>\n * Rx.Observable.interval(1000).map(i => x+i)\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and merging the results of the Observables obtained\n * from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nexport function mergeMap(this: Observable, project: (value: T, index: number) => ObservableInput,\n resultSelector?: ((outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R) | number,\n concurrent: number = Number.POSITIVE_INFINITY): Observable {\n return higherOrderMergeMap(project, resultSelector, concurrent)(this) as Observable;\n}\n","import { Observable, ObservableInput } from '../Observable';\nimport { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription } from '../Subscription';\nimport { subscribeToResult } from '../util/subscribeToResult';\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { OperatorFunction } from '../interfaces';\n\n/* tslint:disable:max-line-length */\nexport function mergeMap(project: (value: T, index: number) => ObservableInput, concurrent?: number): OperatorFunction;\nexport function mergeMap(project: (value: T, index: number) => ObservableInput, resultSelector: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R, concurrent?: number): OperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable.\n *\n * Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link mergeAll}.\n *\n * \n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an Observable, and then merging those resulting Observables and\n * emitting the results of this merger.\n *\n * @example Map and flatten each letter to an Observable ticking every 1 second\n * var letters = Rx.Observable.of('a', 'b', 'c');\n * var result = letters.mergeMap(x =>\n * Rx.Observable.interval(1000).map(i => x+i)\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // a0\n * // b0\n * // c0\n * // a1\n * // b1\n * // c1\n * // continues to list a,b,c with respective ascending integers\n *\n * @see {@link concatMap}\n * @see {@link exhaustMap}\n * @see {@link merge}\n * @see {@link mergeAll}\n * @see {@link mergeMapTo}\n * @see {@link mergeScan}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @param {function(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number): any} [resultSelector]\n * A function to produce the value on the output Observable based on the values\n * and the indices of the source (outer) emission and the inner Observable\n * emission. The arguments passed to this function are:\n * - `outerValue`: the value that came from the source\n * - `innerValue`: the value that came from the projected Observable\n * - `outerIndex`: the \"index\" of the value that came from the source\n * - `innerIndex`: the \"index\" of the value from the projected Observable\n * @param {number} [concurrent=Number.POSITIVE_INFINITY] Maximum number of input\n * Observables being subscribed to concurrently.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional `resultSelector`) to each item emitted\n * by the source Observable and merging the results of the Observables obtained\n * from this transformation.\n * @method mergeMap\n * @owner Observable\n */\nexport function mergeMap(project: (value: T, index: number) => ObservableInput,\n resultSelector?: ((outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R) | number,\n concurrent: number = Number.POSITIVE_INFINITY): OperatorFunction {\n return function mergeMapOperatorFunction(source: Observable) {\n if (typeof resultSelector === 'number') {\n concurrent = resultSelector;\n resultSelector = null;\n }\n return source.lift(new MergeMapOperator(project, resultSelector, concurrent));\n };\n}\n\nexport class MergeMapOperator implements Operator {\n constructor(private project: (value: T, index: number) => ObservableInput,\n private resultSelector?: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R,\n private concurrent: number = Number.POSITIVE_INFINITY) {\n }\n\n call(observer: Subscriber, source: any): any {\n return source.subscribe(new MergeMapSubscriber(\n observer, this.project, this.resultSelector, this.concurrent\n ));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class MergeMapSubscriber extends OuterSubscriber {\n private hasCompleted: boolean = false;\n private buffer: T[] = [];\n private active: number = 0;\n protected index: number = 0;\n\n constructor(destination: Subscriber,\n private project: (value: T, index: number) => ObservableInput,\n private resultSelector?: (outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) => R,\n private concurrent: number = Number.POSITIVE_INFINITY) {\n super(destination);\n }\n\n protected _next(value: T): void {\n if (this.active < this.concurrent) {\n this._tryNext(value);\n } else {\n this.buffer.push(value);\n }\n }\n\n protected _tryNext(value: T) {\n let result: ObservableInput;\n const index = this.index++;\n try {\n result = this.project(value, index);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.active++;\n this._innerSub(result, value, index);\n }\n\n private _innerSub(ish: ObservableInput, value: T, index: number): void {\n this.add(subscribeToResult(this, ish, value, index));\n }\n\n protected _complete(): void {\n this.hasCompleted = true;\n if (this.active === 0 && this.buffer.length === 0) {\n this.destination.complete();\n }\n }\n\n notifyNext(outerValue: T, innerValue: I,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n if (this.resultSelector) {\n this._notifyResultSelector(outerValue, innerValue, outerIndex, innerIndex);\n } else {\n this.destination.next(innerValue);\n }\n }\n\n private _notifyResultSelector(outerValue: T, innerValue: I, outerIndex: number, innerIndex: number) {\n let result: R;\n try {\n result = this.resultSelector(outerValue, innerValue, outerIndex, innerIndex);\n } catch (err) {\n this.destination.error(err);\n return;\n }\n this.destination.next(result);\n }\n\n notifyComplete(innerSub: Subscription): void {\n const buffer = this.buffer;\n this.remove(innerSub);\n this.active--;\n if (buffer.length > 0) {\n this._next(buffer.shift());\n } else if (this.active === 0 && this.hasCompleted) {\n this.destination.complete();\n }\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { retryWhen } from '../../operator/retryWhen';\n\nObservable.prototype.retryWhen = retryWhen;\n\ndeclare module '../../Observable' {\n interface Observable {\n retryWhen: typeof retryWhen;\n }\n}","import { Observable } from '../Observable';\nimport { retryWhen as higherOrder } from '../operators/retryWhen';\n/**\n * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable\n * calls `error`, this method will emit the Throwable that caused the error to the Observable returned from `notifier`.\n * If that Observable calls `complete` or `error` then this method will call `complete` or `error` on the child\n * subscription. Otherwise this method will resubscribe to the source Observable.\n *\n * \n *\n * @param {function(errors: Observable): Observable} notifier - Receives an Observable of notifications with which a\n * user can `complete` or `error`, aborting the retry.\n * @return {Observable} The source Observable modified with retry logic.\n * @method retryWhen\n * @owner Observable\n */\nexport function retryWhen(this: Observable, notifier: (errors: Observable) => Observable): Observable {\n return higherOrder(notifier)(this) as Observable;\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { Subject } from '../Subject';\nimport { Subscription, TeardownLogic } from '../Subscription';\nimport { tryCatch } from '../util/tryCatch';\nimport { errorObject } from '../util/errorObject';\n\nimport { OuterSubscriber } from '../OuterSubscriber';\nimport { InnerSubscriber } from '../InnerSubscriber';\nimport { subscribeToResult } from '../util/subscribeToResult';\n\nimport { MonoTypeOperatorFunction } from '../interfaces';\n\n/**\n * Returns an Observable that mirrors the source Observable with the exception of an `error`. If the source Observable\n * calls `error`, this method will emit the Throwable that caused the error to the Observable returned from `notifier`.\n * If that Observable calls `complete` or `error` then this method will call `complete` or `error` on the child\n * subscription. Otherwise this method will resubscribe to the source Observable.\n *\n * \n *\n * @param {function(errors: Observable): Observable} notifier - Receives an Observable of notifications with which a\n * user can `complete` or `error`, aborting the retry.\n * @return {Observable} The source Observable modified with retry logic.\n * @method retryWhen\n * @owner Observable\n */\nexport function retryWhen(notifier: (errors: Observable) => Observable): MonoTypeOperatorFunction {\n return (source: Observable) => source.lift(new RetryWhenOperator(notifier, source));\n}\n\nclass RetryWhenOperator implements Operator {\n constructor(protected notifier: (errors: Observable) => Observable,\n public source: Observable) {\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass RetryWhenSubscriber extends OuterSubscriber {\n\n private errors: Subject;\n private retries: Observable;\n private retriesSubscription: Subscription;\n\n constructor(destination: Subscriber,\n private notifier: (errors: Observable) => Observable,\n private source: Observable) {\n super(destination);\n }\n\n error(err: any) {\n if (!this.isStopped) {\n\n let errors = this.errors;\n let retries: any = this.retries;\n let retriesSubscription = this.retriesSubscription;\n\n if (!retries) {\n errors = new Subject();\n retries = tryCatch(this.notifier)(errors);\n if (retries === errorObject) {\n return super.error(errorObject.e);\n }\n retriesSubscription = subscribeToResult(this, retries);\n } else {\n this.errors = null;\n this.retriesSubscription = null;\n }\n\n this._unsubscribeAndRecycle();\n\n this.errors = errors;\n this.retries = retries;\n this.retriesSubscription = retriesSubscription;\n\n errors.next(err);\n }\n }\n\n /** @deprecated internal use only */ _unsubscribe() {\n const { errors, retriesSubscription } = this;\n if (errors) {\n errors.unsubscribe();\n this.errors = null;\n }\n if (retriesSubscription) {\n retriesSubscription.unsubscribe();\n this.retriesSubscription = null;\n }\n this.retries = null;\n }\n\n notifyNext(outerValue: T, innerValue: R,\n outerIndex: number, innerIndex: number,\n innerSub: InnerSubscriber): void {\n const { errors, retries, retriesSubscription } = this;\n this.errors = null;\n this.retries = null;\n this.retriesSubscription = null;\n\n this._unsubscribeAndRecycle();\n\n this.errors = errors;\n this.retries = retries;\n this.retriesSubscription = retriesSubscription;\n\n this.source.subscribe(this);\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { share } from '../../operator/share';\n\nObservable.prototype.share = share;\n\ndeclare module '../../Observable' {\n interface Observable {\n share: typeof share;\n }\n}","import { Observable } from '../Observable';\nimport { share as higherOrder } from '../operators/share';\n\n/**\n * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one\n * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will\n * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.\n *\n * This behaves similarly to .publish().refCount(), with a behavior difference when the source observable emits complete.\n * .publish().refCount() will not resubscribe to the original source, however .share() will resubscribe to the original source.\n * Observable.of(\"test\").publish().refCount() will not re-emit \"test\" on new subscriptions, Observable.of(\"test\").share() will\n * re-emit \"test\" to new subscriptions.\n *\n * \n *\n * @return {Observable} An Observable that upon connection causes the source Observable to emit items to its Observers.\n * @method share\n * @owner Observable\n */\nexport function share(this: Observable): Observable {\n return higherOrder()(this) as Observable;\n};\n","import { Observable } from '../Observable';\nimport { multicast } from './multicast';\nimport { refCount } from './refCount';\nimport { Subject } from '../Subject';\n\nimport { MonoTypeOperatorFunction } from '../interfaces';\n\nfunction shareSubjectFactory() {\n return new Subject();\n}\n\n/**\n * Returns a new Observable that multicasts (shares) the original Observable. As long as there is at least one\n * Subscriber this Observable will be subscribed and emitting data. When all subscribers have unsubscribed it will\n * unsubscribe from the source Observable. Because the Observable is multicasting it makes the stream `hot`.\n * This is an alias for .multicast(() => new Subject()).refCount().\n *\n * \n *\n * @return {Observable} An Observable that upon connection causes the source Observable to emit items to its Observers.\n * @method share\n * @owner Observable\n */\nexport function share(): MonoTypeOperatorFunction {\n return (source: Observable) => refCount()(multicast(shareSubjectFactory)(source)) as Observable;\n};\n","import { Subject } from '../Subject';\nimport { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Observable } from '../Observable';\nimport { ConnectableObservable, connectableObservableDescriptor } from '../observable/ConnectableObservable';\nimport { FactoryOrValue, MonoTypeOperatorFunction, OperatorFunction, UnaryFunction } from '../interfaces';\n\n/* tslint:disable:max-line-length */\nexport function multicast(subjectOrSubjectFactory: FactoryOrValue>): UnaryFunction, ConnectableObservable>;\nexport function multicast(SubjectFactory: (this: Observable) => Subject, selector?: MonoTypeOperatorFunction): MonoTypeOperatorFunction;\nexport function multicast(SubjectFactory: (this: Observable) => Subject, selector?: OperatorFunction): OperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Returns an Observable that emits the results of invoking a specified selector on items\n * emitted by a ConnectableObservable that shares a single subscription to the underlying stream.\n *\n * \n *\n * @param {Function|Subject} subjectOrSubjectFactory - Factory function to create an intermediate subject through\n * which the source sequence's elements will be multicast to the selector function\n * or Subject to push source elements into.\n * @param {Function} [selector] - Optional selector function that can use the multicasted source stream\n * as many times as needed, without causing multiple subscriptions to the source stream.\n * Subscribers to the given source will receive all notifications of the source from the\n * time of the subscription forward.\n * @return {Observable} An Observable that emits the results of invoking the selector\n * on the items emitted by a `ConnectableObservable` that shares a single subscription to\n * the underlying stream.\n * @method multicast\n * @owner Observable\n */\nexport function multicast(subjectOrSubjectFactory: Subject | (() => Subject),\n selector?: (source: Observable) => Observable): OperatorFunction {\n return function multicastOperatorFunction(source: Observable): Observable {\n let subjectFactory: () => Subject;\n if (typeof subjectOrSubjectFactory === 'function') {\n subjectFactory = <() => Subject>subjectOrSubjectFactory;\n } else {\n subjectFactory = function subjectFactory() {\n return >subjectOrSubjectFactory;\n };\n }\n\n if (typeof selector === 'function') {\n return source.lift(new MulticastOperator(subjectFactory, selector));\n }\n\n const connectable: any = Object.create(source, connectableObservableDescriptor);\n connectable.source = source;\n connectable.subjectFactory = subjectFactory;\n\n return > connectable;\n };\n}\n\nexport class MulticastOperator implements Operator {\n constructor(private subjectFactory: () => Subject,\n private selector: (source: Observable) => Observable) {\n }\n call(subscriber: Subscriber, source: any): any {\n const { selector } = this;\n const subject = this.subjectFactory();\n const subscription = selector(subject).subscribe(subscriber);\n subscription.add(source.subscribe(subject));\n return subscription;\n }\n}\n","import { Subject, SubjectSubscriber } from '../Subject';\nimport { Operator } from '../Operator';\nimport { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription, TeardownLogic } from '../Subscription';\nimport { refCount as higherOrderRefCount } from '../operators/refCount';\n\n/**\n * @class ConnectableObservable\n */\nexport class ConnectableObservable extends Observable {\n\n /** @deprecated internal use only */ public _subject: Subject;\n /** @deprecated internal use only */ public _refCount: number = 0;\n /** @deprecated internal use only */ public _connection: Subscription;\n _isComplete = false;\n\n constructor(/** @deprecated internal use only */ public source: Observable,\n /** @deprecated internal use only */ public subjectFactory: () => Subject) {\n super();\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber) {\n return this.getSubject().subscribe(subscriber);\n }\n\n /** @deprecated internal use only */ public getSubject(): Subject {\n const subject = this._subject;\n if (!subject || subject.isStopped) {\n this._subject = this.subjectFactory();\n }\n return this._subject;\n }\n\n connect(): Subscription {\n let connection = this._connection;\n if (!connection) {\n this._isComplete = false;\n connection = this._connection = new Subscription();\n connection.add(this.source\n .subscribe(new ConnectableSubscriber(this.getSubject(), this)));\n if (connection.closed) {\n this._connection = null;\n connection = Subscription.EMPTY;\n } else {\n this._connection = connection;\n }\n }\n return connection;\n }\n\n refCount(): Observable {\n return higherOrderRefCount()(this) as Observable;\n }\n}\n\nconst connectableProto = ConnectableObservable.prototype;\n\nexport const connectableObservableDescriptor: PropertyDescriptorMap = {\n operator: { value: null },\n _refCount: { value: 0, writable: true },\n _subject: { value: null, writable: true },\n _connection: { value: null, writable: true },\n _subscribe: { value: connectableProto._subscribe },\n _isComplete: { value: connectableProto._isComplete, writable: true },\n getSubject: { value: connectableProto.getSubject },\n connect: { value: connectableProto.connect },\n refCount: { value: connectableProto.refCount }\n};\n\nclass ConnectableSubscriber extends SubjectSubscriber {\n constructor(destination: Subject,\n private connectable: ConnectableObservable) {\n super(destination);\n }\n protected _error(err: any): void {\n this._unsubscribe();\n super._error(err);\n }\n protected _complete(): void {\n this.connectable._isComplete = true;\n this._unsubscribe();\n super._complete();\n }\n /** @deprecated internal use only */ _unsubscribe() {\n const connectable = this.connectable;\n if (connectable) {\n this.connectable = null;\n const connection = connectable._connection;\n connectable._refCount = 0;\n connectable._subject = null;\n connectable._connection = null;\n if (connection) {\n connection.unsubscribe();\n }\n }\n }\n}\n\nclass RefCountOperator implements Operator {\n constructor(private connectable: ConnectableObservable) {\n }\n call(subscriber: Subscriber, source: any): TeardownLogic {\n\n const { connectable } = this;\n ( connectable)._refCount++;\n\n const refCounter = new RefCountSubscriber(subscriber, connectable);\n const subscription = source.subscribe(refCounter);\n\n if (!refCounter.closed) {\n ( refCounter).connection = connectable.connect();\n }\n\n return subscription;\n }\n}\n\nclass RefCountSubscriber extends Subscriber {\n\n private connection: Subscription;\n\n constructor(destination: Subscriber,\n private connectable: ConnectableObservable) {\n super(destination);\n }\n\n /** @deprecated internal use only */ _unsubscribe() {\n\n const { connectable } = this;\n if (!connectable) {\n this.connection = null;\n return;\n }\n\n this.connectable = null;\n const refCount = ( connectable)._refCount;\n if (refCount <= 0) {\n this.connection = null;\n return;\n }\n\n ( connectable)._refCount = refCount - 1;\n if (refCount > 1) {\n this.connection = null;\n return;\n }\n\n ///\n // Compare the local RefCountSubscriber's connection Subscription to the\n // connection Subscription on the shared ConnectableObservable. In cases\n // where the ConnectableObservable source synchronously emits values, and\n // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n // execution continues to here before the RefCountOperator has a chance to\n // supply the RefCountSubscriber with the shared connection Subscription.\n // For example:\n // ```\n // Observable.range(0, 10)\n // .publish()\n // .refCount()\n // .take(5)\n // .subscribe();\n // ```\n // In order to account for this case, RefCountSubscriber should only dispose\n // the ConnectableObservable's shared connection Subscription if the\n // connection Subscription exists, *and* either:\n // a. RefCountSubscriber doesn't have a reference to the shared connection\n // Subscription yet, or,\n // b. RefCountSubscriber's connection Subscription reference is identical\n // to the shared connection Subscription\n ///\n const { connection } = this;\n const sharedConnection = ( connectable)._connection;\n this.connection = null;\n\n if (sharedConnection && (!connection || sharedConnection === connection)) {\n sharedConnection.unsubscribe();\n }\n }\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { Subscription, TeardownLogic } from '../Subscription';\nimport { MonoTypeOperatorFunction } from '../interfaces';\nimport { ConnectableObservable } from '../observable/ConnectableObservable';\nimport { Observable } from '../Observable';\n\nexport function refCount(): MonoTypeOperatorFunction {\n return function refCountOperatorFunction(source: ConnectableObservable): Observable {\n return source.lift(new RefCountOperator(source));\n };\n}\n\nclass RefCountOperator implements Operator {\n constructor(private connectable: ConnectableObservable) {\n }\n call(subscriber: Subscriber, source: any): TeardownLogic {\n\n const { connectable } = this;\n ( connectable)._refCount++;\n\n const refCounter = new RefCountSubscriber(subscriber, connectable);\n const subscription = source.subscribe(refCounter);\n\n if (!refCounter.closed) {\n ( refCounter).connection = connectable.connect();\n }\n\n return subscription;\n }\n}\n\nclass RefCountSubscriber extends Subscriber {\n\n private connection: Subscription;\n\n constructor(destination: Subscriber,\n private connectable: ConnectableObservable) {\n super(destination);\n }\n\n /** @deprecated internal use only */ _unsubscribe() {\n\n const { connectable } = this;\n if (!connectable) {\n this.connection = null;\n return;\n }\n\n this.connectable = null;\n const refCount = ( connectable)._refCount;\n if (refCount <= 0) {\n this.connection = null;\n return;\n }\n\n ( connectable)._refCount = refCount - 1;\n if (refCount > 1) {\n this.connection = null;\n return;\n }\n\n ///\n // Compare the local RefCountSubscriber's connection Subscription to the\n // connection Subscription on the shared ConnectableObservable. In cases\n // where the ConnectableObservable source synchronously emits values, and\n // the RefCountSubscriber's downstream Observers synchronously unsubscribe,\n // execution continues to here before the RefCountOperator has a chance to\n // supply the RefCountSubscriber with the shared connection Subscription.\n // For example:\n // ```\n // Observable.range(0, 10)\n // .publish()\n // .refCount()\n // .take(5)\n // .subscribe();\n // ```\n // In order to account for this case, RefCountSubscriber should only dispose\n // the ConnectableObservable's shared connection Subscription if the\n // connection Subscription exists, *and* either:\n // a. RefCountSubscriber doesn't have a reference to the shared connection\n // Subscription yet, or,\n // b. RefCountSubscriber's connection Subscription reference is identical\n // to the shared connection Subscription\n ///\n const { connection } = this;\n const sharedConnection = ( connectable)._connection;\n this.connection = null;\n\n if (sharedConnection && (!connection || sharedConnection === connection)) {\n sharedConnection.unsubscribe();\n }\n }\n}\n","\nimport { Observable } from '../../Observable';\nimport { take } from '../../operator/take';\n\nObservable.prototype.take = take;\n\ndeclare module '../../Observable' {\n interface Observable {\n take: typeof take;\n }\n}","import { Observable } from '../Observable';\nimport { take as higherOrder } from '../operators/take';\n\n/**\n * Emits only the first `count` values emitted by the source Observable.\n *\n * Takes the first `count` values from the source, then\n * completes.\n *\n * \n *\n * `take` returns an Observable that emits only the first `count` values emitted\n * by the source Observable. If the source emits fewer than `count` values then\n * all of its values are emitted. After that, it completes, regardless if the\n * source completes.\n *\n * @example Take the first 5 seconds of an infinite 1-second interval Observable\n * var interval = Rx.Observable.interval(1000);\n * var five = interval.take(5);\n * five.subscribe(x => console.log(x));\n *\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of `next` values to emit.\n * @return {Observable} An Observable that emits only the first `count`\n * values emitted by the source Observable, or all of the values from the source\n * if the source emits fewer than `count` values.\n * @method take\n * @owner Observable\n */\nexport function take(this: Observable, count: number): Observable {\n return higherOrder(count)(this) as Observable;\n}\n","import { Operator } from '../Operator';\nimport { Subscriber } from '../Subscriber';\nimport { ArgumentOutOfRangeError } from '../util/ArgumentOutOfRangeError';\nimport { EmptyObservable } from '../observable/EmptyObservable';\nimport { Observable } from '../Observable';\nimport { TeardownLogic } from '../Subscription';\nimport { MonoTypeOperatorFunction } from '../interfaces';\n\n/**\n * Emits only the first `count` values emitted by the source Observable.\n *\n * Takes the first `count` values from the source, then\n * completes.\n *\n * \n *\n * `take` returns an Observable that emits only the first `count` values emitted\n * by the source Observable. If the source emits fewer than `count` values then\n * all of its values are emitted. After that, it completes, regardless if the\n * source completes.\n *\n * @example Take the first 5 seconds of an infinite 1-second interval Observable\n * var interval = Rx.Observable.interval(1000);\n * var five = interval.take(5);\n * five.subscribe(x => console.log(x));\n *\n * @see {@link takeLast}\n * @see {@link takeUntil}\n * @see {@link takeWhile}\n * @see {@link skip}\n *\n * @throws {ArgumentOutOfRangeError} When using `take(i)`, it delivers an\n * ArgumentOutOrRangeError to the Observer's `error` callback if `i < 0`.\n *\n * @param {number} count The maximum number of `next` values to emit.\n * @return {Observable} An Observable that emits only the first `count`\n * values emitted by the source Observable, or all of the values from the source\n * if the source emits fewer than `count` values.\n * @method take\n * @owner Observable\n */\nexport function take(count: number): MonoTypeOperatorFunction {\n return (source: Observable) => {\n if (count === 0) {\n return new EmptyObservable();\n } else {\n return source.lift(new TakeOperator(count));\n }\n };\n}\n\nclass TakeOperator implements Operator {\n constructor(private total: number) {\n if (this.total < 0) {\n throw new ArgumentOutOfRangeError;\n }\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new TakeSubscriber(subscriber, this.total));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nclass TakeSubscriber extends Subscriber {\n private count: number = 0;\n\n constructor(destination: Subscriber, private total: number) {\n super(destination);\n }\n\n protected _next(value: T): void {\n const total = this.total;\n const count = ++this.count;\n if (count <= total) {\n this.destination.next(value);\n if (count === total) {\n this.destination.complete();\n this.unsubscribe();\n }\n }\n }\n}\n","/**\n * An error thrown when an element was queried at a certain index of an\n * Observable, but no such index or position exists in that sequence.\n *\n * @see {@link elementAt}\n * @see {@link take}\n * @see {@link takeLast}\n *\n * @class ArgumentOutOfRangeError\n */\nexport class ArgumentOutOfRangeError extends Error {\n constructor() {\n const err: any = super('argument out of range');\n ( this).name = err.name = 'ArgumentOutOfRangeError';\n ( this).stack = err.stack;\n ( this).message = err.message;\n }\n}\n","import { Observable } from '../../../Observable';\nimport { ajax as staticAjax } from '../../../observable/dom/ajax';\nimport { AjaxCreationMethod } from '../../../observable/dom/AjaxObservable';\n\nObservable.ajax = staticAjax;\n\ndeclare module '../../../Observable' {\n namespace Observable {\n export let ajax: AjaxCreationMethod;\n }\n}","import { AjaxObservable, AjaxCreationMethod } from './AjaxObservable';\n\nexport const ajax: AjaxCreationMethod = AjaxObservable.create;","import { root } from '../../util/root';\nimport { tryCatch } from '../../util/tryCatch';\nimport { errorObject } from '../../util/errorObject';\nimport { Observable } from '../../Observable';\nimport { Subscriber } from '../../Subscriber';\nimport { TeardownLogic } from '../../Subscription';\nimport { map } from '../../operators/map';\n\nexport interface AjaxRequest {\n url?: string;\n body?: any;\n user?: string;\n async?: boolean;\n method?: string;\n headers?: Object;\n timeout?: number;\n password?: string;\n hasContent?: boolean;\n crossDomain?: boolean;\n withCredentials?: boolean;\n createXHR?: () => XMLHttpRequest;\n progressSubscriber?: Subscriber;\n responseType?: string;\n}\n\nfunction getCORSRequest(this: AjaxRequest): XMLHttpRequest {\n if (root.XMLHttpRequest) {\n return new root.XMLHttpRequest();\n } else if (!!root.XDomainRequest) {\n return new root.XDomainRequest();\n } else {\n throw new Error('CORS is not supported by your browser');\n }\n}\n\nfunction getXMLHttpRequest(): XMLHttpRequest {\n if (root.XMLHttpRequest) {\n return new root.XMLHttpRequest();\n } else {\n let progId: string;\n try {\n const progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];\n for (let i = 0; i < 3; i++) {\n try {\n progId = progIds[i];\n if (new root.ActiveXObject(progId)) {\n break;\n }\n } catch (e) {\n //suppress exceptions\n }\n }\n return new root.ActiveXObject(progId);\n } catch (e) {\n throw new Error('XMLHttpRequest is not supported by your browser');\n }\n }\n}\n\nexport interface AjaxCreationMethod {\n (urlOrRequest: string | AjaxRequest): Observable;\n get(url: string, headers?: Object): Observable;\n post(url: string, body?: any, headers?: Object): Observable;\n put(url: string, body?: any, headers?: Object): Observable;\n patch(url: string, body?: any, headers?: Object): Observable;\n delete(url: string, headers?: Object): Observable;\n getJSON(url: string, headers?: Object): Observable;\n}\n\nexport function ajaxGet(url: string, headers: Object = null) {\n return new AjaxObservable({ method: 'GET', url, headers });\n};\n\nexport function ajaxPost(url: string, body?: any, headers?: Object): Observable {\n return new AjaxObservable({ method: 'POST', url, body, headers });\n};\n\nexport function ajaxDelete(url: string, headers?: Object): Observable {\n return new AjaxObservable({ method: 'DELETE', url, headers });\n};\n\nexport function ajaxPut(url: string, body?: any, headers?: Object): Observable {\n return new AjaxObservable({ method: 'PUT', url, body, headers });\n};\n\nexport function ajaxPatch(url: string, body?: any, headers?: Object): Observable {\n return new AjaxObservable({ method: 'PATCH', url, body, headers });\n};\n\nconst mapResponse = map((x: AjaxResponse, index: number) => x.response);\n\nexport function ajaxGetJSON(url: string, headers?: Object): Observable {\n return mapResponse(\n new AjaxObservable({\n method: 'GET',\n url,\n responseType: 'json',\n headers\n })\n );\n};\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class AjaxObservable extends Observable {\n /**\n * Creates an observable for an Ajax request with either a request object with\n * url, headers, etc or a string for a URL.\n *\n * @example\n * source = Rx.Observable.ajax('/products');\n * source = Rx.Observable.ajax({ url: 'products', method: 'GET' });\n *\n * @param {string|Object} request Can be one of the following:\n * A string of the URL to make the Ajax call.\n * An object with the following properties\n * - url: URL of the request\n * - body: The body of the request\n * - method: Method of the request, such as GET, POST, PUT, PATCH, DELETE\n * - async: Whether the request is async\n * - headers: Optional headers\n * - crossDomain: true if a cross domain request, else false\n * - createXHR: a function to override if you need to use an alternate\n * XMLHttpRequest implementation.\n * - resultSelector: a function to use to alter the output value type of\n * the Observable. Gets {@link AjaxResponse} as an argument.\n * @return {Observable} An observable sequence containing the XMLHttpRequest.\n * @static true\n * @name ajax\n * @owner Observable\n */\n static create: AjaxCreationMethod = (() => {\n const create: any = (urlOrRequest: string | AjaxRequest) => {\n return new AjaxObservable(urlOrRequest);\n };\n\n create.get = ajaxGet;\n create.post = ajaxPost;\n create.delete = ajaxDelete;\n create.put = ajaxPut;\n create.patch = ajaxPatch;\n create.getJSON = ajaxGetJSON;\n\n return create;\n })();\n\n private request: AjaxRequest;\n\n constructor(urlOrRequest: string | AjaxRequest) {\n super();\n\n const request: AjaxRequest = {\n async: true,\n createXHR: function(this: AjaxRequest) {\n return this.crossDomain ? getCORSRequest.call(this) : getXMLHttpRequest();\n },\n crossDomain: false,\n withCredentials: false,\n headers: {},\n method: 'GET',\n responseType: 'json',\n timeout: 0\n };\n\n if (typeof urlOrRequest === 'string') {\n request.url = urlOrRequest;\n } else {\n for (const prop in urlOrRequest) {\n if (urlOrRequest.hasOwnProperty(prop)) {\n request[prop] = urlOrRequest[prop];\n }\n }\n }\n\n this.request = request;\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n return new AjaxSubscriber(subscriber, this.request);\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class AjaxSubscriber extends Subscriber {\n private xhr: XMLHttpRequest;\n private done: boolean = false;\n\n constructor(destination: Subscriber, public request: AjaxRequest) {\n super(destination);\n\n const headers = request.headers = request.headers || {};\n\n // force CORS if requested\n if (!request.crossDomain && !headers['X-Requested-With']) {\n headers['X-Requested-With'] = 'XMLHttpRequest';\n }\n\n // ensure content type is set\n if (!('Content-Type' in headers) && !(root.FormData && request.body instanceof root.FormData) && typeof request.body !== 'undefined') {\n headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';\n }\n\n // properly serialize body\n request.body = this.serializeBody(request.body, request.headers['Content-Type']);\n\n this.send();\n }\n\n next(e: Event): void {\n this.done = true;\n const { xhr, request, destination } = this;\n const response = new AjaxResponse(e, xhr, request);\n\n destination.next(response);\n }\n\n private send(): XMLHttpRequest {\n const {\n request,\n request: { user, method, url, async, password, headers, body }\n } = this;\n const createXHR = request.createXHR;\n const xhr: XMLHttpRequest = tryCatch(createXHR).call(request);\n\n if (xhr === errorObject) {\n this.error(errorObject.e);\n } else {\n this.xhr = xhr;\n\n // set up the events before open XHR\n // https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest\n // You need to add the event listeners before calling open() on the request.\n // Otherwise the progress events will not fire.\n this.setupEvents(xhr, request);\n // open XHR\n let result: any;\n if (user) {\n result = tryCatch(xhr.open).call(xhr, method, url, async, user, password);\n } else {\n result = tryCatch(xhr.open).call(xhr, method, url, async);\n }\n\n if (result === errorObject) {\n this.error(errorObject.e);\n return null;\n }\n\n // timeout, responseType and withCredentials can be set once the XHR is open\n if (async) {\n xhr.timeout = request.timeout;\n xhr.responseType = request.responseType as any;\n }\n\n if ('withCredentials' in xhr) {\n xhr.withCredentials = !!request.withCredentials;\n }\n\n // set headers\n this.setHeaders(xhr, headers);\n\n // finally send the request\n result = body ? tryCatch(xhr.send).call(xhr, body) : tryCatch(xhr.send).call(xhr);\n if (result === errorObject) {\n this.error(errorObject.e);\n return null;\n }\n }\n\n return xhr;\n }\n\n private serializeBody(body: any, contentType?: string) {\n if (!body || typeof body === 'string') {\n return body;\n } else if (root.FormData && body instanceof root.FormData) {\n return body;\n }\n\n if (contentType) {\n const splitIndex = contentType.indexOf(';');\n if (splitIndex !== -1) {\n contentType = contentType.substring(0, splitIndex);\n }\n }\n\n switch (contentType) {\n case 'application/x-www-form-urlencoded':\n return Object.keys(body).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(body[key])}`).join('&');\n case 'application/json':\n return JSON.stringify(body);\n default:\n return body;\n }\n }\n\n private setHeaders(xhr: XMLHttpRequest, headers: Object) {\n for (let key in headers) {\n if (headers.hasOwnProperty(key)) {\n xhr.setRequestHeader(key, headers[key]);\n }\n }\n }\n\n private setupEvents(xhr: XMLHttpRequest, request: AjaxRequest) {\n const progressSubscriber = request.progressSubscriber;\n\n function xhrTimeout(this: XMLHttpRequest, e: ProgressEvent) {\n const {subscriber, progressSubscriber, request } = (xhrTimeout);\n if (progressSubscriber) {\n progressSubscriber.error(e);\n }\n subscriber.error(new AjaxTimeoutError(this, request)); //TODO: Make betterer.\n };\n xhr.ontimeout = xhrTimeout;\n (xhrTimeout).request = request;\n (xhrTimeout).subscriber = this;\n (xhrTimeout).progressSubscriber = progressSubscriber;\n if (xhr.upload && 'withCredentials' in xhr) {\n if (progressSubscriber) {\n let xhrProgress: (e: ProgressEvent) => void;\n xhrProgress = function(e: ProgressEvent) {\n const { progressSubscriber } = (xhrProgress);\n progressSubscriber.next(e);\n };\n if (root.XDomainRequest) {\n xhr.onprogress = xhrProgress;\n } else {\n xhr.upload.onprogress = xhrProgress;\n }\n (xhrProgress).progressSubscriber = progressSubscriber;\n }\n let xhrError: (e: ErrorEvent) => void;\n xhrError = function(this: XMLHttpRequest, e: ErrorEvent) {\n const { progressSubscriber, subscriber, request } = (xhrError);\n if (progressSubscriber) {\n progressSubscriber.error(e);\n }\n subscriber.error(new AjaxError('ajax error', this, request));\n };\n xhr.onerror = xhrError;\n (xhrError).request = request;\n (xhrError).subscriber = this;\n (xhrError).progressSubscriber = progressSubscriber;\n }\n\n function xhrReadyStateChange(this: XMLHttpRequest, e: ProgressEvent) {\n const { subscriber, progressSubscriber, request } = (xhrReadyStateChange);\n if (this.readyState === 4) {\n // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)\n let status: number = this.status === 1223 ? 204 : this.status;\n let response: any = (this.responseType === 'text' ? (\n this.response || this.responseText) : this.response);\n\n // fix status code when it is 0 (0 status is undocumented).\n // Occurs when accessing file resources or on Android 4.1 stock browser\n // while retrieving files from application cache.\n if (status === 0) {\n status = response ? 200 : 0;\n }\n\n if (200 <= status && status < 300) {\n if (progressSubscriber) {\n progressSubscriber.complete();\n }\n subscriber.next(e);\n subscriber.complete();\n } else {\n if (progressSubscriber) {\n progressSubscriber.error(e);\n }\n subscriber.error(new AjaxError('ajax error ' + status, this, request));\n }\n }\n };\n xhr.onreadystatechange = xhrReadyStateChange;\n (xhrReadyStateChange).subscriber = this;\n (xhrReadyStateChange).progressSubscriber = progressSubscriber;\n (xhrReadyStateChange).request = request;\n }\n\n unsubscribe() {\n const { done, xhr } = this;\n if (!done && xhr && xhr.readyState !== 4 && typeof xhr.abort === 'function') {\n xhr.abort();\n }\n super.unsubscribe();\n }\n}\n\n/**\n * A normalized AJAX response.\n *\n * @see {@link ajax}\n *\n * @class AjaxResponse\n */\nexport class AjaxResponse {\n /** @type {number} The HTTP status code */\n status: number;\n\n /** @type {string|ArrayBuffer|Document|object|any} The response data */\n response: any;\n\n /** @type {string} The raw responseText */\n responseText: string;\n\n /** @type {string} The responseType (e.g. 'json', 'arraybuffer', or 'xml') */\n responseType: string;\n\n constructor(public originalEvent: Event, public xhr: XMLHttpRequest, public request: AjaxRequest) {\n this.status = xhr.status;\n this.responseType = xhr.responseType || request.responseType;\n this.response = parseXhrResponse(this.responseType, xhr);\n }\n}\n\n/**\n * A normalized AJAX error.\n *\n * @see {@link ajax}\n *\n * @class AjaxError\n */\nexport class AjaxError extends Error {\n /** @type {XMLHttpRequest} The XHR instance associated with the error */\n xhr: XMLHttpRequest;\n\n /** @type {AjaxRequest} The AjaxRequest associated with the error */\n request: AjaxRequest;\n\n /** @type {number} The HTTP status code */\n status: number;\n\n /** @type {string} The responseType (e.g. 'json', 'arraybuffer', or 'xml') */\n responseType: string;\n\n /** @type {string|ArrayBuffer|Document|object|any} The response data */\n response: any;\n\n constructor(message: string, xhr: XMLHttpRequest, request: AjaxRequest) {\n super(message);\n this.message = message;\n this.xhr = xhr;\n this.request = request;\n this.status = xhr.status;\n this.responseType = xhr.responseType || request.responseType;\n this.response = parseXhrResponse(this.responseType, xhr);\n }\n}\n\nfunction parseXhrResponse(responseType: string, xhr: XMLHttpRequest) {\n switch (responseType) {\n case 'json':\n if ('response' in xhr) {\n //IE does not support json as responseType, parse it internally\n return xhr.responseType ? xhr.response : JSON.parse(xhr.response || xhr.responseText || 'null');\n } else {\n // HACK(benlesh): TypeScript shennanigans\n // tslint:disable-next-line:no-any latest TS seems to think xhr is \"never\" here.\n return JSON.parse((xhr as any).responseText || 'null');\n }\n case 'xml':\n return xhr.responseXML;\n case 'text':\n default:\n // HACK(benlesh): TypeScript shennanigans\n // tslint:disable-next-line:no-any latest TS seems to think xhr is \"never\" here.\n return ('response' in xhr) ? xhr.response : (xhr as any).responseText;\n }\n}\n\n/**\n * @see {@link ajax}\n *\n * @class AjaxTimeoutError\n */\nexport class AjaxTimeoutError extends AjaxError {\n constructor(xhr: XMLHttpRequest, request: AjaxRequest) {\n super('ajax timeout', xhr, request);\n }\n}\n","import { Observable } from '../../Observable';\nimport { empty as staticEmpty } from '../../observable/empty';\n\nObservable.empty = staticEmpty;\n\ndeclare module '../../Observable' {\n namespace Observable {\n export let empty: typeof staticEmpty;\n }\n}","import { EmptyObservable } from './EmptyObservable';\n\nexport const empty = EmptyObservable.create;","import { Observable } from '../../Observable';\nimport { from as staticFrom } from '../../observable/from';\n\nObservable.from = staticFrom;\n\ndeclare module '../../Observable' {\n namespace Observable {\n export let from: typeof staticFrom;\n }\n}","import { FromObservable } from './FromObservable';\n\nexport const from = FromObservable.create;","import { isArray } from '../util/isArray';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { PromiseObservable } from './PromiseObservable';\nimport { IteratorObservable } from'./IteratorObservable';\nimport { ArrayObservable } from './ArrayObservable';\nimport { ArrayLikeObservable } from './ArrayLikeObservable';\n\nimport { IScheduler } from '../Scheduler';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { Observable, ObservableInput } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { ObserveOnSubscriber } from '../operators/observeOn';\nimport { observable as Symbol_observable } from '../symbol/observable';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class FromObservable extends Observable {\n constructor(private ish: ObservableInput, private scheduler?: IScheduler) {\n super(null);\n }\n\n static create(ish: ObservableInput, scheduler?: IScheduler): Observable;\n static create(ish: ArrayLike, scheduler?: IScheduler): Observable;\n\n /**\n * Creates an Observable from an Array, an array-like object, a Promise, an\n * iterable object, or an Observable-like object.\n *\n * Converts almost anything to an Observable.\n *\n * \n *\n * Convert various other objects and data types into Observables. `from`\n * converts a Promise or an array-like or an\n * [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)\n * object into an Observable that emits the items in that promise or array or\n * iterable. A String, in this context, is treated as an array of characters.\n * Observable-like objects (contains a function named with the ES2015 Symbol\n * for Observable) can also be converted through this operator.\n *\n * @example Converts an array to an Observable\n * var array = [10, 20, 30];\n * var result = Rx.Observable.from(array);\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // 10 20 30\n *\n * @example Convert an infinite iterable (from a generator) to an Observable\n * function* generateDoubles(seed) {\n * var i = seed;\n * while (true) {\n * yield i;\n * i = 2 * i; // double it\n * }\n * }\n *\n * var iterator = generateDoubles(3);\n * var result = Rx.Observable.from(iterator).take(10);\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // 3 6 12 24 48 96 192 384 768 1536\n *\n * @see {@link create}\n * @see {@link fromEvent}\n * @see {@link fromEventPattern}\n * @see {@link fromPromise}\n *\n * @param {ObservableInput} ish A subscribable object, a Promise, an\n * Observable-like, an Array, an iterable or an array-like object to be\n * converted.\n * @param {Scheduler} [scheduler] The scheduler on which to schedule the\n * emissions of values.\n * @return {Observable} The Observable whose values are originally from the\n * input object that was converted.\n * @static true\n * @name from\n * @owner Observable\n */\n static create(ish: ObservableInput, scheduler?: IScheduler): Observable {\n if (ish != null) {\n if (typeof ish[Symbol_observable] === 'function') {\n if (ish instanceof Observable && !scheduler) {\n return ish;\n }\n return new FromObservable(ish, scheduler);\n } else if (isArray(ish)) {\n return new ArrayObservable(ish, scheduler);\n } else if (isPromise(ish)) {\n return new PromiseObservable(ish, scheduler);\n } else if (typeof ish[Symbol_iterator] === 'function' || typeof ish === 'string') {\n return new IteratorObservable(ish, scheduler);\n } else if (isArrayLike(ish)) {\n return new ArrayLikeObservable(ish, scheduler);\n }\n }\n\n throw new TypeError((ish !== null && typeof ish || ish) + ' is not observable');\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber) {\n const ish = this.ish;\n const scheduler = this.scheduler;\n if (scheduler == null) {\n return ish[Symbol_observable]().subscribe(subscriber);\n } else {\n return ish[Symbol_observable]().subscribe(new ObserveOnSubscriber(subscriber, scheduler, 0));\n }\n }\n}\n","import { root } from '../util/root';\nimport { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { TeardownLogic } from '../Subscription';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class PromiseObservable extends Observable {\n\n public value: T;\n\n /**\n * Converts a Promise to an Observable.\n *\n * Returns an Observable that just emits the Promise's\n * resolved value, then completes.\n *\n * Converts an ES2015 Promise or a Promises/A+ spec compliant Promise to an\n * Observable. If the Promise resolves with a value, the output Observable\n * emits that resolved value as a `next`, and then completes. If the Promise\n * is rejected, then the output Observable emits the corresponding Error.\n *\n * @example Convert the Promise returned by Fetch to an Observable\n * var result = Rx.Observable.fromPromise(fetch('http://myserver.com/'));\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @see {@link bindCallback}\n * @see {@link from}\n *\n * @param {PromiseLike} promise The promise to be converted.\n * @param {Scheduler} [scheduler] An optional IScheduler to use for scheduling\n * the delivery of the resolved value (or the rejection).\n * @return {Observable} An Observable which wraps the Promise.\n * @static true\n * @name fromPromise\n * @owner Observable\n */\n static create(promise: PromiseLike, scheduler?: IScheduler): Observable {\n return new PromiseObservable(promise, scheduler);\n }\n\n constructor(private promise: PromiseLike, private scheduler?: IScheduler) {\n super();\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n const promise = this.promise;\n const scheduler = this.scheduler;\n\n if (scheduler == null) {\n if (this._isScalar) {\n if (!subscriber.closed) {\n subscriber.next(this.value);\n subscriber.complete();\n }\n } else {\n promise.then(\n (value) => {\n this.value = value;\n this._isScalar = true;\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n },\n (err) => {\n if (!subscriber.closed) {\n subscriber.error(err);\n }\n }\n )\n .then(null, err => {\n // escape the promise trap, throw unhandled errors\n root.setTimeout(() => { throw err; });\n });\n }\n } else {\n if (this._isScalar) {\n if (!subscriber.closed) {\n return scheduler.schedule(dispatchNext, 0, { value: this.value, subscriber });\n }\n } else {\n promise.then(\n (value) => {\n this.value = value;\n this._isScalar = true;\n if (!subscriber.closed) {\n subscriber.add(scheduler.schedule(dispatchNext, 0, { value, subscriber }));\n }\n },\n (err) => {\n if (!subscriber.closed) {\n subscriber.add(scheduler.schedule(dispatchError, 0, { err, subscriber }));\n }\n })\n .then(null, (err) => {\n // escape the promise trap, throw unhandled errors\n root.setTimeout(() => { throw err; });\n });\n }\n }\n }\n}\n\ninterface DispatchNextArg {\n subscriber: Subscriber;\n value: T;\n}\nfunction dispatchNext(arg: DispatchNextArg) {\n const { value, subscriber } = arg;\n if (!subscriber.closed) {\n subscriber.next(value);\n subscriber.complete();\n }\n}\n\ninterface DispatchErrorArg {\n subscriber: Subscriber;\n err: any;\n}\nfunction dispatchError(arg: DispatchErrorArg) {\n const { err, subscriber } = arg;\n if (!subscriber.closed) {\n subscriber.error(err);\n }\n}\n","import { root } from '../util/root';\nimport { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { TeardownLogic } from '../Subscription';\nimport { Subscriber } from '../Subscriber';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class IteratorObservable extends Observable {\n private iterator: any;\n\n static create(iterator: any, scheduler?: IScheduler): IteratorObservable {\n return new IteratorObservable(iterator, scheduler);\n }\n\n static dispatch(state: any) {\n\n const { index, hasError, iterator, subscriber } = state;\n\n if (hasError) {\n subscriber.error(state.error);\n return;\n }\n\n let result = iterator.next();\n if (result.done) {\n subscriber.complete();\n return;\n }\n\n subscriber.next(result.value);\n state.index = index + 1;\n\n if (subscriber.closed) {\n if (typeof iterator.return === 'function') {\n iterator.return();\n }\n return;\n }\n\n ( this).schedule(state);\n }\n\n constructor(iterator: any, private scheduler?: IScheduler) {\n super();\n\n if (iterator == null) {\n throw new Error('iterator cannot be null.');\n }\n\n this.iterator = getIterator(iterator);\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n\n let index = 0;\n const { iterator, scheduler } = this;\n\n if (scheduler) {\n return scheduler.schedule(IteratorObservable.dispatch, 0, {\n index, iterator, subscriber\n });\n } else {\n do {\n let result = iterator.next();\n if (result.done) {\n subscriber.complete();\n break;\n } else {\n subscriber.next(result.value);\n }\n if (subscriber.closed) {\n if (typeof iterator.return === 'function') {\n iterator.return();\n }\n break;\n }\n } while (true);\n }\n }\n}\n\nclass StringIterator {\n constructor(private str: string,\n private idx: number = 0,\n private len: number = str.length) {\n }\n [Symbol_iterator]() { return (this); }\n next() {\n return this.idx < this.len ? {\n done: false,\n value: this.str.charAt(this.idx++)\n } : {\n done: true,\n value: undefined\n };\n }\n}\n\nclass ArrayIterator {\n constructor(private arr: Array,\n private idx: number = 0,\n private len: number = toLength(arr)) {\n }\n [Symbol_iterator]() { return this; }\n next() {\n return this.idx < this.len ? {\n done: false,\n value: this.arr[this.idx++]\n } : {\n done: true,\n value: undefined\n };\n }\n}\n\nfunction getIterator(obj: any) {\n const i = obj[Symbol_iterator];\n if (!i && typeof obj === 'string') {\n return new StringIterator(obj);\n }\n if (!i && obj.length !== undefined) {\n return new ArrayIterator(obj);\n }\n if (!i) {\n throw new TypeError('object is not iterable');\n }\n return obj[Symbol_iterator]();\n}\n\nconst maxSafeInteger = Math.pow(2, 53) - 1;\n\nfunction toLength(o: any) {\n let len = +o.length;\n if (isNaN(len)) {\n return 0;\n }\n if (len === 0 || !numberIsFinite(len)) {\n return len;\n }\n len = sign(len) * Math.floor(Math.abs(len));\n if (len <= 0) {\n return 0;\n }\n if (len > maxSafeInteger) {\n return maxSafeInteger;\n }\n return len;\n}\n\nfunction numberIsFinite(value: any) {\n return typeof value === 'number' && root.isFinite(value);\n}\n\nfunction sign(value: any) {\n let valueAsNumber = +value;\n if (valueAsNumber === 0) {\n return valueAsNumber;\n }\n if (isNaN(valueAsNumber)) {\n return valueAsNumber;\n }\n return valueAsNumber < 0 ? -1 : 1;\n}\n","import { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { ScalarObservable } from './ScalarObservable';\nimport { EmptyObservable } from './EmptyObservable';\nimport { Subscriber } from '../Subscriber';\nimport { TeardownLogic } from '../Subscription';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class ArrayLikeObservable extends Observable {\n\n static create(arrayLike: ArrayLike, scheduler?: IScheduler): Observable {\n const length = arrayLike.length;\n if (length === 0) {\n return new EmptyObservable();\n } else if (length === 1) {\n return new ScalarObservable(arrayLike[0], scheduler);\n } else {\n return new ArrayLikeObservable(arrayLike, scheduler);\n }\n }\n\n static dispatch(state: any) {\n const { arrayLike, index, length, subscriber } = state;\n\n if (subscriber.closed) {\n return;\n }\n\n if (index >= length) {\n subscriber.complete();\n return;\n }\n\n subscriber.next(arrayLike[index]);\n\n state.index = index + 1;\n\n ( this).schedule(state);\n }\n\n // value used if Array has one value and _isScalar\n private value: any;\n\n constructor(private arrayLike: ArrayLike, private scheduler?: IScheduler) {\n super();\n if (!scheduler && arrayLike.length === 1) {\n this._isScalar = true;\n this.value = arrayLike[0];\n }\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n let index = 0;\n const { arrayLike, scheduler } = this;\n const length = arrayLike.length;\n\n if (scheduler) {\n return scheduler.schedule(ArrayLikeObservable.dispatch, 0, {\n arrayLike, index, length, subscriber\n });\n } else {\n for (let i = 0; i < length && !subscriber.closed; i++) {\n subscriber.next(arrayLike[i]);\n }\n subscriber.complete();\n }\n }\n}\n","import { Observable } from '../Observable';\nimport { IScheduler } from '../Scheduler';\nimport { Operator } from '../Operator';\nimport { PartialObserver } from '../Observer';\nimport { Subscriber } from '../Subscriber';\nimport { Notification } from '../Notification';\nimport { TeardownLogic } from '../Subscription';\nimport { Action } from '../scheduler/Action';\nimport { MonoTypeOperatorFunction } from '../interfaces';\n\n/**\n *\n * Re-emits all notifications from source Observable with specified scheduler.\n *\n * Ensure a specific scheduler is used, from outside of an Observable.\n *\n * `observeOn` is an operator that accepts a scheduler as a first parameter, which will be used to reschedule\n * notifications emitted by the source Observable. It might be useful, if you do not have control over\n * internal scheduler of a given Observable, but want to control when its values are emitted nevertheless.\n *\n * Returned Observable emits the same notifications (nexted values, complete and error events) as the source Observable,\n * but rescheduled with provided scheduler. Note that this doesn't mean that source Observables internal\n * scheduler will be replaced in any way. Original scheduler still will be used, but when the source Observable emits\n * notification, it will be immediately scheduled again - this time with scheduler passed to `observeOn`.\n * An anti-pattern would be calling `observeOn` on Observable that emits lots of values synchronously, to split\n * that emissions into asynchronous chunks. For this to happen, scheduler would have to be passed into the source\n * Observable directly (usually into the operator that creates it). `observeOn` simply delays notifications a\n * little bit more, to ensure that they are emitted at expected moments.\n *\n * As a matter of fact, `observeOn` accepts second parameter, which specifies in milliseconds with what delay notifications\n * will be emitted. The main difference between {@link delay} operator and `observeOn` is that `observeOn`\n * will delay all notifications - including error notifications - while `delay` will pass through error\n * from source Observable immediately when it is emitted. In general it is highly recommended to use `delay` operator\n * for any kind of delaying of values in the stream, while using `observeOn` to specify which scheduler should be used\n * for notification emissions in general.\n *\n * @example Ensure values in subscribe are called just before browser repaint.\n * const intervals = Rx.Observable.interval(10); // Intervals are scheduled\n * // with async scheduler by default...\n *\n * intervals\n * .observeOn(Rx.Scheduler.animationFrame) // ...but we will observe on animationFrame\n * .subscribe(val => { // scheduler to ensure smooth animation.\n * someDiv.style.height = val + 'px';\n * });\n *\n * @see {@link delay}\n *\n * @param {IScheduler} scheduler Scheduler that will be used to reschedule notifications from source Observable.\n * @param {number} [delay] Number of milliseconds that states with what delay every notification should be rescheduled.\n * @return {Observable} Observable that emits the same notifications as the source Observable,\n * but with provided scheduler.\n *\n * @method observeOn\n * @owner Observable\n */\nexport function observeOn(scheduler: IScheduler, delay: number = 0): MonoTypeOperatorFunction {\n return function observeOnOperatorFunction(source: Observable): Observable {\n return source.lift(new ObserveOnOperator(scheduler, delay));\n };\n}\n\nexport class ObserveOnOperator implements Operator {\n constructor(private scheduler: IScheduler, private delay: number = 0) {\n }\n\n call(subscriber: Subscriber, source: any): TeardownLogic {\n return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n }\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @ignore\n * @extends {Ignored}\n */\nexport class ObserveOnSubscriber extends Subscriber {\n static dispatch(this: Action, arg: ObserveOnMessage) {\n const { notification, destination } = arg;\n notification.observe(destination);\n this.unsubscribe();\n }\n\n constructor(destination: Subscriber,\n private scheduler: IScheduler,\n private delay: number = 0) {\n super(destination);\n }\n\n private scheduleMessage(notification: Notification): void {\n this.add(this.scheduler.schedule(\n ObserveOnSubscriber.dispatch,\n this.delay,\n new ObserveOnMessage(notification, this.destination)\n ));\n }\n\n protected _next(value: T): void {\n this.scheduleMessage(Notification.createNext(value));\n }\n\n protected _error(err: any): void {\n this.scheduleMessage(Notification.createError(err));\n }\n\n protected _complete(): void {\n this.scheduleMessage(Notification.createComplete());\n }\n}\n\nexport class ObserveOnMessage {\n constructor(public notification: Notification,\n public destination: PartialObserver) {\n }\n}\n","import { Observable } from '../../Observable';\nimport { interval as staticInterval } from '../../observable/interval';\n\nObservable.interval = staticInterval;\n\ndeclare module '../../Observable' {\n namespace Observable {\n export let interval: typeof staticInterval;\n }\n}","import { IntervalObservable } from './IntervalObservable';\n\nexport const interval = IntervalObservable.create;","import { Subscriber } from '../Subscriber';\nimport { isNumeric } from '../util/isNumeric';\nimport { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { async } from '../scheduler/async';\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class IntervalObservable extends Observable {\n /**\n * Creates an Observable that emits sequential numbers every specified\n * interval of time, on a specified IScheduler.\n *\n * Emits incremental numbers periodically in time.\n * \n *\n * \n *\n * `interval` returns an Observable that emits an infinite sequence of\n * ascending integers, with a constant interval of time of your choosing\n * between those emissions. The first emission is not sent immediately, but\n * only after the first period has passed. By default, this operator uses the\n * `async` IScheduler to provide a notion of time, but you may pass any\n * IScheduler to it.\n *\n * @example Emits ascending numbers, one every second (1000ms)\n * var numbers = Rx.Observable.interval(1000);\n * numbers.subscribe(x => console.log(x));\n *\n * @see {@link timer}\n * @see {@link delay}\n *\n * @param {number} [period=0] The interval size in milliseconds (by default)\n * or the time unit determined by the scheduler's clock.\n * @param {Scheduler} [scheduler=async] The IScheduler to use for scheduling\n * the emission of values, and providing a notion of \"time\".\n * @return {Observable} An Observable that emits a sequential number each time\n * interval.\n * @static true\n * @name interval\n * @owner Observable\n */\n static create(period: number = 0,\n scheduler: IScheduler = async): Observable {\n return new IntervalObservable(period, scheduler);\n }\n\n static dispatch(state: any): void {\n const { index, subscriber, period } = state;\n\n subscriber.next(index);\n\n if (subscriber.closed) {\n return;\n }\n\n state.index += 1;\n\n ( this).schedule(state, period);\n }\n\n constructor(private period: number = 0,\n private scheduler: IScheduler = async) {\n super();\n if (!isNumeric(period) || period < 0) {\n this.period = 0;\n }\n if (!scheduler || typeof scheduler.schedule !== 'function') {\n this.scheduler = async;\n }\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber) {\n const index = 0;\n const period = this.period;\n const scheduler = this.scheduler;\n\n subscriber.add(scheduler.schedule(IntervalObservable.dispatch, period, {\n index, subscriber, period\n }));\n }\n}\n","import { isArray } from '../util/isArray';\n\nexport function isNumeric(val: any): val is number {\n // parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\n // ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n // subtraction forces infinities to NaN\n // adding 1 corrects loss of precision from parseFloat (#15100)\n return !isArray(val) && (val - parseFloat(val) + 1) >= 0;\n};\n","import { Observable } from '../../Observable';\nimport { of as staticOf } from '../../observable/of';\n\nObservable.of = staticOf;\n\ndeclare module '../../Observable' {\n namespace Observable {\n export let of: typeof staticOf; //formOf an iceberg!\n }\n}","import { ArrayObservable } from './ArrayObservable';\n\nexport const of = ArrayObservable.of;","import { Observable } from '../../Observable';\nimport { _throw } from '../../observable/throw';\n\nObservable.throw = _throw;","import { ErrorObservable } from './ErrorObservable';\n\nexport const _throw = ErrorObservable.create;","import { IScheduler } from '../Scheduler';\nimport { Observable } from '../Observable';\nimport { TeardownLogic } from '../Subscription';\nimport { Subscriber } from '../Subscriber';\n\nexport interface DispatchArg {\n error: any;\n subscriber: any;\n}\n\n/**\n * We need this JSDoc comment for affecting ESDoc.\n * @extends {Ignored}\n * @hide true\n */\nexport class ErrorObservable extends Observable {\n\n /**\n * Creates an Observable that emits no items to the Observer and immediately\n * emits an error notification.\n *\n * Just emits 'error', and nothing else.\n * \n *\n * \n *\n * This static operator is useful for creating a simple Observable that only\n * emits the error notification. It can be used for composing with other\n * Observables, such as in a {@link mergeMap}.\n *\n * @example Emit the number 7, then emit an error.\n * var result = Rx.Observable.throw(new Error('oops!')).startWith(7);\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @example Map and flatten numbers to the sequence 'a', 'b', 'c', but throw an error for 13\n * var interval = Rx.Observable.interval(1000);\n * var result = interval.mergeMap(x =>\n * x === 13 ?\n * Rx.Observable.throw('Thirteens are bad') :\n * Rx.Observable.of('a', 'b', 'c')\n * );\n * result.subscribe(x => console.log(x), e => console.error(e));\n *\n * @see {@link create}\n * @see {@link empty}\n * @see {@link never}\n * @see {@link of}\n *\n * @param {any} error The particular Error to pass to the error notification.\n * @param {Scheduler} [scheduler] A {@link IScheduler} to use for scheduling\n * the emission of the error notification.\n * @return {Observable} An error Observable: emits only the error notification\n * using the given error argument.\n * @static true\n * @name throw\n * @owner Observable\n */\n static create(error: any, scheduler?: IScheduler): ErrorObservable {\n return new ErrorObservable(error, scheduler);\n }\n\n static dispatch(arg: DispatchArg) {\n const { error, subscriber } = arg;\n subscriber.error(error);\n }\n\n constructor(public error: any, private scheduler?: IScheduler) {\n super();\n }\n\n /** @deprecated internal use only */ _subscribe(subscriber: Subscriber): TeardownLogic {\n const error = this.error;\n const scheduler = this.scheduler;\n\n subscriber.syncErrorThrowable = true;\n\n if (scheduler) {\n return scheduler.schedule(ErrorObservable.dispatch, 0, {\n error, subscriber\n });\n } else {\n subscriber.error(error);\n }\n }\n}\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\n// Version token that will be replaced by the prepack command\r\n/** The version of the SignalR client. */\r\nexport const VERSION: string = \"0.0.0-DEV_BUILD\";\r\n\r\n// Everything that users need to access must be exported here. Including interfaces.\r\nexport { AbortSignal } from \"./AbortController\";\r\nexport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nexport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\nexport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\nexport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\nexport { HubConnection, HubConnectionState } from \"./HubConnection\";\r\nexport { HubConnectionBuilder } from \"./HubConnectionBuilder\";\r\nexport { MessageType, MessageHeaders, HubMessage, HubMessageBase, HubInvocationMessage, InvocationMessage, StreamInvocationMessage, StreamItemMessage, CompletionMessage, PingMessage, CloseMessage, CancelInvocationMessage, IHubProtocol } from \"./IHubProtocol\";\r\nexport { ILogger, LogLevel } from \"./ILogger\";\r\nexport { HttpTransportType, TransferFormat, ITransport } from \"./ITransport\";\r\nexport { IStreamSubscriber, IStreamResult, ISubscription } from \"./Stream\";\r\nexport { NullLogger } from \"./Loggers\";\r\nexport { JsonHubProtocol } from \"./JsonHubProtocol\";\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\n/** Error thrown when an HTTP request fails. */\r\nexport class HttpError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // tslint:disable-next-line:variable-name\r\n private __proto__: Error;\r\n\r\n /** The HTTP status code represented by this error. */\r\n public statusCode: number;\r\n\r\n /** Constructs a new instance of {@link @aspnet/signalr.HttpError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n * @param {number} statusCode The HTTP status code represented by this error.\r\n */\r\n constructor(errorMessage: string, statusCode: number) {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n this.statusCode = statusCode;\r\n\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n\r\n/** Error thrown when a timeout elapses. */\r\nexport class TimeoutError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // tslint:disable-next-line:variable-name\r\n private __proto__: Error;\r\n\r\n /** Constructs a new instance of {@link @aspnet/signalr.TimeoutError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage: string = \"A timeout occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n\r\n/** Error thrown when an action is aborted. */\r\nexport class AbortError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // tslint:disable-next-line:variable-name\r\n private __proto__: Error;\r\n\r\n /** Constructs a new instance of {@link AbortError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage: string = \"An abort occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { AbortSignal } from \"./AbortController\";\r\n\r\n/** Represents an HTTP request. */\r\nexport interface HttpRequest {\r\n /** The HTTP method to use for the request. */\r\n method?: string;\r\n\r\n /** The URL for the request. */\r\n url?: string;\r\n\r\n /** The body content for the request. May be a string or an ArrayBuffer (for binary data). */\r\n content?: string | ArrayBuffer;\r\n\r\n /** An object describing headers to apply to the request. */\r\n headers?: { [key: string]: string };\r\n\r\n /** The XMLHttpRequestResponseType to apply to the request. */\r\n responseType?: XMLHttpRequestResponseType;\r\n\r\n /** An AbortSignal that can be monitored for cancellation. */\r\n abortSignal?: AbortSignal;\r\n\r\n /** The time to wait for the request to complete before throwing a TimeoutError. Measured in milliseconds. */\r\n timeout?: number;\r\n}\r\n\r\n/** Represents an HTTP response. */\r\nexport class HttpResponse {\r\n /** Constructs a new instance of {@link @aspnet/signalr.HttpResponse} with the specified status code.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n */\r\n constructor(statusCode: number);\r\n\r\n /** Constructs a new instance of {@link @aspnet/signalr.HttpResponse} with the specified status code and message.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n * @param {string} statusText The status message of the response.\r\n */\r\n constructor(statusCode: number, statusText: string);\r\n\r\n /** Constructs a new instance of {@link @aspnet/signalr.HttpResponse} with the specified status code, message and string content.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n * @param {string} statusText The status message of the response.\r\n * @param {string} content The content of the response.\r\n */\r\n constructor(statusCode: number, statusText: string, content: string);\r\n\r\n /** Constructs a new instance of {@link @aspnet/signalr.HttpResponse} with the specified status code, message and binary content.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n * @param {string} statusText The status message of the response.\r\n * @param {ArrayBuffer} content The content of the response.\r\n */\r\n constructor(statusCode: number, statusText: string, content: ArrayBuffer);\r\n constructor(\r\n public readonly statusCode: number,\r\n public readonly statusText?: string,\r\n public readonly content?: string | ArrayBuffer) {\r\n }\r\n}\r\n\r\n/** Abstraction over an HTTP client.\r\n *\r\n * This class provides an abstraction over an HTTP client so that a different implementation can be provided on different platforms.\r\n */\r\nexport abstract class HttpClient {\r\n /** Issues an HTTP GET request to the specified URL, returning a Promise that resolves with an {@link @aspnet/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @returns {Promise} A Promise that resolves with an {@link @aspnet/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public get(url: string): Promise;\r\n\r\n /** Issues an HTTP GET request to the specified URL, returning a Promise that resolves with an {@link @aspnet/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @param {HttpRequest} options Additional options to configure the request. The 'url' field in this object will be overridden by the url parameter.\r\n * @returns {Promise} A Promise that resolves with an {@link @aspnet/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public get(url: string, options: HttpRequest): Promise;\r\n public get(url: string, options?: HttpRequest): Promise {\r\n return this.send({\r\n ...options,\r\n method: \"GET\",\r\n url,\r\n });\r\n }\r\n\r\n /** Issues an HTTP POST request to the specified URL, returning a Promise that resolves with an {@link @aspnet/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @returns {Promise} A Promise that resolves with an {@link @aspnet/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public post(url: string): Promise;\r\n\r\n /** Issues an HTTP POST request to the specified URL, returning a Promise that resolves with an {@link @aspnet/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @param {HttpRequest} options Additional options to configure the request. The 'url' field in this object will be overridden by the url parameter.\r\n * @returns {Promise} A Promise that resolves with an {@link @aspnet/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public post(url: string, options: HttpRequest): Promise;\r\n public post(url: string, options?: HttpRequest): Promise {\r\n return this.send({\r\n ...options,\r\n method: \"POST\",\r\n url,\r\n });\r\n }\r\n\r\n /** Issues an HTTP DELETE request to the specified URL, returning a Promise that resolves with an {@link @aspnet/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @returns {Promise} A Promise that resolves with an {@link @aspnet/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public delete(url: string): Promise;\r\n\r\n /** Issues an HTTP DELETE request to the specified URL, returning a Promise that resolves with an {@link @aspnet/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @param {HttpRequest} options Additional options to configure the request. The 'url' field in this object will be overridden by the url parameter.\r\n * @returns {Promise} A Promise that resolves with an {@link @aspnet/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public delete(url: string, options: HttpRequest): Promise;\r\n public delete(url: string, options?: HttpRequest): Promise {\r\n return this.send({\r\n ...options,\r\n method: \"DELETE\",\r\n url,\r\n });\r\n }\r\n\r\n /** Issues an HTTP request to the specified URL, returning a {@link Promise} that resolves with an {@link @aspnet/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {HttpRequest} request An {@link @aspnet/signalr.HttpRequest} describing the request to send.\r\n * @returns {Promise} A Promise that resolves with an HttpResponse describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public abstract send(request: HttpRequest): Promise;\r\n\r\n /** Gets all cookies that apply to the specified URL.\r\n *\r\n * @param url The URL that the cookies are valid for.\r\n * @returns {string} A string containing all the key-value cookie pairs for the specified URL.\r\n */\r\n // @ts-ignore\r\n public getCookieString(url: string): string {\r\n return \"\";\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { AbortError } from \"./Errors\";\r\nimport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\nimport { ILogger } from \"./ILogger\";\r\nimport { NodeHttpClient } from \"./NodeHttpClient\";\r\nimport { XhrHttpClient } from \"./XhrHttpClient\";\r\n\r\n/** Default implementation of {@link @aspnet/signalr.HttpClient}. */\r\nexport class DefaultHttpClient extends HttpClient {\r\n private readonly httpClient: HttpClient;\r\n\r\n /** Creates a new instance of the {@link @aspnet/signalr.DefaultHttpClient}, using the provided {@link @aspnet/signalr.ILogger} to log messages. */\r\n public constructor(logger: ILogger) {\r\n super();\r\n\r\n if (typeof XMLHttpRequest !== \"undefined\") {\r\n this.httpClient = new XhrHttpClient(logger);\r\n } else {\r\n this.httpClient = new NodeHttpClient(logger);\r\n }\r\n }\r\n\r\n /** @inheritDoc */\r\n public send(request: HttpRequest): Promise {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n\r\n return this.httpClient.send(request);\r\n }\r\n\r\n public getCookieString(url: string): string {\r\n return this.httpClient.getCookieString(url);\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\n// @ts-ignore: This will be removed from built files and is here to make the types available during dev work\r\nimport * as Request from \"@types/request\";\r\n\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n\r\nlet requestModule: Request.RequestAPI;\r\nif (typeof XMLHttpRequest === \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n requestModule = requireFunc(\"request\");\r\n}\r\n\r\nexport class NodeHttpClient extends HttpClient {\r\n private readonly logger: ILogger;\r\n private readonly request: typeof requestModule;\r\n private readonly cookieJar: Request.CookieJar;\r\n\r\n public constructor(logger: ILogger) {\r\n super();\r\n if (typeof requestModule === \"undefined\") {\r\n throw new Error(\"The 'request' module could not be loaded.\");\r\n }\r\n\r\n this.logger = logger;\r\n this.cookieJar = requestModule.jar();\r\n this.request = requestModule.defaults({ jar: this.cookieJar });\r\n }\r\n\r\n public send(httpRequest: HttpRequest): Promise {\r\n return new Promise((resolve, reject) => {\r\n\r\n let requestBody: Buffer | string;\r\n if (isArrayBuffer(httpRequest.content)) {\r\n requestBody = Buffer.from(httpRequest.content);\r\n } else {\r\n requestBody = httpRequest.content || \"\";\r\n }\r\n\r\n const currentRequest = this.request(httpRequest.url!, {\r\n body: requestBody,\r\n // If binary is expected 'null' should be used, otherwise for text 'utf8'\r\n encoding: httpRequest.responseType === \"arraybuffer\" ? null : \"utf8\",\r\n headers: {\r\n // Tell auth middleware to 401 instead of redirecting\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n ...httpRequest.headers,\r\n },\r\n method: httpRequest.method,\r\n timeout: httpRequest.timeout,\r\n },\r\n (error, response, body) => {\r\n if (httpRequest.abortSignal) {\r\n httpRequest.abortSignal.onabort = null;\r\n }\r\n\r\n if (error) {\r\n if (error.code === \"ETIMEDOUT\") {\r\n this.logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n reject(new TimeoutError());\r\n }\r\n this.logger.log(LogLevel.Warning, `Error from HTTP request. ${error}`);\r\n reject(error);\r\n return;\r\n }\r\n\r\n if (response.statusCode >= 200 && response.statusCode < 300) {\r\n resolve(new HttpResponse(response.statusCode, response.statusMessage || \"\", body));\r\n } else {\r\n reject(new HttpError(response.statusMessage || \"\", response.statusCode || 0));\r\n }\r\n });\r\n\r\n if (httpRequest.abortSignal) {\r\n httpRequest.abortSignal.onabort = () => {\r\n currentRequest.abort();\r\n reject(new AbortError());\r\n };\r\n }\r\n });\r\n }\r\n\r\n public getCookieString(url: string): string {\r\n return this.cookieJar.getCookieString(url);\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\n// These values are designed to match the ASP.NET Log Levels since that's the pattern we're emulating here.\r\n/** Indicates the severity of a log message.\r\n *\r\n * Log Levels are ordered in increasing severity. So `Debug` is more severe than `Trace`, etc.\r\n */\r\nexport enum LogLevel {\r\n /** Log level for very low severity diagnostic messages. */\r\n Trace = 0,\r\n /** Log level for low severity diagnostic messages. */\r\n Debug = 1,\r\n /** Log level for informational diagnostic messages. */\r\n Information = 2,\r\n /** Log level for diagnostic messages that indicate a non-fatal problem. */\r\n Warning = 3,\r\n /** Log level for diagnostic messages that indicate a failure in the current operation. */\r\n Error = 4,\r\n /** Log level for diagnostic messages that indicate a failure that will terminate the entire application. */\r\n Critical = 5,\r\n /** The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted. */\r\n None = 6,\r\n}\r\n\r\n/** An abstraction that provides a sink for diagnostic messages. */\r\nexport interface ILogger {\r\n /** Called by the framework to emit a diagnostic message.\r\n *\r\n * @param {LogLevel} logLevel The severity level of the message.\r\n * @param {string} message The message.\r\n */\r\n log(logLevel: LogLevel, message: string): void;\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { IStreamResult, IStreamSubscriber, ISubscription } from \"./Stream\";\r\n\r\n/** @private */\r\nexport class Arg {\r\n public static isRequired(val: any, name: string): void {\r\n if (val === null || val === undefined) {\r\n throw new Error(`The '${name}' argument is required.`);\r\n }\r\n }\r\n\r\n public static isIn(val: any, values: any, name: string): void {\r\n // TypeScript enums have keys for **both** the name and the value of each enum member on the type itself.\r\n if (!(val in values)) {\r\n throw new Error(`Unknown ${name} value: ${val}.`);\r\n }\r\n }\r\n}\r\n\r\n/** @private */\r\nexport function getDataDetail(data: any, includeContent: boolean): string {\r\n let detail = \"\";\r\n if (isArrayBuffer(data)) {\r\n detail = `Binary data of length ${data.byteLength}`;\r\n if (includeContent) {\r\n detail += `. Content: '${formatArrayBuffer(data)}'`;\r\n }\r\n } else if (typeof data === \"string\") {\r\n detail = `String data of length ${data.length}`;\r\n if (includeContent) {\r\n detail += `. Content: '${data}'`;\r\n }\r\n }\r\n return detail;\r\n}\r\n\r\n/** @private */\r\nexport function formatArrayBuffer(data: ArrayBuffer): string {\r\n const view = new Uint8Array(data);\r\n\r\n // Uint8Array.map only supports returning another Uint8Array?\r\n let str = \"\";\r\n view.forEach((num) => {\r\n const pad = num < 16 ? \"0\" : \"\";\r\n str += `0x${pad}${num.toString(16)} `;\r\n });\r\n\r\n // Trim of trailing space.\r\n return str.substr(0, str.length - 1);\r\n}\r\n\r\n// Also in signalr-protocol-msgpack/Utils.ts\r\n/** @private */\r\nexport function isArrayBuffer(val: any): val is ArrayBuffer {\r\n return val && typeof ArrayBuffer !== \"undefined\" &&\r\n (val instanceof ArrayBuffer ||\r\n // Sometimes we get an ArrayBuffer that doesn't satisfy instanceof\r\n (val.constructor && val.constructor.name === \"ArrayBuffer\"));\r\n}\r\n\r\n/** @private */\r\nexport async function sendMessage(logger: ILogger, transportName: string, httpClient: HttpClient, url: string, accessTokenFactory: (() => string | Promise) | undefined, content: string | ArrayBuffer, logMessageContent: boolean): Promise {\r\n let headers;\r\n if (accessTokenFactory) {\r\n const token = await accessTokenFactory();\r\n if (token) {\r\n headers = {\r\n [\"Authorization\"]: `Bearer ${token}`,\r\n };\r\n }\r\n }\r\n\r\n logger.log(LogLevel.Trace, `(${transportName} transport) sending data. ${getDataDetail(content, logMessageContent)}.`);\r\n\r\n const responseType = isArrayBuffer(content) ? \"arraybuffer\" : \"text\";\r\n const response = await httpClient.post(url, {\r\n content,\r\n headers,\r\n responseType,\r\n });\r\n\r\n logger.log(LogLevel.Trace, `(${transportName} transport) request complete. Response status: ${response.statusCode}.`);\r\n}\r\n\r\n/** @private */\r\nexport function createLogger(logger?: ILogger | LogLevel) {\r\n if (logger === undefined) {\r\n return new ConsoleLogger(LogLevel.Information);\r\n }\r\n\r\n if (logger === null) {\r\n return NullLogger.instance;\r\n }\r\n\r\n if ((logger as ILogger).log) {\r\n return logger as ILogger;\r\n }\r\n\r\n return new ConsoleLogger(logger as LogLevel);\r\n}\r\n\r\n/** @private */\r\nexport class Subject implements IStreamResult {\r\n public observers: Array>;\r\n public cancelCallback?: () => Promise;\r\n\r\n constructor() {\r\n this.observers = [];\r\n }\r\n\r\n public next(item: T): void {\r\n for (const observer of this.observers) {\r\n observer.next(item);\r\n }\r\n }\r\n\r\n public error(err: any): void {\r\n for (const observer of this.observers) {\r\n if (observer.error) {\r\n observer.error(err);\r\n }\r\n }\r\n }\r\n\r\n public complete(): void {\r\n for (const observer of this.observers) {\r\n if (observer.complete) {\r\n observer.complete();\r\n }\r\n }\r\n }\r\n\r\n public subscribe(observer: IStreamSubscriber): ISubscription {\r\n this.observers.push(observer);\r\n return new SubjectSubscription(this, observer);\r\n }\r\n}\r\n\r\n/** @private */\r\nexport class SubjectSubscription implements ISubscription {\r\n private subject: Subject;\r\n private observer: IStreamSubscriber;\r\n\r\n constructor(subject: Subject, observer: IStreamSubscriber) {\r\n this.subject = subject;\r\n this.observer = observer;\r\n }\r\n\r\n public dispose(): void {\r\n const index: number = this.subject.observers.indexOf(this.observer);\r\n if (index > -1) {\r\n this.subject.observers.splice(index, 1);\r\n }\r\n\r\n if (this.subject.observers.length === 0 && this.subject.cancelCallback) {\r\n this.subject.cancelCallback().catch((_) => { });\r\n }\r\n }\r\n}\r\n\r\n/** @private */\r\nexport class ConsoleLogger implements ILogger {\r\n private readonly minimumLogLevel: LogLevel;\r\n\r\n constructor(minimumLogLevel: LogLevel) {\r\n this.minimumLogLevel = minimumLogLevel;\r\n }\r\n\r\n public log(logLevel: LogLevel, message: string): void {\r\n if (logLevel >= this.minimumLogLevel) {\r\n switch (logLevel) {\r\n case LogLevel.Critical:\r\n case LogLevel.Error:\r\n console.error(`[${new Date().toISOString()}] ${LogLevel[logLevel]}: ${message}`);\r\n break;\r\n case LogLevel.Warning:\r\n console.warn(`[${new Date().toISOString()}] ${LogLevel[logLevel]}: ${message}`);\r\n break;\r\n case LogLevel.Information:\r\n console.info(`[${new Date().toISOString()}] ${LogLevel[logLevel]}: ${message}`);\r\n break;\r\n default:\r\n // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug\r\n console.log(`[${new Date().toISOString()}] ${LogLevel[logLevel]}: ${message}`);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\n\r\n/** A logger that does nothing when log messages are sent to it. */\r\nexport class NullLogger implements ILogger {\r\n /** The singleton instance of the {@link @aspnet/signalr.NullLogger}. */\r\n public static instance: ILogger = new NullLogger();\r\n\r\n private constructor() {}\r\n\r\n /** @inheritDoc */\r\n // tslint:disable-next-line\r\n public log(_logLevel: LogLevel, _message: string): void {\r\n }\r\n}\r\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n const arr = new Uint8Array(1)\n const proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n const buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n const valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n const b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n const length = byteLength(string, encoding) | 0\n let buf = createBuffer(length)\n\n const actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n const length = array.length < 0 ? 0 : checked(array.length) | 0\n const buf = createBuffer(length)\n for (let i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n const copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n let buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n const len = checked(obj.length) | 0\n const buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n let x = a.length\n let y = b.length\n\n for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n let i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n const buffer = Buffer.allocUnsafe(length)\n let pos = 0\n for (i = 0; i < list.length; ++i) {\n let buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n buf.copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n const len = string.length\n const mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n let loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n const i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n const len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (let i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n const len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (let i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n const len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (let i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n const length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n let str = ''\n const max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return ''\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n let x = thisEnd - thisStart\n let y = end - start\n const len = Math.min(x, y)\n\n const thisCopy = this.slice(thisStart, thisEnd)\n const targetCopy = target.slice(start, end)\n\n for (let i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n let indexSize = 1\n let arrLength = arr.length\n let valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n let i\n if (dir) {\n let foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n let found = true\n for (let j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n const remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n const strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n let i\n for (i = 0; i < length; ++i) {\n const parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n const remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n let loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n const res = []\n\n let i = start\n while (i < end) {\n const firstByte = buf[i]\n let codePoint = null\n let bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n let secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n const len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n let res = ''\n let i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n let ret = ''\n end = Math.min(buf.length, end)\n\n for (let i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n const len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n let out = ''\n for (let i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n const bytes = buf.slice(start, end)\n let res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (let i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n const len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n const newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n let val = this[offset + --byteLength]\n let mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const lo = first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24\n\n const hi = this[++offset] +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n last * 2 ** 24\n\n return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const hi = first * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n const lo = this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last\n\n return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let val = this[offset]\n let mul = 1\n let i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n let i = byteLength\n let mul = 1\n let val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n const val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = this[offset + 4] +\n this[offset + 5] * 2 ** 8 +\n this[offset + 6] * 2 ** 16 +\n (last << 24) // Overflow\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(first +\n this[++offset] * 2 ** 8 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n offset = offset >>> 0\n validateNumber(offset, 'offset')\n const first = this[offset]\n const last = this[offset + 7]\n if (first === undefined || last === undefined) {\n boundsError(offset, this.length - 8)\n }\n\n const val = (first << 24) + // Overflow\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n this[++offset]\n\n return (BigInt(val) << BigInt(32)) +\n BigInt(this[++offset] * 2 ** 24 +\n this[++offset] * 2 ** 16 +\n this[++offset] * 2 ** 8 +\n last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let mul = 1\n let i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n const maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n let i = byteLength - 1\n let mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n lo = lo >> 8\n buf[offset++] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n hi = hi >> 8\n buf[offset++] = hi\n return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n checkIntBI(value, min, max, buf, offset, 7)\n\n let lo = Number(value & BigInt(0xffffffff))\n buf[offset + 7] = lo\n lo = lo >> 8\n buf[offset + 6] = lo\n lo = lo >> 8\n buf[offset + 5] = lo\n lo = lo >> 8\n buf[offset + 4] = lo\n let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n buf[offset + 3] = hi\n hi = hi >> 8\n buf[offset + 2] = hi\n hi = hi >> 8\n buf[offset + 1] = hi\n hi = hi >> 8\n buf[offset] = hi\n return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = 0\n let mul = 1\n let sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n const limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n let i = byteLength - 1\n let mul = 1\n let sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n const len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n const code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n let i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n const bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n const len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n errors[sym] = class NodeError extends Base {\n constructor () {\n super()\n\n Object.defineProperty(this, 'message', {\n value: getMessage.apply(this, arguments),\n writable: true,\n configurable: true\n })\n\n // Add the error code to the name to include it in the stack trace.\n this.name = `${this.name} [${sym}]`\n // Access the stack to generate the error message including the error code\n // from the name.\n this.stack // eslint-disable-line no-unused-expressions\n // Reset the name to the actual name.\n delete this.name\n }\n\n get code () {\n return sym\n }\n\n set code (value) {\n Object.defineProperty(this, 'code', {\n configurable: true,\n enumerable: true,\n value,\n writable: true\n })\n }\n\n toString () {\n return `${this.name} [${sym}]: ${this.message}`\n }\n }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n function (name) {\n if (name) {\n return `${name} is outside of buffer bounds`\n }\n\n return 'Attempt to access memory outside buffer bounds'\n }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n function (name, actual) {\n return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n }, TypeError)\nE('ERR_OUT_OF_RANGE',\n function (str, range, input) {\n let msg = `The value of \"${str}\" is out of range.`\n let received = input\n if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n received = addNumericalSeparator(String(input))\n } else if (typeof input === 'bigint') {\n received = String(input)\n if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n received = addNumericalSeparator(received)\n }\n received += 'n'\n }\n msg += ` It must be ${range}. Received ${received}`\n return msg\n }, RangeError)\n\nfunction addNumericalSeparator (val) {\n let res = ''\n let i = val.length\n const start = val[0] === '-' ? 1 : 0\n for (; i >= start + 4; i -= 3) {\n res = `_${val.slice(i - 3, i)}${res}`\n }\n return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n validateNumber(offset, 'offset')\n if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n boundsError(offset, buf.length - (byteLength + 1))\n }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n if (value > max || value < min) {\n const n = typeof min === 'bigint' ? 'n' : ''\n let range\n if (byteLength > 3) {\n if (min === 0 || min === BigInt(0)) {\n range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n } else {\n range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n `${(byteLength + 1) * 8 - 1}${n}`\n }\n } else {\n range = `>= ${min}${n} and <= ${max}${n}`\n }\n throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n }\n checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n if (typeof value !== 'number') {\n throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n }\n}\n\nfunction boundsError (value, length, type) {\n if (Math.floor(value) !== value) {\n validateNumber(value, type)\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n }\n\n if (length < 0) {\n throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n }\n\n throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n `>= ${type ? 1 : 0} and <= ${length}`,\n value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n let codePoint\n const length = string.length\n let leadSurrogate = null\n const bytes = []\n\n for (let i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n let c, hi, lo\n const byteArray = []\n for (let i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n let i\n for (i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n const alphabet = '0123456789abcdef'\n const table = new Array(256)\n for (let i = 0; i < 16; ++i) {\n const i16 = i * 16\n for (let j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n throw new Error('BigInt not supported')\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\n\r\nexport class XhrHttpClient extends HttpClient {\r\n private readonly logger: ILogger;\r\n\r\n public constructor(logger: ILogger) {\r\n super();\r\n this.logger = logger;\r\n }\r\n\r\n /** @inheritDoc */\r\n public send(request: HttpRequest): Promise {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n\r\n xhr.open(request.method!, request.url!, true);\r\n xhr.withCredentials = true;\r\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n // Explicitly setting the Content-Type header for React Native on Android platform.\r\n xhr.setRequestHeader(\"Content-Type\", \"text/plain;charset=UTF-8\");\r\n\r\n const headers = request.headers;\r\n if (headers) {\r\n Object.keys(headers)\r\n .forEach((header) => {\r\n xhr.setRequestHeader(header, headers[header]);\r\n });\r\n }\r\n\r\n if (request.responseType) {\r\n xhr.responseType = request.responseType;\r\n }\r\n\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = () => {\r\n xhr.abort();\r\n reject(new AbortError());\r\n };\r\n }\r\n\r\n if (request.timeout) {\r\n xhr.timeout = request.timeout;\r\n }\r\n\r\n xhr.onload = () => {\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\r\n\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve(new HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText));\r\n } else {\r\n reject(new HttpError(xhr.statusText, xhr.status));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n this.logger.log(LogLevel.Warning, `Error from HTTP request. ${xhr.status}: ${xhr.statusText}.`);\r\n reject(new HttpError(xhr.statusText, xhr.status));\r\n };\r\n\r\n xhr.ontimeout = () => {\r\n this.logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n reject(new TimeoutError());\r\n };\r\n\r\n xhr.send(request.content || \"\");\r\n });\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { HandshakeProtocol, HandshakeRequestMessage, HandshakeResponseMessage } from \"./HandshakeProtocol\";\r\nimport { IConnection } from \"./IConnection\";\r\nimport { CancelInvocationMessage, CompletionMessage, IHubProtocol, InvocationMessage, MessageType, StreamInvocationMessage, StreamItemMessage } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { IStreamResult } from \"./Stream\";\r\nimport { Arg, Subject } from \"./Utils\";\r\n\r\nconst DEFAULT_TIMEOUT_IN_MS: number = 30 * 1000;\r\nconst DEFAULT_PING_INTERVAL_IN_MS: number = 15 * 1000;\r\n\r\n/** Describes the current state of the {@link HubConnection} to the server. */\r\nexport enum HubConnectionState {\r\n /** The hub connection is disconnected. */\r\n Disconnected,\r\n /** The hub connection is connected. */\r\n Connected,\r\n}\r\n\r\n/** Represents a connection to a SignalR Hub. */\r\nexport class HubConnection {\r\n private readonly cachedPingMessage: string | ArrayBuffer;\r\n private readonly connection: IConnection;\r\n private readonly logger: ILogger;\r\n private protocol: IHubProtocol;\r\n private handshakeProtocol: HandshakeProtocol;\r\n private callbacks: { [invocationId: string]: (invocationEvent: StreamItemMessage | CompletionMessage | null, error?: Error) => void };\r\n private methods: { [name: string]: Array<(...args: any[]) => void> };\r\n private id: number;\r\n private closedCallbacks: Array<(error?: Error) => void>;\r\n private receivedHandshakeResponse: boolean;\r\n private handshakeResolver!: (value?: PromiseLike<{}>) => void;\r\n private handshakeRejecter!: (reason?: any) => void;\r\n private connectionState: HubConnectionState;\r\n\r\n // The type of these a) doesn't matter and b) varies when building in browser and node contexts\r\n // Since we're building the WebPack bundle directly from the TypeScript, this matters (previously\r\n // we built the bundle from the compiled JavaScript).\r\n private timeoutHandle?: any;\r\n private pingServerHandle?: any;\r\n\r\n /** The server timeout in milliseconds.\r\n *\r\n * If this timeout elapses without receiving any messages from the server, the connection will be terminated with an error.\r\n * The default timeout value is 30,000 milliseconds (30 seconds).\r\n */\r\n public serverTimeoutInMilliseconds: number;\r\n\r\n /** Default interval at which to ping the server.\r\n *\r\n * The default value is 15,000 milliseconds (15 seconds).\r\n * Allows the server to detect hard disconnects (like when a client unplugs their computer).\r\n */\r\n public keepAliveIntervalInMilliseconds: number;\r\n\r\n /** @internal */\r\n // Using a public static factory method means we can have a private constructor and an _internal_\r\n // create method that can be used by HubConnectionBuilder. An \"internal\" constructor would just\r\n // be stripped away and the '.d.ts' file would have no constructor, which is interpreted as a\r\n // public parameter-less constructor.\r\n public static create(connection: IConnection, logger: ILogger, protocol: IHubProtocol): HubConnection {\r\n return new HubConnection(connection, logger, protocol);\r\n }\r\n\r\n private constructor(connection: IConnection, logger: ILogger, protocol: IHubProtocol) {\r\n Arg.isRequired(connection, \"connection\");\r\n Arg.isRequired(logger, \"logger\");\r\n Arg.isRequired(protocol, \"protocol\");\r\n\r\n this.serverTimeoutInMilliseconds = DEFAULT_TIMEOUT_IN_MS;\r\n this.keepAliveIntervalInMilliseconds = DEFAULT_PING_INTERVAL_IN_MS;\r\n\r\n this.logger = logger;\r\n this.protocol = protocol;\r\n this.connection = connection;\r\n this.handshakeProtocol = new HandshakeProtocol();\r\n\r\n this.connection.onreceive = (data: any) => this.processIncomingData(data);\r\n this.connection.onclose = (error?: Error) => this.connectionClosed(error);\r\n\r\n this.callbacks = {};\r\n this.methods = {};\r\n this.closedCallbacks = [];\r\n this.id = 0;\r\n this.receivedHandshakeResponse = false;\r\n this.connectionState = HubConnectionState.Disconnected;\r\n\r\n this.cachedPingMessage = this.protocol.writeMessage({ type: MessageType.Ping });\r\n }\r\n\r\n /** Indicates the state of the {@link HubConnection} to the server. */\r\n get state(): HubConnectionState {\r\n return this.connectionState;\r\n }\r\n\r\n /** Starts the connection.\r\n *\r\n * @returns {Promise} A Promise that resolves when the connection has been successfully established, or rejects with an error.\r\n */\r\n public async start(): Promise {\r\n const handshakeRequest: HandshakeRequestMessage = {\r\n protocol: this.protocol.name,\r\n version: this.protocol.version,\r\n };\r\n\r\n this.logger.log(LogLevel.Debug, \"Starting HubConnection.\");\r\n\r\n this.receivedHandshakeResponse = false;\r\n // Set up the promise before any connection is started otherwise it could race with received messages\r\n const handshakePromise = new Promise((resolve, reject) => {\r\n this.handshakeResolver = resolve;\r\n this.handshakeRejecter = reject;\r\n });\r\n\r\n await this.connection.start(this.protocol.transferFormat);\r\n\r\n this.logger.log(LogLevel.Debug, \"Sending handshake request.\");\r\n\r\n await this.sendMessage(this.handshakeProtocol.writeHandshakeRequest(handshakeRequest));\r\n\r\n this.logger.log(LogLevel.Information, `Using HubProtocol '${this.protocol.name}'.`);\r\n\r\n // defensively cleanup timeout in case we receive a message from the server before we finish start\r\n this.cleanupTimeout();\r\n this.resetTimeoutPeriod();\r\n this.resetKeepAliveInterval();\r\n\r\n // Wait for the handshake to complete before marking connection as connected\r\n await handshakePromise;\r\n this.connectionState = HubConnectionState.Connected;\r\n }\r\n\r\n /** Stops the connection.\r\n *\r\n * @returns {Promise} A Promise that resolves when the connection has been successfully terminated, or rejects with an error.\r\n */\r\n public stop(): Promise {\r\n this.logger.log(LogLevel.Debug, \"Stopping HubConnection.\");\r\n\r\n this.cleanupTimeout();\r\n this.cleanupPingTimer();\r\n return this.connection.stop();\r\n }\r\n\r\n /** Invokes a streaming hub method on the server using the specified name and arguments.\r\n *\r\n * @typeparam T The type of the items returned by the server.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {IStreamResult} An object that yields results from the server as they are received.\r\n */\r\n public stream(methodName: string, ...args: any[]): IStreamResult {\r\n const invocationDescriptor = this.createStreamInvocation(methodName, args);\r\n\r\n let promiseQueue: Promise;\r\n const subject = new Subject();\r\n subject.cancelCallback = () => {\r\n const cancelInvocation: CancelInvocationMessage = this.createCancelInvocation(invocationDescriptor.invocationId);\r\n const cancelMessage: any = this.protocol.writeMessage(cancelInvocation);\r\n\r\n delete this.callbacks[invocationDescriptor.invocationId];\r\n\r\n return promiseQueue.then(() => {\r\n return this.sendMessage(cancelMessage);\r\n });\r\n };\r\n\r\n this.callbacks[invocationDescriptor.invocationId] = (invocationEvent: CompletionMessage | StreamItemMessage | null, error?: Error) => {\r\n if (error) {\r\n subject.error(error);\r\n return;\r\n } else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n subject.error(new Error(invocationEvent.error));\r\n } else {\r\n subject.complete();\r\n }\r\n } else {\r\n subject.next((invocationEvent.item) as T);\r\n }\r\n }\r\n };\r\n\r\n const message = this.protocol.writeMessage(invocationDescriptor);\r\n\r\n promiseQueue = this.sendMessage(message)\r\n .catch((e) => {\r\n subject.error(e);\r\n delete this.callbacks[invocationDescriptor.invocationId];\r\n });\r\n\r\n return subject;\r\n }\r\n\r\n private sendMessage(message: any) {\r\n this.resetKeepAliveInterval();\r\n return this.connection.send(message);\r\n }\r\n\r\n /** Invokes a hub method on the server using the specified name and arguments. Does not wait for a response from the receiver.\r\n *\r\n * The Promise returned by this method resolves when the client has sent the invocation to the server. The server may still\r\n * be processing the invocation.\r\n *\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise} A Promise that resolves when the invocation has been successfully sent, or rejects with an error.\r\n */\r\n public send(methodName: string, ...args: any[]): Promise {\r\n const invocationDescriptor = this.createInvocation(methodName, args, true);\r\n\r\n const message = this.protocol.writeMessage(invocationDescriptor);\r\n\r\n return this.sendMessage(message);\r\n }\r\n\r\n /** Invokes a hub method on the server using the specified name and arguments.\r\n *\r\n * The Promise returned by this method resolves when the server indicates it has finished invoking the method. When the promise\r\n * resolves, the server has finished invoking the method. If the server method returns a result, it is produced as the result of\r\n * resolving the Promise.\r\n *\r\n * @typeparam T The expected return type.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise} A Promise that resolves with the result of the server method (if any), or rejects with an error.\r\n */\r\n public invoke(methodName: string, ...args: any[]): Promise {\r\n const invocationDescriptor = this.createInvocation(methodName, args, false);\r\n\r\n const p = new Promise((resolve, reject) => {\r\n // invocationId will always have a value for a non-blocking invocation\r\n this.callbacks[invocationDescriptor.invocationId!] = (invocationEvent: StreamItemMessage | CompletionMessage | null, error?: Error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n } else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n reject(new Error(invocationEvent.error));\r\n } else {\r\n resolve(invocationEvent.result);\r\n }\r\n } else {\r\n reject(new Error(`Unexpected message type: ${invocationEvent.type}`));\r\n }\r\n }\r\n };\r\n\r\n const message = this.protocol.writeMessage(invocationDescriptor);\r\n\r\n this.sendMessage(message)\r\n .catch((e) => {\r\n reject(e);\r\n // invocationId will always have a value for a non-blocking invocation\r\n delete this.callbacks[invocationDescriptor.invocationId!];\r\n });\r\n });\r\n\r\n return p;\r\n }\r\n\r\n /** Registers a handler that will be invoked when the hub method with the specified method name is invoked.\r\n *\r\n * @param {string} methodName The name of the hub method to define.\r\n * @param {Function} newMethod The handler that will be raised when the hub method is invoked.\r\n */\r\n public on(methodName: string, newMethod: (...args: any[]) => void) {\r\n if (!methodName || !newMethod) {\r\n return;\r\n }\r\n\r\n methodName = methodName.toLowerCase();\r\n if (!this.methods[methodName]) {\r\n this.methods[methodName] = [];\r\n }\r\n\r\n // Preventing adding the same handler multiple times.\r\n if (this.methods[methodName].indexOf(newMethod) !== -1) {\r\n return;\r\n }\r\n\r\n this.methods[methodName].push(newMethod);\r\n }\r\n\r\n /** Removes all handlers for the specified hub method.\r\n *\r\n * @param {string} methodName The name of the method to remove handlers for.\r\n */\r\n public off(methodName: string): void;\r\n\r\n /** Removes the specified handler for the specified hub method.\r\n *\r\n * You must pass the exact same Function instance as was previously passed to {@link @aspnet/signalr.HubConnection.on}. Passing a different instance (even if the function\r\n * body is the same) will not remove the handler.\r\n *\r\n * @param {string} methodName The name of the method to remove handlers for.\r\n * @param {Function} method The handler to remove. This must be the same Function instance as the one passed to {@link @aspnet/signalr.HubConnection.on}.\r\n */\r\n public off(methodName: string, method: (...args: any[]) => void): void;\r\n public off(methodName: string, method?: (...args: any[]) => void): void {\r\n if (!methodName) {\r\n return;\r\n }\r\n\r\n methodName = methodName.toLowerCase();\r\n const handlers = this.methods[methodName];\r\n if (!handlers) {\r\n return;\r\n }\r\n if (method) {\r\n const removeIdx = handlers.indexOf(method);\r\n if (removeIdx !== -1) {\r\n handlers.splice(removeIdx, 1);\r\n if (handlers.length === 0) {\r\n delete this.methods[methodName];\r\n }\r\n }\r\n } else {\r\n delete this.methods[methodName];\r\n }\r\n\r\n }\r\n\r\n /** Registers a handler that will be invoked when the connection is closed.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection is closed. Optionally receives a single argument containing the error that caused the connection to close (if any).\r\n */\r\n public onclose(callback: (error?: Error) => void) {\r\n if (callback) {\r\n this.closedCallbacks.push(callback);\r\n }\r\n }\r\n\r\n private processIncomingData(data: any) {\r\n this.cleanupTimeout();\r\n\r\n if (!this.receivedHandshakeResponse) {\r\n data = this.processHandshakeResponse(data);\r\n this.receivedHandshakeResponse = true;\r\n }\r\n\r\n // Data may have all been read when processing handshake response\r\n if (data) {\r\n // Parse the messages\r\n const messages = this.protocol.parseMessages(data, this.logger);\r\n\r\n for (const message of messages) {\r\n switch (message.type) {\r\n case MessageType.Invocation:\r\n this.invokeClientMethod(message);\r\n break;\r\n case MessageType.StreamItem:\r\n case MessageType.Completion:\r\n const callback = this.callbacks[message.invocationId];\r\n if (callback != null) {\r\n if (message.type === MessageType.Completion) {\r\n delete this.callbacks[message.invocationId];\r\n }\r\n callback(message);\r\n }\r\n break;\r\n case MessageType.Ping:\r\n // Don't care about pings\r\n break;\r\n case MessageType.Close:\r\n this.logger.log(LogLevel.Information, \"Close message received from server.\");\r\n\r\n // We don't want to wait on the stop itself.\r\n // tslint:disable-next-line:no-floating-promises\r\n this.connection.stop(message.error ? new Error(\"Server returned an error on close: \" + message.error) : undefined);\r\n\r\n break;\r\n default:\r\n this.logger.log(LogLevel.Warning, `Invalid message type: ${message.type}.`);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.resetTimeoutPeriod();\r\n }\r\n\r\n private processHandshakeResponse(data: any): any {\r\n let responseMessage: HandshakeResponseMessage;\r\n let remainingData: any;\r\n\r\n try {\r\n [remainingData, responseMessage] = this.handshakeProtocol.parseHandshakeResponse(data);\r\n } catch (e) {\r\n const message = \"Error parsing handshake response: \" + e;\r\n this.logger.log(LogLevel.Error, message);\r\n\r\n const error = new Error(message);\r\n\r\n // We don't want to wait on the stop itself.\r\n // tslint:disable-next-line:no-floating-promises\r\n this.connection.stop(error);\r\n this.handshakeRejecter(error);\r\n throw error;\r\n }\r\n if (responseMessage.error) {\r\n const message = \"Server returned handshake error: \" + responseMessage.error;\r\n this.logger.log(LogLevel.Error, message);\r\n\r\n this.handshakeRejecter(message);\r\n // We don't want to wait on the stop itself.\r\n // tslint:disable-next-line:no-floating-promises\r\n this.connection.stop(new Error(message));\r\n throw new Error(message);\r\n } else {\r\n this.logger.log(LogLevel.Debug, \"Server handshake complete.\");\r\n }\r\n\r\n this.handshakeResolver();\r\n return remainingData;\r\n }\r\n\r\n private resetKeepAliveInterval() {\r\n this.cleanupPingTimer();\r\n this.pingServerHandle = setTimeout(async () => {\r\n if (this.connectionState === HubConnectionState.Connected) {\r\n try {\r\n await this.sendMessage(this.cachedPingMessage);\r\n } catch {\r\n // We don't care about the error. It should be seen elsewhere in the client.\r\n // The connection is probably in a bad or closed state now, cleanup the timer so it stops triggering\r\n this.cleanupPingTimer();\r\n }\r\n }\r\n }, this.keepAliveIntervalInMilliseconds);\r\n }\r\n\r\n private resetTimeoutPeriod() {\r\n if (!this.connection.features || !this.connection.features.inherentKeepAlive) {\r\n // Set the timeout timer\r\n this.timeoutHandle = setTimeout(() => this.serverTimeout(), this.serverTimeoutInMilliseconds);\r\n }\r\n }\r\n\r\n private serverTimeout() {\r\n // The server hasn't talked to us in a while. It doesn't like us anymore ... :(\r\n // Terminate the connection, but we don't need to wait on the promise.\r\n // tslint:disable-next-line:no-floating-promises\r\n this.connection.stop(new Error(\"Server timeout elapsed without receiving a message from the server.\"));\r\n }\r\n\r\n private invokeClientMethod(invocationMessage: InvocationMessage) {\r\n const methods = this.methods[invocationMessage.target.toLowerCase()];\r\n if (methods) {\r\n methods.forEach((m) => m.apply(this, invocationMessage.arguments));\r\n if (invocationMessage.invocationId) {\r\n // This is not supported in v1. So we return an error to avoid blocking the server waiting for the response.\r\n const message = \"Server requested a response, which is not supported in this version of the client.\";\r\n this.logger.log(LogLevel.Error, message);\r\n\r\n // We don't need to wait on this Promise.\r\n // tslint:disable-next-line:no-floating-promises\r\n this.connection.stop(new Error(message));\r\n }\r\n } else {\r\n this.logger.log(LogLevel.Warning, `No client method with the name '${invocationMessage.target}' found.`);\r\n }\r\n }\r\n\r\n private connectionClosed(error?: Error) {\r\n const callbacks = this.callbacks;\r\n this.callbacks = {};\r\n\r\n this.connectionState = HubConnectionState.Disconnected;\r\n\r\n // if handshake is in progress start will be waiting for the handshake promise, so we complete it\r\n // if it has already completed this should just noop\r\n if (this.handshakeRejecter) {\r\n this.handshakeRejecter(error);\r\n }\r\n\r\n Object.keys(callbacks)\r\n .forEach((key) => {\r\n const callback = callbacks[key];\r\n callback(null, error ? error : new Error(\"Invocation canceled due to connection being closed.\"));\r\n });\r\n\r\n this.cleanupTimeout();\r\n this.cleanupPingTimer();\r\n\r\n this.closedCallbacks.forEach((c) => c.apply(this, [error]));\r\n }\r\n\r\n private cleanupPingTimer(): void {\r\n if (this.pingServerHandle) {\r\n clearTimeout(this.pingServerHandle);\r\n }\r\n }\r\n\r\n private cleanupTimeout(): void {\r\n if (this.timeoutHandle) {\r\n clearTimeout(this.timeoutHandle);\r\n }\r\n }\r\n\r\n private createInvocation(methodName: string, args: any[], nonblocking: boolean): InvocationMessage {\r\n if (nonblocking) {\r\n return {\r\n arguments: args,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n } else {\r\n const id = this.id;\r\n this.id++;\r\n\r\n return {\r\n arguments: args,\r\n invocationId: id.toString(),\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n }\r\n\r\n private createStreamInvocation(methodName: string, args: any[]): StreamInvocationMessage {\r\n const id = this.id;\r\n this.id++;\r\n\r\n return {\r\n arguments: args,\r\n invocationId: id.toString(),\r\n target: methodName,\r\n type: MessageType.StreamInvocation,\r\n };\r\n }\r\n\r\n private createCancelInvocation(id: string): CancelInvocationMessage {\r\n return {\r\n invocationId: id,\r\n type: MessageType.CancelInvocation,\r\n };\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n\r\n/** @private */\r\nexport interface HandshakeRequestMessage {\r\n readonly protocol: string;\r\n readonly version: number;\r\n}\r\n\r\n/** @private */\r\nexport interface HandshakeResponseMessage {\r\n readonly error: string;\r\n}\r\n\r\n/** @private */\r\nexport class HandshakeProtocol {\r\n // Handshake request is always JSON\r\n public writeHandshakeRequest(handshakeRequest: HandshakeRequestMessage): string {\r\n return TextMessageFormat.write(JSON.stringify(handshakeRequest));\r\n }\r\n\r\n public parseHandshakeResponse(data: any): [any, HandshakeResponseMessage] {\r\n let responseMessage: HandshakeResponseMessage;\r\n let messageData: string;\r\n let remainingData: any;\r\n\r\n if (isArrayBuffer(data) || (typeof Buffer !== \"undefined\" && data instanceof Buffer)) {\r\n // Format is binary but still need to read JSON text from handshake response\r\n const binaryData = new Uint8Array(data);\r\n const separatorIndex = binaryData.indexOf(TextMessageFormat.RecordSeparatorCode);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = String.fromCharCode.apply(null, binaryData.slice(0, responseLength));\r\n remainingData = (binaryData.byteLength > responseLength) ? binaryData.slice(responseLength).buffer : null;\r\n } else {\r\n const textData: string = data;\r\n const separatorIndex = textData.indexOf(TextMessageFormat.RecordSeparator);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = textData.substring(0, responseLength);\r\n remainingData = (textData.length > responseLength) ? textData.substring(responseLength) : null;\r\n }\r\n\r\n // At this point we should have just the single handshake message\r\n const messages = TextMessageFormat.parse(messageData);\r\n const response = JSON.parse(messages[0]);\r\n if (response.type) {\r\n throw new Error(\"Expected a handshake response from the server.\");\r\n }\r\n responseMessage = response;\r\n\r\n // multiple messages could have arrived with handshake\r\n // return additional data to be parsed as usual, or null if all parsed\r\n return [remainingData, responseMessage];\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\n// Not exported from index\r\n/** @private */\r\nexport class TextMessageFormat {\r\n public static RecordSeparatorCode = 0x1e;\r\n public static RecordSeparator = String.fromCharCode(TextMessageFormat.RecordSeparatorCode);\r\n\r\n public static write(output: string): string {\r\n return `${output}${TextMessageFormat.RecordSeparator}`;\r\n }\r\n\r\n public static parse(input: string): string[] {\r\n if (input[input.length - 1] !== TextMessageFormat.RecordSeparator) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n\r\n const messages = input.split(TextMessageFormat.RecordSeparator);\r\n messages.pop();\r\n return messages;\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { ILogger } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\n\r\n/** Defines the type of a Hub Message. */\r\nexport enum MessageType {\r\n /** Indicates the message is an Invocation message and implements the {@link @aspnet/signalr.InvocationMessage} interface. */\r\n Invocation = 1,\r\n /** Indicates the message is a StreamItem message and implements the {@link @aspnet/signalr.StreamItemMessage} interface. */\r\n StreamItem = 2,\r\n /** Indicates the message is a Completion message and implements the {@link @aspnet/signalr.CompletionMessage} interface. */\r\n Completion = 3,\r\n /** Indicates the message is a Stream Invocation message and implements the {@link @aspnet/signalr.StreamInvocationMessage} interface. */\r\n StreamInvocation = 4,\r\n /** Indicates the message is a Cancel Invocation message and implements the {@link @aspnet/signalr.CancelInvocationMessage} interface. */\r\n CancelInvocation = 5,\r\n /** Indicates the message is a Ping message and implements the {@link @aspnet/signalr.PingMessage} interface. */\r\n Ping = 6,\r\n /** Indicates the message is a Close message and implements the {@link @aspnet/signalr.CloseMessage} interface. */\r\n Close = 7,\r\n}\r\n\r\n/** Defines a dictionary of string keys and string values representing headers attached to a Hub message. */\r\nexport interface MessageHeaders {\r\n /** Gets or sets the header with the specified key. */\r\n [key: string]: string;\r\n}\r\n\r\n/** Union type of all known Hub messages. */\r\nexport type HubMessage =\r\n InvocationMessage |\r\n StreamInvocationMessage |\r\n StreamItemMessage |\r\n CompletionMessage |\r\n CancelInvocationMessage |\r\n PingMessage |\r\n CloseMessage;\r\n\r\n/** Defines properties common to all Hub messages. */\r\nexport interface HubMessageBase {\r\n /** A {@link @aspnet/signalr.MessageType} value indicating the type of this message. */\r\n readonly type: MessageType;\r\n}\r\n\r\n/** Defines properties common to all Hub messages relating to a specific invocation. */\r\nexport interface HubInvocationMessage extends HubMessageBase {\r\n /** A {@link @aspnet/signalr.MessageHeaders} dictionary containing headers attached to the message. */\r\n readonly headers?: MessageHeaders;\r\n /** The ID of the invocation relating to this message.\r\n *\r\n * This is expected to be present for {@link @aspnet/signalr.StreamInvocationMessage} and {@link @aspnet/signalr.CompletionMessage}. It may\r\n * be 'undefined' for an {@link @aspnet/signalr.InvocationMessage} if the sender does not expect a response.\r\n */\r\n readonly invocationId?: string;\r\n}\r\n\r\n/** A hub message representing a non-streaming invocation. */\r\nexport interface InvocationMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Invocation;\r\n /** The target method name. */\r\n readonly target: string;\r\n /** The target method arguments. */\r\n readonly arguments: any[];\r\n}\r\n\r\n/** A hub message representing a streaming invocation. */\r\nexport interface StreamInvocationMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.StreamInvocation;\r\n\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n /** The target method name. */\r\n readonly target: string;\r\n /** The target method arguments. */\r\n readonly arguments: any[];\r\n}\r\n\r\n/** A hub message representing a single item produced as part of a result stream. */\r\nexport interface StreamItemMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.StreamItem;\r\n\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n\r\n /** The item produced by the server. */\r\n readonly item?: any;\r\n}\r\n\r\n/** A hub message representing the result of an invocation. */\r\nexport interface CompletionMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Completion;\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n /** The error produced by the invocation, if any.\r\n *\r\n * Either {@link @aspnet/signalr.CompletionMessage.error} or {@link @aspnet/signalr.CompletionMessage.result} must be defined, but not both.\r\n */\r\n readonly error?: string;\r\n /** The result produced by the invocation, if any.\r\n *\r\n * Either {@link @aspnet/signalr.CompletionMessage.error} or {@link @aspnet/signalr.CompletionMessage.result} must be defined, but not both.\r\n */\r\n readonly result?: any;\r\n}\r\n\r\n/** A hub message indicating that the sender is still active. */\r\nexport interface PingMessage extends HubMessageBase {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Ping;\r\n}\r\n\r\n/** A hub message indicating that the sender is closing the connection.\r\n *\r\n * If {@link @aspnet/signalr.CloseMessage.error} is defined, the sender is closing the connection due to an error.\r\n */\r\nexport interface CloseMessage extends HubMessageBase {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Close;\r\n /** The error that triggered the close, if any.\r\n *\r\n * If this property is undefined, the connection was closed normally and without error.\r\n */\r\n readonly error?: string;\r\n}\r\n\r\n/** A hub message sent to request that a streaming invocation be canceled. */\r\nexport interface CancelInvocationMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.CancelInvocation;\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n}\r\n\r\n/** A protocol abstraction for communicating with SignalR Hubs. */\r\nexport interface IHubProtocol {\r\n /** The name of the protocol. This is used by SignalR to resolve the protocol between the client and server. */\r\n readonly name: string;\r\n /** The version of the protocol. */\r\n readonly version: number;\r\n /** The {@link @aspnet/signalr.TransferFormat} of the protocol. */\r\n readonly transferFormat: TransferFormat;\r\n\r\n /** Creates an array of {@link @aspnet/signalr.HubMessage} objects from the specified serialized representation.\r\n *\r\n * If {@link @aspnet/signalr.IHubProtocol.transferFormat} is 'Text', the `input` parameter must be a string, otherwise it must be an ArrayBuffer.\r\n *\r\n * @param {string | ArrayBuffer | Buffer} input A string, ArrayBuffer, or Buffer containing the serialized representation.\r\n * @param {ILogger} logger A logger that will be used to log messages that occur during parsing.\r\n */\r\n parseMessages(input: string | ArrayBuffer | Buffer, logger: ILogger): HubMessage[];\r\n\r\n /** Writes the specified {@link @aspnet/signalr.HubMessage} to a string or ArrayBuffer and returns it.\r\n *\r\n * If {@link @aspnet/signalr.IHubProtocol.transferFormat} is 'Text', the result of this method will be a string, otherwise it will be an ArrayBuffer.\r\n *\r\n * @param {HubMessage} message The message to write.\r\n * @returns {string | ArrayBuffer} A string or ArrayBuffer containing the serialized representation of the message.\r\n */\r\n writeMessage(message: HubMessage): string | ArrayBuffer;\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { HttpConnection } from \"./HttpConnection\";\r\nimport { HubConnection } from \"./HubConnection\";\r\nimport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\nimport { IHubProtocol } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { HttpTransportType } from \"./ITransport\";\r\nimport { JsonHubProtocol } from \"./JsonHubProtocol\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { Arg, ConsoleLogger } from \"./Utils\";\r\n\r\n/** A builder for configuring {@link @aspnet/signalr.HubConnection} instances. */\r\nexport class HubConnectionBuilder {\r\n /** @internal */\r\n public protocol?: IHubProtocol;\r\n /** @internal */\r\n public httpConnectionOptions?: IHttpConnectionOptions;\r\n /** @internal */\r\n public url?: string;\r\n /** @internal */\r\n public logger?: ILogger;\r\n\r\n /** Configures console logging for the {@link @aspnet/signalr.HubConnection}.\r\n *\r\n * @param {LogLevel} logLevel The minimum level of messages to log. Anything at this level, or a more severe level, will be logged.\r\n * @returns The {@link @aspnet/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public configureLogging(logLevel: LogLevel): HubConnectionBuilder;\r\n\r\n /** Configures custom logging for the {@link @aspnet/signalr.HubConnection}.\r\n *\r\n * @param {ILogger} logger An object implementing the {@link @aspnet/signalr.ILogger} interface, which will be used to write all log messages.\r\n * @returns The {@link @aspnet/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public configureLogging(logger: ILogger): HubConnectionBuilder;\r\n /** Configures custom logging for the {@link @aspnet/signalr.HubConnection}.\r\n *\r\n * @param {LogLevel | ILogger} logging An object implementing the {@link @aspnet/signalr.ILogger} interface or {@link @aspnet/signalr.LogLevel}.\r\n * @returns The {@link @aspnet/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public configureLogging(logging: LogLevel | ILogger): HubConnectionBuilder;\r\n public configureLogging(logging: LogLevel | ILogger): HubConnectionBuilder {\r\n Arg.isRequired(logging, \"logging\");\r\n\r\n if (isLogger(logging)) {\r\n this.logger = logging;\r\n } else {\r\n this.logger = new ConsoleLogger(logging);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** Configures the {@link @aspnet/signalr.HubConnection} to use HTTP-based transports to connect to the specified URL.\r\n *\r\n * The transport will be selected automatically based on what the server and client support.\r\n *\r\n * @param {string} url The URL the connection will use.\r\n * @returns The {@link @aspnet/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withUrl(url: string): HubConnectionBuilder;\r\n\r\n /** Configures the {@link @aspnet/signalr.HubConnection} to use the specified HTTP-based transport to connect to the specified URL.\r\n *\r\n * @param {string} url The URL the connection will use.\r\n * @param {HttpTransportType} transportType The specific transport to use.\r\n * @returns The {@link @aspnet/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withUrl(url: string, transportType: HttpTransportType): HubConnectionBuilder;\r\n\r\n /** Configures the {@link @aspnet/signalr.HubConnection} to use HTTP-based transports to connect to the specified URL.\r\n *\r\n * @param {string} url The URL the connection will use.\r\n * @param {IHttpConnectionOptions} options An options object used to configure the connection.\r\n * @returns The {@link @aspnet/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withUrl(url: string, options: IHttpConnectionOptions): HubConnectionBuilder;\r\n public withUrl(url: string, transportTypeOrOptions?: IHttpConnectionOptions | HttpTransportType): HubConnectionBuilder {\r\n Arg.isRequired(url, \"url\");\r\n\r\n this.url = url;\r\n\r\n // Flow-typing knows where it's at. Since HttpTransportType is a number and IHttpConnectionOptions is guaranteed\r\n // to be an object, we know (as does TypeScript) this comparison is all we need to figure out which overload was called.\r\n if (typeof transportTypeOrOptions === \"object\") {\r\n this.httpConnectionOptions = transportTypeOrOptions;\r\n } else {\r\n this.httpConnectionOptions = {\r\n transport: transportTypeOrOptions,\r\n };\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** Configures the {@link @aspnet/signalr.HubConnection} to use the specified Hub Protocol.\r\n *\r\n * @param {IHubProtocol} protocol The {@link @aspnet/signalr.IHubProtocol} implementation to use.\r\n */\r\n public withHubProtocol(protocol: IHubProtocol): HubConnectionBuilder {\r\n Arg.isRequired(protocol, \"protocol\");\r\n\r\n this.protocol = protocol;\r\n return this;\r\n }\r\n\r\n /** Creates a {@link @aspnet/signalr.HubConnection} from the configuration options specified in this builder.\r\n *\r\n * @returns {HubConnection} The configured {@link @aspnet/signalr.HubConnection}.\r\n */\r\n public build(): HubConnection {\r\n // If httpConnectionOptions has a logger, use it. Otherwise, override it with the one\r\n // provided to configureLogger\r\n const httpConnectionOptions = this.httpConnectionOptions || {};\r\n\r\n // If it's 'null', the user **explicitly** asked for null, don't mess with it.\r\n if (httpConnectionOptions.logger === undefined) {\r\n // If our logger is undefined or null, that's OK, the HttpConnection constructor will handle it.\r\n httpConnectionOptions.logger = this.logger;\r\n }\r\n\r\n // Now create the connection\r\n if (!this.url) {\r\n throw new Error(\"The 'HubConnectionBuilder.withUrl' method must be called before building the connection.\");\r\n }\r\n const connection = new HttpConnection(this.url, httpConnectionOptions);\r\n\r\n return HubConnection.create(\r\n connection,\r\n this.logger || NullLogger.instance,\r\n this.protocol || new JsonHubProtocol());\r\n }\r\n}\r\n\r\nfunction isLogger(logger: any): logger is ILogger {\r\n return logger.log !== undefined;\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { IConnection } from \"./IConnection\";\r\nimport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { HttpTransportType, ITransport, TransferFormat } from \"./ITransport\";\r\nimport { LongPollingTransport } from \"./LongPollingTransport\";\r\nimport { ServerSentEventsTransport } from \"./ServerSentEventsTransport\";\r\nimport { Arg, createLogger } from \"./Utils\";\r\nimport { WebSocketTransport } from \"./WebSocketTransport\";\r\n\r\n/** @private */\r\nconst enum ConnectionState {\r\n Connecting,\r\n Connected,\r\n Disconnected,\r\n}\r\n\r\n/** @private */\r\nexport interface INegotiateResponse {\r\n connectionId?: string;\r\n availableTransports?: IAvailableTransport[];\r\n url?: string;\r\n accessToken?: string;\r\n error?: string;\r\n}\r\n\r\n/** @private */\r\nexport interface IAvailableTransport {\r\n transport: keyof typeof HttpTransportType;\r\n transferFormats: Array;\r\n}\r\n\r\nconst MAX_REDIRECTS = 100;\r\n\r\nlet WebSocketModule: any = null;\r\nlet EventSourceModule: any = null;\r\nif (typeof window === \"undefined\" && typeof require !== \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n WebSocketModule = requireFunc(\"ws\");\r\n EventSourceModule = requireFunc(\"eventsource\");\r\n}\r\n\r\n/** @private */\r\nexport class HttpConnection implements IConnection {\r\n private connectionState: ConnectionState;\r\n private baseUrl: string;\r\n private readonly httpClient: HttpClient;\r\n private readonly logger: ILogger;\r\n private readonly options: IHttpConnectionOptions;\r\n private transport?: ITransport;\r\n private startPromise?: Promise;\r\n private stopError?: Error;\r\n private accessTokenFactory?: () => string | Promise;\r\n\r\n public readonly features: any = {};\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((e?: Error) => void) | null;\r\n\r\n constructor(url: string, options: IHttpConnectionOptions = {}) {\r\n Arg.isRequired(url, \"url\");\r\n\r\n this.logger = createLogger(options.logger);\r\n this.baseUrl = this.resolveUrl(url);\r\n\r\n options = options || {};\r\n options.logMessageContent = options.logMessageContent || false;\r\n\r\n const isNode = typeof window === \"undefined\";\r\n if (!isNode && typeof WebSocket !== \"undefined\" && !options.WebSocket) {\r\n options.WebSocket = WebSocket;\r\n } else if (isNode && !options.WebSocket) {\r\n if (WebSocketModule) {\r\n options.WebSocket = WebSocketModule;\r\n }\r\n }\r\n\r\n if (!isNode && typeof EventSource !== \"undefined\" && !options.EventSource) {\r\n options.EventSource = EventSource;\r\n } else if (isNode && !options.EventSource) {\r\n if (typeof EventSourceModule !== \"undefined\") {\r\n options.EventSource = EventSourceModule;\r\n }\r\n }\r\n\r\n this.httpClient = options.httpClient || new DefaultHttpClient(this.logger);\r\n this.connectionState = ConnectionState.Disconnected;\r\n this.options = options;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n\r\n public start(): Promise;\r\n public start(transferFormat: TransferFormat): Promise;\r\n public start(transferFormat?: TransferFormat): Promise {\r\n transferFormat = transferFormat || TransferFormat.Binary;\r\n\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n\r\n this.logger.log(LogLevel.Debug, `Starting connection with transfer format '${TransferFormat[transferFormat]}'.`);\r\n\r\n if (this.connectionState !== ConnectionState.Disconnected) {\r\n return Promise.reject(new Error(\"Cannot start a connection that is not in the 'Disconnected' state.\"));\r\n }\r\n\r\n this.connectionState = ConnectionState.Connecting;\r\n\r\n this.startPromise = this.startInternal(transferFormat);\r\n return this.startPromise;\r\n }\r\n\r\n public send(data: string | ArrayBuffer): Promise {\r\n if (this.connectionState !== ConnectionState.Connected) {\r\n throw new Error(\"Cannot send data if the connection is not in the 'Connected' State.\");\r\n }\r\n\r\n // Transport will not be null if state is connected\r\n return this.transport!.send(data);\r\n }\r\n\r\n public async stop(error?: Error): Promise {\r\n this.connectionState = ConnectionState.Disconnected;\r\n // Set error as soon as possible otherwise there is a race between\r\n // the transport closing and providing an error and the error from a close message\r\n // We would prefer the close message error.\r\n this.stopError = error;\r\n\r\n try {\r\n await this.startPromise;\r\n } catch (e) {\r\n // this exception is returned to the user as a rejected Promise from the start method\r\n }\r\n\r\n // The transport's onclose will trigger stopConnection which will run our onclose event.\r\n if (this.transport) {\r\n await this.transport.stop();\r\n this.transport = undefined;\r\n }\r\n }\r\n\r\n private async startInternal(transferFormat: TransferFormat): Promise {\r\n // Store the original base url and the access token factory since they may change\r\n // as part of negotiating\r\n let url = this.baseUrl;\r\n this.accessTokenFactory = this.options.accessTokenFactory;\r\n\r\n try {\r\n if (this.options.skipNegotiation) {\r\n if (this.options.transport === HttpTransportType.WebSockets) {\r\n // No need to add a connection ID in this case\r\n this.transport = this.constructTransport(HttpTransportType.WebSockets);\r\n // We should just call connect directly in this case.\r\n // No fallback or negotiate in this case.\r\n await this.transport!.connect(url, transferFormat);\r\n } else {\r\n throw Error(\"Negotiation can only be skipped when using the WebSocket transport directly.\");\r\n }\r\n } else {\r\n let negotiateResponse: INegotiateResponse | null = null;\r\n let redirects = 0;\r\n\r\n do {\r\n negotiateResponse = await this.getNegotiationResponse(url);\r\n // the user tries to stop the connection when it is being started\r\n if (this.connectionState === ConnectionState.Disconnected) {\r\n return;\r\n }\r\n\r\n if (negotiateResponse.error) {\r\n throw Error(negotiateResponse.error);\r\n }\r\n\r\n if ((negotiateResponse as any).ProtocolVersion) {\r\n throw Error(\"Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.\");\r\n }\r\n\r\n if (negotiateResponse.url) {\r\n url = negotiateResponse.url;\r\n }\r\n\r\n if (negotiateResponse.accessToken) {\r\n // Replace the current access token factory with one that uses\r\n // the returned access token\r\n const accessToken = negotiateResponse.accessToken;\r\n this.accessTokenFactory = () => accessToken;\r\n }\r\n\r\n redirects++;\r\n }\r\n while (negotiateResponse.url && redirects < MAX_REDIRECTS);\r\n\r\n if (redirects === MAX_REDIRECTS && negotiateResponse.url) {\r\n throw Error(\"Negotiate redirection limit exceeded.\");\r\n }\r\n\r\n await this.createTransport(url, this.options.transport, negotiateResponse, transferFormat);\r\n }\r\n\r\n if (this.transport instanceof LongPollingTransport) {\r\n this.features.inherentKeepAlive = true;\r\n }\r\n\r\n this.transport!.onreceive = this.onreceive;\r\n this.transport!.onclose = (e) => this.stopConnection(e);\r\n\r\n // only change the state if we were connecting to not overwrite\r\n // the state if the connection is already marked as Disconnected\r\n this.changeState(ConnectionState.Connecting, ConnectionState.Connected);\r\n } catch (e) {\r\n this.logger.log(LogLevel.Error, \"Failed to start the connection: \" + e);\r\n this.connectionState = ConnectionState.Disconnected;\r\n this.transport = undefined;\r\n throw e;\r\n }\r\n }\r\n\r\n private async getNegotiationResponse(url: string): Promise {\r\n let headers;\r\n if (this.accessTokenFactory) {\r\n const token = await this.accessTokenFactory();\r\n if (token) {\r\n headers = {\r\n [\"Authorization\"]: `Bearer ${token}`,\r\n };\r\n }\r\n }\r\n\r\n const negotiateUrl = this.resolveNegotiateUrl(url);\r\n this.logger.log(LogLevel.Debug, `Sending negotiation request: ${negotiateUrl}.`);\r\n try {\r\n const response = await this.httpClient.post(negotiateUrl, {\r\n content: \"\",\r\n headers,\r\n });\r\n\r\n if (response.statusCode !== 200) {\r\n throw Error(`Unexpected status code returned from negotiate ${response.statusCode}`);\r\n }\r\n\r\n return JSON.parse(response.content as string) as INegotiateResponse;\r\n } catch (e) {\r\n this.logger.log(LogLevel.Error, \"Failed to complete negotiation with the server: \" + e);\r\n throw e;\r\n }\r\n }\r\n\r\n private createConnectUrl(url: string, connectionId: string | null | undefined) {\r\n if (!connectionId) {\r\n return url;\r\n }\r\n return url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + `id=${connectionId}`;\r\n }\r\n\r\n private async createTransport(url: string, requestedTransport: HttpTransportType | ITransport | undefined, negotiateResponse: INegotiateResponse, requestedTransferFormat: TransferFormat): Promise {\r\n let connectUrl = this.createConnectUrl(url, negotiateResponse.connectionId);\r\n if (this.isITransport(requestedTransport)) {\r\n this.logger.log(LogLevel.Debug, \"Connection was provided an instance of ITransport, using that directly.\");\r\n this.transport = requestedTransport;\r\n await this.transport.connect(connectUrl, requestedTransferFormat);\r\n\r\n // only change the state if we were connecting to not overwrite\r\n // the state if the connection is already marked as Disconnected\r\n this.changeState(ConnectionState.Connecting, ConnectionState.Connected);\r\n return;\r\n }\r\n\r\n const transports = negotiateResponse.availableTransports || [];\r\n for (const endpoint of transports) {\r\n this.connectionState = ConnectionState.Connecting;\r\n const transport = this.resolveTransport(endpoint, requestedTransport, requestedTransferFormat);\r\n if (typeof transport === \"number\") {\r\n this.transport = this.constructTransport(transport);\r\n if (!negotiateResponse.connectionId) {\r\n negotiateResponse = await this.getNegotiationResponse(url);\r\n connectUrl = this.createConnectUrl(url, negotiateResponse.connectionId);\r\n }\r\n try {\r\n await this.transport!.connect(connectUrl, requestedTransferFormat);\r\n this.changeState(ConnectionState.Connecting, ConnectionState.Connected);\r\n return;\r\n } catch (ex) {\r\n this.logger.log(LogLevel.Error, `Failed to start the transport '${HttpTransportType[transport]}': ${ex}`);\r\n this.connectionState = ConnectionState.Disconnected;\r\n negotiateResponse.connectionId = undefined;\r\n }\r\n }\r\n }\r\n\r\n throw new Error(\"Unable to initialize any of the available transports.\");\r\n }\r\n\r\n private constructTransport(transport: HttpTransportType) {\r\n switch (transport) {\r\n case HttpTransportType.WebSockets:\r\n if (!this.options.WebSocket) {\r\n throw new Error(\"'WebSocket' is not supported in your environment.\");\r\n }\r\n return new WebSocketTransport(this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent || false, this.options.WebSocket);\r\n case HttpTransportType.ServerSentEvents:\r\n if (!this.options.EventSource) {\r\n throw new Error(\"'EventSource' is not supported in your environment.\");\r\n }\r\n return new ServerSentEventsTransport(this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent || false, this.options.EventSource);\r\n case HttpTransportType.LongPolling:\r\n return new LongPollingTransport(this.httpClient, this.accessTokenFactory, this.logger, this.options.logMessageContent || false);\r\n default:\r\n throw new Error(`Unknown transport: ${transport}.`);\r\n }\r\n }\r\n\r\n private resolveTransport(endpoint: IAvailableTransport, requestedTransport: HttpTransportType | undefined, requestedTransferFormat: TransferFormat): HttpTransportType | null {\r\n const transport = HttpTransportType[endpoint.transport];\r\n if (transport === null || transport === undefined) {\r\n this.logger.log(LogLevel.Debug, `Skipping transport '${endpoint.transport}' because it is not supported by this client.`);\r\n } else {\r\n const transferFormats = endpoint.transferFormats.map((s) => TransferFormat[s]);\r\n if (transportMatches(requestedTransport, transport)) {\r\n if (transferFormats.indexOf(requestedTransferFormat) >= 0) {\r\n if ((transport === HttpTransportType.WebSockets && !this.options.WebSocket) ||\r\n (transport === HttpTransportType.ServerSentEvents && !this.options.EventSource)) {\r\n this.logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it is not supported in your environment.'`);\r\n } else {\r\n this.logger.log(LogLevel.Debug, `Selecting transport '${HttpTransportType[transport]}'.`);\r\n return transport;\r\n }\r\n } else {\r\n this.logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it does not support the requested transfer format '${TransferFormat[requestedTransferFormat]}'.`);\r\n }\r\n } else {\r\n this.logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it was disabled by the client.`);\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private isITransport(transport: any): transport is ITransport {\r\n return transport && typeof (transport) === \"object\" && \"connect\" in transport;\r\n }\r\n\r\n private changeState(from: ConnectionState, to: ConnectionState): boolean {\r\n if (this.connectionState === from) {\r\n this.connectionState = to;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private stopConnection(error?: Error): void {\r\n this.transport = undefined;\r\n\r\n // If we have a stopError, it takes precedence over the error from the transport\r\n error = this.stopError || error;\r\n\r\n if (error) {\r\n this.logger.log(LogLevel.Error, `Connection disconnected with error '${error}'.`);\r\n } else {\r\n this.logger.log(LogLevel.Information, \"Connection disconnected.\");\r\n }\r\n\r\n this.connectionState = ConnectionState.Disconnected;\r\n\r\n if (this.onclose) {\r\n this.onclose(error);\r\n }\r\n }\r\n\r\n private resolveUrl(url: string): string {\r\n // startsWith is not supported in IE\r\n if (url.lastIndexOf(\"https://\", 0) === 0 || url.lastIndexOf(\"http://\", 0) === 0) {\r\n return url;\r\n }\r\n\r\n if (typeof window === \"undefined\" || !window || !window.document) {\r\n throw new Error(`Cannot resolve '${url}'.`);\r\n }\r\n\r\n // Setting the url to the href propery of an anchor tag handles normalization\r\n // for us. There are 3 main cases.\r\n // 1. Relative path normalization e.g \"b\" -> \"http://localhost:5000/a/b\"\r\n // 2. Absolute path normalization e.g \"/a/b\" -> \"http://localhost:5000/a/b\"\r\n // 3. Networkpath reference normalization e.g \"//localhost:5000/a/b\" -> \"http://localhost:5000/a/b\"\r\n const aTag = window.document.createElement(\"a\");\r\n aTag.href = url;\r\n\r\n this.logger.log(LogLevel.Information, `Normalizing '${url}' to '${aTag.href}'.`);\r\n return aTag.href;\r\n }\r\n\r\n private resolveNegotiateUrl(url: string): string {\r\n const index = url.indexOf(\"?\");\r\n let negotiateUrl = url.substring(0, index === -1 ? url.length : index);\r\n if (negotiateUrl[negotiateUrl.length - 1] !== \"/\") {\r\n negotiateUrl += \"/\";\r\n }\r\n negotiateUrl += \"negotiate\";\r\n negotiateUrl += index === -1 ? \"\" : url.substring(index);\r\n return negotiateUrl;\r\n }\r\n}\r\n\r\nfunction transportMatches(requestedTransport: HttpTransportType | undefined, actualTransport: HttpTransportType) {\r\n return !requestedTransport || ((actualTransport & requestedTransport) !== 0);\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\n// This will be treated as a bit flag in the future, so we keep it using power-of-two values.\r\n/** Specifies a specific HTTP transport type. */\r\nexport enum HttpTransportType {\r\n /** Specifies no transport preference. */\r\n None = 0,\r\n /** Specifies the WebSockets transport. */\r\n WebSockets = 1,\r\n /** Specifies the Server-Sent Events transport. */\r\n ServerSentEvents = 2,\r\n /** Specifies the Long Polling transport. */\r\n LongPolling = 4,\r\n}\r\n\r\n/** Specifies the transfer format for a connection. */\r\nexport enum TransferFormat {\r\n /** Specifies that only text data will be transmitted over the connection. */\r\n Text = 1,\r\n /** Specifies that binary data will be transmitted over the connection. */\r\n Binary = 2,\r\n}\r\n\r\n/** An abstraction over the behavior of transports. This is designed to support the framework and not intended for use by applications. */\r\nexport interface ITransport {\r\n connect(url: string, transferFormat: TransferFormat): Promise;\r\n send(data: any): Promise;\r\n stop(): Promise;\r\n onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n onclose: ((error?: Error) => void) | null;\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { AbortController } from \"./AbortController\";\r\nimport { HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpRequest } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { ITransport, TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, sendMessage } from \"./Utils\";\r\n\r\n// Not exported from 'index', this type is internal.\r\n/** @private */\r\nexport class LongPollingTransport implements ITransport {\r\n private readonly httpClient: HttpClient;\r\n private readonly accessTokenFactory: (() => string | Promise) | undefined;\r\n private readonly logger: ILogger;\r\n private readonly logMessageContent: boolean;\r\n private readonly pollAbort: AbortController;\r\n\r\n private url?: string;\r\n private running: boolean;\r\n private receiving?: Promise;\r\n private closeError?: Error;\r\n\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((error?: Error) => void) | null;\r\n\r\n // This is an internal type, not exported from 'index' so this is really just internal.\r\n public get pollAborted() {\r\n return this.pollAbort.aborted;\r\n }\r\n\r\n constructor(httpClient: HttpClient, accessTokenFactory: (() => string | Promise) | undefined, logger: ILogger, logMessageContent: boolean) {\r\n this.httpClient = httpClient;\r\n this.accessTokenFactory = accessTokenFactory;\r\n this.logger = logger;\r\n this.pollAbort = new AbortController();\r\n this.logMessageContent = logMessageContent;\r\n\r\n this.running = false;\r\n\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n\r\n public async connect(url: string, transferFormat: TransferFormat): Promise {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n\r\n this.url = url;\r\n\r\n this.logger.log(LogLevel.Trace, \"(LongPolling transport) Connecting.\");\r\n\r\n // Allow binary format on Node and Browsers that support binary content (indicated by the presence of responseType property)\r\n if (transferFormat === TransferFormat.Binary &&\r\n (typeof XMLHttpRequest !== \"undefined\" && typeof new XMLHttpRequest().responseType !== \"string\")) {\r\n throw new Error(\"Binary protocols over XmlHttpRequest not implementing advanced features are not supported.\");\r\n }\r\n\r\n const pollOptions: HttpRequest = {\r\n abortSignal: this.pollAbort.signal,\r\n headers: {},\r\n timeout: 100000,\r\n };\r\n\r\n if (transferFormat === TransferFormat.Binary) {\r\n pollOptions.responseType = \"arraybuffer\";\r\n }\r\n\r\n const token = await this.getAccessToken();\r\n this.updateHeaderToken(pollOptions, token);\r\n\r\n // Make initial long polling request\r\n // Server uses first long polling request to finish initializing connection and it returns without data\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this.logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this.httpClient.get(pollUrl, pollOptions);\r\n if (response.statusCode !== 200) {\r\n this.logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n\r\n // Mark running as false so that the poll immediately ends and runs the close logic\r\n this.closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this.running = false;\r\n } else {\r\n this.running = true;\r\n }\r\n\r\n this.receiving = this.poll(this.url, pollOptions);\r\n }\r\n\r\n private async getAccessToken(): Promise {\r\n if (this.accessTokenFactory) {\r\n return await this.accessTokenFactory();\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private updateHeaderToken(request: HttpRequest, token: string | null) {\r\n if (!request.headers) {\r\n request.headers = {};\r\n }\r\n if (token) {\r\n // tslint:disable-next-line:no-string-literal\r\n request.headers[\"Authorization\"] = `Bearer ${token}`;\r\n return;\r\n }\r\n // tslint:disable-next-line:no-string-literal\r\n if (request.headers[\"Authorization\"]) {\r\n // tslint:disable-next-line:no-string-literal\r\n delete request.headers[\"Authorization\"];\r\n }\r\n }\r\n\r\n private async poll(url: string, pollOptions: HttpRequest): Promise {\r\n try {\r\n while (this.running) {\r\n // We have to get the access token on each poll, in case it changes\r\n const token = await this.getAccessToken();\r\n this.updateHeaderToken(pollOptions, token);\r\n\r\n try {\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this.logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this.httpClient.get(pollUrl, pollOptions);\r\n\r\n if (response.statusCode === 204) {\r\n this.logger.log(LogLevel.Information, \"(LongPolling transport) Poll terminated by server.\");\r\n\r\n this.running = false;\r\n } else if (response.statusCode !== 200) {\r\n this.logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n\r\n // Unexpected status code\r\n this.closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this.running = false;\r\n } else {\r\n // Process the response\r\n if (response.content) {\r\n this.logger.log(LogLevel.Trace, `(LongPolling transport) data received. ${getDataDetail(response.content, this.logMessageContent)}.`);\r\n if (this.onreceive) {\r\n this.onreceive(response.content);\r\n }\r\n } else {\r\n // This is another way timeout manifest.\r\n this.logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n }\r\n }\r\n } catch (e) {\r\n if (!this.running) {\r\n // Log but disregard errors that occur after stopping\r\n this.logger.log(LogLevel.Trace, `(LongPolling transport) Poll errored after shutdown: ${e.message}`);\r\n } else {\r\n if (e instanceof TimeoutError) {\r\n // Ignore timeouts and reissue the poll.\r\n this.logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n } else {\r\n // Close the connection with the error as the result.\r\n this.closeError = e;\r\n this.running = false;\r\n }\r\n }\r\n }\r\n }\r\n } finally {\r\n this.logger.log(LogLevel.Trace, \"(LongPolling transport) Polling complete.\");\r\n\r\n // We will reach here with pollAborted==false when the server returned a response causing the transport to stop.\r\n // If pollAborted==true then client initiated the stop and the stop method will raise the close event after DELETE is sent.\r\n if (!this.pollAborted) {\r\n this.raiseOnClose();\r\n }\r\n }\r\n }\r\n\r\n public async send(data: any): Promise {\r\n if (!this.running) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this.logger, \"LongPolling\", this.httpClient, this.url!, this.accessTokenFactory, data, this.logMessageContent);\r\n }\r\n\r\n public async stop(): Promise {\r\n this.logger.log(LogLevel.Trace, \"(LongPolling transport) Stopping polling.\");\r\n\r\n // Tell receiving loop to stop, abort any current request, and then wait for it to finish\r\n this.running = false;\r\n this.pollAbort.abort();\r\n\r\n try {\r\n await this.receiving;\r\n\r\n // Send DELETE to clean up long polling on the server\r\n this.logger.log(LogLevel.Trace, `(LongPolling transport) sending DELETE request to ${this.url}.`);\r\n\r\n const deleteOptions: HttpRequest = {\r\n headers: {},\r\n };\r\n const token = await this.getAccessToken();\r\n this.updateHeaderToken(deleteOptions, token);\r\n await this.httpClient.delete(this.url!, deleteOptions);\r\n\r\n this.logger.log(LogLevel.Trace, \"(LongPolling transport) DELETE request sent.\");\r\n } finally {\r\n this.logger.log(LogLevel.Trace, \"(LongPolling transport) Stop finished.\");\r\n\r\n // Raise close event here instead of in polling\r\n // It needs to happen after the DELETE request is sent\r\n this.raiseOnClose();\r\n }\r\n }\r\n\r\n private raiseOnClose() {\r\n if (this.onclose) {\r\n let logMessage = \"(LongPolling transport) Firing onclose event.\";\r\n if (this.closeError) {\r\n logMessage += \" Error: \" + this.closeError;\r\n }\r\n this.logger.log(LogLevel.Trace, logMessage);\r\n this.onclose(this.closeError);\r\n }\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\n// Rough polyfill of https://developer.mozilla.org/en-US/docs/Web/API/AbortController\r\n// We don't actually ever use the API being polyfilled, we always use the polyfill because\r\n// it's a very new API right now.\r\n\r\n// Not exported from index.\r\n/** @private */\r\nexport class AbortController implements AbortSignal {\r\n private isAborted: boolean = false;\r\n public onabort: (() => void) | null = null;\r\n\r\n public abort() {\r\n if (!this.isAborted) {\r\n this.isAborted = true;\r\n if (this.onabort) {\r\n this.onabort();\r\n }\r\n }\r\n }\r\n\r\n get signal(): AbortSignal {\r\n return this;\r\n }\r\n\r\n get aborted(): boolean {\r\n return this.isAborted;\r\n }\r\n}\r\n\r\n/** Represents a signal that can be monitored to determine if a request has been aborted. */\r\nexport interface AbortSignal {\r\n /** Indicates if the request has been aborted. */\r\n aborted: boolean;\r\n /** Set this to a handler that will be invoked when the request is aborted. */\r\n onabort: (() => void) | null;\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { ITransport, TransferFormat } from \"./ITransport\";\r\nimport { EventSourceConstructor } from \"./Polyfills\";\r\nimport { Arg, getDataDetail, sendMessage } from \"./Utils\";\r\n\r\n/** @private */\r\nexport class ServerSentEventsTransport implements ITransport {\r\n private readonly httpClient: HttpClient;\r\n private readonly accessTokenFactory: (() => string | Promise) | undefined;\r\n private readonly logger: ILogger;\r\n private readonly logMessageContent: boolean;\r\n private readonly eventSourceConstructor: EventSourceConstructor;\r\n private eventSource?: EventSource;\r\n private url?: string;\r\n\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((error?: Error) => void) | null;\r\n\r\n constructor(httpClient: HttpClient, accessTokenFactory: (() => string | Promise) | undefined, logger: ILogger,\r\n logMessageContent: boolean, eventSourceConstructor: EventSourceConstructor) {\r\n this.httpClient = httpClient;\r\n this.accessTokenFactory = accessTokenFactory;\r\n this.logger = logger;\r\n this.logMessageContent = logMessageContent;\r\n this.eventSourceConstructor = eventSourceConstructor;\r\n\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n\r\n public async connect(url: string, transferFormat: TransferFormat): Promise {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n\r\n this.logger.log(LogLevel.Trace, \"(SSE transport) Connecting.\");\r\n\r\n // set url before accessTokenFactory because this.url is only for send and we set the auth header instead of the query string for send\r\n this.url = url;\r\n\r\n if (this.accessTokenFactory) {\r\n const token = await this.accessTokenFactory();\r\n if (token) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(token)}`;\r\n }\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let opened = false;\r\n if (transferFormat !== TransferFormat.Text) {\r\n reject(new Error(\"The Server-Sent Events transport only supports the 'Text' transfer format\"));\r\n return;\r\n }\r\n\r\n let eventSource: EventSource;\r\n if (typeof window !== \"undefined\") {\r\n eventSource = new this.eventSourceConstructor(url, { withCredentials: true });\r\n } else {\r\n // Non-browser passes cookies via the dictionary\r\n const cookies = this.httpClient.getCookieString(url);\r\n eventSource = new this.eventSourceConstructor(url, { withCredentials: true, headers: { Cookie: cookies } } as EventSourceInit);\r\n }\r\n\r\n try {\r\n eventSource.onmessage = (e: MessageEvent) => {\r\n if (this.onreceive) {\r\n try {\r\n this.logger.log(LogLevel.Trace, `(SSE transport) data received. ${getDataDetail(e.data, this.logMessageContent)}.`);\r\n this.onreceive(e.data);\r\n } catch (error) {\r\n this.close(error);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n eventSource.onerror = (e: MessageEvent) => {\r\n const error = new Error(e.data || \"Error occurred\");\r\n if (opened) {\r\n this.close(error);\r\n } else {\r\n reject(error);\r\n }\r\n };\r\n\r\n eventSource.onopen = () => {\r\n this.logger.log(LogLevel.Information, `SSE connected to ${this.url}`);\r\n this.eventSource = eventSource;\r\n opened = true;\r\n resolve();\r\n };\r\n } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n });\r\n }\r\n\r\n public async send(data: any): Promise {\r\n if (!this.eventSource) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this.logger, \"SSE\", this.httpClient, this.url!, this.accessTokenFactory, data, this.logMessageContent);\r\n }\r\n\r\n public stop(): Promise {\r\n this.close();\r\n return Promise.resolve();\r\n }\r\n\r\n private close(e?: Error) {\r\n if (this.eventSource) {\r\n this.eventSource.close();\r\n this.eventSource = undefined;\r\n\r\n if (this.onclose) {\r\n this.onclose(e);\r\n }\r\n }\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { ITransport, TransferFormat } from \"./ITransport\";\r\nimport { WebSocketConstructor } from \"./Polyfills\";\r\nimport { Arg, getDataDetail } from \"./Utils\";\r\n\r\n/** @private */\r\nexport class WebSocketTransport implements ITransport {\r\n private readonly logger: ILogger;\r\n private readonly accessTokenFactory: (() => string | Promise) | undefined;\r\n private readonly logMessageContent: boolean;\r\n private readonly webSocketConstructor: WebSocketConstructor;\r\n private readonly httpClient: HttpClient;\r\n private webSocket?: WebSocket;\r\n\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((error?: Error) => void) | null;\r\n\r\n constructor(httpClient: HttpClient, accessTokenFactory: (() => string | Promise) | undefined, logger: ILogger,\r\n logMessageContent: boolean, webSocketConstructor: WebSocketConstructor) {\r\n this.logger = logger;\r\n this.accessTokenFactory = accessTokenFactory;\r\n this.logMessageContent = logMessageContent;\r\n this.webSocketConstructor = webSocketConstructor;\r\n this.httpClient = httpClient;\r\n\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n\r\n public async connect(url: string, transferFormat: TransferFormat): Promise {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n\r\n this.logger.log(LogLevel.Trace, \"(WebSockets transport) Connecting.\");\r\n\r\n if (this.accessTokenFactory) {\r\n const token = await this.accessTokenFactory();\r\n if (token) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(token)}`;\r\n }\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n url = url.replace(/^http/, \"ws\");\r\n let webSocket: WebSocket | undefined;\r\n const cookies = this.httpClient.getCookieString(url);\r\n\r\n if (typeof window === \"undefined\" && cookies) {\r\n // Only pass cookies when in non-browser environments\r\n webSocket = new this.webSocketConstructor(url, undefined, {\r\n headers: {\r\n Cookie: `${cookies}`,\r\n },\r\n });\r\n }\r\n\r\n if (!webSocket) {\r\n // Chrome is not happy with passing 'undefined' as protocol\r\n webSocket = new this.webSocketConstructor(url);\r\n }\r\n\r\n if (transferFormat === TransferFormat.Binary) {\r\n webSocket.binaryType = \"arraybuffer\";\r\n }\r\n\r\n // tslint:disable-next-line:variable-name\r\n webSocket.onopen = (_event: Event) => {\r\n this.logger.log(LogLevel.Information, `WebSocket connected to ${url}.`);\r\n this.webSocket = webSocket;\r\n resolve();\r\n };\r\n\r\n webSocket.onerror = (event: Event) => {\r\n let error: any = null;\r\n // ErrorEvent is a browser only type we need to check if the type exists before using it\r\n if (typeof ErrorEvent !== \"undefined\" && event instanceof ErrorEvent) {\r\n error = event.error;\r\n }\r\n reject(error);\r\n };\r\n\r\n webSocket.onmessage = (message: MessageEvent) => {\r\n this.logger.log(LogLevel.Trace, `(WebSockets transport) data received. ${getDataDetail(message.data, this.logMessageContent)}.`);\r\n if (this.onreceive) {\r\n this.onreceive(message.data);\r\n }\r\n };\r\n\r\n webSocket.onclose = (event: CloseEvent) => this.close(event);\r\n });\r\n }\r\n\r\n public send(data: any): Promise {\r\n if (this.webSocket && this.webSocket.readyState === this.webSocketConstructor.OPEN) {\r\n this.logger.log(LogLevel.Trace, `(WebSockets transport) sending data. ${getDataDetail(data, this.logMessageContent)}.`);\r\n this.webSocket.send(data);\r\n return Promise.resolve();\r\n }\r\n\r\n return Promise.reject(\"WebSocket is not in the OPEN state\");\r\n }\r\n\r\n public stop(): Promise {\r\n if (this.webSocket) {\r\n // Clear websocket handlers because we are considering the socket closed now\r\n this.webSocket.onclose = () => {};\r\n this.webSocket.onmessage = () => {};\r\n this.webSocket.onerror = () => {};\r\n this.webSocket.close();\r\n this.webSocket = undefined;\r\n\r\n // Manually invoke onclose callback inline so we know the HttpConnection was closed properly before returning\r\n // This also solves an issue where websocket.onclose could take 18+ seconds to trigger during network disconnects\r\n this.close(undefined);\r\n }\r\n\r\n return Promise.resolve();\r\n }\r\n\r\n private close(event?: CloseEvent): void {\r\n // webSocket will be null if the transport did not start successfully\r\n this.logger.log(LogLevel.Trace, \"(WebSockets transport) socket closed.\");\r\n if (this.onclose) {\r\n if (event && (event.wasClean === false || event.code !== 1000)) {\r\n this.onclose(new Error(`WebSocket closed with status code: ${event.code} (${event.reason}).`));\r\n } else {\r\n this.onclose();\r\n }\r\n }\r\n }\r\n}\r\n","// Copyright (c) .NET Foundation. All rights reserved.\r\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\r\n\r\nimport { CompletionMessage, HubMessage, IHubProtocol, InvocationMessage, MessageType, StreamItemMessage } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\n\r\nconst JSON_HUB_PROTOCOL_NAME: string = \"json\";\r\n\r\n/** Implements the JSON Hub Protocol. */\r\nexport class JsonHubProtocol implements IHubProtocol {\r\n\r\n /** @inheritDoc */\r\n public readonly name: string = JSON_HUB_PROTOCOL_NAME;\r\n /** @inheritDoc */\r\n public readonly version: number = 1;\r\n\r\n /** @inheritDoc */\r\n public readonly transferFormat: TransferFormat = TransferFormat.Text;\r\n\r\n /** Creates an array of {@link @aspnet/signalr.HubMessage} objects from the specified serialized representation.\r\n *\r\n * @param {string} input A string containing the serialized representation.\r\n * @param {ILogger} logger A logger that will be used to log messages that occur during parsing.\r\n */\r\n public parseMessages(input: string, logger: ILogger): HubMessage[] {\r\n // The interface does allow \"ArrayBuffer\" to be passed in, but this implementation does not. So let's throw a useful error.\r\n if (typeof input !== \"string\") {\r\n throw new Error(\"Invalid input for JSON hub protocol. Expected a string.\");\r\n }\r\n\r\n if (!input) {\r\n return [];\r\n }\r\n\r\n if (logger === null) {\r\n logger = NullLogger.instance;\r\n }\r\n\r\n // Parse the messages\r\n const messages = TextMessageFormat.parse(input);\r\n\r\n const hubMessages = [];\r\n for (const message of messages) {\r\n const parsedMessage = JSON.parse(message) as HubMessage;\r\n if (typeof parsedMessage.type !== \"number\") {\r\n throw new Error(\"Invalid payload.\");\r\n }\r\n switch (parsedMessage.type) {\r\n case MessageType.Invocation:\r\n this.isInvocationMessage(parsedMessage);\r\n break;\r\n case MessageType.StreamItem:\r\n this.isStreamItemMessage(parsedMessage);\r\n break;\r\n case MessageType.Completion:\r\n this.isCompletionMessage(parsedMessage);\r\n break;\r\n case MessageType.Ping:\r\n // Single value, no need to validate\r\n break;\r\n case MessageType.Close:\r\n // All optional values, no need to validate\r\n break;\r\n default:\r\n // Future protocol changes can add message types, old clients can ignore them\r\n logger.log(LogLevel.Information, \"Unknown message type '\" + parsedMessage.type + \"' ignored.\");\r\n continue;\r\n }\r\n hubMessages.push(parsedMessage);\r\n }\r\n\r\n return hubMessages;\r\n }\r\n\r\n /** Writes the specified {@link @aspnet/signalr.HubMessage} to a string and returns it.\r\n *\r\n * @param {HubMessage} message The message to write.\r\n * @returns {string} A string containing the serialized representation of the message.\r\n */\r\n public writeMessage(message: HubMessage): string {\r\n return TextMessageFormat.write(JSON.stringify(message));\r\n }\r\n\r\n private isInvocationMessage(message: InvocationMessage): void {\r\n this.assertNotEmptyString(message.target, \"Invalid payload for Invocation message.\");\r\n\r\n if (message.invocationId !== undefined) {\r\n this.assertNotEmptyString(message.invocationId, \"Invalid payload for Invocation message.\");\r\n }\r\n }\r\n\r\n private isStreamItemMessage(message: StreamItemMessage): void {\r\n this.assertNotEmptyString(message.invocationId, \"Invalid payload for StreamItem message.\");\r\n\r\n if (message.item === undefined) {\r\n throw new Error(\"Invalid payload for StreamItem message.\");\r\n }\r\n }\r\n\r\n private isCompletionMessage(message: CompletionMessage): void {\r\n if (message.result && message.error) {\r\n throw new Error(\"Invalid payload for Completion message.\");\r\n }\r\n\r\n if (!message.result && message.error) {\r\n this.assertNotEmptyString(message.error, \"Invalid payload for Completion message.\");\r\n }\r\n\r\n this.assertNotEmptyString(message.invocationId, \"Invalid payload for Completion message.\");\r\n }\r\n\r\n private assertNotEmptyString(value: any, errorMessage: string): void {\r\n if (typeof value !== \"string\" || value === \"\") {\r\n throw new Error(errorMessage);\r\n }\r\n }\r\n}\r\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.OpusMediaRecorder=t():e.OpusMediaRecorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,\"a\",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p=\"\",n(n.s=0)}([function(e,t,n){(function(t){function r(e){return(r=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(\"undefined\"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],r=!0,o=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(r=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==a.return||a.return()}finally{if(o)throw i}}return n}(e,t)||function(e,t){if(!e)return;if(\"string\"==typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);\"Object\"===n&&e.constructor&&(n=e.constructor.name);if(\"Map\"===n||\"Set\"===n)return Array.from(e);if(\"Arguments\"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(e,t)}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,f);var o=n.mimeType,i=n.audioBitsPerSecond,a=(n.videoBitsPerSecond,n.bitsPerSecond),c=r.encoderWorkerFactory,u=r.OggOpusEncoderWasmPath,p=r.WebMOpusEncoderWasmPath;if((t=l.call(this))._stream=e,t._state=\"inactive\",t._mimeType=o||\"\",t._audioBitsPerSecond=i||a,t.workerState=\"inactive\",!f.isTypeSupported(t._mimeType))throw new TypeError(\"invalid arguments, a MIME Type is not supported\");switch(f._parseType(t._mimeType).subtype){case\"wave\":case\"wav\":t._mimeType=\"audio/wave\";break;case\"webm\":t._mimeType=\"audio/webm\";break;case\"ogg\":t._mimeType=\"audio/ogg\";break;default:switch(m&&m.name){case\"chrome\":t._mimeType=\"audio/webm\";break;case\"firefox\":t._mimeType=\"audio/ogg\";break;case\"edge\":t._mimeType=\"audio/webm\";break;case\"ios\":case\"safari\":t._mimeType=\"audio/wave\";break;default:t._mimeType=\"audio/webm\"}}switch(t._mimeType){case\"audio/wave\":t._wasmPath=\"\";break;case\"audio/webm\":t._wasmPath=p||\"\";break;case\"audio/ogg\":t._wasmPath=u||\"\";break;default:throw new Error(\"Internal Error: Unexpected MIME Type: \".concat(t._mimeType))}var d=\"\";return document.currentScript?d=document.currentScript.src:self.location&&(d=self.location.href),d=d.substr(0,d.lastIndexOf(\"/\"))+\"/encoderWorker.umd.js\",\"function\"==typeof f.encoderWorker&&(d=URL.createObjectURL(new Blob([\"(\".concat(f.encoderWorker,\")()\")]))),t._workerFactory=\"function\"==typeof c?c:function(e){return new Worker(d)},t._spawnWorker(),t}return n=f,i=[{key:\"isTypeSupported\",value:function(e){if(\"string\"==typeof e&&!e)return!0;try{var t=f._parseType(e),n=t.type,r=t.subtype,o=t.codec}catch(e){return!1}if(\"audio\"!==n||\"ogg\"!==r&&\"webm\"!==r&&\"wave\"!==r&&\"wav\"!==r)return!1;switch(r){case\"ogg\":case\"webm\":if(\"opus\"!==o&&o)return!1;break;case\"wave\":case\"wav\":if(o)return!1}return!0}},{key:\"_parseType\",value:function(e){try{var t=o(e.match(/^(\\w+)\\/(\\w+)(;\\s*codecs=(\\w+))?$/),5),n=t[1],r=t[2],i=t[4]}catch(t){return\"string\"!=typeof e||e?null:{type:\"\",subtype:\"\",codec:\"\"}}return{type:n,subtype:r,codec:i}}}],(r=[{key:\"_spawnWorker\",value:function(){var e=this;this.worker=this._workerFactory(),this.worker.onmessage=function(t){return e._onmessageFromWorker(t)},this.worker.onerror=function(t){return e._onerrorFromWorker(t)},this._postMessageToWorker(\"loadEncoder\",{mimeType:this._mimeType,wasmPath:this._wasmPath})}},{key:\"_postMessageToWorker\",value:function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};switch(e){case\"loadEncoder\":var r=n.mimeType,o=n.wasmPath;this.worker.postMessage({command:e,mimeType:r,wasmPath:o});break;case\"init\":var i=n.sampleRate,s=n.channelCount,a=n.bitsPerSecond;this.worker.postMessage({command:e,sampleRate:i,channelCount:s,bitsPerSecond:a}),this.workerState=\"encoding\",this.source.connect(this.processor),this.processor.connect(this.context.destination);var c=new t.Event(\"start\");this.dispatchEvent(c);break;case\"pushInputData\":var u=n.channelBuffers,l=n.length,f=n.duration;this.worker.postMessage({command:e,channelBuffers:u,length:l,duration:f});break;case\"getEncodedData\":case\"done\":this.worker.postMessage({command:e});break;default:throw new Error(\"Internal Error: Incorrect postMessage requested.\")}}},{key:\"_onmessageFromWorker\",value:function(e){var n,r=e.data,o=r.command,i=r.buffers;switch(o){case\"readyToInit\":var s=this.sampleRate,a=this.channelCount;this.workerState=\"readyToInit\",\"recording\"===this.state&&this._postMessageToWorker(\"init\",{sampleRate:s,channelCount:a,bitsPerSecond:this.audioBitsPerSecond});break;case\"encodedData\":case\"lastEncodedData\":var c=new Blob(i,{type:this._mimeType});(n=new t.Event(\"dataavailable\")).data=c,this.dispatchEvent(n),\"lastEncodedData\"===o&&(n=new t.Event(\"stop\"),this.dispatchEvent(n),this.workerState=\"closed\")}}},{key:\"_onerrorFromWorker\",value:function(e){this.source.disconnect(),this.processor.disconnect(),this.worker.terminate(),this.workerState=\"closed\";var n=[\"FileName: \"+e.filename,\"LineNumber: \"+e.lineno,\"Message: \"+e.message].join(\" - \"),r=new t.Event(\"error\");r.name=\"UnknownError\",r.message=n,this.dispatchEvent(r)}},{key:\"_enableAudioProcessCallback\",value:function(e){var t=this,n=0;this.processor.onaudioprocess=function(r){for(var o=r.inputBuffer,i=(r.playbackTime,o.sampleRate,o.length),s=o.duration,a=o.numberOfChannels,c=new Array(a),u=0;u=e&&(t._postMessageToWorker(\"getEncodedData\"),n=0)}}},{key:\"start\",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Number.MAX_SAFE_INTEGER;if(\"inactive\"!==this.state)throw new Error(\"DOMException: INVALID_STATE_ERR, state must be inactive.\");if(e<0)throw new TypeError(\"invalid arguments, timeslice should be 0 or higher.\");e/=1e3,\"closed\"===this.workerState&&this._spawnWorker(),this.context=new v;var t=this.stream.getAudioTracks();if(!t[0])throw new Error(\"DOMException: UnkownError, media track not found.\");if(this.channelCount=t[0].getSettings().channelCount||1,this.sampleRate=this.context.sampleRate,this.source=this.context.createMediaStreamSource(this.stream),this.processor=this.context.createScriptProcessor(4096,this.channelCount,this.channelCount),this._state=\"recording\",this._enableAudioProcessCallback(e),\"readyToInit\"===this.workerState){var n=this.sampleRate,r=this.channelCount;this._postMessageToWorker(\"init\",{sampleRate:n,channelCount:r,bitsPerSecond:this.audioBitsPerSecond})}}},{key:\"stop\",value:function(){if(\"inactive\"===this.state)throw new Error(\"DOMException: INVALID_STATE_ERR, state must NOT be inactive.\");this.source.disconnect(),this.processor.disconnect(),this.context.close(),this._postMessageToWorker(\"done\"),this._state=\"inactive\"}},{key:\"pause\",value:function(){if(\"inactive\"===this.state)throw new Error(\"DOMException: INVALID_STATE_ERR, state must NOT be inactive.\");this.source.disconnect(),this.processor.disconnect();var e=new t.Event(\"pause\");this.dispatchEvent(e),this._state=\"paused\"}},{key:\"resume\",value:function(){if(\"inactive\"===this.state)throw new Error(\"DOMException: INVALID_STATE_ERR, state must NOT be inactive.\");this.source.connect(this.processor),this.processor.connect(this.context.destination);var e=new t.Event(\"resume\");this.dispatchEvent(e),this._state=\"recording\"}},{key:\"requestData\",value:function(){if(\"inactive\"===this.state)throw new Error(\"DOMException: INVALID_STATE_ERR, state must NOT be inactive.\");this._postMessageToWorker(\"getEncodedData\")}},{key:\"stream\",get:function(){return this._stream}},{key:\"mimeType\",get:function(){return this._mimeType}},{key:\"state\",get:function(){return this._state}},{key:\"videoBitsPerSecond\",get:function(){}},{key:\"audioBitsPerSecond\",get:function(){return this._audioBitsPerSecond}}])&&a(n.prototype,r),i&&a(n,i),f}(h);[\"start\",\"stop\",\"dataavailable\",\"pause\",\"resume\",\"error\"].forEach((function(e){return y(w.prototype,e)})),m&&\"edge\"===m.name&&(p=Worker.prototype.postMessage,Worker.prototype.postMessage=function(e){p.apply(this,[e])}),e.exports=w}).call(this,n(1))},function(e,t){var n;n=function(){return this}();try{n=n||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(n=window)}e.exports=n},function(e,t,n){\"use strict\";n.r(t),n.d(t,\"defineEventAttribute\",(function(){return y})),n.d(t,\"EventTarget\",(function(){return v}));const r=new WeakMap,o=new WeakMap;function i(e){const t=r.get(e);return console.assert(null!=t,\"'this' is expected an Event object, but got\",e),t}function s(e,t){r.set(this,{eventTarget:e,event:t,eventPhase:2,currentTarget:e,canceled:!1,stopped:!1,passiveListener:null,timeStamp:t.timeStamp||Date.now()}),Object.defineProperty(this,\"isTrusted\",{value:!1,enumerable:!0});const n=Object.keys(t);for(let e=0;e0){const e=new Array(arguments.length);for(let t=0;t1)for(var n=1;n = UnionTypes<\n Record,\n TaggedRecord\n> &\n Creators &\n UnionExtensions;\n\nexport interface UnionTypes {\n _Tags: keyof TaggedRecord;\n _Record: Record;\n _Union: TaggedRecord[keyof TaggedRecord];\n}\nexport interface UnionExtensions {\n is: Predicates;\n as: Casts;\n match: Match;\n transform: Transform;\n}\n\nexport type TagsOf> = U['_Tags'];\nexport type RecordOf> = U['_Record'];\nexport type UnionOf> = U['_Union'];\n\nexport type Creators = {\n [T in keyof Record]: {} extends Required\n ? ((value?: {}) => TaggedRecord[keyof TaggedRecord])\n : ((value: Record[T]) => TaggedRecord[keyof TaggedRecord])\n};\n\nexport type Predicates = {\n [T in keyof TaggedRecord]: (\n variant: TaggedRecord[keyof TaggedRecord],\n ) => variant is TaggedRecord[T]\n};\n\nexport type Casts = { [T in keyof Record]: (variant: Union) => Record[T] };\n\nexport type Cases = { [T in keyof Record]: (value: Record[T]) => A };\n\nexport type MatchCases =\n | Cases & NoDefaultProp\n | Partial> & { default: (variant: Union) => A };\n\nexport interface Match {\n (cases: MatchCases): (variant: Union) => A;\n (variant: Union, cases: MatchCases): A;\n}\n\nexport type TransformCases = Partial<\n { [T in keyof Record]: (value: Record[T]) => Union }\n>;\n\nexport interface Transform {\n (cases: TransformCases): (variant: Union) => Union;\n (variant: Union, cases: TransformCases): Union;\n}\n\nexport type MultiValueVariants, TagProp extends string> = {\n [T in keyof Record]: Record[T] extends { [_ in TagProp]: T } // does record already has tag with correct value?\n ? Record[T] // yes: return as is\n : { [_ in TagProp]: T } & Record[T] // no: decorate with tag\n};\n\nexport type SingleValueVariants<\n Record extends SingleValueRec,\n TagProp extends string,\n ValProp extends string\n> = { [T in keyof Record]: { [_ in TagProp]: T } & { [_ in ValProp]: Record[T] } };\n\n// Forbid usage of default property; reserved for pattern matching.\nexport interface NoDefaultProp {\n default?: never;\n}\n\nexport type SingleValueRec = NoDefaultRec<{} | null>;\nexport type MultiValueRec = NoDefaultRec<\n { [tag: string]: any } & { [tag in TagProp]?: never }\n>;\nexport type NoDefaultRec = {\n [k: string]: Val;\n} & NoDefaultProp;\n\n/**\n * Create a tagged union from a record mapping tags to value types, along with associated\n * variant constructors, type predicates and `match` function.\n *\n * @param record A record mapping tags to value types. The actual values of the record don't\n * matter; they're just used in the types of the resulting tagged union. See `ofType`.\n * @param config An optional config object. By default tag='tag' and value is merged into object itself\n * @param config.tag An optional custom name for the tag property of the union.\n * @param config.value An optional custom name for the value property of the union. If not specified,\n * the value must be a dictionary type.\n */\n\nexport function unionize<\n Record extends SingleValueRec,\n ValProp extends string,\n TagProp extends string = 'tag'\n>(\n record: Record,\n config: { value: ValProp; tag?: TagProp },\n): Unionized, TagProp>;\nexport function unionize, TagProp extends string = 'tag'>(\n record: Record,\n config?: { tag: TagProp },\n): Unionized, TagProp>;\nexport function unionize(record: Record, config?: { value?: string; tag?: string }) {\n const { value: valProp = undefined, tag: tagProp = 'tag' } = config || {};\n\n const creators = {} as Creators;\n for (const tag in record) {\n creators[tag] = ((value: any = {}) =>\n valProp ? { [tagProp]: tag, [valProp]: value } : { ...value, [tagProp]: tag }) as any;\n }\n\n const is = {} as Predicates;\n for (const tag in record) {\n is[tag] = ((variant: any) => variant[tagProp] === tag) as any;\n }\n\n function evalMatch(variant: any, cases: any, defaultCase = cases.default): any {\n const handler = cases[variant[tagProp]];\n return handler ? handler(valProp ? variant[valProp] : variant) : defaultCase(variant);\n }\n\n const match = (first: any, second?: any) =>\n second ? evalMatch(first, second) : (variant: any) => evalMatch(variant, first);\n\n const identity = (x: A) => x;\n const transform = (first: any, second?: any) =>\n second\n ? evalMatch(first, second, identity)\n : (variant: any) => evalMatch(variant, first, identity);\n\n const as = {} as Casts;\n for (const expectedTag in record) {\n as[expectedTag] = match({\n [expectedTag]: (x: any) => x,\n default: (val: any) => {\n throw new Error(`Attempted to cast ${val[tagProp]} as ${expectedTag}`);\n },\n });\n }\n\n return Object.assign(\n {\n is,\n as,\n match,\n transform,\n _Record: record,\n },\n creators,\n );\n}\n\n/**\n * Creates a pseudo-witness of a given type. That is, it pretends to return a value of\n * type `T` for any `T`, but it's really just returning `undefined`. This white lie\n * allows convenient expression of the value types in the record you pass to `unionize`.\n */\nexport const ofType = () => (undefined as any) as T;\n\nexport default unionize;\n",null,null,null,null,null,"require('./helpers/bundle-manifest').register(JSON.parse(\"{\\\"3mXZd\\\":\\\"character.js\\\",\\\"Wn9pe\\\":\\\"encoderWorker.umd.js\\\"}\"));","export default function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}","import _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}","import _curry1 from './_curry1.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nexport default Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","export default function _isTransformer(obj) {\n return obj != null && typeof obj['@@transducer/step'] === 'function';\n}","import _isArray from './_isArray.js';\nimport _isTransformer from './_isTransformer.js';\n\n/**\n * Returns a function that dispatches with different strategies based on the\n * object in list position (last argument). If it is an array, executes [fn].\n * Otherwise, if it has a function with one of the given method names, it will\n * execute that function (functor case). Otherwise, if it is a transformer,\n * uses transducer [xf] to return a new transformer (transducer case).\n * Otherwise, it will default to executing [fn].\n *\n * @private\n * @param {Array} methodNames properties to check for a custom implementation\n * @param {Function} xf transducer to initialize if object is transformer\n * @param {Function} fn default ramda implementation\n * @return {Function} A function that dispatches on object in list position\n */\nexport default function _dispatchable(methodNames, xf, fn) {\n return function () {\n if (arguments.length === 0) {\n return fn();\n }\n var args = Array.prototype.slice.call(arguments, 0);\n var obj = args.pop();\n if (!_isArray(obj)) {\n var idx = 0;\n while (idx < methodNames.length) {\n if (typeof obj[methodNames[idx]] === 'function') {\n return obj[methodNames[idx]].apply(obj, args);\n }\n idx += 1;\n }\n if (_isTransformer(obj)) {\n var transducer = xf.apply(null, args);\n return transducer(obj);\n }\n }\n return fn.apply(this, arguments);\n };\n}","export default {\n init: function () {\n return this.xf['@@transducer/init']();\n },\n result: function (result) {\n return this.xf['@@transducer/result'](result);\n }\n};","import _curry2 from './_curry2.js';\nimport _reduced from './_reduced.js';\nimport _xfBase from './_xfBase.js';\n\nvar XAny = /*#__PURE__*/function () {\n function XAny(f, xf) {\n this.xf = xf;\n this.f = f;\n this.any = false;\n }\n XAny.prototype['@@transducer/init'] = _xfBase.init;\n XAny.prototype['@@transducer/result'] = function (result) {\n if (!this.any) {\n result = this.xf['@@transducer/step'](result, false);\n }\n return this.xf['@@transducer/result'](result);\n };\n XAny.prototype['@@transducer/step'] = function (result, input) {\n if (this.f(input)) {\n this.any = true;\n result = _reduced(this.xf['@@transducer/step'](result, true));\n }\n return result;\n };\n\n return XAny;\n}();\n\nvar _xany = /*#__PURE__*/_curry2(function _xany(f, xf) {\n return new XAny(f, xf);\n});\nexport default _xany;","export default function _reduced(x) {\n return x && x['@@transducer/reduced'] ? x : {\n '@@transducer/value': x,\n '@@transducer/reduced': true\n };\n}","import _curry2 from './internal/_curry2.js';\nimport _dispatchable from './internal/_dispatchable.js';\nimport _xany from './internal/_xany.js';\n\n/**\n * Returns `true` if at least one of the elements of the list match the predicate,\n * `false` otherwise.\n *\n * Dispatches to the `any` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig (a -> Boolean) -> [a] -> Boolean\n * @param {Function} fn The predicate function.\n * @param {Array} list The array to consider.\n * @return {Boolean} `true` if the predicate is satisfied by at least one element, `false`\n * otherwise.\n * @see R.all, R.none, R.transduce\n * @example\n *\n * const lessThan0 = R.flip(R.lt)(0);\n * const lessThan2 = R.flip(R.lt)(2);\n * R.any(lessThan0)([1, 2]); //=> false\n * R.any(lessThan2)([1, 2]); //=> true\n */\nvar any = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['any'], _xany, function any(fn, list) {\n var idx = 0;\n while (idx < list.length) {\n if (fn(list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}));\nexport default any;","export default function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n}","import _curry2 from './internal/_curry2.js';\nimport _isString from './internal/_isString.js';\n\n/**\n * Returns the nth element of the given list or string. If n is negative the\n * element at index length + n is returned.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Number -> [a] -> a | Undefined\n * @sig Number -> String -> String\n * @param {Number} offset\n * @param {*} list\n * @return {*}\n * @example\n *\n * const list = ['foo', 'bar', 'baz', 'quux'];\n * R.nth(1, list); //=> 'bar'\n * R.nth(-1, list); //=> 'quux'\n * R.nth(-99, list); //=> undefined\n *\n * R.nth(2, 'abc'); //=> 'c'\n * R.nth(3, 'abc'); //=> ''\n * @symb R.nth(-1, [a, b, c]) = c\n * @symb R.nth(0, [a, b, c]) = a\n * @symb R.nth(1, [a, b, c]) = b\n */\nvar nth = /*#__PURE__*/_curry2(function nth(offset, list) {\n var idx = offset < 0 ? list.length + offset : offset;\n return _isString(list) ? list.charAt(idx) : list[idx];\n});\nexport default nth;","import nth from './nth.js';\n\n/**\n * Returns the first element of the given list or string. In some libraries\n * this function is named `first`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> a | Undefined\n * @sig String -> String\n * @param {Array|String} list\n * @return {*}\n * @see R.tail, R.init, R.last\n * @example\n *\n * R.head(['fi', 'fo', 'fum']); //=> 'fi'\n * R.head([]); //=> undefined\n *\n * R.head('abc'); //=> 'a'\n * R.head(''); //=> ''\n */\nvar head = /*#__PURE__*/nth(0);\nexport default head;","export default function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}","import _has from './_has.js';\n\nvar toString = Object.prototype.toString;\nvar _isArguments = /*#__PURE__*/function () {\n return toString.call(arguments) === '[object Arguments]' ? function _isArguments(x) {\n return toString.call(x) === '[object Arguments]';\n } : function _isArguments(x) {\n return _has('callee', x);\n };\n}();\n\nexport default _isArguments;","export default function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n}","import _curry1 from './internal/_curry1.js';\nimport _isArguments from './internal/_isArguments.js';\nimport _isArray from './internal/_isArray.js';\nimport _isObject from './internal/_isObject.js';\nimport _isString from './internal/_isString.js';\n\n/**\n * Returns the empty value of its argument's type. Ramda defines the empty\n * value of Array (`[]`), Object (`{}`), String (`''`), and Arguments. Other\n * types are supported if they define `.empty`,\n * `.prototype.empty` or implement the\n * [FantasyLand Monoid spec](https://github.com/fantasyland/fantasy-land#monoid).\n *\n * Dispatches to the `empty` method of the first argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.3.0\n * @category Function\n * @sig a -> a\n * @param {*} x\n * @return {*}\n * @example\n *\n * R.empty(Just(42)); //=> Nothing()\n * R.empty([1, 2, 3]); //=> []\n * R.empty('unicorns'); //=> ''\n * R.empty({x: 1, y: 2}); //=> {}\n */\nvar empty = /*#__PURE__*/_curry1(function empty(x) {\n return x != null && typeof x['fantasy-land/empty'] === 'function' ? x['fantasy-land/empty']() : x != null && x.constructor != null && typeof x.constructor['fantasy-land/empty'] === 'function' ? x.constructor['fantasy-land/empty']() : x != null && typeof x.empty === 'function' ? x.empty() : x != null && x.constructor != null && typeof x.constructor.empty === 'function' ? x.constructor.empty() : _isArray(x) ? [] : _isString(x) ? '' : _isObject(x) ? {} : _isArguments(x) ? function () {\n return arguments;\n }() : void 0 // else\n ;\n});\nexport default empty;","export default function _arrayFromIterator(iter) {\n var list = [];\n var next;\n while (!(next = iter.next()).done) {\n list.push(next.value);\n }\n return list;\n}","export default function _includesWith(pred, x, list) {\n var idx = 0;\n var len = list.length;\n\n while (idx < len) {\n if (pred(x, list[idx])) {\n return true;\n }\n idx += 1;\n }\n return false;\n}","// Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\nfunction _objectIs(a, b) {\n // SameValue algorithm\n if (a === b) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return a !== 0 || 1 / a === 1 / b;\n } else {\n // Step 6.a: NaN == NaN\n return a !== a && b !== b;\n }\n}\n\nexport default typeof Object.is === 'function' ? Object.is : _objectIs;","import _curry1 from './internal/_curry1.js';\nimport _has from './internal/_has.js';\nimport _isArguments from './internal/_isArguments.js';\n\n// cover IE < 9 keys issues\nvar hasEnumBug = ! /*#__PURE__*/{ toString: null }.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['constructor', 'valueOf', 'isPrototypeOf', 'toString', 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n// Safari bug\nvar hasArgsEnumBug = /*#__PURE__*/function () {\n 'use strict';\n\n return arguments.propertyIsEnumerable('length');\n}();\n\nvar contains = function contains(list, item) {\n var idx = 0;\n while (idx < list.length) {\n if (list[idx] === item) {\n return true;\n }\n idx += 1;\n }\n return false;\n};\n\n/**\n * Returns a list containing the names of all the enumerable own properties of\n * the supplied object.\n * Note that the order of the output array is not guaranteed to be consistent\n * across different JS platforms.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {k: v} -> [k]\n * @param {Object} obj The object to extract properties from\n * @return {Array} An array of the object's own properties.\n * @see R.keysIn, R.values\n * @example\n *\n * R.keys({a: 1, b: 2, c: 3}); //=> ['a', 'b', 'c']\n */\nvar keys = typeof Object.keys === 'function' && !hasArgsEnumBug ? /*#__PURE__*/_curry1(function keys(obj) {\n return Object(obj) !== obj ? [] : Object.keys(obj);\n}) : /*#__PURE__*/_curry1(function keys(obj) {\n if (Object(obj) !== obj) {\n return [];\n }\n var prop, nIdx;\n var ks = [];\n var checkArgsLength = hasArgsEnumBug && _isArguments(obj);\n for (prop in obj) {\n if (_has(prop, obj) && (!checkArgsLength || prop !== 'length')) {\n ks[ks.length] = prop;\n }\n }\n if (hasEnumBug) {\n nIdx = nonEnumerableProps.length - 1;\n while (nIdx >= 0) {\n prop = nonEnumerableProps[nIdx];\n if (_has(prop, obj) && !contains(ks, prop)) {\n ks[ks.length] = prop;\n }\n nIdx -= 1;\n }\n }\n return ks;\n});\nexport default keys;","import _curry1 from './internal/_curry1.js';\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(undefined); //=> \"Undefined\"\n */\nvar type = /*#__PURE__*/_curry1(function type(val) {\n return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);\n});\nexport default type;","import _arrayFromIterator from './_arrayFromIterator.js';\nimport _includesWith from './_includesWith.js';\nimport _functionName from './_functionName.js';\nimport _has from './_has.js';\nimport _objectIs from './_objectIs.js';\nimport keys from '../keys.js';\nimport type from '../type.js';\n\n/**\n * private _uniqContentEquals function.\n * That function is checking equality of 2 iterator contents with 2 assumptions\n * - iterators lengths are the same\n * - iterators values are unique\n *\n * false-positive result will be returned for comparision of, e.g.\n * - [1,2,3] and [1,2,3,4]\n * - [1,1,1] and [1,2,3]\n * */\n\nfunction _uniqContentEquals(aIterator, bIterator, stackA, stackB) {\n var a = _arrayFromIterator(aIterator);\n var b = _arrayFromIterator(bIterator);\n\n function eq(_a, _b) {\n return _equals(_a, _b, stackA.slice(), stackB.slice());\n }\n\n // if *a* array contains any element that is not included in *b*\n return !_includesWith(function (b, aItem) {\n return !_includesWith(eq, aItem, b);\n }, b, a);\n}\n\nexport default function _equals(a, b, stackA, stackB) {\n if (_objectIs(a, b)) {\n return true;\n }\n\n var typeA = type(a);\n\n if (typeA !== type(b)) {\n return false;\n }\n\n if (a == null || b == null) {\n return false;\n }\n\n if (typeof a['fantasy-land/equals'] === 'function' || typeof b['fantasy-land/equals'] === 'function') {\n return typeof a['fantasy-land/equals'] === 'function' && a['fantasy-land/equals'](b) && typeof b['fantasy-land/equals'] === 'function' && b['fantasy-land/equals'](a);\n }\n\n if (typeof a.equals === 'function' || typeof b.equals === 'function') {\n return typeof a.equals === 'function' && a.equals(b) && typeof b.equals === 'function' && b.equals(a);\n }\n\n switch (typeA) {\n case 'Arguments':\n case 'Array':\n case 'Object':\n if (typeof a.constructor === 'function' && _functionName(a.constructor) === 'Promise') {\n return a === b;\n }\n break;\n case 'Boolean':\n case 'Number':\n case 'String':\n if (!(typeof a === typeof b && _objectIs(a.valueOf(), b.valueOf()))) {\n return false;\n }\n break;\n case 'Date':\n if (!_objectIs(a.valueOf(), b.valueOf())) {\n return false;\n }\n break;\n case 'Error':\n return a.name === b.name && a.message === b.message;\n case 'RegExp':\n if (!(a.source === b.source && a.global === b.global && a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && a.sticky === b.sticky && a.unicode === b.unicode)) {\n return false;\n }\n break;\n }\n\n var idx = stackA.length - 1;\n while (idx >= 0) {\n if (stackA[idx] === a) {\n return stackB[idx] === b;\n }\n idx -= 1;\n }\n\n switch (typeA) {\n case 'Map':\n if (a.size !== b.size) {\n return false;\n }\n\n return _uniqContentEquals(a.entries(), b.entries(), stackA.concat([a]), stackB.concat([b]));\n case 'Set':\n if (a.size !== b.size) {\n return false;\n }\n\n return _uniqContentEquals(a.values(), b.values(), stackA.concat([a]), stackB.concat([b]));\n case 'Arguments':\n case 'Array':\n case 'Object':\n case 'Boolean':\n case 'Number':\n case 'String':\n case 'Date':\n case 'Error':\n case 'RegExp':\n case 'Int8Array':\n case 'Uint8Array':\n case 'Uint8ClampedArray':\n case 'Int16Array':\n case 'Uint16Array':\n case 'Int32Array':\n case 'Uint32Array':\n case 'Float32Array':\n case 'Float64Array':\n case 'ArrayBuffer':\n break;\n default:\n // Values of other types are only equal if identical.\n return false;\n }\n\n var keysA = keys(a);\n if (keysA.length !== keys(b).length) {\n return false;\n }\n\n var extendedStackA = stackA.concat([a]);\n var extendedStackB = stackB.concat([b]);\n\n idx = keysA.length - 1;\n while (idx >= 0) {\n var key = keysA[idx];\n if (!(_has(key, b) && _equals(b[key], a[key], extendedStackA, extendedStackB))) {\n return false;\n }\n idx -= 1;\n }\n return true;\n}","export default function _functionName(f) {\n // String(x => x) evaluates to \"x => x\", so the pattern may not match.\n var match = String(f).match(/^function (\\w*)/);\n return match == null ? '' : match[1];\n}","import _curry2 from './internal/_curry2.js';\nimport _equals from './internal/_equals.js';\n\n/**\n * Returns `true` if its arguments are equivalent, `false` otherwise. Handles\n * cyclical data structures.\n *\n * Dispatches symmetrically to the `equals` methods of both arguments, if\n * present.\n *\n * @func\n * @memberOf R\n * @since v0.15.0\n * @category Relation\n * @sig a -> b -> Boolean\n * @param {*} a\n * @param {*} b\n * @return {Boolean}\n * @example\n *\n * R.equals(1, 1); //=> true\n * R.equals(1, '1'); //=> false\n * R.equals([1, 2, 3], [1, 2, 3]); //=> true\n *\n * const a = {}; a.v = a;\n * const b = {}; b.v = b;\n * R.equals(a, b); //=> true\n */\nvar equals = /*#__PURE__*/_curry2(function equals(a, b) {\n return _equals(a, b, [], []);\n});\nexport default equals;","import _curry1 from './internal/_curry1.js';\nimport empty from './empty.js';\nimport equals from './equals.js';\n\n/**\n * Returns `true` if the given value is its type's empty value; `false`\n * otherwise.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Logic\n * @sig a -> Boolean\n * @param {*} x\n * @return {Boolean}\n * @see R.empty\n * @example\n *\n * R.isEmpty([1, 2, 3]); //=> false\n * R.isEmpty([]); //=> true\n * R.isEmpty(''); //=> true\n * R.isEmpty(null); //=> false\n * R.isEmpty({}); //=> true\n * R.isEmpty({length: 0}); //=> false\n */\nvar isEmpty = /*#__PURE__*/_curry1(function isEmpty(x) {\n return x != null && equals(x, empty(x));\n});\nexport default isEmpty;","export default function _isFunction(x) {\n return Object.prototype.toString.call(x) === '[object Function]';\n}","export default function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}","import _arity from './_arity.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Internal curryN function.\n *\n * @private\n * @category Function\n * @param {Number} length The arity of the curried function.\n * @param {Array} received An array of arguments received thus far.\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curryN(length, received, fn) {\n return function () {\n var combined = [];\n var argsIdx = 0;\n var left = length;\n var combinedIdx = 0;\n while (combinedIdx < received.length || argsIdx < arguments.length) {\n var result;\n if (combinedIdx < received.length && (!_isPlaceholder(received[combinedIdx]) || argsIdx >= arguments.length)) {\n result = received[combinedIdx];\n } else {\n result = arguments[argsIdx];\n argsIdx += 1;\n }\n combined[combinedIdx] = result;\n if (!_isPlaceholder(result)) {\n left -= 1;\n }\n combinedIdx += 1;\n }\n return left <= 0 ? fn.apply(this, combined) : _arity(left, _curryN(length, combined, fn));\n };\n}","import _arity from './internal/_arity.js';\nimport _curry1 from './internal/_curry1.js';\nimport _curry2 from './internal/_curry2.js';\nimport _curryN from './internal/_curryN.js';\n\n/**\n * Returns a curried equivalent of the provided function, with the specified\n * arity. The curried function has two unusual capabilities. First, its\n * arguments needn't be provided one at a time. If `g` is `R.curryN(3, f)`, the\n * following are equivalent:\n *\n * - `g(1)(2)(3)`\n * - `g(1)(2, 3)`\n * - `g(1, 2)(3)`\n * - `g(1, 2, 3)`\n *\n * Secondly, the special placeholder value [`R.__`](#__) may be used to specify\n * \"gaps\", allowing partial application of any combination of arguments,\n * regardless of their positions. If `g` is as above and `_` is [`R.__`](#__),\n * the following are equivalent:\n *\n * - `g(1, 2, 3)`\n * - `g(_, 2, 3)(1)`\n * - `g(_, _, 3)(1)(2)`\n * - `g(_, _, 3)(1, 2)`\n * - `g(_, 2)(1)(3)`\n * - `g(_, 2)(1, 3)`\n * - `g(_, 2)(_, 3)(1)`\n *\n * @func\n * @memberOf R\n * @since v0.5.0\n * @category Function\n * @sig Number -> (* -> a) -> (* -> a)\n * @param {Number} length The arity for the returned function.\n * @param {Function} fn The function to curry.\n * @return {Function} A new, curried function.\n * @see R.curry\n * @example\n *\n * const sumArgs = (...args) => R.sum(args);\n *\n * const curriedAddFourNumbers = R.curryN(4, sumArgs);\n * const f = curriedAddFourNumbers(1, 2);\n * const g = f(3);\n * g(4); //=> 10\n */\nvar curryN = /*#__PURE__*/_curry2(function curryN(length, fn) {\n if (length === 1) {\n return _curry1(fn);\n }\n return _arity(length, _curryN(length, [], fn));\n});\nexport default curryN;","import _indexOf from './_indexOf.js';\n\nexport default function _includes(a, list) {\n return _indexOf(list, a, 0) >= 0;\n}","import equals from '../equals.js';\n\nexport default function _indexOf(list, a, idx) {\n var inf, item;\n // Array.prototype.indexOf doesn't exist below IE9\n if (typeof list.indexOf === 'function') {\n switch (typeof a) {\n case 'number':\n if (a === 0) {\n // manually crawl the list to distinguish between +0 and -0\n inf = 1 / a;\n while (idx < list.length) {\n item = list[idx];\n if (item === 0 && 1 / item === inf) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n } else if (a !== a) {\n // NaN\n while (idx < list.length) {\n item = list[idx];\n if (typeof item === 'number' && item !== item) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n }\n // non-zero numbers can utilise Set\n return list.indexOf(a, idx);\n\n // all these types can utilise Set\n case 'string':\n case 'boolean':\n case 'function':\n case 'undefined':\n return list.indexOf(a, idx);\n\n case 'object':\n if (a === null) {\n // null can utilise Set\n return list.indexOf(a, idx);\n }\n }\n }\n // anything else not covered above, defer to R.equals\n while (idx < list.length) {\n if (equals(list[idx], a)) {\n return idx;\n }\n idx += 1;\n }\n return -1;\n}","export default function _map(fn, functor) {\n var idx = 0;\n var len = functor.length;\n var result = Array(len);\n while (idx < len) {\n result[idx] = fn(functor[idx]);\n idx += 1;\n }\n return result;\n}","export default function _quote(s) {\n var escaped = s.replace(/\\\\/g, '\\\\\\\\').replace(/[\\b]/g, '\\\\b') // \\b matches word boundary; [\\b] matches backspace\n .replace(/\\f/g, '\\\\f').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t').replace(/\\v/g, '\\\\v').replace(/\\0/g, '\\\\0');\n\n return '\"' + escaped.replace(/\"/g, '\\\\\"') + '\"';\n}","/**\n * Polyfill from .\n */\nvar pad = function pad(n) {\n return (n < 10 ? '0' : '') + n;\n};\n\nvar _toISOString = typeof Date.prototype.toISOString === 'function' ? function _toISOString(d) {\n return d.toISOString();\n} : function _toISOString(d) {\n return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + 'T' + pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds()) + '.' + (d.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z';\n};\n\nexport default _toISOString;","import _curry1 from './_curry1.js';\nimport _isArray from './_isArray.js';\nimport _isString from './_isString.js';\n\n/**\n * Tests whether or not an object is similar to an array.\n *\n * @private\n * @category Type\n * @category List\n * @sig * -> Boolean\n * @param {*} x The object to test.\n * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.\n * @example\n *\n * _isArrayLike([]); //=> true\n * _isArrayLike(true); //=> false\n * _isArrayLike({}); //=> false\n * _isArrayLike({length: 10}); //=> false\n * _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true\n */\nvar _isArrayLike = /*#__PURE__*/_curry1(function isArrayLike(x) {\n if (_isArray(x)) {\n return true;\n }\n if (!x) {\n return false;\n }\n if (typeof x !== 'object') {\n return false;\n }\n if (_isString(x)) {\n return false;\n }\n if (x.nodeType === 1) {\n return !!x.length;\n }\n if (x.length === 0) {\n return true;\n }\n if (x.length > 0) {\n return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);\n }\n return false;\n});\nexport default _isArrayLike;","var XWrap = /*#__PURE__*/function () {\n function XWrap(fn) {\n this.f = fn;\n }\n XWrap.prototype['@@transducer/init'] = function () {\n throw new Error('init not implemented on XWrap');\n };\n XWrap.prototype['@@transducer/result'] = function (acc) {\n return acc;\n };\n XWrap.prototype['@@transducer/step'] = function (acc, x) {\n return this.f(acc, x);\n };\n\n return XWrap;\n}();\n\nexport default function _xwrap(fn) {\n return new XWrap(fn);\n}","import _arity from './internal/_arity.js';\nimport _curry2 from './internal/_curry2.js';\n\n/**\n * Creates a function that is bound to a context.\n * Note: `R.bind` does not provide the additional argument-binding capabilities of\n * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\n *\n * @func\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @category Object\n * @sig (* -> *) -> {*} -> (* -> *)\n * @param {Function} fn The function to bind to context\n * @param {Object} thisObj The context to bind `fn` to\n * @return {Function} A function that will execute in the context of `thisObj`.\n * @see R.partial\n * @example\n *\n * const log = R.bind(console.log, console);\n * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}\n * // logs {a: 2}\n * @symb R.bind(f, o)(a, b) = f.call(o, a, b)\n */\nvar bind = /*#__PURE__*/_curry2(function bind(fn, thisObj) {\n return _arity(fn.length, function () {\n return fn.apply(thisObj, arguments);\n });\n});\nexport default bind;","import _isArrayLike from './_isArrayLike.js';\nimport _xwrap from './_xwrap.js';\nimport bind from '../bind.js';\n\nfunction _arrayReduce(xf, acc, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n acc = xf['@@transducer/step'](acc, list[idx]);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n idx += 1;\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _iterableReduce(xf, acc, iter) {\n var step = iter.next();\n while (!step.done) {\n acc = xf['@@transducer/step'](acc, step.value);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n step = iter.next();\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _methodReduce(xf, acc, obj, methodName) {\n return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));\n}\n\nvar symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';\n\nexport default function _reduce(fn, acc, list) {\n if (typeof fn === 'function') {\n fn = _xwrap(fn);\n }\n if (_isArrayLike(list)) {\n return _arrayReduce(fn, acc, list);\n }\n if (typeof list['fantasy-land/reduce'] === 'function') {\n return _methodReduce(fn, acc, list, 'fantasy-land/reduce');\n }\n if (list[symIterator] != null) {\n return _iterableReduce(fn, acc, list[symIterator]());\n }\n if (typeof list.next === 'function') {\n return _iterableReduce(fn, acc, list);\n }\n if (typeof list.reduce === 'function') {\n return _methodReduce(fn, acc, list, 'reduce');\n }\n\n throw new TypeError('reduce: list must be array or iterable');\n}","import _curry2 from './_curry2.js';\nimport _xfBase from './_xfBase.js';\n\nvar XFilter = /*#__PURE__*/function () {\n function XFilter(f, xf) {\n this.xf = xf;\n this.f = f;\n }\n XFilter.prototype['@@transducer/init'] = _xfBase.init;\n XFilter.prototype['@@transducer/result'] = _xfBase.result;\n XFilter.prototype['@@transducer/step'] = function (result, input) {\n return this.f(input) ? this.xf['@@transducer/step'](result, input) : result;\n };\n\n return XFilter;\n}();\n\nvar _xfilter = /*#__PURE__*/_curry2(function _xfilter(f, xf) {\n return new XFilter(f, xf);\n});\nexport default _xfilter;","import _curry2 from './internal/_curry2.js';\nimport _dispatchable from './internal/_dispatchable.js';\nimport _filter from './internal/_filter.js';\nimport _isObject from './internal/_isObject.js';\nimport _reduce from './internal/_reduce.js';\nimport _xfilter from './internal/_xfilter.js';\nimport keys from './keys.js';\n\n/**\n * Takes a predicate and a `Filterable`, and returns a new filterable of the\n * same type containing the members of the given filterable which satisfy the\n * given predicate. Filterable objects include plain objects or any object\n * that has a filter method such as `Array`.\n *\n * Dispatches to the `filter` method of the second argument, if present.\n *\n * Acts as a transducer if a transformer is given in list position.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array} Filterable\n * @see R.reject, R.transduce, R.addIndex\n * @example\n *\n * const isEven = n => n % 2 === 0;\n *\n * R.filter(isEven, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.filter(isEven, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nvar filter = /*#__PURE__*/_curry2( /*#__PURE__*/_dispatchable(['filter'], _xfilter, function (pred, filterable) {\n return _isObject(filterable) ? _reduce(function (acc, key) {\n if (pred(filterable[key])) {\n acc[key] = filterable[key];\n }\n return acc;\n }, {}, keys(filterable)) :\n // else\n _filter(pred, filterable);\n}));\nexport default filter;","export default function _filter(fn, list) {\n var idx = 0;\n var len = list.length;\n var result = [];\n\n while (idx < len) {\n if (fn(list[idx])) {\n result[result.length] = list[idx];\n }\n idx += 1;\n }\n return result;\n}","import _complement from './internal/_complement.js';\nimport _curry2 from './internal/_curry2.js';\nimport filter from './filter.js';\n\n/**\n * The complement of [`filter`](#filter).\n *\n * Acts as a transducer if a transformer is given in list position. Filterable\n * objects include plain objects or any object that has a filter method such\n * as `Array`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Filterable f => (a -> Boolean) -> f a -> f a\n * @param {Function} pred\n * @param {Array} filterable\n * @return {Array}\n * @see R.filter, R.transduce, R.addIndex\n * @example\n *\n * const isOdd = (n) => n % 2 === 1;\n *\n * R.reject(isOdd, [1, 2, 3, 4]); //=> [2, 4]\n *\n * R.reject(isOdd, {a: 1, b: 2, c: 3, d: 4}); //=> {b: 2, d: 4}\n */\nvar reject = /*#__PURE__*/_curry2(function reject(pred, filterable) {\n return filter(_complement(pred), filterable);\n});\nexport default reject;","export default function _complement(f) {\n return function () {\n return !f.apply(this, arguments);\n };\n}","import _includes from './_includes.js';\nimport _map from './_map.js';\nimport _quote from './_quote.js';\nimport _toISOString from './_toISOString.js';\nimport keys from '../keys.js';\nimport reject from '../reject.js';\n\nexport default function _toString(x, seen) {\n var recur = function recur(y) {\n var xs = seen.concat([x]);\n return _includes(y, xs) ? '' : _toString(y, xs);\n };\n\n // mapPairs :: (Object, [String]) -> [String]\n var mapPairs = function (obj, keys) {\n return _map(function (k) {\n return _quote(k) + ': ' + recur(obj[k]);\n }, keys.slice().sort());\n };\n\n switch (Object.prototype.toString.call(x)) {\n case '[object Arguments]':\n return '(function() { return arguments; }(' + _map(recur, x).join(', ') + '))';\n case '[object Array]':\n return '[' + _map(recur, x).concat(mapPairs(x, reject(function (k) {\n return (/^\\d+$/.test(k)\n );\n }, keys(x)))).join(', ') + ']';\n case '[object Boolean]':\n return typeof x === 'object' ? 'new Boolean(' + recur(x.valueOf()) + ')' : x.toString();\n case '[object Date]':\n return 'new Date(' + (isNaN(x.valueOf()) ? recur(NaN) : _quote(_toISOString(x))) + ')';\n case '[object Null]':\n return 'null';\n case '[object Number]':\n return typeof x === 'object' ? 'new Number(' + recur(x.valueOf()) + ')' : 1 / x === -Infinity ? '-0' : x.toString(10);\n case '[object String]':\n return typeof x === 'object' ? 'new String(' + recur(x.valueOf()) + ')' : _quote(x);\n case '[object Undefined]':\n return 'undefined';\n default:\n if (typeof x.toString === 'function') {\n var repr = x.toString();\n if (repr !== '[object Object]') {\n return repr;\n }\n }\n return '{' + mapPairs(x, keys(x)).join(', ') + '}';\n }\n}","import _curry1 from './internal/_curry1.js';\nimport _toString from './internal/_toString.js';\n\n/**\n * Returns the string representation of the given value. `eval`'ing the output\n * should result in a value equivalent to the input value. Many of the built-in\n * `toString` methods do not satisfy this requirement.\n *\n * If the given value is an `[object Object]` with a `toString` method other\n * than `Object.prototype.toString`, this method is invoked with no arguments\n * to produce the return value. This means user-defined constructor functions\n * can provide a suitable `toString` method. For example:\n *\n * function Point(x, y) {\n * this.x = x;\n * this.y = y;\n * }\n *\n * Point.prototype.toString = function() {\n * return 'new Point(' + this.x + ', ' + this.y + ')';\n * };\n *\n * R.toString(new Point(1, 2)); //=> 'new Point(1, 2)'\n *\n * @func\n * @memberOf R\n * @since v0.14.0\n * @category String\n * @sig * -> String\n * @param {*} val\n * @return {String}\n * @example\n *\n * R.toString(42); //=> '42'\n * R.toString('abc'); //=> '\"abc\"'\n * R.toString([1, 2, 3]); //=> '[1, 2, 3]'\n * R.toString({foo: 1, bar: 2, baz: 3}); //=> '{\"bar\": 2, \"baz\": 3, \"foo\": 1}'\n * R.toString(new Date('2001-02-03T04:05:06Z')); //=> 'new Date(\"2001-02-03T04:05:06.000Z\")'\n */\nvar toString = /*#__PURE__*/_curry1(function toString(val) {\n return _toString(val, []);\n});\nexport default toString;","import _curry2 from './internal/_curry2.js';\nimport _isFunction from './internal/_isFunction.js';\nimport curryN from './curryN.js';\nimport toString from './toString.js';\n\n/**\n * Turns a named method with a specified arity into a function that can be\n * called directly supplied with arguments and a target object.\n *\n * The returned function is curried and accepts `arity + 1` parameters where\n * the final parameter is the target object.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Function\n * @sig Number -> String -> (a -> b -> ... -> n -> Object -> *)\n * @param {Number} arity Number of arguments the returned function should take\n * before the target object.\n * @param {String} method Name of the method to call.\n * @return {Function} A new curried function.\n * @see R.construct\n * @example\n *\n * const sliceFrom = R.invoker(1, 'slice');\n * sliceFrom(6, 'abcdefghijklm'); //=> 'ghijklm'\n * const sliceFrom6 = R.invoker(2, 'slice')(6);\n * sliceFrom6(8, 'abcdefghijklm'); //=> 'gh'\n * @symb R.invoker(0, 'method')(o) = o['method']()\n * @symb R.invoker(1, 'method')(a, o) = o['method'](a)\n * @symb R.invoker(2, 'method')(a, b, o) = o['method'](a, b)\n */\nvar invoker = /*#__PURE__*/_curry2(function invoker(arity, method) {\n return curryN(arity + 1, function () {\n var target = arguments[arity];\n if (target != null && _isFunction(target[method])) {\n return target[method].apply(target, Array.prototype.slice.call(arguments, 0, arity));\n }\n throw new TypeError(toString(target) + ' does not have a method named \"' + method + '\"');\n });\n});\nexport default invoker;","import invoker from './invoker.js';\n\n/**\n * Returns a string made by inserting the `separator` between each element and\n * concatenating all the elements into a single string.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig String -> [a] -> String\n * @param {Number|String} separator The string used to separate the elements.\n * @param {Array} xs The elements to join into a string.\n * @return {String} str The string made by concatenating `xs` with `separator`.\n * @see R.split\n * @example\n *\n * const spacer = R.join(' ');\n * spacer(['a', 2, 3.4]); //=> 'a 2 3.4'\n * R.join('|', [1, 2, 3]); //=> '1|2|3'\n */\nvar join = /*#__PURE__*/invoker(1, 'join');\nexport default join;","import _curry2 from './internal/_curry2.js';\n\n/**\n * Returns the larger of its two arguments.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Relation\n * @sig Ord a => a -> a -> a\n * @param {*} a\n * @param {*} b\n * @return {*}\n * @see R.maxBy, R.min\n * @example\n *\n * R.max(789, 123); //=> 789\n * R.max('a', 'b'); //=> 'b'\n */\nvar max = /*#__PURE__*/_curry2(function max(a, b) {\n return b > a ? b : a;\n});\nexport default max;","export default function _isNumber(x) {\n return Object.prototype.toString.call(x) === '[object Number]';\n}","import _curry2 from './internal/_curry2.js';\nimport _isNumber from './internal/_isNumber.js';\n\n/**\n * Returns a list of numbers from `from` (inclusive) to `to` (exclusive).\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig Number -> Number -> [Number]\n * @param {Number} from The first number in the list.\n * @param {Number} to One more than the last number in the list.\n * @return {Array} The list of numbers in the set `[a, b)`.\n * @example\n *\n * R.range(1, 5); //=> [1, 2, 3, 4]\n * R.range(50, 53); //=> [50, 51, 52]\n */\nvar range = /*#__PURE__*/_curry2(function range(from, to) {\n if (!(_isNumber(from) && _isNumber(to))) {\n throw new TypeError('Both arguments to range must be numbers');\n }\n var result = [];\n var n = from;\n while (n < to) {\n result.push(n);\n n += 1;\n }\n return result;\n});\nexport default range;","import _isArray from './_isArray.js';\n\n/**\n * This checks whether a function has a [methodname] function. If it isn't an\n * array it will execute that function otherwise it will default to the ramda\n * implementation.\n *\n * @private\n * @param {Function} fn ramda implemtation\n * @param {String} methodname property to check for a custom implementation\n * @return {Object} Whatever the return value of the method is.\n */\nexport default function _checkForMethod(methodname, fn) {\n return function () {\n var length = arguments.length;\n if (length === 0) {\n return fn();\n }\n var obj = arguments[length - 1];\n return _isArray(obj) || typeof obj[methodname] !== 'function' ? fn.apply(this, arguments) : obj[methodname].apply(obj, Array.prototype.slice.call(arguments, 0, length - 1));\n };\n}","import _curry1 from './_curry1.js';\nimport _curry2 from './_curry2.js';\nimport _isPlaceholder from './_isPlaceholder.js';\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\nexport default function _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _curry1(function (_c) {\n return fn(a, b, _c);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {\n return fn(_a, _b, c);\n }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b, c);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b, c);\n }) : _isPlaceholder(c) ? _curry1(function (_c) {\n return fn(a, b, _c);\n }) : fn(a, b, c);\n }\n };\n}","import _checkForMethod from './internal/_checkForMethod.js';\nimport _curry3 from './internal/_curry3.js';\n\n/**\n * Returns the elements of the given list or string (or object with a `slice`\n * method) from `fromIndex` (inclusive) to `toIndex` (exclusive).\n *\n * Dispatches to the `slice` method of the third argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.4\n * @category List\n * @sig Number -> Number -> [a] -> [a]\n * @sig Number -> Number -> String -> String\n * @param {Number} fromIndex The start index (inclusive).\n * @param {Number} toIndex The end index (exclusive).\n * @param {*} list\n * @return {*}\n * @example\n *\n * R.slice(1, 3, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(1, Infinity, ['a', 'b', 'c', 'd']); //=> ['b', 'c', 'd']\n * R.slice(0, -1, ['a', 'b', 'c', 'd']); //=> ['a', 'b', 'c']\n * R.slice(-3, -1, ['a', 'b', 'c', 'd']); //=> ['b', 'c']\n * R.slice(0, 3, 'ramda'); //=> 'ram'\n */\nvar slice = /*#__PURE__*/_curry3( /*#__PURE__*/_checkForMethod('slice', function slice(fromIndex, toIndex, list) {\n return Array.prototype.slice.call(list, fromIndex, toIndex);\n}));\nexport default slice;","import _checkForMethod from './internal/_checkForMethod.js';\nimport _curry1 from './internal/_curry1.js';\nimport slice from './slice.js';\n\n/**\n * Returns all but the first element of the given list or string (or object\n * with a `tail` method).\n *\n * Dispatches to the `slice` method of the first argument, if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig [a] -> [a]\n * @sig String -> String\n * @param {*} list\n * @return {*}\n * @see R.head, R.init, R.last\n * @example\n *\n * R.tail([1, 2, 3]); //=> [2, 3]\n * R.tail([1, 2]); //=> [2]\n * R.tail([1]); //=> []\n * R.tail([]); //=> []\n *\n * R.tail('abc'); //=> 'bc'\n * R.tail('ab'); //=> 'b'\n * R.tail('a'); //=> ''\n * R.tail(''); //=> ''\n */\nvar tail = /*#__PURE__*/_curry1( /*#__PURE__*/_checkForMethod('tail', /*#__PURE__*/slice(1, Infinity)));\nexport default tail;","import { mergeMap } from './mergeMap';\nimport { ObservableInput, OperatorFunction, ObservedValueOf } from '../types';\n\n/* tslint:disable:max-line-length */\nexport function concatMap>(project: (value: T, index: number) => O): OperatorFunction>;\n/** @deprecated resultSelector no longer supported, use inner map instead */\nexport function concatMap>(project: (value: T, index: number) => O, resultSelector: undefined): OperatorFunction>;\n/** @deprecated resultSelector no longer supported, use inner map instead */\nexport function concatMap>(project: (value: T, index: number) => O, resultSelector: (outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R): OperatorFunction;\n/* tslint:enable:max-line-length */\n\n/**\n * Projects each source value to an Observable which is merged in the output\n * Observable, in a serialized fashion waiting for each one to complete before\n * merging the next.\n *\n * Maps each value to an Observable, then flattens all of\n * these inner Observables using {@link concatAll}.\n *\n * ![](concatMap.png)\n *\n * Returns an Observable that emits items based on applying a function that you\n * supply to each item emitted by the source Observable, where that function\n * returns an (so-called \"inner\") Observable. Each new inner Observable is\n * concatenated with the previous inner Observable.\n *\n * __Warning:__ if source values arrive endlessly and faster than their\n * corresponding inner Observables can complete, it will result in memory issues\n * as inner Observables amass in an unbounded buffer waiting for their turn to\n * be subscribed to.\n *\n * Note: `concatMap` is equivalent to `mergeMap` with concurrency parameter set\n * to `1`.\n *\n * ## Example\n * For each click event, tick every second from 0 to 3, with no concurrency\n *\n * ```ts\n * import { fromEvent, interval } from 'rxjs';\n * import { concatMap, take } from 'rxjs/operators';\n *\n * const clicks = fromEvent(document, 'click');\n * const result = clicks.pipe(\n * concatMap(ev => interval(1000).pipe(take(4)))\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following:\n * // (results are not concurrent)\n * // For every click on the \"document\" it will emit values 0 to 3 spaced\n * // on a 1000ms interval\n * // one click = 1000ms-> 0 -1000ms-> 1 -1000ms-> 2 -1000ms-> 3\n * ```\n *\n * @see {@link concat}\n * @see {@link concatAll}\n * @see {@link concatMapTo}\n * @see {@link exhaustMap}\n * @see {@link mergeMap}\n * @see {@link switchMap}\n *\n * @param {function(value: T, ?index: number): ObservableInput} project A function\n * that, when applied to an item emitted by the source Observable, returns an\n * Observable.\n * @return {Observable} An Observable that emits the result of applying the\n * projection function (and the optional deprecated `resultSelector`) to each item emitted\n * by the source Observable and taking values from each projected inner\n * Observable sequentially.\n * @method concatMap\n * @owner Observable\n */\nexport function concatMap>(\n project: (value: T, index: number) => O,\n resultSelector?: (outerValue: T, innerValue: ObservedValueOf, outerIndex: number, innerIndex: number) => R\n): OperatorFunction|R> {\n return mergeMap(project, resultSelector, 1);\n}\n",null,null,null,null,null,null,null,null,null,null,null,null,"// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","\"use strict\";\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BrowserInfo = /** @class */ (function () {\n function BrowserInfo(name, version, os) {\n this.name = name;\n this.version = version;\n this.os = os;\n }\n return BrowserInfo;\n}());\nexports.BrowserInfo = BrowserInfo;\nvar NodeInfo = /** @class */ (function () {\n function NodeInfo(version) {\n this.version = version;\n this.name = 'node';\n this.os = process.platform;\n }\n return NodeInfo;\n}());\nexports.NodeInfo = NodeInfo;\nvar BotInfo = /** @class */ (function () {\n function BotInfo() {\n this.bot = true; // NOTE: deprecated test name instead\n this.name = 'bot';\n this.version = null;\n this.os = null;\n }\n return BotInfo;\n}());\nexports.BotInfo = BotInfo;\n// tslint:disable-next-line:max-line-length\nvar SEARCHBOX_UA_REGEX = /alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/;\nvar SEARCHBOT_OS_REGEX = /(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves\\/Teoma)|(ia_archiver)/;\nvar REQUIRED_VERSION_PARTS = 3;\nvar userAgentRules = [\n ['aol', /AOLShield\\/([0-9\\._]+)/],\n ['edge', /Edge\\/([0-9\\._]+)/],\n ['edge-ios', /EdgiOS\\/([0-9\\._]+)/],\n ['yandexbrowser', /YaBrowser\\/([0-9\\._]+)/],\n ['vivaldi', /Vivaldi\\/([0-9\\.]+)/],\n ['kakaotalk', /KAKAOTALK\\s([0-9\\.]+)/],\n ['samsung', /SamsungBrowser\\/([0-9\\.]+)/],\n ['silk', /\\bSilk\\/([0-9._-]+)\\b/],\n ['miui', /MiuiBrowser\\/([0-9\\.]+)$/],\n ['beaker', /BeakerBrowser\\/([0-9\\.]+)/],\n ['edge-chromium', /Edg\\/([0-9\\.]+)/],\n [\n 'chromium-webview',\n /(?!Chrom.*OPR)wv\\).*Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/,\n ],\n ['chrome', /(?!Chrom.*OPR)Chrom(?:e|ium)\\/([0-9\\.]+)(:?\\s|$)/],\n ['phantomjs', /PhantomJS\\/([0-9\\.]+)(:?\\s|$)/],\n ['crios', /CriOS\\/([0-9\\.]+)(:?\\s|$)/],\n ['firefox', /Firefox\\/([0-9\\.]+)(?:\\s|$)/],\n ['fxios', /FxiOS\\/([0-9\\.]+)/],\n ['opera-mini', /Opera Mini.*Version\\/([0-9\\.]+)/],\n ['opera', /Opera\\/([0-9\\.]+)(?:\\s|$)/],\n ['opera', /OPR\\/([0-9\\.]+)(:?\\s|$)/],\n ['ie', /Trident\\/7\\.0.*rv\\:([0-9\\.]+).*\\).*Gecko$/],\n ['ie', /MSIE\\s([0-9\\.]+);.*Trident\\/[4-7].0/],\n ['ie', /MSIE\\s(7\\.0)/],\n ['bb10', /BB10;\\sTouch.*Version\\/([0-9\\.]+)/],\n ['android', /Android\\s([0-9\\.]+)/],\n ['ios', /Version\\/([0-9\\._]+).*Mobile.*Safari.*/],\n ['safari', /Version\\/([0-9\\._]+).*Safari/],\n ['facebook', /FBAV\\/([0-9\\.]+)/],\n ['instagram', /Instagram\\s([0-9\\.]+)/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Mobile/],\n ['ios-webview', /AppleWebKit\\/([0-9\\.]+).*Gecko\\)$/],\n ['searchbot', SEARCHBOX_UA_REGEX],\n];\nvar operatingSystemRules = [\n ['iOS', /iP(hone|od|ad)/],\n ['Android OS', /Android/],\n ['BlackBerry OS', /BlackBerry|BB10/],\n ['Windows Mobile', /IEMobile/],\n ['Amazon OS', /Kindle/],\n ['Windows 3.11', /Win16/],\n ['Windows 95', /(Windows 95)|(Win95)|(Windows_95)/],\n ['Windows 98', /(Windows 98)|(Win98)/],\n ['Windows 2000', /(Windows NT 5.0)|(Windows 2000)/],\n ['Windows XP', /(Windows NT 5.1)|(Windows XP)/],\n ['Windows Server 2003', /(Windows NT 5.2)/],\n ['Windows Vista', /(Windows NT 6.0)/],\n ['Windows 7', /(Windows NT 6.1)/],\n ['Windows 8', /(Windows NT 6.2)/],\n ['Windows 8.1', /(Windows NT 6.3)/],\n ['Windows 10', /(Windows NT 10.0)/],\n ['Windows ME', /Windows ME/],\n ['Open BSD', /OpenBSD/],\n ['Sun OS', /SunOS/],\n ['Chrome OS', /CrOS/],\n ['Linux', /(Linux)|(X11)/],\n ['Mac OS', /(Mac_PowerPC)|(Macintosh)/],\n ['QNX', /QNX/],\n ['BeOS', /BeOS/],\n ['OS/2', /OS\\/2/],\n ['Search Bot', SEARCHBOT_OS_REGEX],\n];\nfunction detect(userAgent) {\n if (!!userAgent) {\n return parseUserAgent(userAgent);\n }\n if (typeof navigator !== 'undefined') {\n return parseUserAgent(navigator.userAgent);\n }\n return getNodeVersion();\n}\nexports.detect = detect;\nfunction parseUserAgent(ua) {\n // opted for using reduce here rather than Array#first with a regex.test call\n // this is primarily because using the reduce we only perform the regex\n // execution once rather than once for the test and for the exec again below\n // probably something that needs to be benchmarked though\n var matchedRule = ua !== '' &&\n userAgentRules.reduce(function (matched, _a) {\n var browser = _a[0], regex = _a[1];\n if (matched) {\n return matched;\n }\n var uaMatch = regex.exec(ua);\n return !!uaMatch && [browser, uaMatch];\n }, false);\n if (!matchedRule) {\n return null;\n }\n var name = matchedRule[0], match = matchedRule[1];\n if (name === 'searchbot') {\n return new BotInfo();\n }\n var versionParts = match[1] && match[1].split(/[._]/).slice(0, 3);\n if (versionParts) {\n if (versionParts.length < REQUIRED_VERSION_PARTS) {\n versionParts = __spreadArrays(versionParts, createVersionParts(REQUIRED_VERSION_PARTS - versionParts.length));\n }\n }\n else {\n versionParts = [];\n }\n return new BrowserInfo(name, versionParts.join('.'), detectOS(ua));\n}\nexports.parseUserAgent = parseUserAgent;\nfunction detectOS(ua) {\n for (var ii = 0, count = operatingSystemRules.length; ii < count; ii++) {\n var _a = operatingSystemRules[ii], os = _a[0], regex = _a[1];\n var match = regex.test(ua);\n if (match) {\n return os;\n }\n }\n return null;\n}\nexports.detectOS = detectOS;\nfunction getNodeVersion() {\n var isNode = typeof process !== 'undefined' && process.version;\n return isNode ? new NodeInfo(process.version.slice(1)) : null;\n}\nexports.getNodeVersion = getNodeVersion;\nfunction createVersionParts(count) {\n var output = [];\n for (var ii = 0; ii < count; ii++) {\n output.push('0');\n }\n return output;\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;",null,null,"\"use strict\";\n\nvar bundleURL = {};\n\nfunction getBundleURLCached(id) {\n var value = bundleURL[id];\n\n if (!value) {\n value = getBundleURL();\n bundleURL[id] = value;\n }\n\n return value;\n}\n\nfunction getBundleURL() {\n try {\n throw new Error();\n } catch (err) {\n var matches = ('' + err.stack).match(/(https?|file|ftp):\\/\\/[^)\\n]+/g);\n\n if (matches) {\n // The first two stack frames will be this function and getBundleURLCached.\n // Use the 3rd one, which will be a runtime in the original bundle.\n return getBaseURL(matches[2]);\n }\n }\n\n return '/';\n}\n\nfunction getBaseURL(url) {\n return ('' + url).replace(/^((?:https?|file|ftp):\\/\\/.+)\\/[^/]+$/, '$1') + '/';\n} // TODO: Replace uses with `new URL(url).origin` when ie11 is no longer supported.\n\n\nfunction getOrigin(url) {\n var matches = ('' + url).match(/(https?|file|ftp):\\/\\/[^/]+/);\n\n if (!matches) {\n throw new Error('Origin not found');\n }\n\n return matches[0];\n}\n\nexports.getBundleURL = getBundleURLCached;\nexports.getBaseURL = getBaseURL;\nexports.getOrigin = getOrigin;","\"use strict\";\n\nmodule.exports = function (workerUrl, origin, isESM) {\n if (origin === self.location.origin) {\n // If the worker bundle's url is on the same origin as the document,\n // use the worker bundle's own url.\n return workerUrl;\n } else {\n // Otherwise, create a blob URL which loads the worker bundle with `importScripts`.\n var source = isESM ? 'import ' + JSON.stringify(workerUrl) + ';' : 'importScripts(' + JSON.stringify(workerUrl) + ');';\n return URL.createObjectURL(new Blob([source], {\n type: 'application/javascript'\n }));\n }\n};","let workerURL = require('./helpers/get-worker-url');\nlet bundleURL = require('./helpers/bundle-url');\nlet url = bundleURL.getBundleURL('3mXZd') + require('./helpers/bundle-manifest').resolve(\"Wn9pe\");module.exports = workerURL(url, bundleURL.getOrigin(url), false);",null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["self","ReferenceError","instance","Constructor","TypeError","$e5f9bd0c37e9914c$var$_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","$ac93fd2313270fd8$var$setPrototypeOf","o1","p1","setPrototypeOf","o","p","__proto__","subClass","superClass","create","constructor","value","obj","Symbol","$7dc24fd3d8e84af6$var$getPrototypeOf","getPrototypeOf","call","$ee4fec65ef715af7$export$2e2bcd8739ae039","$08b63c45f54847ee$export$2e2bcd8739ae039","Derived","hasNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","e","$d60c94504fa4a111$export$2e2bcd8739ae039","result","Super","$7dc24fd3d8e84af6$export$2e2bcd8739ae039","NewTarget","this","arguments","apply","$87fe16ba8ff029a3$export$2e2bcd8739ae039","$0380ce8f1f064ccc$export$6503ec6e8aabbaf","$0380ce8f1f064ccc$export$f7ad0328861e2f03","$0380ce8f1f064ccc$var$mapping","pairs","keys","id","resolved","Error","$59d027224e185503$export$77cea355fa80b5f4","subscribe","_isScalar","_subscribe","lift","operator","observable","source","observerOrNext","error","complete","sink","$84uv8","toSubscriber","add","$ddKkG","config","useDeprecatedSynchronousErrorHandling","syncErrorThrowable","_trySubscribe","syncErrorThrown","syncErrorValue","err","$bisz1","canReportError","console","warn","forEach","next","promiseCtor","_this","$59d027224e185503$var$getPromiseCtor","resolve","reject","subscription","unsubscribe","subscriber","$hfX18","pipe","operations","_i","$lK4Ew","pipeFromArray","toPromise","x","Promise","$8397885bb448dd63$export$f7d54ecb625129e3","observer","_a","closed_1","closed","destination","isStopped","$jjNWy","Subscriber","$e106886950c905ab$export$60959659b2c22881","_super","destinationOrNext","$9lNTm","empty","$e106886950c905ab$export$94eeb6a328cab6c7","$4tSb9","__extends","$ld2iG","rxSubscriber","_next","_error","_complete","_unsubscribeAndRecycle","_parentOrParents","_parentSubscriber","context","$cAfY2","isFunction","bind","_context","__tryOrSetError","__tryOrUnsub","$6DqXq","hostReportError","wrappedComplete","fn","parent","_unsubscribe","$3433e5a3eb89c040$var$extendStatics","d1","b1","Array","d","b","hasOwnProperty","$3433e5a3eb89c040$export$a8ba968b8961cb8a","__","$92953b9e28b2038d$export$f6e2535fb5126e54","$6cecc6b352da5fca$export$6e22c362a0406a2c","$9a006df955424c4b$var$_enable_super_gross_mode_that_will_cause_bad_things","$9a006df955424c4b$export$e506a1d27d1eaa20","undefined","stack","$4d4b4bc7081daec3$export$ebb0f299889f975f","setTimeout","$02cd07061e6a0056$export$f55210826850c514","_subscriptions","errors","remove","index","$gjZbq","UnsubscriptionError","$02cd07061e6a0056$var$flattenUnsubscriptionErrors","$1atUH","isArray","len","sub","$1zVlO","isObject","concat","push","teardown","EMPTY","tmp","indexOf","subscriptions","subscriptionIndex","splice","reduce","errs","$12658bfd9659255e$export$a6cdc56e425d0d0a","$be1de16967cb5b04$var$UnsubscriptionErrorImpl","message","map","toString","join","name","$f70c98a695cc14dc$export$77f77496d7cade10","Math","random","$5e065b54e5f047b2$export$2a12c2cebbfd1087","nextOrObserver","$0415b3a0111ea41f$export$a4627e546088548d","fns","$0415b3a0111ea41f$export$71f88a61afaa14d7","input","prev","$3Stiu","noop","$4e589c96b480d8ed$export$9038dea0172d3ba9","subjectFactory","_refCount","getSubject","subject","_subject","connect","connection","_connection","_isComplete","$eUmrf","Subscription","$4e589c96b480d8ed$var$ConnectableSubscriber","refCount","$lytJQ","$4e589c96b480d8ed$var$connectableProto","ConnectableSubscriber","connectable","$97yDf","SubjectSubscriber","$4e589c96b480d8ed$var$RefCountSubscriber","RefCountOperator","refCounter","RefCountSubscriber","sharedConnection","$6a3fa1b2c8efd73a$export$d2a63025e8078d0c","$6a3fa1b2c8efd73a$export$b6bbab5a9b109038","observers","hasError","$6a3fa1b2c8efd73a$export$155189cde295587d","$28c9c","ObjectUnsubscribedError","copy","slice","thrownError","$ibi64","SubjectSubscription","asObservable","$7I4wD","Observable","$18d5c0587d4b5af5$var$ObjectUnsubscribedErrorImpl","$d3c74ab9ba8094ed$export$b7a41f2bfb5c60c3","subscriberIndex","$fb13d75e37f9b08f$export$18d0766d894cba0c","$fb13d75e37f9b08f$var$RefCountOperator","$fb13d75e37f9b08f$var$RefCountSubscriber","GroupByOperator","keySelector","elementSelector","durationSelector","subjectSelector","$e3363b2d8a7b0729$var$GroupBySubscriber","GroupBySubscriber","groups","attemptedToUnsubscribe","_group","Map","element","group","get","Subject","set","groupedObservable","$e3363b2d8a7b0729$export$ff26824b3dc37d8c","duration","$e3363b2d8a7b0729$var$GroupDurationSubscriber","clear","removeGroup","delete","count","GroupDurationSubscriber","groupSubject","refCountSubscription","$e3363b2d8a7b0729$var$InnerRefCountSubscription","InnerRefCountSubscription","$49accf8586bc3645$export$cc3d42e6b2b9cf8b","_value","getValue","$088bb6246b1a3c1f$export$915d2682b0aa0991","bufferSize","windowTime","scheduler","Number","POSITIVE_INFINITY","_events","_infiniteTimeWindow","_bufferSize","_windowTime","nextTimeWindow","nextInfiniteTimeWindow","shift","$088bb6246b1a3c1f$var$ReplayEvent","_getNow","_trimBufferThenGetEvents","$2rjD3","ObserveOnSubscriber","$4eZFB","queue","now","eventsCount","spliceCount","time","max","$2090a3bc48f7c4f8$export$fec474e58f10935f","work","schedule","state","delay","flush","execute","_execute","requestAsyncId","$2979950e0ca1ac42$export$b5369ffd7cb2211b","recycleAsyncId","pending","setInterval","clearInterval","errored","errorValue","actions","$30ea701ab14ef8c0$export$e19cd5f9376f8cee","$06e79454645b9e5c$export$6a0c75a6abc7ad50","$3a47aaa968ad96b8$export$4114a3ec92faa3c6","SchedulerAction","$8Zj6G","Scheduler","delegate","active","scheduled","action","$68b2d770c66ebd6f$export$d3e54bb8584cda7c","$1c6d544b01b60175$export$b8e2e9b883c1952","$1c6d544b01b60175$export$2ccc19882708a0","dispatch","arg","notification","observe","scheduleMessage","$1c6d544b01b60175$export$6358f3d000008d47","$lYqTF","Notification","createNext","createError","createComplete","$fff410bd8412a47c$export$f59c804e350a7a80","$fff410bd8412a47c$export$14834abbfce3b8cd","kind","hasValue","do","accept","toObservable","$cPn1q","of","$2t2EN","throwError","$8sUry","undefinedValueNotification","completeNotification","$629cb8bb6ff61825$export$ccb33e29d92c9a58","$629cb8bb6ff61825$export$6e22c362a0406a2c","$629cb8bb6ff61825$var$emptyScheduled","$956c1b264ed42e92$export$ba255e9e49e00608","args","$ivI8M","isScheduler","pop","$euwuv","scheduleArray","$3bVFO","fromArray","$d79d5cabff7baaa7$export$187e35932e88c15c","$252f22eb2a1ac7bc$export$571d59b505e6bb4e","$8AgeX","subscribeToArray","$63fe487a7b7f1d64$export$ab22aa77f372e159","array","$a8cd120f905042ff$export$b34673931371729a","$1cc059d7ece1751b$export$8bf7aba4a9e09055","$1cc059d7ece1751b$var$dispatch","$16159a8bd4772e94$export$fe960da701faae26","hasNext","hasCompleted","$a311b4fc9b45e878$export$6a72523e12463e75","$eFRez","Immediate","setImmediate","clearImmediate","$aaee302f11e00ce7$var$nextHandle","$aaee302f11e00ce7$var$tasksByHandle","$aaee302f11e00ce7$export$9bf7f22d83f7b5af","cb","handle","then","$aaee302f11e00ce7$var$runIfPresent","$e51dfbb0f99fc924$export$e27ac4cacb0fee33","$10cd5f4bb51ed7c9$export$20b61f85ef6e6915","requestAnimationFrame","cancelAnimationFrame","$73c90743499dc9fc$export$5ac76215a6c70aaa","$a6f29d3d43cc4cd2$export$789cef2613b1402","maxFrames","$a6f29d3d43cc4cd2$export$c60fda1e1f56d09c","frame","frameTimeFactor","AsyncScheduler","sort","sortActions","a","$bdb52d7207fd78ab$export$f0954fd7d5368655","$91b676ed563401b0$export$5cd057a6046189f9","$8851a73c2f3dde01$var$ArgumentOutOfRangeErrorImpl","$1d6bf5827e0f9523$var$EmptyErrorImpl","$78ec5130ccf09402$var$TimeoutErrorImpl","$4772c455bc004cf2$export$ba9059a8de3f18e","callbackFunc","resultSelector","args1","$2ve2P","_i1","params","$4772c455bc004cf2$var$dispatch","$1Tyod","AsyncSubject","innerArgs","$4772c455bc004cf2$var$dispatchNext","$1d295f03ea00e78d$export$871de8747c9eaa88","project","thisArg","$1d295f03ea00e78d$export$65d6be2d9a2ba8ee","$1d295f03ea00e78d$var$MapSubscriber","MapSubscriber","$710607294cd6f9d3$export$4893451713772b1a","$710607294cd6f9d3$var$dispatch","$710607294cd6f9d3$var$dispatchError","$710607294cd6f9d3$var$dispatchNext","$90f611a535bd84b5$var$NONE","$90f611a535bd84b5$export$77fa7d86f5204e8a","observables","$90f611a535bd84b5$export$f252ced05c51d8e7","$90f611a535bd84b5$export$b847d1ba97f572c0","values","toRespond","$2PWeR","subscribeToResult","notifyComplete","unused","notifyNext","outerValue","innerValue","outerIndex","innerIndex","innerSub","oldVal","_tryResultSelector","$13ac6ea1a268d4db$export$e5fdd83ec9152026","notifyError","$210d852eca153599$export$d0604af3321cfb1b","outerSubscriber","$Pujf9","InnerSubscriber","$09ac46587d0d68d6$export$6cd922279ed50d2b","$c38e0686acd839e9$export$45e4095b0ba1d337","$aWNET","subscribeToObservable","$a9rso","isArrayLike","$fT308","isPromise","$8VW0G","subscribeToPromise","$kv7fN","iterator","$cYXl6","subscribeToIterable","$6810a5289b1a1837$export$3adcd774773826b8","promise","$97391e2e5800f7c3$export$176678a6ee07b575","iterable","item","done","return","$eecc545cc71c8b3d$export$aa9956be4ae4fe8","$eecc545cc71c8b3d$export$6f58e2338da23f4d","$7f85d755841aeea9$export$253b2a6a99e75857","obs","$b90e520f151825f3$export$4369c812aac99591","$c9b64f7b11756e4e$export$ee1b3e54f0441b22","$cUV3x","concatAll","$9676f92419b94f58$export$b314777ae20abca9","$jvfGc","mergeAll","$e32d13348e2ea8a0$export$18aef43295bbe906","concurrent","$810c5762d71b7fc6$export$6b9f6c0d32c093f9","$G1WdB","from","ii","$810c5762d71b7fc6$export$397d304a18305ca8","$810c5762d71b7fc6$export$c13a9be6692e882","buffer","_tryNext","_innerSub","ish","innerSubscriber","$07e56d34b4b0aa79$export$6788812c4e6611e6","$9xyTB","$gMVSx","subscribeTo","$6f2243b744f7480b$export$49c44dfc2bb21d70","$fNSJs","isInteropObservable","$6T0oI","scheduleObservable","$lmAjR","schedulePromise","$alfqR","isIterable","$dZanE","scheduleIterable","$5038301be6b5db63$export$ed8bd553a12b6a30","$f8d7d34a8247c55c$export$fc9afd948577f0a8","$a2e906336c8cf036$export$2b75c58ab9b5b766","$b815e34ef6b3dba4$export$48c0cddbc99c45c2","$7877d60d528835ab$export$9652023d9040757","$159359f0d3e4a547$export$260e5c0943f31606","observableFactory","$77e2363cc66e4a38$export$b5bbde3786dfbd68","sources","first_1","$77e2363cc66e4a38$var$forkJoinInternal","resultSelector_1","completed","emitted","_loop_1","$7ba7ee5abb7b392a$export$a36e16046ae8f1bb","eventName","options","$7ba7ee5abb7b392a$var$setupSubscription","sourceObj","handler","addEventListener","removeEventListener","$7ba7ee5abb7b392a$var$isEventTarget","source_1","on","off","$7ba7ee5abb7b392a$var$isJQueryStyleEventEmitter","source_2","addListener","removeListener","$7ba7ee5abb7b392a$var$isNodeStyleEventEmitter","source_3","$ed18985f3021a753$export$af596f9f0ff848f8","addHandler","removeHandler","retValue","$3941ed7747e1576c$export$80d376111cc09ad7","initialStateOrOptions","condition","iterate","resultSelectorOrObservable","initialState","$ghOcK","identity","$3941ed7747e1576c$var$dispatch","conditionResult","err1","needIterate","err2","$aaafb24f2e39e9d5$export$906815c308550252","trueResult","falseResult","$a62d7de58e254a66$export$3174cdbf0a0cbc84","period","$jo1bg","async","$etZi6","isNumeric","$a62d7de58e254a66$var$dispatch","counter","$a8b3513a3dcfd458$export$e90fb89750dba83f","val","parseFloat","$7dcf6333f5c706e8$export$4950aa0f605343fb","last","$386f01ef9890ccd2$export$96c94437c95d7862","$386f01ef9890ccd2$export$b3e22bcfd64c1022","$e1b8e6ea6622f18a$export$5fba66d61591f42","first","remainder","subNext","$d48cc879b9d31723$export$589748d90c221be3","$d48cc879b9d31723$export$635e15bbd66f01ea","$02935ac3c9380b4d$export$b29f828819edca8d","predicate","$dd0I0","filter","$bbeJZ","not","$823c27fb695f3c57$export$6003a5f097c73977","pred","notPred","$99dd09fc2c1a3c2f$export$3dea766d36a8935f","$99dd09fc2c1a3c2f$var$FilterOperator","FilterOperator","$99dd09fc2c1a3c2f$var$FilterSubscriber","FilterSubscriber","$754211fd22c86b8b$export$236c05de452bec2","$754211fd22c86b8b$export$6ea9b1dcd7b1acb2","$754211fd22c86b8b$export$5e2b164ea41b09c2","hasFirst","$266814b75051cc45$export$d02631cccf789723","start","current","$266814b75051cc45$export$635e15bbd66f01ea","$b5667b31e8ad61ca$export$9dc4ecf953986f04","dueTime","periodOrScheduler","due","$b5667b31e8ad61ca$var$dispatch","$dafbc370d5259d05$export$fb1889ddede82380","resourceFactory","resource","$44315f415600969b$export$8901015135f2fb22","$44315f415600969b$export$a488fab011740066","$44315f415600969b$export$7f72df0c8910d7c5","iterators","$44315f415600969b$var$StaticArrayIterator","$44315f415600969b$var$StaticIterator","$44315f415600969b$var$ZipBufferIterator","stillUnsubscribed","notifyInactive","checkIterators","shouldComplete","_tryresultSelector","StaticIterator","nextResult","StaticArrayIterator","ZipBufferIterator","isComplete","$0147bee01cff6558$export$ec8b666c5fe2c75a","EPSILON","pow","isInteger","isFinite","floor","sign","Function","match","assign","output","nextKey","type","listener","_listeners","listeners","hasEventListener","listenerArray","dispatchEvent","event","l","v1","quaternion","$0147bee01cff6558$var$_canvas","$0147bee01cff6558$export$3545e07a80636437","$0147bee01cff6558$export$7177b3e430c2d7ca","LEFT","MIDDLE","RIGHT","$0147bee01cff6558$export$3237e1f2c1ea1f44","$0147bee01cff6558$export$b9a7b4fc5cb15f9b","$0147bee01cff6558$export$b8058bcc7037d3f3","$0147bee01cff6558$export$f24be24dcddeac0d","$0147bee01cff6558$export$26572b1037dca59a","$0147bee01cff6558$export$eb871402b6345035","$0147bee01cff6558$export$346307dbae2b7447","$0147bee01cff6558$export$5813f879eee7cd88","$0147bee01cff6558$export$a47c4b43a1be34f0","$0147bee01cff6558$export$2ede184fc2998901","$0147bee01cff6558$export$d9f0486e75b5ace","$0147bee01cff6558$export$3b296b6f144d5b03","$0147bee01cff6558$export$a62047d29c96d8ff","$0147bee01cff6558$export$fadb74c06a7f490","$0147bee01cff6558$export$1a5c46edbdc9a5b7","$0147bee01cff6558$export$617e978cc3201d85","$0147bee01cff6558$export$969ede3d37172881","$0147bee01cff6558$export$63b8d6b580fc65ba","$0147bee01cff6558$export$5b29a26d96ee6af0","$0147bee01cff6558$export$777d8f9551c2216b","$0147bee01cff6558$export$cdfa06f868e2e467","$0147bee01cff6558$export$4138e1c684b46a20","$0147bee01cff6558$export$eda4864c68df1fa2","$0147bee01cff6558$export$20183a0484ce21a0","$0147bee01cff6558$export$73e0df5177988548","$0147bee01cff6558$export$28e582859cbec660","$0147bee01cff6558$export$c8c1508da8d0600c","$0147bee01cff6558$export$99948c02fb51055f","$0147bee01cff6558$export$2110f05edf778d3d","$0147bee01cff6558$export$8805bad65e24940e","$0147bee01cff6558$export$7fbe15b28d28cf52","$0147bee01cff6558$export$947829af9f2c17f6","$0147bee01cff6558$export$d5773124e86cf28c","$0147bee01cff6558$export$11d468cc7f19e971","$0147bee01cff6558$export$a78aed1ca2a87192","$0147bee01cff6558$export$5d0fe17fd8773bac","$0147bee01cff6558$export$ef5f2dd8ffac5574","$0147bee01cff6558$export$56b85b2686ab16","$0147bee01cff6558$export$c05e2a1fc8609506","$0147bee01cff6558$export$69025ce147cee220","$0147bee01cff6558$export$7182eb52ea3b3f04","$0147bee01cff6558$export$eedccec66ab7ebe","$0147bee01cff6558$export$296f78a0b892f81a","$0147bee01cff6558$export$a60d398fc7b7590e","$0147bee01cff6558$export$7d7234c1240a1fc4","$0147bee01cff6558$export$c5e2c52991f30937","$0147bee01cff6558$export$2f843afa843d8916","$0147bee01cff6558$export$e50ac29801f1774d","$0147bee01cff6558$export$9f9d94f963c85479","$0147bee01cff6558$export$e641dc52bc3494aa","$0147bee01cff6558$export$9fcb6b4294603b2","$0147bee01cff6558$export$98f52c2a46c598ca","$0147bee01cff6558$export$74b25e54b3bcd548","$0147bee01cff6558$export$4ef8f05fff4fa871","$0147bee01cff6558$export$932b3dd283d4a366","$0147bee01cff6558$export$a0d98fe6d7e4af64","$0147bee01cff6558$export$1beec6768cbb3d2d","$0147bee01cff6558$export$8759762a6477f2c4","$0147bee01cff6558$export$dc59f8aed047f61d","$0147bee01cff6558$export$d64030b316d3b087","$0147bee01cff6558$export$ee99d97d46898098","$0147bee01cff6558$export$b30b5cd75be9563d","$0147bee01cff6558$export$dbf3e70ff37af79","$0147bee01cff6558$export$76a9f4355364345c","$0147bee01cff6558$export$533346c8e8dac0f5","$0147bee01cff6558$export$9d9334239a5a5e06","$0147bee01cff6558$export$c7e7c00b14f51a4f","$0147bee01cff6558$export$727aa5ec3fe39bf0","$0147bee01cff6558$export$14a4936464a36496","$0147bee01cff6558$export$cbc5b7f5647595d8","$0147bee01cff6558$export$8a72f490b25c56c8","$0147bee01cff6558$export$dbe96bee3fe9dbf0","$0147bee01cff6558$export$90d80f1e3506775f","$0147bee01cff6558$export$2e8ce08d3f6f5e10","$0147bee01cff6558$export$545fce0311a9796a","$0147bee01cff6558$export$88572337f312435f","$0147bee01cff6558$export$c63dc51868b06a9d","$0147bee01cff6558$export$5c612977753abe2","$0147bee01cff6558$export$c3c7fc4518ebba96","$0147bee01cff6558$export$f6d331659b644596","$0147bee01cff6558$export$2697304443f382bc","$0147bee01cff6558$export$b3969b01faf587f2","$0147bee01cff6558$export$18886f8ae33e90de","$0147bee01cff6558$export$cb1fa50553eb14c4","$0147bee01cff6558$export$6c8ea339bfab1301","$0147bee01cff6558$export$988473390501ed4b","$0147bee01cff6558$export$7c67423a5ee6f5eb","$0147bee01cff6558$export$3f8bb04b555a363c","$0147bee01cff6558$export$cc09ccbf6d1ed449","$0147bee01cff6558$export$9053a81c4a69c289","$0147bee01cff6558$export$7f419e36e2229a1d","$0147bee01cff6558$export$c1b6b5136be58045","$0147bee01cff6558$export$1e113ac2d0905829","$0147bee01cff6558$export$4e041a7967d15c4b","$0147bee01cff6558$export$21d1799c6d552fc0","$0147bee01cff6558$export$afa304c3e981b668","$0147bee01cff6558$export$d2a1a68024a3e56c","$0147bee01cff6558$export$9a79c424327dacf9","$0147bee01cff6558$export$19ada9bbb1af3573","$0147bee01cff6558$export$d0f0355bb3d948e4","$0147bee01cff6558$export$b82296714358084c","$0147bee01cff6558$export$b71692456c47b6c3","$0147bee01cff6558$export$6ab91af2d757aee7","$0147bee01cff6558$export$dc5570b4a2b92d48","$0147bee01cff6558$export$68880cd325f8b2fb","$0147bee01cff6558$export$7d2c0be323373d95","$0147bee01cff6558$export$22b52da301fc3a3e","$0147bee01cff6558$export$c009e2cb4a66485e","$0147bee01cff6558$export$118fff5afa255b63","$0147bee01cff6558$export$120713c829ae0667","$0147bee01cff6558$export$c79eeabbf53313e9","$0147bee01cff6558$export$443cf6567cdd6424","$0147bee01cff6558$export$6573984fc9840780","$0147bee01cff6558$export$e7aee563f30091de","$0147bee01cff6558$export$2eb8634622ddeab7","$0147bee01cff6558$export$202b1ce7b5d25742","$0147bee01cff6558$export$18ab77abd087e467","$0147bee01cff6558$export$d62fdc9d1b1cccad","$0147bee01cff6558$export$dfaf4422ce096e29","$0147bee01cff6558$export$f8f6f2041b78e210","$0147bee01cff6558$export$995b32462a65e855","$0147bee01cff6558$export$30fac1aace31cf4d","$0147bee01cff6558$export$198b11ff4c72bb30","$0147bee01cff6558$export$7f795934b84ab523","$0147bee01cff6558$export$24a4ccb5099273b5","$0147bee01cff6558$export$8e8c3ecdcd8e1fee","$0147bee01cff6558$export$4c28c87c2dc84758","$0147bee01cff6558$export$b23a071aa286eb29","$0147bee01cff6558$export$f0d8293634f88842","$0147bee01cff6558$export$7207336e4151a112","$0147bee01cff6558$export$f32388edbb32674","$0147bee01cff6558$export$eaab32c1bcea1817","$0147bee01cff6558$export$3be4c466a12b5dcf","$0147bee01cff6558$export$8d4cbbeb1eea9f67","$0147bee01cff6558$export$2c4bdfd76b188654","$0147bee01cff6558$export$48a0051d6a5a9b9","$0147bee01cff6558$export$ca2f89b13b49d951","$0147bee01cff6558$export$deeb383078690b50","$0147bee01cff6558$export$8f910f4c4f73df11","$0147bee01cff6558$export$2852a58ebdac27b8","$0147bee01cff6558$export$9990ad26f9db5b2c","$0147bee01cff6558$export$380958644dbbc22b","DEG2RAD","PI","RAD2DEG","generateUUID","lut","d0","d2","d3","toUpperCase","clamp","min","euclideanModulo","n","m","mapLinear","a1","a2","b2","lerp","y","t","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","ceil","log","LN2","floorPowerOfTwo","$0147bee01cff6558$export$c977b3e384af9ae1","$0147bee01cff6558$export$23d6a54f0bbc85a3","z","w","_x","_y","_z","_w","$0147bee01cff6558$export$64b5c384219d3699","$0147bee01cff6558$export$8ff26dafa08918","elements","defineProperties","width","height","isVector2","setScalar","scalar","setX","setY","setComponent","getComponent","clone","v","addVectors","addScalar","s","addScaledVector","subVectors","subScalar","multiply","multiplyScalar","divide","divideScalar","applyMatrix3","clampScalar","minVal","maxVal","clampLength","round","roundToZero","negate","dot","cross","lengthSq","sqrt","manhattanLength","abs","normalize","angle","angle1","atan2","distanceTo","distanceToSquared","dx","dy","manhattanDistanceTo","setLength","alpha","lerpVectors","v2","equals","offset","toArray","fromBufferAttribute","attribute","getX","getY","rotateAround","center","c","cos","sin","slerp","qa","qb","qm","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","tDir","f","_onChangeCallback","isQuaternion","setFromEuler","euler","update","isEuler","order","c1","c2","c3","s1","s2","s3","setFromAxisAngle","axis","halfAngle","setFromRotationMatrix","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","setFromUnitVectors","vFrom","vTo","r","angleTo","q","acos","rotateTowards","step","inverse","conjugate","multiplyQuaternions","premultiply","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","_onChange","callback","isVector3","setZ","multiplyVectors","applyEuler","applyQuaternion","applyAxisAngle","applyMatrix4","qx","qy","qz","qw","ix","iy","iz","iw","camera","matrixWorldInverse","projectionMatrix","unproject","projectionMatrixInverse","matrixWorld","transformDirection","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","vector","projectOnPlane","planeNormal","reflect","normal","theta","dz","setFromSpherical","setFromSphericalCoords","radius","phi","sinPhiRadius","setFromCylindrical","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","sx","setFromMatrixColumn","sy","sz","getZ","isMatrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","me","setFromMatrix4","applyToBufferAttribute","setXYZ","multiplyMatrices","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","determinant","g","h","getInverse","matrix","throwOnDegenerate","isMatrix4","t11","t12","t13","det","msg","detInv","transpose","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","tx","ty","rotation","cx","cy","scale","rotate","translate","zero","one","$0147bee01cff6558$export$698882cf06df44aa","getDataURL","image","canvas","HTMLCanvasElement","src","document","createElementNS","getContext","ImageData","putImageData","drawImage","toDataURL","$0147bee01cff6558$var$textureId","$0147bee01cff6558$export$5431306cf43de24a","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","encoding","uuid","DEFAULT_IMAGE","mipmaps","DEFAULT_MAPPING","repeat","matrixAutoUpdate","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","version","onUpdate","$0147bee01cff6558$export$fa7daccca11cdbe3","$0147bee01cff6558$export$3c052beb2e51e23f","scissor","scissorTest","viewport","texture","depthBuffer","stencilBuffer","depthTexture","$0147bee01cff6558$export$cb2022643d3c928d","samples","$0147bee01cff6558$export$2ae72fc923e5eb5","$0147bee01cff6558$export$d93cc409a0768c5f","_order","DefaultOrder","$0147bee01cff6558$export$89312ce47c0ca777","mask","isTexture","updateMatrix","toJSON","meta","isRootObject","textures","metadata","generator","wrap","images","url","dispose","transformUv","uv","isVector4","setW","setAxisAngleFromQuaternion","setAxisAngleFromRotationMatrix","epsilon","epsilon2","xx","yy","zz","xy","xz","yz","getW","isWebGLRenderTarget","setSize","isWebGLMultisampleRenderTarget","n14","n24","n34","n41","n42","n43","n44","copyPosition","extractBasis","xAxis","yAxis","zAxis","makeBasis","extractRotation","scaleX","scaleY","scaleZ","makeRotationFromEuler","af","bf","ce","cf","de","df","ac","ad","bc","bd","makeRotationFromQuaternion","compose","lookAt","eye","up","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","setPosition","t14","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeScale","makeShear","position","x2","y2","z2","wx","wy","wz","decompose","invSX","invSY","invSZ","makePerspective","left","right","top","bottom","near","far","makeOrthographic","RotationOrders","asin","setFromQuaternion","setFromVector3","reorder","newOrder","toVector3","optionalResult","channel","enable","toggle","disable","test","layers","m1","q1","points","closestPoint","box","segCenter","segDir","diff","barycoord","v0","vab","vac","vbc","vap","vbp","vcp","$0147bee01cff6558$var$object3DId","$0147bee01cff6558$export$e4dd07dff30cc924","children","DefaultUp","modelViewMatrix","normalMatrix","DefaultMatrixAutoUpdate","matrixWorldNeedsUpdate","visible","castShadow","receiveShadow","frustumCulled","renderOrder","userData","$0147bee01cff6558$export$38af1803e3442a7f","background","fog","overrideMaterial","autoUpdate","__THREE_DEVTOOLS__","CustomEvent","detail","$0147bee01cff6558$export$6f7d5a9418ab2aa3","Infinity","$0147bee01cff6558$export$805e8b72413ccaba","$0147bee01cff6558$export$a186db52eed6d40e","origin","direction","$0147bee01cff6558$export$5a465592bfe74b48","isObject3D","onBeforeRender","onAfterRender","applyMatrix","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","distance","translateX","translateY","translateZ","localToWorld","worldToLocal","updateWorldMatrix","isCamera","isLight","object","attach","getObjectById","getObjectByProperty","getObjectByName","getWorldPosition","updateMatrixWorld","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverse","traverseVisible","traverseAncestors","force","updateParents","updateChildren","geometries","materials","shapes","serialize","library","JSON","stringify","isMesh","drawMode","isLine","isPoints","geometry","parameters","shape","material","uuids","extractFromCache","cache","data","recursive","parse","child","isScene","isBox3","setFromArray","minX","minY","minZ","maxX","maxY","maxZ","setFromBufferAttribute","setFromPoints","makeEmpty","il","expandByPoint","setFromCenterAndSize","size","halfSize","setFromObject","expandByObject","isEmpty","getCenter","getSize","point","expandByVector","expandByScalar","scope","node","isGeometry","vertices","isBufferGeometry","attributes","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","sphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","f0","f1","f2","testAxis","extents","triangleNormal","satForAxes","axes","j","p0","p2","triangle","distanceToPoint","getBoundingSphere","intersect","union","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","ray","at","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","optionalPointOnRay","optionalPointOnSegment","s0","sqrDist","extDet","segExtent","a01","b0","invDet","intersectSphere","tca","radius2","thc","t0","t1","distanceToPlane","denominator","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","intersectTriangle","edge1","edge2","backfaceCulling","DdN","DdQxE2","DdE1xQ","QdN","getNormal","targetLengthSq","getBarycoord","dot00","dot01","dot02","dot11","dot12","denom","invDenom","u","getUV","p3","uv1","uv2","uv3","isFrontFacing","setFromPointsAndIndices","i0","i1","i2","getArea","getMidpoint","getPlane","setFromCoplanarPoints","d4","vc","d5","d6","vb","va","hslA","hslB","hsl","$0147bee01cff6558$var$ColorKeywords","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","$0147bee01cff6558$export$892596cec99bc70e","setRGB","$0147bee01cff6558$var$hue2rgb","$0147bee01cff6558$var$SRGBToLinear","$0147bee01cff6558$var$LinearToSRGB","$0147bee01cff6558$export$32da1b4b0a8c9982","color","materialIndex","vertexNormals","isColor","vertexColors","setHex","setStyle","hex","setHSL","style","handleAlpha","string","exec","components","parseInt","charAt","copyGammaToLinear","gammaFactor","copyLinearToGamma","safeInverse","convertGammaToLinear","convertLinearToGamma","copySRGBToLinear","copyLinearToSRGB","convertSRGBToLinear","convertLinearToSRGB","getHex","getHexString","getHSL","hue","saturation","lightness","delta","getStyle","offsetHSL","addColors","color1","color2","lerpHSL","$0147bee01cff6558$var$materialId","$0147bee01cff6558$export$a2d8b23205c25948","lights","blending","side","flatShading","vertexTangents","opacity","transparent","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","depthFunc","depthTest","depthWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","precision","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaTest","premultipliedAlpha","needsUpdate","$0147bee01cff6558$export$55cbcc9b622fe1f5","lightMap","lightMapIntensity","aoMap","aoMapIntensity","specularMap","alphaMap","envMap","combine","reflectivity","refractionRatio","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","skinning","morphTargets","setValues","$0147bee01cff6558$export$8dea267bd6bde117","itemSize","normalized","dynamic","updateRange","$0147bee01cff6558$export$f9ff2d6a20248cbf","Int8Array","$0147bee01cff6558$export$cacc90cf35d11cdd","Uint8Array","$0147bee01cff6558$export$baaa85a1a812c157","Uint8ClampedArray","$0147bee01cff6558$export$2b755a102ccdcefe","Int16Array","$0147bee01cff6558$export$640a853f68025f2e","Uint16Array","$0147bee01cff6558$export$46b369aed2968a0a","Int32Array","$0147bee01cff6558$export$7eb8c9fa25cd5bd6","Uint32Array","$0147bee01cff6558$export$cbe7a62641830ebd","Float32Array","$0147bee01cff6558$export$9e0ade74842adbb8","Float64Array","$0147bee01cff6558$var$DirectGeometry","normals","colors","uvs","uvs2","skinWeights","skinIndices","boundingBox","boundingSphere","verticesNeedUpdate","normalsNeedUpdate","colorsNeedUpdate","uvsNeedUpdate","groupsNeedUpdate","$0147bee01cff6558$var$arrayMax","isMaterial","onBeforeCompile","newValue","currentValue","isRoot","data1","roughness","metalness","emissive","emissiveIntensity","specular","shininess","clearCoat","clearCoatRoughness","matcap","bumpMap","bumpScale","normalMap","normalMapType","normalScale","displacementMap","displacementScale","displacementBias","roughnessMap","metalnessMap","emissiveMap","envMapIntensity","gradientMap","sizeAttenuation","linewidth","dashSize","gapSize","morphNormals","srcPlanes","dstPlanes","isMeshBasicMaterial","isBufferAttribute","onUploadCallback","setArray","setDynamic","copyAt","index1","index2","copyArray","copyColorsArray","copyVector2sArray","vectors","copyVector3sArray","copyVector4sArray","setXY","setXYZW","onUpload","computeGroups","faces","face","fromGeometry","morphTargetsPosition","faceVertexUvs","hasFaceVertexUv","hasFaceVertexUv2","morphTargetsLength","morphTargetsNormal","morphNormalsLength","hasSkinIndices","hasSkinWeights","vertexUvs","morphTarget","morphNormal","$0147bee01cff6558$var$bufferGeometryId","$0147bee01cff6558$export$b7be63a67df8959","morphAttributes","drawRange","$0147bee01cff6558$export$e176487c05830cc5","updateMorphTargets","getIndex","setIndex","addAttribute","isInterleavedBufferAttribute","getAttribute","removeAttribute","addGroup","clearGroups","setDrawRange","tangent","computeBoundingBox","computeBoundingSphere","positions","lineDistances","updateFromObject","direct","__directGeometry","elementsNeedUpdate","lineDistancesNeedUpdate","lineDistance","fromDirectGeometry","morphAttributesPosition","morphAttribute","isNaN","boxMorphTargets","jl","computeFaceNormals","computeVertexNormals","vA","vB","vC","pA","pB","pC","ab","indices","normalizeNormals","merge","attributeArray1","attribute2","attributeArray2","attributeOffset","toNonIndexed","convertBufferAttribute","array2","geometry2","indices1","newAttribute","morphArray","l1","attributeData","hasMorphAttributes","attributeArray","setDrawMode","morphTargetInfluences","morphTargetDictionary","ml","String","inverseMatrix","ray1","tempA","tempB","tempC","morphA","morphB","morphC","uvA","uvB","uvC","intersectionPoint","intersectionPointWorld","checkIntersection","raycaster","checkBufferGeometryIntersection","morphPosition","morphInfluences","influence","intersection","intersects","groupMaterial","faceIndex","fvA","fvB","fvC","isMultiMaterial","fl","faceMaterial","uvs_f","$0147bee01cff6558$var$geometryId","$0147bee01cff6558$export$2db6c17465f94a2","$0147bee01cff6558$export$33e43285f7406bd5","depth","widthSegments","heightSegments","depthSegments","fromBufferGeometry","$0147bee01cff6558$export$ab3456a079aa7d80","mergeVertices","width1","height1","depth1","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","$0147bee01cff6558$var$cloneUniforms","property","$0147bee01cff6558$var$mergeUniforms","uniforms","merged","addFace","areaWeighted","vl","computeFlatVertexNormals","computeMorphNormals","__originalFaceNormal","__originalVertexNormals","tmpGeo","faceNormals","dstNormalsFace","dstNormalsVertex","faceNormal","materialIndexOffset","vertexOffset","vertices1","vertices2","faces1","faces2","uvs1","colors1","colors2","vertexCopy","faceCopy","faceVertexNormals","faceVertexColors","uvCopy","mergeMesh","mesh","verticesMap","unique","changes","faceIndicesToRemove","idx","sortFacesByMaterialIndex","_id","newUvs1","newUvs2","vertex","normalsHash","colorsHash","uvsHash","hasFaceNormal","hasFaceVertexNormal","hasFaceColor","hasFaceVertexColor","faceType","setBit","getUvIndex","getNormalIndex","getColorIndex","enabled","hash","k","kl","uvsCopy","srcVertexNormal","destVertexNormal","$0147bee01cff6558$export$d8ecdf8615bfea69","$0147bee01cff6558$export$83c7d75d550a8b0d","defines","vertexShader","fragmentShader","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","$0147bee01cff6558$export$79f141de891a5fed","$0147bee01cff6558$export$74e4ae24825f68d7","fov","aspect","zoom","focus","view","filmGauge","filmOffset","updateProjectionMatrix","isShaderMaterial","isPerspectiveCamera","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","getEffectiveFOV","getFilmWidth","setViewOffset","fullWidth","fullHeight","offsetX","offsetY","clearViewOffset","skew","$0147bee01cff6558$var$fov","$0147bee01cff6558$export$d0cdd0bd804995de","cubeResolution","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","renderTarget","$0147bee01cff6558$export$689069929abfa262","renderer","scene","currentRenderTarget","getRenderTarget","setRenderTarget","render","stencil","$0147bee01cff6558$export$b691f601014eabe1","$0147bee01cff6558$export$7ff5ac152ef991b0","$0147bee01cff6558$export$35efe6f4c85463d2","p4","p5","planes","isWebGLRenderTargetCube","fromEquirectangularTexture","shader","tEquirect","isDataTexture","isPlane","setComponents","setFromNormalAndCoplanarPoint","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","line","intersectsLine","startSign","endSign","end","coplanarPoint","optionalNormalMatrix","referencePoint","frustum","setFromMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","intersectsSprite","sprite","negRadius","$0147bee01cff6558$export$955f9f2e84c43c8b","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","encodings_fragment","encodings_pars_fragment","envmap_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_physical_pars_fragment","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_vertex","lights_pars_begin","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normalmap_pars_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","uv2_pars_fragment","uv2_pars_vertex","uv2_vertex","worldpos_vertex","background_frag","background_vert","cube_frag","cube_vert","depth_frag","depth_vert","distanceRGBA_frag","distanceRGBA_vert","equirect_frag","equirect_vert","linedashed_frag","linedashed_vert","meshbasic_frag","meshbasic_vert","meshlambert_frag","meshlambert_vert","meshmatcap_frag","meshmatcap_vert","meshphong_frag","meshphong_vert","meshphysical_frag","meshphysical_vert","normal_frag","normal_vert","points_frag","points_vert","shadow_frag","shadow_vert","sprite_frag","sprite_vert","$0147bee01cff6558$export$6643083551874bf5","diffuse","uvTransform","specularmap","envmap","flipEnvMap","maxMipLevel","aomap","lightmap","emissivemap","bumpmap","normalmap","displacementmap","roughnessmap","metalnessmap","gradientmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","lightProbe","directionalLights","properties","shadow","shadowBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","decay","spotShadowMap","spotShadowMatrix","pointLights","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","skyColor","groundColor","rectAreaLights","$0147bee01cff6558$export$bee4a7d47f8f5014","basic","lambert","phong","standard","dashed","totalSize","t2D","cube","tCube","tFlip","equirect","distanceRGBA","referencePosition","nearDistance","farDistance","$0147bee01cff6558$var$WebGLAnimation","isAnimating","animationLoop","onAnimationFrame","stop","setAnimationLoop","setContext","$0147bee01cff6558$var$WebGLAttributes","gl","buffers","WeakMap","deleteBuffer","bufferType","usage","createBuffer","bindBuffer","bufferData","bytesPerElement","BYTES_PER_ELEMENT","bufferSubData","subarray","updateBuffer","$0147bee01cff6558$export$967d831af31f69ce","$0147bee01cff6558$export$e789a11a194ca4e0","width_half","height_half","segment_width","segment_height","$0147bee01cff6558$var$WebGLBackground","objects","planeMesh","boxMesh","clearColor","clearAlpha","currentBackground","currentBackgroundVersion","setClear","getClearColor","setClearColor","getClearAlpha","setClearAlpha","renderList","camera1","forceClear","vr","session","getSession","environmentBlendMode","autoClear","autoClearColor","autoClearDepth","autoClearStencil","isCubeTexture","unshift","$0147bee01cff6558$var$WebGLBufferRenderer","info","capabilities","mode","setMode","drawArrays","renderInstances","extension","isWebGL2","maxInstancedCount","$0147bee01cff6558$var$WebGLCapabilities","maxAnisotropy","getMaxPrecision","getShaderPrecisionFormat","WebGL2RenderingContext","precision1","maxPrecision","logarithmicDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","floatFragmentTextures","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","floatVertexTextures","maxSamples","$0147bee01cff6558$var$WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","resetGlobalState","numPlanes","numIntersection","projectPlanes","skipTransform","nPlanes","dstArray","flatSize","viewMatrix","i4","init","enableLocalClipping","beginShadows","endShadows","setState","fromCache","nGlobal","lGlobal","clippingState","$0147bee01cff6558$var$WebGLExtensions","getExtension","$0147bee01cff6558$var$WebGLGeometries","wireframeAttributes","onGeometryDispose","buffergeometry","memory","_bufferGeometry","geometryAttributes","getWireframeAttribute","geometryIndex","$0147bee01cff6558$var$WebGLIndexedBufferRenderer","drawElements","$0147bee01cff6558$var$WebGLInfo","calls","triangles","lines","programs","autoReset","reset","instanceCount","$0147bee01cff6558$var$absNumericalSort","$0147bee01cff6558$var$WebGLMorphtargets","influencesList","program","objectInfluences","influences","getUniforms","setValue","$0147bee01cff6558$var$WebGLObjects","updateList","$0147bee01cff6558$export$ee2e5a18258a4049","$0147bee01cff6558$export$e38bf4541665bbbd","wrapR","$0147bee01cff6558$export$ef03cdc98340bab4","physical","isDataTexture2DArray","isDataTexture3D","$0147bee01cff6558$var$emptyTexture","$0147bee01cff6558$var$emptyTexture2dArray","$0147bee01cff6558$var$emptyTexture3d","$0147bee01cff6558$var$emptyCubeTexture","$0147bee01cff6558$var$arrayCacheF32","$0147bee01cff6558$var$arrayCacheI32","$0147bee01cff6558$var$mat4array","$0147bee01cff6558$var$mat3array","$0147bee01cff6558$var$mat2array","$0147bee01cff6558$var$flatten","nBlocks","blockSize","firstElem","$0147bee01cff6558$var$arraysEqual","$0147bee01cff6558$var$copyArray","$0147bee01cff6558$var$allocTexUnits","allocateTextureUnit","$0147bee01cff6558$var$setValueV1f","uniform1f","addr","$0147bee01cff6558$var$setValueV2f","uniform2f","uniform2fv","$0147bee01cff6558$var$setValueV3f","uniform3f","uniform3fv","$0147bee01cff6558$var$setValueV4f","uniform4f","uniform4fv","$0147bee01cff6558$var$setValueM2","uniformMatrix2fv","$0147bee01cff6558$var$setValueM3","uniformMatrix3fv","$0147bee01cff6558$var$setValueM4","uniformMatrix4fv","$0147bee01cff6558$var$setValueT1","unit","uniform1i","safeSetTexture2D","$0147bee01cff6558$var$setValueT2DArray1","setTexture2DArray","$0147bee01cff6558$var$setValueT3D1","setTexture3D","$0147bee01cff6558$var$setValueT6","safeSetTextureCube","$0147bee01cff6558$var$setValueV1i","$0147bee01cff6558$var$setValueV2i","uniform2iv","$0147bee01cff6558$var$setValueV3i","uniform3iv","$0147bee01cff6558$var$setValueV4i","uniform4iv","$0147bee01cff6558$var$setValueV1fArray","uniform1fv","$0147bee01cff6558$var$setValueV1iArray","uniform1iv","$0147bee01cff6558$var$setValueV2iArray","$0147bee01cff6558$var$setValueV3iArray","$0147bee01cff6558$var$setValueV4iArray","$0147bee01cff6558$var$setValueV2fArray","$0147bee01cff6558$var$setValueV3fArray","$0147bee01cff6558$var$setValueV4fArray","$0147bee01cff6558$var$setValueM2Array","$0147bee01cff6558$var$setValueM3Array","$0147bee01cff6558$var$setValueM4Array","$0147bee01cff6558$var$setValueT1Array","units","$0147bee01cff6558$var$setValueT6Array","$0147bee01cff6558$var$SingleUniform","activeInfo","$0147bee01cff6558$var$getSingularSetter","$0147bee01cff6558$var$PureArrayUniform","$0147bee01cff6558$var$getPureArraySetter","$0147bee01cff6558$var$StructuredUniform","seq","updateCache","$0147bee01cff6558$var$RePathPart","$0147bee01cff6558$var$addUniform","container","uniformObject","$0147bee01cff6558$var$parseUniform","path","pathLength","lastIndex","matchEnd","idIsIndex","subscript","$0147bee01cff6558$var$WebGLUniforms","getProgramParameter","getActiveUniform","getUniformLocation","$0147bee01cff6558$var$WebGLShader","createShader","shaderSource","compileShader","setOptional","upload","seqWithValue","$0147bee01cff6558$var$programIdCount","$0147bee01cff6558$var$getEncodingComponents","$0147bee01cff6558$var$getShaderErrors","status","getShaderParameter","getShaderInfoLog","trim","split","$0147bee01cff6558$var$addLineNumbers","getShaderSource","$0147bee01cff6558$var$getTexelDecodingFunction","functionName","$0147bee01cff6558$var$getToneMappingFunction","toneMapping","toneMappingName","$0147bee01cff6558$var$filterEmptyLine","$0147bee01cff6558$var$replaceLightNums","replace","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","$0147bee01cff6558$var$replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","$0147bee01cff6558$var$parseIncludes","include","$0147bee01cff6558$var$unrollLoops","snippet","unroll","$0147bee01cff6558$var$WebGLProgram","code","shadowMapTypeDefine","shadowMapType","envMapTypeDefine","envMapModeDefine","envMapBlendingDefine","prefixVertex","prefixFragment","gammaFactorDefine","customExtensions","rendererExtensions","envMapCubeUV","objectSpaceNormalMap","$0147bee01cff6558$var$generateExtensions","customDefines","chunks","$0147bee01cff6558$var$generateDefines","createProgram","isRawShaderMaterial","supportsVertexTextures","maxBones","useFog","fogExp","useVertexTexture","doubleSided","flipSided","shadowMapEnabled","physicallyCorrectLights","outputEncoding","mapEncoding","matcapEncoding","envMapEncoding","emissiveMapEncoding","depthPacking","isGLSL3ShaderMaterial","versionRegex","cachedUniforms","cachedAttributes","fragmentGlsl","glVertexShader","glFragmentShader","attachShader","bindAttribLocation","linkProgram","debug","checkShaderErrors","programLog","getProgramInfoLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","getError","diagnostics","prefix","deleteShader","getAttributes","getActiveAttrib","getAttribLocation","$0147bee01cff6558$var$fetchAttributeLocations","destroy","deleteProgram","usedTimes","$0147bee01cff6558$var$WebGLPrograms","shaderIDs","MeshDepthMaterial","MeshDistanceMaterial","MeshNormalMaterial","MeshBasicMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshToonMaterial","MeshStandardMaterial","MeshPhysicalMaterial","MeshMatcapMaterial","LineBasicMaterial","LineDashedMaterial","PointsMaterial","ShadowMaterial","SpriteMaterial","parameterNames","getTextureEncodingFromMap","gammaOverrideLinear","getParameters","shadows","nClipPlanes","nClipIntersection","shaderID","isSkinnedMesh","bones","skeleton","nVertexUniforms","nVertexMatrices","allocateBones","gammaOutput","gammaInput","envMapMode","isFogExp2","maxMorphTargets","maxMorphNormals","directional","spot","rectArea","hemi","shadowMap","getProgramCode","acquireProgram","pl","programInfo","releaseProgram","$0147bee01cff6558$var$WebGLProperties","$0147bee01cff6558$var$painterSortStable","groupOrder","$0147bee01cff6558$var$reversePainterSortStable","$0147bee01cff6558$var$WebGLRenderList","renderItems","renderItemsIndex","opaque","defaultProgram","getNextRenderItem","renderItem","$0147bee01cff6558$var$WebGLRenderLists","lists","onSceneDispose","list","cameras","$0147bee01cff6558$var$UniformsCache","light","halfWidth","halfHeight","$0147bee01cff6558$var$nextVersion","$0147bee01cff6558$var$WebGLLights","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","shadowsLength","ambient","probe","vector3","matrix42","setup","intensity","isAmbientLight","isLightProbe","sh","coefficients","isDirectionalLight","bias","mapSize","isSpotLight","penumbra","isRectAreaLight","isPointLight","isHemisphereLight","$0147bee01cff6558$var$WebGLRenderState","lightsArray","shadowsArray","setupLights","pushLight","pushShadow","shadowLight","$0147bee01cff6558$var$WebGLRenderStates","renderStates","renderState","$0147bee01cff6558$export$2698c22ec13825db","$0147bee01cff6558$export$33e187ed002f2a19","$0147bee01cff6558$var$WebGLShadowMap","_renderer","_objects","_frustum","_projScreenMatrix","_shadowMapSize","_maxShadowMapSize","_lookTarget","_lightPositionWorld","_depthMaterials","_distanceMaterials","_materialCache","cubeDirections","cubeUps","cube2DViewPorts","i3","useMorphing","useSkinning","depthMaterial","distanceMaterial","getDepthMaterial","lightPositionWorld","materialVariants","customMaterial","customDepthMaterial","customDistanceMaterial","variantIndex","keyA","keyB","materialsForVariant","cachedMaterial","isMeshDistanceMaterial","renderObject","shadowCamera","renderBufferDirect","faceCount","activeCubeFace","getActiveCubeFace","activeMipMapLevel","getActiveMipMapLevel","_state","setBlending","setTest","setScissorTest","vpWidth","vpHeight","pars","isSpotLightShadow","shadowMatrix","vpDimensions","$0147bee01cff6558$var$WebGLState","utils","colorBuffer","locked","currentColorMask","currentColorClear","setMask","colorMask","setLocked","lock","currentDepthMask","currentDepthFunc","currentDepthClear","depthMask","setFunc","clearDepth","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","stencilFunc","stencilRef","setOp","stencilFail","stencilZFail","stencilZPass","stencilOp","clearStencil","maxVertexAttributes","newAttributes","enabledAttributes","attributeDivisors","enabledCapabilities","compressedTextureFormats","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","currentScissor","currentViewport","createTexture","bindTexture","texParameteri","texImage2D","emptyTextures","enableAttributeAndDivisor","meshPerAttribute","enableVertexAttribArray","blendEquationSeparate","convert","blendFuncSeparate","blendFunc","setFlipSided","frontFace","setCullFace","cullFace","setPolygonOffset","factor","activeTexture","webglSlot","initAttributes","enableAttribute","disableUnusedAttributes","disableVertexAttribArray","getCompressedTextureFormats","formats","useProgram","setMaterial","frontFaceCW","setLineWidth","lineWidth","webglType","webglTexture","boundTexture","compressedTexImage2D","texImage3D","$0147bee01cff6558$var$WebGLTextures","_gl","_canvas","_videoTextures","useOffscreenCanvas","OffscreenCanvas","createCanvas","resizeImage","needsPowerOfTwo","needsNewCanvas","maxSize","HTMLImageElement","ImageBitmap","textureNeedsGenerateMipmaps","supportsMips","generateMipmap","__maxMipLevel","LOG2E","getInternalFormat","glFormat","glType","internalFormat","filterFallback","onTextureDispose","textureProperties","__webglInit","deleteTexture","__webglTexture","deallocateTexture","isVideoTexture","onRenderTargetDispose","renderTargetProperties","deleteFramebuffer","__webglFramebuffer","__webglDepthbuffer","deleteRenderbuffer","deallocateRenderTarget","textureUnits","setTexture2D","slot","updateVideoTexture","__version","uploadTexture","setTextureCube","initTexture","pixelStorei","isCompressed","isCompressedTexture","cubeImage","glInternalFormat","setTextureParameters","mipmap","setTextureCubeDynamic","textureType","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","textureNeedsPowerOfTwo","isDepthTexture","setupFrameBufferTexture","framebuffer","attachment","textureTarget","bindFramebuffer","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","isMultisample","bindRenderbuffer","getRenderTargetSamples","renderbufferStorageMultisample","renderbufferStorage","framebufferRenderbuffer","setupDepthRenderbuffer","isCube","webglDepthTexture","setupDepthTexture","createRenderbuffer","warnedTexture2D","warnedTextureCube","textureUnit","resetTextureUnits","setupRenderTarget","createFramebuffer","__webglMultisampledFramebuffer","__webglColorRenderbuffer","__webglDepthRenderbuffer","updateRenderTargetMipmap","updateMultisampleRenderTarget","blitFramebuffer","$0147bee01cff6558$export$ddaebcad857649a8","HALF_FLOAT_OES","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","MIN_EXT","MAX_EXT","UNSIGNED_INT_24_8_WEBGL","$0147bee01cff6558$export$eb2fcfdbd7ba97d4","$0147bee01cff6558$export$56b937d9e5581166","isMeshDepthMaterial","isGroup","isArrayCamera","$0147bee01cff6558$var$geometry","matrixPosition","offsetMatrix","identityMatrix","$0147bee01cff6558$var$cameraLPos","$0147bee01cff6558$var$cameraRPos","$0147bee01cff6558$var$setProjectionFromUnion","cameraL","cameraR","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","$0147bee01cff6558$var$WebVRManager","renderWidth","renderHeight","device","frameData","poseTarget","controllers","standingMatrix","standingMatrixInverse","framebufferScaleFactor","referenceSpaceType","window","VRFrameData","onVRDisplayPresentChange","tempQuaternion","tempPosition","cameraVR","isPresenting","currentPixelRatio","currentSize","eyeParameters","getEyeParameters","getPixelRatio","setDrawingBufferSize","animation","triggers","findGamepad","gamepads","navigator","getGamepads","gamepad","startsWith","updateViewportFromBounds","bounds","getController","controller","getDevice","setDevice","setFramebufferScaleFactor","setReferenceSpaceType","setPoseTarget","getCamera","userHeight","depthNear","depthFar","getFrameData","stageParameters","sittingToStandingTransform","pose","poseObject","orientation","leftViewMatrix","rightViewMatrix","leftProjectionMatrix","rightProjectionMatrix","getLayers","layer","leftBounds","rightBounds","hasPosition","buttonId","buttons","pressed","updateControllers","getStandingMatrix","submitFrame","setFrameOfReferenceType","$0147bee01cff6558$var$WebXRManager","referenceSpace","inputSources","onSessionEvent","inputSource","onSessionEnd","setFramebuffer","onRequestReferenceSpace","updateCamera","setSession","updateRenderState","baseLayer","XRWebGLLayer","requestReferenceSpace","onAnimationFrameCallback","getViewerPose","views","getViewport","transform","inputPose","getPose","targetRaySpace","$0147bee01cff6558$export$f6cc00ef28d7cf97","parameters1","_alpha","_depth","_stencil","_antialias","antialias","_premultipliedAlpha","_preserveDrawingBuffer","preserveDrawingBuffer","_powerPreference","powerPreference","_failIfMajorPerformanceCaveat","failIfMajorPerformanceCaveat","currentRenderList","currentRenderState","domElement","sortObjects","toneMappingExposure","toneMappingWhitePoint","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","_isContextLost","_framebuffer","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentFramebuffer","_currentMaterialId","_currentGeometryProgram","_currentCamera","_currentArrayCamera","_currentViewport","_currentScissor","_currentScissorTest","_width","_height","_pixelRatio","_viewport","_scissor","_scissorTest","_clipping","_clippingEnabled","_localClippingEnabled","_vector3","getTargetPixelRatio","contextAttributes","xrCompatible","onContextLost","onContextRestore","rangeMin","rangeMax","initGLContext","xr","preventDefault","onMaterialDispose","releaseMaterialProgramReference","deallocateMaterial","getContextAttributes","forceContextLoss","loseContext","forceContextRestore","restoreContext","setPixelRatio","updateStyle","setViewport","getDrawingBufferSize","pixelRatio","getCurrentViewport","getScissor","setScissor","getScissorTest","boolean","bits","renderBufferImmediate","hasPositions","hasNormals","hasUvs","hasColors","programAttributes","positionArray","vertexAttribPointer","normalArray","uvArray","colorArray","setProgram","updateBuffers","rangeFactor","isInstancedBufferGeometry","materialDefaultAttributeValues","programAttribute","geometryAttribute","stride","isInstancedInterleavedBuffer","isInstancedBufferAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","setupVertexAttributes","dataCount","rangeStart","rangeCount","drawStart","drawEnd","drawCount","isLineSegments","isLineLoop","isSprite","compile","initMaterial","projectObject","isLOD","isImmediateRenderObject","renderObjects","camera2","object1","renderObjectImmediate","materialProperties","lightsStateVersion","programChange","numSupportedMorphTargets","numSupportedMorphNormals","progUniforms","uniformsList","useCache","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","isMeshPhongMaterial","isMeshStandardMaterial","uCamPos","cameraPosition","isMeshLambertMaterial","boneTexture","boneMatrices","boneTextureSize","isFog","density","refreshUniformsFog","refreshUniformsCommon","refreshUniformsLambert","isMeshToonMaterial","refreshUniformsPhong","refreshUniformsToon","isMeshPhysicalMaterial","refreshUniformsStandard","refreshUniformsPhysical","isMeshMatcapMaterial","refreshUniformsMatcap","refreshUniformsDepth","refreshUniformsDistance","isMeshNormalMaterial","refreshUniformsNormal","isLineBasicMaterial","refreshUniformsLine","isLineDashedMaterial","refreshUniformsDash","isPointsMaterial","refreshUniformsPoints","isSpriteMaterial","refreshUniformsSprites","isShadowMaterial","ltc_1","LTC_1","ltc_2","LTC_2","uvScaleMap","opaqueObjects","transparentObjects","readRenderTargetPixels","activeCubeFaceIndex","restore","textureFormat","checkFramebufferStatus","readPixels","copyFramebufferToTexture","level","copyTexImage2D","copyTextureToTexture","srcTexture","dstTexture","texSubImage2D","$0147bee01cff6558$export$6f1519f023b8d0f6","$0147bee01cff6558$export$3c890837b09508d4","$0147bee01cff6558$export$3d5cd879f108f53f","$0147bee01cff6558$export$920b6d07334599c7","interleavedBuffer","$0147bee01cff6558$export$5ec7dd1c6994bf8e","$0147bee01cff6558$export$3075603db8e6204c","$0147bee01cff6558$export$112e7237be0c5f30","levels","$0147bee01cff6558$export$b303577035157ecf","bindMode","bindMatrix","bindMatrixInverse","$0147bee01cff6558$export$8f31e4c4a37b8e9c","boneInverses","calculateInverses","$0147bee01cff6558$export$b127726e56765aa4","$0147bee01cff6558$export$fbaaa33907730a0c","linecap","linejoin","$0147bee01cff6558$export$17d680238e50603e","$0147bee01cff6558$export$ff1ed10fedfdd604","$0147bee01cff6558$export$f85a24d745e4f17d","$0147bee01cff6558$export$a178c45366ce5d6b","$0147bee01cff6558$export$1c787534cb11aa3e","$0147bee01cff6558$export$6e09d1edf8d5a25c","video","$0147bee01cff6558$export$3466bac9141a5cc4","$0147bee01cff6558$export$f7189e49152d1c13","$0147bee01cff6558$export$fc830aa069cc8c2f","$0147bee01cff6558$export$4b739da06d24892b","ol","edge","edges","$0147bee01cff6558$export$8f6f2b4b16d33f","func","slices","stacks","$0147bee01cff6558$export$c56b5b5c6f0a7fff","EPS","pu","pv","sliceCount","$0147bee01cff6558$export$60e57a7d3f20ff65","$0147bee01cff6558$export$38789b531813345c","radius1","detail1","vertexBuffer","uvBuffer","subdivideFace","cols","aj","bj","rows","pushVertex","getVertexByIndex","correctUV","azimuth","azimuth1","inclination","subdivide","appplyRadius","centroid","azi","correctUVs","correctSeam","generateUVs","$0147bee01cff6558$export$fb3f7adc68bd6e02","$0147bee01cff6558$export$369e08f62a796c65","$0147bee01cff6558$export$1954e2b809fe361e","$0147bee01cff6558$export$8e05fc91596f4752","$0147bee01cff6558$export$9567cc828c9535da","$0147bee01cff6558$export$731fd4feef063ea2","$0147bee01cff6558$export$c0babfeb8708fc9c","$0147bee01cff6558$export$37cd4e52cce48c4c","$0147bee01cff6558$export$7897d9d48904490c","tubularSegments","radialSegments","taper","bufferGeometry","$0147bee01cff6558$export$d97a193ce44e691b","tangents","binormals","frames","computeFrenetFrames","P","generateSegment","getPointAt","N","B","generateIndices","generateBufferData","$0147bee01cff6558$export$77e9bfadfb9ab8c8","tube","heightScale","$0147bee01cff6558$export$2b32466f4274fe5c","P1","P2","T","calculatePositionOnCurve","cu","su","quOverP","cs","$0147bee01cff6558$export$a2312a2a1fa56495","arc","$0147bee01cff6558$export$19d55f905fa4f2cb","isInterleavedBuffer","intersectPoint","worldScale","mvPosition1","alignedPosition","rotatedPosition","viewWorldMatrix","transformVertex","vertexPosition","mvPosition","_camera","addLevel","getObjectForDistance","normalizeSkinWeights","skinWeight","bone","isBone","getBoneByName","computeLineDistances","positionAttribute","linePrecision","localPrecision","localPrecisionSq","vStart","vEnd","interSegment","interRay","nbVertices","threshold","Points","localThreshold","localThresholdSq","testPoint","rayPointDistanceSq","distanceToRay","readyState","HAVE_CURRENT_DATA","isCanvasTexture","$0147bee01cff6558$var$Earcut","holeIndices","dim","invSize","hasHoles","outerLen","outerNode","$0147bee01cff6558$var$linkedList","steiner","$0147bee01cff6558$var$getLeftmost","$0147bee01cff6558$var$compareX","$0147bee01cff6558$var$eliminateHole","$0147bee01cff6558$var$filterPoints","$0147bee01cff6558$var$eliminateHoles","$0147bee01cff6558$var$earcutLinked","clockwise","sum","$0147bee01cff6558$var$signedArea","$0147bee01cff6558$var$insertNode","$0147bee01cff6558$var$equals","$0147bee01cff6558$var$removeNode","again","$0147bee01cff6558$var$area","ear","pass","$0147bee01cff6558$var$zOrder","prevZ","nextZ","tail","numMerges","pSize","qSize","inSize","$0147bee01cff6558$var$sortLinked","$0147bee01cff6558$var$indexCurve","$0147bee01cff6558$var$isEarHashed","$0147bee01cff6558$var$isEar","$0147bee01cff6558$var$cureLocalIntersections","$0147bee01cff6558$var$splitEarcut","$0147bee01cff6558$var$pointInTriangle","minTX","minTY","maxTX","maxTY","$0147bee01cff6558$var$intersects","$0147bee01cff6558$var$locallyInside","$0147bee01cff6558$var$isValidDiagonal","$0147bee01cff6558$var$splitPolygon","hole","hx","hy","mx","my","tanMin","$0147bee01cff6558$var$findHoleBridge","leftmost","px","py","$0147bee01cff6558$var$intersectsPolygon","inside","$0147bee01cff6558$var$middleInside","q2","$0147bee01cff6558$var$Node","an","bp","$0147bee01cff6558$export$96bdf6d9c66d7ba8","area","contour","isClockWise","pts","triangulateShape","holes","$0147bee01cff6558$var$removeDupEndPts","$0147bee01cff6558$var$addContour","holeIndex","$0147bee01cff6558$export$598697a1efa63ca7","$0147bee01cff6558$export$91836d01b9f75a58","verticesArray","i5","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","UVGenerator","$0147bee01cff6558$var$WorldUVGenerator","amount","extrudePts","splineTube","binormal","position2","ahole","hl","extrudeByPath","getSpacedPoints","shapePoints","extractPoints","reverse","contour1","scalePt2","pt","vec","bs","vert","vlen","flen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","sf","v_trans_lensq","direction_eq","contourMovements","j1","k1","oneHoleMovements","holesMovements","verticesMovements","sidewalls","layeroffset","sl","slen1","slen2","f4","f3","addVertex","nextIndex","generateTopUV","addUV","generateSideWallUV","vector2","buildLidFaces","buildSideFaces","$0147bee01cff6558$var$toJSON","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","$0147bee01cff6558$export$684b774b4473ba5f","text","$0147bee01cff6558$export$89b83bbad46fe613","font","isFont","generateShapes","$0147bee01cff6558$export$1b417fc3b307a251","phiStart","phiLength","thetaStart","thetaLength","$0147bee01cff6558$export$d5d06a966fec4192","thetaEnd","grid","verticesRow","uOffset","$0147bee01cff6558$export$68cb731f50f614af","innerRadius","outerRadius","thetaSegments","phiSegments","$0147bee01cff6558$export$ee8b85b34b7d9cad","segment","radiusStep","thetaSegmentLevel","$0147bee01cff6558$export$6d839803fcd1882c","segments","$0147bee01cff6558$export$dc3e1273c1dd9240","base","inverseSegments","n1","n2","$0147bee01cff6558$export$57a29a1c803e9065","$0147bee01cff6558$export$233afc324766bed8","i6","shapeHole","indexOffset","shapeVertices","shapeHoles","$0147bee01cff6558$var$toJSON$1","$0147bee01cff6558$export$4730b1542707547f","thresholdAngle","thresholdDot","sourceVertices","face1","face2","$0147bee01cff6558$export$68f745719dbe5198","radiusTop","radiusBottom","openEnded","$0147bee01cff6558$export$d4345c83207d7c68","indexArray","generateCap","centerIndexStart","centerIndexEnd","cosTheta","sinTheta","slope","indexRow","generateTorso","$0147bee01cff6558$export$a7a48974f285c9b3","$0147bee01cff6558$export$59d971120dc8b6e7","$0147bee01cff6558$export$d5c0e8d607467193","$0147bee01cff6558$export$3f74fe60decf7462","$0147bee01cff6558$var$Geometries","freeze","WireframeGeometry","ParametricGeometry","ParametricBufferGeometry","TetrahedronGeometry","TetrahedronBufferGeometry","OctahedronGeometry","OctahedronBufferGeometry","IcosahedronGeometry","IcosahedronBufferGeometry","DodecahedronGeometry","DodecahedronBufferGeometry","PolyhedronGeometry","PolyhedronBufferGeometry","TubeGeometry","TubeBufferGeometry","TorusKnotGeometry","TorusKnotBufferGeometry","TorusGeometry","TorusBufferGeometry","TextGeometry","TextBufferGeometry","SphereGeometry","SphereBufferGeometry","RingGeometry","RingBufferGeometry","PlaneGeometry","PlaneBufferGeometry","LatheGeometry","LatheBufferGeometry","ShapeGeometry","ShapeBufferGeometry","ExtrudeGeometry","ExtrudeBufferGeometry","EdgesGeometry","ConeGeometry","ConeBufferGeometry","CylinderGeometry","CylinderBufferGeometry","CircleGeometry","CircleBufferGeometry","BoxGeometry","BoxBufferGeometry","$0147bee01cff6558$export$e8564da406055a3","$0147bee01cff6558$export$21c421a2e1df9d22","$0147bee01cff6558$export$f2980790215acccd","STANDARD","$0147bee01cff6558$export$28d04986c4269c9f","PHYSICAL","$0147bee01cff6558$export$24c72f71cbaf0678","$0147bee01cff6558$export$df893cf97e765622","TOON","$0147bee01cff6558$export$bfe8c0a091f41ae7","$0147bee01cff6558$export$5023a9a8114806b8","$0147bee01cff6558$export$6f5fef6235ec12ee","MATCAP","$0147bee01cff6558$export$327886a3efaeaebe","$0147bee01cff6558$var$Materials","RawShaderMaterial","ShaderMaterial","Material","$0147bee01cff6558$export$7ee8caa573e71ad1","arraySlice","to","isTypedArray","convertArray","forceClone","ArrayBuffer","isView","DataView","getKeyframeOrder","times","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","$0147bee01cff6558$export$b558baee9c0f72d3","parameterPositions","sampleValues","sampleSize","resultBuffer","_cachedIndex","valueSize","$0147bee01cff6558$export$3646682e7a3959","_weightPrev","_offsetPrev","_weightNext","_offsetNext","$0147bee01cff6558$export$a8e6009059f51e1a","$0147bee01cff6558$export$fb9758ef7ef8d5cc","$0147bee01cff6558$export$b0e479f45b7006d6","interpolation","TimeBufferType","ValueBufferType","setInterpolation","DefaultInterpolation","$0147bee01cff6558$export$d3a344b98cf0b775","$0147bee01cff6558$export$83444c5d885347d8","$0147bee01cff6558$export$d45f0d1a4d9a9314","$0147bee01cff6558$export$2db1cfb7923d931e","$0147bee01cff6558$export$b8043f12b5aafbd7","$0147bee01cff6558$export$6ce41d4f3a8df9cd","$0147bee01cff6558$export$5ce2dcb4cc9f2bff","$0147bee01cff6558$export$d942c706bf23829c","tracks","resetDuration","$0147bee01cff6558$var$parseKeyframeTrack","json","trackType","typeName","toLowerCase","$0147bee01cff6558$var$getTrackTypeForValueTypeName","evaluate","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","afterEnd_","t1global","beforeStart_","mid","intervalChanged_","interpolate_","settings","DefaultSettings_","getSettings_","copySampleValue_","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","offset1","offset0","weight1","weight0","track","getInterpolation","ValueTypeName","InterpolantFactoryMethodDiscrete","getValueSize","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","factoryMethod","createInterpolant","timeOffset","timeScale","startTime","endTime","nKeys","validate","valid","prevTime","currTime","optimize","smoothInterpolation","writeIndex","keep","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","jsonTracks","frameTime","fps","clip","clipTracks","CreateFromMorphTargetSequence","morphTargetSequence","noLoop","numMorphTargets","findByName","objectOrClipArray","clipArray","animations","CreateClipsFromMorphTargetSequences","animationToMorphTargets","pattern","parts","animationMorphTargets","clips","parseAnimation","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","hierarchy","animationKeys1","morphTargetNames","morphTargetName","times1","values1","animationKey","boneName","$0147bee01cff6558$export$94affb487e701bf2","files","file","$0147bee01cff6558$export$99cc795e99919eed","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","onStart","itemStart","itemEnd","itemError","resolveURL","setURLModifier","$0147bee01cff6558$export$b033c3f9a95c6a16","$0147bee01cff6558$var$loading","$0147bee01cff6558$export$98435a25b5cf7b2b","manager","$0147bee01cff6558$export$29711c7e14f61db","$0147bee01cff6558$export$bd73ce947a280350","_parser","$0147bee01cff6558$export$792d8a18f2c55855","$0147bee01cff6558$export$8905ce1c7a2464a1","$0147bee01cff6558$export$2ec114afc2cf6308","$0147bee01cff6558$export$fd1bfc71f64c538c","$0147bee01cff6558$export$b0e83c3ef8d2db1","arcLengthDivisions","$0147bee01cff6558$export$3f87a931616cde04","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","$0147bee01cff6558$export$b1eedc9aab6300e8","aRadius","$0147bee01cff6558$var$CubicPoly","c0","initCatmullRom","x3","tension","initNonuniformCatmullRom","dt0","dt1","dt2","t2","calc","load","cached","dataUriRegexResult","mimeType","isBase64","decodeURIComponent","atob","response","responseType","charCodeAt","Blob","parser","DOMParser","parseFromString","request","XMLHttpRequest","header","open","callbacks","withCredentials","overrideMimeType","requestHeader","setRequestHeader","send","setPath","setResponseType","setWithCredentials","setMimeType","loader","loadTexture","texDatas","loaded","mipmapCount","isCubemap","texData","crossOrigin","onImageLoad","onImageError","substr","setCrossOrigin","urls","isJPEG","search","getPoint","optionalTarget","getUtoTmapping","getPoints","divisions","getLength","lengths","getLengths","cacheArcLengths","updateArcLengths","targetArcLength","arcLengths","comparison","lengthBefore","getTangent","pt1","getTangentAt","mat","MAX_VALUE","tz","fromJSON","isEllipseCurve","twoPi","deltaAngle","samePoints","isArcCurve","$0147bee01cff6558$var$tmp","$0147bee01cff6558$var$px","$0147bee01cff6558$var$py","$0147bee01cff6558$var$pz","$0147bee01cff6558$export$b9146b27c24b744c","curveType","$0147bee01cff6558$var$CatmullRom","$0147bee01cff6558$var$QuadraticBezier","$0147bee01cff6558$var$QuadraticBezierP0","$0147bee01cff6558$var$QuadraticBezierP1","$0147bee01cff6558$var$QuadraticBezierP2","$0147bee01cff6558$var$CubicBezier","$0147bee01cff6558$var$CubicBezierP0","$0147bee01cff6558$var$CubicBezierP1","$0147bee01cff6558$var$CubicBezierP2","$0147bee01cff6558$var$CubicBezierP3","$0147bee01cff6558$export$e36650d36468bb39","v3","$0147bee01cff6558$export$13d5f1c9525f246c","$0147bee01cff6558$export$ab2e07e76531a47e","$0147bee01cff6558$export$1fdfd9d9cf487600","$0147bee01cff6558$export$5938c4ee491a43ad","$0147bee01cff6558$export$bf3f4c7e459f90fc","$0147bee01cff6558$export$d3bdd77da77afc1b","isCatmullRomCurve3","intPoint","weight","isCubicBezierCurve","isCubicBezierCurve3","isLineCurve","isLineCurve3","isQuadraticBezierCurve","isQuadraticBezierCurve3","isSplineCurve","$0147bee01cff6558$var$Curves","ArcCurve","CatmullRomCurve3","CubicBezierCurve","CubicBezierCurve3","EllipseCurve","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","$0147bee01cff6558$export$4aaf9b66af1bbf2c","curves","autoClose","$0147bee01cff6558$export$4b2950bdac9b6ee9","currentPoint","$0147bee01cff6558$export$6428a7f2611ef1fa","$0147bee01cff6558$export$6ecadb6ed240d696","$0147bee01cff6558$export$8d474f55edbb9624","$0147bee01cff6558$export$62dfae6aea7122f9","$0147bee01cff6558$export$ce3cca1bb81001ce","$0147bee01cff6558$export$81495cbb73897362","power","$0147bee01cff6558$export$4c9c1cb3f0b6f455","$0147bee01cff6558$export$9ebf355ee4ed261b","$0147bee01cff6558$export$dff95a04f9366e71","$0147bee01cff6558$export$3fea33cc9972c868","$0147bee01cff6558$export$af279bfef9ec2c96","$0147bee01cff6558$export$61db2d908bbd2429","$0147bee01cff6558$export$3bd6d323353dcf96","curve","closePath","startPoint","endPoint","curveLengths","getCurveLengths","segmentLength","lens","cacheLengths","sums","resolution","moveTo","lineTo","quadraticCurveTo","aCPx","aCPy","bezierCurveTo","aCP1x","aCP1y","aCP2x","aCP2y","splineThru","absarc","absellipse","ellipse","firstPoint","lastPoint","getPointsHoles","holesPts","isOrthographicCamera","zoomW","zoomH","scaleW","scaleH","getTexture","name1","shading","setTextures","$0147bee01cff6558$export$b5d2dc08d867e41a","decodeText","TextDecoder","decode","fromCharCode","escape","extractUrlBase","lastIndexOf","$0147bee01cff6558$export$231f009cbe414146","$0147bee01cff6558$export$32ea87a8b54d744a","$0147bee01cff6558$export$dc275bb96327833a","typedArray","$0147bee01cff6558$var$TYPED_ARRAYS","bufferAttribute","drawcalls","offsets","$0147bee01cff6558$export$40110c8505c5ad19","resourcePath","setResourcePath","parseShape","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","parseAnimations","bufferGeometryLoader","details","geometryShapes","THREE","LegacyJSONLoader","loadImage","url1","currentUrl","parseConstant","$0147bee01cff6558$var$TEXTURE_MAPPING","$0147bee01cff6558$var$TEXTURE_WRAPPING","$0147bee01cff6558$var$TEXTURE_FILTER","getGeometry","getMaterial","i7","l2","BlendingMode","textureLoader","materialLoader","$0147bee01cff6558$var$context","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","SphericalReflectionMapping","CubeUVReflectionMapping","CubeUVRefractionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipMapNearestFilter","NearestMipMapLinearFilter","LinearFilter","LinearMipMapNearestFilter","LinearMipMapLinearFilter","$0147bee01cff6558$export$52286b55c4a9b51f","createImageBitmap","fetch","$0147bee01cff6558$export$148534a3c727230b","subPaths","currentPath","$0147bee01cff6558$export$89abf52a030e56ee","$0147bee01cff6558$var$createPath","char","glyph","glyphs","cpx","cpy","cpx1","cpy1","cpx2","cpy2","outline","_cachedOutline","ha","$0147bee01cff6558$export$812303d6cad736b3","$0147bee01cff6558$export$3b0d6d7590275603","setOptions","res","blob","imageBitmap","catch","toShapes","isCCW","noHoles","toShapesNoHoles","inSubpaths","tmpPath","tmpShape","isPointInsidePolygon","inPolygon","polyLen","edgeLowPt","edgeHighPt","edgeDx","edgeDy","perpEdge","solid","tmpPath1","tmpShape1","shapes1","holesFirst","tmpPoints","tmpHoles","betterShapeHoles","newShapes","newShapeHoles","mainIdx","i8","l3","ambiguous","toChange","sIdx","sLen","sho","hIdx","ho","hole_unassigned","s2Idx","froms","tos","paths","chars","line_height","yMax","yMin","underlineThickness","ret","$0147bee01cff6558$var$createPaths","substring","Handlers","handlers","regex","onLoadStart","onLoadProgress","onLoadComplete","initMaterials","texturePath","createMaterial","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","fullPath","mapDiffuseRepeat","mapDiffuseOffset","mapDiffuseWrap","mapDiffuseAnisotropy","mapEmissiveRepeat","mapEmissiveOffset","mapEmissiveWrap","mapEmissiveAnisotropy","mapLightRepeat","mapLightOffset","mapLightWrap","mapLightAnisotropy","mapAORepeat","mapAOOffset","mapAOWrap","mapAOAnisotropy","mapBumpRepeat","mapBumpOffset","mapBumpWrap","mapBumpAnisotropy","mapNormalRepeat","mapNormalOffset","mapNormalWrap","mapNormalAnisotropy","mapSpecularRepeat","mapSpecularOffset","mapSpecularWrap","mapSpecularAnisotropy","mapMetalnessRepeat","mapMetalnessOffset","mapMetalnessWrap","mapMetalnessAnisotropy","mapRoughnessRepeat","mapRoughnessOffset","mapRoughnessWrap","mapRoughnessAnisotropy","mapAlphaRepeat","mapAlphaOffset","mapAlphaWrap","mapAlphaAnisotropy","eyeSep","eyeRight","eyeLeft","$0147bee01cff6558$export$fcbc63750ec2a81f","AudioContext","webkitAudioContext","$0147bee01cff6558$export$d8d5fccfbf47714e","$0147bee01cff6558$export$ba61ce607e1f405a","$0147bee01cff6558$export$e7ef036e309b38d2","$0147bee01cff6558$export$2f22dadc8bc42820","sky","ground","$0147bee01cff6558$export$afe310a21c86023d","$0147bee01cff6558$export$bc7f73a1065bee0c","$0147bee01cff6558$export$9735c82c4bae3302","autoStart","oldTime","elapsedTime","running","$0147bee01cff6558$export$8a1b810c6fde8951","gain","createGain","timeDelta","$0147bee01cff6558$export$153755f98d9861de","getInput","autoplay","detune","loop","playbackRate","isPlaying","hasPlaybackControl","sourceType","filters","$0147bee01cff6558$export$4b3e397ef1832507","panner","createPanner","panningModel","$0147bee01cff6558$export$d47da1ef3d382827","audio","fftSize","analyser","createAnalyser","frequencyBinCount","getOutput","$0147bee01cff6558$export$dfe0af1ca1acb78a","binding","mixFunction","_slerp","_select","_lerp","_mixBufferRegion","cumulativeWeight","useCount","referenceCount","bufferCopy","decodeAudioData","audioBuffer","isSphericalHarmonics3","getAt","coeff","addScale","getIrradianceAt","getBasisAt","shBasis","isHemisphereLightProbe","isAmbientLightProbe","xmin","xmax","eyeSepOnProjection","ymax","performance","Date","getElapsedTime","getDelta","newTime","removeFilter","disconnect","getFilter","setFilter","getMasterVolume","setMasterVolume","setTargetAtTime","currentTime","clock","positionX","linearRampToValueAtTime","positionY","positionZ","forwardX","forwardY","forwardZ","upX","upY","upZ","setOrientation","setNodeSource","audioNode","setMediaElementSource","mediaElement","createMediaElementSource","setBuffer","play","createBufferSource","onended","onEnded","setDetune","setPlaybackRate","pause","getFilters","setFilters","getDetune","getPlaybackRate","getLoop","setLoop","getVolume","setVolume","getRefDistance","refDistance","setRefDistance","getRolloffFactor","rolloffFactor","setRolloffFactor","getDistanceModel","distanceModel","setDistanceModel","getMaxDistance","maxDistance","setMaxDistance","setDirectionalCone","coneInnerAngle","coneOuterAngle","coneOuterGain","orientationX","orientationY","orientationZ","getFrequencyData","getByteFrequencyData","getAverageFrequency","accumulate","accuIndex","currentWeight","mix","originalValueOffset","saveOriginalState","restoreOriginalState","wordChar","wordCharOrDot","directoryRe","nodeRe","objectRe","propertyRe","trackRe","supportedObjectNames","reservedRe","startP","startEnd","$0147bee01cff6558$var$lineGeometry","$0147bee01cff6558$var$coneGeometry","$0147bee01cff6558$var$RESERVED_CHARS_RE","$0147bee01cff6558$var$Composite","targetGroup","optionalParsedPath","parsedPath","$0147bee01cff6558$export$7bf70fcf9f891893","parseTrackName","_targetGroup","_bindings","subscribe_","rootNode","findNode","nodeName","$0147bee01cff6558$export$30619c2afd3f34db","nCachedObjects_","_indicesByUUID","_paths","_parsedPaths","_bindingsIndicesByPath","stats","total","inUse","bindingsPerObject","$0147bee01cff6558$var$AnimationAction","mixer","localRoot","_mixer","_clip","_localRoot","nTracks","interpolants","interpolantSettings","interpolant","_interpolantSettings","_interpolants","_propertyBindings","_cacheIndex","_byClipCacheIndex","_timeScaleInterpolant","_weightInterpolant","_loopCount","_startTime","_effectiveTimeScale","_effectiveWeight","repetitions","paused","clampWhenFinished","zeroSlopeAtStart","zeroSlopeAtEnd","$0147bee01cff6558$export$fbd77e5aefaa0102","root","_root","_initMemoryManager","_accuIndex","$0147bee01cff6558$export$2947cebfe91c02f8","$0147bee01cff6558$export$25ec0e1af1389358","$0147bee01cff6558$export$8b7aaceff00bd2f","Mesh","Line","LOD","Sprite","PointCloud","$0147bee01cff6558$var$ascSort","$0147bee01cff6558$var$intersectObject","$0147bee01cff6558$export$d712cd887b4a00f7","$0147bee01cff6558$export$287165bb2177f4fd","$0147bee01cff6558$export$60f553fa130f08b0","$0147bee01cff6558$export$e0ba6359f1954fd3","$0147bee01cff6558$export$960665a8431ecff6","$0147bee01cff6558$export$f867298178fd05ef","nNormals","objGeometry","$0147bee01cff6558$export$4b14638ffdd81e68","cone","$0147bee01cff6558$var$getBoneList","boneList","$0147bee01cff6558$export$5277df3c9e732259","$0147bee01cff6558$export$9a9291685b9e4023","sphereSize","$0147bee01cff6558$export$f018feef8fd90e4b","$0147bee01cff6558$export$8dca15f13f4f8172","$0147bee01cff6558$export$eb19a11417cab300","$0147bee01cff6558$export$3875d39926561055","$0147bee01cff6558$export$361430a10f533cd3","radials","circles","$0147bee01cff6558$export$1ef8a6e9da5634fa","divisionsInnerAngle","divisionsOuterAngle","materialInnerAngle","materialOuterAngle","$0147bee01cff6558$export$55d6e45f87fd74a0","$0147bee01cff6558$export$f8e434dc14203e7d","lightPlane","targetLine","$0147bee01cff6558$export$ed8e93f853cd795","pointMap","colorFrustum","colorCone","colorUp","colorTarget","colorCross","addLine","addPoint","$0147bee01cff6558$export$38a664cc862a6a9d","$0147bee01cff6558$export$ce39f4bb96c9a290","$0147bee01cff6558$export$a34fe8156c66e5d7","$0147bee01cff6558$export$a3008e7bd8d2cbe7","headLength","headWidth","setDirection","$0147bee01cff6558$export$6c8303f35b8578fd","$0147bee01cff6558$export$3572c7a41c6256b4","firstValidIndex","bindings","unbind","Composite","isAnimationObjectGroup","sanitizeNodeName","RegExp","matches","results","objectName","objectIndex","propertyIndex","lastDot","searchNodeSubtree","childNode","subTreeNode","_getValue_unavailable","_setValue_unavailable","BindingType","Direct","EntireArray","ArrayElement","HasFromToArray","Versioning","None","NeedsUpdate","MatrixWorldNeedsUpdate","GetterByBindingType","resolvedProperty","SetterByBindingTypeAndVersioning","targetObject","dest","targetArray","sourceArray","nodeProperty","versioning","bindingType","_getValue_unbound","_setValue_unbound","nObjects","nCachedObjects","indicesByUUID","parsedPaths","nBindings","knownObject","firstActiveIndex","lastCachedObject","bindingsForPath","lastCached","lastCachedIndex","firstActiveObject","firstActive","uncache","lastObject","indicesByPath","unsubscribe_","lastBindingsIndex","lastBindings","_activateAction","_deactivateAction","stopFading","stopWarping","isRunning","_isActiveAction","isScheduled","startAt","setEffectiveWeight","getEffectiveWeight","fadeIn","_scheduleFading","fadeOut","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","halt","startTimeScale","endTimeScale","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","getRoot","_update","deltaTime","timeDirection","timeRunning","_updateTimeScale","clipTime","_updateTime","_updateWeight","propertyMixers","interpolantValue","loopCount","pingPong","_setEndings","handle_stop","loopDelta","atStart","atEnd","weightNow","weightThen","_bindAction","prototypeAction","rootUuid","bindingsByRoot","_bindingsByRootAndName","bindingsByName","_addInactiveBinding","clipUuid","actionsForClip","_actionsByClip","knownActions","_addInactiveAction","_lendBinding","_lendAction","_takeBackBinding","_takeBackAction","_actions","_nActiveActions","_nActiveBindings","_controlInterpolants","_nActiveControlInterpolants","controlInterpolants","actionsByClip","actionByRoot","_removeInactiveAction","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","_removeInactiveBindingsForAction","_removeInactiveBinding","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","_controlInterpolantsResultBuffer","__cacheIndex","lastActiveInterpolant","clipAction","optionalRoot","clipObject","existingAction","newAction","stopAllAction","nActions","uncacheClip","actionsToRemove","uncacheRoot","uncacheAction","setFromCamera","coords","intersectObject","intersectObjects","other","makeSafe","setFromCartesianCoords","distanceSq","closestPointToPointParameter","clampToLine","startEnd2","objPos","objNorm","coneLength","coneWidth","boneMatrix","matrixWorldInv","halfConeInnerAngle","halfConeOuterAngle","setPoint","setColor","$0147bee01cff6558$export$195910b613d3dbcb","$0147bee01cff6558$export$c8a71586e494fb81","$0147bee01cff6558$export$8f0d8c869214e38a","$0147bee01cff6558$export$4f1842f7cdf61f78","$0147bee01cff6558$export$5c812f854e08d33d","$0147bee01cff6558$export$c36c68baa13912a5","$0147bee01cff6558$export$f219b6a0e4bb0b6d","$0147bee01cff6558$export$29121d9ccd2f757a","$0147bee01cff6558$export$ffa02580217a1c8","$0147bee01cff6558$export$cb1306c614c86e6b","$0147bee01cff6558$export$3e8a3cc8713efbec","$0147bee01cff6558$export$189ab5ea9d161e81","$0147bee01cff6558$export$e0ae4f0a1804ea11","$0147bee01cff6558$export$a0d192e03a5b32f5","$0147bee01cff6558$export$8ca743ab36552bfa","$0147bee01cff6558$export$5d9757676aad9dab","$0147bee01cff6558$export$ed102ffd14092320","$0147bee01cff6558$export$6acc479034658f15","$0147bee01cff6558$export$53474877d6e539b9","$0147bee01cff6558$export$377af6eadc8006c3","$0147bee01cff6558$export$b9212d1a67b6f081","$0147bee01cff6558$export$703c8a8f2bce6feb","$0147bee01cff6558$export$3a6f1dabebed6d2c","$0147bee01cff6558$export$ecd695042d0847db","$0147bee01cff6558$export$46c1eaab6b8d1e23","$0147bee01cff6558$export$3c24c67720a2146c","$0147bee01cff6558$export$e341a90264c62d4c","$0147bee01cff6558$export$72d033539c529f13","$0147bee01cff6558$export$c8b77178c5db4e0d","$0147bee01cff6558$export$58c7c1107fc658f9","createPointsGeometry","createGeometry","createSpacedPointsGeometry","fromPoints","initFromArray","getControlPointsArray","reparametrizeByArcLength","setColors","setTexturePath","isIntersectionBox","isIntersectionSphere","random16","nearestPowerOfTwo","nextPowerOfTwo","flattenToArrayOffset","multiplyVector3","multiplyVector3Array","applyToBuffer","applyToVector3Array","extractPosition","getPosition","multiplyToArray","multiplyVector4","rotateAxis","crossVector","rotateByAxis","makeFrustum","isIntersectionLine","isIntersectionPlane","barycoordFromPoint","midpoint","extractAllPoints","extrude","makeGeometry","fromAttribute","distanceToManhattan","lengthManhattan","setEulerFromRotationMatrix","setEulerFromQuaternion","getPositionFromMatrix","getScaleFromMatrix","getColumnFromMatrix","applyProjection","computeTangents","getChildByName","renderDepth","getWorldRotation","eulerOrder","useQuaternion","initBones","setLens","onlyShadow","shadowCameraFov","shadowCameraLeft","shadowCameraRight","shadowCameraTop","shadowCameraBottom","shadowCameraVisible","shadowDarkness","shadowMapWidth","shadowMapHeight","copyIndicesArray","addIndex","addDrawCall","clearDrawCalls","computeOffsets","getArrays","addShapeList","wrapAround","overdraw","wrapRGB","metal","clearTarget","animate","getCurrentRenderTarget","getPrecision","resetGLState","supportsFloatTextures","supportsHalfFloatTextures","supportsStandardDerivatives","supportsCompressedTextureS3TC","supportsCompressedTexturePVRTC","supportsBlendMinMax","supportsInstancedArrays","enableScissorTest","addPrePlugin","addPostPlugin","updateShadowMap","setFaceCulling","allocTextureUnit","setTexture","shadowMapCullFace","renderReverseSided","renderSingleSided","standing","getData","updateCubeMap","$0147bee01cff6558$export$348f0471ad472467","geometry1","$0147bee01cff6558$export$7adc20298958481a","$0147bee01cff6558$export$8e85bca5826c4696","loadTextureCube","loadCompressedTexture","loadCompressedTextureCube","$0147bee01cff6558$export$a8351e0de8b3fd78","createMultiMaterialObject","detach","$0147bee01cff6558$export$3f909fba4d49fe3d","$b2b00561c519b95c$var$_GLTFLoader","GLTFLoader","$6OvZu","DefaultLoadingManager","dracoLoader","ddsLoader","GLTFRegistry","removeAll","LoaderUtils","_onError","FileLoader","gltf","setDRACOLoader","setDDSLoader","content","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","asset","extensionsUsed","extensionName","extensionsRequired","KHR_LIGHTS_PUNCTUAL","GLTFLightsExtension","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS","GLTFMaterialsPbrSpecularGlossinessExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","MSFT_TEXTURE_DDS","GLTFTextureDDSExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","GLTFParser","lightDefs","loadLight","lightIndex","lightNode","lightDef","Color","DirectionalLight","PointLight","SpotLight","innerConeAngle","outerConeAngle","getMaterialType","extendParams","materialParams","materialDef","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","all","BINARY_EXTENSION_CHUNK_TYPES","body","headerView","magic","getUint32","chunkView","chunkIndex","byteLength","chunkLength","chunkType","contentArray","byteOffset","specularGlossinessParams","pbrSpecularGlossiness","ShaderLib","UniformsUtils","specularMapParsFragmentChunk","glossinessMapParsFragmentChunk","specularMapFragmentChunk","glossinessMapFragmentChunk","lightPhysicalFragmentChunk","glossiness","glossinessMap","diffuseFactor","diffuseTexture","glossinessFactor","specularFactor","specularGlossinessTexture","specGlossMapDef","isGLTFSpecularGlossinessMaterial","cloneMaterial","refreshUniforms","USE_GLOSSINESSMAP","USE_ROUGHNESSMAP","GLTFCubicSplineInterpolant","Interpolant","decodePrimitive","primitive","bufferViewIndex","bufferView","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","attributeName","threeAttributeName","ATTRIBUTES","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","getDependency","decodeDracoFile","extendTexture","texCoord","stride2","stride3","td","m0","defaultMaterial","WEBGL_CONSTANTS","WEBGL_FILTERS","WEBGL_WRAPPINGS","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","weights","INTERPOLATION","CUBICSPLINE","LINEAR","InterpolateLinear","STEP","InterpolateDiscrete","ALPHA_MODES","MIME_TYPE_FORMATS","RGBAFormat","RGBFormat","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfExtensions","assignExtrasToUserData","gltfDef","extras","meshDef","targetNames","createAttributesKey","attributesKey","cloneBufferAttribute","BufferAttribute","primitiveCache","TextureLoader","fileLoader","addPrimitiveAttributes","primitiveDef","assignAttributeAccessor","accessorIndex","accessor","gltfAttributeName","accessor1","targets","hasMorphPosition","hasMorphNormal","il1","pendingPositionAccessors","pendingNormalAccessors","pendingAccessor","morphPositions","normalAttribute","addMorphTargets","markDefs","getDependencies","dependencies","scenes","nodeDefs","nodes","skinDefs","skins","meshDefs","meshes","meshReferences","meshUses","skinIndex","skinLength","joints","nodeIndex","nodeLength","nodeDef","skin","cacheKey","dependency","loadScene","loadNode","loadMesh","loadAccessor","loadBufferView","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","uri","bufferViewDef","bufferViews","sparse","pendingBufferViews","TypedArray","elementBytes","itemBytes","byteStride","ibCacheKey","ib","InterleavedBuffer","InterleavedBufferAttribute","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","textureIndex","URL","webkitURL","textureDef","textureExtensions","sourceURI1","isObjectURL","createObjectURL","sourceURI","Loader","revokeObjectURL","sampler","samplers","mapName","mapDef","assignFinalMaterial","useVertexTangents","useVertexColors","useFlatShading","useMorphTargets","useMorphNormals","pointsMaterial","lineMaterial","VertexColors","materialType","materialExtensions","sgExtension","kmuExtension","metallicFactor","roughnessFactor","metallicRoughnessTexture","DoubleSide","alphaMode","alphaCutoff","normalTexture","Vector2","occlusionTexture","strength","emissiveFactor","emissiveTexture","sRGBEncoding","loadGeometries","primitives","createDracoPrimitive","dracoExtension","geometryPromise","primitive1","BufferGeometry","meshIndex","il2","FrontSide","originalMaterials","SkinnedMesh","TriangleStripDrawMode","TriangleFanDrawMode","LineSegments","LineLoop","Group","cameraIndex","cameraDef","PerspectiveCamera","yfov","aspectRatio","znear","zfar","OrthographicCamera","xmag","ymag","skinDef","skinEntry","inverseBindMatrices","animationIndex","animationDef","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","il3","channels","inputAccessors","outputAccessors","inputAccessor","outputAccessor","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","targetName","outputArray","scaled","isInterpolantFactoryMethodGLTFCubicSpline","AnimationClip","Bone","instanceNum","Object3D","PropertyBinding","Matrix4","buildNodeHierachy","nodeId","parentObject","pendingJoints","jointNodes","jointNode","Skeleton","sceneIndex","sceneDef","Scene","nodeIds","module","exports","default","$598bc516d9dcc101$export$a5c7b93649eaf8f8","Idle","$74ude","gestureData","Explain_left","Think_I","Arms_back","Mark_left","Thumbup_right","Explain_both","$598bc516d9dcc101$var$SIZE","$598bc516d9dcc101$var$MASK","$598bc516d9dcc101$var$NOT_SET","$598bc516d9dcc101$var$SetRef","ref","$598bc516d9dcc101$var$OwnerID","$598bc516d9dcc101$var$ensureSize","iter","__iterate","$598bc516d9dcc101$var$returnTrue","$598bc516d9dcc101$var$wrapIndex","uint32Index","NaN","$598bc516d9dcc101$var$wholeSlice","begin","$598bc516d9dcc101$var$isNeg","$598bc516d9dcc101$var$resolveBegin","$598bc516d9dcc101$var$resolveIndex","$598bc516d9dcc101$var$resolveEnd","defaultIndex","$598bc516d9dcc101$export$cea7aa84e978eba5","maybeCollection","$598bc516d9dcc101$var$IS_COLLECTION_SYMBOL","$598bc516d9dcc101$export$66d51e2080425364","maybeKeyed","$598bc516d9dcc101$var$IS_KEYED_SYMBOL","$598bc516d9dcc101$export$3bfb5e72e8bc6e09","maybeIndexed","$598bc516d9dcc101$var$IS_INDEXED_SYMBOL","$598bc516d9dcc101$export$9c3ce8f7b89c6d66","maybeAssociative","$598bc516d9dcc101$export$fb8073518f34e6ec","$598bc516d9dcc101$export$4802c350533dc67e","$598bc516d9dcc101$var$KeyedCollection","KeyedCollection","$598bc516d9dcc101$var$KeyedSeq","$598bc516d9dcc101$var$IndexedCollection","IndexedCollection","$598bc516d9dcc101$var$IndexedSeq","$598bc516d9dcc101$var$SetCollection","SetCollection","$598bc516d9dcc101$var$SetSeq","Keyed","Indexed","Set","$598bc516d9dcc101$var$isSeq","maybeSeq","$598bc516d9dcc101$var$IS_SEQ_SYMBOL","$598bc516d9dcc101$var$isRecord","maybeRecord","$598bc516d9dcc101$var$IS_RECORD_SYMBOL","$598bc516d9dcc101$export$f8647edfbac13b4f","maybeImmutable","$598bc516d9dcc101$export$e670b9b76442ef6c","maybeOrdered","$598bc516d9dcc101$var$IS_ORDERED_SYMBOL","$598bc516d9dcc101$var$REAL_ITERATOR_SYMBOL","$598bc516d9dcc101$var$FAUX_ITERATOR_SYMBOL","$598bc516d9dcc101$var$ITERATOR_SYMBOL","$598bc516d9dcc101$var$Iterator","$598bc516d9dcc101$var$iteratorValue","iteratorResult","$598bc516d9dcc101$var$iteratorDone","$598bc516d9dcc101$var$hasIterator","maybeIterable","$598bc516d9dcc101$var$getIteratorFn","$598bc516d9dcc101$var$isIterator","maybeIterator","$598bc516d9dcc101$var$getIterator","iteratorFn","KEYS","VALUES","ENTRIES","inspect","toSource","$598bc516d9dcc101$var$hasOwnProperty","$598bc516d9dcc101$var$isArrayLike","Collection$$1","$598bc516d9dcc101$var$emptySequence","toSeq","$598bc516d9dcc101$var$maybeIndexedSeqFromValue","$598bc516d9dcc101$var$ObjectSeq","$598bc516d9dcc101$var$seqFromValue","__toString","cacheResult","_cache","__iterateUncached","entrySeq","entry","__iterator","__iteratorUncached","KeyedSeq","toKeyedSeq","fromEntrySeq","$598bc516d9dcc101$var$keyedSeqFromValue","IndexedSeq","toIndexedSeq","$598bc516d9dcc101$var$indexedSeqFromValue","SetSeq","toSetSeq","isSeq","$598bc516d9dcc101$var$ArraySeq","ArraySeq","_array","notSetValue","has","ObjectSeq","_object","_keys","$598bc516d9dcc101$var$EMPTY_SEQ","$598bc516d9dcc101$var$CollectionSeq","CollectionSeq","collection","_collection","iterations","$598bc516d9dcc101$var$isMap","maybeMap","$598bc516d9dcc101$var$IS_MAP_SYMBOL","$598bc516d9dcc101$var$isOrderedMap","maybeOrderedMap","$598bc516d9dcc101$export$b24f7407c77e5bd","maybeValue","hashCode","$598bc516d9dcc101$export$226b3eccf92c9ed9","valueA","valueB","$598bc516d9dcc101$var$imul","imul","$598bc516d9dcc101$var$smi","i32","$598bc516d9dcc101$var$defaultValueOf","$598bc516d9dcc101$export$d6af199866bfb566","$598bc516d9dcc101$var$hashNumber","$598bc516d9dcc101$var$STRING_HASH_CACHE_MIN_STRLEN","hashed","$598bc516d9dcc101$var$stringHashCache","$598bc516d9dcc101$var$hashString","$598bc516d9dcc101$var$STRING_HASH_CACHE_SIZE","$598bc516d9dcc101$var$STRING_HASH_CACHE_MAX_SIZE","$598bc516d9dcc101$var$cachedHashString","$598bc516d9dcc101$var$usingWeakMap","$598bc516d9dcc101$var$weakMap","$598bc516d9dcc101$var$UID_HASH_KEY","$598bc516d9dcc101$var$canDefineProperty","propertyIsEnumerable","nodeType","uniqueID","documentElement","$598bc516d9dcc101$var$getIENodeHash","$598bc516d9dcc101$var$objHashUID","$598bc516d9dcc101$var$isExtensible","$598bc516d9dcc101$var$hashJSObj","isExtensible","$598bc516d9dcc101$var$ToKeyedSequence","KeyedSeq$$1","ToKeyedSequence","indexed","useKeys","_iter","_useKeys","valueSeq","this$1","reversedSequence","$598bc516d9dcc101$var$reverseFactory","mapper","mappedSequence","$598bc516d9dcc101$var$mapFactory","$598bc516d9dcc101$var$ToIndexedSequence","IndexedSeq$$1","ToIndexedSequence","includes","$598bc516d9dcc101$var$ToSetSequence","SetSeq$$1","ToSetSequence","$598bc516d9dcc101$var$FromEntriesSequence","FromEntriesSequence","entries","$598bc516d9dcc101$var$validateEntry","indexedCollection","$598bc516d9dcc101$var$flipFactory","flipSequence","$598bc516d9dcc101$var$makeSequence","flip","$598bc516d9dcc101$var$cacheResultThrough","this$11","$598bc516d9dcc101$var$filterFactory","filterSequence","$598bc516d9dcc101$var$sliceFactory","originalSize","resolvedBegin","resolvedEnd","sliceSize","resolvedSize","sliceSeq","skipped","isSkipping","$598bc516d9dcc101$var$skipWhileFactory","skipSequence","skipping","$598bc516d9dcc101$var$concatFactory","isKeyedCollection","iters","singleton","concatSeq","flatten","$598bc516d9dcc101$var$flattenFactory","flatSequence","stopped","flatDeep","currentDepth","$598bc516d9dcc101$var$sortFactory","comparator","$598bc516d9dcc101$var$defaultComparator","$598bc516d9dcc101$var$maxFactory","$598bc516d9dcc101$var$maxCompare","comp","$598bc516d9dcc101$var$zipWithFactory","keyIter","zipper","zipAll","zipSequence","sizes","isDone","every","some","$598bc516d9dcc101$var$reify","$598bc516d9dcc101$var$collectionClass","$598bc516d9dcc101$var$arrCopy","arr","newArr","$598bc516d9dcc101$var$invariant","$598bc516d9dcc101$var$assertNotInfinite","$598bc516d9dcc101$var$coerceKeyPath","keyPath","$598bc516d9dcc101$var$isPlainObj","$598bc516d9dcc101$var$isDataStructure","$598bc516d9dcc101$var$quoteString","_ignoreError","$598bc516d9dcc101$export$a4f4bb6b1453fff5","$598bc516d9dcc101$export$3988ae62b71be9a3","$598bc516d9dcc101$var$shallowCopy","$598bc516d9dcc101$export$cd7f480d6b8286c3","collectionCopy","$598bc516d9dcc101$export$adaa4cf7ef1b65be","$598bc516d9dcc101$export$f3e3cd1fc9c33ca1","updater","updatedValue","$598bc516d9dcc101$var$updateInDeeply","inImmutable","existing","wasNotSet","existingValue","nextExisting","nextUpdated","$598bc516d9dcc101$var$emptyMap","$598bc516d9dcc101$export$e6bdf135a54e021b","$598bc516d9dcc101$var$setIn$1","$598bc516d9dcc101$export$b56fa1d8ac1a28ad","$598bc516d9dcc101$var$deleteIn","$598bc516d9dcc101$export$722fbec263ad908a","$598bc516d9dcc101$var$update$1","$598bc516d9dcc101$var$updateIn$1","$598bc516d9dcc101$var$merge","$598bc516d9dcc101$var$mergeIntoKeyedWith","$598bc516d9dcc101$var$mergeWith","merger","collection1","collections","ii1","collection$1","__ownerID","withMutations","mergeIntoCollection","$598bc516d9dcc101$var$mergeDeepWithSources","$598bc516d9dcc101$var$mergeWithSources","deepMerger","oldValue","$598bc516d9dcc101$var$deepMergerWith","mergeWith","mergeItem","hasVal","nextVal","$598bc516d9dcc101$var$mergeDeep$1","$598bc516d9dcc101$var$mergeDeepWith$1","$598bc516d9dcc101$var$mergeIn","$598bc516d9dcc101$var$mergeDeepIn","$598bc516d9dcc101$var$withMutations","mutable","asMutable","wasAltered","__ensureOwner","$598bc516d9dcc101$var$asMutable","$598bc516d9dcc101$var$asImmutable","$598bc516d9dcc101$var$wasAltered","__altered","KeyedCollection$$1","keyValues","$598bc516d9dcc101$var$updateMap","deleteAll","__hash","$598bc516d9dcc101$export$8e8eaa3741ef504c","sortBy","$598bc516d9dcc101$var$MapIterator","ownerID","$598bc516d9dcc101$var$makeMap","isMap","$598bc516d9dcc101$var$MapPrototype","setIn","removeIn","deleteIn","updateIn","mergeDeep","mergeDeepWith","mergeIn","mergeDeepIn","asImmutable","$598bc516d9dcc101$var$ArrayMapNode","keyHash","didChangeSize","didAlter","removed","exists","$598bc516d9dcc101$var$MAX_ARRAY_MAP_SIZE","$598bc516d9dcc101$var$ValueNode","$598bc516d9dcc101$var$createNodes","isEditable","newEntries","$598bc516d9dcc101$var$BitmapIndexedNode","bitmap","bit","$598bc516d9dcc101$var$popCount","keyHashFrag","newNode","$598bc516d9dcc101$var$updateNode","$598bc516d9dcc101$var$MAX_BITMAP_INDEXED_SIZE","including","expandedNodes","$598bc516d9dcc101$var$HashArrayMapNode","$598bc516d9dcc101$var$expandNodes","$598bc516d9dcc101$var$isLeafNode","newBitmap","newNodes","$598bc516d9dcc101$var$setAt","canEdit","newLen","newArray","after","$598bc516d9dcc101$var$spliceOut","$598bc516d9dcc101$var$spliceIn","newCount","$598bc516d9dcc101$var$MIN_HASH_ARRAY_MAP_SIZE","excluding","packedII","packedNodes","$598bc516d9dcc101$var$packNodes","$598bc516d9dcc101$var$HashCollisionNode","$598bc516d9dcc101$var$mergeIntoNode","keyMatch","maxIndex","$598bc516d9dcc101$var$EMPTY_MAP","Iterator$$1","MapIterator","_type","_reverse","_stack","$598bc516d9dcc101$var$mapIteratorFrame","$598bc516d9dcc101$var$mapIteratorValue","subNode","__prev","hash$$1","newRoot","newSize","idx1","idx2","$598bc516d9dcc101$var$isList","maybeList","$598bc516d9dcc101$var$IS_LIST_SYMBOL","$598bc516d9dcc101$export$54c2e3dc7acea9f5","IndexedCollection$$1","$598bc516d9dcc101$var$emptyList","$598bc516d9dcc101$var$makeList","$598bc516d9dcc101$var$VNode","$598bc516d9dcc101$var$listNodeFor","_origin","list1","$598bc516d9dcc101$var$setListBounds","newTail","_tail","$598bc516d9dcc101$var$getTailOffset","_capacity","$598bc516d9dcc101$var$updateVNode","_level","$598bc516d9dcc101$var$updateList","insert","oldSize","arguments$1","seqs","argument","$598bc516d9dcc101$var$iterateList","$598bc516d9dcc101$var$DONE","isList","$598bc516d9dcc101$var$ListPrototype","removeBefore","originIndex","newChild","removingFirst","oldChild","editable","$598bc516d9dcc101$var$editableVNode","removeAfter","sizeIndex","$598bc516d9dcc101$var$EMPTY_LIST","tailPos","iterateNodeOrLeaf","iterateLeaf","iterateNode","capacity","nodeHas","lowerNode","newLowerNode","rawIndex","owner","oldOrigin","oldCapacity","newOrigin","newCapacity","newLevel","offsetShift","oldTailOffset","newTailOffset","oldTail","beginIndex","$598bc516d9dcc101$var$EMPTY_ORDERED_MAP","Map$$1","$598bc516d9dcc101$var$emptyOrderedMap","_map","_list","$598bc516d9dcc101$var$updateOrderedMap","newMap","newList","$598bc516d9dcc101$var$makeOrderedMap","omap","toMap","isOrderedMap","$598bc516d9dcc101$var$isStack","maybeStack","$598bc516d9dcc101$var$IS_STACK_SYMBOL","$598bc516d9dcc101$export$694e0d28c7ffc90c","$598bc516d9dcc101$var$emptyStack","pushAll","head","_head","peek","$598bc516d9dcc101$var$makeStack","isStack","$598bc516d9dcc101$var$EMPTY_STACK","$598bc516d9dcc101$var$StackPrototype","unshiftAll","$598bc516d9dcc101$var$isSet","maybeSet","$598bc516d9dcc101$var$IS_SET_SYMBOL","$598bc516d9dcc101$var$isOrderedSet","maybeOrderedSet","$598bc516d9dcc101$var$deepEqual","notAssociative","flipped","_","allEqual","bSize","$598bc516d9dcc101$var$mixin","ctor","methods","keyCopier","getOwnPropertySymbols","$598bc516d9dcc101$var$toJS","result$1","$598bc516d9dcc101$export$bdf4ff5a442cbbc5","SetCollection$$1","$598bc516d9dcc101$var$emptySet","fromKeys","keySeq","sets","$598bc516d9dcc101$var$SetPrototype","$598bc516d9dcc101$var$updateSet","removes","adds","mapped","toRemove","subtract","$598bc516d9dcc101$export$ba0280ac83f150c1","__make","__empty","isSet","$598bc516d9dcc101$var$EMPTY_SET","$598bc516d9dcc101$var$makeSet","$598bc516d9dcc101$var$EMPTY_RANGE","$598bc516d9dcc101$export$9a58ef0d7ad3278c","_start","_end","_step","searchValue","possibleIndex","offsetValue","$598bc516d9dcc101$export$c52e5867d5879e24","searchKeyPath","$598bc516d9dcc101$var$getIn$1","$598bc516d9dcc101$export$d39a4e62499f2a79","$598bc516d9dcc101$var$toObject","isKeyed","isIndexed","isAssociative","isOrdered","Iterator","useTuples","toJS","toObject","toOrderedMap","toOrderedSet","toSet","toStack","toList","__toStringMapper","returnValue","find","findEntry","sideEffect","separator","joined","isFirst","reducer","initialReduction","$598bc516d9dcc101$var$reduce","reduceRight","$598bc516d9dcc101$var$not","butLast","countBy","grouper","$598bc516d9dcc101$var$countByFactory","entriesSequence","$598bc516d9dcc101$var$entryMapper","filterNot","found","findKey","findLast","findLastEntry","findLastKey","flatMap","coerce","$598bc516d9dcc101$var$flatMapFactory","searchKey","getIn","groupBy","isKeyedIter","$598bc516d9dcc101$var$groupByFactory","hasIn","isSubset","isSuperset","keyOf","$598bc516d9dcc101$var$keyMapper","lastKeyOf","maxBy","$598bc516d9dcc101$var$neg","$598bc516d9dcc101$var$defaultNegComparator","minBy","rest","skip","skipLast","skipWhile","skipUntil","take","takeLast","takeWhile","takeSequence","iterating","$598bc516d9dcc101$var$takeWhileFactory","takeUntil","ordered","keyed","$598bc516d9dcc101$var$murmurHashOfSize","$598bc516d9dcc101$var$hashMerge","$598bc516d9dcc101$var$hashCollection","$598bc516d9dcc101$var$CollectionPrototype","chain","contains","mapEntries","mapKeys","$598bc516d9dcc101$var$KeyedCollectionPrototype","findIndex","removeNum","numArgs","spliced","findLastIndex","interpose","interposedSequence","$598bc516d9dcc101$var$interposeFactory","interleave","zipped","interleaved","zip","$598bc516d9dcc101$var$defaultZipper","zipWith","$598bc516d9dcc101$var$IndexedCollectionPrototype","reduction","useFirst","Set$$1","$598bc516d9dcc101$var$emptyOrderedSet","isOrderedSet","$598bc516d9dcc101$var$EMPTY_ORDERED_SET","$598bc516d9dcc101$var$OrderedSetPrototype","$598bc516d9dcc101$var$makeOrderedSet","$598bc516d9dcc101$export$5b163c6d120341e7","defaultValues","hasInitialized","RecordType","RecordTypePrototype","_indices","_name","_defaultValues","propName","$598bc516d9dcc101$var$recordName","$598bc516d9dcc101$var$setProp","_values","$598bc516d9dcc101$var$RecordPrototype","displayName","str","$598bc516d9dcc101$var$recordSeq","newValues","$598bc516d9dcc101$var$makeRecord","isRecord","getDescriptiveName","likeRecord","record","$598bc516d9dcc101$var$EMPTY_REPEAT","$598bc516d9dcc101$export$f9d61a2a6155ab51","GestureData","$526057ac3ad46b98$var$GestureData","wordCode","frameLenghts","HowlerGlobal","Howler","_counter","_html5AudioPool","html5PoolSize","_codecs","_howls","_muted","_volume","_canPlayEvent","_navigator","masterGain","noAudio","usingWebAudio","autoSuspend","ctx","autoUnlock","_setup","volume","vol","setupAudioContext","setValueAtTime","_webAudio","ids","_getSoundIds","sound","_soundById","_node","mute","muted","unload","close","codecs","ext","_autoSuspend","Audio","oncanplaythrough","_setupCodecs","audioTest","canPlayType","mpegTest","checkOpera","userAgent","isOldOpera","mp3","mpeg","opus","ogg","oga","wav","aac","caf","m4a","mp4","weba","webm","dolby","flac","_unlockAudio","_audioUnlocked","_mobileUnloaded","sampleRate","_scratchBuffer","unlock","_unlocked","_releaseHtml5Audio","e1","_autoResume","noteOn","resume","_emit","_obtainHtml5Audio","testPlay","suspend","_sounds","_paused","_suspendTimer","clearTimeout","_resumeAfterSuspend","Howl","_autoplay","_format","_html5","html5","_loop","_pool","pool","_preload","preload","_rate","rate","_sprite","_src","_xhrWithCredentials","xhrWithCredentials","_duration","_endTimers","_queue","_playLock","_onend","onend","_onfade","onfade","_onload","onload","_onloaderror","onloaderror","_onplayerror","onplayerror","_onpause","onpause","_onplay","onplay","_onstop","onstop","_onmute","onmute","_onvolume","onvolume","_onrate","onrate","_onseek","onseek","_onunlock","onunlock","_onresume","location","protocol","Sound","internal","num","_ended","_inactiveSound","soundId","_loadQueue","_seek","timeout","setParams","_stop","playWebAudio","_refreshBuffer","_playStart","bufferSource","noteGrainOn","once","_clearTimer","playHtml5","loadedNoReadyState","ejecta","isCocoonJS","_rateSeek","_stopFade","noteOff","_cleanBuffer","_clearSound","_interval","fade","_startFadeInterval","stepLen","lastTick","_fadeTo","tick","cancelScheduledValues","loop1","loopStart","loopEnd","rate1","playing","seek1","realTime","rateSeek","seekAndEmit","emitSeek","duration1","sounds","_errorFn","_loadFn","remCache","events","isId","task","ended","_drain","limit","cnt","_panner","isIOS","vendor","howl","_parent","createGainNode","_errorListener","_loadListener","__default","loadSound","dataView","xhr","onerror","safeXhrSend","arraybuffer","success","iOS","platform","appVersion","safari","standalone","define","amd","$parcel$global","_pos","_orientation","stereo","pan","pos","xUp","yUp","zUp","or","_stereo","_pannerAttr","_onstereo","onstereo","_onpos","onpos","_onorientation","onorientation","pannerType","createStereoPanner","setupPanner","pannerAttr","_coneInnerAngle","_coneOuterAngle","_coneOuterGain","_distanceModel","_maxDistance","_refDistance","_rolloffFactor","_panningModel","pa","ConnectionStatus","DIRECT_LINE_VERSION","intervalRefreshToken","lifetimeRefreshToken","errorExpiredToken","errorConversationEnded","errorFailedToConnect","konsole","_console","_len","optionalParams","_key","DirectLine","$622a81082e02540f$var$_classCallCheck2","$622a81082e02540f$var$_defineProperty2","BehaviorSubject","Uninitialized","secret","token","webSocket","WebSocket","domain","conversationId","watermark","streamUrl","_botAgent","getBotAgent","botAgent","parsedPollingInterval","pollingInterval","expiredTokenExhaustion","setConnectionStatusFallback","ExpiredToken","FailedToConnect","activity$","webSocketActivity$","pollingGetActivity$","share","connectionStatus$","connectionStatus","Connecting","Online","startConversation","conversation","referenceGrammarId","refreshTokenLoop","Ended","throw","connectionStatusFrom","connectionStatusTo","maxAttempts","attempts","currStatus","protectedConnectionStatus","method","ajax","headers","Accept","commonHeaders","ajaxResponse","retryWhen","error$","mergeMap","_this2","tokenRefreshSubscription","interval","refreshToken","_this3","checkConnection","$622a81082e02540f$var$_objectSpread2","expiredToken","_this4","sessionId","catchExpiredToken","activity","_this5","attachments","postMessageWithAttachments","catchPostError","_ref","formData","_this6","messageWithoutAttachments","$622a81082e02540f$var$_objectWithoutProperties2","FormData","append","media","contentUrl","contentType","_this7","poller$","trigger$","startTimestamp","activityGroup","observableFromActivityGroup","activities","_this8","observableWebSocket","getRetryDelay","reconnectToConversation","_this9","ws","onopen","onclose","onmessage","_this10","Authorization","customAgent","clientAgent","__esModule","excluded","$gqEFx","sourceSymbolKeys","sourceKeys","_arguments","ownKeys","sym","getOwnPropertyDescriptor","$c0F5b","$9ca486e3f798cd16$var$_defineProperties","$975ed675f10f5b1b$var$BehaviorSubject","$975ed675f10f5b1b$var$__extends","$8qofi","$86oG9","$5e6206f43d13f46c$var$SubjectSubscriber","$5e6206f43d13f46c$var$__extends","$3Gq5w","$5e6206f43d13f46c$var$Subject","$5PcOb","$5e6206f43d13f46c$var$AnonymousSubject","$7DLPa","$evpil","$gRlcH","AnonymousSubject","$c4620b365229a835$export$77cea355fa80b5f4","$c4620b365229a835$var$Observable","$4OoIh","PromiseCtor","$aTsfP","Rx","$c9l4i","$hAUpu","$7ee4f52bf631d257$export$e8e78c978b129247","$7ee4f52bf631d257$var$__window","$7ee4f52bf631d257$var$__self","WorkerGlobalScope","$7ee4f52bf631d257$var$_root","$380f007890e668ec$export$2a12c2cebbfd1087","$c5SS4","$2ae987e2d185860e$var$Subscriber","$2ae987e2d185860e$var$isTrustedSubscriber","trustedSubscriber","$2ae987e2d185860e$var$SafeSubscriber","$2ae987e2d185860e$var$__extends","_parents","SafeSubscriber","$b1l1y","$806018a85427c673$export$f6e2535fb5126e54","$590145cf386c9013$export$f55210826850c514","$590145cf386c9013$var$Subscription","hasErrors","$j9JBM","tryCatch","$lh4Kq","errorObject","$67eQl","$590145cf386c9013$var$flattenUnsubscriptionErrors","$7YMfd","$d6lVk","_addParent","$5cf38f52e1b2545e$export$43bee75e5e14138e","$989cd77d874894aa$export$a6cdc56e425d0d0a","$df223c78ffd9e152$export$d234c058d1d4e435","$df223c78ffd9e152$var$tryCatchTarget","$df223c78ffd9e152$var$tryCatcher","$f7cede5083cd8c02$export$fc504b39d7c1176","$473ee91ab049f24b$var$UnsubscriptionError","$473ee91ab049f24b$var$__extends","$8ce083e9abd74b68$export$6e22c362a0406a2c","$43dba6a7ea523b8f$export$77f77496d7cade10","$43dba6a7ea523b8f$var$Symbol","for","$8d86ab0ba7206759$export$5ab46cbf6120b33a","$8d86ab0ba7206759$var$getSymbolObservable","$$observable","$ccf18e56801aee2d$export$71f88a61afaa14d7","$ccf18e56801aee2d$var$pipeFromArray","$hELqI","$cdaaf6b19e790faf$export$8793edee2d425525","$62238f220d2eb11b$var$ObjectUnsubscribedError","$62238f220d2eb11b$var$__extends","$a8f794fde3ad2675$var$SubjectSubscription","$a8f794fde3ad2675$var$__extends","$1Iz6M","_catch","$140522466585d241$export$7f43fa37c3d8a0b3","selector","$9owh0","catchError","$6d6f63c52957a185$var$CatchOperator","caught","CatchOperator","$6d6f63c52957a185$var$CatchSubscriber","CatchSubscriber","$6d6f63c52957a185$var$__extends","$02Whk","$470XO","OuterSubscriber","$2fe8903b27696310$var$OuterSubscriber","$2fe8903b27696310$var$__extends","$008d64eaf78ef33d$export$d0604af3321cfb1b","$ltTmr","$8v0pb","$3P0nV","$1nLXn","$63018874873ab09c$export$1e2f57719e155213","$2c866ef8789adb85$export$4369c812aac99591","$101d23a453acdd1c$export$6f58e2338da23f4d","$101d23a453acdd1c$var$symbolIteratorPonyfill","Set_1","Map_1","getOwnPropertyNames","$fa373ff3eeab23f0$var$InnerSubscriber","$fa373ff3eeab23f0$var$__extends","combineLatest","$bHMgo","$885925f25b361379$export$77fa7d86f5204e8a","$ehWFx","$a67029ad696e3702$var$none","$ha0p1","ArrayObservable","$a67029ad696e3702$var$CombineLatestOperator","CombineLatestOperator","$a67029ad696e3702$var$CombineLatestSubscriber","CombineLatestSubscriber","$a67029ad696e3702$var$__extends","_tryProject","$c7e3aecefae0e03e$var$ArrayObservable","$c7e3aecefae0e03e$var$__extends","$5TBK5","$kXM0F","ScalarObservable","$afe9L","EmptyObservable","$f42e8f0d16a979b0$var$ScalarObservable","$f42e8f0d16a979b0$var$__extends","$7756494affe712f4$var$EmptyObservable","$7756494affe712f4$var$__extends","$44af5daad62ae7f9$export$187e35932e88c15c","$8Q50Z","$66f711e79e35bc3f$export$85b9a36db797e02b","$1MMNq","$14d0200734bb529d$var$CountOperator","CountOperator","$14d0200734bb529d$var$CountSubscriber","CountSubscriber","$14d0200734bb529d$var$__extends","_tryPredicate","$3GDP1","$2af42f2314148a1c$export$1391212d75b2ee65","$hxLgA","$jp2JJ","$cc5a2edf28bf8fd3$export$12af436354f1a4f7","$dOTdh","$6K1AV","AsyncAction","$4e88469c5bbf6863$var$AsyncAction","$4e88469c5bbf6863$var$__extends","Action","$a1bcaa613581c61f$var$Action","$a1bcaa613581c61f$var$__extends","$a0fac611efe7d321$var$AsyncScheduler","$a0fac611efe7d321$var$__extends","$8b2b534bd9727b9a$export$d3e54bb8584cda7c","$8b2b534bd9727b9a$var$Scheduler","delayFor","$3byHi","isDate","$e202798e923a3f5a$var$DelayOperator","DelayOperator","$e202798e923a3f5a$var$DelaySubscriber","DelaySubscriber","$e202798e923a3f5a$var$__extends","delay_1","_schedule","scheduleNotification","$e202798e923a3f5a$var$DelayMessage","$liQ4O","$251d505bdd97fe52$export$871608497c498473","$f823acc4d418759e$export$14834abbfce3b8cd","$f823acc4d418759e$var$Notification","$boMht","_do","$84c7633123f96144$export$6e1c2ce23f3c9991","$jaPyi","tap","$df56f0b128e8323b$var$DoOperator","DoOperator","$df56f0b128e8323b$var$DoSubscriber","DoSubscriber","safeSubscriber","$df56f0b128e8323b$var$__extends","$b8Mk1","$81c5eccb40ef20f9$export$3dea766d36a8935f","$3XiB3","$2e154eb3c6b34467$var$FilterOperator","$2e154eb3c6b34467$var$FilterSubscriber","$2e154eb3c6b34467$var$__extends","$5ySWf","$40cabe5814431d2f$export$871de8747c9eaa88","$5Wo0C","$4534fe305e18b939$var$MapOperator","MapOperator","$4534fe305e18b939$var$MapSubscriber","$4534fe305e18b939$var$__extends","$M3gVS","$09070594bb2c4659$export$6b9f6c0d32c093f9","$5cxZp","$3c9870540b252846$var$MergeMapOperator","MergeMapOperator","$3c9870540b252846$var$MergeMapSubscriber","MergeMapSubscriber","$3c9870540b252846$var$__extends","_notifyResultSelector","$i6KWL","$d2ed342b0d3e32d9$export$1281551253cfee02","notifier","$dXH7n","$a2a23b6339d82a01$var$RetryWhenOperator","RetryWhenOperator","$a2a23b6339d82a01$var$RetryWhenSubscriber","RetryWhenSubscriber","$a2a23b6339d82a01$var$__extends","retries","retriesSubscription","$ci0Bo","$8f27a2100137cedb$export$ed80d9de1d9df928","$2xk7i","$1d8e44987c620375$export$ed80d9de1d9df928","$1d8e44987c620375$var$shareSubjectFactory","$9RVTD","$3DdgP","multicast","$2a4f4ed9f028f0b5$export$1364843af8d5a963","subjectOrSubjectFactory","$2a4f4ed9f028f0b5$var$MulticastOperator","$bcfdX","connectableObservableDescriptor","MulticastOperator","$826c9fe8e8c56461$var$ConnectableObservable","ConnectableObservable","$826c9fe8e8c56461$var$__extends","$826c9fe8e8c56461$var$ConnectableSubscriber","$826c9fe8e8c56461$var$connectableProto","$826c9fe8e8c56461$var$RefCountSubscriber","$72f5f952da36526e$var$RefCountOperator","$72f5f952da36526e$var$RefCountSubscriber","$72f5f952da36526e$var$__extends","$hYMvf","$d16da9f3468e7091$export$b7df5d561049483a","$2DVuv","$1ecbd1d57830570e$var$TakeOperator","TakeOperator","$kt8eT","ArgumentOutOfRangeError","$1ecbd1d57830570e$var$TakeSubscriber","TakeSubscriber","$1ecbd1d57830570e$var$__extends","$03d8775bc816f474$var$ArgumentOutOfRangeError","$03d8775bc816f474$var$__extends","$VaPhW","$0abdb8d9b2fb44cc$export$e68fce4c5f453854","$dGOYI","AjaxObservable","$9f76bdd796ce8ed0$var$getCORSRequest","XDomainRequest","$9f76bdd796ce8ed0$var$ajaxGet","$9f76bdd796ce8ed0$var$AjaxObservable","$9f76bdd796ce8ed0$var$ajaxPost","$9f76bdd796ce8ed0$var$ajaxDelete","$9f76bdd796ce8ed0$var$ajaxPut","$9f76bdd796ce8ed0$var$ajaxPatch","ajaxGet","ajaxPost","ajaxDelete","ajaxPut","ajaxPatch","$9f76bdd796ce8ed0$var$mapResponse","$9f76bdd796ce8ed0$var$ajaxGetJSON","ajaxGetJSON","urlOrRequest","createXHR","crossDomain","progId","progIds","ActiveXObject","$9f76bdd796ce8ed0$var$getXMLHttpRequest","prop","$9f76bdd796ce8ed0$var$__extends","$9f76bdd796ce8ed0$var$AjaxSubscriber","post","put","patch","getJSON","AjaxSubscriber","serializeBody","$9f76bdd796ce8ed0$var$AjaxResponse","_b","user","password","setupEvents","setHeaders","splitIndex","encodeURIComponent","request1","progressSubscriber1","progressSubscriber","xhrTimeout","$9f76bdd796ce8ed0$var$AjaxTimeoutError","ontimeout","xhrProgress_1","xhrError_1","onprogress","$9f76bdd796ce8ed0$var$AjaxError","xhrReadyStateChange","status_1","responseText","onreadystatechange","abort","originalEvent","$9f76bdd796ce8ed0$var$parseXhrResponse","AjaxResponse","AjaxError","responseXML","AjaxTimeoutError","$iSy6g","$dbe7b8b395a1b49a$export$6e22c362a0406a2c","$acWI9","$76e89131f245bce3$export$6788812c4e6611e6","$5K3So","FromObservable","$42e44161269d3e16$var$FromObservable","$42e44161269d3e16$var$__extends","$dsHDn","PromiseObservable","$6OHE8","IteratorObservable","$g8pVM","ArrayLikeObservable","$gFVlz","$9ccfbcb49594a8dc$var$PromiseObservable","$9ccfbcb49594a8dc$var$__extends","$9ccfbcb49594a8dc$var$dispatchNext","$9ccfbcb49594a8dc$var$dispatchError","$4f6944da35c5c045$var$IteratorObservable","$4f6944da35c5c045$var$StringIterator","$4f6944da35c5c045$var$ArrayIterator","$4f6944da35c5c045$var$getIterator","$4f6944da35c5c045$var$__extends","StringIterator","ArrayIterator","$4f6944da35c5c045$var$numberIsFinite","valueAsNumber","$4f6944da35c5c045$var$sign","$4f6944da35c5c045$var$maxSafeInteger","$4f6944da35c5c045$var$toLength","$bbf1820b3f76cec6$var$ArrayLikeObservable","arrayLike","$bbf1820b3f76cec6$var$__extends","observeOn","$c23cf593baf8237c$var$ObserveOnOperator","ObserveOnOperator","$c23cf593baf8237c$var$ObserveOnSubscriber","$c23cf593baf8237c$var$__extends","$c23cf593baf8237c$var$ObserveOnMessage","ObserveOnMessage","$lKpou","$fd519792400807ee$export$3174cdbf0a0cbc84","$1x2JW","IntervalObservable","$11daff9fc949ccee$var$IntervalObservable","$dh5I6","$11daff9fc949ccee$var$__extends","$9aa14ad4e45ae81a$export$e90fb89750dba83f","$NfaKB","$094058a3da43e111$export$ba255e9e49e00608","$iHZfZ","_throw","$d9ebc27796056d1c$export$82a8af9b11518516","$z3xNk","ErrorObservable","$069604c733cab954$var$ErrorObservable","$069604c733cab954$var$__extends","$ceba27338b8e18e3$export$a4ad2735b021c132","$4dbf50483be2658f$export$65bd6083489bd8bb","errorMessage","statusCode","trueProto","$4dbf50483be2658f$var$__extends","$4dbf50483be2658f$export$66d311bf29d5c89c","$4dbf50483be2658f$export$18b052ffd8c84d7","$7be55666ac6b9164$export$1d94dfe0d9d1f1e7","statusText","$7be55666ac6b9164$export$8c6ee871e681f0f4","$7be55666ac6b9164$var$__assign","$6c2b75abf3ff0775$export$4f11ab3560c519e5","logger","httpClient","$kx7BL","XhrHttpClient","$30sQM","NodeHttpClient","$6c2b75abf3ff0775$var$__extends","abortSignal","aborted","$6FQws","AbortError","getCookieString","$aDuFC","HttpClient","$2307c045443df68f$var$requestModule","$2307c045443df68f$var$requireFunc","__webpack_require__","__non_webpack_require__","$2307c045443df68f$export$2ac4f5357f1fa852","cookieJar","jar","defaults","$2307c045443df68f$var$__extends","httpRequest","requestBody","$cim7A","isArrayBuffer","$2307c045443df68f$require$Buffer","currentRequest","$2307c045443df68f$var$__assign","onabort","$cFhFU","LogLevel","Warning","TimeoutError","HttpResponse","statusMessage","HttpError","$9387063f36b59763$export$243e62d78d3b544d","$8f38534c72be8ea9$export$83f0753fc4347e43","isRequired","isIn","$8f38534c72be8ea9$export$a688b91586df8fd9","includeContent","$8f38534c72be8ea9$export$9dd3754ae86f0017","$8f38534c72be8ea9$export$3ddcef0d22959f49","$8f38534c72be8ea9$export$465cb47180de50f0","transportName","accessTokenFactory","logMessageContent","sent","Trace","$8f38534c72be8ea9$export$fe2e61603b61130d","$8f38534c72be8ea9$export$ba6a9c7ac8291f7f","Information","$e9YEu","NullLogger","$8f38534c72be8ea9$export$b6bbab5a9b109038","$8f38534c72be8ea9$export$b7a41f2bfb5c60c3","cancelCallback","minimumLogLevel","logLevel","Critical","toISOString","$a4f0f431154bfafd$export$17ac58a1138ded46","_logLevel","_message","$24f87a6f86a8996f$export$a143d493d941bafc","$24f87a6f86a8996f$export$f99ded8fe4b79145","$24f87a6f86a8996f$var$customInspectSymbol","$24f87a6f86a8996f$var$Buffer","$24f87a6f86a8996f$var$K_MAX_LENGTH","$24f87a6f86a8996f$var$createBuffer","RangeError","buf","encodingOrOffset","$24f87a6f86a8996f$var$allocUnsafe","$24f87a6f86a8996f$var$from","isEncoding","$24f87a6f86a8996f$var$byteLength","actual","write","$24f87a6f86a8996f$var$fromString","arrayView","$24f87a6f86a8996f$var$isInstance","$24f87a6f86a8996f$var$fromArrayBuffer","$24f87a6f86a8996f$var$fromArrayLike","$24f87a6f86a8996f$var$fromArrayView","SharedArrayBuffer","isBuffer","$24f87a6f86a8996f$var$checked","$24f87a6f86a8996f$var$numberIsNaN","$24f87a6f86a8996f$var$fromObject","toPrimitive","$24f87a6f86a8996f$var$assertSize","mustMatch","loweredCase","$24f87a6f86a8996f$var$utf8ToBytes","$24f87a6f86a8996f$var$base64ToBytes","$24f87a6f86a8996f$var$slowToString","$24f87a6f86a8996f$var$hexSlice","$24f87a6f86a8996f$var$utf8Slice","$24f87a6f86a8996f$var$asciiSlice","$24f87a6f86a8996f$var$latin1Slice","$24f87a6f86a8996f$var$base64Slice","$24f87a6f86a8996f$var$utf16leSlice","$24f87a6f86a8996f$var$swap","$24f87a6f86a8996f$var$bidirectionalIndexOf","$24f87a6f86a8996f$var$arrayIndexOf","indexSize","arrLength","valLength","read","readUInt16BE","foundIndex","$24f87a6f86a8996f$var$hexWrite","remaining","strLen","parsed","$24f87a6f86a8996f$var$utf8Write","$24f87a6f86a8996f$var$blitBuffer","$24f87a6f86a8996f$var$asciiWrite","byteArray","$24f87a6f86a8996f$var$asciiToBytes","$24f87a6f86a8996f$var$base64Write","$24f87a6f86a8996f$var$ucs2Write","hi","lo","$24f87a6f86a8996f$var$utf16leToBytes","$5d11t","fromByteArray","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","$24f87a6f86a8996f$var$MAX_ARGUMENTS_LENGTH","$24f87a6f86a8996f$var$decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","$24f87a6f86a8996f$var$typedArraySupport","poolSize","alloc","fill","$24f87a6f86a8996f$var$alloc","allocUnsafe","allocUnsafeSlow","_isBuffer","compare","swap16","swap32","swap64","toLocaleString","thisStart","thisEnd","thisCopy","targetCopy","_arr","out","$24f87a6f86a8996f$var$hexSliceLookupTable","bytes","$24f87a6f86a8996f$var$checkOffset","$24f87a6f86a8996f$var$checkInt","$24f87a6f86a8996f$var$wrtBigUInt64LE","$24f87a6f86a8996f$var$checkIntBI","BigInt","$24f87a6f86a8996f$var$wrtBigUInt64BE","$24f87a6f86a8996f$var$checkIEEE754","$24f87a6f86a8996f$var$writeFloat","littleEndian","noAssert","$7rddL","$24f87a6f86a8996f$var$writeDouble","newBuf","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","$24f87a6f86a8996f$var$defineBigIntMethod","$24f87a6f86a8996f$var$validateNumber","$24f87a6f86a8996f$var$boundsError","readBigUInt64BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","$24f87a6f86a8996f$var$errors","$24f87a6f86a8996f$var$E","getMessage","Base1","Base","NodeError","$24f87a6f86a8996f$var$addNumericalSeparator","ERR_OUT_OF_RANGE","$24f87a6f86a8996f$var$checkBounds","ERR_INVALID_ARG_TYPE","ERR_BUFFER_OUT_OF_BOUNDS","received","$24f87a6f86a8996f$var$INVALID_BASE64_RE","leadSurrogate","toByteArray","$24f87a6f86a8996f$var$base64clean","alphabet","table","i16","$24f87a6f86a8996f$var$BufferBigIntNotDefined","$3caef5c332c7293f$export$d622b2ad8d90c771","$3caef5c332c7293f$export$6100ba28696e12de","b64","$3caef5c332c7293f$var$getLens","validLen","placeHoldersLen","$3caef5c332c7293f$var$Arr","$3caef5c332c7293f$var$_byteLength","curByte","$3caef5c332c7293f$var$revLookup","uint8","extraBytes","maxChunkLength","len2","$3caef5c332c7293f$var$encodeChunk","$3caef5c332c7293f$var$lookup","$3caef5c332c7293f$var$code","$3caef5c332c7293f$var$i","$3caef5c332c7293f$var$len","$56a54f6ebabce67d$export$aafa59e2e03f2942","$56a54f6ebabce67d$export$68d8715fc104d294","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","rt","$ef2cca8a57301bd2$export$33b9ed1bd07561aa","$ef2cca8a57301bd2$var$__extends","$b569c4784cb0e567$export$b8b4168ab851a6c3","$b569c4784cb0e567$export$e5dbe756ed73e8c8","Arg","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","handshakeProtocol","$1T2xr","HandshakeProtocol","onreceive","processIncomingData","connectionClosed","closedCallbacks","receivedHandshakeResponse","connectionState","Disconnected","cachedPingMessage","writeMessage","$4CO06","MessageType","Ping","handshakeRequest","Debug","handshakePromise","handshakeResolver","handshakeRejecter","transferFormat","sendMessage","writeHandshakeRequest","cleanupTimeout","resetTimeoutPeriod","resetKeepAliveInterval","cleanupPingTimer","stream","methodName","invocationDescriptor","createStreamInvocation","cancelInvocation","createCancelInvocation","invocationId","cancelMessage","invocationEvent","Completion","promiseQueue","createInvocation","invoke","newMethod","removeIdx","processHandshakeResponse","messages_1","parseMessages","Invocation","invokeClientMethod","StreamItem","Close","responseMessage","Connected","label","trys","features","inherentKeepAlive","timeoutHandle","serverTimeout","invocationMessage","pingServerHandle","$15fce59418132556$export$b23df48528d3f5f4","$7TfsI","TextMessageFormat","parseHandshakeResponse","messageData","remainingData","$15fce59418132556$require$Buffer","binaryData","separatorIndex","RecordSeparatorCode","responseLength","textData","RecordSeparator","messages","$5be9a9e9491e5a57$export$fc2e5d47850f626b","$35e17f1ade1f0d85$export$80edbf15fa61a4db","$b13f104d9599be2b$export$afccb10c24910b13","configureLogging","logging","ConsoleLogger","withUrl","transportTypeOrOptions","httpConnectionOptions","transport","withHubProtocol","build","$7LI4u","HttpConnection","$fzENc","HubConnection","$ifMqM","JsonHubProtocol","$5a7f1bdb61a985eb$var$WebSocketModule","$5a7f1bdb61a985eb$var$EventSourceModule","$5a7f1bdb61a985eb$var$requireFunc","$5a7f1bdb61a985eb$export$13c1f9cf8a283575","createLogger","baseUrl","resolveUrl","isNode","EventSource","$9hMFZ","DefaultHttpClient","$bjipg","TransferFormat","Binary","startPromise","startInternal","stopError","skipNegotiation","HttpTransportType","WebSockets","constructTransport","_a1","negotiateResponse","redirects","this_1","getNegotiationResponse","ProtocolVersion","accessToken","accessToken_1","createTransport","$gJEPd","LongPollingTransport","stopConnection","changeState","e_2","negotiateUrl","resolveNegotiateUrl","e_3","createConnectUrl","connectionId","requestedTransport","requestedTransferFormat","connectUrl","isITransport","transports","availableTransports","transports_1","endpoint","resolveTransport","ex_1","$3rl8D","WebSocketTransport","ServerSentEvents","$FWZHG","ServerSentEventsTransport","LongPolling","transferFormats","actualTransport","$5a7f1bdb61a985eb$var$transportMatches","aTag","createElement","href","$83bfbf361ccf1eac$export$789ba40ee1a75f0","$83bfbf361ccf1eac$export$f29afaa8e8d2989a","$c2f0845743c8168c$export$fbd8c90d2cca1300","pollAbort","$jaU8a","AbortController","pollOptions","signal","getAccessToken","updateHeaderToken","pollUrl","closeError","receiving","poll","getDataDetail","e_1","pollAborted","raiseOnClose","deleteOptions","logMessage","$df5a7de3f45baaad$export$48f7e099c149af88","isAborted","$07e19779293eaf39$export$f0d4dc62ec317948","eventSourceConstructor","opened","Text","eventSource","cookies","Cookie","$28144a5a7e978034$export$de21836fc42c6f9c","webSocketConstructor","binaryType","_event","ErrorEvent","OPEN","wasClean","reason","$d49f321152587075$export$11f4f8ecec1ad0c8","hubMessages","parsedMessage","isInvocationMessage","isStreamItemMessage","isCompletionMessage","assertNotEmptyString","toStringTag","e2","t3","e3","e6","t5","e7","e8","EventTarget","defineEventAttribute","detect","e9","r1","audioBitsPerSecond","videoBitsPerSecond","bitsPerSecond","encoderWorkerFactory","OggOpusEncoderWasmPath","WebMOpusEncoderWasmPath","_stream","_mimeType","_audioBitsPerSecond","workerState","isTypeSupported","_parseType","subtype","_wasmPath","currentScript","encoderWorker","_workerFactory","Worker","_spawnWorker","codec","e10","e4","t4","e5","worker","_onmessageFromWorker","_onerrorFromWorker","_postMessageToWorker","wasmPath","postMessage","command","channelCount","processor","Event","channelBuffers","terminate","filename","lineno","onaudioprocess","inputBuffer","playbackTime","numberOfChannels","getChannelData","MAX_SAFE_INTEGER","getAudioTracks","getSettings","createMediaStreamSource","createScriptProcessor","_enableAudioProcessCallback","e11","e12","t6","n3","r2","o2","assert","eventTarget","eventPhase","currentTarget","canceled","passiveListener","timeStamp","e13","t7","e15","t8","t9","n4","e14","composedPath","NONE","CAPTURING_PHASE","AT_TARGET","BUBBLING_PHASE","stopPropagation","stopImmediatePropagation","bubbles","cancelable","defaultPrevented","composed","e16","t10","listenerType","o3","passive","capture","e17","handleEvent","e18","n5","e19","n6","__spreadArrays","r3","os","BrowserInfo","o4","NodeInfo","bot","BotInfo","a3","e20","o5","parseUserAgent","detectOS","getNodeVersion","e21","n7","e22","e23","run","fun","nextTick","title","browser","env","argv","versions","removeAllListeners","emit","prependListener","prependOnceListener","cwd","chdir","umask","OpusMediaRecorder","rejected","fulfilled","verb","op","ops","$2d31f800314c535b$var$cameraShots","CharacterView","domElement1","streams","avatar","shot","desiredAspect","initialized","$2d31f800314c535b$var$__awaiter","$2d31f800314c535b$var$__generator","initThreeJS","$b4fbfb44e1608b35$exports","Rect","isCameraShotSupported","setLights","hemiLight","$2d31f800314c535b$var$THREE","HemisphereLight","rimLight","keyLight","$1c5eae64c94e4499$exports","$1c5eae64c94e4499$var$Logger","$999f176d3f11c0ca$exports","CharacterError","$999f176d3f11c0ca$var$CharacterError","errorCode","interrupt","$8c2470bd2ca26850$var$unionize","_b1","valProp","_c","tag","tagProp","creators","$8c2470bd2ca26850$var$__assign","tag1","is","_loop_2","variant","evalMatch","cases","defaultCase","second","as","_loop_3","expectedTag","expectedTag1","_Record","$8c2470bd2ca26850$exports","unionize","ofType","getFileDataAsString","$573e4face59ddfad$var$_gestures","parcelRequire","CoolDown","startCooldown","coolDown","ofGesture","gesture","reduceCooldown","$61b222a4997134af$var$Vocabulary","persons","$e9MvZ","verbs","negators","transcription","adverbs","conjunctions","$61b222a4997134af$var$_default","Token","$a4e78a03a2f5dcc9$var$Token","register","$7da5a82fc5c68612$export$2e2bcd8739ae039","$d88c739751ee71a8$export$2e2bcd8739ae039","$ca532245f532b8c7$export$2e2bcd8739ae039","methodNames","xf","$74802cd83370ef4d$export$2e2bcd8739ae039","transducer","$1337f224662d3300$export$2e2bcd8739ae039","$ef6ef66ce5fb7fd8$var$XAny","XAny","any","$7f07620a190ef9e3$export$2e2bcd8739ae039","$98d50b539c0c6b65$export$2e2bcd8739ae039","$6be890614010c4b1$export$2e2bcd8739ae039","$e2e9ffba43f1e3cd$export$2e2bcd8739ae039","$f44076617a103a28$export$2e2bcd8739ae039","$60a9eba0416d0832$export$2e2bcd8739ae039","$29a6367c7cff22f4$var$toString","$29a6367c7cff22f4$var$_isArguments","$5bcc407cfb598d5d$export$2e2bcd8739ae039","$29a6367c7cff22f4$export$2e2bcd8739ae039","$988c5c4946b5bde2$var$empty","$f86d03b0b7303435$export$2e2bcd8739ae039","$988c5c4946b5bde2$export$2e2bcd8739ae039","$a6694d5022ab841f$export$2e2bcd8739ae039","$52ef808c17381913$var$hasEnumBug","$52ef808c17381913$var$nonEnumerableProps","$52ef808c17381913$var$hasArgsEnumBug","$52ef808c17381913$var$contains","$52ef808c17381913$var$keys","nIdx","ks","checkArgsLength","$52ef808c17381913$export$2e2bcd8739ae039","$d30f2dbe7c1fcfb1$export$2e2bcd8739ae039","$21f60742ca667a50$var$_uniqContentEquals","aIterator","bIterator","stackA","stackB","$a92a165fe0f2176b$export$2e2bcd8739ae039","eq","$21f60742ca667a50$export$2e2bcd8739ae039","$c23bde5cc2e77c79$export$2e2bcd8739ae039","aItem","typeA","global","ignoreCase","multiline","sticky","unicode","keysA","extendedStackA","extendedStackB","$6d41258b30453375$export$2e2bcd8739ae039","$51e8fa65989397ce$export$2e2bcd8739ae039","a0","a4","a5","a6","a7","a8","a9","combined","argsIdx","combinedIdx","$2c243a92ad27885f$export$2e2bcd8739ae039","$89172c96a486a684$export$2e2bcd8739ae039","$d0429543431eae11$export$2e2bcd8739ae039","inf","$d72ede7d9e3242bc$export$2e2bcd8739ae039","functor","$47addfd030a21cad$var$pad","$47addfd030a21cad$export$2e2bcd8739ae039","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","$a258c4f0df1d18b1$export$2e2bcd8739ae039","$6a13eb28038aa63d$var$XWrap","XWrap","acc","$61ac266812537601$var$bind","thisObj","$61ac266812537601$export$2e2bcd8739ae039","$6304de3a7754df31$var$_iterableReduce","$6304de3a7754df31$var$_methodReduce","$6304de3a7754df31$var$symIterator","$6a13eb28038aa63d$export$2e2bcd8739ae039","$6304de3a7754df31$var$_arrayReduce","$04ecbd022d0692ef$var$XFilter","XFilter","$8adfba87bcb96746$export$2e2bcd8739ae039","filterable","$6304de3a7754df31$export$2e2bcd8739ae039","$3624cf55bcd151ae$export$2e2bcd8739ae039","$b3518cf544af5cdf$var$reject","$b3518cf544af5cdf$export$2e2bcd8739ae039","seen","recur","xs","$61ffa13981e1b215$export$2e2bcd8739ae039","$dcb1ad895c4b3d5d$export$2e2bcd8739ae039","mapPairs","$8937ade5fb8d2301$export$2e2bcd8739ae039","$5c0d442f84d168b6$export$2e2bcd8739ae039","repr","$4acbcf4b984c9f91$export$2e2bcd8739ae039","$5cb8b4b0271f2dff$var$invoker","arity","$5b29e47b2597c2b1$export$2e2bcd8739ae039","$86ec2b7eaa959d76$export$2e2bcd8739ae039","$eaf66d0fa65785c8$export$2e2bcd8739ae039","$428fea74b8a4740c$export$2e2bcd8739ae039","$636dac4782166daf$export$2e2bcd8739ae039","methodname","$206d0110c01f0476$export$2e2bcd8739ae039","$73fdc11ed5ec16fc$export$2e2bcd8739ae039","$43ffbbd141da3644$export$2e2bcd8739ae039","fromIndex","toIndex","$a89ec393277388c3$export$2e2bcd8739ae039","$61c9986dd305e157$export$c28c8388be0ab31a","$b4V4J","$21626e8b6a054269$var$__generator","$a388af529d25fc1b$var$__generator","AvatarAnimation","gltfCharacter","gestureTimings","neutralMouthBonePos","firstGesture","currentMimik","jaw","frontal","cheek","cheekBlow","laugh","sad","lipF","lipS","lipM","lipUp","kiss","happyBrow","sadBrow","angryBrow","currentCalculatedMimikData","toLocaleLowerCase","currentGesture","endsWith","holdClip","getCountenance","setCountenance","resolver","resetAnimation","mimikIntensity","shouldBlink","mimikBrowIntensity","$53d6b0a93771e054$var$__generator","$53d6b0a93771e054$var$Avatar","Avatar","lastFrameWithPoseFound","lipsyncShouldPlay","lipSyncNodes","lipsyncIntensity","nextRandomBlinkDelay","lastBlinkSecond","$53d6b0a93771e054$var$THREE","Clock","gestikNodes","currentAudioFrame","lastCheckedFrameForLipsync","morphMeshes","allCharacterMeshes","FPS","startAudioAndLipsync","avatarAnimation","setFacialExpression","enrichedResponseStream","lipSync","setCharacterToPose","gestures","howlStream","AudioSampleRate","startClock","dt","blink","runLipSync","updateFrame","loadModel","$53d6b0a93771e054$var$__awaiter","$53d6b0a93771e054$var$_threeGltfLoader","$21626e8b6a054269$exports","initAvatarDb","$4e0cab620ceb1cb4$exports","BotCommands","$101ba27c80bcf4f4$var$maybe","$101ba27c80bcf4f4$var$Nothing","$101ba27c80bcf4f4$var$Just","$101ba27c80bcf4f4$exports","nothing","maybe","$101ba27c80bcf4f4$var$Maybe","monad","$04a196053f2c6e16$exports","coll","Maybe","just","that","anyEquals","Just","defaultValue","$aa47a66bd9ae85f4$var$call","$aa47a66bd9ae85f4$var$Success","ex","$aa47a66bd9ae85f4$var$Failure","Nothing","$04a196053f2c6e16$var$anyEquals","rec","l_","clean","elem","unsafeLift","$aa47a66bd9ae85f4$exports","$aa47a66bd9ae85f4$var$Try","Try","toMaybe","Success","Failure","$0250657b72b6b37a$exports","$66037793a341fbbf$var$left","$66037793a341fbbf$var$Either","$66037793a341fbbf$var$right","$66037793a341fbbf$exports","leftVal","rightVal","isRight","_right","_left","isLeft","Either","extendStatics","$96f03157c89e808d$exports","Response","answer","expression","$fb3c40d3e8b12942$var$BotConnector","streamHub","botSecret","_this1","LailoBotDirectLineTokenEndpoint","LailoBotDirectLineTokenRefreshEndpoint","directLineUsername","directLineType","SendKeepAlivePingInterval","RefreshTokenInterval","RefreshTokenAfterInternalServerErrorInterval","$fb3c40d3e8b12942$var$__awaiter","$fb3c40d3e8b12942$var$__generator","initDirectLine","sendMessageToBot","speechRecognitionId","directLine","postActivity","directLineUserId","saveDirectLineToken","directLineToken","sendKeepAlivePingToBotConnector","fetchDirectLineToken","$fb3c40d3e8b12942$var$BotFrameworkDirectLineJs","onReceivedBotActivity","LailoBotBaseAddress","$4acf49f6c3e67aec$var$cachedSetTimeout","$4acf49f6c3e67aec$var$cachedClearTimeout","$4acf49f6c3e67aec$var$process","$4acf49f6c3e67aec$exports","$4acf49f6c3e67aec$var$defaultSetTimout","$4acf49f6c3e67aec$var$defaultClearTimeout","$4acf49f6c3e67aec$var$runTimeout","$4acf49f6c3e67aec$var$currentQueue","$4acf49f6c3e67aec$var$queue","$4acf49f6c3e67aec$var$draining","$4acf49f6c3e67aec$var$queueIndex","$4acf49f6c3e67aec$var$cleanUpNextTick","$4acf49f6c3e67aec$var$drainQueue","marker","$4acf49f6c3e67aec$var$runClearTimeout","$4acf49f6c3e67aec$var$Item","$4acf49f6c3e67aec$var$noop","$ee2bbf5ee2258842$var$__spreadArrays","$ee2bbf5ee2258842$exports","$ee2bbf5ee2258842$var$BrowserInfo","$ee2bbf5ee2258842$var$NodeInfo","$ee2bbf5ee2258842$var$BotInfo","$ee2bbf5ee2258842$var$userAgentRules","$ee2bbf5ee2258842$var$operatingSystemRules","$ee2bbf5ee2258842$var$parseUserAgent","ua","matchedRule","matched","uaMatch","versionParts","$ee2bbf5ee2258842$var$createVersionParts","$ee2bbf5ee2258842$var$detectOS","$ee2bbf5ee2258842$var$getNodeVersion","$a4faffbfed8ce8b6$var$getRandomValues","$cb482a25fa64fd81$export$2e2bcd8739ae039","randomUUID","crypto","$a4faffbfed8ce8b6$var$rnds8","getRandomValues","$489cbfc69d38cb8e$var$byteToHex","$489cbfc69d38cb8e$export$8fb373d660548968","$d0666643e2ee88b4$export$2e2bcd8739ae039","rnds","rng","$a4faffbfed8ce8b6$export$2e2bcd8739ae039","$6f3f3d713d15a661$exports","WaveHeader","$6f3f3d713d15a661$var$WaveHeader","waveRiffHeader","interpretWaveHeader","riffChars","wavefmtChars","dataChars","decodeAsciiArray","fmtLength","decodeLittleEndianByteArrayToNum","fmtTag","bytesPerSecond","$2547862260974fa7$var$CommunicationServerState","CommunicationServerState","$2547862260974fa7$var$__generator","$7dd1ddf6834435ca$export$bdfd709ae4826697","$7dd1ddf6834435ca$export$5a759dc7a1cfb72a","$902f5cabe5153acc$exports","workerUrl","isESM","$7dd1ddf6834435ca$var$bundleURL","$7dd1ddf6834435ca$var$getBaseURL","$7dd1ddf6834435ca$var$getBundleURL","$6e16b5bca5fdced1$var$url","$6e16b5bca5fdced1$exports","$2547862260974fa7$var$SpeechRecognition","SpeechRecognition","botMessageStream","language","CommunicationServerRecognitionEndpoint","LailoBotCommunicationServerTokenEndpoint","comServerInitialized","comServerState","Inactive","timeslice","$2547862260974fa7$var$__awaiter","initCommunicationServer","mediaDevices","getUserMedia","getUserMediaConstraints","Started","mediaRecorder","$2547862260974fa7$var$_OpusMediaRecorderUmd","mediaRecorderOptions","ondataavailable","fileReader","FileReader","streamAudioData","readAsArrayBuffer","getUserMediaInitialized","startSpeechRecognition","unregisterSpeechRecognitionConnection","reconnectToStream","getUserAudioStream","stopSpeechRecognition","stopMediaRecorder","SpeechToTextEncoderWorker","createWorker","blobBuilder","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","getBlob","blobUrl","rawData","bufferPayload","Intializing","Active","sendBufferedAudioToCommunicationServer","payload","getPayload","configureCommunicationServer","application","applicationName","locale","communicationServerToken","connectionIndex","getSampleRate","getWaveHeader","waveHeader","SampleRate","communicationServer","audioChunk","startTransmissionTime_1","getTime","uploadTime","firstStreamingUploadTime","$ba0d5a3bd0cc716b$var$__generator","$ba0d5a3bd0cc716b$var$Bot","Bot","playAudio","audioIsPlaying","audioTick","$ba0d5a3bd0cc716b$var$Rx","$ba0d5a3bd0cc716b$var$__awaiter","$599a6bdf70af524b$var$Feed","Feed","$599a6bdf70af524b$exports","Configuration","$599a6bdf70af524b$var$Configuration","feed","Production","cdn","speechServer","contentEndpoint","libEndpoint","characterJsFile","characterFile","mimikFile","lipsyncFile","encoderWorkerFile","getVersionFromIncludedCdn","scripts","getElementsByTagName","scriptSrc","versionIndex","cdnVersion","usedLibEndpoint","usedContentEndpoint","Character","$76d09ed1e4fb415a$exports","CharacterEvent","$76d09ed1e4fb415a$var$CharacterEvent","emitEvent","eventType","eventObject","$766d478ed1ed73b3$var$__generator","$2f6fd18b186324ac$var$__generator","$5ec8f2d461c3f3e1$var$_CoolDown","$5ec8f2d461c3f3e1$var$_interopRequireDefault","$28a802eef493706d$exports","$4851d7ec1f8be33a$exports","Gesture","$4851d7ec1f8be33a$var$Gesture","gestureStart","gestureEnd","sentenceStart","sentenceEnd","$5ec8f2d461c3f3e1$var$_gestures","$9675241926c264ac$exports","word","$9675241926c264ac$var$Word","$5ec8f2d461c3f3e1$var$__assign","$5ec8f2d461c3f3e1$var$coolDown","$5ec8f2d461c3f3e1$var$analyse","sentence","cooldown","startFrame","endFrame","retVal","$5ec8f2d461c3f3e1$var$tokenize","tokens","_d","$5ec8f2d461c3f3e1$var$noTokensFound","codes","probabilities","$5ec8f2d461c3f3e1$var$model","_e","$5ec8f2d461c3f3e1$var$chooseGesture","addGestureCooldown","remainingWords","$5ec8f2d461c3f3e1$exports","analyse","noTokensFound","$5ec8f2d461c3f3e1$var$_Vocabulary","$e5e302773cd3f79e$var$__generator","$c5f119918da96862$var$_gestures","$c5f119918da96862$var$_interopRequireDefault","$b4d8bfffd8fef887$exports","blockGuiForAnswer","initGui","steleMode","$b4d8bfffd8fef887$var$setIconToEnabled","$b4d8bfffd8fef887$var$onListenButtonClick","getElementById","searchParams","innerWidth","innerHeight","character","resize","overflow","keyCode","adjustCamera","releaseGui","listen","$b4d8bfffd8fef887$var$micListening","$b4d8bfffd8fef887$var$micEnabled","$b4d8bfffd8fef887$var$processingDots","display","$b4d8bfffd8fef887$var$setTextField","textField","$b4d8bfffd8fef887$var$lastQuestionMicClick","disabled","$c5f119918da96862$var$__awaiter","$c5f119918da96862$var$__generator","$c5f119918da96862$var$Character","speaking","$55b543ab606bda09$exports","StreamHub","initAvatar","skipCommunicationInit","onInitialised","onQuestionAsked","onAnswered","onAnswer","onListening","characterEvent","messageQueue","enrichedResponse","initObject","error_1","configuration","$53d6b0a93771e054$exports","$766d478ed1ed73b3$exports","MessageQueue","responseStream","$2f6fd18b186324ac$exports","actionEnricher","$2d7e40c36c7c48d3$exports","expressionEnricher","$e5e302773cd3f79e$exports","lipSyncEnricher","$7b86e569ef6ad690$exports","gestureEnricher","$crCKT","messageQueueLock","nextResponse","handleAudioResponse","handleAudiolessResponse","orUndefined","documents","videos","suggestedActions"],"version":3,"file":"character.js.map"}