kopia lustrzana https://github.com/robhawkes/vizicities
1 wiersz
1.0 MiB
1 wiersz
1.0 MiB
{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","vizicities.min.js","webpack:/webpack/bootstrap 09615a9482fefda02e10","webpack:///src/vizicities.js","webpack:///src/World.js","webpack:///~/eventemitter3/index.js","webpack:///~/lodash.assign/index.js","webpack:///~/lodash.keys/index.js","webpack:///~/lodash.rest/index.js","webpack:///src/geo/crs/index.js","webpack:///src/geo/crs/CRS.EPSG3857.js","webpack:///src/geo/crs/CRS.Earth.js","webpack:///src/geo/crs/CRS.js","webpack:///src/geo/LatLon.js","webpack:///src/geo/Point.js","webpack:///src/util/wrapNum.js","webpack:///src/geo/projection/Projection.SphericalMercator.js","webpack:///src/util/Transformation.js","webpack:///src/geo/crs/CRS.EPSG3395.js","webpack:///src/geo/projection/Projection.Mercator.js","webpack:///src/geo/crs/CRS.EPSG4326.js","webpack:///src/geo/projection/Projection.LatLon.js","webpack:///src/geo/crs/CRS.Simple.js","webpack:///src/geo/crs/CRS.Proj4.js","webpack:///src/geo/projection/Projection.Proj4.js","webpack:/external \"proj4\"","webpack:///src/engine/Engine.js","webpack:/external \"THREE\"","webpack:///src/engine/Scene.js","webpack:///src/engine/Renderer.js","webpack:///src/engine/Camera.js","webpack:///src/controls/index.js","webpack:///src/controls/Controls.Orbit.js","webpack:///src/vendor/OrbitControls.js","webpack:///~/hammerjs/hammer.js","webpack:///src/layer/environment/EnvironmentLayer.js","webpack:///src/layer/Layer.js","webpack:///src/layer/environment/Skybox.js","webpack:///src/layer/environment/Sky.js","webpack:///~/lodash.throttle/index.js","webpack:///~/lodash.throttle/~/lodash.debounce/index.js","webpack:///src/layer/tile/ImageTileLayer.js","webpack:///src/layer/tile/TileLayer.js","webpack:///src/layer/tile/TileCache.js","webpack:///~/lru-cache/lib/lru-cache.js","webpack:///~/pseudomap/map.js","webpack:///~/process/browser.js","webpack:///~/pseudomap/pseudomap.js","webpack:///~/util/util.js","webpack:///~/util/support/isBufferBrowser.js","webpack:///~/inherits/inherits_browser.js","webpack:///~/yallist/yallist.js","webpack:///src/layer/tile/ImageTile.js","webpack:///src/layer/tile/Tile.js","webpack:///src/vendor/BoxHelper.js","webpack:///src/layer/tile/ImageTileLayerBaseMaterial.js","webpack:///src/layer/tile/TopoJSONTileLayer.js","webpack:///src/layer/tile/TopoJSONTile.js","webpack:///~/reqwest/reqwest.js","webpack:///~/topojson/build/topojson.js","webpack:///~/earcut/src/earcut.js","webpack:///src/util/extrudePolygon.js","webpack:///~/polygon-offset/src/offset.js","webpack:///~/polygon-offset/~/greiner-hormann/src/greiner-hormann.js","webpack:///~/polygon-offset/~/greiner-hormann/src/clip.js","webpack:///~/polygon-offset/~/greiner-hormann/src/polygon.js","webpack:///~/polygon-offset/~/greiner-hormann/src/vertex.js","webpack:///~/polygon-offset/~/greiner-hormann/src/intersection.js","webpack:///~/polygon-offset/src/edge.js","webpack:///~/polygon-offset/src/intersection.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_22__","__WEBPACK_EXTERNAL_MODULE_24__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","Object","defineProperty","value","_World","_World2","_controlsIndex","_controlsIndex2","_layerEnvironmentEnvironmentLayer","_layerEnvironmentEnvironmentLayer2","_layerTileImageTileLayer","_layerTileImageTileLayer2","_layerTileTopoJSONTileLayer","_layerTileTopoJSONTileLayer2","_geoPoint","_geoPoint2","_geoLatLon","_geoLatLon2","VIZI","version","World","Controls","EnvironmentLayer","ImageTileLayer","TopoJSONTileLayer","Point","LatLon","_classCallCheck","instance","Constructor","TypeError","_inherits","subClass","superClass","prototype","create","constructor","enumerable","writable","configurable","setPrototypeOf","__proto__","_createClass","defineProperties","target","props","i","length","descriptor","key","protoProps","staticProps","_get","_x","_x2","_x3","_again","object","property","receiver","Function","desc","getOwnPropertyDescriptor","undefined","getter","get","parent","getPrototypeOf","_eventemitter3","_eventemitter32","_lodashAssign","_lodashAssign2","_geoCrsIndex","_geoCrsIndex2","_engineEngine","_engineEngine2","_EventEmitter","domId","options","defaults","crs","EPSG3857","skybox","_layers","_controls","_initContainer","_initEngine","_initEnvironment","_initEvents","_update","_container","document","getElementById","_engine","_environment","addTo","on","_onControlsMoveEnd","point","_point","x","z","_resetView","pointToLatLon","latlon","emit","_moveStart","_move","_moveEnd","_lastPosition","delta","clock","getDelta","window","requestAnimationFrame","bind","forEach","controls","update","_originLatlon","_originPoint","project","latLonToPoint","projectedPoint","_subtract","add","unproject","accurate","pointScale","metres","zoom","metresToWorld","worldUnits","worldToMetres","_camera","layer","_addToWorld","push","_scene","_layer","layerIndex","indexOf","splice","remove","destroy","EE","fn","context","once","EventEmitter","prefix","_events","listeners","event","exists","evt","available","l","ee","Array","a1","a2","a3","a4","a5","args","len","arguments","removeListener","apply","j","listener","events","removeAllListeners","off","addListener","setMaxListeners","prefixed","isIndex","reIsUint","test","MAX_SAFE_INTEGER","assignValue","objValue","eq","objectProto","hasOwnProperty","baseProperty","copyObject","source","copyObjectWith","customizer","index","newValue","createAssigner","assigner","rest","sources","guard","isIterateeCall","isObject","type","isArrayLike","other","isFunction","isLength","getLength","tag","objectToString","funcTag","genTag","keys","toString","assign","baseTimes","n","iteratee","result","baseHas","baseKeys","nativeKeys","indexKeys","isArray","isString","isArguments","String","isPrototype","Ctor","proto","isArrayLikeObject","propertyIsEnumerable","argsTag","isObjectLike","stringTag","isProto","indexes","skipIndexes","func","thisArg","start","FUNC_ERROR_TEXT","nativeMax","toInteger","array","otherArgs","toNumber","INFINITY","sign","MAX_INTEGER","remainder","valueOf","replace","reTrim","isBinary","reIsBinary","reIsOctal","freeParseInt","slice","reIsBadHex","NAN","parseInt","Math","max","_CRSEPSG3857","_CRSEPSG38572","_CRSEPSG3395","_CRSEPSG33952","_CRSEPSG4326","_CRSEPSG43262","_CRSSimple","_CRSSimple2","_CRSProj4","_CRSProj42","CRS","EPSG900913","EPSG3395","EPSG4326","Simple","Proj4","_CRSEarth","_CRSEarth2","_projectionProjectionSphericalMercator","_projectionProjectionSphericalMercator2","_utilTransformation","_utilTransformation2","_EPSG3857","code","projection","transformScale","PI","R","transformation","scale","_CRS","_CRS2","_LatLon","Earth","wrapLon","distance","latlon1","latlon2","lat1","lat2","a","rad","lat","lon1","lon","lon2","deltaLat","deltaLon","halfDeltaLat","halfDeltaLon","sin","cos","atan2","sqrt","acos","min","metresToProjected","projectedToMetres","projectedUnits","projectedMetres","scaledMetres","realMetres","_LatLon2","_Point","_Point2","_utilWrapNum","_utilWrapNum2","scaleFactor","_transform","untransformedPoint","untransform","pow","log","LN2","getProjectedBounds","infinite","b","bounds","s","transform","wrapLatLon","wrapLat","alt","isNaN","Error","lng","y","round","clone","_add","wrapNum","range","includeMax","d","SphericalMercator","MAX_LATITUDE","ECC","ECC2","atan","exp","k","sinLat","sinLat2","cosLat","v","h","Transformation","_a","_b","_c","_d","_projectionProjectionMercator","_projectionProjectionMercator2","_EPSG3395","Mercator","R_MINOR","r","tmp","e","con","ts","tan","phi","dphi","abs","_projectionProjectionLatLon","_projectionProjectionLatLon2","_EPSG4326","ProjectionLatLon","m1","m2","m3","m4","p1","p2","p3","latlen","lonlen","_Simple","dx","dy","_projectionProjectionProj4","_projectionProjectionProj42","_Proj4","def","diffX","diffY","halfX","halfY","scaleX","scaleY","offsetX","offsetY","_proj4","_proj42","proj","forward","inverse","bottomLeft","topRight","_three","_three2","_Scene","_Scene2","_Renderer","_Renderer2","_Camera","_Camera2","Engine","container","console","_renderer","Clock","_frustum","Frustum","render","scene","Scene","renderer","WebGLRenderer","antialias","setClearColor","gammaInput","gammaOutput","shadowMap","enabled","cullFace","CullFaceBack","appendChild","domElement","updateSize","setSize","clientWidth","clientHeight","addEventListener","camera","PerspectiveCamera","position","aspect","updateProjectionMatrix","_ControlsOrbit","_ControlsOrbit2","Orbit","_vendorOrbitControls","_vendorOrbitControls2","_this","_world","animate","pointDelta","metresDelta","angle","angleDelta","noZoom","world","addControls","maxPolarAngle","_hammerjs","_hammerjs2","OrbitControls","getAutoRotationAngle","scope","autoRotateSpeed","getZoomScale","zoomSpeed","rotateLeft","thetaDelta","rotateUp","phiDelta","dollyIn","dollyScale","OrthographicCamera","minZoom","maxZoom","zoomChanged","warn","enableZoom","dollyOut","handleMouseDownRotate","rotateStart","set","clientX","clientY","handleMouseDownDolly","dollyStart","handleMouseDownPan","panStart","handleMouseMoveRotate","rotateEnd","rotateDelta","subVectors","element","body","rotateSpeed","copy","handleMouseMoveDolly","dollyEnd","dollyDelta","handleMouseMovePan","panEnd","panDelta","pan","handleMouseUp","handleMouseWheel","wheelDelta","detail","handleKeyDown","keyCode","UP","keyPanSpeed","BOTTOM","LEFT","RIGHT","handleTouchStartRotate","pointers","pageX","pageY","handleTouchStartDolly","handleTouchStartPan","deltaX","deltaY","handleTouchMoveRotate","handleTouchMoveDolly","handleTouchMovePan","handleTouchEnd","onMouseDown","preventDefault","button","mouseButtons","ORBIT","enableRotate","state","STATE","ROTATE","ZOOM","DOLLY","PAN","enablePan","NONE","onMouseMove","onMouseUp","dispatchEvent","startEvent","removeEventListener","endEvent","onMouseWheel","stopPropagation","onKeyDown","enableKeys","onTouchStart","touches","TOUCH_ROTATE","TOUCH_DOLLY","TOUCH_PAN","onTouchMove","onTouchEnd","onContextMenu","Vector3","minDistance","maxDistance","Infinity","minPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","autoRotate","MOUSE","MIDDLE","target0","position0","zoom0","getPolarAngle","getAzimuthalAngle","theta","reset","changeEvent","offset","quat","Quaternion","setFromUnitVectors","up","quatInverse","lastPosition","lastQuaternion","sub","applyQuaternion","EPS","radius","panOffset","lookAt","distanceToSquared","dot","quaternion","dispose","Vector2","panLeft","objectMatrix","te","elements","multiplyScalar","panUp","adjDist","targetDistance","fov","matrix","right","left","top","bottom","hammer","direction","DIRECTION_ALL","enable","threshold","EventDispatcher","center","noRotate","noPan","noKeys","staticMoving","constraint","dynamicDampingFactor","__WEBPACK_AMD_DEFINE_RESULT__","exportName","setTimeoutContext","timeout","setTimeout","bindFn","invokeArrayArg","arg","each","iterator","deprecate","method","name","message","deprecationMessage","stack","inherit","child","base","properties","childP","baseP","_super","boolOrFn","val","TYPE_FUNCTION","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","removeEventListeners","hasParent","node","parentNode","inStr","str","find","trim","split","inArray","src","findByKey","toArray","uniqueArray","sort","results","values","prop","camelProp","toUpperCase","VENDOR_PREFIXES","uniqueId","_uniqueId","getWindowForElement","doc","ownerDocument","defaultView","parentWindow","Input","manager","callback","self","inputTarget","domHandler","ev","init","createInputInstance","Type","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","SUPPORT_ONLY_TOUCH","TouchInput","SUPPORT_TOUCH","TouchMouseInput","MouseInput","inputHandler","eventType","input","pointersLen","changedPointersLen","changedPointers","isFirst","INPUT_START","isFinal","INPUT_END","INPUT_CANCEL","session","computeInputData","recognize","prevInput","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","getCenter","timeStamp","now","deltaTime","getAngle","getDistance","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","getScale","rotation","getRotation","maxPointers","computeIntervalInputData","srcEvent","offsetDelta","prevDelta","velocity","velocityX","velocityY","last","lastInterval","COMPUTE_INTERVAL","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","PROPS_XY","end","PROPS_CLIENT_XY","evEl","MOUSE_ELEMENT_EVENTS","evWin","MOUSE_WINDOW_EVENTS","allow","pressed","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","pointerEvents","SingleTouchInput","evTarget","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","started","normalizeSingleTouches","all","changed","changedTouches","concat","TOUCH_TARGET_EVENTS","targetIds","getTouches","allTouches","INPUT_MOVE","identifier","targetTouches","changedTargetTouches","filter","touch","mouse","TouchAction","cleanTouchActions","actions","TOUCH_ACTION_NONE","hasPanX","TOUCH_ACTION_PAN_X","hasPanY","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_AUTO","Recognizer","STATE_POSSIBLE","simultaneous","requireFail","stateStr","STATE_CANCELLED","STATE_ENDED","STATE_CHANGED","STATE_BEGAN","directionStr","getRecognizerByNameIfManager","otherRecognizer","recognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","recognizers","preset","Manager","handlers","touchAction","toggleCssProps","item","recognizeWith","requireFailure","style","cssProps","triggerDomEvent","data","gestureEvent","createEvent","initEvent","gesture","TEST_ELEMENT","createElement","Date","output","nextKey","extend","dest","merge","MOBILE_REGEX","navigator","userAgent","INPUT_TYPE_TOUCH","INPUT_TYPE_PEN","INPUT_TYPE_MOUSE","INPUT_TYPE_KINECT","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM",2,3,4,5,"MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","TOUCH_INPUT_MAP","inputEvent","inputData","isMouse","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","compute","getTouchAction","join","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_RECOGNIZED","STATE_FAILED","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","process","attrTest","optionPointers","isRecognized","isValid","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","STOP","FORCED_STOP","stop","force","stopped","curRecognizer","existing","Tap","Pan","Swipe","Pinch","Rotate","Press","freeGlobal","_Layer2","_Layer3","_Skybox","_Skybox2","_Layer","_options","_initLights","_initSkybox","_skyboxLight","DirectionalLight","castShadow","shadow","near","far","mapSize","width","height","directionalLight","intesity","directionalLight2","helper","DirectionalLightHelper","helper2","_skybox","_mesh","size","step","gridHelper","GridHelper","_engineScene","Layer","Object3D","addLayer","_onAdd","children","geometry","material","map","_Sky","_Sky2","_lodashThrottle","_lodashThrottle2","cubemap","vertexShader","fragmentShader","Skybox","light","_light","_settings","turbidity","reileigh","mieCoefficient","mieDirectionalG","luminance","inclination","azimuth","_updateUniforms","_throttledWorldUpdate","_cubeCamera","CubeCamera","cubeTarget","renderTarget","_sky","_skyScene","mesh","_sunSphere","Mesh","SphereBufferGeometry","MeshBasicMaterial","color","skyboxUniforms","skyboxMat","ShaderMaterial","uniforms","side","BackSide","BoxGeometry","settings","sunPosition","_done","intensity","updateCubeMap","ShaderLib","Sky","skyShader","skyUniforms","UniformsUtils","skyMat","skyGeo","skyMesh","throttle","wait","leading","trailing","debounce","maxWait","cancel","timeoutId","maxTimeoutId","lastCalled","trailingCall","complete","isCalled","delayed","remaining","stamp","flush","maxDelayed","debounced","leadingCall","_TileLayer2","_TileLayer3","_ImageTile","_ImageTile2","_ImageTileLayerBaseMaterial","_ImageTileLayerBaseMaterial2","_TileLayer","path","_path","baseMaterial","geom","PlaneBufferGeometry","getRenderTarget","receiveShadow","_baseLayer","_calculateLOD","_onWorldUpdate","_onWorldMove","_outputTiles","_moveBaseLayer","quadcode","_TileCache","_TileCache2","TileLayer","maxCache","maxLOD","_tileCache","tile","_destroyTile","_tileList","_minLOD","_maxLOD","_tiles","getCamera","projScreenMatrix","Matrix4","multiplyMatrices","projectionMatrix","matrixWorldInverse","setFromMatrix","getBounds","intersectsBox","Box3","_this2","_removeTiles","isReady","getMesh","_this3","_stop","_updateFrustum","checkList","_checklist","_requestTile","_divide","_tileInFrustum","dist","requestTileAsync","currentItem","getQuadcode","_screenSpaceError","minDepth","maxDepth","quality","error","getSide","getTile","_createTile","setTile","_lruCache","_lruCache2","TileCache","cacheLimit","onDestroyTile","_cache","priv","sym","symbols","makeSymbol","naiveLength","LRUCache","lc","stale","maxAge","forEachStep","thisp","hit","isStale","del","doUse","unshiftNode","diff","walker","tail","prev","removeNode","Entry","Map","util","Yallist","hasSymbol","Symbol","mL","allowStale","mA","lC","rforEach","head","next","dump","dumpLru","inspect","opts","extras","as","didFirst","has","unshift","peek","pop","load","arr","expiresAt","prune","env","npm_package_name","npm_lifecycle_script","TEST_PSEUDOMAP","cleanUpNextTick","draining","currentQueue","queue","queueIndex","drainQueue","run","Item","fun","noop","nextTick","title","browser","argv","versions","binding","cwd","chdir","dir","umask","PseudoMap","clear","kv","same","_index","_data","res","entries","global","ctx","seen","stylize","stylizeNoColor","depth","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","styleType","styles","arrayToHash","hash","idx","recurseTimes","ret","primitive","formatPrimitive","visibleKeys","getOwnPropertyNames","isError","formatError","isRegExp","RegExp","isDate","braces","toUTCString","formatArray","formatProperty","reduceToSingleString","simple","JSON","stringify","isNumber","isNull","match","line","substr","numLinesEst","reduce","cur","ar","isNullOrUndefined","isSymbol","re","isPrimitive","o","pad","timestamp","getHours","getMinutes","getSeconds","getDate","months","getMonth","formatRegExp","format","f","objects","Number","_","msg","deprecated","warned","throwDeprecation","traceDeprecation","trace","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","pid","bold","italic","underline","white","grey","black","blue","cyan","green","magenta","red","yellow","special","number","boolean","null","string","date","regexp","isBuffer","inherits","origin","fill","readUInt8","ctor","superCtor","super_","TempCtor","list","Node","pushNode","shift","forEachReverse","getReverse","mapReverse","initial","acc","reduceReverse","toArrayReverse","from","to","sliceReverse","reverse","_Tile2","_Tile3","_vendorBoxHelper","ImageTile","_Tile","_createMesh","_abortRequest","_image","_center","_side","MeshStandardMaterial","depthWrite","roughness","metalness","envMap","localMesh","renderOrder","canvas","getContext","font","fillStyle","fillText","_quadcode","_tile","texture","Texture","magFilter","LinearFilter","minFilter","LinearMipMapLinearFilter","anisotropy","needsUpdate","transparent","urlParams","url","_getTileURL","image","_texture","_ready","crossOrigin","r2d","tileURLRegex","Tile","_quadcodeToTile","_boundsLatLon","_tileBoundsWGS84","_boundsWorld","_tileBoundsFromWGS84","_boundsToCenter","_centerLatlon","_getSide","_pointScale","fromCharCode","floor","random","lastIndex","mask","q","boundsWGS84","sw","ne","_tile2lon","w","_tile2lat","BoxHelper","indices","Uint16Array","positions","Float32Array","BufferGeometry","setIndex","BufferAttribute","addAttribute","LineSegments","LineBasicMaterial","linewidth","box","setFromObject","isEmpty","attributes","computeBoundingSphere","colour","skyboxTarget","fillRect","_TopoJSONTile","_TopoJSONTile2","_onControlsMove","_pauseOutput","_reqwest","_reqwest2","_topojson","_topojson2","_earcut","_earcut2","_utilExtrudePolygon","_utilExtrudePolygon2","_polygonOffset","_polygonOffset2","TopoJSONTile","_request","coordinates","_coords","_offset","_shadowCanvas","ring","beginPath","coord","xFrac","yFrac","padding","moveTo","lineTo","closePath","then","_processTileData","err","_this4","geojson","feature","vectile","earcutData","faces","allVertices","allFaces","allColours","facesCount","Color","features","coordinate","_toEarcut","_triangulate","vertices","holes","dimensions","groupedVertices","il","extruded","topColor","multiply","bottomColor","_faces","_colours","_colour","face","fi","g","sides","_vertices","normals","colours","pA","pB","pC","cb","ab","ax","ay","az","c1","bx","by","bz","c2","cx","cy","cz","c3","cross","normalize","nx","ny","nz","computeBoundingBox","vertexColors","VertexColors","envMapIntensity","MeshPhongMaterial","timeEnd","dim","holeIndex","contour","abort","__WEBPACK_AMD_DEFINE_FACTORY__","definition","succeed","protocol","protocolRe","exec","location","httpsRe","twoHundo","request","status","response","handleReadyState","success","_aborted","_timedOut","readyState","onreadystatechange","setHeaders","http","headers","defaultHeaders","isAFormData","FormData","requestedWith","contentType","setRequestHeader","setCredentials","withCredentials","generalCallback","lastValue","urlappend","handleJsonp","reqId","uniqid","cbkey","cbval","reqwest","getcallbackPrefix","cbreg","script","isIE10","async","htmlFor","onload","onclick","removeChild","getRequest","toQueryString","sendWait","xhr","open","xDomainRequest","onerror","onprogress","send","Reqwest","setType","header","resp","_completeHandlers","getResponseHeader","filteredResponse","globalSetupOptions","dataFilter","responseText","parse","eval","responseXML","parseError","errorCode","reason","_responseArgs","_fulfilled","_successHandler","_fulfillmentHandlers","timedOut","t","_erred","_errorHandlers","serial","el","ch","ra","tagName","optCb","disabled","checked","selectedIndex","selected","eachFormElement","serializeSubtags","tags","fa","byTag","serializeQueryString","serializeArray","serializeHash","buildParams","traditional","rbracket","XHR2","ex","callbackPrefix","xmlHttpRequest","accept","*","xml","html","text","json","js","XMLHttpRequest","XDomainRequest","ActiveXObject","retry","fail","always","catch","serialize","opt","nodeType","trad","enc","encodeURIComponent","compat","ajaxSetup","absolute","x0","y0","kx","ky","translate","relative","x1","y1","bisect","lo","hi","mid","topology","geometries","feature$1","arc","points","arcs","absolute$$","polygon","geometryType","MultiPoint","LineString","MultiLineString","Polygon","MultiPolygon","stitchArcs","ends","p0","dp","fragmentByEnd","fragmentByStart","stitchedArcs","fragments","emptyIndex","fg","gf","meshArcs","geomsByArc","geoms","triangle","area","mergeArcs","register","ring$$","polygonsByArc","polygons","exterior","components","component","neighbors","sgn","indexesByArc","ij","ik","compareArea","minAreaHeap","down","heap","removed","presimplify","triangleArea","relative$$","triangles","maxArea","previous","earcut","holeIndices","hasHoles","outerLen","outerNode","linkedList","minX","minY","maxX","maxY","eliminateHoles","earcutLinked","clockwise","sum","insertNode","filterPoints","again","steiner","equals","ear","pass","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","minZ","zOrder","maxZ","nextZ","prevZ","intersects","locallyInside","isValidDiagonal","splitPolygon","getLeftmost","compareX","eliminateHole","hole","findHoleBridge","hx","hy","qx","tanMin","sortLinked","numMerges","pSize","qSize","inSize","leftmost","px","py","intersectsPolygon","middleInside","q1","q2","inside","b2","an","bp","extrudePolygon","flat","cells","topCells","full","sideCells","closed","bottomCells","Offset","arcSegments","edges","_closed","_arcSegments","GreinerHormann","Edge","intersection","validate","createArc","startVertex","endVertex","segments","outwards","PI2","startAngle","endAngle","segmentAngle","union","offsetEdges","edge","_outNormal","thisEdge","prevEdge","vertex","current","ensureLastPoint","margin","_inNormal","clip","polygonA","polygonB","eA","eB","Vertex","Intersection","arrayVertices","first","_lastUnprocessed","_arrayVertices","addVertex","insertVertex","curr","_distance","getNext","_isIntersection","getFirstIntersect","_firstIntersect","_visited","hasUnprocessed","getPoints","sourceForwards","clipForwards","sourceInClip","clipInSource","sourceVertex","clipVertex","valid","sourceIntersection","createIntersection","toSource","clipIntersection","toClip","_corresponding","isInside","_isEntry","clipped","visit","poly","oddNodes","s1","s2","inwardsNormal","outwardsNormal","inwards","edgeLength","A0","A1","B0","B1","den","ua","ub"],"mappings":"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","file":"vizicities.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"proj4\"), require(\"THREE\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"proj4\", \"THREE\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VIZI\"] = factory(require(\"proj4\"), require(\"THREE\"));\n\telse\n\t\troot[\"VIZI\"] = factory(root[\"proj4\"], root[\"THREE\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_22__, __WEBPACK_EXTERNAL_MODULE_24__) {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _World = __webpack_require__(1);\n\t\n\tvar _World2 = _interopRequireDefault(_World);\n\t\n\tvar _controlsIndex = __webpack_require__(28);\n\t\n\tvar _controlsIndex2 = _interopRequireDefault(_controlsIndex);\n\t\n\tvar _layerEnvironmentEnvironmentLayer = __webpack_require__(32);\n\t\n\tvar _layerEnvironmentEnvironmentLayer2 = _interopRequireDefault(_layerEnvironmentEnvironmentLayer);\n\t\n\tvar _layerTileImageTileLayer = __webpack_require__(38);\n\t\n\tvar _layerTileImageTileLayer2 = _interopRequireDefault(_layerTileImageTileLayer);\n\t\n\tvar _layerTileTopoJSONTileLayer = __webpack_require__(53);\n\t\n\tvar _layerTileTopoJSONTileLayer2 = _interopRequireDefault(_layerTileTopoJSONTileLayer);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar VIZI = {\n\t version: '0.3',\n\t\n\t // Public API\n\t World: _World2['default'],\n\t Controls: _controlsIndex2['default'],\n\t EnvironmentLayer: _layerEnvironmentEnvironmentLayer2['default'],\n\t ImageTileLayer: _layerTileImageTileLayer2['default'],\n\t TopoJSONTileLayer: _layerTileTopoJSONTileLayer2['default'],\n\t Point: _geoPoint2['default'],\n\t LatLon: _geoLatLon2['default']\n\t};\n\t\n\texports['default'] = VIZI;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _geoCrsIndex = __webpack_require__(6);\n\t\n\tvar _geoCrsIndex2 = _interopRequireDefault(_geoCrsIndex);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _engineEngine = __webpack_require__(23);\n\t\n\tvar _engineEngine2 = _interopRequireDefault(_engineEngine);\n\t\n\t// Pretty much any event someone using ViziCities would need will be emitted or\n\t// proxied by World (eg. render events, etc)\n\t\n\tvar World = (function (_EventEmitter) {\n\t _inherits(World, _EventEmitter);\n\t\n\t function World(domId, options) {\n\t _classCallCheck(this, World);\n\t\n\t _get(Object.getPrototypeOf(World.prototype), 'constructor', this).call(this);\n\t\n\t var defaults = {\n\t crs: _geoCrsIndex2['default'].EPSG3857,\n\t skybox: false\n\t };\n\t\n\t this.options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._layers = [];\n\t this._controls = [];\n\t\n\t this._initContainer(domId);\n\t this._initEngine();\n\t this._initEnvironment();\n\t this._initEvents();\n\t\n\t // Kick off the update and render loop\n\t this._update();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(World, [{\n\t key: '_initContainer',\n\t value: function _initContainer(domId) {\n\t this._container = document.getElementById(domId);\n\t }\n\t }, {\n\t key: '_initEngine',\n\t value: function _initEngine() {\n\t this._engine = (0, _engineEngine2['default'])(this._container);\n\t\n\t // Engine events\n\t //\n\t // Consider proxying these through events on World for public access\n\t // this._engine.on('preRender', () => {});\n\t // this._engine.on('postRender', () => {});\n\t }\n\t }, {\n\t key: '_initEnvironment',\n\t value: function _initEnvironment() {\n\t // Not sure if I want to keep this as a private API\n\t //\n\t // Makes sense to allow others to customise their environment so perhaps\n\t // add some method of disable / overriding the environment settings\n\t this._environment = VIZI.EnvironmentLayer({\n\t skybox: this.options.skybox\n\t }).addTo(this);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t this.on('controlsMoveEnd', this._onControlsMoveEnd);\n\t }\n\t }, {\n\t key: '_onControlsMoveEnd',\n\t value: function _onControlsMoveEnd(point) {\n\t var _point = (0, _geoPoint2['default'])(point.x, point.z);\n\t this._resetView(this.pointToLatLon(_point), _point);\n\t }\n\t\n\t // Reset world view\n\t }, {\n\t key: '_resetView',\n\t value: function _resetView(latlon, point) {\n\t this.emit('preResetView');\n\t\n\t this._moveStart();\n\t this._move(latlon, point);\n\t this._moveEnd();\n\t\n\t this.emit('postResetView');\n\t }\n\t }, {\n\t key: '_moveStart',\n\t value: function _moveStart() {\n\t this.emit('moveStart');\n\t }\n\t }, {\n\t key: '_move',\n\t value: function _move(latlon, point) {\n\t this._lastPosition = latlon;\n\t this.emit('move', latlon, point);\n\t }\n\t }, {\n\t key: '_moveEnd',\n\t value: function _moveEnd() {\n\t this.emit('moveEnd');\n\t }\n\t }, {\n\t key: '_update',\n\t value: function _update() {\n\t var delta = this._engine.clock.getDelta();\n\t\n\t // Once _update is called it will run forever, for now\n\t window.requestAnimationFrame(this._update.bind(this));\n\t\n\t // Update controls\n\t this._controls.forEach(function (controls) {\n\t controls.update();\n\t });\n\t\n\t this.emit('preUpdate', delta);\n\t this._engine.update(delta);\n\t this.emit('postUpdate', delta);\n\t }\n\t\n\t // Set world view\n\t }, {\n\t key: 'setView',\n\t value: function setView(latlon) {\n\t // Store initial geographic coordinate for the [0,0,0] world position\n\t //\n\t // The origin point doesn't move in three.js / 3D space so only set it once\n\t // here instead of every time _resetView is called\n\t //\n\t // If it was updated every time then coorindates would shift over time and\n\t // would be out of place / context with previously-placed points (0,0 would\n\t // refer to a different point each time)\n\t this._originLatlon = latlon;\n\t this._originPoint = this.project(latlon);\n\t\n\t this._resetView(latlon);\n\t return this;\n\t }\n\t\n\t // Return world geographic position\n\t }, {\n\t key: 'getPosition',\n\t value: function getPosition() {\n\t return this._lastPosition;\n\t }\n\t\n\t // Transform geographic coordinate to world point\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the origin point of the projection (not the world)\n\t }, {\n\t key: 'project',\n\t value: function project(latlon) {\n\t return this.options.crs.latLonToPoint((0, _geoLatLon2['default'])(latlon));\n\t }\n\t\n\t // Transform world point to geographic coordinate\n\t //\n\t // This doesn't take into account the origin offset\n\t //\n\t // For example, this takes a point relative to the origin point of the\n\t // projection (not the world) and returns a geographic coordinate\n\t }, {\n\t key: 'unproject',\n\t value: function unproject(point) {\n\t return this.options.crs.pointToLatLon((0, _geoPoint2['default'])(point));\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a geographic coordinate and returns a point\n\t // relative to the three.js / 3D origin (0,0)\n\t }, {\n\t key: 'latLonToPoint',\n\t value: function latLonToPoint(latlon) {\n\t var projectedPoint = this.project((0, _geoLatLon2['default'])(latlon));\n\t return projectedPoint._subtract(this._originPoint);\n\t }\n\t\n\t // Takes into account the origin offset\n\t //\n\t // For example, this takes a point relative to the three.js / 3D origin (0,0)\n\t // and returns the exact geographic coordinate at that point\n\t }, {\n\t key: 'pointToLatLon',\n\t value: function pointToLatLon(point) {\n\t var projectedPoint = (0, _geoPoint2['default'])(point).add(this._originPoint);\n\t return this.unproject(projectedPoint);\n\t }\n\t\n\t // Return pointscale for a given geographic coordinate\n\t }, {\n\t key: 'pointScale',\n\t value: function pointScale(latlon, accurate) {\n\t return this.options.crs.pointScale(latlon, accurate);\n\t }\n\t\n\t // Convert from real meters to world units\n\t //\n\t // TODO: Would be nice not to have to pass in a pointscale here\n\t }, {\n\t key: 'metresToWorld',\n\t value: function metresToWorld(metres, pointScale, zoom) {\n\t return this.options.crs.metresToWorld(metres, pointScale, zoom);\n\t }\n\t\n\t // Convert from real meters to world units\n\t //\n\t // TODO: Would be nice not to have to pass in a pointscale here\n\t }, {\n\t key: 'worldToMetres',\n\t value: function worldToMetres(worldUnits, pointScale, zoom) {\n\t return this.options.crs.worldToMetres(worldUnits, pointScale, zoom);\n\t }\n\t\n\t // Unsure if it's a good idea to expose this here for components like\n\t // GridLayer to use (eg. to keep track of a frustum)\n\t }, {\n\t key: 'getCamera',\n\t value: function getCamera() {\n\t return this._engine._camera;\n\t }\n\t }, {\n\t key: 'addLayer',\n\t value: function addLayer(layer) {\n\t layer._addToWorld(this);\n\t\n\t this._layers.push(layer);\n\t\n\t // Could move this into Layer but it'll do here for now\n\t this._engine._scene.add(layer._layer);\n\t\n\t this.emit('layerAdded', layer);\n\t return this;\n\t }\n\t\n\t // Remove layer and perform clean up operations\n\t }, {\n\t key: 'removeLayer',\n\t value: function removeLayer(layer) {\n\t var layerIndex = this._layers.indexOf(layer);\n\t\n\t if (layerIndex > -1) {\n\t // Remove from this._layers\n\t this._layers.splice(layerIndex, 1);\n\t };\n\t\n\t this._engine._scene.remove(layer._layer);\n\t\n\t layer.destroy();\n\t\n\t this.emit('layerRemoved');\n\t return this;\n\t }\n\t }, {\n\t key: 'addControls',\n\t value: function addControls(controls) {\n\t controls._addToWorld(this);\n\t\n\t this._controls.push(controls);\n\t\n\t this.emit('controlsAdded', controls);\n\t return this;\n\t }\n\t }, {\n\t key: 'removeControls',\n\t value: function removeControls(controls) {}\n\t }]);\n\t\n\t return World;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (domId, options) {\n\t return new World(domId, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\t//\n\t// We store our EE objects in a plain object whose properties are event names.\n\t// If `Object.create(null)` is not supported we prefix the event names with a\n\t// `~` to make sure that the built-in object properties are not overridden or\n\t// used as an attack vector.\n\t// We also assume that `Object.create(null)` is available when the event name\n\t// is an ES6 Symbol.\n\t//\n\tvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\t\n\t/**\n\t * Representation of a single EventEmitter function.\n\t *\n\t * @param {Function} fn Event handler to be called.\n\t * @param {Mixed} context Context for function execution.\n\t * @param {Boolean} once Only emit once\n\t * @api private\n\t */\n\tfunction EE(fn, context, once) {\n\t this.fn = fn;\n\t this.context = context;\n\t this.once = once || false;\n\t}\n\t\n\t/**\n\t * Minimal EventEmitter interface that is molded against the Node.js\n\t * EventEmitter interface.\n\t *\n\t * @constructor\n\t * @api public\n\t */\n\tfunction EventEmitter() { /* Nothing to set */ }\n\t\n\t/**\n\t * Holds the assigned EventEmitters by name.\n\t *\n\t * @type {Object}\n\t * @private\n\t */\n\tEventEmitter.prototype._events = undefined;\n\t\n\t/**\n\t * Return a list of assigned event listeners.\n\t *\n\t * @param {String} event The events that should be listed.\n\t * @param {Boolean} exists We only need to know if there are listeners.\n\t * @returns {Array|Boolean}\n\t * @api public\n\t */\n\tEventEmitter.prototype.listeners = function listeners(event, exists) {\n\t var evt = prefix ? prefix + event : event\n\t , available = this._events && this._events[evt];\n\t\n\t if (exists) return !!available;\n\t if (!available) return [];\n\t if (available.fn) return [available.fn];\n\t\n\t for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n\t ee[i] = available[i].fn;\n\t }\n\t\n\t return ee;\n\t};\n\t\n\t/**\n\t * Emit an event to all registered event listeners.\n\t *\n\t * @param {String} event The name of the event.\n\t * @returns {Boolean} Indication if we've emitted an event.\n\t * @api public\n\t */\n\tEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return false;\n\t\n\t var listeners = this._events[evt]\n\t , len = arguments.length\n\t , args\n\t , i;\n\t\n\t if ('function' === typeof listeners.fn) {\n\t if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: return listeners.fn.call(listeners.context), true;\n\t case 2: return listeners.fn.call(listeners.context, a1), true;\n\t case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n\t case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n\t case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n\t case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n\t }\n\t\n\t for (i = 1, args = new Array(len -1); i < len; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t\n\t listeners.fn.apply(listeners.context, args);\n\t } else {\n\t var length = listeners.length\n\t , j;\n\t\n\t for (i = 0; i < length; i++) {\n\t if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\t\n\t switch (len) {\n\t case 1: listeners[i].fn.call(listeners[i].context); break;\n\t case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n\t case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n\t default:\n\t if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n\t args[j - 1] = arguments[j];\n\t }\n\t\n\t listeners[i].fn.apply(listeners[i].context, args);\n\t }\n\t }\n\t }\n\t\n\t return true;\n\t};\n\t\n\t/**\n\t * Register a new EventListener for the given event.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Functon} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.on = function on(event, fn, context) {\n\t var listener = new EE(fn, context || this)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Add an EventListener that's only called once.\n\t *\n\t * @param {String} event Name of the event.\n\t * @param {Function} fn Callback function.\n\t * @param {Mixed} context The context of the function.\n\t * @api public\n\t */\n\tEventEmitter.prototype.once = function once(event, fn, context) {\n\t var listener = new EE(fn, context || this, true)\n\t , evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events) this._events = prefix ? {} : Object.create(null);\n\t if (!this._events[evt]) this._events[evt] = listener;\n\t else {\n\t if (!this._events[evt].fn) this._events[evt].push(listener);\n\t else this._events[evt] = [\n\t this._events[evt], listener\n\t ];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove event listeners.\n\t *\n\t * @param {String} event The event we want to remove.\n\t * @param {Function} fn The listener that we need to find.\n\t * @param {Mixed} context Only remove listeners matching this context.\n\t * @param {Boolean} once Only remove once listeners.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n\t var evt = prefix ? prefix + event : event;\n\t\n\t if (!this._events || !this._events[evt]) return this;\n\t\n\t var listeners = this._events[evt]\n\t , events = [];\n\t\n\t if (fn) {\n\t if (listeners.fn) {\n\t if (\n\t listeners.fn !== fn\n\t || (once && !listeners.once)\n\t || (context && listeners.context !== context)\n\t ) {\n\t events.push(listeners);\n\t }\n\t } else {\n\t for (var i = 0, length = listeners.length; i < length; i++) {\n\t if (\n\t listeners[i].fn !== fn\n\t || (once && !listeners[i].once)\n\t || (context && listeners[i].context !== context)\n\t ) {\n\t events.push(listeners[i]);\n\t }\n\t }\n\t }\n\t }\n\t\n\t //\n\t // Reset the array, or remove it completely if we have no more listeners.\n\t //\n\t if (events.length) {\n\t this._events[evt] = events.length === 1 ? events[0] : events;\n\t } else {\n\t delete this._events[evt];\n\t }\n\t\n\t return this;\n\t};\n\t\n\t/**\n\t * Remove all listeners or only the listeners for the specified event.\n\t *\n\t * @param {String} event The event want to remove all listeners for.\n\t * @api public\n\t */\n\tEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n\t if (!this._events) return this;\n\t\n\t if (event) delete this._events[prefix ? prefix + event : event];\n\t else this._events = prefix ? {} : Object.create(null);\n\t\n\t return this;\n\t};\n\t\n\t//\n\t// Alias methods names because people roll like that.\n\t//\n\tEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\tEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\t\n\t//\n\t// This function doesn't apply anymore.\n\t//\n\tEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n\t return this;\n\t};\n\t\n\t//\n\t// Expose the prefix.\n\t//\n\tEventEmitter.prefixed = prefix;\n\t\n\t//\n\t// Expose the module.\n\t//\n\tif (true) {\n\t module.exports = EventEmitter;\n\t}\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) <https://lodash.com/>\n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n\t * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license <https://lodash.com/license>\n\t */\n\tvar keys = __webpack_require__(4),\n\t rest = __webpack_require__(5);\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/**\n\t * Assigns `value` to `key` of `object` if the existing value is not equivalent\n\t * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * for equality comparisons.\n\t *\n\t * @private\n\t * @param {Object} object The object to modify.\n\t * @param {string} key The key of the property to assign.\n\t * @param {*} value The value to assign.\n\t */\n\tfunction assignValue(object, key, value) {\n\t var objValue = object[key];\n\t if ((!eq(objValue, value) ||\n\t (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n\t (value === undefined && !(key in object))) {\n\t object[key] = value;\n\t }\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Copies properties of `source` to `object`.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObject(source, props, object) {\n\t return copyObjectWith(source, props, object);\n\t}\n\t\n\t/**\n\t * This function is like `copyObject` except that it accepts a function to\n\t * customize copied values.\n\t *\n\t * @private\n\t * @param {Object} source The object to copy properties from.\n\t * @param {Array} props The property names to copy.\n\t * @param {Object} [object={}] The object to copy properties to.\n\t * @param {Function} [customizer] The function to customize copied values.\n\t * @returns {Object} Returns `object`.\n\t */\n\tfunction copyObjectWith(source, props, object, customizer) {\n\t object || (object = {});\n\t\n\t var index = -1,\n\t length = props.length;\n\t\n\t while (++index < length) {\n\t var key = props[index],\n\t newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\t\n\t assignValue(object, key, newValue);\n\t }\n\t return object;\n\t}\n\t\n\t/**\n\t * Creates a function like `_.assign`.\n\t *\n\t * @private\n\t * @param {Function} assigner The function to assign values.\n\t * @returns {Function} Returns the new assigner function.\n\t */\n\tfunction createAssigner(assigner) {\n\t return rest(function(object, sources) {\n\t var index = -1,\n\t length = sources.length,\n\t customizer = length > 1 ? sources[length - 1] : undefined,\n\t guard = length > 2 ? sources[2] : undefined;\n\t\n\t customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n\t if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n\t customizer = length < 3 ? undefined : customizer;\n\t length = 1;\n\t }\n\t object = Object(object);\n\t while (++index < length) {\n\t var source = sources[index];\n\t if (source) {\n\t assigner(object, source, index, customizer);\n\t }\n\t }\n\t return object;\n\t });\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Checks if the provided arguments are from an iteratee call.\n\t *\n\t * @private\n\t * @param {*} value The potential iteratee value argument.\n\t * @param {*} index The potential iteratee index or key argument.\n\t * @param {*} object The potential iteratee object argument.\n\t * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n\t */\n\tfunction isIterateeCall(value, index, object) {\n\t if (!isObject(object)) {\n\t return false;\n\t }\n\t var type = typeof index;\n\t if (type == 'number'\n\t ? (isArrayLike(object) && isIndex(index, object.length))\n\t : (type == 'string' && index in object)) {\n\t return eq(object[index], value);\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n\t * comparison between two values to determine if they are equivalent.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to compare.\n\t * @param {*} other The other value to compare.\n\t * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n\t * @example\n\t *\n\t * var object = { 'user': 'fred' };\n\t * var other = { 'user': 'fred' };\n\t *\n\t * _.eq(object, object);\n\t * // => true\n\t *\n\t * _.eq(object, other);\n\t * // => false\n\t *\n\t * _.eq('a', 'a');\n\t * // => true\n\t *\n\t * _.eq('a', Object('a'));\n\t * // => false\n\t *\n\t * _.eq(NaN, NaN);\n\t * // => true\n\t */\n\tfunction eq(value, other) {\n\t return value === other || (value !== value && other !== other);\n\t}\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Assigns own enumerable properties of source objects to the destination\n\t * object. Source objects are applied from left to right. Subsequent sources\n\t * overwrite property assignments of previous sources.\n\t *\n\t * **Note:** This method mutates `object` and is loosely based on\n\t * [`Object.assign`](https://mdn.io/Object/assign).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The destination object.\n\t * @param {...Object} [sources] The source objects.\n\t * @returns {Object} Returns `object`.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.c = 3;\n\t * }\n\t *\n\t * function Bar() {\n\t * this.e = 5;\n\t * }\n\t *\n\t * Foo.prototype.d = 4;\n\t * Bar.prototype.f = 6;\n\t *\n\t * _.assign({ 'a': 1 }, new Foo, new Bar);\n\t * // => { 'a': 1, 'c': 3, 'e': 5 }\n\t */\n\tvar assign = createAssigner(function(object, source) {\n\t copyObject(source, keys(source), object);\n\t});\n\t\n\tmodule.exports = assign;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.2 (Custom Build) <https://lodash.com/>\n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n\t * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license <https://lodash.com/license>\n\t */\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar MAX_SAFE_INTEGER = 9007199254740991;\n\t\n\t/** `Object#toString` result references. */\n\tvar argsTag = '[object Arguments]',\n\t funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]',\n\t stringTag = '[object String]';\n\t\n\t/** Used to detect unsigned integer values. */\n\tvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\t\n\t/**\n\t * The base implementation of `_.times` without support for iteratee shorthands\n\t * or max array length checks.\n\t *\n\t * @private\n\t * @param {number} n The number of times to invoke `iteratee`.\n\t * @param {Function} iteratee The function invoked per iteration.\n\t * @returns {Array} Returns the array of results.\n\t */\n\tfunction baseTimes(n, iteratee) {\n\t var index = -1,\n\t result = Array(n);\n\t\n\t while (++index < n) {\n\t result[index] = iteratee(index);\n\t }\n\t return result;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like index.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n\t * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n\t */\n\tfunction isIndex(value, length) {\n\t value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n\t length = length == null ? MAX_SAFE_INTEGER : length;\n\t return value > -1 && value % 1 == 0 && value < length;\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/** Used to check objects for own properties. */\n\tvar hasOwnProperty = objectProto.hasOwnProperty;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/** Built-in value references. */\n\tvar getPrototypeOf = Object.getPrototypeOf,\n\t propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeKeys = Object.keys;\n\t\n\t/**\n\t * The base implementation of `_.has` without support for deep paths.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @param {Array|string} key The key to check.\n\t * @returns {boolean} Returns `true` if `key` exists, else `false`.\n\t */\n\tfunction baseHas(object, key) {\n\t // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n\t // that are composed entirely of index properties, return `false` for\n\t // `hasOwnProperty` checks of them.\n\t return hasOwnProperty.call(object, key) ||\n\t (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n\t}\n\t\n\t/**\n\t * The base implementation of `_.keys` which doesn't skip the constructor\n\t * property of prototypes or treat sparse arrays as dense.\n\t *\n\t * @private\n\t * @type Function\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t */\n\tfunction baseKeys(object) {\n\t return nativeKeys(Object(object));\n\t}\n\t\n\t/**\n\t * The base implementation of `_.property` without support for deep paths.\n\t *\n\t * @private\n\t * @param {string} key The key of the property to get.\n\t * @returns {Function} Returns the new function.\n\t */\n\tfunction baseProperty(key) {\n\t return function(object) {\n\t return object == null ? undefined : object[key];\n\t };\n\t}\n\t\n\t/**\n\t * Gets the \"length\" property value of `object`.\n\t *\n\t * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n\t * that affects Safari on at least iOS 8.1-8.3 ARM64.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {*} Returns the \"length\" value.\n\t */\n\tvar getLength = baseProperty('length');\n\t\n\t/**\n\t * Creates an array of index keys for `object` values of arrays,\n\t * `arguments` objects, and strings, otherwise `null` is returned.\n\t *\n\t * @private\n\t * @param {Object} object The object to query.\n\t * @returns {Array|null} Returns index keys, else `null`.\n\t */\n\tfunction indexKeys(object) {\n\t var length = object ? object.length : undefined;\n\t if (isLength(length) &&\n\t (isArray(object) || isString(object) || isArguments(object))) {\n\t return baseTimes(length, String);\n\t }\n\t return null;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely a prototype object.\n\t *\n\t * @private\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n\t */\n\tfunction isPrototype(value) {\n\t var Ctor = value && value.constructor,\n\t proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\t\n\t return value === proto;\n\t}\n\t\n\t/**\n\t * Checks if `value` is likely an `arguments` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArguments(function() { return arguments; }());\n\t * // => true\n\t *\n\t * _.isArguments([1, 2, 3]);\n\t * // => false\n\t */\n\tfunction isArguments(value) {\n\t // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n\t return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n\t (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as an `Array` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isArray([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArray(document.body.children);\n\t * // => false\n\t *\n\t * _.isArray('abc');\n\t * // => false\n\t *\n\t * _.isArray(_.noop);\n\t * // => false\n\t */\n\tvar isArray = Array.isArray;\n\t\n\t/**\n\t * Checks if `value` is array-like. A value is considered array-like if it's\n\t * not a function and has a `value.length` that's an integer greater than or\n\t * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLike(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLike('abc');\n\t * // => true\n\t *\n\t * _.isArrayLike(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLike(value) {\n\t return value != null &&\n\t !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n\t}\n\t\n\t/**\n\t * This method is like `_.isArrayLike` except that it also checks if `value`\n\t * is an object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n\t * @example\n\t *\n\t * _.isArrayLikeObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject(document.body.children);\n\t * // => true\n\t *\n\t * _.isArrayLikeObject('abc');\n\t * // => false\n\t *\n\t * _.isArrayLikeObject(_.noop);\n\t * // => false\n\t */\n\tfunction isArrayLikeObject(value) {\n\t return isObjectLike(value) && isArrayLike(value);\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is a valid array-like length.\n\t *\n\t * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n\t * @example\n\t *\n\t * _.isLength(3);\n\t * // => true\n\t *\n\t * _.isLength(Number.MIN_VALUE);\n\t * // => false\n\t *\n\t * _.isLength(Infinity);\n\t * // => false\n\t *\n\t * _.isLength('3');\n\t * // => false\n\t */\n\tfunction isLength(value) {\n\t return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Checks if `value` is object-like. A value is object-like if it's not `null`\n\t * and has a `typeof` result of \"object\".\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n\t * @example\n\t *\n\t * _.isObjectLike({});\n\t * // => true\n\t *\n\t * _.isObjectLike([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObjectLike(_.noop);\n\t * // => false\n\t *\n\t * _.isObjectLike(null);\n\t * // => false\n\t */\n\tfunction isObjectLike(value) {\n\t return !!value && typeof value == 'object';\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `String` primitive or object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isString('abc');\n\t * // => true\n\t *\n\t * _.isString(1);\n\t * // => false\n\t */\n\tfunction isString(value) {\n\t return typeof value == 'string' ||\n\t (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n\t}\n\t\n\t/**\n\t * Creates an array of the own enumerable property names of `object`.\n\t *\n\t * **Note:** Non-object values are coerced to objects. See the\n\t * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n\t * for more details.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Object\n\t * @param {Object} object The object to query.\n\t * @returns {Array} Returns the array of property names.\n\t * @example\n\t *\n\t * function Foo() {\n\t * this.a = 1;\n\t * this.b = 2;\n\t * }\n\t *\n\t * Foo.prototype.c = 3;\n\t *\n\t * _.keys(new Foo);\n\t * // => ['a', 'b'] (iteration order is not guaranteed)\n\t *\n\t * _.keys('hi');\n\t * // => ['0', '1']\n\t */\n\tfunction keys(object) {\n\t var isProto = isPrototype(object);\n\t if (!(isProto || isArrayLike(object))) {\n\t return baseKeys(object);\n\t }\n\t var indexes = indexKeys(object),\n\t skipIndexes = !!indexes,\n\t result = indexes || [],\n\t length = result.length;\n\t\n\t for (var key in object) {\n\t if (baseHas(object, key) &&\n\t !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n\t !(isProto && key == 'constructor')) {\n\t result.push(key);\n\t }\n\t }\n\t return result;\n\t}\n\t\n\tmodule.exports = keys;\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) <https://lodash.com/>\n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n\t * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license <https://lodash.com/license>\n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar INFINITY = 1 / 0,\n\t MAX_INTEGER = 1.7976931348623157e+308,\n\t NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/**\n\t * A faster alternative to `Function#apply`, this function invokes `func`\n\t * with the `this` binding of `thisArg` and the arguments of `args`.\n\t *\n\t * @private\n\t * @param {Function} func The function to invoke.\n\t * @param {*} thisArg The `this` binding of `func`.\n\t * @param {...*} args The arguments to invoke `func` with.\n\t * @returns {*} Returns the result of `func`.\n\t */\n\tfunction apply(func, thisArg, args) {\n\t var length = args.length;\n\t switch (length) {\n\t case 0: return func.call(thisArg);\n\t case 1: return func.call(thisArg, args[0]);\n\t case 2: return func.call(thisArg, args[0], args[1]);\n\t case 3: return func.call(thisArg, args[0], args[1], args[2]);\n\t }\n\t return func.apply(thisArg, args);\n\t}\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Creates a function that invokes `func` with the `this` binding of the\n\t * created function and arguments from `start` and beyond provided as an array.\n\t *\n\t * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to apply a rest parameter to.\n\t * @param {number} [start=func.length-1] The start position of the rest parameter.\n\t * @returns {Function} Returns the new function.\n\t * @example\n\t *\n\t * var say = _.rest(function(what, names) {\n\t * return what + ' ' + _.initial(names).join(', ') +\n\t * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n\t * });\n\t *\n\t * say('hello', 'fred', 'barney', 'pebbles');\n\t * // => 'hello fred, barney, & pebbles'\n\t */\n\tfunction rest(func, start) {\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n\t return function() {\n\t var args = arguments,\n\t index = -1,\n\t length = nativeMax(args.length - start, 0),\n\t array = Array(length);\n\t\n\t while (++index < length) {\n\t array[index] = args[start + index];\n\t }\n\t switch (start) {\n\t case 0: return func.call(this, array);\n\t case 1: return func.call(this, args[0], array);\n\t case 2: return func.call(this, args[0], args[1], array);\n\t }\n\t var otherArgs = Array(start + 1);\n\t index = -1;\n\t while (++index < start) {\n\t otherArgs[index] = args[index];\n\t }\n\t otherArgs[start] = array;\n\t return apply(func, this, otherArgs);\n\t };\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to an integer.\n\t *\n\t * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to convert.\n\t * @returns {number} Returns the converted integer.\n\t * @example\n\t *\n\t * _.toInteger(3);\n\t * // => 3\n\t *\n\t * _.toInteger(Number.MIN_VALUE);\n\t * // => 0\n\t *\n\t * _.toInteger(Infinity);\n\t * // => 1.7976931348623157e+308\n\t *\n\t * _.toInteger('3');\n\t * // => 3\n\t */\n\tfunction toInteger(value) {\n\t if (!value) {\n\t return value === 0 ? value : 0;\n\t }\n\t value = toNumber(value);\n\t if (value === INFINITY || value === -INFINITY) {\n\t var sign = (value < 0 ? -1 : 1);\n\t return sign * MAX_INTEGER;\n\t }\n\t var remainder = value % 1;\n\t return value === value ? (remainder ? value - remainder : value) : 0;\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = rest;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _CRSEPSG3857 = __webpack_require__(7);\n\t\n\tvar _CRSEPSG38572 = _interopRequireDefault(_CRSEPSG3857);\n\t\n\tvar _CRSEPSG3395 = __webpack_require__(15);\n\t\n\tvar _CRSEPSG33952 = _interopRequireDefault(_CRSEPSG3395);\n\t\n\tvar _CRSEPSG4326 = __webpack_require__(17);\n\t\n\tvar _CRSEPSG43262 = _interopRequireDefault(_CRSEPSG4326);\n\t\n\tvar _CRSSimple = __webpack_require__(19);\n\t\n\tvar _CRSSimple2 = _interopRequireDefault(_CRSSimple);\n\t\n\tvar _CRSProj4 = __webpack_require__(20);\n\t\n\tvar _CRSProj42 = _interopRequireDefault(_CRSProj4);\n\t\n\tvar CRS = {};\n\t\n\tCRS.EPSG3857 = _CRSEPSG38572['default'];\n\tCRS.EPSG900913 = _CRSEPSG3857.EPSG900913;\n\tCRS.EPSG3395 = _CRSEPSG33952['default'];\n\tCRS.EPSG4326 = _CRSEPSG43262['default'];\n\tCRS.Simple = _CRSSimple2['default'];\n\tCRS.Proj4 = _CRSProj42['default'];\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionSphericalMercator = __webpack_require__(13);\n\t\n\tvar _projectionProjectionSphericalMercator2 = _interopRequireDefault(_projectionProjectionSphericalMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3857 = {\n\t code: 'EPSG:3857',\n\t projection: _projectionProjectionSphericalMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionSphericalMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3857 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3857);\n\t\n\tvar EPSG900913 = (0, _lodashAssign2['default'])({}, EPSG3857, {\n\t code: 'EPSG:900913'\n\t});\n\t\n\texports.EPSG900913 = EPSG900913;\n\texports['default'] = EPSG3857;\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Earth is the base class for all CRS representing Earth.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar Earth = {\n\t wrapLon: [-180, 180],\n\t\n\t R: 6378137,\n\t\n\t // Distance between two geographical points using spherical law of cosines\n\t // approximation or Haversine\n\t //\n\t // See: http://www.movable-type.co.uk/scripts/latlong.html\n\t distance: function distance(latlon1, latlon2, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var lat1;\n\t var lat2;\n\t\n\t var a;\n\t\n\t if (!accurate) {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\t\n\t return this.R * Math.acos(Math.min(a, 1));\n\t } else {\n\t lat1 = latlon1.lat * rad;\n\t lat2 = latlon2.lat * rad;\n\t\n\t var lon1 = latlon1.lon * rad;\n\t var lon2 = latlon2.lon * rad;\n\t\n\t var deltaLat = lat2 - lat1;\n\t var deltaLon = lon2 - lon1;\n\t\n\t var halfDeltaLat = deltaLat / 2;\n\t var halfDeltaLon = deltaLon / 2;\n\t\n\t a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\t\n\t var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\n\t return this.R * c;\n\t }\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Defaults to a scale factor of 1 if no calculation method exists\n\t //\n\t // Probably need to run this through the CRS transformation or similar so the\n\t // resulting scale is relative to the dimensions of the world space\n\t // Eg. 1 metre in projected space is likly scaled up or down to some other\n\t // number\n\t pointScale: function pointScale(latlon, accurate) {\n\t return this.projection.pointScale ? this.projection.pointScale(latlon, accurate) : [1, 1];\n\t },\n\t\n\t // Convert real metres to projected units\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t metresToProjected: function metresToProjected(metres, pointScale) {\n\t return metres * pointScale[1];\n\t },\n\t\n\t // Convert projected units to real metres\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t projectedToMetres: function projectedToMetres(projectedUnits, pointScale) {\n\t return projectedUnits / pointScale[1];\n\t },\n\t\n\t // Convert real metres to a value in world (WebGL) units\n\t metresToWorld: function metresToWorld(metres, pointScale, zoom) {\n\t // Transform metres to projected metres using the latitude point scale\n\t //\n\t // Latitude scale is chosen because it fluctuates more than longitude\n\t var projectedMetres = this.metresToProjected(metres, pointScale);\n\t\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t // Scale projected metres\n\t var scaledMetres = scale * (this.transformScale * projectedMetres);\n\t\n\t // Not entirely sure why this is neccessary\n\t if (zoom) {\n\t scaledMetres /= pointScale[1];\n\t }\n\t\n\t return scaledMetres;\n\t },\n\t\n\t // Convert world (WebGL) units to a value in real metres\n\t worldToMetres: function worldToMetres(worldUnits, pointScale, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var projectedUnits = worldUnits / scale / this.transformScale;\n\t var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\t\n\t // Not entirely sure why this is neccessary\n\t if (zoom) {\n\t realMetres *= pointScale[1];\n\t }\n\t\n\t return realMetres;\n\t }\n\t};\n\t\n\texports['default'] = (0, _lodashAssign2['default'])({}, _CRS2['default'], Earth);\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar _utilWrapNum = __webpack_require__(12);\n\t\n\tvar _utilWrapNum2 = _interopRequireDefault(_utilWrapNum);\n\t\n\tvar CRS = {\n\t // Scale factor determines final dimensions of world space\n\t //\n\t // Projection transformation in range -1 to 1 is multiplied by scale factor to\n\t // find final world coordinates\n\t //\n\t // Scale factor can be considered as half the amount of the desired dimension\n\t // for the largest side when transformation is equal to 1 or -1, or as the\n\t // distance between 0 and 1 on the largest side\n\t //\n\t // For example, if you want the world dimensions to be between -1000 and 1000\n\t // then the scale factor will be 1000\n\t scaleFactor: 1000000,\n\t\n\t // Converts geo coords to pixel / WebGL ones\n\t latLonToPoint: function latLonToPoint(latlon, zoom) {\n\t var projectedPoint = this.projection.project(latlon);\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t return this.transformation._transform(projectedPoint, scale);\n\t },\n\t\n\t // Converts pixel / WebGL coords to geo coords\n\t pointToLatLon: function pointToLatLon(point, zoom) {\n\t var scale = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t scale /= 2;\n\t }\n\t\n\t var untransformedPoint = this.transformation.untransform(point, scale);\n\t\n\t return this.projection.unproject(untransformedPoint);\n\t },\n\t\n\t // Converts geo coords to projection-specific coords (e.g. in meters)\n\t project: function project(latlon) {\n\t return this.projection.project(latlon);\n\t },\n\t\n\t // Converts projected coords to geo coords\n\t unproject: function unproject(point) {\n\t return this.projection.unproject(point);\n\t },\n\t\n\t // If zoom is provided, returns the map width in pixels for a given zoom\n\t // Else, provides fixed scale value\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom >= 0) {\n\t return 256 * Math.pow(2, zoom);\n\t // Else, return fixed scale value to expand projected coordinates from\n\t // their 0 to 1 range into something more practical\n\t } else {\n\t return this.scaleFactor;\n\t }\n\t },\n\t\n\t // Returns zoom level for a given scale value\n\t // This only works with a scale value that is based on map pixel width\n\t zoom: function zoom(scale) {\n\t return Math.log(scale / 256) / Math.LN2;\n\t },\n\t\n\t // Returns the bounds of the world in projected coords if applicable\n\t getProjectedBounds: function getProjectedBounds(zoom) {\n\t if (this.infinite) {\n\t return null;\n\t }\n\t\n\t var b = this.projection.bounds;\n\t var s = this.scale(zoom);\n\t\n\t // Half scale if using zoom as WebGL origin is in the centre, not top left\n\t if (zoom) {\n\t s /= 2;\n\t }\n\t\n\t // Bottom left\n\t var min = this.transformation.transform((0, _Point2['default'])(b[0]), s);\n\t\n\t // Top right\n\t var max = this.transformation.transform((0, _Point2['default'])(b[1]), s);\n\t\n\t return [min, max];\n\t },\n\t\n\t // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n\t // wrapLon: [min, max],\n\t // wrapLat: [min, max],\n\t\n\t // If true, the coordinate space will be unbounded (infinite in all directions)\n\t // infinite: false,\n\t\n\t // Wraps geo coords in certain ranges if applicable\n\t wrapLatLon: function wrapLatLon(latlon) {\n\t var lat = this.wrapLat ? (0, _utilWrapNum2['default'])(latlon.lat, this.wrapLat, true) : latlon.lat;\n\t var lon = this.wrapLon ? (0, _utilWrapNum2['default'])(latlon.lon, this.wrapLon, true) : latlon.lon;\n\t var alt = latlon.alt;\n\t\n\t return (0, _LatLon2['default'])(lat, lon, alt);\n\t }\n\t};\n\t\n\texports['default'] = CRS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * LatLon is a helper class for ensuring consistent geographic coordinates.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n\t */\n\t\n\tvar LatLon = (function () {\n\t function LatLon(lat, lon, alt) {\n\t _classCallCheck(this, LatLon);\n\t\n\t if (isNaN(lat) || isNaN(lon)) {\n\t throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n\t }\n\t\n\t this.lat = +lat;\n\t this.lon = +lon;\n\t\n\t if (alt !== undefined) {\n\t this.alt = +alt;\n\t }\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t //\n\t // Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n\t // Also converts between lng and lon\n\t\n\t _createClass(LatLon, [{\n\t key: 'clone',\n\t value: function clone() {\n\t return new LatLon(this.lat, this.lon, this.alt);\n\t }\n\t }]);\n\t\n\t return LatLon;\n\t})();\n\t\n\texports['default'] = function (a, b, c) {\n\t if (a instanceof LatLon) {\n\t return a;\n\t }\n\t if (Array.isArray(a) && typeof a[0] !== 'object') {\n\t if (a.length === 3) {\n\t return new LatLon(a[0], a[1], a[2]);\n\t }\n\t if (a.length === 2) {\n\t return new LatLon(a[0], a[1]);\n\t }\n\t return null;\n\t }\n\t if (a === undefined || a === null) {\n\t return a;\n\t }\n\t if (typeof a === 'object' && 'lat' in a) {\n\t return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n\t }\n\t if (b === undefined) {\n\t return null;\n\t }\n\t return new LatLon(a, b, c);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\t\n\t/*\n\t * Point is a helper class for ensuring consistent world positions.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n\t */\n\t\n\tvar Point = (function () {\n\t function Point(x, y, round) {\n\t _classCallCheck(this, Point);\n\t\n\t this.x = round ? Math.round(x) : x;\n\t this.y = round ? Math.round(y) : y;\n\t }\n\t\n\t // Accepts (point), ([x, y]) and (x, y, round)\n\t\n\t _createClass(Point, [{\n\t key: \"clone\",\n\t value: function clone() {\n\t return new Point(this.x, this.y);\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"add\",\n\t value: function add(point) {\n\t return this.clone()._add(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_add\",\n\t value: function _add(point) {\n\t this.x += point.x;\n\t this.y += point.y;\n\t return this;\n\t }\n\t\n\t // Non-destructive\n\t }, {\n\t key: \"subtract\",\n\t value: function subtract(point) {\n\t return this.clone()._subtract(_point(point));\n\t }\n\t\n\t // Destructive\n\t }, {\n\t key: \"_subtract\",\n\t value: function _subtract(point) {\n\t this.x -= point.x;\n\t this.y -= point.y;\n\t return this;\n\t }\n\t }]);\n\t\n\t return Point;\n\t})();\n\t\n\tvar _point = function _point(x, y, round) {\n\t if (x instanceof Point) {\n\t return x;\n\t }\n\t if (Array.isArray(x)) {\n\t return new Point(x[0], x[1]);\n\t }\n\t if (x === undefined || x === null) {\n\t return x;\n\t }\n\t return new Point(x, y, round);\n\t};\n\t\n\t// Initialise without requiring new keyword\n\texports[\"default\"] = _point;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports) {\n\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\t/*\n\t * Wrap the given number to lie within a certain range (eg. longitude)\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n\t */\n\t\n\tvar wrapNum = function wrapNum(x, range, includeMax) {\n\t var max = range[1];\n\t var min = range[0];\n\t var d = max - min;\n\t return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n\t};\n\t\n\texports[\"default\"] = wrapNum;\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n\t * used by default.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar SphericalMercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t MAX_LATITUDE: 85.0511287798,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var max = this.MAX_LATITUDE;\n\t var lat = Math.max(Math.min(max, latlon.lat), -max);\n\t var sin = Math.sin(lat * d);\n\t\n\t return (0, _Point2['default'])(this.R * latlon.lon * d, this.R * Math.log((1 + sin) / (1 - sin)) / 2);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t\n\t return (0, _LatLon2['default'])((2 * Math.atan(Math.exp(point.y / this.R)) - Math.PI / 2) * d, point.x * d / this.R);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // Accurate scale factor uses proper Web Mercator scaling\n\t // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t // See: http://jsfiddle.net/robhawkes/yws924cf/\n\t pointScale: function pointScale(latlon, accurate) {\n\t var rad = Math.PI / 180;\n\t\n\t var k;\n\t\n\t if (!accurate) {\n\t k = 1 / Math.cos(latlon.lat * rad);\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t } else {\n\t var lat = latlon.lat * rad;\n\t var lon = latlon.lon * rad;\n\t\n\t var a = this.R;\n\t\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t\n\t var cosLat = Math.cos(lat);\n\t\n\t // Radius meridian\n\t var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\t\n\t // Radius prime meridian\n\t var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\t\n\t // Scale N/S\n\t var h = a / p / cosLat;\n\t\n\t // Scale E/W\n\t k = a / v / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, h];\n\t }\n\t },\n\t\n\t // Not using this.R due to scoping\n\t bounds: (function () {\n\t var d = 6378137 * Math.PI;\n\t return [[-d, -d], [d, d]];\n\t })()\n\t};\n\t\n\texports['default'] = SphericalMercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\t/*\n\t * Transformation is an utility class to perform simple point transformations\n\t * through a 2d-matrix.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n\t */\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar Transformation = (function () {\n\t function Transformation(a, b, c, d) {\n\t _classCallCheck(this, Transformation);\n\t\n\t this._a = a;\n\t this._b = b;\n\t this._c = c;\n\t this._d = d;\n\t }\n\t\n\t _createClass(Transformation, [{\n\t key: 'transform',\n\t value: function transform(point, scale) {\n\t // Copy input point as to not destroy the original data\n\t return this._transform(point.clone(), scale);\n\t }\n\t\n\t // Destructive transform (faster)\n\t }, {\n\t key: '_transform',\n\t value: function _transform(point, scale) {\n\t scale = scale || 1;\n\t\n\t point.x = scale * (this._a * point.x + this._b);\n\t point.y = scale * (this._c * point.y + this._d);\n\t return point;\n\t }\n\t }, {\n\t key: 'untransform',\n\t value: function untransform(point, scale) {\n\t scale = scale || 1;\n\t return (0, _geoPoint2['default'])((point.x / scale - this._b) / this._a, (point.y / scale - this._d) / this._c);\n\t }\n\t }]);\n\t\n\t return Transformation;\n\t})();\n\t\n\texports['default'] = Transformation;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionMercator = __webpack_require__(16);\n\t\n\tvar _projectionProjectionMercator2 = _interopRequireDefault(_projectionProjectionMercator);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG3395 = {\n\t code: 'EPSG:3395',\n\t projection: _projectionProjectionMercator2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / (Math.PI * _projectionProjectionMercator2['default'].R),\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t transformation: (function () {\n\t // TODO: Cannot use this.transformScale due to scope\n\t var scale = 1 / (Math.PI * _projectionProjectionMercator2['default'].R);\n\t\n\t return new _utilTransformation2['default'](scale, 0, -scale, 0);\n\t })()\n\t};\n\t\n\tvar EPSG3395 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG3395);\n\t\n\texports['default'] = EPSG3395;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Mercator projection that takes into account that the Earth is not a perfect\n\t * sphere. Less popular than spherical mercator; used by projections like\n\t * EPSG:3395.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Mercator = {\n\t // Radius / WGS84 semi-major axis\n\t R: 6378137,\n\t R_MINOR: 6356752.314245179,\n\t\n\t // WGS84 eccentricity\n\t ECC: 0.081819191,\n\t ECC2: 0.081819191 * 0.081819191,\n\t\n\t project: function project(latlon) {\n\t var d = Math.PI / 180;\n\t var r = this.R;\n\t var y = latlon.lat * d;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var con = e * Math.sin(y);\n\t\n\t var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n\t y = -r * Math.log(Math.max(ts, 1E-10));\n\t\n\t return (0, _Point2['default'])(latlon.lon * d * r, y);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t var d = 180 / Math.PI;\n\t var r = this.R;\n\t var tmp = this.R_MINOR / r;\n\t var e = Math.sqrt(1 - tmp * tmp);\n\t var ts = Math.exp(-point.y / r);\n\t var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\t\n\t for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n\t con = e * Math.sin(phi);\n\t con = Math.pow((1 - con) / (1 + con), e / 2);\n\t dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n\t phi += dphi;\n\t }\n\t\n\t return (0, _LatLon2['default'])(phi * d, point.x * d / r);\n\t },\n\t\n\t // Scale factor for converting between real metres and projected metres\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t //\n\t // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n\t pointScale: function pointScale(latlon) {\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t var sinLat = Math.sin(lat);\n\t var sinLat2 = sinLat * sinLat;\n\t var cosLat = Math.cos(lat);\n\t\n\t var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\t\n\t // [scaleX, scaleY]\n\t return [k, k];\n\t },\n\t\n\t bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n\t};\n\t\n\texports['default'] = Mercator;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _EPSG4326 = {\n\t code: 'EPSG:4326',\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Work out how to de-dupe this (scoping issue)\n\t transformScale: 1 / 180,\n\t\n\t // Scale and transformation inputs changed to account for central origin in\n\t // WebGL, instead of top-left origin used in Leaflet\n\t //\n\t // TODO: Cannot use this.transformScale due to scope\n\t transformation: new _utilTransformation2['default'](1 / 180, 0, -1 / 180, 0)\n\t};\n\t\n\tvar EPSG4326 = (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _EPSG4326);\n\t\n\texports['default'] = EPSG4326;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n\t * and Simple.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n\t */\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar ProjectionLatLon = {\n\t project: function project(latlon) {\n\t return (0, _Point2['default'])(latlon.lon, latlon.lat);\n\t },\n\t\n\t unproject: function unproject(point) {\n\t return (0, _LatLon2['default'])(point.y, point.x);\n\t },\n\t\n\t // Scale factor for converting between real metres and degrees\n\t //\n\t // degrees = realMetres * pointScale\n\t // realMetres = degrees / pointScale\n\t //\n\t // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n\t // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n\t pointScale: function pointScale(latlon) {\n\t var m1 = 111132.92;\n\t var m2 = -559.82;\n\t var m3 = 1.175;\n\t var m4 = -0.0023;\n\t var p1 = 111412.84;\n\t var p2 = -93.5;\n\t var p3 = 0.118;\n\t\n\t var rad = Math.PI / 180;\n\t var lat = latlon.lat * rad;\n\t\n\t var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n\t var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\t\n\t return [1 / latlen, 1 / lonlen];\n\t },\n\t\n\t bounds: [[-180, -90], [180, 90]]\n\t};\n\t\n\texports['default'] = ProjectionLatLon;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 19 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n\t * maps.\n\t *\n\t * Based on:\n\t * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRS = __webpack_require__(9);\n\t\n\tvar _CRS2 = _interopRequireDefault(_CRS);\n\t\n\tvar _projectionProjectionLatLon = __webpack_require__(18);\n\t\n\tvar _projectionProjectionLatLon2 = _interopRequireDefault(_projectionProjectionLatLon);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Simple = {\n\t projection: _projectionProjectionLatLon2['default'],\n\t\n\t // Straight 1:1 mapping (-1, -1 would be top-left)\n\t transformation: new _utilTransformation2['default'](1, 0, 1, 0),\n\t\n\t scale: function scale(zoom) {\n\t // If zoom is provided then return scale based on map tile zoom\n\t if (zoom) {\n\t return Math.pow(2, zoom);\n\t // Else, make no change to scale – may need to increase this or make it a\n\t // user-definable variable\n\t } else {\n\t return 1;\n\t }\n\t },\n\t\n\t zoom: function zoom(scale) {\n\t return Math.log(scale) / Math.LN2;\n\t },\n\t\n\t distance: function distance(latlon1, latlon2) {\n\t var dx = latlon2.lon - latlon1.lon;\n\t var dy = latlon2.lat - latlon1.lat;\n\t\n\t return Math.sqrt(dx * dx + dy * dy);\n\t },\n\t\n\t infinite: true\n\t};\n\t\n\tvar Simple = (0, _lodashAssign2['default'])({}, _CRS2['default'], _Simple);\n\t\n\texports['default'] = Simple;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * CRS.Proj4 for any Proj4-supported CRS.\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _CRSEarth = __webpack_require__(8);\n\t\n\tvar _CRSEarth2 = _interopRequireDefault(_CRSEarth);\n\t\n\tvar _projectionProjectionProj4 = __webpack_require__(21);\n\t\n\tvar _projectionProjectionProj42 = _interopRequireDefault(_projectionProjectionProj4);\n\t\n\tvar _utilTransformation = __webpack_require__(14);\n\t\n\tvar _utilTransformation2 = _interopRequireDefault(_utilTransformation);\n\t\n\tvar _Proj4 = function _Proj4(code, def, bounds) {\n\t var projection = (0, _projectionProjectionProj42['default'])(def, bounds);\n\t\n\t // Transformation calcuations\n\t var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n\t var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\t\n\t var halfX = diffX / 2;\n\t var halfY = diffY / 2;\n\t\n\t // This is the raw scale factor\n\t var scaleX = 1 / halfX;\n\t var scaleY = 1 / halfY;\n\t\n\t // Find the minimum scale factor\n\t //\n\t // The minimum scale factor comes from the largest side and is the one\n\t // you want to use for both axis so they stay relative in dimension\n\t var scale = Math.min(scaleX, scaleY);\n\t\n\t // Find amount to offset each axis by to make the central point lie on\n\t // the [0,0] origin\n\t var offsetX = scale * (projection.bounds[0][0] + halfX);\n\t var offsetY = scale * (projection.bounds[0][1] + halfY);\n\t\n\t return {\n\t code: code,\n\t projection: projection,\n\t\n\t transformScale: scale,\n\t\n\t // Map the input to a [-1,1] range with [0,0] in the centre\n\t transformation: new _utilTransformation2['default'](scale, -offsetX, -scale, offsetY)\n\t };\n\t};\n\t\n\tvar Proj4 = function Proj4(code, def, bounds) {\n\t return (0, _lodashAssign2['default'])({}, _CRSEarth2['default'], _Proj4(code, def, bounds));\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Proj4 support for any projection.\n\t */\n\t\n\tvar _proj4 = __webpack_require__(22);\n\t\n\tvar _proj42 = _interopRequireDefault(_proj4);\n\t\n\tvar _LatLon = __webpack_require__(10);\n\t\n\tvar _LatLon2 = _interopRequireDefault(_LatLon);\n\t\n\tvar _Point = __webpack_require__(11);\n\t\n\tvar _Point2 = _interopRequireDefault(_Point);\n\t\n\tvar Proj4 = function Proj4(def, bounds) {\n\t var proj = (0, _proj42['default'])(def);\n\t\n\t var project = function project(latlon) {\n\t return (0, _Point2['default'])(proj.forward([latlon.lon, latlon.lat]));\n\t };\n\t\n\t var unproject = function unproject(point) {\n\t var inverse = proj.inverse([point.x, point.y]);\n\t return (0, _LatLon2['default'])(inverse[1], inverse[0]);\n\t };\n\t\n\t return {\n\t project: project,\n\t unproject: unproject,\n\t\n\t // Scale factor for converting between real metres and projected metres\\\n\t //\n\t // Need to work out the best way to provide the pointScale calculations\n\t // for custom, unknown projections (if wanting to override default)\n\t //\n\t // For now, user can manually override crs.pointScale or\n\t // crs.projection.pointScale\n\t //\n\t // projectedMetres = realMetres * pointScale\n\t // realMetres = projectedMetres / pointScale\n\t pointScale: function pointScale(latlon, accurate) {\n\t return [1, 1];\n\t },\n\t\n\t // Try and calculate bounds if none are provided\n\t //\n\t // This will provide incorrect bounds for some projections, so perhaps make\n\t // bounds a required input instead\n\t bounds: (function () {\n\t if (bounds) {\n\t return bounds;\n\t } else {\n\t var bottomLeft = project([-90, -180]);\n\t var topRight = project([90, 180]);\n\t\n\t return [bottomLeft, topRight];\n\t }\n\t })()\n\t };\n\t};\n\t\n\texports['default'] = Proj4;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\tvar _Renderer = __webpack_require__(26);\n\t\n\tvar _Renderer2 = _interopRequireDefault(_Renderer);\n\t\n\tvar _Camera = __webpack_require__(27);\n\t\n\tvar _Camera2 = _interopRequireDefault(_Camera);\n\t\n\tvar Engine = (function (_EventEmitter) {\n\t _inherits(Engine, _EventEmitter);\n\t\n\t function Engine(container) {\n\t _classCallCheck(this, Engine);\n\t\n\t console.log('Init Engine');\n\t\n\t _get(Object.getPrototypeOf(Engine.prototype), 'constructor', this).call(this);\n\t\n\t this._scene = _Scene2['default'];\n\t this._renderer = (0, _Renderer2['default'])(container);\n\t this._camera = (0, _Camera2['default'])(container);\n\t this.clock = new _three2['default'].Clock();\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(Engine, [{\n\t key: 'update',\n\t value: function update(delta) {\n\t this.emit('preRender');\n\t this._renderer.render(this._scene, this._camera);\n\t this.emit('postRender');\n\t }\n\t }]);\n\t\n\t return Engine;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function (container) {\n\t return new Engine(container);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can be imported from anywhere and will still reference the same scene,\n\t// though there is a helper reference in Engine.scene\n\t\n\texports['default'] = (function () {\n\t var scene = new _three2['default'].Scene();\n\t\n\t // TODO: Re-enable when this works with the skybox\n\t // scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n\t return scene;\n\t})();\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Scene = __webpack_require__(25);\n\t\n\tvar _Scene2 = _interopRequireDefault(_Scene);\n\t\n\t// This can only be accessed from Engine.renderer if you want to reference the\n\t// same scene in multiple places\n\t\n\texports['default'] = function (container) {\n\t var renderer = new _three2['default'].WebGLRenderer({\n\t antialias: true\n\t });\n\t\n\t // TODO: Re-enable when this works with the skybox\n\t // renderer.setClearColor(Scene.fog.color, 1);\n\t\n\t renderer.setClearColor(0xffffff, 1);\n\t\n\t // Gamma settings make things look nicer\n\t renderer.gammaInput = true;\n\t renderer.gammaOutput = true;\n\t\n\t renderer.shadowMap.enabled = true;\n\t renderer.shadowMap.cullFace = _three2['default'].CullFaceBack;\n\t\n\t container.appendChild(renderer.domElement);\n\t\n\t var updateSize = function updateSize() {\n\t renderer.setSize(container.clientWidth, container.clientHeight);\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return renderer;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// This can only be accessed from Engine.camera if you want to reference the\n\t// same scene in multiple places\n\t\n\t// TODO: Ensure that FOV looks natural on all aspect ratios\n\t// http://stackoverflow.com/q/26655930/997339\n\t\n\texports['default'] = function (container) {\n\t var camera = new _three2['default'].PerspectiveCamera(45, 1, 1, 200000);\n\t camera.position.y = 400;\n\t camera.position.z = 400;\n\t\n\t var updateSize = function updateSize() {\n\t camera.aspect = container.clientWidth / container.clientHeight;\n\t camera.updateProjectionMatrix();\n\t };\n\t\n\t window.addEventListener('resize', updateSize, false);\n\t updateSize();\n\t\n\t return camera;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _ControlsOrbit = __webpack_require__(29);\n\t\n\tvar _ControlsOrbit2 = _interopRequireDefault(_ControlsOrbit);\n\t\n\tvar Controls = {\n\t Orbit: _ControlsOrbit2['default']\n\t};\n\t\n\texports['default'] = Controls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _vendorOrbitControls = __webpack_require__(30);\n\t\n\tvar _vendorOrbitControls2 = _interopRequireDefault(_vendorOrbitControls);\n\t\n\tvar Orbit = (function (_EventEmitter) {\n\t _inherits(Orbit, _EventEmitter);\n\t\n\t function Orbit() {\n\t _classCallCheck(this, Orbit);\n\t\n\t _get(Object.getPrototypeOf(Orbit.prototype), 'constructor', this).call(this);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Proxy control events\n\t //\n\t // There's currently no distinction between pan, orbit and zoom events\n\t\n\t _createClass(Orbit, [{\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t var _this = this;\n\t\n\t this._controls.addEventListener('start', function (event) {\n\t _this._world.emit('controlsMoveStart', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('change', function (event) {\n\t _this._world.emit('controlsMove', event.target.target);\n\t });\n\t\n\t this._controls.addEventListener('end', function (event) {\n\t _this._world.emit('controlsMoveEnd', event.target.target);\n\t });\n\t }\n\t\n\t // Moving the camera along the [x,y,z] axis based on a target position\n\t }, {\n\t key: '_panTo',\n\t value: function _panTo(point, animate) {}\n\t }, {\n\t key: '_panBy',\n\t value: function _panBy(pointDelta, animate) {}\n\t\n\t // Zooming the camera in and out\n\t }, {\n\t key: '_zoomTo',\n\t value: function _zoomTo(metres, animate) {}\n\t }, {\n\t key: '_zoomBy',\n\t value: function _zoomBy(metresDelta, animate) {}\n\t\n\t // Force camera to look at something other than the target\n\t }, {\n\t key: '_lookAt',\n\t value: function _lookAt(point, animate) {}\n\t\n\t // Make camera look at the target\n\t }, {\n\t key: '_lookAtTarget',\n\t value: function _lookAtTarget() {}\n\t\n\t // Tilt (up and down)\n\t }, {\n\t key: '_tiltTo',\n\t value: function _tiltTo(angle, animate) {}\n\t }, {\n\t key: '_tiltBy',\n\t value: function _tiltBy(angleDelta, animate) {}\n\t\n\t // Rotate (left and right)\n\t }, {\n\t key: '_rotateTo',\n\t value: function _rotateTo(angle, animate) {}\n\t }, {\n\t key: '_rotateBy',\n\t value: function _rotateBy(angleDelta, animate) {}\n\t\n\t // Fly to the given point, animating pan and tilt/rotation to final position\n\t // with nice zoom out and in\n\t //\n\t // Calling flyTo a second time before the previous animation has completed\n\t // will immediately start the new animation from wherever the previous one\n\t // has got to\n\t }, {\n\t key: '_flyTo',\n\t value: function _flyTo(point, noZoom) {}\n\t\n\t // Proxy to OrbitControls.update()\n\t }, {\n\t key: 'update',\n\t value: function update() {\n\t this._controls.update();\n\t }\n\t\n\t // Add controls to world instance and store world reference\n\t }, {\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addControls(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addControls to actually add the controls\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t\n\t // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n\t // See: http://stackoverflow.com/a/26188674/997339\n\t this._controls = new _vendorOrbitControls2['default'](world._engine._camera, world._container);\n\t\n\t // Disable keys for now as no events are fired for them anyway\n\t this._controls.keys = false;\n\t\n\t // 89 degrees\n\t this._controls.maxPolarAngle = 1.5533;\n\t\n\t // this._controls.enableDamping = true;\n\t // this._controls.dampingFactor = 0.25;\n\t\n\t this._initEvents();\n\t\n\t this.emit('added');\n\t }\n\t }]);\n\t\n\t return Orbit;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = function () {\n\t return new Orbit();\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _hammerjs = __webpack_require__(31);\n\t\n\tvar _hammerjs2 = _interopRequireDefault(_hammerjs);\n\t\n\t/**\n\t * @author qiao / https://github.com/qiao\n\t * @author mrdoob / http://mrdoob.com\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author erich666 / http://erichaines.com\n\t */\n\t\n\t// This set of controls performs orbiting, dollying (zooming), and panning.\n\t// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n\t//\n\t// Orbit - left mouse / touch: one finger move\n\t// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n\t// Pan - right mouse, or arrow keys / touch: three finter swipe\n\t\n\tvar OrbitControls = function OrbitControls(object, domElement) {\n\t\n\t\tthis.object = object;\n\t\n\t\tthis.domElement = domElement !== undefined ? domElement : document;\n\t\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\t\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new _three2['default'].Vector3();\n\t\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\t\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\t\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\t\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\t\tthis.minAzimuthAngle = -Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\t\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.25;\n\t\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\t\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\t\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\t\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\t\n\t\t// Set to false to disable use of the keys\n\t\tthis.enableKeys = true;\n\t\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\t\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { ORBIT: _three2['default'].MOUSE.LEFT, ZOOM: _three2['default'].MOUSE.MIDDLE, PAN: _three2['default'].MOUSE.RIGHT };\n\t\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\t\n\t\t//\n\t\t// public methods\n\t\t//\n\t\n\t\tthis.getPolarAngle = function () {\n\t\n\t\t\treturn phi;\n\t\t};\n\t\n\t\tthis.getAzimuthalAngle = function () {\n\t\n\t\t\treturn theta;\n\t\t};\n\t\n\t\tthis.reset = function () {\n\t\n\t\t\tscope.target.copy(scope.target0);\n\t\t\tscope.object.position.copy(scope.position0);\n\t\t\tscope.object.zoom = scope.zoom0;\n\t\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\tscope.update();\n\t\n\t\t\tstate = STATE.NONE;\n\t\t};\n\t\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\t// so camera.up is the orbit axis\n\t\t\tvar quat = new _three2['default'].Quaternion().setFromUnitVectors(object.up, new _three2['default'].Vector3(0, 1, 0));\n\t\t\tvar quatInverse = quat.clone().inverse();\n\t\n\t\t\tvar lastPosition = new _three2['default'].Vector3();\n\t\t\tvar lastQuaternion = new _three2['default'].Quaternion();\n\t\n\t\t\treturn function () {\n\t\n\t\t\t\tvar position = scope.object.position;\n\t\n\t\t\t\toffset.copy(position).sub(scope.target);\n\t\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion(quat);\n\t\n\t\t\t\t// angle from z-axis around y-axis\n\t\n\t\t\t\ttheta = Math.atan2(offset.x, offset.z);\n\t\n\t\t\t\t// angle from y-axis\n\t\n\t\t\t\tphi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y);\n\t\n\t\t\t\tif (scope.autoRotate && state === STATE.NONE) {\n\t\n\t\t\t\t\trotateLeft(getAutoRotationAngle());\n\t\t\t\t}\n\t\n\t\t\t\ttheta += thetaDelta;\n\t\t\t\tphi += phiDelta;\n\t\n\t\t\t\t// restrict theta to be between desired limits\n\t\t\t\ttheta = Math.max(scope.minAzimuthAngle, Math.min(scope.maxAzimuthAngle, theta));\n\t\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tphi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, phi));\n\t\n\t\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\t\tphi = Math.max(EPS, Math.min(Math.PI - EPS, phi));\n\t\n\t\t\t\tvar radius = offset.length() * scale;\n\t\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tradius = Math.max(scope.minDistance, Math.min(scope.maxDistance, radius));\n\t\n\t\t\t\t// move target to panned location\n\t\t\t\tscope.target.add(panOffset);\n\t\n\t\t\t\toffset.x = radius * Math.sin(phi) * Math.sin(theta);\n\t\t\t\toffset.y = radius * Math.cos(phi);\n\t\t\t\toffset.z = radius * Math.sin(phi) * Math.cos(theta);\n\t\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion(quatInverse);\n\t\n\t\t\t\tposition.copy(scope.target).add(offset);\n\t\n\t\t\t\tscope.object.lookAt(scope.target);\n\t\n\t\t\t\tif (scope.enableDamping === true) {\n\t\n\t\t\t\t\tthetaDelta *= 1 - scope.dampingFactor;\n\t\t\t\t\tphiDelta *= 1 - scope.dampingFactor;\n\t\t\t\t} else {\n\t\n\t\t\t\t\tthetaDelta = 0;\n\t\t\t\t\tphiDelta = 0;\n\t\t\t\t}\n\t\n\t\t\t\tscale = 1;\n\t\t\t\tpanOffset.set(0, 0, 0);\n\t\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\t\n\t\t\t\tif (zoomChanged || lastPosition.distanceToSquared(scope.object.position) > EPS || 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS) {\n\t\n\t\t\t\t\tscope.dispatchEvent(changeEvent);\n\t\n\t\t\t\t\tlastPosition.copy(scope.object.position);\n\t\t\t\t\tlastQuaternion.copy(scope.object.quaternion);\n\t\t\t\t\tzoomChanged = false;\n\t\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\n\t\t\t\treturn false;\n\t\t\t};\n\t\t})();\n\t\n\t\tthis.dispose = function () {\n\t\n\t\t\tscope.domElement.removeEventListener('contextmenu', onContextMenu, false);\n\t\t\tscope.domElement.removeEventListener('mousedown', onMouseDown, false);\n\t\t\tscope.domElement.removeEventListener('mousewheel', onMouseWheel, false);\n\t\t\tscope.domElement.removeEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\t\tscope.domElement.removeEventListener('touchstart', onTouchStart, false);\n\t\t\tscope.domElement.removeEventListener('touchend', onTouchEnd, false);\n\t\t\tscope.domElement.removeEventListener('touchmove', onTouchMove, false);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\twindow.removeEventListener('keydown', onKeyDown, false);\n\t\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\t\t};\n\t\n\t\t//\n\t\t// internals\n\t\t//\n\t\n\t\tvar scope = this;\n\t\n\t\tvar changeEvent = { type: 'change' };\n\t\tvar startEvent = { type: 'start' };\n\t\tvar endEvent = { type: 'end' };\n\t\n\t\tvar STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY: 4, TOUCH_PAN: 5 };\n\t\n\t\tvar state = STATE.NONE;\n\t\n\t\tvar EPS = 0.000001;\n\t\n\t\t// current position in spherical coordinates\n\t\tvar theta;\n\t\tvar phi;\n\t\n\t\tvar phiDelta = 0;\n\t\tvar thetaDelta = 0;\n\t\tvar scale = 1;\n\t\tvar panOffset = new _three2['default'].Vector3();\n\t\tvar zoomChanged = false;\n\t\n\t\tvar rotateStart = new _three2['default'].Vector2();\n\t\tvar rotateEnd = new _three2['default'].Vector2();\n\t\tvar rotateDelta = new _three2['default'].Vector2();\n\t\n\t\tvar panStart = new _three2['default'].Vector2();\n\t\tvar panEnd = new _three2['default'].Vector2();\n\t\tvar panDelta = new _three2['default'].Vector2();\n\t\n\t\tvar dollyStart = new _three2['default'].Vector2();\n\t\tvar dollyEnd = new _three2['default'].Vector2();\n\t\tvar dollyDelta = new _three2['default'].Vector2();\n\t\n\t\tfunction getAutoRotationAngle() {\n\t\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\t\t}\n\t\n\t\tfunction getZoomScale() {\n\t\n\t\t\treturn Math.pow(0.95, scope.zoomSpeed);\n\t\t}\n\t\n\t\tfunction rotateLeft(angle) {\n\t\n\t\t\tthetaDelta -= angle;\n\t\t}\n\t\n\t\tfunction rotateUp(angle) {\n\t\n\t\t\tphiDelta -= angle;\n\t\t}\n\t\n\t\tvar panLeft = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panLeft( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get X column of objectMatrix\n\t\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( - distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\t// Fixed panning to x/y plane\n\t\t\treturn function panLeft(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\t// var adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[0], 0, te[2]);\n\t\t\t\tv.multiplyScalar(-distance);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// Fixed panning to x/y plane\n\t\tvar panUp = (function () {\n\t\n\t\t\tvar v = new _three2['default'].Vector3();\n\t\n\t\t\t// return function panUp( distance, objectMatrix ) {\n\t\t\t//\n\t\t\t// \tvar te = objectMatrix.elements;\n\t\t\t//\n\t\t\t// \t// get Y column of objectMatrix\n\t\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n\t\t\t//\n\t\t\t// \tv.multiplyScalar( distance );\n\t\t\t//\n\t\t\t// \tpanOffset.add( v );\n\t\t\t//\n\t\t\t// };\n\t\n\t\t\treturn function panUp(distance, objectMatrix) {\n\t\t\t\tvar te = objectMatrix.elements;\n\t\t\t\tvar adjDist = distance / Math.cos(phi);\n\t\n\t\t\t\tv.set(te[4], 0, te[6]);\n\t\t\t\tv.multiplyScalar(adjDist);\n\t\n\t\t\t\tpanOffset.add(v);\n\t\t\t};\n\t\t})();\n\t\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tvar pan = (function () {\n\t\n\t\t\tvar offset = new _three2['default'].Vector3();\n\t\n\t\t\treturn function (deltaX, deltaY) {\n\t\n\t\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\t\t// perspective\n\t\t\t\t\tvar position = scope.object.position;\n\t\t\t\t\toffset.copy(position).sub(scope.target);\n\t\t\t\t\tvar targetDistance = offset.length();\n\t\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan(scope.object.fov / 2 * Math.PI / 180.0);\n\t\n\t\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\t\tpanLeft(2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t\tpanUp(2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft(deltaX * (scope.object.right - scope.object.left) / element.clientWidth, scope.object.matrix);\n\t\t\t\t\tpanUp(deltaY * (scope.object.top - scope.object.bottom) / element.clientHeight, scope.object.matrix);\n\t\t\t\t} else {\n\t\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.');\n\t\t\t\t\tscope.enablePan = false;\n\t\t\t\t}\n\t\t\t};\n\t\t})();\n\t\n\t\tfunction dollyIn(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale /= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom * dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\tfunction dollyOut(dollyScale) {\n\t\n\t\t\tif (scope.object instanceof _three2['default'].PerspectiveCamera) {\n\t\n\t\t\t\tscale *= dollyScale;\n\t\t\t} else if (scope.object instanceof _three2['default'].OrthographicCamera) {\n\t\n\t\t\t\tscope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / dollyScale));\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\t\t\t} else {\n\t\n\t\t\t\tconsole.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.');\n\t\t\t\tscope.enableZoom = false;\n\t\t\t}\n\t\t}\n\t\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\t\n\t\tfunction handleMouseDownRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownRotate' );\n\t\n\t\t\trotateStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownDolly' );\n\t\n\t\t\tdollyStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseDownPan(event) {\n\t\n\t\t\t//console.log( 'handleMouseDownPan' );\n\t\n\t\t\tpanStart.set(event.clientX, event.clientY);\n\t\t}\n\t\n\t\tfunction handleMouseMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.clientX, event.clientY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleMouseMoveDolly' );\n\t\n\t\t\tdollyEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseMovePan(event) {\n\t\n\t\t\t//console.log( 'handleMouseMovePan' );\n\t\n\t\t\tpanEnd.set(event.clientX, event.clientY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleMouseUp(event) {\n\t\n\t\t\t//console.log( 'handleMouseUp' );\n\t\n\t\t}\n\t\n\t\tfunction handleMouseWheel(event) {\n\t\n\t\t\t//console.log( 'handleMouseWheel' );\n\t\n\t\t\tvar delta = 0;\n\t\n\t\t\tif (event.wheelDelta !== undefined) {\n\t\n\t\t\t\t// WebKit / Opera / Explorer 9\n\t\n\t\t\t\tdelta = event.wheelDelta;\n\t\t\t} else if (event.detail !== undefined) {\n\t\n\t\t\t\t// Firefox\n\t\n\t\t\t\tdelta = -event.detail;\n\t\t\t}\n\t\n\t\t\tif (delta > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (delta < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleKeyDown(event) {\n\t\n\t\t\t//console.log( 'handleKeyDown' );\n\t\n\t\t\tswitch (event.keyCode) {\n\t\n\t\t\t\tcase scope.keys.UP:\n\t\t\t\t\tpan(0, scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\t\tpan(0, -scope.keyPanSpeed);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.LEFT:\n\t\t\t\t\tpan(scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase scope.keys.RIGHT:\n\t\t\t\t\tpan(-scope.keyPanSpeed, 0);\n\t\t\t\t\tscope.update();\n\t\t\t\t\tbreak;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction handleTouchStartRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartRotate' );\n\t\n\t\t\trotateStart.set(event.pointers[0].pageX, event.pointers[0].pageY);\n\t\t}\n\t\n\t\tfunction handleTouchStartDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartDolly' );\n\t\n\t\t\tvar dx = event.pointers[0].pageX - event.pointers[1].pageX;\n\t\t\tvar dy = event.pointers[0].pageY - event.pointers[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyStart.set(0, distance);\n\t\t}\n\t\n\t\tfunction handleTouchStartPan(event) {\n\t\n\t\t\t//console.log( 'handleTouchStartPan' );\n\t\n\t\t\tpanStart.set(event.deltaX, event.deltaY);\n\t\t}\n\t\n\t\tfunction handleTouchMoveRotate(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveRotate' );\n\t\n\t\t\trotateEnd.set(event.pointers[0].pageX, event.pointers[0].pageY);\n\t\t\trotateDelta.subVectors(rotateEnd, rotateStart);\n\t\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\t\n\t\t\t// rotating across whole screen goes 360 degrees around\n\t\t\trotateLeft(2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed);\n\t\n\t\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\t\trotateUp(2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed);\n\t\n\t\t\trotateStart.copy(rotateEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMoveDolly(event) {\n\t\n\t\t\t//console.log( 'handleTouchMoveDolly' );\n\t\n\t\t\tvar dx = event.pointers[0].pageX - event.pointers[1].pageX;\n\t\t\tvar dy = event.pointers[0].pageY - event.pointers[1].pageY;\n\t\n\t\t\tvar distance = Math.sqrt(dx * dx + dy * dy);\n\t\n\t\t\tdollyEnd.set(0, distance);\n\t\n\t\t\tdollyDelta.subVectors(dollyEnd, dollyStart);\n\t\n\t\t\tif (dollyDelta.y > 0) {\n\t\n\t\t\t\tdollyOut(getZoomScale());\n\t\t\t} else if (dollyDelta.y < 0) {\n\t\n\t\t\t\tdollyIn(getZoomScale());\n\t\t\t}\n\t\n\t\t\tdollyStart.copy(dollyEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchMovePan(event) {\n\t\n\t\t\t//console.log( 'handleTouchMovePan' );\n\t\n\t\t\tpanEnd.set(event.deltaX, event.deltaY);\n\t\n\t\t\tpanDelta.subVectors(panEnd, panStart);\n\t\n\t\t\tpan(panDelta.x, panDelta.y);\n\t\n\t\t\tpanStart.copy(panEnd);\n\t\n\t\t\tscope.update();\n\t\t}\n\t\n\t\tfunction handleTouchEnd(event) {}\n\t\n\t\t//console.log( 'handleTouchEnd' );\n\t\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\t\n\t\tfunction onMouseDown(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (event.button === scope.mouseButtons.ORBIT) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseDownRotate(event);\n\t\n\t\t\t\tstate = STATE.ROTATE;\n\t\t\t} else if (event.button === scope.mouseButtons.ZOOM) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseDownDolly(event);\n\t\n\t\t\t\tstate = STATE.DOLLY;\n\t\t\t} else if (event.button === scope.mouseButtons.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseDownPan(event);\n\t\n\t\t\t\tstate = STATE.PAN;\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tdocument.addEventListener('mousemove', onMouseMove, false);\n\t\t\t\tdocument.addEventListener('mouseup', onMouseUp, false);\n\t\t\t\tdocument.addEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\n\t\t\tif (state === STATE.ROTATE) {\n\t\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleMouseMoveRotate(event);\n\t\t\t} else if (state === STATE.DOLLY) {\n\t\n\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\thandleMouseMoveDolly(event);\n\t\t\t} else if (state === STATE.PAN) {\n\t\n\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\thandleMouseMovePan(event);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onMouseUp(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleMouseUp(event);\n\t\n\t\t\tdocument.removeEventListener('mousemove', onMouseMove, false);\n\t\t\tdocument.removeEventListener('mouseup', onMouseUp, false);\n\t\t\tdocument.removeEventListener('mouseout', onMouseUp, false);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onMouseWheel(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\thandleMouseWheel(event);\n\t\n\t\t\tscope.dispatchEvent(startEvent); // not sure why these are here...\n\t\t\tscope.dispatchEvent(endEvent);\n\t\t}\n\t\n\t\tfunction onKeyDown(event) {\n\t\n\t\t\tif (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false) return;\n\t\n\t\t\thandleKeyDown(event);\n\t\t}\n\t\n\t\tfunction onTouchStart(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\t\thandleTouchStartRotate(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\t\t\thandleTouchStartDolly(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\n\t\t\t\t\thandleTouchStartPan(event);\n\t\n\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchMove(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\n\t\t\tswitch (event.touches.length) {\n\t\n\t\t\t\tcase 1:\n\t\t\t\t\t// one-fingered touch: rotate\n\t\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 2:\n\t\t\t\t\t// two-fingered touch: dolly\n\t\n\t\t\t\t\tif (scope.enableZoom === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_DOLLY) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveDolly(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tcase 3:\n\t\t\t\t\t// three-fingered touch: pan\n\t\n\t\t\t\t\tif (scope.enablePan === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_PAN) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMovePan(event);\n\t\n\t\t\t\t\tbreak;\n\t\n\t\t\t\tdefault:\n\t\n\t\t\t\t\tstate = STATE.NONE;\n\t\n\t\t\t}\n\t\t}\n\t\n\t\tfunction onTouchEnd(event) {\n\t\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\thandleTouchEnd(event);\n\t\n\t\t\tscope.dispatchEvent(endEvent);\n\t\n\t\t\tstate = STATE.NONE;\n\t\t}\n\t\n\t\tfunction onContextMenu(event) {\n\t\n\t\t\tevent.preventDefault();\n\t\t}\n\t\n\t\t//\n\t\n\t\tscope.domElement.addEventListener('contextmenu', onContextMenu, false);\n\t\n\t\tscope.domElement.addEventListener('mousedown', onMouseDown, false);\n\t\tscope.domElement.addEventListener('mousewheel', onMouseWheel, false);\n\t\tscope.domElement.addEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\t\n\t\t// scope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t\t// scope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t\t// scope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\t\n\t\tscope.hammer = new _hammerjs2['default'](scope.domElement);\n\t\n\t\tscope.hammer.get('pan').set({\n\t\t\tpointers: 0,\n\t\t\tdirection: _hammerjs2['default'].DIRECTION_ALL\n\t\t});\n\t\n\t\tscope.hammer.get('pinch').set({\n\t\t\tenable: true,\n\t\t\tthreshold: 0.1\n\t\t});\n\t\n\t\tscope.hammer.on('panstart', function (event) {\n\t\t\tif (scope.enabled === false) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif (event.pointers.length === 1) {\n\t\t\t\tif (scope.enablePan === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\n\t\t\t\thandleTouchStartPan(event);\n\t\t\t\t// panStart.set(event.deltaX, event.deltaY);\n\t\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\t\t\t} else if (event.pointers.length === 2) {\n\t\t\t\tif (scope.enableRotate === false) return;\n\t\n\t\t\t\thandleTouchStartRotate(event);\n\t\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t\t}\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t});\n\t\n\t\tscope.hammer.on('panend', onTouchEnd);\n\t\n\t\tscope.hammer.on('panmove', function (event) {\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\t// event.preventDefault();\n\t\t\t// event.stopPropagation();\n\t\n\t\t\tif (event.pointers.length === 1) {\n\t\t\t\tif (scope.enablePan === false) return;\n\t\t\t\tif (state !== STATE.TOUCH_PAN) return; // is this needed?...\n\t\n\t\t\t\thandleTouchMovePan(event);\n\t\n\t\t\t\t// panEnd.set( event.deltaX, event.deltaY );\n\t\t\t\t//\n\t\t\t\t// panDelta.subVectors( panEnd, panStart );\n\t\t\t\t//\n\t\t\t\t// pan( panDelta.x, panDelta.y );\n\t\t\t\t//\n\t\t\t\t// panStart.copy( panEnd );\n\t\t\t\t//\n\t\t\t\t// scope.update();\n\t\t\t} else if (event.pointers.length === 2) {\n\t\t\t\t\tif (scope.enableRotate === false) return;\n\t\t\t\t\tif (state !== STATE.TOUCH_ROTATE) return; // is this needed?...\n\t\n\t\t\t\t\thandleTouchMoveRotate(event);\n\t\t\t\t}\n\t\t});\n\t\n\t\tscope.hammer.on('pinchstart', function (event) {\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\tif (scope.enableZoom === false) return;\n\t\n\t\t\thandleTouchStartDolly(event);\n\t\n\t\t\t// var dx = event.pointers[ 0 ].pageX - event.pointers[ 1 ].pageX;\n\t\t\t// var dy = event.pointers[ 0 ].pageY - event.pointers[ 1 ].pageY;\n\t\t\t//\n\t\t\t// var distance = Math.sqrt( dx * dx + dy * dy );\n\t\t\t//\n\t\t\t// dollyStart.set( 0, distance );\n\t\t\t//\n\t\t\tstate = STATE.TOUCH_DOLLY;\n\t\n\t\t\tif (state !== STATE.NONE) {\n\t\t\t\tscope.dispatchEvent(startEvent);\n\t\t\t}\n\t\t});\n\t\n\t\tscope.hammer.on('pinchend', onTouchEnd);\n\t\n\t\tscope.hammer.on('pinchmove', function (event) {\n\t\t\tif (scope.enabled === false) return;\n\t\n\t\t\t// event.preventDefault();\n\t\t\t// event.stopPropagation();\n\t\n\t\t\tif (scope.enableZoom === false) return;\n\t\t\tif (state !== STATE.TOUCH_DOLLY) return; // is this needed?...\n\t\n\t\t\thandleTouchMoveDolly(event);\n\t\n\t\t\t// var dx = event.pointers[ 0 ].pageX - event.pointers[ 1 ].pageX;\n\t\t\t// var dy = event.pointers[ 0 ].pageY - event.pointers[ 1 ].pageY;\n\t\t\t//\n\t\t\t// var distance = Math.sqrt( dx * dx + dy * dy );\n\t\t\t//\n\t\t\t// dollyEnd.set( 0, distance );\n\t\t\t//\n\t\t\t// dollyDelta.subVectors( dollyEnd, dollyStart );\n\t\t\t//\n\t\t\t// if ( dollyDelta.y > 0 ) {\n\t\t\t//\n\t\t\t// \tdollyOut( getZoomScale() );\n\t\t\t//\n\t\t\t// } else if ( dollyDelta.y < 0 ) {\n\t\t\t//\n\t\t\t// \tdollyIn( getZoomScale() );\n\t\t\t//\n\t\t\t// }\n\t\t\t//\n\t\t\t// dollyStart.copy( dollyEnd );\n\t\t\t//\n\t\t\t// scope.update();\n\t\t});\n\t\n\t\twindow.addEventListener('keydown', onKeyDown, false);\n\t\n\t\t// force an update at start\n\t\n\t\tthis.update();\n\t};\n\t\n\tOrbitControls.prototype = Object.create(_three2['default'].EventDispatcher.prototype);\n\tOrbitControls.prototype.constructor = _three2['default'].OrbitControls;\n\t\n\tObject.defineProperties(OrbitControls.prototype, {\n\t\n\t\tcenter: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .center has been renamed to .target');\n\t\t\t\treturn this.target;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\t// backward compatibility\n\t\n\t\tnoZoom: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\treturn !this.enableZoom;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n\t\t\t\tthis.enableZoom = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoRotate: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\treturn !this.enableRotate;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');\n\t\t\t\tthis.enableRotate = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoPan: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\treturn !this.enablePan;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n\t\t\t\tthis.enablePan = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tnoKeys: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\treturn !this.enableKeys;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n\t\t\t\tthis.enableKeys = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tstaticMoving: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\treturn !this.constraint.enableDamping;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');\n\t\t\t\tthis.constraint.enableDamping = !value;\n\t\t\t}\n\t\n\t\t},\n\t\n\t\tdynamicDampingFactor: {\n\t\n\t\t\tget: function get() {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\treturn this.constraint.dampingFactor;\n\t\t\t},\n\t\n\t\t\tset: function set(value) {\n\t\n\t\t\t\tconsole.warn('THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');\n\t\t\t\tthis.constraint.dampingFactor = value;\n\t\t\t}\n\t\n\t\t}\n\t\n\t});\n\t\n\texports['default'] = OrbitControls;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_RESULT__;/*! Hammer.JS - v2.0.6 - 2015-12-23\n\t * http://hammerjs.github.io/\n\t *\n\t * Copyright (c) 2015 Jorik Tangelder;\n\t * Licensed under the license */\n\t(function(window, document, exportName, undefined) {\n\t 'use strict';\n\t\n\tvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\n\tvar TEST_ELEMENT = document.createElement('div');\n\t\n\tvar TYPE_FUNCTION = 'function';\n\t\n\tvar round = Math.round;\n\tvar abs = Math.abs;\n\tvar now = Date.now;\n\t\n\t/**\n\t * set a timeout with a given scope\n\t * @param {Function} fn\n\t * @param {Number} timeout\n\t * @param {Object} context\n\t * @returns {number}\n\t */\n\tfunction setTimeoutContext(fn, timeout, context) {\n\t return setTimeout(bindFn(fn, context), timeout);\n\t}\n\t\n\t/**\n\t * if the argument is an array, we want to execute the fn on each entry\n\t * if it aint an array we don't want to do a thing.\n\t * this is used by all the methods that accept a single and array argument.\n\t * @param {*|Array} arg\n\t * @param {String} fn\n\t * @param {Object} [context]\n\t * @returns {Boolean}\n\t */\n\tfunction invokeArrayArg(arg, fn, context) {\n\t if (Array.isArray(arg)) {\n\t each(arg, context[fn], context);\n\t return true;\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * walk objects and arrays\n\t * @param {Object} obj\n\t * @param {Function} iterator\n\t * @param {Object} context\n\t */\n\tfunction each(obj, iterator, context) {\n\t var i;\n\t\n\t if (!obj) {\n\t return;\n\t }\n\t\n\t if (obj.forEach) {\n\t obj.forEach(iterator, context);\n\t } else if (obj.length !== undefined) {\n\t i = 0;\n\t while (i < obj.length) {\n\t iterator.call(context, obj[i], i, obj);\n\t i++;\n\t }\n\t } else {\n\t for (i in obj) {\n\t obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n\t }\n\t }\n\t}\n\t\n\t/**\n\t * wrap a method with a deprecation warning and stack trace\n\t * @param {Function} method\n\t * @param {String} name\n\t * @param {String} message\n\t * @returns {Function} A new function wrapping the supplied method.\n\t */\n\tfunction deprecate(method, name, message) {\n\t var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n\t return function() {\n\t var e = new Error('get-stack-trace');\n\t var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n\t .replace(/^\\s+at\\s+/gm, '')\n\t .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\t\n\t var log = window.console && (window.console.warn || window.console.log);\n\t if (log) {\n\t log.call(window.console, deprecationMessage, stack);\n\t }\n\t return method.apply(this, arguments);\n\t };\n\t}\n\t\n\t/**\n\t * extend object.\n\t * means that properties in dest will be overwritten by the ones in src.\n\t * @param {Object} target\n\t * @param {...Object} objects_to_assign\n\t * @returns {Object} target\n\t */\n\tvar assign;\n\tif (typeof Object.assign !== 'function') {\n\t assign = function assign(target) {\n\t if (target === undefined || target === null) {\n\t throw new TypeError('Cannot convert undefined or null to object');\n\t }\n\t\n\t var output = Object(target);\n\t for (var index = 1; index < arguments.length; index++) {\n\t var source = arguments[index];\n\t if (source !== undefined && source !== null) {\n\t for (var nextKey in source) {\n\t if (source.hasOwnProperty(nextKey)) {\n\t output[nextKey] = source[nextKey];\n\t }\n\t }\n\t }\n\t }\n\t return output;\n\t };\n\t} else {\n\t assign = Object.assign;\n\t}\n\t\n\t/**\n\t * extend object.\n\t * means that properties in dest will be overwritten by the ones in src.\n\t * @param {Object} dest\n\t * @param {Object} src\n\t * @param {Boolean=false} [merge]\n\t * @returns {Object} dest\n\t */\n\tvar extend = deprecate(function extend(dest, src, merge) {\n\t var keys = Object.keys(src);\n\t var i = 0;\n\t while (i < keys.length) {\n\t if (!merge || (merge && dest[keys[i]] === undefined)) {\n\t dest[keys[i]] = src[keys[i]];\n\t }\n\t i++;\n\t }\n\t return dest;\n\t}, 'extend', 'Use `assign`.');\n\t\n\t/**\n\t * merge the values from src in the dest.\n\t * means that properties that exist in dest will not be overwritten by src\n\t * @param {Object} dest\n\t * @param {Object} src\n\t * @returns {Object} dest\n\t */\n\tvar merge = deprecate(function merge(dest, src) {\n\t return extend(dest, src, true);\n\t}, 'merge', 'Use `assign`.');\n\t\n\t/**\n\t * simple class inheritance\n\t * @param {Function} child\n\t * @param {Function} base\n\t * @param {Object} [properties]\n\t */\n\tfunction inherit(child, base, properties) {\n\t var baseP = base.prototype,\n\t childP;\n\t\n\t childP = child.prototype = Object.create(baseP);\n\t childP.constructor = child;\n\t childP._super = baseP;\n\t\n\t if (properties) {\n\t assign(childP, properties);\n\t }\n\t}\n\t\n\t/**\n\t * simple function bind\n\t * @param {Function} fn\n\t * @param {Object} context\n\t * @returns {Function}\n\t */\n\tfunction bindFn(fn, context) {\n\t return function boundFn() {\n\t return fn.apply(context, arguments);\n\t };\n\t}\n\t\n\t/**\n\t * let a boolean value also be a function that must return a boolean\n\t * this first item in args will be used as the context\n\t * @param {Boolean|Function} val\n\t * @param {Array} [args]\n\t * @returns {Boolean}\n\t */\n\tfunction boolOrFn(val, args) {\n\t if (typeof val == TYPE_FUNCTION) {\n\t return val.apply(args ? args[0] || undefined : undefined, args);\n\t }\n\t return val;\n\t}\n\t\n\t/**\n\t * use the val2 when val1 is undefined\n\t * @param {*} val1\n\t * @param {*} val2\n\t * @returns {*}\n\t */\n\tfunction ifUndefined(val1, val2) {\n\t return (val1 === undefined) ? val2 : val1;\n\t}\n\t\n\t/**\n\t * addEventListener with multiple events at once\n\t * @param {EventTarget} target\n\t * @param {String} types\n\t * @param {Function} handler\n\t */\n\tfunction addEventListeners(target, types, handler) {\n\t each(splitStr(types), function(type) {\n\t target.addEventListener(type, handler, false);\n\t });\n\t}\n\t\n\t/**\n\t * removeEventListener with multiple events at once\n\t * @param {EventTarget} target\n\t * @param {String} types\n\t * @param {Function} handler\n\t */\n\tfunction removeEventListeners(target, types, handler) {\n\t each(splitStr(types), function(type) {\n\t target.removeEventListener(type, handler, false);\n\t });\n\t}\n\t\n\t/**\n\t * find if a node is in the given parent\n\t * @method hasParent\n\t * @param {HTMLElement} node\n\t * @param {HTMLElement} parent\n\t * @return {Boolean} found\n\t */\n\tfunction hasParent(node, parent) {\n\t while (node) {\n\t if (node == parent) {\n\t return true;\n\t }\n\t node = node.parentNode;\n\t }\n\t return false;\n\t}\n\t\n\t/**\n\t * small indexOf wrapper\n\t * @param {String} str\n\t * @param {String} find\n\t * @returns {Boolean} found\n\t */\n\tfunction inStr(str, find) {\n\t return str.indexOf(find) > -1;\n\t}\n\t\n\t/**\n\t * split string on whitespace\n\t * @param {String} str\n\t * @returns {Array} words\n\t */\n\tfunction splitStr(str) {\n\t return str.trim().split(/\\s+/g);\n\t}\n\t\n\t/**\n\t * find if a array contains the object using indexOf or a simple polyFill\n\t * @param {Array} src\n\t * @param {String} find\n\t * @param {String} [findByKey]\n\t * @return {Boolean|Number} false when not found, or the index\n\t */\n\tfunction inArray(src, find, findByKey) {\n\t if (src.indexOf && !findByKey) {\n\t return src.indexOf(find);\n\t } else {\n\t var i = 0;\n\t while (i < src.length) {\n\t if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n\t return i;\n\t }\n\t i++;\n\t }\n\t return -1;\n\t }\n\t}\n\t\n\t/**\n\t * convert array-like objects to real arrays\n\t * @param {Object} obj\n\t * @returns {Array}\n\t */\n\tfunction toArray(obj) {\n\t return Array.prototype.slice.call(obj, 0);\n\t}\n\t\n\t/**\n\t * unique array with objects based on a key (like 'id') or just by the array's value\n\t * @param {Array} src [{id:1},{id:2},{id:1}]\n\t * @param {String} [key]\n\t * @param {Boolean} [sort=False]\n\t * @returns {Array} [{id:1},{id:2}]\n\t */\n\tfunction uniqueArray(src, key, sort) {\n\t var results = [];\n\t var values = [];\n\t var i = 0;\n\t\n\t while (i < src.length) {\n\t var val = key ? src[i][key] : src[i];\n\t if (inArray(values, val) < 0) {\n\t results.push(src[i]);\n\t }\n\t values[i] = val;\n\t i++;\n\t }\n\t\n\t if (sort) {\n\t if (!key) {\n\t results = results.sort();\n\t } else {\n\t results = results.sort(function sortUniqueArray(a, b) {\n\t return a[key] > b[key];\n\t });\n\t }\n\t }\n\t\n\t return results;\n\t}\n\t\n\t/**\n\t * get the prefixed property\n\t * @param {Object} obj\n\t * @param {String} property\n\t * @returns {String|Undefined} prefixed\n\t */\n\tfunction prefixed(obj, property) {\n\t var prefix, prop;\n\t var camelProp = property[0].toUpperCase() + property.slice(1);\n\t\n\t var i = 0;\n\t while (i < VENDOR_PREFIXES.length) {\n\t prefix = VENDOR_PREFIXES[i];\n\t prop = (prefix) ? prefix + camelProp : property;\n\t\n\t if (prop in obj) {\n\t return prop;\n\t }\n\t i++;\n\t }\n\t return undefined;\n\t}\n\t\n\t/**\n\t * get a unique id\n\t * @returns {number} uniqueId\n\t */\n\tvar _uniqueId = 1;\n\tfunction uniqueId() {\n\t return _uniqueId++;\n\t}\n\t\n\t/**\n\t * get the window object of an element\n\t * @param {HTMLElement} element\n\t * @returns {DocumentView|Window}\n\t */\n\tfunction getWindowForElement(element) {\n\t var doc = element.ownerDocument || element;\n\t return (doc.defaultView || doc.parentWindow || window);\n\t}\n\t\n\tvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\t\n\tvar SUPPORT_TOUCH = ('ontouchstart' in window);\n\tvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\n\tvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\t\n\tvar INPUT_TYPE_TOUCH = 'touch';\n\tvar INPUT_TYPE_PEN = 'pen';\n\tvar INPUT_TYPE_MOUSE = 'mouse';\n\tvar INPUT_TYPE_KINECT = 'kinect';\n\t\n\tvar COMPUTE_INTERVAL = 25;\n\t\n\tvar INPUT_START = 1;\n\tvar INPUT_MOVE = 2;\n\tvar INPUT_END = 4;\n\tvar INPUT_CANCEL = 8;\n\t\n\tvar DIRECTION_NONE = 1;\n\tvar DIRECTION_LEFT = 2;\n\tvar DIRECTION_RIGHT = 4;\n\tvar DIRECTION_UP = 8;\n\tvar DIRECTION_DOWN = 16;\n\t\n\tvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\n\tvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\n\tvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\t\n\tvar PROPS_XY = ['x', 'y'];\n\tvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\t\n\t/**\n\t * create new input type manager\n\t * @param {Manager} manager\n\t * @param {Function} callback\n\t * @returns {Input}\n\t * @constructor\n\t */\n\tfunction Input(manager, callback) {\n\t var self = this;\n\t this.manager = manager;\n\t this.callback = callback;\n\t this.element = manager.element;\n\t this.target = manager.options.inputTarget;\n\t\n\t // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n\t // so when disabled the input events are completely bypassed.\n\t this.domHandler = function(ev) {\n\t if (boolOrFn(manager.options.enable, [manager])) {\n\t self.handler(ev);\n\t }\n\t };\n\t\n\t this.init();\n\t\n\t}\n\t\n\tInput.prototype = {\n\t /**\n\t * should handle the inputEvent data and trigger the callback\n\t * @virtual\n\t */\n\t handler: function() { },\n\t\n\t /**\n\t * bind the events\n\t */\n\t init: function() {\n\t this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n\t this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n\t this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n\t },\n\t\n\t /**\n\t * unbind the events\n\t */\n\t destroy: function() {\n\t this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n\t this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n\t this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n\t }\n\t};\n\t\n\t/**\n\t * create new input type manager\n\t * called by the Manager constructor\n\t * @param {Hammer} manager\n\t * @returns {Input}\n\t */\n\tfunction createInputInstance(manager) {\n\t var Type;\n\t var inputClass = manager.options.inputClass;\n\t\n\t if (inputClass) {\n\t Type = inputClass;\n\t } else if (SUPPORT_POINTER_EVENTS) {\n\t Type = PointerEventInput;\n\t } else if (SUPPORT_ONLY_TOUCH) {\n\t Type = TouchInput;\n\t } else if (!SUPPORT_TOUCH) {\n\t Type = MouseInput;\n\t } else {\n\t Type = TouchMouseInput;\n\t }\n\t return new (Type)(manager, inputHandler);\n\t}\n\t\n\t/**\n\t * handle input events\n\t * @param {Manager} manager\n\t * @param {String} eventType\n\t * @param {Object} input\n\t */\n\tfunction inputHandler(manager, eventType, input) {\n\t var pointersLen = input.pointers.length;\n\t var changedPointersLen = input.changedPointers.length;\n\t var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n\t var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\t\n\t input.isFirst = !!isFirst;\n\t input.isFinal = !!isFinal;\n\t\n\t if (isFirst) {\n\t manager.session = {};\n\t }\n\t\n\t // source event is the normalized value of the domEvents\n\t // like 'touchstart, mouseup, pointerdown'\n\t input.eventType = eventType;\n\t\n\t // compute scale, rotation etc\n\t computeInputData(manager, input);\n\t\n\t // emit secret event\n\t manager.emit('hammer.input', input);\n\t\n\t manager.recognize(input);\n\t manager.session.prevInput = input;\n\t}\n\t\n\t/**\n\t * extend the data with some usable properties like scale, rotate, velocity etc\n\t * @param {Object} manager\n\t * @param {Object} input\n\t */\n\tfunction computeInputData(manager, input) {\n\t var session = manager.session;\n\t var pointers = input.pointers;\n\t var pointersLength = pointers.length;\n\t\n\t // store the first input to calculate the distance and direction\n\t if (!session.firstInput) {\n\t session.firstInput = simpleCloneInputData(input);\n\t }\n\t\n\t // to compute scale and rotation we need to store the multiple touches\n\t if (pointersLength > 1 && !session.firstMultiple) {\n\t session.firstMultiple = simpleCloneInputData(input);\n\t } else if (pointersLength === 1) {\n\t session.firstMultiple = false;\n\t }\n\t\n\t var firstInput = session.firstInput;\n\t var firstMultiple = session.firstMultiple;\n\t var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\t\n\t var center = input.center = getCenter(pointers);\n\t input.timeStamp = now();\n\t input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\t\n\t input.angle = getAngle(offsetCenter, center);\n\t input.distance = getDistance(offsetCenter, center);\n\t\n\t computeDeltaXY(session, input);\n\t input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\t\n\t var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n\t input.overallVelocityX = overallVelocity.x;\n\t input.overallVelocityY = overallVelocity.y;\n\t input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\t\n\t input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n\t input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\t\n\t input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n\t session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\t\n\t computeIntervalInputData(session, input);\n\t\n\t // find the correct target\n\t var target = manager.element;\n\t if (hasParent(input.srcEvent.target, target)) {\n\t target = input.srcEvent.target;\n\t }\n\t input.target = target;\n\t}\n\t\n\tfunction computeDeltaXY(session, input) {\n\t var center = input.center;\n\t var offset = session.offsetDelta || {};\n\t var prevDelta = session.prevDelta || {};\n\t var prevInput = session.prevInput || {};\n\t\n\t if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n\t prevDelta = session.prevDelta = {\n\t x: prevInput.deltaX || 0,\n\t y: prevInput.deltaY || 0\n\t };\n\t\n\t offset = session.offsetDelta = {\n\t x: center.x,\n\t y: center.y\n\t };\n\t }\n\t\n\t input.deltaX = prevDelta.x + (center.x - offset.x);\n\t input.deltaY = prevDelta.y + (center.y - offset.y);\n\t}\n\t\n\t/**\n\t * velocity is calculated every x ms\n\t * @param {Object} session\n\t * @param {Object} input\n\t */\n\tfunction computeIntervalInputData(session, input) {\n\t var last = session.lastInterval || input,\n\t deltaTime = input.timeStamp - last.timeStamp,\n\t velocity, velocityX, velocityY, direction;\n\t\n\t if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n\t var deltaX = input.deltaX - last.deltaX;\n\t var deltaY = input.deltaY - last.deltaY;\n\t\n\t var v = getVelocity(deltaTime, deltaX, deltaY);\n\t velocityX = v.x;\n\t velocityY = v.y;\n\t velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n\t direction = getDirection(deltaX, deltaY);\n\t\n\t session.lastInterval = input;\n\t } else {\n\t // use latest velocity info if it doesn't overtake a minimum period\n\t velocity = last.velocity;\n\t velocityX = last.velocityX;\n\t velocityY = last.velocityY;\n\t direction = last.direction;\n\t }\n\t\n\t input.velocity = velocity;\n\t input.velocityX = velocityX;\n\t input.velocityY = velocityY;\n\t input.direction = direction;\n\t}\n\t\n\t/**\n\t * create a simple clone from the input used for storage of firstInput and firstMultiple\n\t * @param {Object} input\n\t * @returns {Object} clonedInputData\n\t */\n\tfunction simpleCloneInputData(input) {\n\t // make a simple copy of the pointers because we will get a reference if we don't\n\t // we only need clientXY for the calculations\n\t var pointers = [];\n\t var i = 0;\n\t while (i < input.pointers.length) {\n\t pointers[i] = {\n\t clientX: round(input.pointers[i].clientX),\n\t clientY: round(input.pointers[i].clientY)\n\t };\n\t i++;\n\t }\n\t\n\t return {\n\t timeStamp: now(),\n\t pointers: pointers,\n\t center: getCenter(pointers),\n\t deltaX: input.deltaX,\n\t deltaY: input.deltaY\n\t };\n\t}\n\t\n\t/**\n\t * get the center of all the pointers\n\t * @param {Array} pointers\n\t * @return {Object} center contains `x` and `y` properties\n\t */\n\tfunction getCenter(pointers) {\n\t var pointersLength = pointers.length;\n\t\n\t // no need to loop when only one touch\n\t if (pointersLength === 1) {\n\t return {\n\t x: round(pointers[0].clientX),\n\t y: round(pointers[0].clientY)\n\t };\n\t }\n\t\n\t var x = 0, y = 0, i = 0;\n\t while (i < pointersLength) {\n\t x += pointers[i].clientX;\n\t y += pointers[i].clientY;\n\t i++;\n\t }\n\t\n\t return {\n\t x: round(x / pointersLength),\n\t y: round(y / pointersLength)\n\t };\n\t}\n\t\n\t/**\n\t * calculate the velocity between two points. unit is in px per ms.\n\t * @param {Number} deltaTime\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @return {Object} velocity `x` and `y`\n\t */\n\tfunction getVelocity(deltaTime, x, y) {\n\t return {\n\t x: x / deltaTime || 0,\n\t y: y / deltaTime || 0\n\t };\n\t}\n\t\n\t/**\n\t * get the direction between two points\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @return {Number} direction\n\t */\n\tfunction getDirection(x, y) {\n\t if (x === y) {\n\t return DIRECTION_NONE;\n\t }\n\t\n\t if (abs(x) >= abs(y)) {\n\t return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n\t }\n\t return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n\t}\n\t\n\t/**\n\t * calculate the absolute distance between two points\n\t * @param {Object} p1 {x, y}\n\t * @param {Object} p2 {x, y}\n\t * @param {Array} [props] containing x and y keys\n\t * @return {Number} distance\n\t */\n\tfunction getDistance(p1, p2, props) {\n\t if (!props) {\n\t props = PROPS_XY;\n\t }\n\t var x = p2[props[0]] - p1[props[0]],\n\t y = p2[props[1]] - p1[props[1]];\n\t\n\t return Math.sqrt((x * x) + (y * y));\n\t}\n\t\n\t/**\n\t * calculate the angle between two coordinates\n\t * @param {Object} p1\n\t * @param {Object} p2\n\t * @param {Array} [props] containing x and y keys\n\t * @return {Number} angle\n\t */\n\tfunction getAngle(p1, p2, props) {\n\t if (!props) {\n\t props = PROPS_XY;\n\t }\n\t var x = p2[props[0]] - p1[props[0]],\n\t y = p2[props[1]] - p1[props[1]];\n\t return Math.atan2(y, x) * 180 / Math.PI;\n\t}\n\t\n\t/**\n\t * calculate the rotation degrees between two pointersets\n\t * @param {Array} start array of pointers\n\t * @param {Array} end array of pointers\n\t * @return {Number} rotation\n\t */\n\tfunction getRotation(start, end) {\n\t return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n\t}\n\t\n\t/**\n\t * calculate the scale factor between two pointersets\n\t * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n\t * @param {Array} start array of pointers\n\t * @param {Array} end array of pointers\n\t * @return {Number} scale\n\t */\n\tfunction getScale(start, end) {\n\t return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n\t}\n\t\n\tvar MOUSE_INPUT_MAP = {\n\t mousedown: INPUT_START,\n\t mousemove: INPUT_MOVE,\n\t mouseup: INPUT_END\n\t};\n\t\n\tvar MOUSE_ELEMENT_EVENTS = 'mousedown';\n\tvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\t\n\t/**\n\t * Mouse events input\n\t * @constructor\n\t * @extends Input\n\t */\n\tfunction MouseInput() {\n\t this.evEl = MOUSE_ELEMENT_EVENTS;\n\t this.evWin = MOUSE_WINDOW_EVENTS;\n\t\n\t this.allow = true; // used by Input.TouchMouse to disable mouse events\n\t this.pressed = false; // mousedown state\n\t\n\t Input.apply(this, arguments);\n\t}\n\t\n\tinherit(MouseInput, Input, {\n\t /**\n\t * handle mouse events\n\t * @param {Object} ev\n\t */\n\t handler: function MEhandler(ev) {\n\t var eventType = MOUSE_INPUT_MAP[ev.type];\n\t\n\t // on start we want to have the left mouse button down\n\t if (eventType & INPUT_START && ev.button === 0) {\n\t this.pressed = true;\n\t }\n\t\n\t if (eventType & INPUT_MOVE && ev.which !== 1) {\n\t eventType = INPUT_END;\n\t }\n\t\n\t // mouse must be down, and mouse events are allowed (see the TouchMouse input)\n\t if (!this.pressed || !this.allow) {\n\t return;\n\t }\n\t\n\t if (eventType & INPUT_END) {\n\t this.pressed = false;\n\t }\n\t\n\t this.callback(this.manager, eventType, {\n\t pointers: [ev],\n\t changedPointers: [ev],\n\t pointerType: INPUT_TYPE_MOUSE,\n\t srcEvent: ev\n\t });\n\t }\n\t});\n\t\n\tvar POINTER_INPUT_MAP = {\n\t pointerdown: INPUT_START,\n\t pointermove: INPUT_MOVE,\n\t pointerup: INPUT_END,\n\t pointercancel: INPUT_CANCEL,\n\t pointerout: INPUT_CANCEL\n\t};\n\t\n\t// in IE10 the pointer types is defined as an enum\n\tvar IE10_POINTER_TYPE_ENUM = {\n\t 2: INPUT_TYPE_TOUCH,\n\t 3: INPUT_TYPE_PEN,\n\t 4: INPUT_TYPE_MOUSE,\n\t 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n\t};\n\t\n\tvar POINTER_ELEMENT_EVENTS = 'pointerdown';\n\tvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\t\n\t// IE10 has prefixed support, and case-sensitive\n\tif (window.MSPointerEvent && !window.PointerEvent) {\n\t POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n\t POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n\t}\n\t\n\t/**\n\t * Pointer events input\n\t * @constructor\n\t * @extends Input\n\t */\n\tfunction PointerEventInput() {\n\t this.evEl = POINTER_ELEMENT_EVENTS;\n\t this.evWin = POINTER_WINDOW_EVENTS;\n\t\n\t Input.apply(this, arguments);\n\t\n\t this.store = (this.manager.session.pointerEvents = []);\n\t}\n\t\n\tinherit(PointerEventInput, Input, {\n\t /**\n\t * handle mouse events\n\t * @param {Object} ev\n\t */\n\t handler: function PEhandler(ev) {\n\t var store = this.store;\n\t var removePointer = false;\n\t\n\t var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n\t var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n\t var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\t\n\t var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\t\n\t // get index of the event in the store\n\t var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\t\n\t // start and mouse must be down\n\t if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n\t if (storeIndex < 0) {\n\t store.push(ev);\n\t storeIndex = store.length - 1;\n\t }\n\t } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n\t removePointer = true;\n\t }\n\t\n\t // it not found, so the pointer hasn't been down (so it's probably a hover)\n\t if (storeIndex < 0) {\n\t return;\n\t }\n\t\n\t // update the event in the store\n\t store[storeIndex] = ev;\n\t\n\t this.callback(this.manager, eventType, {\n\t pointers: store,\n\t changedPointers: [ev],\n\t pointerType: pointerType,\n\t srcEvent: ev\n\t });\n\t\n\t if (removePointer) {\n\t // remove from the store\n\t store.splice(storeIndex, 1);\n\t }\n\t }\n\t});\n\t\n\tvar SINGLE_TOUCH_INPUT_MAP = {\n\t touchstart: INPUT_START,\n\t touchmove: INPUT_MOVE,\n\t touchend: INPUT_END,\n\t touchcancel: INPUT_CANCEL\n\t};\n\t\n\tvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\n\tvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\t\n\t/**\n\t * Touch events input\n\t * @constructor\n\t * @extends Input\n\t */\n\tfunction SingleTouchInput() {\n\t this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n\t this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n\t this.started = false;\n\t\n\t Input.apply(this, arguments);\n\t}\n\t\n\tinherit(SingleTouchInput, Input, {\n\t handler: function TEhandler(ev) {\n\t var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\t\n\t // should we handle the touch events?\n\t if (type === INPUT_START) {\n\t this.started = true;\n\t }\n\t\n\t if (!this.started) {\n\t return;\n\t }\n\t\n\t var touches = normalizeSingleTouches.call(this, ev, type);\n\t\n\t // when done, reset the started state\n\t if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n\t this.started = false;\n\t }\n\t\n\t this.callback(this.manager, type, {\n\t pointers: touches[0],\n\t changedPointers: touches[1],\n\t pointerType: INPUT_TYPE_TOUCH,\n\t srcEvent: ev\n\t });\n\t }\n\t});\n\t\n\t/**\n\t * @this {TouchInput}\n\t * @param {Object} ev\n\t * @param {Number} type flag\n\t * @returns {undefined|Array} [all, changed]\n\t */\n\tfunction normalizeSingleTouches(ev, type) {\n\t var all = toArray(ev.touches);\n\t var changed = toArray(ev.changedTouches);\n\t\n\t if (type & (INPUT_END | INPUT_CANCEL)) {\n\t all = uniqueArray(all.concat(changed), 'identifier', true);\n\t }\n\t\n\t return [all, changed];\n\t}\n\t\n\tvar TOUCH_INPUT_MAP = {\n\t touchstart: INPUT_START,\n\t touchmove: INPUT_MOVE,\n\t touchend: INPUT_END,\n\t touchcancel: INPUT_CANCEL\n\t};\n\t\n\tvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\t\n\t/**\n\t * Multi-user touch events input\n\t * @constructor\n\t * @extends Input\n\t */\n\tfunction TouchInput() {\n\t this.evTarget = TOUCH_TARGET_EVENTS;\n\t this.targetIds = {};\n\t\n\t Input.apply(this, arguments);\n\t}\n\t\n\tinherit(TouchInput, Input, {\n\t handler: function MTEhandler(ev) {\n\t var type = TOUCH_INPUT_MAP[ev.type];\n\t var touches = getTouches.call(this, ev, type);\n\t if (!touches) {\n\t return;\n\t }\n\t\n\t this.callback(this.manager, type, {\n\t pointers: touches[0],\n\t changedPointers: touches[1],\n\t pointerType: INPUT_TYPE_TOUCH,\n\t srcEvent: ev\n\t });\n\t }\n\t});\n\t\n\t/**\n\t * @this {TouchInput}\n\t * @param {Object} ev\n\t * @param {Number} type flag\n\t * @returns {undefined|Array} [all, changed]\n\t */\n\tfunction getTouches(ev, type) {\n\t var allTouches = toArray(ev.touches);\n\t var targetIds = this.targetIds;\n\t\n\t // when there is only one touch, the process can be simplified\n\t if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n\t targetIds[allTouches[0].identifier] = true;\n\t return [allTouches, allTouches];\n\t }\n\t\n\t var i,\n\t targetTouches,\n\t changedTouches = toArray(ev.changedTouches),\n\t changedTargetTouches = [],\n\t target = this.target;\n\t\n\t // get target touches from touches\n\t targetTouches = allTouches.filter(function(touch) {\n\t return hasParent(touch.target, target);\n\t });\n\t\n\t // collect touches\n\t if (type === INPUT_START) {\n\t i = 0;\n\t while (i < targetTouches.length) {\n\t targetIds[targetTouches[i].identifier] = true;\n\t i++;\n\t }\n\t }\n\t\n\t // filter changed touches to only contain touches that exist in the collected target ids\n\t i = 0;\n\t while (i < changedTouches.length) {\n\t if (targetIds[changedTouches[i].identifier]) {\n\t changedTargetTouches.push(changedTouches[i]);\n\t }\n\t\n\t // cleanup removed touches\n\t if (type & (INPUT_END | INPUT_CANCEL)) {\n\t delete targetIds[changedTouches[i].identifier];\n\t }\n\t i++;\n\t }\n\t\n\t if (!changedTargetTouches.length) {\n\t return;\n\t }\n\t\n\t return [\n\t // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n\t uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n\t changedTargetTouches\n\t ];\n\t}\n\t\n\t/**\n\t * Combined touch and mouse input\n\t *\n\t * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n\t * This because touch devices also emit mouse events while doing a touch.\n\t *\n\t * @constructor\n\t * @extends Input\n\t */\n\tfunction TouchMouseInput() {\n\t Input.apply(this, arguments);\n\t\n\t var handler = bindFn(this.handler, this);\n\t this.touch = new TouchInput(this.manager, handler);\n\t this.mouse = new MouseInput(this.manager, handler);\n\t}\n\t\n\tinherit(TouchMouseInput, Input, {\n\t /**\n\t * handle mouse and touch events\n\t * @param {Hammer} manager\n\t * @param {String} inputEvent\n\t * @param {Object} inputData\n\t */\n\t handler: function TMEhandler(manager, inputEvent, inputData) {\n\t var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n\t isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\t\n\t // when we're in a touch event, so block all upcoming mouse events\n\t // most mobile browser also emit mouseevents, right after touchstart\n\t if (isTouch) {\n\t this.mouse.allow = false;\n\t } else if (isMouse && !this.mouse.allow) {\n\t return;\n\t }\n\t\n\t // reset the allowMouse when we're done\n\t if (inputEvent & (INPUT_END | INPUT_CANCEL)) {\n\t this.mouse.allow = true;\n\t }\n\t\n\t this.callback(manager, inputEvent, inputData);\n\t },\n\t\n\t /**\n\t * remove the event listeners\n\t */\n\t destroy: function destroy() {\n\t this.touch.destroy();\n\t this.mouse.destroy();\n\t }\n\t});\n\t\n\tvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\n\tvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\t\n\t// magical touchAction value\n\tvar TOUCH_ACTION_COMPUTE = 'compute';\n\tvar TOUCH_ACTION_AUTO = 'auto';\n\tvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\n\tvar TOUCH_ACTION_NONE = 'none';\n\tvar TOUCH_ACTION_PAN_X = 'pan-x';\n\tvar TOUCH_ACTION_PAN_Y = 'pan-y';\n\t\n\t/**\n\t * Touch Action\n\t * sets the touchAction property or uses the js alternative\n\t * @param {Manager} manager\n\t * @param {String} value\n\t * @constructor\n\t */\n\tfunction TouchAction(manager, value) {\n\t this.manager = manager;\n\t this.set(value);\n\t}\n\t\n\tTouchAction.prototype = {\n\t /**\n\t * set the touchAction value on the element or enable the polyfill\n\t * @param {String} value\n\t */\n\t set: function(value) {\n\t // find out the touch-action by the event handlers\n\t if (value == TOUCH_ACTION_COMPUTE) {\n\t value = this.compute();\n\t }\n\t\n\t if (NATIVE_TOUCH_ACTION && this.manager.element.style) {\n\t this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n\t }\n\t this.actions = value.toLowerCase().trim();\n\t },\n\t\n\t /**\n\t * just re-set the touchAction value\n\t */\n\t update: function() {\n\t this.set(this.manager.options.touchAction);\n\t },\n\t\n\t /**\n\t * compute the value for the touchAction property based on the recognizer's settings\n\t * @returns {String} value\n\t */\n\t compute: function() {\n\t var actions = [];\n\t each(this.manager.recognizers, function(recognizer) {\n\t if (boolOrFn(recognizer.options.enable, [recognizer])) {\n\t actions = actions.concat(recognizer.getTouchAction());\n\t }\n\t });\n\t return cleanTouchActions(actions.join(' '));\n\t },\n\t\n\t /**\n\t * this method is called on each input cycle and provides the preventing of the browser behavior\n\t * @param {Object} input\n\t */\n\t preventDefaults: function(input) {\n\t // not needed with native support for the touchAction property\n\t if (NATIVE_TOUCH_ACTION) {\n\t return;\n\t }\n\t\n\t var srcEvent = input.srcEvent;\n\t var direction = input.offsetDirection;\n\t\n\t // if the touch action did prevented once this session\n\t if (this.manager.session.prevented) {\n\t srcEvent.preventDefault();\n\t return;\n\t }\n\t\n\t var actions = this.actions;\n\t var hasNone = inStr(actions, TOUCH_ACTION_NONE);\n\t var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\t var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n\t\n\t if (hasNone) {\n\t //do not prevent defaults if this is a tap gesture\n\t\n\t var isTapPointer = input.pointers.length === 1;\n\t var isTapMovement = input.distance < 2;\n\t var isTapTouchTime = input.deltaTime < 250;\n\t\n\t if (isTapPointer && isTapMovement && isTapTouchTime) {\n\t return;\n\t }\n\t }\n\t\n\t if (hasPanX && hasPanY) {\n\t // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n\t return;\n\t }\n\t\n\t if (hasNone ||\n\t (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n\t (hasPanX && direction & DIRECTION_VERTICAL)) {\n\t return this.preventSrc(srcEvent);\n\t }\n\t },\n\t\n\t /**\n\t * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n\t * @param {Object} srcEvent\n\t */\n\t preventSrc: function(srcEvent) {\n\t this.manager.session.prevented = true;\n\t srcEvent.preventDefault();\n\t }\n\t};\n\t\n\t/**\n\t * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n\t * @param {String} actions\n\t * @returns {*}\n\t */\n\tfunction cleanTouchActions(actions) {\n\t // none\n\t if (inStr(actions, TOUCH_ACTION_NONE)) {\n\t return TOUCH_ACTION_NONE;\n\t }\n\t\n\t var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n\t var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\t\n\t // if both pan-x and pan-y are set (different recognizers\n\t // for different directions, e.g. horizontal pan but vertical swipe?)\n\t // we need none (as otherwise with pan-x pan-y combined none of these\n\t // recognizers will work, since the browser would handle all panning\n\t if (hasPanX && hasPanY) {\n\t return TOUCH_ACTION_NONE;\n\t }\n\t\n\t // pan-x OR pan-y\n\t if (hasPanX || hasPanY) {\n\t return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n\t }\n\t\n\t // manipulation\n\t if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n\t return TOUCH_ACTION_MANIPULATION;\n\t }\n\t\n\t return TOUCH_ACTION_AUTO;\n\t}\n\t\n\t/**\n\t * Recognizer flow explained; *\n\t * All recognizers have the initial state of POSSIBLE when a input session starts.\n\t * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n\t * Example session for mouse-input: mousedown -> mousemove -> mouseup\n\t *\n\t * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n\t * which determines with state it should be.\n\t *\n\t * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n\t * POSSIBLE to give it another change on the next cycle.\n\t *\n\t * Possible\n\t * |\n\t * +-----+---------------+\n\t * | |\n\t * +-----+-----+ |\n\t * | | |\n\t * Failed Cancelled |\n\t * +-------+------+\n\t * | |\n\t * Recognized Began\n\t * |\n\t * Changed\n\t * |\n\t * Ended/Recognized\n\t */\n\tvar STATE_POSSIBLE = 1;\n\tvar STATE_BEGAN = 2;\n\tvar STATE_CHANGED = 4;\n\tvar STATE_ENDED = 8;\n\tvar STATE_RECOGNIZED = STATE_ENDED;\n\tvar STATE_CANCELLED = 16;\n\tvar STATE_FAILED = 32;\n\t\n\t/**\n\t * Recognizer\n\t * Every recognizer needs to extend from this class.\n\t * @constructor\n\t * @param {Object} options\n\t */\n\tfunction Recognizer(options) {\n\t this.options = assign({}, this.defaults, options || {});\n\t\n\t this.id = uniqueId();\n\t\n\t this.manager = null;\n\t\n\t // default is enable true\n\t this.options.enable = ifUndefined(this.options.enable, true);\n\t\n\t this.state = STATE_POSSIBLE;\n\t\n\t this.simultaneous = {};\n\t this.requireFail = [];\n\t}\n\t\n\tRecognizer.prototype = {\n\t /**\n\t * @virtual\n\t * @type {Object}\n\t */\n\t defaults: {},\n\t\n\t /**\n\t * set options\n\t * @param {Object} options\n\t * @return {Recognizer}\n\t */\n\t set: function(options) {\n\t assign(this.options, options);\n\t\n\t // also update the touchAction, in case something changed about the directions/enabled state\n\t this.manager && this.manager.touchAction.update();\n\t return this;\n\t },\n\t\n\t /**\n\t * recognize simultaneous with an other recognizer.\n\t * @param {Recognizer} otherRecognizer\n\t * @returns {Recognizer} this\n\t */\n\t recognizeWith: function(otherRecognizer) {\n\t if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n\t return this;\n\t }\n\t\n\t var simultaneous = this.simultaneous;\n\t otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\t if (!simultaneous[otherRecognizer.id]) {\n\t simultaneous[otherRecognizer.id] = otherRecognizer;\n\t otherRecognizer.recognizeWith(this);\n\t }\n\t return this;\n\t },\n\t\n\t /**\n\t * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n\t * @param {Recognizer} otherRecognizer\n\t * @returns {Recognizer} this\n\t */\n\t dropRecognizeWith: function(otherRecognizer) {\n\t if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n\t return this;\n\t }\n\t\n\t otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\t delete this.simultaneous[otherRecognizer.id];\n\t return this;\n\t },\n\t\n\t /**\n\t * recognizer can only run when an other is failing\n\t * @param {Recognizer} otherRecognizer\n\t * @returns {Recognizer} this\n\t */\n\t requireFailure: function(otherRecognizer) {\n\t if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n\t return this;\n\t }\n\t\n\t var requireFail = this.requireFail;\n\t otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\t if (inArray(requireFail, otherRecognizer) === -1) {\n\t requireFail.push(otherRecognizer);\n\t otherRecognizer.requireFailure(this);\n\t }\n\t return this;\n\t },\n\t\n\t /**\n\t * drop the requireFailure link. it does not remove the link on the other recognizer.\n\t * @param {Recognizer} otherRecognizer\n\t * @returns {Recognizer} this\n\t */\n\t dropRequireFailure: function(otherRecognizer) {\n\t if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n\t return this;\n\t }\n\t\n\t otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n\t var index = inArray(this.requireFail, otherRecognizer);\n\t if (index > -1) {\n\t this.requireFail.splice(index, 1);\n\t }\n\t return this;\n\t },\n\t\n\t /**\n\t * has require failures boolean\n\t * @returns {boolean}\n\t */\n\t hasRequireFailures: function() {\n\t return this.requireFail.length > 0;\n\t },\n\t\n\t /**\n\t * if the recognizer can recognize simultaneous with an other recognizer\n\t * @param {Recognizer} otherRecognizer\n\t * @returns {Boolean}\n\t */\n\t canRecognizeWith: function(otherRecognizer) {\n\t return !!this.simultaneous[otherRecognizer.id];\n\t },\n\t\n\t /**\n\t * You should use `tryEmit` instead of `emit` directly to check\n\t * that all the needed recognizers has failed before emitting.\n\t * @param {Object} input\n\t */\n\t emit: function(input) {\n\t var self = this;\n\t var state = this.state;\n\t\n\t function emit(event) {\n\t self.manager.emit(event, input);\n\t }\n\t\n\t // 'panstart' and 'panmove'\n\t if (state < STATE_ENDED) {\n\t emit(self.options.event + stateStr(state));\n\t }\n\t\n\t emit(self.options.event); // simple 'eventName' events\n\t\n\t if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n\t emit(input.additionalEvent);\n\t }\n\t\n\t // panend and pancancel\n\t if (state >= STATE_ENDED) {\n\t emit(self.options.event + stateStr(state));\n\t }\n\t },\n\t\n\t /**\n\t * Check that all the require failure recognizers has failed,\n\t * if true, it emits a gesture event,\n\t * otherwise, setup the state to FAILED.\n\t * @param {Object} input\n\t */\n\t tryEmit: function(input) {\n\t if (this.canEmit()) {\n\t return this.emit(input);\n\t }\n\t // it's failing anyway\n\t this.state = STATE_FAILED;\n\t },\n\t\n\t /**\n\t * can we emit?\n\t * @returns {boolean}\n\t */\n\t canEmit: function() {\n\t var i = 0;\n\t while (i < this.requireFail.length) {\n\t if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n\t return false;\n\t }\n\t i++;\n\t }\n\t return true;\n\t },\n\t\n\t /**\n\t * update the recognizer\n\t * @param {Object} inputData\n\t */\n\t recognize: function(inputData) {\n\t // make a new copy of the inputData\n\t // so we can change the inputData without messing up the other recognizers\n\t var inputDataClone = assign({}, inputData);\n\t\n\t // is is enabled and allow recognizing?\n\t if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n\t this.reset();\n\t this.state = STATE_FAILED;\n\t return;\n\t }\n\t\n\t // reset when we've reached the end\n\t if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n\t this.state = STATE_POSSIBLE;\n\t }\n\t\n\t this.state = this.process(inputDataClone);\n\t\n\t // the recognizer has recognized a gesture\n\t // so trigger an event\n\t if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n\t this.tryEmit(inputDataClone);\n\t }\n\t },\n\t\n\t /**\n\t * return the state of the recognizer\n\t * the actual recognizing happens in this method\n\t * @virtual\n\t * @param {Object} inputData\n\t * @returns {Const} STATE\n\t */\n\t process: function(inputData) { }, // jshint ignore:line\n\t\n\t /**\n\t * return the preferred touch-action\n\t * @virtual\n\t * @returns {Array}\n\t */\n\t getTouchAction: function() { },\n\t\n\t /**\n\t * called when the gesture isn't allowed to recognize\n\t * like when another is being recognized or it is disabled\n\t * @virtual\n\t */\n\t reset: function() { }\n\t};\n\t\n\t/**\n\t * get a usable string, used as event postfix\n\t * @param {Const} state\n\t * @returns {String} state\n\t */\n\tfunction stateStr(state) {\n\t if (state & STATE_CANCELLED) {\n\t return 'cancel';\n\t } else if (state & STATE_ENDED) {\n\t return 'end';\n\t } else if (state & STATE_CHANGED) {\n\t return 'move';\n\t } else if (state & STATE_BEGAN) {\n\t return 'start';\n\t }\n\t return '';\n\t}\n\t\n\t/**\n\t * direction cons to string\n\t * @param {Const} direction\n\t * @returns {String}\n\t */\n\tfunction directionStr(direction) {\n\t if (direction == DIRECTION_DOWN) {\n\t return 'down';\n\t } else if (direction == DIRECTION_UP) {\n\t return 'up';\n\t } else if (direction == DIRECTION_LEFT) {\n\t return 'left';\n\t } else if (direction == DIRECTION_RIGHT) {\n\t return 'right';\n\t }\n\t return '';\n\t}\n\t\n\t/**\n\t * get a recognizer by name if it is bound to a manager\n\t * @param {Recognizer|String} otherRecognizer\n\t * @param {Recognizer} recognizer\n\t * @returns {Recognizer}\n\t */\n\tfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n\t var manager = recognizer.manager;\n\t if (manager) {\n\t return manager.get(otherRecognizer);\n\t }\n\t return otherRecognizer;\n\t}\n\t\n\t/**\n\t * This recognizer is just used as a base for the simple attribute recognizers.\n\t * @constructor\n\t * @extends Recognizer\n\t */\n\tfunction AttrRecognizer() {\n\t Recognizer.apply(this, arguments);\n\t}\n\t\n\tinherit(AttrRecognizer, Recognizer, {\n\t /**\n\t * @namespace\n\t * @memberof AttrRecognizer\n\t */\n\t defaults: {\n\t /**\n\t * @type {Number}\n\t * @default 1\n\t */\n\t pointers: 1\n\t },\n\t\n\t /**\n\t * Used to check if it the recognizer receives valid input, like input.distance > 10.\n\t * @memberof AttrRecognizer\n\t * @param {Object} input\n\t * @returns {Boolean} recognized\n\t */\n\t attrTest: function(input) {\n\t var optionPointers = this.options.pointers;\n\t return optionPointers === 0 || input.pointers.length === optionPointers;\n\t },\n\t\n\t /**\n\t * Process the input and return the state for the recognizer\n\t * @memberof AttrRecognizer\n\t * @param {Object} input\n\t * @returns {*} State\n\t */\n\t process: function(input) {\n\t var state = this.state;\n\t var eventType = input.eventType;\n\t\n\t var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n\t var isValid = this.attrTest(input);\n\t\n\t // on cancel input and we've recognized before, return STATE_CANCELLED\n\t if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n\t return state | STATE_CANCELLED;\n\t } else if (isRecognized || isValid) {\n\t if (eventType & INPUT_END) {\n\t return state | STATE_ENDED;\n\t } else if (!(state & STATE_BEGAN)) {\n\t return STATE_BEGAN;\n\t }\n\t return state | STATE_CHANGED;\n\t }\n\t return STATE_FAILED;\n\t }\n\t});\n\t\n\t/**\n\t * Pan\n\t * Recognized when the pointer is down and moved in the allowed direction.\n\t * @constructor\n\t * @extends AttrRecognizer\n\t */\n\tfunction PanRecognizer() {\n\t AttrRecognizer.apply(this, arguments);\n\t\n\t this.pX = null;\n\t this.pY = null;\n\t}\n\t\n\tinherit(PanRecognizer, AttrRecognizer, {\n\t /**\n\t * @namespace\n\t * @memberof PanRecognizer\n\t */\n\t defaults: {\n\t event: 'pan',\n\t threshold: 10,\n\t pointers: 1,\n\t direction: DIRECTION_ALL\n\t },\n\t\n\t getTouchAction: function() {\n\t var direction = this.options.direction;\n\t var actions = [];\n\t if (direction & DIRECTION_HORIZONTAL) {\n\t actions.push(TOUCH_ACTION_PAN_Y);\n\t }\n\t if (direction & DIRECTION_VERTICAL) {\n\t actions.push(TOUCH_ACTION_PAN_X);\n\t }\n\t return actions;\n\t },\n\t\n\t directionTest: function(input) {\n\t var options = this.options;\n\t var hasMoved = true;\n\t var distance = input.distance;\n\t var direction = input.direction;\n\t var x = input.deltaX;\n\t var y = input.deltaY;\n\t\n\t // lock to axis?\n\t if (!(direction & options.direction)) {\n\t if (options.direction & DIRECTION_HORIZONTAL) {\n\t direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n\t hasMoved = x != this.pX;\n\t distance = Math.abs(input.deltaX);\n\t } else {\n\t direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n\t hasMoved = y != this.pY;\n\t distance = Math.abs(input.deltaY);\n\t }\n\t }\n\t input.direction = direction;\n\t return hasMoved && distance > options.threshold && direction & options.direction;\n\t },\n\t\n\t attrTest: function(input) {\n\t return AttrRecognizer.prototype.attrTest.call(this, input) &&\n\t (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n\t },\n\t\n\t emit: function(input) {\n\t\n\t this.pX = input.deltaX;\n\t this.pY = input.deltaY;\n\t\n\t var direction = directionStr(input.direction);\n\t\n\t if (direction) {\n\t input.additionalEvent = this.options.event + direction;\n\t }\n\t this._super.emit.call(this, input);\n\t }\n\t});\n\t\n\t/**\n\t * Pinch\n\t * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n\t * @constructor\n\t * @extends AttrRecognizer\n\t */\n\tfunction PinchRecognizer() {\n\t AttrRecognizer.apply(this, arguments);\n\t}\n\t\n\tinherit(PinchRecognizer, AttrRecognizer, {\n\t /**\n\t * @namespace\n\t * @memberof PinchRecognizer\n\t */\n\t defaults: {\n\t event: 'pinch',\n\t threshold: 0,\n\t pointers: 2\n\t },\n\t\n\t getTouchAction: function() {\n\t return [TOUCH_ACTION_NONE];\n\t },\n\t\n\t attrTest: function(input) {\n\t return this._super.attrTest.call(this, input) &&\n\t (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n\t },\n\t\n\t emit: function(input) {\n\t if (input.scale !== 1) {\n\t var inOut = input.scale < 1 ? 'in' : 'out';\n\t input.additionalEvent = this.options.event + inOut;\n\t }\n\t this._super.emit.call(this, input);\n\t }\n\t});\n\t\n\t/**\n\t * Press\n\t * Recognized when the pointer is down for x ms without any movement.\n\t * @constructor\n\t * @extends Recognizer\n\t */\n\tfunction PressRecognizer() {\n\t Recognizer.apply(this, arguments);\n\t\n\t this._timer = null;\n\t this._input = null;\n\t}\n\t\n\tinherit(PressRecognizer, Recognizer, {\n\t /**\n\t * @namespace\n\t * @memberof PressRecognizer\n\t */\n\t defaults: {\n\t event: 'press',\n\t pointers: 1,\n\t time: 251, // minimal time of the pointer to be pressed\n\t threshold: 9 // a minimal movement is ok, but keep it low\n\t },\n\t\n\t getTouchAction: function() {\n\t return [TOUCH_ACTION_AUTO];\n\t },\n\t\n\t process: function(input) {\n\t var options = this.options;\n\t var validPointers = input.pointers.length === options.pointers;\n\t var validMovement = input.distance < options.threshold;\n\t var validTime = input.deltaTime > options.time;\n\t\n\t this._input = input;\n\t\n\t // we only allow little movement\n\t // and we've reached an end event, so a tap is possible\n\t if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n\t this.reset();\n\t } else if (input.eventType & INPUT_START) {\n\t this.reset();\n\t this._timer = setTimeoutContext(function() {\n\t this.state = STATE_RECOGNIZED;\n\t this.tryEmit();\n\t }, options.time, this);\n\t } else if (input.eventType & INPUT_END) {\n\t return STATE_RECOGNIZED;\n\t }\n\t return STATE_FAILED;\n\t },\n\t\n\t reset: function() {\n\t clearTimeout(this._timer);\n\t },\n\t\n\t emit: function(input) {\n\t if (this.state !== STATE_RECOGNIZED) {\n\t return;\n\t }\n\t\n\t if (input && (input.eventType & INPUT_END)) {\n\t this.manager.emit(this.options.event + 'up', input);\n\t } else {\n\t this._input.timeStamp = now();\n\t this.manager.emit(this.options.event, this._input);\n\t }\n\t }\n\t});\n\t\n\t/**\n\t * Rotate\n\t * Recognized when two or more pointer are moving in a circular motion.\n\t * @constructor\n\t * @extends AttrRecognizer\n\t */\n\tfunction RotateRecognizer() {\n\t AttrRecognizer.apply(this, arguments);\n\t}\n\t\n\tinherit(RotateRecognizer, AttrRecognizer, {\n\t /**\n\t * @namespace\n\t * @memberof RotateRecognizer\n\t */\n\t defaults: {\n\t event: 'rotate',\n\t threshold: 0,\n\t pointers: 2\n\t },\n\t\n\t getTouchAction: function() {\n\t return [TOUCH_ACTION_NONE];\n\t },\n\t\n\t attrTest: function(input) {\n\t return this._super.attrTest.call(this, input) &&\n\t (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n\t }\n\t});\n\t\n\t/**\n\t * Swipe\n\t * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n\t * @constructor\n\t * @extends AttrRecognizer\n\t */\n\tfunction SwipeRecognizer() {\n\t AttrRecognizer.apply(this, arguments);\n\t}\n\t\n\tinherit(SwipeRecognizer, AttrRecognizer, {\n\t /**\n\t * @namespace\n\t * @memberof SwipeRecognizer\n\t */\n\t defaults: {\n\t event: 'swipe',\n\t threshold: 10,\n\t velocity: 0.3,\n\t direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n\t pointers: 1\n\t },\n\t\n\t getTouchAction: function() {\n\t return PanRecognizer.prototype.getTouchAction.call(this);\n\t },\n\t\n\t attrTest: function(input) {\n\t var direction = this.options.direction;\n\t var velocity;\n\t\n\t if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n\t velocity = input.overallVelocity;\n\t } else if (direction & DIRECTION_HORIZONTAL) {\n\t velocity = input.overallVelocityX;\n\t } else if (direction & DIRECTION_VERTICAL) {\n\t velocity = input.overallVelocityY;\n\t }\n\t\n\t return this._super.attrTest.call(this, input) &&\n\t direction & input.offsetDirection &&\n\t input.distance > this.options.threshold &&\n\t input.maxPointers == this.options.pointers &&\n\t abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n\t },\n\t\n\t emit: function(input) {\n\t var direction = directionStr(input.offsetDirection);\n\t if (direction) {\n\t this.manager.emit(this.options.event + direction, input);\n\t }\n\t\n\t this.manager.emit(this.options.event, input);\n\t }\n\t});\n\t\n\t/**\n\t * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n\t * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n\t * a single tap.\n\t *\n\t * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n\t * multi-taps being recognized.\n\t * @constructor\n\t * @extends Recognizer\n\t */\n\tfunction TapRecognizer() {\n\t Recognizer.apply(this, arguments);\n\t\n\t // previous time and center,\n\t // used for tap counting\n\t this.pTime = false;\n\t this.pCenter = false;\n\t\n\t this._timer = null;\n\t this._input = null;\n\t this.count = 0;\n\t}\n\t\n\tinherit(TapRecognizer, Recognizer, {\n\t /**\n\t * @namespace\n\t * @memberof PinchRecognizer\n\t */\n\t defaults: {\n\t event: 'tap',\n\t pointers: 1,\n\t taps: 1,\n\t interval: 300, // max time between the multi-tap taps\n\t time: 250, // max time of the pointer to be down (like finger on the screen)\n\t threshold: 9, // a minimal movement is ok, but keep it low\n\t posThreshold: 10 // a multi-tap can be a bit off the initial position\n\t },\n\t\n\t getTouchAction: function() {\n\t return [TOUCH_ACTION_MANIPULATION];\n\t },\n\t\n\t process: function(input) {\n\t var options = this.options;\n\t\n\t var validPointers = input.pointers.length === options.pointers;\n\t var validMovement = input.distance < options.threshold;\n\t var validTouchTime = input.deltaTime < options.time;\n\t\n\t this.reset();\n\t\n\t if ((input.eventType & INPUT_START) && (this.count === 0)) {\n\t return this.failTimeout();\n\t }\n\t\n\t // we only allow little movement\n\t // and we've reached an end event, so a tap is possible\n\t if (validMovement && validTouchTime && validPointers) {\n\t if (input.eventType != INPUT_END) {\n\t return this.failTimeout();\n\t }\n\t\n\t var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n\t var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\t\n\t this.pTime = input.timeStamp;\n\t this.pCenter = input.center;\n\t\n\t if (!validMultiTap || !validInterval) {\n\t this.count = 1;\n\t } else {\n\t this.count += 1;\n\t }\n\t\n\t this._input = input;\n\t\n\t // if tap count matches we have recognized it,\n\t // else it has began recognizing...\n\t var tapCount = this.count % options.taps;\n\t if (tapCount === 0) {\n\t // no failing requirements, immediately trigger the tap event\n\t // or wait as long as the multitap interval to trigger\n\t if (!this.hasRequireFailures()) {\n\t return STATE_RECOGNIZED;\n\t } else {\n\t this._timer = setTimeoutContext(function() {\n\t this.state = STATE_RECOGNIZED;\n\t this.tryEmit();\n\t }, options.interval, this);\n\t return STATE_BEGAN;\n\t }\n\t }\n\t }\n\t return STATE_FAILED;\n\t },\n\t\n\t failTimeout: function() {\n\t this._timer = setTimeoutContext(function() {\n\t this.state = STATE_FAILED;\n\t }, this.options.interval, this);\n\t return STATE_FAILED;\n\t },\n\t\n\t reset: function() {\n\t clearTimeout(this._timer);\n\t },\n\t\n\t emit: function() {\n\t if (this.state == STATE_RECOGNIZED) {\n\t this._input.tapCount = this.count;\n\t this.manager.emit(this.options.event, this._input);\n\t }\n\t }\n\t});\n\t\n\t/**\n\t * Simple way to create a manager with a default set of recognizers.\n\t * @param {HTMLElement} element\n\t * @param {Object} [options]\n\t * @constructor\n\t */\n\tfunction Hammer(element, options) {\n\t options = options || {};\n\t options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n\t return new Manager(element, options);\n\t}\n\t\n\t/**\n\t * @const {string}\n\t */\n\tHammer.VERSION = '2.0.6';\n\t\n\t/**\n\t * default settings\n\t * @namespace\n\t */\n\tHammer.defaults = {\n\t /**\n\t * set if DOM events are being triggered.\n\t * But this is slower and unused by simple implementations, so disabled by default.\n\t * @type {Boolean}\n\t * @default false\n\t */\n\t domEvents: false,\n\t\n\t /**\n\t * The value for the touchAction property/fallback.\n\t * When set to `compute` it will magically set the correct value based on the added recognizers.\n\t * @type {String}\n\t * @default compute\n\t */\n\t touchAction: TOUCH_ACTION_COMPUTE,\n\t\n\t /**\n\t * @type {Boolean}\n\t * @default true\n\t */\n\t enable: true,\n\t\n\t /**\n\t * EXPERIMENTAL FEATURE -- can be removed/changed\n\t * Change the parent input target element.\n\t * If Null, then it is being set the to main element.\n\t * @type {Null|EventTarget}\n\t * @default null\n\t */\n\t inputTarget: null,\n\t\n\t /**\n\t * force an input class\n\t * @type {Null|Function}\n\t * @default null\n\t */\n\t inputClass: null,\n\t\n\t /**\n\t * Default recognizer setup when calling `Hammer()`\n\t * When creating a new Manager these will be skipped.\n\t * @type {Array}\n\t */\n\t preset: [\n\t // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n\t [RotateRecognizer, {enable: false}],\n\t [PinchRecognizer, {enable: false}, ['rotate']],\n\t [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n\t [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n\t [TapRecognizer],\n\t [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n\t [PressRecognizer]\n\t ],\n\t\n\t /**\n\t * Some CSS properties can be used to improve the working of Hammer.\n\t * Add them to this method and they will be set when creating a new Manager.\n\t * @namespace\n\t */\n\t cssProps: {\n\t /**\n\t * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n\t * @type {String}\n\t * @default 'none'\n\t */\n\t userSelect: 'none',\n\t\n\t /**\n\t * Disable the Windows Phone grippers when pressing an element.\n\t * @type {String}\n\t * @default 'none'\n\t */\n\t touchSelect: 'none',\n\t\n\t /**\n\t * Disables the default callout shown when you touch and hold a touch target.\n\t * On iOS, when you touch and hold a touch target such as a link, Safari displays\n\t * a callout containing information about the link. This property allows you to disable that callout.\n\t * @type {String}\n\t * @default 'none'\n\t */\n\t touchCallout: 'none',\n\t\n\t /**\n\t * Specifies whether zooming is enabled. Used by IE10>\n\t * @type {String}\n\t * @default 'none'\n\t */\n\t contentZooming: 'none',\n\t\n\t /**\n\t * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n\t * @type {String}\n\t * @default 'none'\n\t */\n\t userDrag: 'none',\n\t\n\t /**\n\t * Overrides the highlight color shown when the user taps a link or a JavaScript\n\t * clickable element in iOS. This property obeys the alpha value, if specified.\n\t * @type {String}\n\t * @default 'rgba(0,0,0,0)'\n\t */\n\t tapHighlightColor: 'rgba(0,0,0,0)'\n\t }\n\t};\n\t\n\tvar STOP = 1;\n\tvar FORCED_STOP = 2;\n\t\n\t/**\n\t * Manager\n\t * @param {HTMLElement} element\n\t * @param {Object} [options]\n\t * @constructor\n\t */\n\tfunction Manager(element, options) {\n\t this.options = assign({}, Hammer.defaults, options || {});\n\t\n\t this.options.inputTarget = this.options.inputTarget || element;\n\t\n\t this.handlers = {};\n\t this.session = {};\n\t this.recognizers = [];\n\t\n\t this.element = element;\n\t this.input = createInputInstance(this);\n\t this.touchAction = new TouchAction(this, this.options.touchAction);\n\t\n\t toggleCssProps(this, true);\n\t\n\t each(this.options.recognizers, function(item) {\n\t var recognizer = this.add(new (item[0])(item[1]));\n\t item[2] && recognizer.recognizeWith(item[2]);\n\t item[3] && recognizer.requireFailure(item[3]);\n\t }, this);\n\t}\n\t\n\tManager.prototype = {\n\t /**\n\t * set options\n\t * @param {Object} options\n\t * @returns {Manager}\n\t */\n\t set: function(options) {\n\t assign(this.options, options);\n\t\n\t // Options that need a little more setup\n\t if (options.touchAction) {\n\t this.touchAction.update();\n\t }\n\t if (options.inputTarget) {\n\t // Clean up existing event listeners and reinitialize\n\t this.input.destroy();\n\t this.input.target = options.inputTarget;\n\t this.input.init();\n\t }\n\t return this;\n\t },\n\t\n\t /**\n\t * stop recognizing for this session.\n\t * This session will be discarded, when a new [input]start event is fired.\n\t * When forced, the recognizer cycle is stopped immediately.\n\t * @param {Boolean} [force]\n\t */\n\t stop: function(force) {\n\t this.session.stopped = force ? FORCED_STOP : STOP;\n\t },\n\t\n\t /**\n\t * run the recognizers!\n\t * called by the inputHandler function on every movement of the pointers (touches)\n\t * it walks through all the recognizers and tries to detect the gesture that is being made\n\t * @param {Object} inputData\n\t */\n\t recognize: function(inputData) {\n\t var session = this.session;\n\t if (session.stopped) {\n\t return;\n\t }\n\t\n\t // run the touch-action polyfill\n\t this.touchAction.preventDefaults(inputData);\n\t\n\t var recognizer;\n\t var recognizers = this.recognizers;\n\t\n\t // this holds the recognizer that is being recognized.\n\t // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n\t // if no recognizer is detecting a thing, it is set to `null`\n\t var curRecognizer = session.curRecognizer;\n\t\n\t // reset when the last recognizer is recognized\n\t // or when we're in a new session\n\t if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n\t curRecognizer = session.curRecognizer = null;\n\t }\n\t\n\t var i = 0;\n\t while (i < recognizers.length) {\n\t recognizer = recognizers[i];\n\t\n\t // find out if we are allowed try to recognize the input for this one.\n\t // 1. allow if the session is NOT forced stopped (see the .stop() method)\n\t // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n\t // that is being recognized.\n\t // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n\t // this can be setup with the `recognizeWith()` method on the recognizer.\n\t if (session.stopped !== FORCED_STOP && ( // 1\n\t !curRecognizer || recognizer == curRecognizer || // 2\n\t recognizer.canRecognizeWith(curRecognizer))) { // 3\n\t recognizer.recognize(inputData);\n\t } else {\n\t recognizer.reset();\n\t }\n\t\n\t // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n\t // current active recognizer. but only if we don't already have an active recognizer\n\t if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n\t curRecognizer = session.curRecognizer = recognizer;\n\t }\n\t i++;\n\t }\n\t },\n\t\n\t /**\n\t * get a recognizer by its event name.\n\t * @param {Recognizer|String} recognizer\n\t * @returns {Recognizer|Null}\n\t */\n\t get: function(recognizer) {\n\t if (recognizer instanceof Recognizer) {\n\t return recognizer;\n\t }\n\t\n\t var recognizers = this.recognizers;\n\t for (var i = 0; i < recognizers.length; i++) {\n\t if (recognizers[i].options.event == recognizer) {\n\t return recognizers[i];\n\t }\n\t }\n\t return null;\n\t },\n\t\n\t /**\n\t * add a recognizer to the manager\n\t * existing recognizers with the same event name will be removed\n\t * @param {Recognizer} recognizer\n\t * @returns {Recognizer|Manager}\n\t */\n\t add: function(recognizer) {\n\t if (invokeArrayArg(recognizer, 'add', this)) {\n\t return this;\n\t }\n\t\n\t // remove existing\n\t var existing = this.get(recognizer.options.event);\n\t if (existing) {\n\t this.remove(existing);\n\t }\n\t\n\t this.recognizers.push(recognizer);\n\t recognizer.manager = this;\n\t\n\t this.touchAction.update();\n\t return recognizer;\n\t },\n\t\n\t /**\n\t * remove a recognizer by name or instance\n\t * @param {Recognizer|String} recognizer\n\t * @returns {Manager}\n\t */\n\t remove: function(recognizer) {\n\t if (invokeArrayArg(recognizer, 'remove', this)) {\n\t return this;\n\t }\n\t\n\t recognizer = this.get(recognizer);\n\t\n\t // let's make sure this recognizer exists\n\t if (recognizer) {\n\t var recognizers = this.recognizers;\n\t var index = inArray(recognizers, recognizer);\n\t\n\t if (index !== -1) {\n\t recognizers.splice(index, 1);\n\t this.touchAction.update();\n\t }\n\t }\n\t\n\t return this;\n\t },\n\t\n\t /**\n\t * bind event\n\t * @param {String} events\n\t * @param {Function} handler\n\t * @returns {EventEmitter} this\n\t */\n\t on: function(events, handler) {\n\t var handlers = this.handlers;\n\t each(splitStr(events), function(event) {\n\t handlers[event] = handlers[event] || [];\n\t handlers[event].push(handler);\n\t });\n\t return this;\n\t },\n\t\n\t /**\n\t * unbind event, leave emit blank to remove all handlers\n\t * @param {String} events\n\t * @param {Function} [handler]\n\t * @returns {EventEmitter} this\n\t */\n\t off: function(events, handler) {\n\t var handlers = this.handlers;\n\t each(splitStr(events), function(event) {\n\t if (!handler) {\n\t delete handlers[event];\n\t } else {\n\t handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n\t }\n\t });\n\t return this;\n\t },\n\t\n\t /**\n\t * emit event to the listeners\n\t * @param {String} event\n\t * @param {Object} data\n\t */\n\t emit: function(event, data) {\n\t // we also want to trigger dom events\n\t if (this.options.domEvents) {\n\t triggerDomEvent(event, data);\n\t }\n\t\n\t // no handlers, so skip it all\n\t var handlers = this.handlers[event] && this.handlers[event].slice();\n\t if (!handlers || !handlers.length) {\n\t return;\n\t }\n\t\n\t data.type = event;\n\t data.preventDefault = function() {\n\t data.srcEvent.preventDefault();\n\t };\n\t\n\t var i = 0;\n\t while (i < handlers.length) {\n\t handlers[i](data);\n\t i++;\n\t }\n\t },\n\t\n\t /**\n\t * destroy the manager and unbinds all events\n\t * it doesn't unbind dom events, that is the user own responsibility\n\t */\n\t destroy: function() {\n\t this.element && toggleCssProps(this, false);\n\t\n\t this.handlers = {};\n\t this.session = {};\n\t this.input.destroy();\n\t this.element = null;\n\t }\n\t};\n\t\n\t/**\n\t * add/remove the css properties as defined in manager.options.cssProps\n\t * @param {Manager} manager\n\t * @param {Boolean} add\n\t */\n\tfunction toggleCssProps(manager, add) {\n\t var element = manager.element;\n\t if (!element.style) {\n\t return;\n\t }\n\t each(manager.options.cssProps, function(value, name) {\n\t element.style[prefixed(element.style, name)] = add ? value : '';\n\t });\n\t}\n\t\n\t/**\n\t * trigger dom event\n\t * @param {String} event\n\t * @param {Object} data\n\t */\n\tfunction triggerDomEvent(event, data) {\n\t var gestureEvent = document.createEvent('Event');\n\t gestureEvent.initEvent(event, true, true);\n\t gestureEvent.gesture = data;\n\t data.target.dispatchEvent(gestureEvent);\n\t}\n\t\n\tassign(Hammer, {\n\t INPUT_START: INPUT_START,\n\t INPUT_MOVE: INPUT_MOVE,\n\t INPUT_END: INPUT_END,\n\t INPUT_CANCEL: INPUT_CANCEL,\n\t\n\t STATE_POSSIBLE: STATE_POSSIBLE,\n\t STATE_BEGAN: STATE_BEGAN,\n\t STATE_CHANGED: STATE_CHANGED,\n\t STATE_ENDED: STATE_ENDED,\n\t STATE_RECOGNIZED: STATE_RECOGNIZED,\n\t STATE_CANCELLED: STATE_CANCELLED,\n\t STATE_FAILED: STATE_FAILED,\n\t\n\t DIRECTION_NONE: DIRECTION_NONE,\n\t DIRECTION_LEFT: DIRECTION_LEFT,\n\t DIRECTION_RIGHT: DIRECTION_RIGHT,\n\t DIRECTION_UP: DIRECTION_UP,\n\t DIRECTION_DOWN: DIRECTION_DOWN,\n\t DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n\t DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n\t DIRECTION_ALL: DIRECTION_ALL,\n\t\n\t Manager: Manager,\n\t Input: Input,\n\t TouchAction: TouchAction,\n\t\n\t TouchInput: TouchInput,\n\t MouseInput: MouseInput,\n\t PointerEventInput: PointerEventInput,\n\t TouchMouseInput: TouchMouseInput,\n\t SingleTouchInput: SingleTouchInput,\n\t\n\t Recognizer: Recognizer,\n\t AttrRecognizer: AttrRecognizer,\n\t Tap: TapRecognizer,\n\t Pan: PanRecognizer,\n\t Swipe: SwipeRecognizer,\n\t Pinch: PinchRecognizer,\n\t Rotate: RotateRecognizer,\n\t Press: PressRecognizer,\n\t\n\t on: addEventListeners,\n\t off: removeEventListeners,\n\t each: each,\n\t merge: merge,\n\t extend: extend,\n\t assign: assign,\n\t inherit: inherit,\n\t bindFn: bindFn,\n\t prefixed: prefixed\n\t});\n\t\n\t// this prevents errors when Hammer is loaded in the presence of an AMD\n\t// style loader but by script tag, not by the loader.\n\tvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\n\tfreeGlobal.Hammer = Hammer;\n\t\n\tif (true) {\n\t !(__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t return Hammer;\n\t }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else if (typeof module != 'undefined' && module.exports) {\n\t module.exports = Hammer;\n\t} else {\n\t window[exportName] = Hammer;\n\t}\n\t\n\t})(window, document, 'Hammer');\n\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Layer2 = __webpack_require__(33);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Skybox = __webpack_require__(34);\n\t\n\tvar _Skybox2 = _interopRequireDefault(_Skybox);\n\t\n\tvar EnvironmentLayer = (function (_Layer) {\n\t _inherits(EnvironmentLayer, _Layer);\n\t\n\t function EnvironmentLayer(options) {\n\t _classCallCheck(this, EnvironmentLayer);\n\t\n\t _get(Object.getPrototypeOf(EnvironmentLayer.prototype), 'constructor', this).call(this);\n\t\n\t var defaults = {\n\t skybox: false\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])(defaults, options);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(EnvironmentLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd() {\n\t this._initLights();\n\t\n\t if (this._options.skybox) {\n\t this._initSkybox();\n\t }\n\t\n\t // this._initGrid();\n\t }\n\t\n\t // Not fleshed out or thought through yet\n\t //\n\t // Lights could potentially be put it their own 'layer' to keep this class\n\t // much simpler and less messy\n\t }, {\n\t key: '_initLights',\n\t value: function _initLights() {\n\t // Position doesn't really matter (the angle is important), however it's\n\t // used here so the helpers look more natural.\n\t\n\t if (!this._options.skybox) {\n\t var directionalLight = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight.intesity = 0.1;\n\t directionalLight.position.x = 100;\n\t directionalLight.position.y = 100;\n\t directionalLight.position.z = 100;\n\t\n\t var directionalLight2 = new _three2['default'].DirectionalLight(0x999999);\n\t directionalLight2.intesity = 0.1;\n\t directionalLight2.position.x = -100;\n\t directionalLight2.position.y = 100;\n\t directionalLight2.position.z = -100;\n\t\n\t var helper = new _three2['default'].DirectionalLightHelper(directionalLight, 10);\n\t var helper2 = new _three2['default'].DirectionalLightHelper(directionalLight2, 10);\n\t\n\t this.add(directionalLight);\n\t this.add(directionalLight2);\n\t\n\t this.add(helper);\n\t this.add(helper2);\n\t } else {\n\t // Directional light that will be projected from the sun\n\t this._skyboxLight = new _three2['default'].DirectionalLight(0xffffff, 1);\n\t\n\t this._skyboxLight.castShadow = true;\n\t\n\t var d = 1000;\n\t this._skyboxLight.shadow.camera.left = -d;\n\t this._skyboxLight.shadow.camera.right = d;\n\t this._skyboxLight.shadow.camera.top = d;\n\t this._skyboxLight.shadow.camera.bottom = -d;\n\t\n\t this._skyboxLight.shadow.camera.near = 10000;\n\t this._skyboxLight.shadow.camera.far = 70000;\n\t\n\t // TODO: Need to dial in on a good shadowmap size\n\t this._skyboxLight.shadow.mapSize.width = 2048;\n\t this._skyboxLight.shadow.mapSize.height = 2048;\n\t\n\t // this._skyboxLight.shadowBias = -0.0010;\n\t // this._skyboxLight.shadow.darkness = 0.15;\n\t\n\t // this._layer.add(new THREE.CameraHelper(this._skyboxLight.shadow.camera));\n\t\n\t this.add(this._skyboxLight);\n\t }\n\t }\n\t }, {\n\t key: '_initSkybox',\n\t value: function _initSkybox() {\n\t this._skybox = (0, _Skybox2['default'])(this._world, this._skyboxLight);\n\t this.add(this._skybox._mesh);\n\t }\n\t\n\t // Add grid helper for context during initial development\n\t }, {\n\t key: '_initGrid',\n\t value: function _initGrid() {\n\t var size = 4000;\n\t var step = 100;\n\t\n\t var gridHelper = new _three2['default'].GridHelper(size, step);\n\t this.add(gridHelper);\n\t }\n\t\n\t // Clean up environment\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._skyboxLight = null;\n\t\n\t this.remove(this._skybox._mesh);\n\t this._skybox.destroy();\n\t this._skybox = null;\n\t\n\t _get(Object.getPrototypeOf(EnvironmentLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return EnvironmentLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = function (options) {\n\t return new EnvironmentLayer(options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _eventemitter3 = __webpack_require__(2);\n\t\n\tvar _eventemitter32 = _interopRequireDefault(_eventemitter3);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _engineScene = __webpack_require__(25);\n\t\n\tvar _engineScene2 = _interopRequireDefault(_engineScene);\n\t\n\tvar Layer = (function (_EventEmitter) {\n\t _inherits(Layer, _EventEmitter);\n\t\n\t function Layer() {\n\t _classCallCheck(this, Layer);\n\t\n\t _get(Object.getPrototypeOf(Layer.prototype), 'constructor', this).call(this);\n\t\n\t this._layer = new _three2['default'].Object3D();\n\t }\n\t\n\t // Add THREE object directly to layer\n\t\n\t _createClass(Layer, [{\n\t key: 'add',\n\t value: function add(object) {\n\t this._layer.add(object);\n\t }\n\t\n\t // Remove THREE object from to layer\n\t }, {\n\t key: 'remove',\n\t value: function remove(object) {\n\t this._layer.remove(object);\n\t }\n\t\n\t // Add layer to world instance and store world reference\n\t }, {\n\t key: 'addTo',\n\t value: function addTo(world) {\n\t world.addLayer(this);\n\t return this;\n\t }\n\t\n\t // Internal method called by World.addLayer to actually add the layer\n\t }, {\n\t key: '_addToWorld',\n\t value: function _addToWorld(world) {\n\t this._world = world;\n\t this._onAdd(world);\n\t this.emit('added');\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Remove everything else in the layer\n\t var child;\n\t for (i = this._layer.children.length - 1; i >= 0; i--) {\n\t child = this._layer.children[i];\n\t\n\t if (!child) {\n\t continue;\n\t }\n\t\n\t this.remove(child);\n\t\n\t if (child.geometry) {\n\t // Dispose of mesh and materials\n\t child.geometry.dispose();\n\t child.geometry = null;\n\t }\n\t\n\t if (child.material) {\n\t if (child.material.map) {\n\t child.material.map.dispose();\n\t child.material.map = null;\n\t }\n\t\n\t child.material.dispose();\n\t child.material = null;\n\t }\n\t }\n\t\n\t this._world = null;\n\t this._layer = null;\n\t }\n\t }]);\n\t\n\t return Layer;\n\t})(_eventemitter32['default']);\n\t\n\texports['default'] = Layer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _Sky = __webpack_require__(35);\n\t\n\tvar _Sky2 = _interopRequireDefault(_Sky);\n\t\n\tvar _lodashThrottle = __webpack_require__(36);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar cubemap = {\n\t vertexShader: ['varying vec3 vPosition;', 'void main() {', 'vPosition = position;', 'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', '}'].join('\\n'),\n\t\n\t fragmentShader: ['uniform samplerCube cubemap;', 'varying vec3 vPosition;', 'void main() {', 'gl_FragColor = textureCube(cubemap, normalize(vPosition));', '}'].join('\\n')\n\t};\n\t\n\tvar Skybox = (function () {\n\t function Skybox(world, light) {\n\t _classCallCheck(this, Skybox);\n\t\n\t this._world = world;\n\t this._light = light;\n\t\n\t this._settings = {\n\t distance: 38000,\n\t turbidity: 10,\n\t reileigh: 2,\n\t mieCoefficient: 0.005,\n\t mieDirectionalG: 0.8,\n\t luminance: 1,\n\t // 0.48 is a cracking dusk / sunset\n\t // 0.4 is a beautiful early-morning / late-afternoon\n\t // 0.2 is a nice day time\n\t inclination: 0.48, // Elevation / inclination\n\t azimuth: 0.25 };\n\t\n\t // Facing front\n\t this._initSkybox();\n\t this._updateUniforms();\n\t this._initEvents();\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(Skybox, [{\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Throttled to 1 per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._update, 100);\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t }\n\t }, {\n\t key: '_initSkybox',\n\t value: function _initSkybox() {\n\t // Cube camera for skybox\n\t this._cubeCamera = new _three2['default'].CubeCamera(1, 2000000, 128);\n\t\n\t // Cube material\n\t var cubeTarget = this._cubeCamera.renderTarget;\n\t\n\t // Add Sky Mesh\n\t this._sky = new _Sky2['default']();\n\t this._skyScene = new _three2['default'].Scene();\n\t this._skyScene.add(this._sky.mesh);\n\t\n\t // Add Sun Helper\n\t this._sunSphere = new _three2['default'].Mesh(new _three2['default'].SphereBufferGeometry(2000, 16, 8), new _three2['default'].MeshBasicMaterial({\n\t color: 0xffffff\n\t }));\n\t\n\t // TODO: This isn't actually visible because it's not added to the layer\n\t // this._sunSphere.visible = true;\n\t\n\t var skyboxUniforms = {\n\t cubemap: { type: 't', value: cubeTarget }\n\t };\n\t\n\t var skyboxMat = new _three2['default'].ShaderMaterial({\n\t uniforms: skyboxUniforms,\n\t vertexShader: cubemap.vertexShader,\n\t fragmentShader: cubemap.fragmentShader,\n\t side: _three2['default'].BackSide\n\t });\n\t\n\t this._mesh = new _three2['default'].Mesh(new _three2['default'].BoxGeometry(190000, 190000, 190000), skyboxMat);\n\t }\n\t }, {\n\t key: '_updateUniforms',\n\t value: function _updateUniforms() {\n\t var settings = this._settings;\n\t var uniforms = this._sky.uniforms;\n\t uniforms.turbidity.value = settings.turbidity;\n\t uniforms.reileigh.value = settings.reileigh;\n\t uniforms.luminance.value = settings.luminance;\n\t uniforms.mieCoefficient.value = settings.mieCoefficient;\n\t uniforms.mieDirectionalG.value = settings.mieDirectionalG;\n\t\n\t var theta = Math.PI * (settings.inclination - 0.5);\n\t var phi = 2 * Math.PI * (settings.azimuth - 0.5);\n\t\n\t this._sunSphere.position.x = settings.distance * Math.cos(phi);\n\t this._sunSphere.position.y = settings.distance * Math.sin(phi) * Math.sin(theta);\n\t this._sunSphere.position.z = settings.distance * Math.sin(phi) * Math.cos(theta);\n\t\n\t // Move directional light to sun position\n\t this._light.position.copy(this._sunSphere.position);\n\t\n\t this._sky.uniforms.sunPosition.value.copy(this._sunSphere.position);\n\t }\n\t }, {\n\t key: '_update',\n\t value: function _update(delta) {\n\t if (!this._done) {\n\t this._done = true;\n\t } else {\n\t return;\n\t }\n\t\n\t // if (!this._angle) {\n\t // this._angle = 0;\n\t // }\n\t //\n\t // // Animate inclination\n\t // this._angle += Math.PI * delta;\n\t // this._settings.inclination = 0.5 * (Math.sin(this._angle) / 2 + 0.5);\n\t\n\t // Update light intensity depending on elevation of sun (day to night)\n\t this._light.intensity = 1 - 0.95 * (this._settings.inclination / 0.5);\n\t\n\t // // console.log(delta, this._angle, this._settings.inclination);\n\t //\n\t // TODO: Only do this when the uniforms have been changed\n\t this._updateUniforms();\n\t\n\t // TODO: Only do this when the cubemap has actually changed\n\t this._cubeCamera.updateCubeMap(this._world._engine._renderer, this._skyScene);\n\t }\n\t }, {\n\t key: 'getRenderTarget',\n\t value: function getRenderTarget() {\n\t return this._cubeCamera.renderTarget;\n\t }\n\t\n\t // Destroy the skybox and remove it from memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._throttledWorldUpdate = null;\n\t\n\t this._world = null;\n\t this._light = null;\n\t\n\t this._cubeCamera = null;\n\t\n\t this._sky.mesh.geometry.dispose();\n\t this._sky.mesh.geometry = null;\n\t\n\t if (this._sky.mesh.material.map) {\n\t this._sky.mesh.material.map.dispose();\n\t this._sky.mesh.material.map = null;\n\t }\n\t\n\t this._sky.mesh.material.dispose();\n\t this._sky.mesh.material = null;\n\t\n\t this._sky.mesh = null;\n\t this._sky = null;\n\t\n\t this._skyScene = null;\n\t\n\t this._sunSphere.geometry.dispose();\n\t this._sunSphere.geometry = null;\n\t\n\t if (this._sunSphere.material.map) {\n\t this._sunSphere.material.map.dispose();\n\t this._sunSphere.material.map = null;\n\t }\n\t\n\t this._sunSphere.material.dispose();\n\t this._sunSphere.material = null;\n\t\n\t this._sunSphere = null;\n\t\n\t this._mesh.geometry.dispose();\n\t this._mesh.geometry = null;\n\t\n\t if (this._mesh.material.map) {\n\t this._mesh.material.map.dispose();\n\t this._mesh.material.map = null;\n\t }\n\t\n\t this._mesh.material.dispose();\n\t this._mesh.material = null;\n\t }\n\t }]);\n\t\n\t return Skybox;\n\t})();\n\t\n\texports['default'] = function (world, light) {\n\t return new Skybox(world, light);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t *\n\t * Based on 'A Practical Analytic Model for Daylight'\n\t * aka The Preetham Model, the de facto standard analytic skydome model\n\t * http://www.cs.utah.edu/~shirley/papers/sunsky/sunsky.pdf\n\t *\n\t * First implemented by Simon Wallner\n\t * http://www.simonwallner.at/projects/atmospheric-scattering\n\t *\n\t * Improved by Martin Upitis\n\t * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR\n\t *\n\t * Three.js integration by zz85 http://twitter.com/blurspline\n\t*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t_three2['default'].ShaderLib['sky'] = {\n\t\n\t\tuniforms: {\n\t\n\t\t\tluminance: { type: 'f', value: 1 },\n\t\t\tturbidity: { type: 'f', value: 2 },\n\t\t\treileigh: { type: 'f', value: 1 },\n\t\t\tmieCoefficient: { type: 'f', value: 0.005 },\n\t\t\tmieDirectionalG: { type: 'f', value: 0.8 },\n\t\t\tsunPosition: { type: 'v3', value: new _three2['default'].Vector3() }\n\t\n\t\t},\n\t\n\t\tvertexShader: ['varying vec3 vWorldPosition;', 'void main() {', 'vec4 worldPosition = modelMatrix * vec4( position, 1.0 );', 'vWorldPosition = worldPosition.xyz;', 'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );', '}'].join('\\n'),\n\t\n\t\tfragmentShader: ['uniform sampler2D skySampler;', 'uniform vec3 sunPosition;', 'varying vec3 vWorldPosition;', 'vec3 cameraPos = vec3(0., 0., 0.);', '// uniform sampler2D sDiffuse;', '// const float turbidity = 10.0; //', '// const float reileigh = 2.; //', '// const float luminance = 1.0; //', '// const float mieCoefficient = 0.005;', '// const float mieDirectionalG = 0.8;', 'uniform float luminance;', 'uniform float turbidity;', 'uniform float reileigh;', 'uniform float mieCoefficient;', 'uniform float mieDirectionalG;', '// constants for atmospheric scattering', 'const float e = 2.71828182845904523536028747135266249775724709369995957;', 'const float pi = 3.141592653589793238462643383279502884197169;', 'const float n = 1.0003; // refractive index of air', 'const float N = 2.545E25; // number of molecules per unit volume for air at', '// 288.15K and 1013mb (sea level -45 celsius)', 'const float pn = 0.035;\t// depolatization factor for standard air', '// wavelength of used primaries, according to preetham', 'const vec3 lambda = vec3(680E-9, 550E-9, 450E-9);', '// mie stuff', '// K coefficient for the primaries', 'const vec3 K = vec3(0.686, 0.678, 0.666);', 'const float v = 4.0;', '// optical length at zenith for molecules', 'const float rayleighZenithLength = 8.4E3;', 'const float mieZenithLength = 1.25E3;', 'const vec3 up = vec3(0.0, 1.0, 0.0);', 'const float EE = 1000.0;', 'const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;', '// 66 arc seconds -> degrees, and the cosine of that', '// earth shadow hack', 'const float cutoffAngle = pi/1.95;', 'const float steepness = 1.5;', 'vec3 totalRayleigh(vec3 lambda)', '{', 'return (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn));', '}',\n\t\n\t\t// see http://blenderartists.org/forum/showthread.php?321110-Shaders-and-Skybox-madness\n\t\t'// A simplied version of the total Reayleigh scattering to works on browsers that use ANGLE', 'vec3 simplifiedRayleigh()', '{', 'return 0.0005 / vec3(94, 40, 18);',\n\t\t// return 0.00054532832366 / (3.0 * 2.545E25 * pow(vec3(680E-9, 550E-9, 450E-9), vec3(4.0)) * 6.245);\n\t\t'}', 'float rayleighPhase(float cosTheta)', '{\t ', 'return (3.0 / (16.0*pi)) * (1.0 + pow(cosTheta, 2.0));', '//\treturn (1.0 / (3.0*pi)) * (1.0 + pow(cosTheta, 2.0));', '//\treturn (3.0 / 4.0) * (1.0 + pow(cosTheta, 2.0));', '}', 'vec3 totalMie(vec3 lambda, vec3 K, float T)', '{', 'float c = (0.2 * T ) * 10E-18;', 'return 0.434 * c * pi * pow((2.0 * pi) / lambda, vec3(v - 2.0)) * K;', '}', 'float hgPhase(float cosTheta, float g)', '{', 'return (1.0 / (4.0*pi)) * ((1.0 - pow(g, 2.0)) / pow(1.0 - 2.0*g*cosTheta + pow(g, 2.0), 1.5));', '}', 'float sunIntensity(float zenithAngleCos)', '{', 'return EE * max(0.0, 1.0 - exp(-((cutoffAngle - acos(zenithAngleCos))/steepness)));', '}', '// float logLuminance(vec3 c)', '// {', '// \treturn log(c.r * 0.2126 + c.g * 0.7152 + c.b * 0.0722);', '// }', '// Filmic ToneMapping http://filmicgames.com/archives/75', 'float A = 0.15;', 'float B = 0.50;', 'float C = 0.10;', 'float D = 0.20;', 'float E = 0.02;', 'float F = 0.30;', 'float W = 1000.0;', 'vec3 Uncharted2Tonemap(vec3 x)', '{', 'return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;', '}', 'void main() ', '{', 'float sunfade = 1.0-clamp(1.0-exp((sunPosition.y/450000.0)),0.0,1.0);', '// luminance = 1.0 ;// vWorldPosition.y / 450000. + 0.5; //sunPosition.y / 450000. * 1. + 0.5;', '// gl_FragColor = vec4(sunfade, sunfade, sunfade, 1.0);', 'float reileighCoefficient = reileigh - (1.0* (1.0-sunfade));', 'vec3 sunDirection = normalize(sunPosition);', 'float sunE = sunIntensity(dot(sunDirection, up));', '// extinction (absorbtion + out scattering) ', '// rayleigh coefficients',\n\t\n\t\t// 'vec3 betaR = totalRayleigh(lambda) * reileighCoefficient;',\n\t\t'vec3 betaR = simplifiedRayleigh() * reileighCoefficient;', '// mie coefficients', 'vec3 betaM = totalMie(lambda, K, turbidity) * mieCoefficient;', '// optical length', '// cutoff angle at 90 to avoid singularity in next formula.', 'float zenithAngle = acos(max(0.0, dot(up, normalize(vWorldPosition - cameraPos))));', 'float sR = rayleighZenithLength / (cos(zenithAngle) + 0.15 * pow(93.885 - ((zenithAngle * 180.0) / pi), -1.253));', 'float sM = mieZenithLength / (cos(zenithAngle) + 0.15 * pow(93.885 - ((zenithAngle * 180.0) / pi), -1.253));', '// combined extinction factor\t', 'vec3 Fex = exp(-(betaR * sR + betaM * sM));', '// in scattering', 'float cosTheta = dot(normalize(vWorldPosition - cameraPos), sunDirection);', 'float rPhase = rayleighPhase(cosTheta*0.5+0.5);', 'vec3 betaRTheta = betaR * rPhase;', 'float mPhase = hgPhase(cosTheta, mieDirectionalG);', 'vec3 betaMTheta = betaM * mPhase;', 'vec3 Lin = pow(sunE * ((betaRTheta + betaMTheta) / (betaR + betaM)) * (1.0 - Fex),vec3(1.5));', 'Lin *= mix(vec3(1.0),pow(sunE * ((betaRTheta + betaMTheta) / (betaR + betaM)) * Fex,vec3(1.0/2.0)),clamp(pow(1.0-dot(up, sunDirection),5.0),0.0,1.0));', '//nightsky', 'vec3 direction = normalize(vWorldPosition - cameraPos);', 'float theta = acos(direction.y); // elevation --> y-axis, [-pi/2, pi/2]', 'float phi = atan(direction.z, direction.x); // azimuth --> x-axis [-pi/2, pi/2]', 'vec2 uv = vec2(phi, theta) / vec2(2.0*pi, pi) + vec2(0.5, 0.0);', '// vec3 L0 = texture2D(skySampler, uv).rgb+0.1 * Fex;', 'vec3 L0 = vec3(0.1) * Fex;', '// composition + solar disc', '//if (cosTheta > sunAngularDiameterCos)', 'float sundisk = smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);', '// if (normalize(vWorldPosition - cameraPos).y>0.0)', 'L0 += (sunE * 19000.0 * Fex)*sundisk;', 'vec3 whiteScale = 1.0/Uncharted2Tonemap(vec3(W));', 'vec3 texColor = (Lin+L0); ', 'texColor *= 0.04 ;', 'texColor += vec3(0.0,0.001,0.0025)*0.3;', 'float g_fMaxLuminance = 1.0;', 'float fLumScaled = 0.1 / luminance; ', 'float fLumCompressed = (fLumScaled * (1.0 + (fLumScaled / (g_fMaxLuminance * g_fMaxLuminance)))) / (1.0 + fLumScaled); ', 'float ExposureBias = fLumCompressed;', 'vec3 curr = Uncharted2Tonemap((log2(2.0/pow(luminance,4.0)))*texColor);', 'vec3 color = curr*whiteScale;', 'vec3 retColor = pow(color,vec3(1.0/(1.2+(1.2*sunfade))));', 'gl_FragColor.rgb = retColor;', 'gl_FragColor.a = 1.0;', '}'].join('\\n')\n\t\n\t};\n\t\n\tvar Sky = function Sky() {\n\t\n\t\tvar skyShader = _three2['default'].ShaderLib['sky'];\n\t\tvar skyUniforms = _three2['default'].UniformsUtils.clone(skyShader.uniforms);\n\t\n\t\tvar skyMat = new _three2['default'].ShaderMaterial({\n\t\t\tfragmentShader: skyShader.fragmentShader,\n\t\t\tvertexShader: skyShader.vertexShader,\n\t\t\tuniforms: skyUniforms,\n\t\t\tside: _three2['default'].BackSide\n\t\t});\n\t\n\t\tvar skyGeo = new _three2['default'].SphereBufferGeometry(450000, 32, 15);\n\t\tvar skyMesh = new _three2['default'].Mesh(skyGeo, skyMat);\n\t\n\t\t// Expose variables\n\t\tthis.mesh = skyMesh;\n\t\tthis.uniforms = skyUniforms;\n\t};\n\t\n\texports['default'] = Sky;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/**\n\t * lodash 4.0.0 (Custom Build) <https://lodash.com/>\n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n\t * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license <https://lodash.com/license>\n\t */\n\tvar debounce = __webpack_require__(37);\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/**\n\t * Creates a throttled function that only invokes `func` at most once per\n\t * every `wait` milliseconds. The throttled function comes with a `cancel`\n\t * method to cancel delayed `func` invocations and a `flush` method to\n\t * immediately invoke them. Provide an options object to indicate whether\n\t * `func` should be invoked on the leading and/or trailing edge of the `wait`\n\t * timeout. The `func` is invoked with the last arguments provided to the\n\t * throttled function. Subsequent calls to the throttled function return the\n\t * result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the throttled function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.throttle` and `_.debounce`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to throttle.\n\t * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=true] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new throttled function.\n\t * @example\n\t *\n\t * // avoid excessively updating the position while scrolling\n\t * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n\t *\n\t * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n\t * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n\t * jQuery(element).on('click', throttled);\n\t *\n\t * // cancel a trailing throttled invocation\n\t * jQuery(window).on('popstate', throttled.cancel);\n\t */\n\tfunction throttle(func, wait, options) {\n\t var leading = true,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t if (isObject(options)) {\n\t leading = 'leading' in options ? !!options.leading : leading;\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t // Avoid a V8 JIT bug in Chrome 19-20.\n\t // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\tmodule.exports = throttle;\n\n\n/***/ },\n/* 37 */\n/***/ function(module, exports) {\n\n\t/**\n\t * lodash 4.0.1 (Custom Build) <https://lodash.com/>\n\t * Build: `lodash modularize exports=\"npm\" -o ./`\n\t * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n\t * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n\t * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n\t * Available under MIT license <https://lodash.com/license>\n\t */\n\t\n\t/** Used as the `TypeError` message for \"Functions\" methods. */\n\tvar FUNC_ERROR_TEXT = 'Expected a function';\n\t\n\t/** Used as references for various `Number` constants. */\n\tvar NAN = 0 / 0;\n\t\n\t/** `Object#toString` result references. */\n\tvar funcTag = '[object Function]',\n\t genTag = '[object GeneratorFunction]';\n\t\n\t/** Used to match leading and trailing whitespace. */\n\tvar reTrim = /^\\s+|\\s+$/g;\n\t\n\t/** Used to detect bad signed hexadecimal string values. */\n\tvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\t\n\t/** Used to detect binary string values. */\n\tvar reIsBinary = /^0b[01]+$/i;\n\t\n\t/** Used to detect octal string values. */\n\tvar reIsOctal = /^0o[0-7]+$/i;\n\t\n\t/** Built-in method references without a dependency on `root`. */\n\tvar freeParseInt = parseInt;\n\t\n\t/** Used for built-in method references. */\n\tvar objectProto = Object.prototype;\n\t\n\t/**\n\t * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n\t * of values.\n\t */\n\tvar objectToString = objectProto.toString;\n\t\n\t/* Built-in method references for those with the same name as other `lodash` methods. */\n\tvar nativeMax = Math.max;\n\t\n\t/**\n\t * Gets the timestamp of the number of milliseconds that have elapsed since\n\t * the Unix epoch (1 January 1970 00:00:00 UTC).\n\t *\n\t * @static\n\t * @memberOf _\n\t * @type Function\n\t * @category Date\n\t * @returns {number} Returns the timestamp.\n\t * @example\n\t *\n\t * _.defer(function(stamp) {\n\t * console.log(_.now() - stamp);\n\t * }, _.now());\n\t * // => logs the number of milliseconds it took for the deferred function to be invoked\n\t */\n\tvar now = Date.now;\n\t\n\t/**\n\t * Creates a debounced function that delays invoking `func` until after `wait`\n\t * milliseconds have elapsed since the last time the debounced function was\n\t * invoked. The debounced function comes with a `cancel` method to cancel\n\t * delayed `func` invocations and a `flush` method to immediately invoke them.\n\t * Provide an options object to indicate whether `func` should be invoked on\n\t * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n\t * with the last arguments provided to the debounced function. Subsequent calls\n\t * to the debounced function return the result of the last `func` invocation.\n\t *\n\t * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n\t * on the trailing edge of the timeout only if the the debounced function is\n\t * invoked more than once during the `wait` timeout.\n\t *\n\t * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n\t * for details over the differences between `_.debounce` and `_.throttle`.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Function\n\t * @param {Function} func The function to debounce.\n\t * @param {number} [wait=0] The number of milliseconds to delay.\n\t * @param {Object} [options] The options object.\n\t * @param {boolean} [options.leading=false] Specify invoking on the leading\n\t * edge of the timeout.\n\t * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n\t * delayed before it's invoked.\n\t * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n\t * edge of the timeout.\n\t * @returns {Function} Returns the new debounced function.\n\t * @example\n\t *\n\t * // Avoid costly calculations while the window size is in flux.\n\t * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n\t *\n\t * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n\t * jQuery(element).on('click', _.debounce(sendMail, 300, {\n\t * 'leading': true,\n\t * 'trailing': false\n\t * }));\n\t *\n\t * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n\t * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n\t * var source = new EventSource('/stream');\n\t * jQuery(source).on('message', debounced);\n\t *\n\t * // Cancel the trailing debounced invocation.\n\t * jQuery(window).on('popstate', debounced.cancel);\n\t */\n\tfunction debounce(func, wait, options) {\n\t var args,\n\t maxTimeoutId,\n\t result,\n\t stamp,\n\t thisArg,\n\t timeoutId,\n\t trailingCall,\n\t lastCalled = 0,\n\t leading = false,\n\t maxWait = false,\n\t trailing = true;\n\t\n\t if (typeof func != 'function') {\n\t throw new TypeError(FUNC_ERROR_TEXT);\n\t }\n\t wait = toNumber(wait) || 0;\n\t if (isObject(options)) {\n\t leading = !!options.leading;\n\t maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n\t trailing = 'trailing' in options ? !!options.trailing : trailing;\n\t }\n\t\n\t function cancel() {\n\t if (timeoutId) {\n\t clearTimeout(timeoutId);\n\t }\n\t if (maxTimeoutId) {\n\t clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = 0;\n\t args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n\t }\n\t\n\t function complete(isCalled, id) {\n\t if (id) {\n\t clearTimeout(id);\n\t }\n\t maxTimeoutId = timeoutId = trailingCall = undefined;\n\t if (isCalled) {\n\t lastCalled = now();\n\t result = func.apply(thisArg, args);\n\t if (!timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t }\n\t }\n\t\n\t function delayed() {\n\t var remaining = wait - (now() - stamp);\n\t if (remaining <= 0 || remaining > wait) {\n\t complete(trailingCall, maxTimeoutId);\n\t } else {\n\t timeoutId = setTimeout(delayed, remaining);\n\t }\n\t }\n\t\n\t function flush() {\n\t if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n\t result = func.apply(thisArg, args);\n\t }\n\t cancel();\n\t return result;\n\t }\n\t\n\t function maxDelayed() {\n\t complete(trailing, timeoutId);\n\t }\n\t\n\t function debounced() {\n\t args = arguments;\n\t stamp = now();\n\t thisArg = this;\n\t trailingCall = trailing && (timeoutId || !leading);\n\t\n\t if (maxWait === false) {\n\t var leadingCall = leading && !timeoutId;\n\t } else {\n\t if (!maxTimeoutId && !leading) {\n\t lastCalled = stamp;\n\t }\n\t var remaining = maxWait - (stamp - lastCalled),\n\t isCalled = remaining <= 0 || remaining > maxWait;\n\t\n\t if (isCalled) {\n\t if (maxTimeoutId) {\n\t maxTimeoutId = clearTimeout(maxTimeoutId);\n\t }\n\t lastCalled = stamp;\n\t result = func.apply(thisArg, args);\n\t }\n\t else if (!maxTimeoutId) {\n\t maxTimeoutId = setTimeout(maxDelayed, remaining);\n\t }\n\t }\n\t if (isCalled && timeoutId) {\n\t timeoutId = clearTimeout(timeoutId);\n\t }\n\t else if (!timeoutId && wait !== maxWait) {\n\t timeoutId = setTimeout(delayed, wait);\n\t }\n\t if (leadingCall) {\n\t isCalled = true;\n\t result = func.apply(thisArg, args);\n\t }\n\t if (isCalled && !timeoutId && !maxTimeoutId) {\n\t args = thisArg = undefined;\n\t }\n\t return result;\n\t }\n\t debounced.cancel = cancel;\n\t debounced.flush = flush;\n\t return debounced;\n\t}\n\t\n\t/**\n\t * Checks if `value` is classified as a `Function` object.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n\t * @example\n\t *\n\t * _.isFunction(_);\n\t * // => true\n\t *\n\t * _.isFunction(/abc/);\n\t * // => false\n\t */\n\tfunction isFunction(value) {\n\t // The use of `Object#toString` avoids issues with the `typeof` operator\n\t // in Safari 8 which returns 'object' for typed array constructors, and\n\t // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n\t var tag = isObject(value) ? objectToString.call(value) : '';\n\t return tag == funcTag || tag == genTag;\n\t}\n\t\n\t/**\n\t * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n\t * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to check.\n\t * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n\t * @example\n\t *\n\t * _.isObject({});\n\t * // => true\n\t *\n\t * _.isObject([1, 2, 3]);\n\t * // => true\n\t *\n\t * _.isObject(_.noop);\n\t * // => true\n\t *\n\t * _.isObject(null);\n\t * // => false\n\t */\n\tfunction isObject(value) {\n\t var type = typeof value;\n\t return !!value && (type == 'object' || type == 'function');\n\t}\n\t\n\t/**\n\t * Converts `value` to a number.\n\t *\n\t * @static\n\t * @memberOf _\n\t * @category Lang\n\t * @param {*} value The value to process.\n\t * @returns {number} Returns the number.\n\t * @example\n\t *\n\t * _.toNumber(3);\n\t * // => 3\n\t *\n\t * _.toNumber(Number.MIN_VALUE);\n\t * // => 5e-324\n\t *\n\t * _.toNumber(Infinity);\n\t * // => Infinity\n\t *\n\t * _.toNumber('3');\n\t * // => 3\n\t */\n\tfunction toNumber(value) {\n\t if (isObject(value)) {\n\t var other = isFunction(value.valueOf) ? value.valueOf() : value;\n\t value = isObject(other) ? (other + '') : other;\n\t }\n\t if (typeof value != 'string') {\n\t return value === 0 ? value : +value;\n\t }\n\t value = value.replace(reTrim, '');\n\t var isBinary = reIsBinary.test(value);\n\t return (isBinary || reIsOctal.test(value))\n\t ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n\t : (reIsBadHex.test(value) ? NAN : +value);\n\t}\n\t\n\tmodule.exports = debounce;\n\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _TileLayer2 = __webpack_require__(39);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _ImageTile = __webpack_require__(49);\n\t\n\tvar _ImageTile2 = _interopRequireDefault(_ImageTile);\n\t\n\tvar _ImageTileLayerBaseMaterial = __webpack_require__(52);\n\t\n\tvar _ImageTileLayerBaseMaterial2 = _interopRequireDefault(_ImageTileLayerBaseMaterial);\n\t\n\tvar _lodashThrottle = __webpack_require__(36);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\t// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n\t// being removed and the new tiles being ready for display\n\t//\n\t// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n\t// of the basemap ground so it blends in a little more, or have a huge ground\n\t// plane underneath all the tiles that shows through between tile updates.\n\t//\n\t// Could keep the old tiles around until the new ones are ready, though they'd\n\t// probably need to be layered in a way so the old tiles don't overlap new ones,\n\t// which is similar to how Leaflet approaches this (it has 2 layers)\n\t//\n\t// Could keep the tile from the previous quadtree level visible until all 4\n\t// tiles at the new / current level have finished loading and are displayed.\n\t// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n\t// child quadcodes showing whether they are loaded and in view. If all true then\n\t// remove the parent tile, otherwise keep it on a lower layer.\n\t\n\t// TODO: Load and display a base layer separate to the LOD grid that is at a low\n\t// resolution – used as a backup / background to fill in empty areas / distance\n\t\n\t// DONE: Fix the issue where some tiles just don't load, or at least the texture\n\t// never shows up – tends to happen if you quickly zoom in / out past it while\n\t// it's still loading, leaving a blank space\n\t\n\t// TODO: Optimise the request of many image tiles – look at how Leaflet and\n\t// OpenWebGlobe approach this (eg. batching, queues, etc)\n\t\n\t// TODO: Cancel pending tile requests if they get removed from view before they\n\t// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n\t// images are re-requested when the tile is next in scene (even if from cache)\n\t\n\t// TODO: Consider not performing an LOD calculation on every frame, instead only\n\t// on move end so panning, orbiting and zooming stays smooth. Otherwise it's\n\t// possible for performance to tank if you pan, orbit or zoom rapidly while all\n\t// the LOD calculations are being made and new tiles requested.\n\t//\n\t// Pending tiles should continue to be requested and output to the scene on each\n\t// frame, but no new LOD calculations should be made.\n\t\n\t// This tile layer both updates the quadtree and outputs tiles on every frame\n\t// (throttled to some amount)\n\t//\n\t// This is because the computational complexity of image tiles is generally low\n\t// and so there isn't much jank when running these calculations and outputs in\n\t// realtime\n\t//\n\t// The benefit to doing this is that the underlying map layer continues to\n\t// refresh and update during movement, which is an arguably better experience\n\t\n\tvar ImageTileLayer = (function (_TileLayer) {\n\t _inherits(ImageTileLayer, _TileLayer);\n\t\n\t function ImageTileLayer(path, options) {\n\t _classCallCheck(this, ImageTileLayer);\n\t\n\t var defaults = {\n\t distance: 40000\n\t };\n\t\n\t options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(ImageTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t // Add base layer\n\t var geom = new _three2['default'].PlaneBufferGeometry(200000, 200000, 1);\n\t\n\t var baseMaterial;\n\t if (this._world._environment._skybox) {\n\t baseMaterial = (0, _ImageTileLayerBaseMaterial2['default'])('#f5f5f3', this._world._environment._skybox.getRenderTarget());\n\t } else {\n\t baseMaterial = (0, _ImageTileLayerBaseMaterial2['default'])('#f5f5f3');\n\t }\n\t\n\t var mesh = new _three2['default'].Mesh(geom, baseMaterial);\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t // TODO: It might be overkill to receive a shadow on the base layer as it's\n\t // rarely seen (good to have if performance difference is negligible)\n\t mesh.receiveShadow = true;\n\t\n\t this._baseLayer = mesh;\n\t this.add(mesh);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t _this._initEvents();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t }\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t this._calculateLOD();\n\t this._outputTiles();\n\t }\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t this._moveBaseLayer(point);\n\t }\n\t }, {\n\t key: '_moveBaseLayer',\n\t value: function _moveBaseLayer(point) {\n\t this._baseLayer.position.x = point.x;\n\t this._baseLayer.position.z = point.y;\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t return (0, _ImageTile2['default'])(quadcode, this._path, layer);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Dispose of mesh and materials\n\t this._baseLayer.geometry.dispose();\n\t this._baseLayer.geometry = null;\n\t\n\t if (this._baseLayer.material.map) {\n\t this._baseLayer.material.map.dispose();\n\t this._baseLayer.material.map = null;\n\t }\n\t\n\t this._baseLayer.material.dispose();\n\t this._baseLayer.material = null;\n\t\n\t this._baseLayer = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(ImageTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return ImageTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new ImageTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Layer2 = __webpack_require__(33);\n\t\n\tvar _Layer3 = _interopRequireDefault(_Layer2);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _TileCache = __webpack_require__(40);\n\t\n\tvar _TileCache2 = _interopRequireDefault(_TileCache);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// TODO: Consider keeping a single TileLayer / LOD instance running by default\n\t// that keeps a standard LOD grid for other layers to utilise, rather than\n\t// having to create their own, unique LOD grid and duplicate calculations when\n\t// they're going to use the same grid setup anyway\n\t//\n\t// It still makes sense to be able to have a custom LOD grid for some layers as\n\t// they may want to customise things, maybe not even using a quadtree at all!\n\t//\n\t// Perhaps it makes sense to split out the quadtree stuff into a singleton and\n\t// pass in the necessary parameters each time for the calculation step.\n\t//\n\t// Either way, it seems silly to force layers to have to create a new LOD grid\n\t// each time and create extra, duplicated processing every frame.\n\t\n\t// TODO: Allow passing in of options to define min/max LOD and a distance to use\n\t// for culling tiles beyond that distance.\n\t\n\t// DONE: Prevent tiles from being loaded if they are further than a certain\n\t// distance from the camera and are unlikely to be seen anyway\n\t\n\t// TODO: Avoid performing LOD calculation when it isn't required. For example,\n\t// when nothing has changed since the last frame and there are no tiles to be\n\t// loaded or in need of rendering\n\t\n\t// TODO: Only remove tiles from the layer that aren't to be rendered in the\n\t// current frame – it seems excessive to remove all tiles and re-add them on\n\t// every single frame, even if it's just array manipulation\n\t\n\t// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n\t// problems (eg. making min above 5 causes all sorts of issues)\n\t\n\t// TODO: Reuse THREE objects where possible instead of creating new instances\n\t// on every LOD calculation\n\t\n\t// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n\t// to avoid creating unnecessary memory for garbage collection\n\t\n\t// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n\t// closest to the camera) so visual inconsistancies during loading are minimised\n\t\n\tvar TileLayer = (function (_Layer) {\n\t _inherits(TileLayer, _Layer);\n\t\n\t function TileLayer(options) {\n\t var _this = this;\n\t\n\t _classCallCheck(this, TileLayer);\n\t\n\t _get(Object.getPrototypeOf(TileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t var defaults = {\n\t maxCache: 1000,\n\t maxLOD: 18\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t this._tileCache = (0, _TileCache2['default'])(this._options.maxCache, function (tile) {\n\t _this._destroyTile(tile);\n\t });\n\t\n\t // List of tiles from the previous LOD calculation\n\t this._tileList = [];\n\t\n\t // TODO: Work out why changing the minLOD causes loads of issues\n\t this._minLOD = 3;\n\t this._maxLOD = this._options.maxLOD;\n\t\n\t this._frustum = new _three2['default'].Frustum();\n\t this._tiles = new _three2['default'].Object3D();\n\t }\n\t\n\t _createClass(TileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t this.add(this._tiles);\n\t }\n\t }, {\n\t key: '_updateFrustum',\n\t value: function _updateFrustum() {\n\t var camera = this._world.getCamera();\n\t var projScreenMatrix = new _three2['default'].Matrix4();\n\t projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\t\n\t this._frustum.setFromMatrix(camera.projectionMatrix);\n\t this._frustum.setFromMatrix(new _three2['default'].Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n\t }\n\t }, {\n\t key: '_tileInFrustum',\n\t value: function _tileInFrustum(tile) {\n\t var bounds = tile.getBounds();\n\t return this._frustum.intersectsBox(new _three2['default'].Box3(new _three2['default'].Vector3(bounds[0], 0, bounds[3]), new _three2['default'].Vector3(bounds[2], 0, bounds[1])));\n\t }\n\t\n\t // Update and output tiles from the previous LOD checklist\n\t }, {\n\t key: '_outputTiles',\n\t value: function _outputTiles() {\n\t var _this2 = this;\n\t\n\t // Remove all tiles from layer\n\t this._removeTiles();\n\t\n\t // Add / re-add tiles\n\t this._tileList.forEach(function (tile) {\n\t // Are the mesh and texture ready?\n\t //\n\t // If yes, continue\n\t // If no, skip\n\t if (!tile.isReady()) {\n\t return;\n\t }\n\t\n\t // Add tile to layer (and to scene) if not already there\n\t _this2._tiles.add(tile.getMesh());\n\t });\n\t }\n\t\n\t // Works out tiles in the view frustum and stores them in an array\n\t //\n\t // Does not output the tiles, deferring this to _outputTiles()\n\t }, {\n\t key: '_calculateLOD',\n\t value: function _calculateLOD() {\n\t var _this3 = this;\n\t\n\t if (this._stop || !this._world) {\n\t return;\n\t }\n\t\n\t // var start = performance.now();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // 1. Update and retrieve camera frustum\n\t this._updateFrustum(this._frustum, camera);\n\t\n\t // 2. Add the four root items of the quadtree to a check list\n\t var checkList = this._checklist;\n\t checkList = [];\n\t checkList.push(this._requestTile('0', this));\n\t checkList.push(this._requestTile('1', this));\n\t checkList.push(this._requestTile('2', this));\n\t checkList.push(this._requestTile('3', this));\n\t\n\t // 3. Call Divide, passing in the check list\n\t this._divide(checkList);\n\t\n\t // // 4. Remove all tiles from layer\n\t //\n\t // Moved to _outputTiles() for now\n\t // this._removeTiles();\n\t\n\t // 5. Filter the tiles remaining in the check list\n\t this._tileList = checkList.filter(function (tile, index) {\n\t // Skip tile if it's not in the current view frustum\n\t if (!_this3._tileInFrustum(tile)) {\n\t return false;\n\t }\n\t\n\t if (_this3._options.distance && _this3._options.distance > 0) {\n\t // TODO: Can probably speed this up\n\t var center = tile.getCenter();\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t // Manual distance limit to cut down on tiles so far away\n\t if (dist > _this3._options.distance) {\n\t return false;\n\t }\n\t }\n\t\n\t // Does the tile have a mesh?\n\t //\n\t // If yes, continue\n\t // If no, generate tile mesh, request texture and skip\n\t if (!tile.getMesh()) {\n\t tile.requestTileAsync();\n\t }\n\t\n\t return true;\n\t\n\t // Are the mesh and texture ready?\n\t //\n\t // If yes, continue\n\t // If no, skip\n\t // if (!tile.isReady()) {\n\t // return;\n\t // }\n\t //\n\t // // Add tile to layer (and to scene)\n\t // this._tiles.add(tile.getMesh());\n\t });\n\t\n\t // console.log(performance.now() - start);\n\t }\n\t }, {\n\t key: '_divide',\n\t value: function _divide(checkList) {\n\t var count = 0;\n\t var currentItem;\n\t var quadcode;\n\t\n\t // 1. Loop until count equals check list length\n\t while (count != checkList.length) {\n\t currentItem = checkList[count];\n\t quadcode = currentItem.getQuadcode();\n\t\n\t // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n\t if (currentItem.length === this._maxLOD) {\n\t count++;\n\t continue;\n\t }\n\t\n\t // 3. Else, calculate screen-space error metric for quadcode\n\t if (this._screenSpaceError(currentItem)) {\n\t // 4. If error is sufficient...\n\t\n\t // 4a. Remove parent item from the check list\n\t checkList.splice(count, 1);\n\t\n\t // 4b. Add 4 child items to the check list\n\t checkList.push(this._requestTile(quadcode + '0', this));\n\t checkList.push(this._requestTile(quadcode + '1', this));\n\t checkList.push(this._requestTile(quadcode + '2', this));\n\t checkList.push(this._requestTile(quadcode + '3', this));\n\t\n\t // 4d. Continue the loop without increasing count\n\t continue;\n\t } else {\n\t // 5. Else, increase count and continue loop\n\t count++;\n\t }\n\t }\n\t }\n\t }, {\n\t key: '_screenSpaceError',\n\t value: function _screenSpaceError(tile) {\n\t var minDepth = this._minLOD;\n\t var maxDepth = this._maxLOD;\n\t\n\t var quadcode = tile.getQuadcode();\n\t\n\t var camera = this._world.getCamera();\n\t\n\t // Tweak this value to refine specific point that each quad is subdivided\n\t //\n\t // It's used to multiple the dimensions of the tile sides before\n\t // comparing against the tile distance from camera\n\t var quality = 3.0;\n\t\n\t // 1. Return false if quadcode length equals maxDepth (stop dividing)\n\t if (quadcode.length === maxDepth) {\n\t return false;\n\t }\n\t\n\t // 2. Return true if quadcode length is less than minDepth\n\t if (quadcode.length < minDepth) {\n\t return true;\n\t }\n\t\n\t // 3. Return false if quadcode bounds are not in view frustum\n\t if (!this._tileInFrustum(tile)) {\n\t return false;\n\t }\n\t\n\t var center = tile.getCenter();\n\t\n\t // 4. Calculate screen-space error metric\n\t // TODO: Use closest distance to one of the 4 tile corners\n\t var dist = new _three2['default'].Vector3(center[0], 0, center[1]).sub(camera.position).length();\n\t\n\t var error = quality * tile.getSide() / dist;\n\t\n\t // 5. Return true if error is greater than 1.0, else return false\n\t return error > 1.0;\n\t }\n\t }, {\n\t key: '_removeTiles',\n\t value: function _removeTiles() {\n\t for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t }\n\t\n\t // Return a new tile instance\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {}\n\t\n\t // Get a cached tile or request a new one if not in cache\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile(quadcode, layer) {\n\t var tile = this._tileCache.getTile(quadcode);\n\t\n\t if (!tile) {\n\t // Set up a brand new tile\n\t tile = this._createTile(quadcode, layer);\n\t\n\t // Add tile to cache, though it won't be ready yet as the data is being\n\t // requested from various places asynchronously\n\t this._tileCache.setTile(quadcode, tile);\n\t }\n\t\n\t return tile;\n\t }\n\t }, {\n\t key: '_destroyTile',\n\t value: function _destroyTile(tile) {\n\t // Remove tile from scene\n\t this._tiles.remove(tile.getMesh());\n\t\n\t // Delete any references to the tile within this component\n\t\n\t // Call destory on tile instance\n\t tile.destroy();\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t var i;\n\t\n\t // Remove all tiles\n\t for (i = this._tiles.children.length - 1; i >= 0; i--) {\n\t this._tiles.remove(this._tiles.children[i]);\n\t }\n\t\n\t this._tileCache.destroy();\n\t this._tileCache = null;\n\t\n\t this._tiles = null;\n\t this._frustum = null;\n\t\n\t _get(Object.getPrototypeOf(TileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return TileLayer;\n\t})(_Layer3['default']);\n\t\n\texports['default'] = TileLayer;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _lruCache = __webpack_require__(41);\n\t\n\tvar _lruCache2 = _interopRequireDefault(_lruCache);\n\t\n\t// This process is based on a similar approach taken by OpenWebGlobe\n\t// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\t\n\tvar TileCache = (function () {\n\t function TileCache(cacheLimit, onDestroyTile) {\n\t _classCallCheck(this, TileCache);\n\t\n\t this._cache = (0, _lruCache2['default'])({\n\t max: cacheLimit,\n\t dispose: function dispose(key, tile) {\n\t onDestroyTile(tile);\n\t }\n\t });\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Returns true if all specified tile providers are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(TileCache, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return false;\n\t }\n\t\n\t // Get a cached tile without requesting a new one\n\t }, {\n\t key: 'getTile',\n\t value: function getTile(quadcode) {\n\t return this._cache.get(quadcode);\n\t }\n\t\n\t // Add tile to cache\n\t }, {\n\t key: 'setTile',\n\t value: function setTile(quadcode, tile) {\n\t this._cache.set(quadcode, tile);\n\t }\n\t\n\t // Destroy the cache and remove it from memory\n\t //\n\t // TODO: Call destroy method on items in cache\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._cache.reset();\n\t this._cache = null;\n\t }\n\t }]);\n\t\n\t return TileCache;\n\t})();\n\t\n\texports['default'] = function (cacheLimit, onDestroyTile) {\n\t return new TileCache(cacheLimit, onDestroyTile);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tmodule.exports = LRUCache\n\t\n\t// This will be a proper iterable 'Map' in engines that support it,\n\t// or a fakey-fake PseudoMap in older versions.\n\tvar Map = __webpack_require__(42)\n\tvar util = __webpack_require__(45)\n\t\n\t// A linked list to keep track of recently-used-ness\n\tvar Yallist = __webpack_require__(48)\n\t\n\t// use symbols if possible, otherwise just _props\n\tvar symbols = {}\n\tvar hasSymbol = typeof Symbol === 'function'\n\tvar makeSymbol\n\tif (hasSymbol) {\n\t makeSymbol = function (key) {\n\t return Symbol.for(key)\n\t }\n\t} else {\n\t makeSymbol = function (key) {\n\t return '_' + key\n\t }\n\t}\n\t\n\tfunction priv (obj, key, val) {\n\t var sym\n\t if (symbols[key]) {\n\t sym = symbols[key]\n\t } else {\n\t sym = makeSymbol(key)\n\t symbols[key] = sym\n\t }\n\t if (arguments.length === 2) {\n\t return obj[sym]\n\t } else {\n\t obj[sym] = val\n\t return val\n\t }\n\t}\n\t\n\tfunction naiveLength () { return 1 }\n\t\n\t// lruList is a yallist where the head is the youngest\n\t// item, and the tail is the oldest. the list contains the Hit\n\t// objects as the entries.\n\t// Each Hit object has a reference to its Yallist.Node. This\n\t// never changes.\n\t//\n\t// cache is a Map (or PseudoMap) that matches the keys to\n\t// the Yallist.Node object.\n\tfunction LRUCache (options) {\n\t if (!(this instanceof LRUCache)) {\n\t return new LRUCache(options)\n\t }\n\t\n\t if (typeof options === 'number') {\n\t options = { max: options }\n\t }\n\t\n\t if (!options) {\n\t options = {}\n\t }\n\t\n\t var max = priv(this, 'max', options.max)\n\t // Kind of weird to have a default max of Infinity, but oh well.\n\t if (!max ||\n\t !(typeof max === 'number') ||\n\t max <= 0) {\n\t priv(this, 'max', Infinity)\n\t }\n\t\n\t var lc = options.length || naiveLength\n\t if (typeof lc !== 'function') {\n\t lc = naiveLength\n\t }\n\t priv(this, 'lengthCalculator', lc)\n\t\n\t priv(this, 'allowStale', options.stale || false)\n\t priv(this, 'maxAge', options.maxAge || 0)\n\t priv(this, 'dispose', options.dispose)\n\t this.reset()\n\t}\n\t\n\t// resize the cache when the max changes.\n\tObject.defineProperty(LRUCache.prototype, 'max', {\n\t set: function (mL) {\n\t if (!mL || !(typeof mL === 'number') || mL <= 0) {\n\t mL = Infinity\n\t }\n\t priv(this, 'max', mL)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'max')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'allowStale', {\n\t set: function (allowStale) {\n\t priv(this, 'allowStale', !!allowStale)\n\t },\n\t get: function () {\n\t return priv(this, 'allowStale')\n\t },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'maxAge', {\n\t set: function (mA) {\n\t if (!mA || !(typeof mA === 'number') || mA < 0) {\n\t mA = 0\n\t }\n\t priv(this, 'maxAge', mA)\n\t trim(this)\n\t },\n\t get: function () {\n\t return priv(this, 'maxAge')\n\t },\n\t enumerable: true\n\t})\n\t\n\t// resize the cache when the lengthCalculator changes.\n\tObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n\t set: function (lC) {\n\t if (typeof lC !== 'function') {\n\t lC = naiveLength\n\t }\n\t if (lC !== priv(this, 'lengthCalculator')) {\n\t priv(this, 'lengthCalculator', lC)\n\t priv(this, 'length', 0)\n\t priv(this, 'lruList').forEach(function (hit) {\n\t hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t }, this)\n\t }\n\t trim(this)\n\t },\n\t get: function () { return priv(this, 'lengthCalculator') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'length', {\n\t get: function () { return priv(this, 'length') },\n\t enumerable: true\n\t})\n\t\n\tObject.defineProperty(LRUCache.prototype, 'itemCount', {\n\t get: function () { return priv(this, 'lruList').length },\n\t enumerable: true\n\t})\n\t\n\tLRUCache.prototype.rforEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n\t var prev = walker.prev\n\t forEachStep(this, fn, walker, thisp)\n\t walker = prev\n\t }\n\t}\n\t\n\tfunction forEachStep (self, fn, node, thisp) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) {\n\t hit = undefined\n\t }\n\t }\n\t if (hit) {\n\t fn.call(thisp, hit.value, hit.key, self)\n\t }\n\t}\n\t\n\tLRUCache.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = priv(this, 'lruList').head; walker !== null;) {\n\t var next = walker.next\n\t forEachStep(this, fn, walker, thisp)\n\t walker = next\n\t }\n\t}\n\t\n\tLRUCache.prototype.keys = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.key\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.values = function () {\n\t return priv(this, 'lruList').toArray().map(function (k) {\n\t return k.value\n\t }, this)\n\t}\n\t\n\tLRUCache.prototype.reset = function () {\n\t if (priv(this, 'dispose') &&\n\t priv(this, 'lruList') &&\n\t priv(this, 'lruList').length) {\n\t priv(this, 'lruList').forEach(function (hit) {\n\t priv(this, 'dispose').call(this, hit.key, hit.value)\n\t }, this)\n\t }\n\t\n\t priv(this, 'cache', new Map()) // hash of items by key\n\t priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n\t priv(this, 'length', 0) // length of items in the list\n\t}\n\t\n\tLRUCache.prototype.dump = function () {\n\t return priv(this, 'lruList').map(function (hit) {\n\t if (!isStale(this, hit)) {\n\t return {\n\t k: hit.key,\n\t v: hit.value,\n\t e: hit.now + (hit.maxAge || 0)\n\t }\n\t }\n\t }, this).toArray().filter(function (h) {\n\t return h\n\t })\n\t}\n\t\n\tLRUCache.prototype.dumpLru = function () {\n\t return priv(this, 'lruList')\n\t}\n\t\n\tLRUCache.prototype.inspect = function (n, opts) {\n\t var str = 'LRUCache {'\n\t var extras = false\n\t\n\t var as = priv(this, 'allowStale')\n\t if (as) {\n\t str += '\\n allowStale: true'\n\t extras = true\n\t }\n\t\n\t var max = priv(this, 'max')\n\t if (max && max !== Infinity) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n max: ' + util.inspect(max, opts)\n\t extras = true\n\t }\n\t\n\t var maxAge = priv(this, 'maxAge')\n\t if (maxAge) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n\t extras = true\n\t }\n\t\n\t var lc = priv(this, 'lengthCalculator')\n\t if (lc && lc !== naiveLength) {\n\t if (extras) {\n\t str += ','\n\t }\n\t str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n\t extras = true\n\t }\n\t\n\t var didFirst = false\n\t priv(this, 'lruList').forEach(function (item) {\n\t if (didFirst) {\n\t str += ',\\n '\n\t } else {\n\t if (extras) {\n\t str += ',\\n'\n\t }\n\t didFirst = true\n\t str += '\\n '\n\t }\n\t var key = util.inspect(item.key).split('\\n').join('\\n ')\n\t var val = { value: item.value }\n\t if (item.maxAge !== maxAge) {\n\t val.maxAge = item.maxAge\n\t }\n\t if (lc !== naiveLength) {\n\t val.length = item.length\n\t }\n\t if (isStale(this, item)) {\n\t val.stale = true\n\t }\n\t\n\t val = util.inspect(val, opts).split('\\n').join('\\n ')\n\t str += key + ' => ' + val\n\t })\n\t\n\t if (didFirst || extras) {\n\t str += '\\n'\n\t }\n\t str += '}'\n\t\n\t return str\n\t}\n\t\n\tLRUCache.prototype.set = function (key, value, maxAge) {\n\t maxAge = maxAge || priv(this, 'maxAge')\n\t\n\t var now = maxAge ? Date.now() : 0\n\t var len = priv(this, 'lengthCalculator').call(this, value, key)\n\t\n\t if (priv(this, 'cache').has(key)) {\n\t if (len > priv(this, 'max')) {\n\t del(this, priv(this, 'cache').get(key))\n\t return false\n\t }\n\t\n\t var node = priv(this, 'cache').get(key)\n\t var item = node.value\n\t\n\t // dispose of the old one before overwriting\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, item.value)\n\t }\n\t\n\t item.now = now\n\t item.maxAge = maxAge\n\t item.value = value\n\t priv(this, 'length', priv(this, 'length') + (len - item.length))\n\t item.length = len\n\t this.get(key)\n\t trim(this)\n\t return true\n\t }\n\t\n\t var hit = new Entry(key, value, len, now, maxAge)\n\t\n\t // oversized objects fall out of cache automatically.\n\t if (hit.length > priv(this, 'max')) {\n\t if (priv(this, 'dispose')) {\n\t priv(this, 'dispose').call(this, key, value)\n\t }\n\t return false\n\t }\n\t\n\t priv(this, 'length', priv(this, 'length') + hit.length)\n\t priv(this, 'lruList').unshift(hit)\n\t priv(this, 'cache').set(key, priv(this, 'lruList').head)\n\t trim(this)\n\t return true\n\t}\n\t\n\tLRUCache.prototype.has = function (key) {\n\t if (!priv(this, 'cache').has(key)) return false\n\t var hit = priv(this, 'cache').get(key).value\n\t if (isStale(this, hit)) {\n\t return false\n\t }\n\t return true\n\t}\n\t\n\tLRUCache.prototype.get = function (key) {\n\t return get(this, key, true)\n\t}\n\t\n\tLRUCache.prototype.peek = function (key) {\n\t return get(this, key, false)\n\t}\n\t\n\tLRUCache.prototype.pop = function () {\n\t var node = priv(this, 'lruList').tail\n\t if (!node) return null\n\t del(this, node)\n\t return node.value\n\t}\n\t\n\tLRUCache.prototype.del = function (key) {\n\t del(this, priv(this, 'cache').get(key))\n\t}\n\t\n\tLRUCache.prototype.load = function (arr) {\n\t // reset the cache\n\t this.reset()\n\t\n\t var now = Date.now()\n\t // A previous serialized cache has the most recent items first\n\t for (var l = arr.length - 1; l >= 0; l--) {\n\t var hit = arr[l]\n\t var expiresAt = hit.e || 0\n\t if (expiresAt === 0) {\n\t // the item was created without expiration in a non aged cache\n\t this.set(hit.k, hit.v)\n\t } else {\n\t var maxAge = expiresAt - now\n\t // dont add already expired items\n\t if (maxAge > 0) {\n\t this.set(hit.k, hit.v, maxAge)\n\t }\n\t }\n\t }\n\t}\n\t\n\tLRUCache.prototype.prune = function () {\n\t var self = this\n\t priv(this, 'cache').forEach(function (value, key) {\n\t get(self, key, false)\n\t })\n\t}\n\t\n\tfunction get (self, key, doUse) {\n\t var node = priv(self, 'cache').get(key)\n\t if (node) {\n\t var hit = node.value\n\t if (isStale(self, hit)) {\n\t del(self, node)\n\t if (!priv(self, 'allowStale')) hit = undefined\n\t } else {\n\t if (doUse) {\n\t priv(self, 'lruList').unshiftNode(node)\n\t }\n\t }\n\t if (hit) hit = hit.value\n\t }\n\t return hit\n\t}\n\t\n\tfunction isStale (self, hit) {\n\t if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n\t return false\n\t }\n\t var stale = false\n\t var diff = Date.now() - hit.now\n\t if (hit.maxAge) {\n\t stale = diff > hit.maxAge\n\t } else {\n\t stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n\t }\n\t return stale\n\t}\n\t\n\tfunction trim (self) {\n\t if (priv(self, 'length') > priv(self, 'max')) {\n\t for (var walker = priv(self, 'lruList').tail;\n\t priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n\t // We know that we're about to delete this one, and also\n\t // what the next least recently used key will be, so just\n\t // go ahead and set it now.\n\t var prev = walker.prev\n\t del(self, walker)\n\t walker = prev\n\t }\n\t }\n\t}\n\t\n\tfunction del (self, node) {\n\t if (node) {\n\t var hit = node.value\n\t if (priv(self, 'dispose')) {\n\t priv(self, 'dispose').call(this, hit.key, hit.value)\n\t }\n\t priv(self, 'length', priv(self, 'length') - hit.length)\n\t priv(self, 'cache').delete(hit.key)\n\t priv(self, 'lruList').removeNode(node)\n\t }\n\t}\n\t\n\t// classy, since V8 prefers predictable objects.\n\tfunction Entry (key, value, length, now, maxAge) {\n\t this.key = key\n\t this.value = value\n\t this.length = length\n\t this.now = now\n\t this.maxAge = maxAge || 0\n\t}\n\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(process) {if (process.env.npm_package_name === 'pseudomap' &&\n\t process.env.npm_lifecycle_script === 'test')\n\t process.env.TEST_PSEUDOMAP = 'true'\n\t\n\tif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n\t module.exports = Map\n\t} else {\n\t module.exports = __webpack_require__(44)\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(43)))\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\t\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\t\n\tfunction cleanUpNextTick() {\n\t draining = false;\n\t if (currentQueue.length) {\n\t queue = currentQueue.concat(queue);\n\t } else {\n\t queueIndex = -1;\n\t }\n\t if (queue.length) {\n\t drainQueue();\n\t }\n\t}\n\t\n\tfunction drainQueue() {\n\t if (draining) {\n\t return;\n\t }\n\t var timeout = setTimeout(cleanUpNextTick);\n\t draining = true;\n\t\n\t var len = queue.length;\n\t while(len) {\n\t currentQueue = queue;\n\t queue = [];\n\t while (++queueIndex < len) {\n\t if (currentQueue) {\n\t currentQueue[queueIndex].run();\n\t }\n\t }\n\t queueIndex = -1;\n\t len = queue.length;\n\t }\n\t currentQueue = null;\n\t draining = false;\n\t clearTimeout(timeout);\n\t}\n\t\n\tprocess.nextTick = function (fun) {\n\t var args = new Array(arguments.length - 1);\n\t if (arguments.length > 1) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t args[i - 1] = arguments[i];\n\t }\n\t }\n\t queue.push(new Item(fun, args));\n\t if (queue.length === 1 && !draining) {\n\t setTimeout(drainQueue, 0);\n\t }\n\t};\n\t\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t this.fun = fun;\n\t this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\t\n\tfunction noop() {}\n\t\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\t\n\tprocess.binding = function (name) {\n\t throw new Error('process.binding is not supported');\n\t};\n\t\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 44 */\n/***/ function(module, exports) {\n\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty\n\t\n\tmodule.exports = PseudoMap\n\t\n\tfunction PseudoMap (set) {\n\t if (!(this instanceof PseudoMap)) // whyyyyyyy\n\t throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\t\n\t this.clear()\n\t\n\t if (set) {\n\t if ((set instanceof PseudoMap) ||\n\t (typeof Map === 'function' && set instanceof Map))\n\t set.forEach(function (value, key) {\n\t this.set(key, value)\n\t }, this)\n\t else if (Array.isArray(set))\n\t set.forEach(function (kv) {\n\t this.set(kv[0], kv[1])\n\t }, this)\n\t else\n\t throw new TypeError('invalid argument')\n\t }\n\t}\n\t\n\tPseudoMap.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t Object.keys(this._data).forEach(function (k) {\n\t if (k !== 'size')\n\t fn.call(thisp, this._data[k].value, this._data[k].key)\n\t }, this)\n\t}\n\t\n\tPseudoMap.prototype.has = function (k) {\n\t return !!find(this._data, k)\n\t}\n\t\n\tPseudoMap.prototype.get = function (k) {\n\t var res = find(this._data, k)\n\t return res && res.value\n\t}\n\t\n\tPseudoMap.prototype.set = function (k, v) {\n\t set(this._data, k, v)\n\t}\n\t\n\tPseudoMap.prototype.delete = function (k) {\n\t var res = find(this._data, k)\n\t if (res) {\n\t delete this._data[res._index]\n\t this._data.size--\n\t }\n\t}\n\t\n\tPseudoMap.prototype.clear = function () {\n\t var data = Object.create(null)\n\t data.size = 0\n\t\n\t Object.defineProperty(this, '_data', {\n\t value: data,\n\t enumerable: false,\n\t configurable: true,\n\t writable: false\n\t })\n\t}\n\t\n\tObject.defineProperty(PseudoMap.prototype, 'size', {\n\t get: function () {\n\t return this._data.size\n\t },\n\t set: function (n) {},\n\t enumerable: true,\n\t configurable: true\n\t})\n\t\n\tPseudoMap.prototype.values =\n\tPseudoMap.prototype.keys =\n\tPseudoMap.prototype.entries = function () {\n\t throw new Error('iterators are not implemented in this version')\n\t}\n\t\n\t// Either identical, or both NaN\n\tfunction same (a, b) {\n\t return a === b || a !== a && b !== b\n\t}\n\t\n\tfunction Entry (k, v, i) {\n\t this.key = k\n\t this.value = v\n\t this._index = i\n\t}\n\t\n\tfunction find (data, k) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k))\n\t return data[key]\n\t }\n\t}\n\t\n\tfunction set (data, k, v) {\n\t for (var i = 0, s = '_' + k, key = s;\n\t hasOwnProperty.call(data, key);\n\t key = s + i++) {\n\t if (same(data[key].key, k)) {\n\t data[key].value = v\n\t return\n\t }\n\t }\n\t data.size++\n\t data[key] = new Entry(k, v, key)\n\t}\n\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.\n\t//\n\t// Permission is hereby granted, free of charge, to any person obtaining a\n\t// copy of this software and associated documentation files (the\n\t// \"Software\"), to deal in the Software without restriction, including\n\t// without limitation the rights to use, copy, modify, merge, publish,\n\t// distribute, sublicense, and/or sell copies of the Software, and to permit\n\t// persons to whom the Software is furnished to do so, subject to the\n\t// following conditions:\n\t//\n\t// The above copyright notice and this permission notice shall be included\n\t// in all copies or substantial portions of the Software.\n\t//\n\t// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\t// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\t// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n\t// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n\t// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n\t// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n\t// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\t\n\tvar formatRegExp = /%[sdj%]/g;\n\texports.format = function(f) {\n\t if (!isString(f)) {\n\t var objects = [];\n\t for (var i = 0; i < arguments.length; i++) {\n\t objects.push(inspect(arguments[i]));\n\t }\n\t return objects.join(' ');\n\t }\n\t\n\t var i = 1;\n\t var args = arguments;\n\t var len = args.length;\n\t var str = String(f).replace(formatRegExp, function(x) {\n\t if (x === '%%') return '%';\n\t if (i >= len) return x;\n\t switch (x) {\n\t case '%s': return String(args[i++]);\n\t case '%d': return Number(args[i++]);\n\t case '%j':\n\t try {\n\t return JSON.stringify(args[i++]);\n\t } catch (_) {\n\t return '[Circular]';\n\t }\n\t default:\n\t return x;\n\t }\n\t });\n\t for (var x = args[i]; i < len; x = args[++i]) {\n\t if (isNull(x) || !isObject(x)) {\n\t str += ' ' + x;\n\t } else {\n\t str += ' ' + inspect(x);\n\t }\n\t }\n\t return str;\n\t};\n\t\n\t\n\t// Mark that a method should not be used.\n\t// Returns a modified function which warns once by default.\n\t// If --no-deprecation is set, then it is a no-op.\n\texports.deprecate = function(fn, msg) {\n\t // Allow for deprecating things in the process of starting up.\n\t if (isUndefined(global.process)) {\n\t return function() {\n\t return exports.deprecate(fn, msg).apply(this, arguments);\n\t };\n\t }\n\t\n\t if (process.noDeprecation === true) {\n\t return fn;\n\t }\n\t\n\t var warned = false;\n\t function deprecated() {\n\t if (!warned) {\n\t if (process.throwDeprecation) {\n\t throw new Error(msg);\n\t } else if (process.traceDeprecation) {\n\t console.trace(msg);\n\t } else {\n\t console.error(msg);\n\t }\n\t warned = true;\n\t }\n\t return fn.apply(this, arguments);\n\t }\n\t\n\t return deprecated;\n\t};\n\t\n\t\n\tvar debugs = {};\n\tvar debugEnviron;\n\texports.debuglog = function(set) {\n\t if (isUndefined(debugEnviron))\n\t debugEnviron = process.env.NODE_DEBUG || '';\n\t set = set.toUpperCase();\n\t if (!debugs[set]) {\n\t if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n\t var pid = process.pid;\n\t debugs[set] = function() {\n\t var msg = exports.format.apply(exports, arguments);\n\t console.error('%s %d: %s', set, pid, msg);\n\t };\n\t } else {\n\t debugs[set] = function() {};\n\t }\n\t }\n\t return debugs[set];\n\t};\n\t\n\t\n\t/**\n\t * Echos the value of a value. Trys to print the value out\n\t * in the best way possible given the different types.\n\t *\n\t * @param {Object} obj The object to print out.\n\t * @param {Object} opts Optional options object that alters the output.\n\t */\n\t/* legacy: obj, showHidden, depth, colors*/\n\tfunction inspect(obj, opts) {\n\t // default options\n\t var ctx = {\n\t seen: [],\n\t stylize: stylizeNoColor\n\t };\n\t // legacy...\n\t if (arguments.length >= 3) ctx.depth = arguments[2];\n\t if (arguments.length >= 4) ctx.colors = arguments[3];\n\t if (isBoolean(opts)) {\n\t // legacy...\n\t ctx.showHidden = opts;\n\t } else if (opts) {\n\t // got an \"options\" object\n\t exports._extend(ctx, opts);\n\t }\n\t // set default options\n\t if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n\t if (isUndefined(ctx.depth)) ctx.depth = 2;\n\t if (isUndefined(ctx.colors)) ctx.colors = false;\n\t if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n\t if (ctx.colors) ctx.stylize = stylizeWithColor;\n\t return formatValue(ctx, obj, ctx.depth);\n\t}\n\texports.inspect = inspect;\n\t\n\t\n\t// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\n\tinspect.colors = {\n\t 'bold' : [1, 22],\n\t 'italic' : [3, 23],\n\t 'underline' : [4, 24],\n\t 'inverse' : [7, 27],\n\t 'white' : [37, 39],\n\t 'grey' : [90, 39],\n\t 'black' : [30, 39],\n\t 'blue' : [34, 39],\n\t 'cyan' : [36, 39],\n\t 'green' : [32, 39],\n\t 'magenta' : [35, 39],\n\t 'red' : [31, 39],\n\t 'yellow' : [33, 39]\n\t};\n\t\n\t// Don't use 'blue' not visible on cmd.exe\n\tinspect.styles = {\n\t 'special': 'cyan',\n\t 'number': 'yellow',\n\t 'boolean': 'yellow',\n\t 'undefined': 'grey',\n\t 'null': 'bold',\n\t 'string': 'green',\n\t 'date': 'magenta',\n\t // \"name\": intentionally not styling\n\t 'regexp': 'red'\n\t};\n\t\n\t\n\tfunction stylizeWithColor(str, styleType) {\n\t var style = inspect.styles[styleType];\n\t\n\t if (style) {\n\t return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n\t '\\u001b[' + inspect.colors[style][1] + 'm';\n\t } else {\n\t return str;\n\t }\n\t}\n\t\n\t\n\tfunction stylizeNoColor(str, styleType) {\n\t return str;\n\t}\n\t\n\t\n\tfunction arrayToHash(array) {\n\t var hash = {};\n\t\n\t array.forEach(function(val, idx) {\n\t hash[val] = true;\n\t });\n\t\n\t return hash;\n\t}\n\t\n\t\n\tfunction formatValue(ctx, value, recurseTimes) {\n\t // Provide a hook for user-specified inspect functions.\n\t // Check that value is an object with an inspect function on it\n\t if (ctx.customInspect &&\n\t value &&\n\t isFunction(value.inspect) &&\n\t // Filter out the util module, it's inspect function is special\n\t value.inspect !== exports.inspect &&\n\t // Also filter out any prototype objects using the circular check.\n\t !(value.constructor && value.constructor.prototype === value)) {\n\t var ret = value.inspect(recurseTimes, ctx);\n\t if (!isString(ret)) {\n\t ret = formatValue(ctx, ret, recurseTimes);\n\t }\n\t return ret;\n\t }\n\t\n\t // Primitive types cannot have properties\n\t var primitive = formatPrimitive(ctx, value);\n\t if (primitive) {\n\t return primitive;\n\t }\n\t\n\t // Look up the keys of the object.\n\t var keys = Object.keys(value);\n\t var visibleKeys = arrayToHash(keys);\n\t\n\t if (ctx.showHidden) {\n\t keys = Object.getOwnPropertyNames(value);\n\t }\n\t\n\t // IE doesn't make error fields non-enumerable\n\t // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n\t if (isError(value)\n\t && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n\t return formatError(value);\n\t }\n\t\n\t // Some type of object without properties can be shortcutted.\n\t if (keys.length === 0) {\n\t if (isFunction(value)) {\n\t var name = value.name ? ': ' + value.name : '';\n\t return ctx.stylize('[Function' + name + ']', 'special');\n\t }\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t }\n\t if (isDate(value)) {\n\t return ctx.stylize(Date.prototype.toString.call(value), 'date');\n\t }\n\t if (isError(value)) {\n\t return formatError(value);\n\t }\n\t }\n\t\n\t var base = '', array = false, braces = ['{', '}'];\n\t\n\t // Make Array say that they are Array\n\t if (isArray(value)) {\n\t array = true;\n\t braces = ['[', ']'];\n\t }\n\t\n\t // Make functions say that they are functions\n\t if (isFunction(value)) {\n\t var n = value.name ? ': ' + value.name : '';\n\t base = ' [Function' + n + ']';\n\t }\n\t\n\t // Make RegExps say that they are RegExps\n\t if (isRegExp(value)) {\n\t base = ' ' + RegExp.prototype.toString.call(value);\n\t }\n\t\n\t // Make dates with properties first say the date\n\t if (isDate(value)) {\n\t base = ' ' + Date.prototype.toUTCString.call(value);\n\t }\n\t\n\t // Make error with message first say the error\n\t if (isError(value)) {\n\t base = ' ' + formatError(value);\n\t }\n\t\n\t if (keys.length === 0 && (!array || value.length == 0)) {\n\t return braces[0] + base + braces[1];\n\t }\n\t\n\t if (recurseTimes < 0) {\n\t if (isRegExp(value)) {\n\t return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n\t } else {\n\t return ctx.stylize('[Object]', 'special');\n\t }\n\t }\n\t\n\t ctx.seen.push(value);\n\t\n\t var output;\n\t if (array) {\n\t output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n\t } else {\n\t output = keys.map(function(key) {\n\t return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n\t });\n\t }\n\t\n\t ctx.seen.pop();\n\t\n\t return reduceToSingleString(output, base, braces);\n\t}\n\t\n\t\n\tfunction formatPrimitive(ctx, value) {\n\t if (isUndefined(value))\n\t return ctx.stylize('undefined', 'undefined');\n\t if (isString(value)) {\n\t var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n\t .replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"') + '\\'';\n\t return ctx.stylize(simple, 'string');\n\t }\n\t if (isNumber(value))\n\t return ctx.stylize('' + value, 'number');\n\t if (isBoolean(value))\n\t return ctx.stylize('' + value, 'boolean');\n\t // For some reason typeof null is \"object\", so special case here.\n\t if (isNull(value))\n\t return ctx.stylize('null', 'null');\n\t}\n\t\n\t\n\tfunction formatError(value) {\n\t return '[' + Error.prototype.toString.call(value) + ']';\n\t}\n\t\n\t\n\tfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n\t var output = [];\n\t for (var i = 0, l = value.length; i < l; ++i) {\n\t if (hasOwnProperty(value, String(i))) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t String(i), true));\n\t } else {\n\t output.push('');\n\t }\n\t }\n\t keys.forEach(function(key) {\n\t if (!key.match(/^\\d+$/)) {\n\t output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n\t key, true));\n\t }\n\t });\n\t return output;\n\t}\n\t\n\t\n\tfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n\t var name, str, desc;\n\t desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n\t if (desc.get) {\n\t if (desc.set) {\n\t str = ctx.stylize('[Getter/Setter]', 'special');\n\t } else {\n\t str = ctx.stylize('[Getter]', 'special');\n\t }\n\t } else {\n\t if (desc.set) {\n\t str = ctx.stylize('[Setter]', 'special');\n\t }\n\t }\n\t if (!hasOwnProperty(visibleKeys, key)) {\n\t name = '[' + key + ']';\n\t }\n\t if (!str) {\n\t if (ctx.seen.indexOf(desc.value) < 0) {\n\t if (isNull(recurseTimes)) {\n\t str = formatValue(ctx, desc.value, null);\n\t } else {\n\t str = formatValue(ctx, desc.value, recurseTimes - 1);\n\t }\n\t if (str.indexOf('\\n') > -1) {\n\t if (array) {\n\t str = str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n').substr(2);\n\t } else {\n\t str = '\\n' + str.split('\\n').map(function(line) {\n\t return ' ' + line;\n\t }).join('\\n');\n\t }\n\t }\n\t } else {\n\t str = ctx.stylize('[Circular]', 'special');\n\t }\n\t }\n\t if (isUndefined(name)) {\n\t if (array && key.match(/^\\d+$/)) {\n\t return str;\n\t }\n\t name = JSON.stringify('' + key);\n\t if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n\t name = name.substr(1, name.length - 2);\n\t name = ctx.stylize(name, 'name');\n\t } else {\n\t name = name.replace(/'/g, \"\\\\'\")\n\t .replace(/\\\\\"/g, '\"')\n\t .replace(/(^\"|\"$)/g, \"'\");\n\t name = ctx.stylize(name, 'string');\n\t }\n\t }\n\t\n\t return name + ': ' + str;\n\t}\n\t\n\t\n\tfunction reduceToSingleString(output, base, braces) {\n\t var numLinesEst = 0;\n\t var length = output.reduce(function(prev, cur) {\n\t numLinesEst++;\n\t if (cur.indexOf('\\n') >= 0) numLinesEst++;\n\t return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n\t }, 0);\n\t\n\t if (length > 60) {\n\t return braces[0] +\n\t (base === '' ? '' : base + '\\n ') +\n\t ' ' +\n\t output.join(',\\n ') +\n\t ' ' +\n\t braces[1];\n\t }\n\t\n\t return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n\t}\n\t\n\t\n\t// NOTE: These type checking functions intentionally don't use `instanceof`\n\t// because it is fragile and can be easily faked with `Object.create()`.\n\tfunction isArray(ar) {\n\t return Array.isArray(ar);\n\t}\n\texports.isArray = isArray;\n\t\n\tfunction isBoolean(arg) {\n\t return typeof arg === 'boolean';\n\t}\n\texports.isBoolean = isBoolean;\n\t\n\tfunction isNull(arg) {\n\t return arg === null;\n\t}\n\texports.isNull = isNull;\n\t\n\tfunction isNullOrUndefined(arg) {\n\t return arg == null;\n\t}\n\texports.isNullOrUndefined = isNullOrUndefined;\n\t\n\tfunction isNumber(arg) {\n\t return typeof arg === 'number';\n\t}\n\texports.isNumber = isNumber;\n\t\n\tfunction isString(arg) {\n\t return typeof arg === 'string';\n\t}\n\texports.isString = isString;\n\t\n\tfunction isSymbol(arg) {\n\t return typeof arg === 'symbol';\n\t}\n\texports.isSymbol = isSymbol;\n\t\n\tfunction isUndefined(arg) {\n\t return arg === void 0;\n\t}\n\texports.isUndefined = isUndefined;\n\t\n\tfunction isRegExp(re) {\n\t return isObject(re) && objectToString(re) === '[object RegExp]';\n\t}\n\texports.isRegExp = isRegExp;\n\t\n\tfunction isObject(arg) {\n\t return typeof arg === 'object' && arg !== null;\n\t}\n\texports.isObject = isObject;\n\t\n\tfunction isDate(d) {\n\t return isObject(d) && objectToString(d) === '[object Date]';\n\t}\n\texports.isDate = isDate;\n\t\n\tfunction isError(e) {\n\t return isObject(e) &&\n\t (objectToString(e) === '[object Error]' || e instanceof Error);\n\t}\n\texports.isError = isError;\n\t\n\tfunction isFunction(arg) {\n\t return typeof arg === 'function';\n\t}\n\texports.isFunction = isFunction;\n\t\n\tfunction isPrimitive(arg) {\n\t return arg === null ||\n\t typeof arg === 'boolean' ||\n\t typeof arg === 'number' ||\n\t typeof arg === 'string' ||\n\t typeof arg === 'symbol' || // ES6 symbol\n\t typeof arg === 'undefined';\n\t}\n\texports.isPrimitive = isPrimitive;\n\t\n\texports.isBuffer = __webpack_require__(46);\n\t\n\tfunction objectToString(o) {\n\t return Object.prototype.toString.call(o);\n\t}\n\t\n\t\n\tfunction pad(n) {\n\t return n < 10 ? '0' + n.toString(10) : n.toString(10);\n\t}\n\t\n\t\n\tvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n\t 'Oct', 'Nov', 'Dec'];\n\t\n\t// 26 Feb 16:19:34\n\tfunction timestamp() {\n\t var d = new Date();\n\t var time = [pad(d.getHours()),\n\t pad(d.getMinutes()),\n\t pad(d.getSeconds())].join(':');\n\t return [d.getDate(), months[d.getMonth()], time].join(' ');\n\t}\n\t\n\t\n\t// log is just a thin wrapper to console.log that prepends a timestamp\n\texports.log = function() {\n\t console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n\t};\n\t\n\t\n\t/**\n\t * Inherit the prototype methods from one constructor into another.\n\t *\n\t * The Function.prototype.inherits from lang.js rewritten as a standalone\n\t * function (not on Function.prototype). NOTE: If this file is to be loaded\n\t * during bootstrapping this function needs to be rewritten using some native\n\t * functions as prototype setup using normal JavaScript does not work as\n\t * expected during bootstrapping (see mirror.js in r114903).\n\t *\n\t * @param {function} ctor Constructor function which needs to inherit the\n\t * prototype.\n\t * @param {function} superCtor Constructor function to inherit prototype from.\n\t */\n\texports.inherits = __webpack_require__(47);\n\t\n\texports._extend = function(origin, add) {\n\t // Don't do anything if add isn't an object\n\t if (!add || !isObject(add)) return origin;\n\t\n\t var keys = Object.keys(add);\n\t var i = keys.length;\n\t while (i--) {\n\t origin[keys[i]] = add[keys[i]];\n\t }\n\t return origin;\n\t};\n\t\n\tfunction hasOwnProperty(obj, prop) {\n\t return Object.prototype.hasOwnProperty.call(obj, prop);\n\t}\n\t\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(43)))\n\n/***/ },\n/* 46 */\n/***/ function(module, exports) {\n\n\tmodule.exports = function isBuffer(arg) {\n\t return arg && typeof arg === 'object'\n\t && typeof arg.copy === 'function'\n\t && typeof arg.fill === 'function'\n\t && typeof arg.readUInt8 === 'function';\n\t}\n\n/***/ },\n/* 47 */\n/***/ function(module, exports) {\n\n\tif (typeof Object.create === 'function') {\n\t // implementation from standard node.js 'util' module\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t ctor.prototype = Object.create(superCtor.prototype, {\n\t constructor: {\n\t value: ctor,\n\t enumerable: false,\n\t writable: true,\n\t configurable: true\n\t }\n\t });\n\t };\n\t} else {\n\t // old school shim for old browsers\n\t module.exports = function inherits(ctor, superCtor) {\n\t ctor.super_ = superCtor\n\t var TempCtor = function () {}\n\t TempCtor.prototype = superCtor.prototype\n\t ctor.prototype = new TempCtor()\n\t ctor.prototype.constructor = ctor\n\t }\n\t}\n\n\n/***/ },\n/* 48 */\n/***/ function(module, exports) {\n\n\tmodule.exports = Yallist\n\t\n\tYallist.Node = Node\n\tYallist.create = Yallist\n\t\n\tfunction Yallist (list) {\n\t var self = this\n\t if (!(self instanceof Yallist)) {\n\t self = new Yallist()\n\t }\n\t\n\t self.tail = null\n\t self.head = null\n\t self.length = 0\n\t\n\t if (list && typeof list.forEach === 'function') {\n\t list.forEach(function (item) {\n\t self.push(item)\n\t })\n\t } else if (arguments.length > 0) {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t self.push(arguments[i])\n\t }\n\t }\n\t\n\t return self\n\t}\n\t\n\tYallist.prototype.removeNode = function (node) {\n\t if (node.list !== this) {\n\t throw new Error('removing node which does not belong to this list')\n\t }\n\t\n\t var next = node.next\n\t var prev = node.prev\n\t\n\t if (next) {\n\t next.prev = prev\n\t }\n\t\n\t if (prev) {\n\t prev.next = next\n\t }\n\t\n\t if (node === this.head) {\n\t this.head = next\n\t }\n\t if (node === this.tail) {\n\t this.tail = prev\n\t }\n\t\n\t node.list.length --\n\t node.next = null\n\t node.prev = null\n\t node.list = null\n\t}\n\t\n\tYallist.prototype.unshiftNode = function (node) {\n\t if (node === this.head) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var head = this.head\n\t node.list = this\n\t node.next = head\n\t if (head) {\n\t head.prev = node\n\t }\n\t\n\t this.head = node\n\t if (!this.tail) {\n\t this.tail = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.pushNode = function (node) {\n\t if (node === this.tail) {\n\t return\n\t }\n\t\n\t if (node.list) {\n\t node.list.removeNode(node)\n\t }\n\t\n\t var tail = this.tail\n\t node.list = this\n\t node.prev = tail\n\t if (tail) {\n\t tail.next = node\n\t }\n\t\n\t this.tail = node\n\t if (!this.head) {\n\t this.head = node\n\t }\n\t this.length ++\n\t}\n\t\n\tYallist.prototype.push = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t push(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.unshift = function () {\n\t for (var i = 0, l = arguments.length; i < l; i++) {\n\t unshift(this, arguments[i])\n\t }\n\t return this.length\n\t}\n\t\n\tYallist.prototype.pop = function () {\n\t if (!this.tail)\n\t return undefined\n\t\n\t var res = this.tail.value\n\t this.tail = this.tail.prev\n\t this.tail.next = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.shift = function () {\n\t if (!this.head)\n\t return undefined\n\t\n\t var res = this.head.value\n\t this.head = this.head.next\n\t this.head.prev = null\n\t this.length --\n\t return res\n\t}\n\t\n\tYallist.prototype.forEach = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.head, i = 0; walker !== null; i++) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.next\n\t }\n\t}\n\t\n\tYallist.prototype.forEachReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n\t fn.call(thisp, walker.value, i, this)\n\t walker = walker.prev\n\t }\n\t}\n\t\n\tYallist.prototype.get = function (n) {\n\t for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.next\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.getReverse = function (n) {\n\t for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n\t // abort out of the list early if we hit a cycle\n\t walker = walker.prev\n\t }\n\t if (i === n && walker !== null) {\n\t return walker.value\n\t }\n\t}\n\t\n\tYallist.prototype.map = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.head; walker !== null; ) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.next\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.mapReverse = function (fn, thisp) {\n\t thisp = thisp || this\n\t var res = new Yallist()\n\t for (var walker = this.tail; walker !== null;) {\n\t res.push(fn.call(thisp, walker.value, this))\n\t walker = walker.prev\n\t }\n\t return res\n\t}\n\t\n\tYallist.prototype.reduce = function (fn, initial) {\n\t var acc\n\t var walker = this.head\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.head) {\n\t walker = this.head.next\n\t acc = this.head.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = 0; walker !== null; i++) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.next\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.reduceReverse = function (fn, initial) {\n\t var acc\n\t var walker = this.tail\n\t if (arguments.length > 1) {\n\t acc = initial\n\t } else if (this.tail) {\n\t walker = this.tail.prev\n\t acc = this.tail.value\n\t } else {\n\t throw new TypeError('Reduce of empty list with no initial value')\n\t }\n\t\n\t for (var i = this.length - 1; walker !== null; i--) {\n\t acc = fn(acc, walker.value, i)\n\t walker = walker.prev\n\t }\n\t\n\t return acc\n\t}\n\t\n\tYallist.prototype.toArray = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.head; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.next\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.toArrayReverse = function () {\n\t var arr = new Array(this.length)\n\t for (var i = 0, walker = this.tail; walker !== null; i++) {\n\t arr[i] = walker.value\n\t walker = walker.prev\n\t }\n\t return arr\n\t}\n\t\n\tYallist.prototype.slice = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n\t walker = walker.next\n\t }\n\t for (; walker !== null && i < to; i++, walker = walker.next) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.sliceReverse = function (from, to) {\n\t to = to || this.length\n\t if (to < 0) {\n\t to += this.length\n\t }\n\t from = from || 0\n\t if (from < 0) {\n\t from += this.length\n\t }\n\t var ret = new Yallist()\n\t if (to < from || to < 0) {\n\t return ret\n\t }\n\t if (from < 0) {\n\t from = 0\n\t }\n\t if (to > this.length) {\n\t to = this.length\n\t }\n\t for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n\t walker = walker.prev\n\t }\n\t for (; walker !== null && i > from; i--, walker = walker.prev) {\n\t ret.push(walker.value)\n\t }\n\t return ret\n\t}\n\t\n\tYallist.prototype.reverse = function () {\n\t var head = this.head\n\t var tail = this.tail\n\t for (var walker = head; walker !== null; walker = walker.prev) {\n\t var p = walker.prev\n\t walker.prev = walker.next\n\t walker.next = p\n\t }\n\t this.head = tail\n\t this.tail = head\n\t return this\n\t}\n\t\n\tfunction push (self, item) {\n\t self.tail = new Node(item, self.tail, null, self)\n\t if (!self.head) {\n\t self.head = self.tail\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction unshift (self, item) {\n\t self.head = new Node(item, null, self.head, self)\n\t if (!self.tail) {\n\t self.tail = self.head\n\t }\n\t self.length ++\n\t}\n\t\n\tfunction Node (value, prev, next, list) {\n\t if (!(this instanceof Node)) {\n\t return new Node(value, prev, next, list)\n\t }\n\t\n\t this.list = list\n\t this.value = value\n\t\n\t if (prev) {\n\t prev.next = this\n\t this.prev = prev\n\t } else {\n\t this.prev = null\n\t }\n\t\n\t if (next) {\n\t next.prev = this\n\t this.next = next\n\t } else {\n\t this.next = null\n\t }\n\t}\n\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Tile2 = __webpack_require__(50);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(51);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar ImageTile = (function (_Tile) {\n\t _inherits(ImageTile, _Tile);\n\t\n\t function ImageTile(quadcode, path, layer) {\n\t _classCallCheck(this, ImageTile);\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the tile\n\t\n\t _createClass(ImageTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t _this._requestTile();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear image reference\n\t this._image = null;\n\t\n\t _get(Object.getPrototypeOf(ImageTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t\n\t var material;\n\t if (!this._world._environment._skybox) {\n\t material = new _three2['default'].MeshBasicMaterial({\n\t depthWrite: false\n\t });\n\t\n\t // var material = new THREE.MeshPhongMaterial({\n\t // depthWrite: false\n\t // });\n\t } else {\n\t // Other MeshStandardMaterial settings\n\t //\n\t // material.envMapIntensity will change the amount of colour reflected(?)\n\t // from the environment map – can be greater than 1 for more intensity\n\t\n\t material = new _three2['default'].MeshStandardMaterial({\n\t depthWrite: false\n\t });\n\t material.roughness = 1;\n\t material.metalness = 0.1;\n\t material.envMap = this._world._environment._skybox.getRenderTarget();\n\t }\n\t\n\t var localMesh = new _three2['default'].Mesh(geom, material);\n\t localMesh.rotation.x = -90 * Math.PI / 180;\n\t\n\t localMesh.receiveShadow = true;\n\t\n\t mesh.add(localMesh);\n\t mesh.renderOrder = 0;\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t // var box = new BoxHelper(localMesh);\n\t // mesh.add(box);\n\t //\n\t // mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile() {\n\t var _this2 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t var image = document.createElement('img');\n\t\n\t image.addEventListener('load', function (event) {\n\t var texture = new _three2['default'].Texture();\n\t\n\t texture.image = image;\n\t texture.needsUpdate = true;\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t // Something went wrong and the tile or its material is missing\n\t //\n\t // Possibly removed by the cache before the image loaded\n\t if (!_this2._mesh || !_this2._mesh.children[0] || !_this2._mesh.children[0].material) {\n\t return;\n\t }\n\t\n\t _this2._mesh.children[0].material.map = texture;\n\t _this2._mesh.children[0].material.needsUpdate = true;\n\t\n\t _this2._texture = texture;\n\t _this2._ready = true;\n\t }, false);\n\t\n\t // image.addEventListener('progress', event => {}, false);\n\t // image.addEventListener('error', event => {}, false);\n\t\n\t image.crossOrigin = '';\n\t\n\t // Load image\n\t image.src = url;\n\t\n\t this._image = image;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._image) {\n\t return;\n\t }\n\t\n\t this._image.src = '';\n\t }\n\t }]);\n\t\n\t return ImageTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer) {\n\t return new ImageTile(quadcode, path, layer);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// Manages a single tile and its layers\n\t\n\tvar r2d = 180 / Math.PI;\n\t\n\tvar tileURLRegex = /\\{([szxy])\\}/g;\n\t\n\tvar Tile = (function () {\n\t function Tile(quadcode, path, layer) {\n\t _classCallCheck(this, Tile);\n\t\n\t this._layer = layer;\n\t this._world = layer._world;\n\t this._quadcode = quadcode;\n\t this._path = path;\n\t\n\t this._ready = false;\n\t\n\t this._tile = this._quadcodeToTile(quadcode);\n\t\n\t // Bottom-left and top-right bounds in WGS84 coordinates\n\t this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\t\n\t // Bottom-left and top-right bounds in world coordinates\n\t this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\t\n\t // Tile center in world coordinates\n\t this._center = this._boundsToCenter(this._boundsWorld);\n\t\n\t // Tile center in projected coordinates\n\t this._centerLatlon = this._world.pointToLatLon(VIZI.Point(this._center[0], this._center[1]));\n\t\n\t // Length of a tile side in world coorindates\n\t this._side = this._getSide(this._boundsWorld);\n\t\n\t // Point scale for tile (for unit conversion)\n\t this._pointScale = this._world.pointScale(this._centerLatlon);\n\t }\n\t\n\t // Returns true if the tile mesh and texture are ready to be used\n\t // Otherwise, returns false\n\t\n\t _createClass(Tile, [{\n\t key: 'isReady',\n\t value: function isReady() {\n\t return this._ready;\n\t }\n\t\n\t // Request data for the tile\n\t }, {\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {}\n\t }, {\n\t key: 'getQuadcode',\n\t value: function getQuadcode() {\n\t return this._quadcode;\n\t }\n\t }, {\n\t key: 'getBounds',\n\t value: function getBounds() {\n\t return this._boundsWorld;\n\t }\n\t }, {\n\t key: 'getCenter',\n\t value: function getCenter() {\n\t return this._center;\n\t }\n\t }, {\n\t key: 'getSide',\n\t value: function getSide() {\n\t return this._side;\n\t }\n\t }, {\n\t key: 'getMesh',\n\t value: function getMesh() {\n\t return this._mesh;\n\t }\n\t\n\t // Destroys the tile and removes it from the layer and memory\n\t //\n\t // Ensure that this leaves no trace of the tile – no textures, no meshes,\n\t // nothing in memory or the GPU\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Delete reference to layer and world\n\t this._layer = null;\n\t this._world = null;\n\t\n\t // Delete location references\n\t this._boundsLatLon = null;\n\t this._boundsWorld = null;\n\t this._center = null;\n\t\n\t // Done if no mesh\n\t if (!this._mesh) {\n\t return;\n\t }\n\t\n\t if (this._mesh.children) {\n\t // Dispose of mesh and materials\n\t this._mesh.children.forEach(function (child) {\n\t child.geometry.dispose();\n\t child.geometry = null;\n\t\n\t if (child.material.map) {\n\t child.material.map.dispose();\n\t child.material.map = null;\n\t }\n\t\n\t child.material.dispose();\n\t child.material = null;\n\t });\n\t } else {\n\t this._mesh.geometry.dispose();\n\t this._mesh.geometry = null;\n\t\n\t if (this._mesh.material.map) {\n\t this._mesh.material.map.dispose();\n\t this._mesh.material.map = null;\n\t }\n\t\n\t this._mesh.material.dispose();\n\t this._mesh.material = null;\n\t }\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {}\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {}\n\t }, {\n\t key: '_getTileURL',\n\t value: function _getTileURL(urlParams) {\n\t if (!urlParams.s) {\n\t // Default to a random choice of a, b or c\n\t urlParams.s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n\t }\n\t\n\t tileURLRegex.lastIndex = 0;\n\t return this._path.replace(tileURLRegex, function (value, key) {\n\t // Replace with paramter, otherwise keep existing value\n\t return urlParams[key];\n\t });\n\t }\n\t\n\t // Convert from quadcode to TMS tile coordinates\n\t }, {\n\t key: '_quadcodeToTile',\n\t value: function _quadcodeToTile(quadcode) {\n\t var x = 0;\n\t var y = 0;\n\t var z = quadcode.length;\n\t\n\t for (var i = z; i > 0; i--) {\n\t var mask = 1 << i - 1;\n\t var q = +quadcode[z - i];\n\t if (q === 1) {\n\t x |= mask;\n\t }\n\t if (q === 2) {\n\t y |= mask;\n\t }\n\t if (q === 3) {\n\t x |= mask;\n\t y |= mask;\n\t }\n\t }\n\t\n\t return [x, y, z];\n\t }\n\t\n\t // Convert WGS84 tile bounds to world coordinates\n\t }, {\n\t key: '_tileBoundsFromWGS84',\n\t value: function _tileBoundsFromWGS84(boundsWGS84) {\n\t var sw = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[1], boundsWGS84[0]));\n\t var ne = this._layer._world.latLonToPoint((0, _geoLatLon2['default'])(boundsWGS84[3], boundsWGS84[2]));\n\t\n\t return [sw.x, sw.y, ne.x, ne.y];\n\t }\n\t\n\t // Get tile bounds in WGS84 coordinates\n\t }, {\n\t key: '_tileBoundsWGS84',\n\t value: function _tileBoundsWGS84(tile) {\n\t var e = this._tile2lon(tile[0] + 1, tile[2]);\n\t var w = this._tile2lon(tile[0], tile[2]);\n\t var s = this._tile2lat(tile[1] + 1, tile[2]);\n\t var n = this._tile2lat(tile[1], tile[2]);\n\t return [w, s, e, n];\n\t }\n\t }, {\n\t key: '_tile2lon',\n\t value: function _tile2lon(x, z) {\n\t return x / Math.pow(2, z) * 360 - 180;\n\t }\n\t }, {\n\t key: '_tile2lat',\n\t value: function _tile2lat(y, z) {\n\t var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n\t return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n\t }\n\t }, {\n\t key: '_boundsToCenter',\n\t value: function _boundsToCenter(bounds) {\n\t var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n\t var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\t\n\t return [x, y];\n\t }\n\t }, {\n\t key: '_getSide',\n\t value: function _getSide(bounds) {\n\t return new _three2['default'].Vector3(bounds[0], 0, bounds[3]).sub(new _three2['default'].Vector3(bounds[0], 0, bounds[1])).length();\n\t }\n\t }]);\n\t\n\t return Tile;\n\t})();\n\t\n\texports['default'] = Tile;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t\tvalue: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t// jscs:disable\n\t/*eslint eqeqeq:0*/\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\t\n\tBoxHelper = function (object) {\n\t\n\t\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\t\tvar positions = new Float32Array(8 * 3);\n\t\n\t\tvar geometry = new _three2['default'].BufferGeometry();\n\t\tgeometry.setIndex(new _three2['default'].BufferAttribute(indices, 1));\n\t\tgeometry.addAttribute('position', new _three2['default'].BufferAttribute(positions, 3));\n\t\n\t\t_three2['default'].LineSegments.call(this, geometry, new _three2['default'].LineBasicMaterial({ linewidth: 2, color: 0xff0000 }));\n\t\n\t\tif (object !== undefined) {\n\t\n\t\t\tthis.update(object);\n\t\t}\n\t};\n\t\n\tBoxHelper.prototype = Object.create(_three2['default'].LineSegments.prototype);\n\tBoxHelper.prototype.constructor = BoxHelper;\n\t\n\tBoxHelper.prototype.update = (function () {\n\t\n\t\tvar box = new _three2['default'].Box3();\n\t\n\t\treturn function (object) {\n\t\n\t\t\tbox.setFromObject(object);\n\t\n\t\t\tif (box.isEmpty()) return;\n\t\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\t\n\t\t\t/*\n\t 5____4\n\t 1/___0/|\n\t | 6__|_7\n\t 2/___3/\n\t \t0: max.x, max.y, max.z\n\t 1: min.x, max.y, max.z\n\t 2: min.x, min.y, max.z\n\t 3: max.x, min.y, max.z\n\t 4: max.x, max.y, min.z\n\t 5: min.x, max.y, min.z\n\t 6: min.x, min.y, min.z\n\t 7: max.x, min.y, min.z\n\t */\n\t\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\t\n\t\t\tarray[0] = max.x;array[1] = max.y;array[2] = max.z;\n\t\t\tarray[3] = min.x;array[4] = max.y;array[5] = max.z;\n\t\t\tarray[6] = min.x;array[7] = min.y;array[8] = max.z;\n\t\t\tarray[9] = max.x;array[10] = min.y;array[11] = max.z;\n\t\t\tarray[12] = max.x;array[13] = max.y;array[14] = min.z;\n\t\t\tarray[15] = min.x;array[16] = max.y;array[17] = min.z;\n\t\t\tarray[18] = min.x;array[19] = min.y;array[20] = min.z;\n\t\t\tarray[21] = max.x;array[22] = min.y;array[23] = min.z;\n\t\n\t\t\tposition.needsUpdate = true;\n\t\n\t\t\tthis.geometry.computeBoundingSphere();\n\t\t};\n\t})();\n\t\n\texports['default'] = BoxHelper;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\texports['default'] = function (colour, skyboxTarget) {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 1;\n\t canvas.height = 1;\n\t\n\t var context = canvas.getContext('2d');\n\t context.fillStyle = colour;\n\t context.fillRect(0, 0, canvas.width, canvas.height);\n\t // context.strokeStyle = '#D0D0CF';\n\t // context.strokeRect(0, 0, canvas.width, canvas.height);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // // Silky smooth images when tilted\n\t // texture.magFilter = THREE.LinearFilter;\n\t // texture.minFilter = THREE.LinearMipMapLinearFilter;\n\t // //\n\t // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t // texture.anisotropy = 4;\n\t\n\t // texture.wrapS = THREE.RepeatWrapping;\n\t // texture.wrapT = THREE.RepeatWrapping;\n\t // texture.repeat.set(segments, segments);\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material;\n\t\n\t if (!skyboxTarget) {\n\t material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t depthWrite: false\n\t });\n\t } else {\n\t material = new _three2['default'].MeshStandardMaterial({\n\t depthWrite: false\n\t });\n\t material.roughness = 1;\n\t material.metalness = 0.1;\n\t material.envMap = skyboxTarget;\n\t }\n\t\n\t return material;\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _TileLayer2 = __webpack_require__(39);\n\t\n\tvar _TileLayer3 = _interopRequireDefault(_TileLayer2);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _TopoJSONTile = __webpack_require__(54);\n\t\n\tvar _TopoJSONTile2 = _interopRequireDefault(_TopoJSONTile);\n\t\n\tvar _lodashThrottle = __webpack_require__(36);\n\t\n\tvar _lodashThrottle2 = _interopRequireDefault(_lodashThrottle);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\t// TODO: Consider pausing per-frame output during movement so there's little to\n\t// no jank caused by previous tiles still processing\n\t\n\t// This tile layer only updates the quadtree after world movement has occurred\n\t//\n\t// Tiles from previous quadtree updates are updated and outputted every frame\n\t// (or at least every frame, throttled to some amount)\n\t//\n\t// This is because the complexity of TopoJSON tiles requires a lot of processing\n\t// and so makes movement janky if updates occur every frame – only updating\n\t// after movement means frame drops are less obvious due to heavy processing\n\t// occurring while the view is generally stationary\n\t//\n\t// The downside is that until new tiles are requested and outputted you will\n\t// see blank spaces as you orbit and move around\n\t//\n\t// An added benefit is that it dramatically reduces the number of tiles being\n\t// requested over a period of time and the time it takes to go from request to\n\t// screen output\n\t//\n\t// It may be possible to perform these updates per-frame once Web Worker\n\t// processing is added\n\t\n\tvar TopoJSONTileLayer = (function (_TileLayer) {\n\t _inherits(TopoJSONTileLayer, _TileLayer);\n\t\n\t function TopoJSONTileLayer(path, options) {\n\t _classCallCheck(this, TopoJSONTileLayer);\n\t\n\t var defaults = {\n\t maxLOD: 14,\n\t distance: 2000\n\t };\n\t\n\t options = (0, _lodashAssign2['default'])(defaults, options);\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), 'constructor', this).call(this, options);\n\t\n\t this._path = path;\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t _createClass(TopoJSONTileLayer, [{\n\t key: '_onAdd',\n\t value: function _onAdd(world) {\n\t var _this = this;\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), '_onAdd', this).call(this, world);\n\t\n\t // Trigger initial quadtree calculation on the next frame\n\t //\n\t // TODO: This is a hack to ensure the camera is all set up - a better\n\t // solution should be found\n\t setTimeout(function () {\n\t _this._calculateLOD();\n\t _this._initEvents();\n\t }, 0);\n\t }\n\t }, {\n\t key: '_initEvents',\n\t value: function _initEvents() {\n\t // Run LOD calculations based on render calls\n\t //\n\t // Throttled to 1 LOD calculation per 100ms\n\t this._throttledWorldUpdate = (0, _lodashThrottle2['default'])(this._onWorldUpdate, 100);\n\t\n\t this._world.on('preUpdate', this._throttledWorldUpdate, this);\n\t this._world.on('move', this._onWorldMove, this);\n\t this._world.on('controlsMove', this._onControlsMove, this);\n\t }\n\t\n\t // Update and output tiles each frame (throttled)\n\t }, {\n\t key: '_onWorldUpdate',\n\t value: function _onWorldUpdate() {\n\t if (this._pauseOutput) {\n\t return;\n\t }\n\t\n\t this._outputTiles();\n\t }\n\t\n\t // Update tiles grid after world move, but don't output them\n\t }, {\n\t key: '_onWorldMove',\n\t value: function _onWorldMove(latlon, point) {\n\t this._pauseOutput = false;\n\t this._calculateLOD();\n\t }\n\t\n\t // Pause updates during control movement for less visual jank\n\t }, {\n\t key: '_onControlsMove',\n\t value: function _onControlsMove() {\n\t this._pauseOutput = true;\n\t }\n\t }, {\n\t key: '_createTile',\n\t value: function _createTile(quadcode, layer) {\n\t var options = {};\n\t\n\t if (this._options.filter) {\n\t options.filter = this._options.filter;\n\t }\n\t\n\t if (this._options.style) {\n\t options.style = this._options.style;\n\t }\n\t\n\t return (0, _TopoJSONTile2['default'])(quadcode, this._path, layer, options);\n\t }\n\t\n\t // Destroys the layer and removes it from the scene and memory\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this._world.off('preUpdate', this._throttledWorldUpdate);\n\t this._world.off('move', this._onWorldMove);\n\t\n\t this._throttledWorldUpdate = null;\n\t\n\t // Run common destruction logic from parent\n\t _get(Object.getPrototypeOf(TopoJSONTileLayer.prototype), 'destroy', this).call(this);\n\t }\n\t }]);\n\t\n\t return TopoJSONTileLayer;\n\t})(_TileLayer3['default']);\n\t\n\texports['default'] = function (path, options) {\n\t return new TopoJSONTileLayer(path, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _Tile2 = __webpack_require__(50);\n\t\n\tvar _Tile3 = _interopRequireDefault(_Tile2);\n\t\n\tvar _vendorBoxHelper = __webpack_require__(51);\n\t\n\tvar _vendorBoxHelper2 = _interopRequireDefault(_vendorBoxHelper);\n\t\n\tvar _three = __webpack_require__(24);\n\t\n\tvar _three2 = _interopRequireDefault(_three);\n\t\n\tvar _reqwest = __webpack_require__(55);\n\t\n\tvar _reqwest2 = _interopRequireDefault(_reqwest);\n\t\n\tvar _topojson = __webpack_require__(57);\n\t\n\tvar _topojson2 = _interopRequireDefault(_topojson);\n\t\n\tvar _geoPoint = __webpack_require__(11);\n\t\n\tvar _geoPoint2 = _interopRequireDefault(_geoPoint);\n\t\n\tvar _geoLatLon = __webpack_require__(10);\n\t\n\tvar _geoLatLon2 = _interopRequireDefault(_geoLatLon);\n\t\n\tvar _earcut = __webpack_require__(58);\n\t\n\tvar _earcut2 = _interopRequireDefault(_earcut);\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar _utilExtrudePolygon = __webpack_require__(59);\n\t\n\tvar _utilExtrudePolygon2 = _interopRequireDefault(_utilExtrudePolygon);\n\t\n\tvar _polygonOffset = __webpack_require__(60);\n\t\n\tvar _polygonOffset2 = _interopRequireDefault(_polygonOffset);\n\t\n\t// TODO: Perform tile request and processing in a Web Worker\n\t//\n\t// Use Operative (https://github.com/padolsey/operative)\n\t//\n\t// Would it make sense to have the worker functionality defined in a static\n\t// method so it only gets initialised once and not on every tile instance?\n\t//\n\t// Otherwise, worker processing logic would have to go in the tile layer so not\n\t// to waste loads of time setting up a brand new worker with three.js for each\n\t// tile every single time.\n\t//\n\t// Unsure of the best way to get three.js and VIZI into the worker\n\t//\n\t// Would need to set up a CRS / projection identical to the world instance\n\t//\n\t// Is it possible to bypass requirements on external script by having multiple\n\t// simple worker methods that each take enough inputs to perform a single task\n\t// without requiring VIZI or three.js? So long as the heaviest logic is done in\n\t// the worker and transferrable objects are used then it should be better than\n\t// nothing. Would probably still need things like earcut...\n\t//\n\t// After all, the three.js logic and object creation will still need to be\n\t// done on the main thread regardless so the worker should try to do as much as\n\t// possible with as few dependencies as possible.\n\t//\n\t// Have a look at how this is done in Tangram before implementing anything as\n\t// the approach there is pretty similar and robust.\n\t\n\tvar TopoJSONTile = (function (_Tile) {\n\t _inherits(TopoJSONTile, _Tile);\n\t\n\t function TopoJSONTile(quadcode, path, layer, options) {\n\t _classCallCheck(this, TopoJSONTile);\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTile.prototype), 'constructor', this).call(this, quadcode, path, layer);\n\t\n\t var defaults = {\n\t filter: null,\n\t style: {\n\t color: '#ffffff'\n\t }\n\t };\n\t\n\t this._options = (0, _lodashAssign2['default'])(defaults, options);\n\t }\n\t\n\t // Initialise without requiring new keyword\n\t\n\t // Request data for the tile\n\t\n\t _createClass(TopoJSONTile, [{\n\t key: 'requestTileAsync',\n\t value: function requestTileAsync() {\n\t var _this = this;\n\t\n\t // Making this asynchronous really speeds up the LOD framerate\n\t setTimeout(function () {\n\t if (!_this._mesh) {\n\t _this._mesh = _this._createMesh();\n\t // this._shadowCanvas = this._createShadowCanvas();\n\t _this._requestTile();\n\t }\n\t }, 0);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t // Cancel any pending requests\n\t this._abortRequest();\n\t\n\t // Clear request reference\n\t this._request = null;\n\t\n\t _get(Object.getPrototypeOf(TopoJSONTile.prototype), 'destroy', this).call(this);\n\t }\n\t }, {\n\t key: '_createMesh',\n\t value: function _createMesh() {\n\t // Something went wrong and the tile\n\t //\n\t // Possibly removed by the cache before loaded\n\t if (!this._center) {\n\t return;\n\t }\n\t\n\t var mesh = new _three2['default'].Object3D();\n\t\n\t mesh.position.x = this._center[0];\n\t mesh.position.z = this._center[1];\n\t\n\t // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\t //\n\t // var material = new THREE.MeshBasicMaterial({\n\t // depthWrite: false\n\t // });\n\t //\n\t // var localMesh = new THREE.Mesh(geom, material);\n\t // localMesh.rotation.x = -90 * Math.PI / 180;\n\t //\n\t // mesh.add(localMesh);\n\t //\n\t // var box = new BoxHelper(localMesh);\n\t // mesh.add(box);\n\t //\n\t // mesh.add(this._createDebugMesh());\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createDebugMesh',\n\t value: function _createDebugMesh() {\n\t var canvas = document.createElement('canvas');\n\t canvas.width = 256;\n\t canvas.height = 256;\n\t\n\t var context = canvas.getContext('2d');\n\t context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n\t context.fillStyle = '#ff0000';\n\t context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n\t context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\t\n\t var texture = new _three2['default'].Texture(canvas);\n\t\n\t // Silky smooth images when tilted\n\t texture.magFilter = _three2['default'].LinearFilter;\n\t texture.minFilter = _three2['default'].LinearMipMapLinearFilter;\n\t\n\t // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t texture.anisotropy = 4;\n\t\n\t texture.needsUpdate = true;\n\t\n\t var material = new _three2['default'].MeshBasicMaterial({\n\t map: texture,\n\t transparent: true,\n\t depthWrite: false\n\t });\n\t\n\t var geom = new _three2['default'].PlaneBufferGeometry(this._side, this._side, 1);\n\t var mesh = new _three2['default'].Mesh(geom, material);\n\t\n\t mesh.rotation.x = -90 * Math.PI / 180;\n\t mesh.position.y = 0.1;\n\t\n\t return mesh;\n\t }\n\t }, {\n\t key: '_createShadowCanvas',\n\t value: function _createShadowCanvas() {\n\t var canvas = document.createElement('canvas');\n\t\n\t // Rendered at a low resolution and later scaled up for a low-quality blur\n\t canvas.width = 512;\n\t canvas.height = 512;\n\t\n\t return canvas;\n\t }\n\t }, {\n\t key: '_addShadow',\n\t value: function _addShadow(coordinates) {\n\t var _this2 = this;\n\t\n\t var ctx = this._shadowCanvas.getContext('2d');\n\t var width = this._shadowCanvas.width;\n\t var height = this._shadowCanvas.height;\n\t\n\t var _coords;\n\t var _offset;\n\t var offset = new _polygonOffset2['default']();\n\t\n\t // Transform coordinates to shadowCanvas space and draw on canvas\n\t coordinates.forEach(function (ring, index) {\n\t ctx.beginPath();\n\t\n\t _coords = ring.map(function (coord) {\n\t var xFrac = (coord[0] - _this2._boundsWorld[0]) / _this2._side;\n\t var yFrac = (coord[1] - _this2._boundsWorld[3]) / _this2._side;\n\t return [xFrac * width, yFrac * height];\n\t });\n\t\n\t if (index > 0) {\n\t _offset = _coords;\n\t } else {\n\t _offset = offset.data(_coords).padding(1.3);\n\t }\n\t\n\t // TODO: This is super flaky and crashes the browser if run on anything\n\t // put the outer ring (potentially due to winding)\n\t _offset.forEach(function (coord, index) {\n\t // var xFrac = (coord[0] - this._boundsWorld[0]) / this._side;\n\t // var yFrac = (coord[1] - this._boundsWorld[3]) / this._side;\n\t\n\t if (index === 0) {\n\t ctx.moveTo(coord[0], coord[1]);\n\t } else {\n\t ctx.lineTo(coord[0], coord[1]);\n\t }\n\t });\n\t\n\t ctx.closePath();\n\t });\n\t\n\t ctx.fillStyle = 'rgba(80, 80, 80, 0.7)';\n\t ctx.fill();\n\t }\n\t }, {\n\t key: '_requestTile',\n\t value: function _requestTile() {\n\t var _this3 = this;\n\t\n\t var urlParams = {\n\t x: this._tile[0],\n\t y: this._tile[1],\n\t z: this._tile[2]\n\t };\n\t\n\t var url = this._getTileURL(urlParams);\n\t\n\t this._request = (0, _reqwest2['default'])({\n\t url: url,\n\t type: 'json',\n\t crossOrigin: true\n\t }).then(function (res) {\n\t // Clear request reference\n\t _this3._request = null;\n\t _this3._processTileData(res);\n\t })['catch'](function (err) {\n\t console.error(err);\n\t\n\t // Clear request reference\n\t _this3._request = null;\n\t });\n\t }\n\t }, {\n\t key: '_processTileData',\n\t value: function _processTileData(data) {\n\t var _this4 = this;\n\t\n\t console.time(this._tile);\n\t\n\t var geojson = _topojson2['default'].feature(data, data.objects.vectile);\n\t\n\t var offset = (0, _geoPoint2['default'])(0, 0);\n\t offset.x = -1 * this._center[0];\n\t offset.y = -1 * this._center[1];\n\t\n\t var coordinates;\n\t var earcutData;\n\t var faces;\n\t\n\t var allVertices = [];\n\t var allFaces = [];\n\t var allColours = [];\n\t var facesCount = 0;\n\t\n\t var colour = new _three2['default'].Color();\n\t\n\t var light = new _three2['default'].Color(0xffffff);\n\t var shadow = new _three2['default'].Color(0x666666);\n\t\n\t var features = geojson.features;\n\t\n\t // Run filter, if provided\n\t if (this._options.filter) {\n\t features = geojson.features.filter(this._options.filter);\n\t }\n\t\n\t var style = this._options.style;\n\t\n\t features.forEach(function (feature) {\n\t // feature.geometry, feature.properties\n\t\n\t // Get style object, if provided\n\t if (typeof _this4._options.style === 'function') {\n\t style = _this4._options.style(feature);\n\t }\n\t\n\t var coordinates = feature.geometry.coordinates;\n\t\n\t // Skip if geometry is a point\n\t //\n\t // This should be a user-defined filter as it would be wrong to assume\n\t // that people won't want to output points\n\t //\n\t // The default use-case should be to output points in a different way\n\t if (!coordinates[0] || !coordinates[0][0] || !Array.isArray(coordinates[0][0])) {\n\t return;\n\t }\n\t\n\t coordinates = coordinates.map(function (ring) {\n\t return ring.map(function (coordinate) {\n\t var latlon = (0, _geoLatLon2['default'])(coordinate[1], coordinate[0]);\n\t var point = _this4._layer._world.latLonToPoint(latlon);\n\t return [point.x, point.y];\n\t });\n\t });\n\t\n\t // Draw footprint on shadow canvas\n\t //\n\t // TODO: Disabled for the time-being until it can be sped up / moved to\n\t // a worker\n\t // this._addShadow(coordinates);\n\t\n\t earcutData = _this4._toEarcut(coordinates);\n\t\n\t faces = _this4._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\t\n\t var groupedVertices = [];\n\t for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) {\n\t groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions));\n\t }\n\t\n\t var height = 0;\n\t\n\t if (style.height) {\n\t height = _this4._world.metresToWorld(style.height, _this4._pointScale);\n\t }\n\t\n\t var extruded = (0, _utilExtrudePolygon2['default'])(groupedVertices, faces, {\n\t bottom: 0,\n\t top: height\n\t });\n\t\n\t colour.set(style.color);\n\t\n\t var topColor = colour.clone().multiply(light);\n\t var bottomColor = colour.clone().multiply(shadow);\n\t\n\t var _faces = [];\n\t var _colours = [];\n\t\n\t allVertices.push(extruded.positions);\n\t\n\t var _colour;\n\t extruded.top.forEach(function (face, fi) {\n\t _colour = [];\n\t\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t _colour.push([colour.r, colour.g, colour.b]);\n\t\n\t _faces.push(face);\n\t _colours.push(_colour);\n\t });\n\t\n\t // Set up colours for every vertex with poor-mans AO on the sides\n\t extruded.sides.forEach(function (face, fi) {\n\t _colour = [];\n\t\n\t // First face is always bottom-bottom-top\n\t if (fi % 2 === 0) {\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t // Reverse winding for the second face\n\t // top-top-bottom\n\t } else {\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t _colour.push([topColor.r, topColor.g, topColor.b]);\n\t _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n\t }\n\t\n\t _faces.push(face);\n\t _colours.push(_colour);\n\t });\n\t\n\t // Skip bottom as there's no point rendering it\n\t // allFaces.push(extruded.faces);\n\t\n\t allFaces.push(_faces);\n\t allColours.push(_colours);\n\t\n\t facesCount += _faces.length;\n\t });\n\t\n\t // Output shadow canvas\n\t //\n\t // TODO: Disabled for the time-being until it can be sped up / moved to\n\t // a worker\n\t\n\t // var texture = new THREE.Texture(this._shadowCanvas);\n\t //\n\t // // Silky smooth images when tilted\n\t // texture.magFilter = THREE.LinearFilter;\n\t // texture.minFilter = THREE.LinearMipMapLinearFilter;\n\t //\n\t // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n\t // texture.anisotropy = 4;\n\t //\n\t // texture.needsUpdate = true;\n\t //\n\t // var material;\n\t // if (!this._world._environment._skybox) {\n\t // material = new THREE.MeshBasicMaterial({\n\t // map: texture,\n\t // transparent: true,\n\t // depthWrite: false\n\t // });\n\t // } else {\n\t // material = new THREE.MeshStandardMaterial({\n\t // map: texture,\n\t // transparent: true,\n\t // depthWrite: false\n\t // });\n\t // material.roughness = 1;\n\t // material.metalness = 0.1;\n\t // material.envMap = this._world._environment._skybox.getRenderTarget();\n\t // }\n\t //\n\t // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\t // var mesh = new THREE.Mesh(geom, material);\n\t //\n\t // mesh.castShadow = false;\n\t // mesh.receiveShadow = false;\n\t // mesh.renderOrder = 1;\n\t //\n\t // mesh.rotation.x = -90 * Math.PI / 180;\n\t //\n\t // this._mesh.add(mesh);\n\t\n\t // Skip if no faces\n\t //\n\t // Need to check way before this if there are no faces, before even doing\n\t // earcut triangulation.\n\t if (facesCount === 0) {\n\t this._ready = true;\n\t return;\n\t }\n\t\n\t var geometry = new _three2['default'].BufferGeometry();\n\t\n\t // Three components per vertex per face (3 x 3 = 9)\n\t var vertices = new Float32Array(facesCount * 9);\n\t var normals = new Float32Array(facesCount * 9);\n\t var colours = new Float32Array(facesCount * 9);\n\t\n\t var pA = new _three2['default'].Vector3();\n\t var pB = new _three2['default'].Vector3();\n\t var pC = new _three2['default'].Vector3();\n\t\n\t var cb = new _three2['default'].Vector3();\n\t var ab = new _three2['default'].Vector3();\n\t\n\t var dim = 2;\n\t\n\t var index;\n\t var _faces;\n\t var _vertices;\n\t var _colour;\n\t var lastIndex = 0;\n\t for (var i = 0; i < allFaces.length; i++) {\n\t _faces = allFaces[i];\n\t _vertices = allVertices[i];\n\t _colour = allColours[i];\n\t\n\t for (var j = 0; j < _faces.length; j++) {\n\t // Array of vertex indexes for the face\n\t index = _faces[j][0];\n\t\n\t var ax = _vertices[index][0] + offset.x;\n\t var ay = _vertices[index][1];\n\t var az = _vertices[index][2] + offset.y;\n\t\n\t var c1 = _colour[j][0];\n\t\n\t index = _faces[j][1];\n\t\n\t var bx = _vertices[index][0] + offset.x;\n\t var by = _vertices[index][1];\n\t var bz = _vertices[index][2] + offset.y;\n\t\n\t var c2 = _colour[j][1];\n\t\n\t index = _faces[j][2];\n\t\n\t var cx = _vertices[index][0] + offset.x;\n\t var cy = _vertices[index][1];\n\t var cz = _vertices[index][2] + offset.y;\n\t\n\t var c3 = _colour[j][2];\n\t\n\t // Flat face normals\n\t // From: http://threejs.org/examples/webgl_buffergeometry.html\n\t pA.set(ax, ay, az);\n\t pB.set(bx, by, bz);\n\t pC.set(cx, cy, cz);\n\t\n\t cb.subVectors(pC, pB);\n\t ab.subVectors(pA, pB);\n\t cb.cross(ab);\n\t\n\t cb.normalize();\n\t\n\t var nx = cb.x;\n\t var ny = cb.y;\n\t var nz = cb.z;\n\t\n\t vertices[lastIndex * 9 + 0] = ax;\n\t vertices[lastIndex * 9 + 1] = ay;\n\t vertices[lastIndex * 9 + 2] = az;\n\t\n\t normals[lastIndex * 9 + 0] = nx;\n\t normals[lastIndex * 9 + 1] = ny;\n\t normals[lastIndex * 9 + 2] = nz;\n\t\n\t colours[lastIndex * 9 + 0] = c1[0];\n\t colours[lastIndex * 9 + 1] = c1[1];\n\t colours[lastIndex * 9 + 2] = c1[2];\n\t\n\t vertices[lastIndex * 9 + 3] = bx;\n\t vertices[lastIndex * 9 + 4] = by;\n\t vertices[lastIndex * 9 + 5] = bz;\n\t\n\t normals[lastIndex * 9 + 3] = nx;\n\t normals[lastIndex * 9 + 4] = ny;\n\t normals[lastIndex * 9 + 5] = nz;\n\t\n\t colours[lastIndex * 9 + 3] = c2[0];\n\t colours[lastIndex * 9 + 4] = c2[1];\n\t colours[lastIndex * 9 + 5] = c2[2];\n\t\n\t vertices[lastIndex * 9 + 6] = cx;\n\t vertices[lastIndex * 9 + 7] = cy;\n\t vertices[lastIndex * 9 + 8] = cz;\n\t\n\t normals[lastIndex * 9 + 6] = nx;\n\t normals[lastIndex * 9 + 7] = ny;\n\t normals[lastIndex * 9 + 8] = nz;\n\t\n\t colours[lastIndex * 9 + 6] = c3[0];\n\t colours[lastIndex * 9 + 7] = c3[1];\n\t colours[lastIndex * 9 + 8] = c3[2];\n\t\n\t lastIndex++;\n\t }\n\t }\n\t\n\t // itemSize = 3 because there are 3 values (components) per vertex\n\t geometry.addAttribute('position', new _three2['default'].BufferAttribute(vertices, 3));\n\t geometry.addAttribute('normal', new _three2['default'].BufferAttribute(normals, 3));\n\t geometry.addAttribute('color', new _three2['default'].BufferAttribute(colours, 3));\n\t\n\t geometry.computeBoundingBox();\n\t\n\t var material;\n\t if (!this._world._environment._skybox) {\n\t material = new _three2['default'].MeshPhongMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t side: _three2['default'].BackSide\n\t });\n\t } else {\n\t material = new _three2['default'].MeshStandardMaterial({\n\t vertexColors: _three2['default'].VertexColors,\n\t side: _three2['default'].BackSide\n\t });\n\t material.roughness = 1;\n\t material.metalness = 0.1;\n\t material.envMapIntensity = 3;\n\t material.envMap = this._world._environment._skybox.getRenderTarget();\n\t }\n\t\n\t var mesh = new _three2['default'].Mesh(geometry, material);\n\t\n\t mesh.castShadow = true;\n\t mesh.receiveShadow = true;\n\t\n\t // This is only useful for flat objects\n\t // mesh.renderOrder = 1;\n\t\n\t this._mesh.add(mesh);\n\t\n\t this._ready = true;\n\t console.timeEnd(this._tile);\n\t console.log(this._tile + ': ' + features.length + ' features');\n\t }\n\t }, {\n\t key: '_toEarcut',\n\t value: function _toEarcut(data) {\n\t var dim = data[0][0].length;\n\t var result = { vertices: [], holes: [], dimensions: dim };\n\t var holeIndex = 0;\n\t\n\t for (var i = 0; i < data.length; i++) {\n\t for (var j = 0; j < data[i].length; j++) {\n\t for (var d = 0; d < dim; d++) {\n\t result.vertices.push(data[i][j][d]);\n\t }\n\t }\n\t if (i > 0) {\n\t holeIndex += data[i - 1].length;\n\t result.holes.push(holeIndex);\n\t }\n\t }\n\t\n\t return result;\n\t }\n\t }, {\n\t key: '_triangulate',\n\t value: function _triangulate(contour, holes, dim) {\n\t // console.time('earcut');\n\t\n\t var faces = (0, _earcut2['default'])(contour, holes, dim);\n\t var result = [];\n\t\n\t for (i = 0, il = faces.length; i < il; i += 3) {\n\t result.push(faces.slice(i, i + 3));\n\t }\n\t\n\t // console.timeEnd('earcut');\n\t\n\t return result;\n\t }\n\t }, {\n\t key: '_abortRequest',\n\t value: function _abortRequest() {\n\t if (!this._request) {\n\t return;\n\t }\n\t\n\t this._request.abort();\n\t }\n\t }]);\n\t\n\t return TopoJSONTile;\n\t})(_Tile3['default']);\n\t\n\texports['default'] = function (quadcode, path, layer, options) {\n\t return new TopoJSONTile(quadcode, path, layer, options);\n\t};\n\t\n\t;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\t * Reqwest! A general purpose XHR connection manager\n\t * license MIT (c) Dustin Diaz 2015\n\t * https://github.com/ded/reqwest\n\t */\n\t\n\t!function (name, context, definition) {\n\t if (typeof module != 'undefined' && module.exports) module.exports = definition()\n\t else if (true) !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n\t else context[name] = definition()\n\t}('reqwest', this, function () {\n\t\n\t var context = this\n\t\n\t if ('window' in context) {\n\t var doc = document\n\t , byTag = 'getElementsByTagName'\n\t , head = doc[byTag]('head')[0]\n\t } else {\n\t var XHR2\n\t try {\n\t XHR2 = __webpack_require__(56)\n\t } catch (ex) {\n\t throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n\t }\n\t }\n\t\n\t\n\t var httpsRe = /^http/\n\t , protocolRe = /(^\\w+):\\/\\//\n\t , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n\t , readyState = 'readyState'\n\t , contentType = 'Content-Type'\n\t , requestedWith = 'X-Requested-With'\n\t , uniqid = 0\n\t , callbackPrefix = 'reqwest_' + (+new Date())\n\t , lastValue // data stored by the most recent JSONP callback\n\t , xmlHttpRequest = 'XMLHttpRequest'\n\t , xDomainRequest = 'XDomainRequest'\n\t , noop = function () {}\n\t\n\t , isArray = typeof Array.isArray == 'function'\n\t ? Array.isArray\n\t : function (a) {\n\t return a instanceof Array\n\t }\n\t\n\t , defaultHeaders = {\n\t 'contentType': 'application/x-www-form-urlencoded'\n\t , 'requestedWith': xmlHttpRequest\n\t , 'accept': {\n\t '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n\t , 'xml': 'application/xml, text/xml'\n\t , 'html': 'text/html'\n\t , 'text': 'text/plain'\n\t , 'json': 'application/json, text/javascript'\n\t , 'js': 'application/javascript, text/javascript'\n\t }\n\t }\n\t\n\t , xhr = function(o) {\n\t // is it x-domain\n\t if (o['crossOrigin'] === true) {\n\t var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n\t if (xhr && 'withCredentials' in xhr) {\n\t return xhr\n\t } else if (context[xDomainRequest]) {\n\t return new XDomainRequest()\n\t } else {\n\t throw new Error('Browser does not support cross-origin requests')\n\t }\n\t } else if (context[xmlHttpRequest]) {\n\t return new XMLHttpRequest()\n\t } else if (XHR2) {\n\t return new XHR2()\n\t } else {\n\t return new ActiveXObject('Microsoft.XMLHTTP')\n\t }\n\t }\n\t , globalSetupOptions = {\n\t dataFilter: function (data) {\n\t return data\n\t }\n\t }\n\t\n\t function succeed(r) {\n\t var protocol = protocolRe.exec(r.url)\n\t protocol = (protocol && protocol[1]) || context.location.protocol\n\t return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n\t }\n\t\n\t function handleReadyState(r, success, error) {\n\t return function () {\n\t // use _aborted to mitigate against IE err c00c023f\n\t // (can't read props on aborted request objects)\n\t if (r._aborted) return error(r.request)\n\t if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n\t if (r.request && r.request[readyState] == 4) {\n\t r.request.onreadystatechange = noop\n\t if (succeed(r)) success(r.request)\n\t else\n\t error(r.request)\n\t }\n\t }\n\t }\n\t\n\t function setHeaders(http, o) {\n\t var headers = o['headers'] || {}\n\t , h\n\t\n\t headers['Accept'] = headers['Accept']\n\t || defaultHeaders['accept'][o['type']]\n\t || defaultHeaders['accept']['*']\n\t\n\t var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n\t // breaks cross-origin requests with legacy browsers\n\t if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n\t if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n\t for (h in headers)\n\t headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n\t }\n\t\n\t function setCredentials(http, o) {\n\t if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n\t http.withCredentials = !!o['withCredentials']\n\t }\n\t }\n\t\n\t function generalCallback(data) {\n\t lastValue = data\n\t }\n\t\n\t function urlappend (url, s) {\n\t return url + (/\\?/.test(url) ? '&' : '?') + s\n\t }\n\t\n\t function handleJsonp(o, fn, err, url) {\n\t var reqId = uniqid++\n\t , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n\t , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n\t , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n\t , match = url.match(cbreg)\n\t , script = doc.createElement('script')\n\t , loaded = 0\n\t , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\t\n\t if (match) {\n\t if (match[3] === '?') {\n\t url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n\t } else {\n\t cbval = match[3] // provided callback func name\n\t }\n\t } else {\n\t url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n\t }\n\t\n\t context[cbval] = generalCallback\n\t\n\t script.type = 'text/javascript'\n\t script.src = url\n\t script.async = true\n\t if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n\t // need this for IE due to out-of-order onreadystatechange(), binding script\n\t // execution to an event listener gives us control over when the script\n\t // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n\t script.htmlFor = script.id = '_reqwest_' + reqId\n\t }\n\t\n\t script.onload = script.onreadystatechange = function () {\n\t if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n\t return false\n\t }\n\t script.onload = script.onreadystatechange = null\n\t script.onclick && script.onclick()\n\t // Call the user callback with the last value stored and clean up values and scripts.\n\t fn(lastValue)\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t\n\t // Add the script to the DOM head\n\t head.appendChild(script)\n\t\n\t // Enable JSONP timeout\n\t return {\n\t abort: function () {\n\t script.onload = script.onreadystatechange = null\n\t err({}, 'Request is aborted: timeout', {})\n\t lastValue = undefined\n\t head.removeChild(script)\n\t loaded = 1\n\t }\n\t }\n\t }\n\t\n\t function getRequest(fn, err) {\n\t var o = this.o\n\t , method = (o['method'] || 'GET').toUpperCase()\n\t , url = typeof o === 'string' ? o : o['url']\n\t // convert non-string objects to query-string form unless o['processData'] is false\n\t , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n\t ? reqwest.toQueryString(o['data'])\n\t : (o['data'] || null)\n\t , http\n\t , sendWait = false\n\t\n\t // if we're working on a GET request and we have data then we should append\n\t // query string to end of URL and not post data\n\t if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n\t url = urlappend(url, data)\n\t data = null\n\t }\n\t\n\t if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\t\n\t // get the xhr from the factory if passed\n\t // if the factory returns null, fall-back to ours\n\t http = (o.xhr && o.xhr(o)) || xhr(o)\n\t\n\t http.open(method, url, o['async'] === false ? false : true)\n\t setHeaders(http, o)\n\t setCredentials(http, o)\n\t if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n\t http.onload = fn\n\t http.onerror = err\n\t // NOTE: see\n\t // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n\t http.onprogress = function() {}\n\t sendWait = true\n\t } else {\n\t http.onreadystatechange = handleReadyState(this, fn, err)\n\t }\n\t o['before'] && o['before'](http)\n\t if (sendWait) {\n\t setTimeout(function () {\n\t http.send(data)\n\t }, 200)\n\t } else {\n\t http.send(data)\n\t }\n\t return http\n\t }\n\t\n\t function Reqwest(o, fn) {\n\t this.o = o\n\t this.fn = fn\n\t\n\t init.apply(this, arguments)\n\t }\n\t\n\t function setType(header) {\n\t // json, javascript, text/plain, text/html, xml\n\t if (header === null) return undefined; //In case of no content-type.\n\t if (header.match('json')) return 'json'\n\t if (header.match('javascript')) return 'js'\n\t if (header.match('text')) return 'html'\n\t if (header.match('xml')) return 'xml'\n\t }\n\t\n\t function init(o, fn) {\n\t\n\t this.url = typeof o == 'string' ? o : o['url']\n\t this.timeout = null\n\t\n\t // whether request has been fulfilled for purpose\n\t // of tracking the Promises\n\t this._fulfilled = false\n\t // success handlers\n\t this._successHandler = function(){}\n\t this._fulfillmentHandlers = []\n\t // error handlers\n\t this._errorHandlers = []\n\t // complete (both success and fail) handlers\n\t this._completeHandlers = []\n\t this._erred = false\n\t this._responseArgs = {}\n\t\n\t var self = this\n\t\n\t fn = fn || function () {}\n\t\n\t if (o['timeout']) {\n\t this.timeout = setTimeout(function () {\n\t timedOut()\n\t }, o['timeout'])\n\t }\n\t\n\t if (o['success']) {\n\t this._successHandler = function () {\n\t o['success'].apply(o, arguments)\n\t }\n\t }\n\t\n\t if (o['error']) {\n\t this._errorHandlers.push(function () {\n\t o['error'].apply(o, arguments)\n\t })\n\t }\n\t\n\t if (o['complete']) {\n\t this._completeHandlers.push(function () {\n\t o['complete'].apply(o, arguments)\n\t })\n\t }\n\t\n\t function complete (resp) {\n\t o['timeout'] && clearTimeout(self.timeout)\n\t self.timeout = null\n\t while (self._completeHandlers.length > 0) {\n\t self._completeHandlers.shift()(resp)\n\t }\n\t }\n\t\n\t function success (resp) {\n\t var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n\t resp = (type !== 'jsonp') ? self.request : resp\n\t // use global data filter on response text\n\t var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n\t , r = filteredResponse\n\t try {\n\t resp.responseText = r\n\t } catch (e) {\n\t // can't assign this in IE<=8, just ignore\n\t }\n\t if (r) {\n\t switch (type) {\n\t case 'json':\n\t try {\n\t resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n\t } catch (err) {\n\t return error(resp, 'Could not parse JSON in response', err)\n\t }\n\t break\n\t case 'js':\n\t resp = eval(r)\n\t break\n\t case 'html':\n\t resp = r\n\t break\n\t case 'xml':\n\t resp = resp.responseXML\n\t && resp.responseXML.parseError // IE trololo\n\t && resp.responseXML.parseError.errorCode\n\t && resp.responseXML.parseError.reason\n\t ? null\n\t : resp.responseXML\n\t break\n\t }\n\t }\n\t\n\t self._responseArgs.resp = resp\n\t self._fulfilled = true\n\t fn(resp)\n\t self._successHandler(resp)\n\t while (self._fulfillmentHandlers.length > 0) {\n\t resp = self._fulfillmentHandlers.shift()(resp)\n\t }\n\t\n\t complete(resp)\n\t }\n\t\n\t function timedOut() {\n\t self._timedOut = true\n\t self.request.abort()\n\t }\n\t\n\t function error(resp, msg, t) {\n\t resp = self.request\n\t self._responseArgs.resp = resp\n\t self._responseArgs.msg = msg\n\t self._responseArgs.t = t\n\t self._erred = true\n\t while (self._errorHandlers.length > 0) {\n\t self._errorHandlers.shift()(resp, msg, t)\n\t }\n\t complete(resp)\n\t }\n\t\n\t this.request = getRequest.call(this, success, error)\n\t }\n\t\n\t Reqwest.prototype = {\n\t abort: function () {\n\t this._aborted = true\n\t this.request.abort()\n\t }\n\t\n\t , retry: function () {\n\t init.call(this, this.o, this.fn)\n\t }\n\t\n\t /**\n\t * Small deviation from the Promises A CommonJs specification\n\t * http://wiki.commonjs.org/wiki/Promises/A\n\t */\n\t\n\t /**\n\t * `then` will execute upon successful requests\n\t */\n\t , then: function (success, fail) {\n\t success = success || function () {}\n\t fail = fail || function () {}\n\t if (this._fulfilled) {\n\t this._responseArgs.resp = success(this._responseArgs.resp)\n\t } else if (this._erred) {\n\t fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._fulfillmentHandlers.push(success)\n\t this._errorHandlers.push(fail)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `always` will execute whether the request succeeds or fails\n\t */\n\t , always: function (fn) {\n\t if (this._fulfilled || this._erred) {\n\t fn(this._responseArgs.resp)\n\t } else {\n\t this._completeHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t\n\t /**\n\t * `fail` will execute when the request fails\n\t */\n\t , fail: function (fn) {\n\t if (this._erred) {\n\t fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n\t } else {\n\t this._errorHandlers.push(fn)\n\t }\n\t return this\n\t }\n\t , 'catch': function (fn) {\n\t return this.fail(fn)\n\t }\n\t }\n\t\n\t function reqwest(o, fn) {\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t // normalize newline variants according to spec -> CRLF\n\t function normalize(s) {\n\t return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n\t }\n\t\n\t function serial(el, cb) {\n\t var n = el.name\n\t , t = el.tagName.toLowerCase()\n\t , optCb = function (o) {\n\t // IE gives value=\"\" even where there is no value attribute\n\t // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n\t if (o && !o['disabled'])\n\t cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n\t }\n\t , ch, ra, val, i\n\t\n\t // don't serialize elements that are disabled or without a name\n\t if (el.disabled || !n) return\n\t\n\t switch (t) {\n\t case 'input':\n\t if (!/reset|button|image|file/i.test(el.type)) {\n\t ch = /checkbox/i.test(el.type)\n\t ra = /radio/i.test(el.type)\n\t val = el.value\n\t // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n\t ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n\t }\n\t break\n\t case 'textarea':\n\t cb(n, normalize(el.value))\n\t break\n\t case 'select':\n\t if (el.type.toLowerCase() === 'select-one') {\n\t optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n\t } else {\n\t for (i = 0; el.length && i < el.length; i++) {\n\t el.options[i].selected && optCb(el.options[i])\n\t }\n\t }\n\t break\n\t }\n\t }\n\t\n\t // collect up all form elements found from the passed argument elements all\n\t // the way down to child elements; pass a '<form>' or form fields.\n\t // called with 'this'=callback to use for serial() on each element\n\t function eachFormElement() {\n\t var cb = this\n\t , e, i\n\t , serializeSubtags = function (e, tags) {\n\t var i, j, fa\n\t for (i = 0; i < tags.length; i++) {\n\t fa = e[byTag](tags[i])\n\t for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n\t }\n\t }\n\t\n\t for (i = 0; i < arguments.length; i++) {\n\t e = arguments[i]\n\t if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n\t serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n\t }\n\t }\n\t\n\t // standard query string style serialization\n\t function serializeQueryString() {\n\t return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n\t }\n\t\n\t // { 'name': 'value', ... } style serialization\n\t function serializeHash() {\n\t var hash = {}\n\t eachFormElement.apply(function (name, value) {\n\t if (name in hash) {\n\t hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n\t hash[name].push(value)\n\t } else hash[name] = value\n\t }, arguments)\n\t return hash\n\t }\n\t\n\t // [ { name: 'name', value: 'value' }, ... ] style serialization\n\t reqwest.serializeArray = function () {\n\t var arr = []\n\t eachFormElement.apply(function (name, value) {\n\t arr.push({name: name, value: value})\n\t }, arguments)\n\t return arr\n\t }\n\t\n\t reqwest.serialize = function () {\n\t if (arguments.length === 0) return ''\n\t var opt, fn\n\t , args = Array.prototype.slice.call(arguments, 0)\n\t\n\t opt = args.pop()\n\t opt && opt.nodeType && args.push(opt) && (opt = null)\n\t opt && (opt = opt.type)\n\t\n\t if (opt == 'map') fn = serializeHash\n\t else if (opt == 'array') fn = reqwest.serializeArray\n\t else fn = serializeQueryString\n\t\n\t return fn.apply(null, args)\n\t }\n\t\n\t reqwest.toQueryString = function (o, trad) {\n\t var prefix, i\n\t , traditional = trad || false\n\t , s = []\n\t , enc = encodeURIComponent\n\t , add = function (key, value) {\n\t // If value is a function, invoke it and return its value\n\t value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n\t s[s.length] = enc(key) + '=' + enc(value)\n\t }\n\t // If an array was passed in, assume that it is an array of form elements.\n\t if (isArray(o)) {\n\t for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n\t } else {\n\t // If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t // did it), otherwise encode params recursively.\n\t for (prefix in o) {\n\t if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n\t }\n\t }\n\t\n\t // spaces should be + according to spec\n\t return s.join('&').replace(/%20/g, '+')\n\t }\n\t\n\t function buildParams(prefix, obj, traditional, add) {\n\t var name, i, v\n\t , rbracket = /\\[\\]$/\n\t\n\t if (isArray(obj)) {\n\t // Serialize array item.\n\t for (i = 0; obj && i < obj.length; i++) {\n\t v = obj[i]\n\t if (traditional || rbracket.test(prefix)) {\n\t // Treat each array item as a scalar.\n\t add(prefix, v)\n\t } else {\n\t buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n\t }\n\t }\n\t } else if (obj && obj.toString() === '[object Object]') {\n\t // Serialize object item.\n\t for (name in obj) {\n\t buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n\t }\n\t\n\t } else {\n\t // Serialize scalar item.\n\t add(prefix, obj)\n\t }\n\t }\n\t\n\t reqwest.getcallbackPrefix = function () {\n\t return callbackPrefix\n\t }\n\t\n\t // jQuery and Zepto compatibility, differences can be remapped here so you can call\n\t // .ajax.compat(options, callback)\n\t reqwest.compat = function (o, fn) {\n\t if (o) {\n\t o['type'] && (o['method'] = o['type']) && delete o['type']\n\t o['dataType'] && (o['type'] = o['dataType'])\n\t o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n\t o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n\t }\n\t return new Reqwest(o, fn)\n\t }\n\t\n\t reqwest.ajaxSetup = function (options) {\n\t options = options || {}\n\t for (var k in options) {\n\t globalSetupOptions[k] = options[k]\n\t }\n\t }\n\t\n\t return reqwest\n\t});\n\n\n/***/ },\n/* 56 */\n/***/ function(module, exports) {\n\n\t/* (ignored) */\n\n/***/ },\n/* 57 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t(function (global, factory) {\n\t true ? factory(exports) :\n\t typeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t (factory((global.topojson = {})));\n\t}(this, function (exports) { 'use strict';\n\t\n\t function noop() {}\n\t\n\t function absolute(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t point[0] = (x0 += point[0]) * kx + dx;\n\t point[1] = (y0 += point[1]) * ky + dy;\n\t };\n\t }\n\t\n\t function relative(transform) {\n\t if (!transform) return noop;\n\t var x0,\n\t y0,\n\t kx = transform.scale[0],\n\t ky = transform.scale[1],\n\t dx = transform.translate[0],\n\t dy = transform.translate[1];\n\t return function(point, i) {\n\t if (!i) x0 = y0 = 0;\n\t var x1 = (point[0] - dx) / kx | 0,\n\t y1 = (point[1] - dy) / ky | 0;\n\t point[0] = x1 - x0;\n\t point[1] = y1 - y0;\n\t x0 = x1;\n\t y0 = y1;\n\t };\n\t }\n\t\n\t function reverse(array, n) {\n\t var t, j = array.length, i = j - n;\n\t while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n\t }\n\t\n\t function bisect(a, x) {\n\t var lo = 0, hi = a.length;\n\t while (lo < hi) {\n\t var mid = lo + hi >>> 1;\n\t if (a[mid] < x) lo = mid + 1;\n\t else hi = mid;\n\t }\n\t return lo;\n\t }\n\t\n\t function feature(topology, o) {\n\t return o.type === \"GeometryCollection\" ? {\n\t type: \"FeatureCollection\",\n\t features: o.geometries.map(function(o) { return feature$1(topology, o); })\n\t } : feature$1(topology, o);\n\t }\n\t\n\t function feature$1(topology, o) {\n\t var f = {\n\t type: \"Feature\",\n\t id: o.id,\n\t properties: o.properties || {},\n\t geometry: object(topology, o)\n\t };\n\t if (o.id == null) delete f.id;\n\t return f;\n\t }\n\t\n\t function object(topology, o) {\n\t var absolute$$ = absolute(topology.transform),\n\t arcs = topology.arcs;\n\t\n\t function arc(i, points) {\n\t if (points.length) points.pop();\n\t for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n\t points.push(p = a[k].slice());\n\t absolute$$(p, k);\n\t }\n\t if (i < 0) reverse(points, n);\n\t }\n\t\n\t function point(p) {\n\t p = p.slice();\n\t absolute$$(p, 0);\n\t return p;\n\t }\n\t\n\t function line(arcs) {\n\t var points = [];\n\t for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n\t if (points.length < 2) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function ring(arcs) {\n\t var points = line(arcs);\n\t while (points.length < 4) points.push(points[0].slice());\n\t return points;\n\t }\n\t\n\t function polygon(arcs) {\n\t return arcs.map(ring);\n\t }\n\t\n\t function geometry(o) {\n\t var t = o.type;\n\t return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n\t : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n\t : null;\n\t }\n\t\n\t var geometryType = {\n\t Point: function(o) { return point(o.coordinates); },\n\t MultiPoint: function(o) { return o.coordinates.map(point); },\n\t LineString: function(o) { return line(o.arcs); },\n\t MultiLineString: function(o) { return o.arcs.map(line); },\n\t Polygon: function(o) { return polygon(o.arcs); },\n\t MultiPolygon: function(o) { return o.arcs.map(polygon); }\n\t };\n\t\n\t return geometry(o);\n\t }\n\t\n\t function stitchArcs(topology, arcs) {\n\t var stitchedArcs = {},\n\t fragmentByStart = {},\n\t fragmentByEnd = {},\n\t fragments = [],\n\t emptyIndex = -1;\n\t\n\t // Stitch empty arcs first, since they may be subsumed by other arcs.\n\t arcs.forEach(function(i, j) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], t;\n\t if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n\t t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n\t }\n\t });\n\t\n\t arcs.forEach(function(i) {\n\t var e = ends(i),\n\t start = e[0],\n\t end = e[1],\n\t f, g;\n\t\n\t if (f = fragmentByEnd[start]) {\n\t delete fragmentByEnd[f.end];\n\t f.push(i);\n\t f.end = end;\n\t if (g = fragmentByStart[end]) {\n\t delete fragmentByStart[g.start];\n\t var fg = g === f ? f : f.concat(g);\n\t fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else if (f = fragmentByStart[end]) {\n\t delete fragmentByStart[f.start];\n\t f.unshift(i);\n\t f.start = start;\n\t if (g = fragmentByEnd[start]) {\n\t delete fragmentByEnd[g.end];\n\t var gf = g === f ? f : g.concat(f);\n\t fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n\t } else {\n\t fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n\t }\n\t } else {\n\t f = [i];\n\t fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n\t }\n\t });\n\t\n\t function ends(i) {\n\t var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n\t if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n\t else p1 = arc[arc.length - 1];\n\t return i < 0 ? [p1, p0] : [p0, p1];\n\t }\n\t\n\t function flush(fragmentByEnd, fragmentByStart) {\n\t for (var k in fragmentByEnd) {\n\t var f = fragmentByEnd[k];\n\t delete fragmentByStart[f.start];\n\t delete f.start;\n\t delete f.end;\n\t f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n\t fragments.push(f);\n\t }\n\t }\n\t\n\t flush(fragmentByEnd, fragmentByStart);\n\t flush(fragmentByStart, fragmentByEnd);\n\t arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\t\n\t return fragments;\n\t }\n\t\n\t function mesh(topology) {\n\t return object(topology, meshArcs.apply(this, arguments));\n\t }\n\t\n\t function meshArcs(topology, o, filter) {\n\t var arcs = [];\n\t\n\t function arc(i) {\n\t var j = i < 0 ? ~i : i;\n\t (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n\t }\n\t\n\t function line(arcs) {\n\t arcs.forEach(arc);\n\t }\n\t\n\t function polygon(arcs) {\n\t arcs.forEach(line);\n\t }\n\t\n\t function geometry(o) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n\t else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n\t }\n\t\n\t if (arguments.length > 1) {\n\t var geomsByArc = [],\n\t geom;\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n\t };\n\t\n\t geometry(o);\n\t\n\t geomsByArc.forEach(arguments.length < 3\n\t ? function(geoms) { arcs.push(geoms[0].i); }\n\t : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n\t } else {\n\t for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n\t }\n\t\n\t return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n\t }\n\t\n\t function triangle(triangle) {\n\t var a = triangle[0], b = triangle[1], c = triangle[2];\n\t return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n\t }\n\t\n\t function ring(ring) {\n\t var i = -1,\n\t n = ring.length,\n\t a,\n\t b = ring[n - 1],\n\t area = 0;\n\t\n\t while (++i < n) {\n\t a = b;\n\t b = ring[i];\n\t area += a[0] * b[1] - a[1] * b[0];\n\t }\n\t\n\t return area / 2;\n\t }\n\t\n\t function merge(topology) {\n\t return object(topology, mergeArcs.apply(this, arguments));\n\t }\n\t\n\t function mergeArcs(topology, objects) {\n\t var polygonsByArc = {},\n\t polygons = [],\n\t components = [];\n\t\n\t objects.forEach(function(o) {\n\t if (o.type === \"Polygon\") register(o.arcs);\n\t else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n\t });\n\t\n\t function register(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n\t });\n\t });\n\t polygons.push(polygon);\n\t }\n\t\n\t function exterior(ring$$) {\n\t return ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]) > 0; // TODO allow spherical?\n\t }\n\t\n\t polygons.forEach(function(polygon) {\n\t if (!polygon._) {\n\t var component = [],\n\t neighbors = [polygon];\n\t polygon._ = 1;\n\t components.push(component);\n\t while (polygon = neighbors.pop()) {\n\t component.push(polygon);\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n\t if (!polygon._) {\n\t polygon._ = 1;\n\t neighbors.push(polygon);\n\t }\n\t });\n\t });\n\t });\n\t }\n\t }\n\t });\n\t\n\t polygons.forEach(function(polygon) {\n\t delete polygon._;\n\t });\n\t\n\t return {\n\t type: \"MultiPolygon\",\n\t arcs: components.map(function(polygons) {\n\t var arcs = [], n;\n\t\n\t // Extract the exterior (unique) arcs.\n\t polygons.forEach(function(polygon) {\n\t polygon.forEach(function(ring$$) {\n\t ring$$.forEach(function(arc) {\n\t if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n\t arcs.push(arc);\n\t }\n\t });\n\t });\n\t });\n\t\n\t // Stitch the arcs into one or more rings.\n\t arcs = stitchArcs(topology, arcs);\n\t\n\t // If more than one ring is returned,\n\t // at most one of these rings can be the exterior;\n\t // this exterior ring has the same winding order\n\t // as any exterior ring in the original polygons.\n\t if ((n = arcs.length) > 1) {\n\t var sgn = exterior(polygons[0][0]);\n\t for (var i = 0, t; i < n; ++i) {\n\t if (sgn === exterior(arcs[i])) {\n\t t = arcs[0], arcs[0] = arcs[i], arcs[i] = t;\n\t break;\n\t }\n\t }\n\t }\n\t\n\t return arcs;\n\t })\n\t };\n\t }\n\t\n\t function neighbors(objects) {\n\t var indexesByArc = {}, // arc index -> array of object indexes\n\t neighbors = objects.map(function() { return []; });\n\t\n\t function line(arcs, i) {\n\t arcs.forEach(function(a) {\n\t if (a < 0) a = ~a;\n\t var o = indexesByArc[a];\n\t if (o) o.push(i);\n\t else indexesByArc[a] = [i];\n\t });\n\t }\n\t\n\t function polygon(arcs, i) {\n\t arcs.forEach(function(arc) { line(arc, i); });\n\t }\n\t\n\t function geometry(o, i) {\n\t if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n\t else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n\t }\n\t\n\t var geometryType = {\n\t LineString: line,\n\t MultiLineString: polygon,\n\t Polygon: polygon,\n\t MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n\t };\n\t\n\t objects.forEach(geometry);\n\t\n\t for (var i in indexesByArc) {\n\t for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n\t for (var k = j + 1; k < m; ++k) {\n\t var ij = indexes[j], ik = indexes[k], n;\n\t if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n\t if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n\t }\n\t }\n\t }\n\t\n\t return neighbors;\n\t }\n\t\n\t function compareArea(a, b) {\n\t return a[1][2] - b[1][2];\n\t }\n\t\n\t function minAreaHeap() {\n\t var heap = {},\n\t array = [],\n\t size = 0;\n\t\n\t heap.push = function(object) {\n\t up(array[object._ = size] = object, size++);\n\t return size;\n\t };\n\t\n\t heap.pop = function() {\n\t if (size <= 0) return;\n\t var removed = array[0], object;\n\t if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n\t return removed;\n\t };\n\t\n\t heap.remove = function(removed) {\n\t var i = removed._, object;\n\t if (array[i] !== removed) return; // invalid request\n\t if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n\t return i;\n\t };\n\t\n\t function up(object, i) {\n\t while (i > 0) {\n\t var j = ((i + 1) >> 1) - 1,\n\t parent = array[j];\n\t if (compareArea(object, parent) >= 0) break;\n\t array[parent._ = i] = parent;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t function down(object, i) {\n\t while (true) {\n\t var r = (i + 1) << 1,\n\t l = r - 1,\n\t j = i,\n\t child = array[j];\n\t if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n\t if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n\t if (j === i) break;\n\t array[child._ = i] = child;\n\t array[object._ = i = j] = object;\n\t }\n\t }\n\t\n\t return heap;\n\t }\n\t\n\t function presimplify(topology, triangleArea) {\n\t var absolute$$ = absolute(topology.transform),\n\t relative$$ = relative(topology.transform),\n\t heap = minAreaHeap();\n\t\n\t if (!triangleArea) triangleArea = triangle;\n\t\n\t topology.arcs.forEach(function(arc) {\n\t var triangles = [],\n\t maxArea = 0,\n\t triangle,\n\t i,\n\t n,\n\t p;\n\t\n\t // To store each point’s effective area, we create a new array rather than\n\t // extending the passed-in point to workaround a Chrome/V8 bug (getting\n\t // stuck in smi mode). For midpoints, the initial effective area of\n\t // Infinity will be computed in the next step.\n\t for (i = 0, n = arc.length; i < n; ++i) {\n\t p = arc[i];\n\t absolute$$(arc[i] = [p[0], p[1], Infinity], i);\n\t }\n\t\n\t for (i = 1, n = arc.length - 1; i < n; ++i) {\n\t triangle = arc.slice(i - 1, i + 2);\n\t triangle[1][2] = triangleArea(triangle);\n\t triangles.push(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t for (i = 0, n = triangles.length; i < n; ++i) {\n\t triangle = triangles[i];\n\t triangle.previous = triangles[i - 1];\n\t triangle.next = triangles[i + 1];\n\t }\n\t\n\t while (triangle = heap.pop()) {\n\t var previous = triangle.previous,\n\t next = triangle.next;\n\t\n\t // If the area of the current point is less than that of the previous point\n\t // to be eliminated, use the latter's area instead. This ensures that the\n\t // current point cannot be eliminated without eliminating previously-\n\t // eliminated points.\n\t if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n\t else maxArea = triangle[1][2];\n\t\n\t if (previous) {\n\t previous.next = next;\n\t previous[2] = triangle[2];\n\t update(previous);\n\t }\n\t\n\t if (next) {\n\t next.previous = previous;\n\t next[0] = triangle[0];\n\t update(next);\n\t }\n\t }\n\t\n\t arc.forEach(relative$$);\n\t });\n\t\n\t function update(triangle) {\n\t heap.remove(triangle);\n\t triangle[1][2] = triangleArea(triangle);\n\t heap.push(triangle);\n\t }\n\t\n\t return topology;\n\t }\n\t\n\t var version = \"1.6.24\";\n\t\n\t exports.version = version;\n\t exports.mesh = mesh;\n\t exports.meshArcs = meshArcs;\n\t exports.merge = merge;\n\t exports.mergeArcs = mergeArcs;\n\t exports.feature = feature;\n\t exports.neighbors = neighbors;\n\t exports.presimplify = presimplify;\n\t\n\t}));\n\n/***/ },\n/* 58 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tmodule.exports = earcut;\n\t\n\tfunction earcut(data, holeIndices, dim) {\n\t\n\t dim = dim || 2;\n\t\n\t var hasHoles = holeIndices && holeIndices.length,\n\t outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n\t outerNode = linkedList(data, 0, outerLen, dim, true),\n\t triangles = [];\n\t\n\t if (!outerNode) return triangles;\n\t\n\t var minX, minY, maxX, maxY, x, y, size;\n\t\n\t if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\t\n\t // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t if (data.length > 80 * dim) {\n\t minX = maxX = data[0];\n\t minY = maxY = data[1];\n\t\n\t for (var i = dim; i < outerLen; i += dim) {\n\t x = data[i];\n\t y = data[i + 1];\n\t if (x < minX) minX = x;\n\t if (y < minY) minY = y;\n\t if (x > maxX) maxX = x;\n\t if (y > maxY) maxY = y;\n\t }\n\t\n\t // minX, minY and size are later used to transform coords into integers for z-order calculation\n\t size = Math.max(maxX - minX, maxY - minY);\n\t }\n\t\n\t earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\t\n\t return triangles;\n\t}\n\t\n\t// create a circular doubly linked list from polygon points in the specified winding order\n\tfunction linkedList(data, start, end, dim, clockwise) {\n\t var sum = 0,\n\t i, j, last;\n\t\n\t // calculate original winding order of a polygon ring\n\t for (i = start, j = end - dim; i < end; i += dim) {\n\t sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n\t j = i;\n\t }\n\t\n\t // link points into circular doubly-linked list in the specified winding order\n\t if (clockwise === (sum > 0)) {\n\t for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n\t } else {\n\t for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n\t }\n\t\n\t return last;\n\t}\n\t\n\t// eliminate colinear or duplicate points\n\tfunction filterPoints(start, end) {\n\t if (!start) return start;\n\t if (!end) end = start;\n\t\n\t var p = start,\n\t again;\n\t do {\n\t again = false;\n\t\n\t if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n\t removeNode(p);\n\t p = end = p.prev;\n\t if (p === p.next) return null;\n\t again = true;\n\t\n\t } else {\n\t p = p.next;\n\t }\n\t } while (again || p !== end);\n\t\n\t return end;\n\t}\n\t\n\t// main ear slicing loop which triangulates a polygon (given as a linked list)\n\tfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n\t if (!ear) return;\n\t\n\t // interlink polygon nodes in z-order\n\t if (!pass && size) indexCurve(ear, minX, minY, size);\n\t\n\t var stop = ear,\n\t prev, next;\n\t\n\t // iterate through ears, slicing them one by one\n\t while (ear.prev !== ear.next) {\n\t prev = ear.prev;\n\t next = ear.next;\n\t\n\t if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n\t // cut off the triangle\n\t triangles.push(prev.i / dim);\n\t triangles.push(ear.i / dim);\n\t triangles.push(next.i / dim);\n\t\n\t removeNode(ear);\n\t\n\t // skipping the next vertice leads to less sliver triangles\n\t ear = next.next;\n\t stop = next.next;\n\t\n\t continue;\n\t }\n\t\n\t ear = next;\n\t\n\t // if we looped through the whole remaining polygon and can't find any more ears\n\t if (ear === stop) {\n\t // try filtering points and slicing again\n\t if (!pass) {\n\t earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\t\n\t // if this didn't work, try curing all small self-intersections locally\n\t } else if (pass === 1) {\n\t ear = cureLocalIntersections(ear, triangles, dim);\n\t earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\t\n\t // as a last resort, try splitting the remaining polygon into two\n\t } else if (pass === 2) {\n\t splitEarcut(ear, triangles, dim, minX, minY, size);\n\t }\n\t\n\t break;\n\t }\n\t }\n\t}\n\t\n\t// check whether a polygon node forms a valid ear with adjacent nodes\n\tfunction isEar(ear) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // now make sure we don't have other points inside the potential ear\n\t var p = ear.next.next;\n\t\n\t while (p !== ear.prev) {\n\t if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.next;\n\t }\n\t\n\t return true;\n\t}\n\t\n\tfunction isEarHashed(ear, minX, minY, size) {\n\t var a = ear.prev,\n\t b = ear,\n\t c = ear.next;\n\t\n\t if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\t\n\t // triangle bbox; min & max are calculated like this for speed\n\t var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n\t minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n\t maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n\t maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\t\n\t // z-order range for the current triangle bbox;\n\t var minZ = zOrder(minTX, minTY, minX, minY, size),\n\t maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\t\n\t // first look for points inside the triangle in increasing z-order\n\t var p = ear.nextZ;\n\t\n\t while (p && p.z <= maxZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.nextZ;\n\t }\n\t\n\t // then look for points in decreasing z-order\n\t p = ear.prevZ;\n\t\n\t while (p && p.z >= minZ) {\n\t if (p !== ear.prev && p !== ear.next &&\n\t pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n\t area(p.prev, p, p.next) >= 0) return false;\n\t p = p.prevZ;\n\t }\n\t\n\t return true;\n\t}\n\t\n\t// go through all polygon nodes and cure small local self-intersections\n\tfunction cureLocalIntersections(start, triangles, dim) {\n\t var p = start;\n\t do {\n\t var a = p.prev,\n\t b = p.next.next;\n\t\n\t // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])\n\t if (intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\t\n\t triangles.push(a.i / dim);\n\t triangles.push(p.i / dim);\n\t triangles.push(b.i / dim);\n\t\n\t // remove two nodes involved\n\t removeNode(p);\n\t removeNode(p.next);\n\t\n\t p = start = b;\n\t }\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return p;\n\t}\n\t\n\t// try splitting polygon into two and triangulate them independently\n\tfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n\t // look for a valid diagonal that divides the polygon into two\n\t var a = start;\n\t do {\n\t var b = a.next.next;\n\t while (b !== a.prev) {\n\t if (a.i !== b.i && isValidDiagonal(a, b)) {\n\t // split the polygon in two by the diagonal\n\t var c = splitPolygon(a, b);\n\t\n\t // filter colinear points around the cuts\n\t a = filterPoints(a, a.next);\n\t c = filterPoints(c, c.next);\n\t\n\t // run earcut on each half\n\t earcutLinked(a, triangles, dim, minX, minY, size);\n\t earcutLinked(c, triangles, dim, minX, minY, size);\n\t return;\n\t }\n\t b = b.next;\n\t }\n\t a = a.next;\n\t } while (a !== start);\n\t}\n\t\n\t// link every hole into the outer loop, producing a single-ring polygon without holes\n\tfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n\t var queue = [],\n\t i, len, start, end, list;\n\t\n\t for (i = 0, len = holeIndices.length; i < len; i++) {\n\t start = holeIndices[i] * dim;\n\t end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n\t list = linkedList(data, start, end, dim, false);\n\t if (list === list.next) list.steiner = true;\n\t queue.push(getLeftmost(list));\n\t }\n\t\n\t queue.sort(compareX);\n\t\n\t // process holes from left to right\n\t for (i = 0; i < queue.length; i++) {\n\t eliminateHole(queue[i], outerNode);\n\t outerNode = filterPoints(outerNode, outerNode.next);\n\t }\n\t\n\t return outerNode;\n\t}\n\t\n\tfunction compareX(a, b) {\n\t return a.x - b.x;\n\t}\n\t\n\t// find a bridge between vertices that connects hole with an outer ring and and link it\n\tfunction eliminateHole(hole, outerNode) {\n\t outerNode = findHoleBridge(hole, outerNode);\n\t if (outerNode) {\n\t var b = splitPolygon(outerNode, hole);\n\t filterPoints(b, b.next);\n\t }\n\t}\n\t\n\t// David Eberly's algorithm for finding a bridge between hole and outer polygon\n\tfunction findHoleBridge(hole, outerNode) {\n\t var p = outerNode,\n\t hx = hole.x,\n\t hy = hole.y,\n\t qx = -Infinity,\n\t m;\n\t\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\t do {\n\t if (hy <= p.y && hy >= p.next.y) {\n\t var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n\t if (x <= hx && x > qx) {\n\t qx = x;\n\t m = p.x < p.next.x ? p : p.next;\n\t }\n\t }\n\t p = p.next;\n\t } while (p !== outerNode);\n\t\n\t if (!m) return null;\n\t\n\t if (hole.x === m.x) return m.prev; // hole touches outer segment; pick lower endpoint\n\t\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\t\n\t var stop = m,\n\t tanMin = Infinity,\n\t tan;\n\t\n\t p = m.next;\n\t\n\t while (p !== stop) {\n\t if (hx >= p.x && p.x >= m.x &&\n\t pointInTriangle(hy < m.y ? hx : qx, hy, m.x, m.y, hy < m.y ? qx : hx, hy, p.x, p.y)) {\n\t\n\t tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\t\n\t if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n\t m = p;\n\t tanMin = tan;\n\t }\n\t }\n\t\n\t p = p.next;\n\t }\n\t\n\t return m;\n\t}\n\t\n\t// interlink polygon nodes in z-order\n\tfunction indexCurve(start, minX, minY, size) {\n\t var p = start;\n\t do {\n\t if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n\t p.prevZ = p.prev;\n\t p.nextZ = p.next;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t p.prevZ.nextZ = null;\n\t p.prevZ = null;\n\t\n\t sortLinked(p);\n\t}\n\t\n\t// Simon Tatham's linked list merge sort algorithm\n\t// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\n\tfunction sortLinked(list) {\n\t var i, p, q, e, tail, numMerges, pSize, qSize,\n\t inSize = 1;\n\t\n\t do {\n\t p = list;\n\t list = null;\n\t tail = null;\n\t numMerges = 0;\n\t\n\t while (p) {\n\t numMerges++;\n\t q = p;\n\t pSize = 0;\n\t for (i = 0; i < inSize; i++) {\n\t pSize++;\n\t q = q.nextZ;\n\t if (!q) break;\n\t }\n\t\n\t qSize = inSize;\n\t\n\t while (pSize > 0 || (qSize > 0 && q)) {\n\t\n\t if (pSize === 0) {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t } else if (qSize === 0 || !q) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else if (p.z <= q.z) {\n\t e = p;\n\t p = p.nextZ;\n\t pSize--;\n\t } else {\n\t e = q;\n\t q = q.nextZ;\n\t qSize--;\n\t }\n\t\n\t if (tail) tail.nextZ = e;\n\t else list = e;\n\t\n\t e.prevZ = tail;\n\t tail = e;\n\t }\n\t\n\t p = q;\n\t }\n\t\n\t tail.nextZ = null;\n\t inSize *= 2;\n\t\n\t } while (numMerges > 1);\n\t\n\t return list;\n\t}\n\t\n\t// z-order of a point given coords and size of the data bounding box\n\tfunction zOrder(x, y, minX, minY, size) {\n\t // coords are transformed into non-negative 15-bit integer range\n\t x = 32767 * (x - minX) / size;\n\t y = 32767 * (y - minY) / size;\n\t\n\t x = (x | (x << 8)) & 0x00FF00FF;\n\t x = (x | (x << 4)) & 0x0F0F0F0F;\n\t x = (x | (x << 2)) & 0x33333333;\n\t x = (x | (x << 1)) & 0x55555555;\n\t\n\t y = (y | (y << 8)) & 0x00FF00FF;\n\t y = (y | (y << 4)) & 0x0F0F0F0F;\n\t y = (y | (y << 2)) & 0x33333333;\n\t y = (y | (y << 1)) & 0x55555555;\n\t\n\t return x | (y << 1);\n\t}\n\t\n\t// find the leftmost node of a polygon ring\n\tfunction getLeftmost(start) {\n\t var p = start,\n\t leftmost = start;\n\t do {\n\t if (p.x < leftmost.x) leftmost = p;\n\t p = p.next;\n\t } while (p !== start);\n\t\n\t return leftmost;\n\t}\n\t\n\t// check if a point lies within a convex triangle\n\tfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n\t return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n\t (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n\t (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n\t}\n\t\n\t// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\n\tfunction isValidDiagonal(a, b) {\n\t return equals(a, b) || a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n\t locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n\t}\n\t\n\t// signed area of a triangle\n\tfunction area(p, q, r) {\n\t return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n\t}\n\t\n\t// check if two points are equal\n\tfunction equals(p1, p2) {\n\t return p1.x === p2.x && p1.y === p2.y;\n\t}\n\t\n\t// check if two segments intersect\n\tfunction intersects(p1, q1, p2, q2) {\n\t return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n\t area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n\t}\n\t\n\t// check if a polygon diagonal intersects any polygon segments\n\tfunction intersectsPolygon(a, b) {\n\t var p = a;\n\t do {\n\t if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t intersects(p, p.next, a, b)) return true;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return false;\n\t}\n\t\n\t// check if a polygon diagonal is locally inside the polygon\n\tfunction locallyInside(a, b) {\n\t return area(a.prev, a, a.next) < 0 ?\n\t area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n\t area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n\t}\n\t\n\t// check if the middle point of a polygon diagonal is inside the polygon\n\tfunction middleInside(a, b) {\n\t var p = a,\n\t inside = false,\n\t px = (a.x + b.x) / 2,\n\t py = (a.y + b.y) / 2;\n\t do {\n\t if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n\t inside = !inside;\n\t p = p.next;\n\t } while (p !== a);\n\t\n\t return inside;\n\t}\n\t\n\t// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n\t// if one belongs to the outer ring and another to a hole, it merges it into a single ring\n\tfunction splitPolygon(a, b) {\n\t var a2 = new Node(a.i, a.x, a.y),\n\t b2 = new Node(b.i, b.x, b.y),\n\t an = a.next,\n\t bp = b.prev;\n\t\n\t a.next = b;\n\t b.prev = a;\n\t\n\t a2.next = an;\n\t an.prev = a2;\n\t\n\t b2.next = a2;\n\t a2.prev = b2;\n\t\n\t bp.next = b2;\n\t b2.prev = bp;\n\t\n\t return b2;\n\t}\n\t\n\t// create a node and optionally link it with previous one (in a circular doubly linked list)\n\tfunction insertNode(i, x, y, last) {\n\t var p = new Node(i, x, y);\n\t\n\t if (!last) {\n\t p.prev = p;\n\t p.next = p;\n\t\n\t } else {\n\t p.next = last.next;\n\t p.prev = last;\n\t last.next.prev = p;\n\t last.next = p;\n\t }\n\t return p;\n\t}\n\t\n\tfunction removeNode(p) {\n\t p.next.prev = p.prev;\n\t p.prev.next = p.next;\n\t\n\t if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n\t if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n\t}\n\t\n\tfunction Node(i, x, y) {\n\t // vertice index in coordinates array\n\t this.i = i;\n\t\n\t // vertex coordinates\n\t this.x = x;\n\t this.y = y;\n\t\n\t // previous and next vertice nodes in a polygon ring\n\t this.prev = null;\n\t this.next = null;\n\t\n\t // z-order curve value\n\t this.z = null;\n\t\n\t // previous and next nodes in z-order\n\t this.prevZ = null;\n\t this.nextZ = null;\n\t\n\t // indicates whether this is a steiner point\n\t this.steiner = false;\n\t}\n\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\t/*\n\t * Extrude a polygon given its vertices and triangulated faces\n\t *\n\t * Based on:\n\t * https://github.com/freeman-lab/extrude\n\t */\n\t\n\tvar _lodashAssign = __webpack_require__(3);\n\t\n\tvar _lodashAssign2 = _interopRequireDefault(_lodashAssign);\n\t\n\tvar extrudePolygon = function extrudePolygon(points, faces, _options) {\n\t var defaults = {\n\t top: 1,\n\t bottom: 0,\n\t closed: true\n\t };\n\t\n\t var options = (0, _lodashAssign2['default'])(defaults, _options);\n\t\n\t var n = points.length;\n\t var positions;\n\t var cells;\n\t var topCells;\n\t var bottomCells;\n\t var sideCells;\n\t\n\t // If bottom and top values are identical then return the flat shape\n\t options.top === options.bottom ? flat() : full();\n\t\n\t function flat() {\n\t positions = points.map(function (p) {\n\t return [p[0], options.top, p[1]];\n\t });\n\t cells = faces;\n\t topCells = faces;\n\t }\n\t\n\t function full() {\n\t positions = [];\n\t points.forEach(function (p) {\n\t positions.push([p[0], options.top, p[1]]);\n\t });\n\t points.forEach(function (p) {\n\t positions.push([p[0], options.bottom, p[1]]);\n\t });\n\t\n\t cells = [];\n\t for (var i = 0; i < n; i++) {\n\t if (i === n - 1) {\n\t cells.push([i + n, n, i]);\n\t cells.push([0, i, n]);\n\t } else {\n\t cells.push([i + n, i + n + 1, i]);\n\t cells.push([i + 1, i, i + n + 1]);\n\t }\n\t }\n\t\n\t sideCells = [].concat(cells);\n\t\n\t if (options.closed) {\n\t var top = faces;\n\t var bottom = top.map(function (p) {\n\t return p.map(function (v) {\n\t return v + n;\n\t });\n\t });\n\t bottom = bottom.map(function (p) {\n\t return [p[0], p[2], p[1]];\n\t });\n\t cells = cells.concat(top).concat(bottom);\n\t\n\t topCells = top;\n\t bottomCells = bottom;\n\t }\n\t }\n\t\n\t return {\n\t positions: positions,\n\t faces: cells,\n\t top: topCells,\n\t bottom: bottomCells,\n\t sides: sideCells\n\t };\n\t};\n\t\n\texports['default'] = extrudePolygon;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar GreinerHormann = __webpack_require__(61);\n\tvar Edge = __webpack_require__(66);\n\tvar intersection = __webpack_require__(67);\n\t\n\t\"use strict\";\n\t\n\tvar min = Math.min,\n\t max = Math.max,\n\t atan2 = Math.atan2;\n\t\n\t/**\n\t * Offset builder\n\t *\n\t * @param {Array.<Object>=} vertices\n\t * @param {Number=} arcSegments\n\t * @constructor\n\t */\n\tfunction Offset(vertices, arcSegments) {\n\t\n\t /**\n\t * @type {Array.<Object>}\n\t */\n\t this.vertices = null;\n\t\n\t /**\n\t * @type {Array.<Edge>}\n\t */\n\t this.edges = null;\n\t\n\t /**\n\t * @type {Boolean}\n\t */\n\t this._closed = false;\n\t\n\t if (vertices) {\n\t this.data(vertices);\n\t }\n\t\n\t /**\n\t * Segments in edge bounding arches\n\t * @type {Number}\n\t */\n\t this._arcSegments = arcSegments || 5;\n\t};\n\t\n\t/**\n\t * Change data set\n\t * @param {Array.<Array>} vertices\n\t * @return {Offset}\n\t */\n\tOffset.prototype.data = function(vertices) {\n\t vertices = this.validate(vertices);\n\t\n\t var edges = [];\n\t for (var i = 0, len = vertices.length; i < len; i++) {\n\t edges.push(new Edge(vertices[i], vertices[(i + 1) % len]));\n\t }\n\t\n\t this.vertices = vertices;\n\t this.edges = edges;\n\t return this;\n\t};\n\t\n\t/**\n\t * @param {Number} arcSegments\n\t * @return {Offset}\n\t */\n\tOffset.prototype.arcSegments = function(arcSegments) {\n\t this._arcSegments = arcSegments;\n\t return this;\n\t};\n\t\n\t/**\n\t * Validates if the first and last points repeat\n\t * TODO: check CCW\n\t *\n\t * @param {Array.<Object>} vertices\n\t */\n\tOffset.prototype.validate = function(vertices) {\n\t var len = vertices.length;\n\t if (vertices[0][0] === vertices[len - 1][0] &&\n\t vertices[0][1] === vertices[len - 1][1]) {\n\t vertices = vertices.slice(0, len - 1);\n\t this._closed = true;\n\t }\n\t return vertices;\n\t};\n\t\n\t/**\n\t * Creates arch between two edges\n\t *\n\t * @param {Array.<Object>} vertices\n\t * @param {Object} center\n\t * @param {Number} radius\n\t * @param {Object} startVertex\n\t * @param {Object} endVertex\n\t * @param {Number} segments\n\t * @param {Boolean} outwards\n\t */\n\tOffset.prototype.createArc = function(vertices, center, radius, startVertex,\n\t endVertex, segments, outwards) {\n\t\n\t var PI2 = Math.PI * 2,\n\t startAngle = atan2(startVertex[1] - center[1], startVertex[0] - center[0]),\n\t endAngle = atan2(endVertex[1] - center[1], endVertex[0] - center[0]);\n\t\n\t // odd number please\n\t if (segments % 2 === 0) {\n\t segments -= 1;\n\t }\n\t\n\t if (startAngle < 0) {\n\t startAngle += PI2;\n\t }\n\t\n\t if (endAngle < 0) {\n\t endAngle += PI2;\n\t }\n\t\n\t var angle = ((startAngle > endAngle) ?\n\t (startAngle - endAngle) :\n\t (startAngle + PI2 - endAngle)),\n\t segmentAngle = ((outwards) ? -angle : PI2 - angle) / segments;\n\t\n\t vertices.push(startVertex);\n\t for (var i = 1; i < segments; ++i) {\n\t angle = startAngle + segmentAngle * i;\n\t vertices.push([\n\t center[0] + Math.cos(angle) * radius,\n\t center[1] + Math.sin(angle) * radius\n\t ]);\n\t }\n\t vertices.push(endVertex);\n\t};\n\t\n\t/**\n\t * Create padding polygon\n\t *\n\t * @param {Number} distance\n\t * @return {Array.<Number>}\n\t */\n\tOffset.prototype.padding = function(dist) {\n\t var offsetEdges = [],\n\t vertices = [],\n\t i, len, union;\n\t\n\t for (i = 0, len = this.edges.length; i < len; i++) {\n\t var edge = this.edges[i],\n\t dx = edge._outNormal[0] * dist,\n\t dy = edge._outNormal[1] * dist;\n\t offsetEdges.push(edge.offset(dx, dy));\n\t }\n\t\n\t for (i = 0, len = offsetEdges.length; i < len; i++) {\n\t var thisEdge = offsetEdges[i],\n\t prevEdge = offsetEdges[(i + len - 1) % len],\n\t vertex = intersection(\n\t prevEdge.current,\n\t prevEdge.next,\n\t thisEdge.current,\n\t thisEdge.next);\n\t\n\t if (vertex)\n\t vertices.push(vertex);\n\t else {\n\t this.createArc(\n\t vertices,\n\t this.edges[i].current,\n\t dist,\n\t prevEdge.next,\n\t thisEdge.current,\n\t this._arcSegments,\n\t false);\n\t }\n\t }\n\t union = GreinerHormann.union(vertices, vertices);\n\t vertices = union ? union[0] : vertices;\n\t\n\t vertices = this.ensureLastPoint(vertices);\n\t return vertices;\n\t};\n\t\n\t/**\n\t * Creates margin polygon\n\t * @param {Number} dist\n\t * @return {Array.<Object>}\n\t */\n\tOffset.prototype.margin = function(dist) {\n\t var offsetEdges = [],\n\t vertices = [],\n\t i, len, union;\n\t for (i = 0, len = this.edges.length; i < len; i++) {\n\t var edge = this.edges[i],\n\t dx = edge._inNormal[0] * dist,\n\t dy = edge._inNormal[1] * dist;\n\t\n\t offsetEdges.push(edge.offset(dx, dy));\n\t }\n\t\n\t for (i = 0, len = offsetEdges.length; i < len; i++) {\n\t var thisEdge = offsetEdges[i],\n\t prevEdge = offsetEdges[(i + len - 1) % len],\n\t vertex = intersection(\n\t prevEdge.current,\n\t prevEdge.next,\n\t thisEdge.current,\n\t thisEdge.next\n\t );\n\t\n\t if (vertex) {\n\t vertices.push(vertex);\n\t } else {\n\t this.createArc(\n\t vertices,\n\t this.edges[i].current,\n\t dist,\n\t prevEdge.next,\n\t thisEdge.current,\n\t this._arcSegments,\n\t true\n\t );\n\t }\n\t }\n\t\n\t union = GreinerHormann.union(vertices, vertices);\n\t if (union) {\n\t union = union[0];\n\t // that's the toll\n\t vertices = union.slice(0, union.length / 2);\n\t }\n\t\n\t vertices = this.ensureLastPoint(vertices);\n\t return vertices;\n\t};\n\t\n\t/**\n\t * @param {Array.<Object>} vertices\n\t * @return {Array.<Object>}\n\t */\n\tOffset.prototype.ensureLastPoint = function(vertices) {\n\t if (this._closed) {\n\t vertices.push([\n\t vertices[0][0],\n\t vertices[0][1]\n\t ]);\n\t }\n\t return vertices;\n\t};\n\t\n\t/**\n\t * Decides by the sign if it's a padding or a margin\n\t *\n\t * @param {Number} dist\n\t * @return {Array.<Object>}\n\t */\n\tOffset.prototype.offset = function(dist) {\n\t return dist === 0 ?\n\t this.vertices :\n\t (dist > 0 ? this.margin(dist) : this.padding(-dist));\n\t};\n\t\n\tmodule.exports = Offset;\n\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar clip = __webpack_require__(62);\n\t\n\tmodule.exports = {\n\t /**\n\t * @api\n\t * @param {Array.<Array.<Number>|Array.<Object>} polygonA\n\t * @param {Array.<Array.<Number>|Array.<Object>} polygonB\n\t * @return {Array.<Array.<Number>>|Array.<Array.<Object>|Null}\n\t */\n\t union: function(polygonA, polygonB) {\n\t return clip(polygonA, polygonB, false, false);\n\t },\n\t\n\t /**\n\t * @api\n\t * @param {Array.<Array.<Number>|Array.<Object>} polygonA\n\t * @param {Array.<Array.<Number>|Array.<Object>} polygonB\n\t * @return {Array.<Array.<Number>>|Array.<Array.<Object>>|Null}\n\t */\n\t intersection: function(polygonA, polygonB) {\n\t return clip(polygonA, polygonB, true, true);\n\t },\n\t\n\t /**\n\t * @api\n\t * @param {Array.<Array.<Number>|Array.<Object>} polygonA\n\t * @param {Array.<Array.<Number>|Array.<Object>} polygonB\n\t * @return {Array.<Array.<Number>>|Array.<Array.<Object>>|Null}\n\t */\n\t diff: function(polygonA, polygonB) {\n\t return clip(polygonA, polygonB, false, true);\n\t },\n\t\n\t clip: clip\n\t};\n\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Polygon = __webpack_require__(63);\n\t\n\t/**\n\t * Clip driver\n\t * @api\n\t * @param {Array.<Array.<Number>>} polygonA\n\t * @param {Array.<Array.<Number>>} polygonB\n\t * @param {Boolean} sourceForwards\n\t * @param {Boolean} clipForwards\n\t * @return {Array.<Array.<Number>>}\n\t */\n\tmodule.exports = function(polygonA, polygonB, eA, eB) {\n\t var result, source = new Polygon(polygonA),\n\t clip = new Polygon(polygonB),\n\t result = source.clip(clip, eA, eB);\n\t\n\t return result;\n\t};\n\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar Vertex = __webpack_require__(64);\n\tvar Intersection = __webpack_require__(65);\n\t\n\t/**\n\t * Polygon representation\n\t * @param {Array.<Array.<Number>>} p\n\t * @param {Boolean=} arrayVertices\n\t *\n\t * @constructor\n\t */\n\tvar Polygon = function(p, arrayVertices) {\n\t\n\t /**\n\t * @type {Vertex}\n\t */\n\t this.first = null;\n\t\n\t /**\n\t * @type {Number}\n\t */\n\t this.vertices = 0;\n\t\n\t /**\n\t * @type {Vertex}\n\t */\n\t this._lastUnprocessed = null;\n\t\n\t /**\n\t * Whether to handle input and output as [x,y] or {x:x,y:y}\n\t * @type {Boolean}\n\t */\n\t this._arrayVertices = (typeof arrayVertices === \"undefined\") ?\n\t Array.isArray(p[0]) :\n\t arrayVertices;\n\t\n\t for (var i = 0, len = p.length; i < len; i++) {\n\t this.addVertex(new Vertex(p[i]));\n\t }\n\t};\n\t\n\t/**\n\t * Add a vertex object to the polygon\n\t * (vertex is added at the 'end' of the list')\n\t *\n\t * @param vertex\n\t */\n\tPolygon.prototype.addVertex = function(vertex) {\n\t if (this.first == null) {\n\t this.first = vertex;\n\t this.first.next = vertex;\n\t this.first.prev = vertex;\n\t } else {\n\t var next = this.first,\n\t prev = next.prev;\n\t\n\t next.prev = vertex;\n\t vertex.next = next;\n\t vertex.prev = prev;\n\t prev.next = vertex;\n\t }\n\t this.vertices++;\n\t};\n\t\n\t/**\n\t * Inserts a vertex inbetween start and end\n\t *\n\t * @param {Vertex} vertex\n\t * @param {Vertex} start\n\t * @param {Vertex} end\n\t */\n\tPolygon.prototype.insertVertex = function(vertex, start, end) {\n\t var prev, curr = start;\n\t\n\t while (!curr.equals(end) && curr._distance < vertex._distance) {\n\t curr = curr.next;\n\t }\n\t\n\t vertex.next = curr;\n\t prev = curr.prev;\n\t\n\t vertex.prev = prev;\n\t prev.next = vertex;\n\t curr.prev = vertex;\n\t\n\t this.vertices++;\n\t};\n\t\n\t/**\n\t * Get next non-intersection point\n\t * @param {Vertex} v\n\t * @return {Vertex}\n\t */\n\tPolygon.prototype.getNext = function(v) {\n\t var c = v;\n\t while (c._isIntersection) {\n\t c = c.next;\n\t }\n\t return c;\n\t};\n\t\n\t/**\n\t * Unvisited intersection\n\t * @return {Vertex}\n\t */\n\tPolygon.prototype.getFirstIntersect = function() {\n\t var v = this._firstIntersect || this.first;\n\t\n\t do {\n\t if (v._isIntersection && !v._visited) {\n\t break;\n\t }\n\t\n\t v = v.next;\n\t } while (!v.equals(this.first));\n\t\n\t this._firstIntersect = v;\n\t return v;\n\t};\n\t\n\t/**\n\t * Does the polygon have unvisited vertices\n\t * @return {Boolean} [description]\n\t */\n\tPolygon.prototype.hasUnprocessed = function() {\n\t var v = this._lastUnprocessed || this.first;\n\t do {\n\t if (v._isIntersection && !v._visited) {\n\t this._lastUnprocessed = v;\n\t return true;\n\t }\n\t\n\t v = v.next;\n\t } while (!v.equals(this.first));\n\t\n\t this._lastUnprocessed = null;\n\t return false;\n\t};\n\t\n\t/**\n\t * The output depends on what you put in, arrays or objects\n\t * @return {Array.<Array<Number>|Array.<Object>}\n\t */\n\tPolygon.prototype.getPoints = function() {\n\t var points = [],\n\t v = this.first;\n\t\n\t if (this._arrayVertices) {\n\t do {\n\t points.push([v.x, v.y]);\n\t v = v.next;\n\t } while (v !== this.first);\n\t } else {\n\t do {\n\t points.push({\n\t x: v.x,\n\t y: v.y\n\t });\n\t v = v.next;\n\t } while (v !== this.first);\n\t }\n\t\n\t return points;\n\t};\n\t\n\t/**\n\t * Clip polygon against another one.\n\t * Result depends on algorithm direction:\n\t *\n\t * Intersection: forwards forwards\n\t * Union: backwars backwards\n\t * Diff: backwards forwards\n\t *\n\t * @param {Polygon} clip\n\t * @param {Boolean} sourceForwards\n\t * @param {Boolean} clipForwards\n\t */\n\tPolygon.prototype.clip = function(clip, sourceForwards, clipForwards) {\n\t var sourceVertex = this.first,\n\t clipVertex = clip.first,\n\t sourceInClip, clipInSource;\n\t\n\t // calculate and mark intersections\n\t do {\n\t if (!sourceVertex._isIntersection) {\n\t do {\n\t if (!clipVertex._isIntersection) {\n\t var i = new Intersection(\n\t sourceVertex,\n\t this.getNext(sourceVertex.next),\n\t clipVertex, clip.getNext(clipVertex.next));\n\t\n\t if (i.valid()) {\n\t var sourceIntersection =\n\t Vertex.createIntersection(i.x, i.y, i.toSource),\n\t clipIntersection =\n\t Vertex.createIntersection(i.x, i.y, i.toClip);\n\t\n\t sourceIntersection._corresponding = clipIntersection;\n\t clipIntersection._corresponding = sourceIntersection;\n\t\n\t this.insertVertex(\n\t sourceIntersection,\n\t sourceVertex,\n\t this.getNext(sourceVertex.next));\n\t clip.insertVertex(\n\t clipIntersection,\n\t clipVertex,\n\t clip.getNext(clipVertex.next));\n\t }\n\t }\n\t clipVertex = clipVertex.next;\n\t } while (!clipVertex.equals(clip.first));\n\t }\n\t\n\t sourceVertex = sourceVertex.next;\n\t } while (!sourceVertex.equals(this.first));\n\t\n\t // phase two - identify entry/exit points\n\t sourceVertex = this.first;\n\t clipVertex = clip.first;\n\t\n\t sourceInClip = sourceVertex.isInside(clip);\n\t clipInSource = clipVertex.isInside(this);\n\t\n\t sourceForwards ^= sourceInClip;\n\t clipForwards ^= clipInSource;\n\t\n\t do {\n\t if (sourceVertex._isIntersection) {\n\t sourceVertex._isEntry = sourceForwards;\n\t sourceForwards = !sourceForwards;\n\t }\n\t sourceVertex = sourceVertex.next;\n\t } while (!sourceVertex.equals(this.first));\n\t\n\t do {\n\t if (clipVertex._isIntersection) {\n\t clipVertex._isEntry = clipForwards;\n\t clipForwards = !clipForwards;\n\t }\n\t clipVertex = clipVertex.next;\n\t } while (!clipVertex.equals(clip.first));\n\t\n\t // phase three - construct a list of clipped polygons\n\t var list = [];\n\t\n\t while (this.hasUnprocessed()) {\n\t var current = this.getFirstIntersect(),\n\t // keep format\n\t clipped = new Polygon([], this._arrayVertices);\n\t\n\t clipped.addVertex(new Vertex(current.x, current.y));\n\t do {\n\t current.visit();\n\t if (current._isEntry) {\n\t do {\n\t current = current.next;\n\t clipped.addVertex(new Vertex(current.x, current.y));\n\t } while (!current._isIntersection);\n\t\n\t } else {\n\t do {\n\t current = current.prev;\n\t clipped.addVertex(new Vertex(current.x, current.y));\n\t } while (!current._isIntersection);\n\t }\n\t current = current._corresponding;\n\t } while (!current._visited);\n\t\n\t list.push(clipped.getPoints());\n\t }\n\t\n\t if (list.length === 0) {\n\t if (sourceInClip) {\n\t list.push(this.getPoints());\n\t }\n\t if (clipInSource) {\n\t list.push(clip.getPoints());\n\t }\n\t if (list.length === 0) {\n\t list = null;\n\t }\n\t }\n\t\n\t return list;\n\t};\n\t\n\tmodule.exports = Polygon;\n\n\n/***/ },\n/* 64 */\n/***/ function(module, exports) {\n\n\t/**\n\t * Vertex representation\n\t *\n\t * @param {Number|Array.<Number>} x\n\t * @param {Number=} y\n\t *\n\t * @constructor\n\t */\n\tvar Vertex = function(x, y) {\n\t\n\t if (arguments.length === 1) {\n\t // Coords\n\t if (Array.isArray(x)) {\n\t y = x[1];\n\t x = x[0];\n\t } else {\n\t y = x.y;\n\t x = x.x;\n\t }\n\t }\n\t\n\t /**\n\t * X coordinate\n\t * @type {Number}\n\t */\n\t this.x = x;\n\t\n\t /**\n\t * Y coordinate\n\t * @type {Number}\n\t */\n\t this.y = y;\n\t\n\t /**\n\t * Next node\n\t * @type {Vertex}\n\t */\n\t this.next = null;\n\t\n\t /**\n\t * Previous vertex\n\t * @type {Vertex}\n\t */\n\t this.prev = null;\n\t\n\t /**\n\t * Corresponding intersection in other polygon\n\t */\n\t this._corresponding = null;\n\t\n\t /**\n\t * Distance from previous\n\t */\n\t this._distance = 0.0;\n\t\n\t /**\n\t * Entry/exit point in another polygon\n\t * @type {Boolean}\n\t */\n\t this._isEntry = true;\n\t\n\t /**\n\t * Intersection vertex flag\n\t * @type {Boolean}\n\t */\n\t this._isIntersection = false;\n\t\n\t /**\n\t * Loop check\n\t * @type {Boolean}\n\t */\n\t this._visited = false;\n\t};\n\t\n\t/**\n\t * Creates intersection vertex\n\t * @param {Number} x\n\t * @param {Number} y\n\t * @param {Number} distance\n\t * @return {Vertex}\n\t */\n\tVertex.createIntersection = function(x, y, distance) {\n\t var vertex = new Vertex(x, y);\n\t vertex._distance = distance;\n\t vertex._isIntersection = true;\n\t vertex._isEntry = false;\n\t return vertex;\n\t};\n\t\n\t/**\n\t * Mark as visited\n\t */\n\tVertex.prototype.visit = function() {\n\t this._visited = true;\n\t if (this._corresponding !== null && !this._corresponding._visited) {\n\t this._corresponding.visit();\n\t }\n\t};\n\t\n\t/**\n\t * Convenience\n\t * @param {Vertex} v\n\t * @return {Boolean}\n\t */\n\tVertex.prototype.equals = function(v) {\n\t return this.x === v.x && this.y === v.y;\n\t};\n\t\n\t/**\n\t * Check if vertex is inside a polygon by odd-even rule:\n\t * If the number of intersections of a ray out of the point and polygon\n\t * segments is odd - the point is inside.\n\t * @param {Polygon} poly\n\t * @return {Boolean}\n\t */\n\tVertex.prototype.isInside = function(poly) {\n\t var oddNodes = false,\n\t vertex = poly.first,\n\t next = vertex.next,\n\t x = this.x,\n\t y = this.y;\n\t\n\t do {\n\t if ((vertex.y < y && next.y >= y ||\n\t next.y < y && vertex.y >= y) &&\n\t (vertex.x <= x || next.x <= x)) {\n\t\n\t oddNodes ^= (vertex.x + (y - vertex.y) /\n\t (next.y - vertex.y) * (next.x - vertex.x) < x);\n\t }\n\t\n\t vertex = vertex.next;\n\t next = vertex.next || poly.first;\n\t } while (!vertex.equals(poly.first));\n\t\n\t return oddNodes;\n\t};\n\t\n\tmodule.exports = Vertex;\n\n\n/***/ },\n/* 65 */\n/***/ function(module, exports) {\n\n\t/**\n\t * Intersection\n\t * @param {Vertex} s1\n\t * @param {Vertex} s2\n\t * @param {Vertex} c1\n\t * @param {Vertex} c2\n\t * @constructor\n\t */\n\tvar Intersection = function(s1, s2, c1, c2) {\n\t\n\t /**\n\t * @type {Number}\n\t */\n\t this.x = 0.0;\n\t\n\t /**\n\t * @type {Number}\n\t */\n\t this.y = 0.0;\n\t\n\t /**\n\t * @type {Number}\n\t */\n\t this.toSource = 0.0;\n\t\n\t /**\n\t * @type {Number}\n\t */\n\t this.toClip = 0.0;\n\t\n\t var d = (c2.y - c1.y) * (s2.x - s1.x) - (c2.x - c1.x) * (s2.y - s1.y);\n\t\n\t if (d === 0) {\n\t return;\n\t }\n\t\n\t /**\n\t * @type {Number}\n\t */\n\t this.toSource = ((c2.x - c1.x) * (s1.y - c1.y) - (c2.y - c1.y) * (s1.x - c1.x)) / d;\n\t\n\t /**\n\t * @type {Number}\n\t */\n\t this.toClip = ((s2.x - s1.x) * (s1.y - c1.y) - (s2.y - s1.y) * (s1.x - c1.x)) / d;\n\t\n\t if (this.valid()) {\n\t this.x = s1.x + this.toSource * (s2.x - s1.x);\n\t this.y = s1.y + this.toSource * (s2.y - s1.y);\n\t }\n\t};\n\t\n\t/**\n\t * @return {Boolean}\n\t */\n\tIntersection.prototype.valid = function() {\n\t return (0 < this.toSource && this.toSource < 1) && (0 < this.toClip && this.toClip < 1);\n\t};\n\t\n\tmodule.exports = Intersection;\n\n\n/***/ },\n/* 66 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\t/**\n\t * Offset edge of the polygon\n\t *\n\t * @param {Object} current\n\t * @param {Object} next\n\t * @cosntructor\n\t */\n\tfunction Edge(current, next) {\n\t\n\t /**\n\t * @type {Object}\n\t */\n\t this.current = current;\n\t\n\t /**\n\t * @type {Object}\n\t */\n\t this.next = next;\n\t\n\t /**\n\t * @type {Object}\n\t */\n\t this._inNormal = this.inwardsNormal();\n\t\n\t /**\n\t * @type {Object}\n\t */\n\t this._outNormal = this.outwardsNormal();\n\t};\n\t\n\t/**\n\t * Creates outwards normal\n\t * @return {Object}\n\t */\n\tEdge.prototype.outwardsNormal = function() {\n\t var inwards = this.inwardsNormal();\n\t return [\n\t -inwards[0],\n\t -inwards[1]\n\t ];\n\t};\n\t\n\t/**\n\t * Creates inwards normal\n\t * @return {Object}\n\t */\n\tEdge.prototype.inwardsNormal = function() {\n\t var dx = this.next[0] - this.current[0],\n\t dy = this.next[1] - this.current[1],\n\t edgeLength = Math.sqrt(dx * dx + dy * dy);\n\t\n\t return [\n\t -dy / edgeLength,\n\t dx / edgeLength\n\t ];\n\t};\n\t\n\t/**\n\t * Offsets the edge by dx, dy\n\t * @param {Number} dx\n\t * @param {Number} dy\n\t * @return {Edge}\n\t */\n\tEdge.prototype.offset = function(dx, dy) {\n\t var current = this.current,\n\t next = this.next;\n\t\n\t return new Edge([\n\t current[0] + dx,\n\t current[1] + dy\n\t ], [\n\t next[0] + dx,\n\t next[1] + dy\n\t ]);\n\t};\n\t\n\tmodule.exports = Edge;\n\n\n/***/ },\n/* 67 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\t/**\n\t * Vector intersection, if present\n\t *\n\t * @param {Object} A0\n\t * @param {Object} A1\n\t * @param {Object} B0\n\t * @param {Object} B1\n\t *\n\t * @return {Object|null}\n\t */\n\tmodule.exports = function intersection(A0, A1, B0, B1) {\n\t var den = (B1[1] - B0[1]) * (A1[0] - A0[0]) -\n\t (B1[0] - B0[0]) * (A1[1] - A0[1]);\n\t\n\t // lines are parallel or conincident\n\t if (den == 0) {\n\t return null;\n\t }\n\t\n\t var ua = ((B1[0] - B0[0]) * (A0[1] - B0[1]) -\n\t (B1[1] - B0[1]) * (A0[0] - B0[0])) / den;\n\t\n\t var ub = ((A1[0] - A0[0]) * (A0[1] - B0[1]) -\n\t (A1[1] - A0[1]) * (A0[0] - B0[0])) / den;\n\t\n\t if (ua < 0 || ub < 0 || ua > 1 || ub > 1) {\n\t return null;\n\t }\n\t\n\t return [\n\t A0[0] + ua * (A1[0] - A0[0]),\n\t A0[1] + ua * (A1[1] - A0[1])\n\t ];\n\t};\n\n\n/***/ }\n/******/ ])\n});\n;"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 09615a9482fefda02e10\n **/","import World from './World';\nimport Controls from './controls/index';\nimport EnvironmentLayer from './layer/environment/EnvironmentLayer';\nimport ImageTileLayer from './layer/tile/ImageTileLayer';\nimport TopoJSONTileLayer from './layer/tile/TopoJSONTileLayer';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\n\nconst VIZI = {\n version: '0.3',\n\n // Public API\n World: World,\n Controls: Controls,\n EnvironmentLayer: EnvironmentLayer,\n ImageTileLayer: ImageTileLayer,\n TopoJSONTileLayer: TopoJSONTileLayer,\n Point: Point,\n LatLon: LatLon\n};\n\nexport default VIZI;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vizicities.js\n **/","import EventEmitter from 'eventemitter3';\nimport extend from 'lodash.assign';\nimport CRS from './geo/crs/index';\nimport Point from './geo/Point';\nimport LatLon from './geo/LatLon';\nimport Engine from './engine/Engine';\n\n// Pretty much any event someone using ViziCities would need will be emitted or\n// proxied by World (eg. render events, etc)\n\nclass World extends EventEmitter {\n constructor(domId, options) {\n super();\n\n var defaults = {\n crs: CRS.EPSG3857,\n skybox: false\n };\n\n this.options = extend(defaults, options);\n\n this._layers = [];\n this._controls = [];\n\n this._initContainer(domId);\n this._initEngine();\n this._initEnvironment();\n this._initEvents();\n\n // Kick off the update and render loop\n this._update();\n }\n\n _initContainer(domId) {\n this._container = document.getElementById(domId);\n }\n\n _initEngine() {\n this._engine = Engine(this._container);\n\n // Engine events\n //\n // Consider proxying these through events on World for public access\n // this._engine.on('preRender', () => {});\n // this._engine.on('postRender', () => {});\n }\n\n _initEnvironment() {\n // Not sure if I want to keep this as a private API\n //\n // Makes sense to allow others to customise their environment so perhaps\n // add some method of disable / overriding the environment settings\n this._environment = VIZI.EnvironmentLayer({\n skybox: this.options.skybox\n }).addTo(this);\n }\n\n _initEvents() {\n this.on('controlsMoveEnd', this._onControlsMoveEnd);\n }\n\n _onControlsMoveEnd(point) {\n var _point = Point(point.x, point.z);\n this._resetView(this.pointToLatLon(_point), _point);\n }\n\n // Reset world view\n _resetView(latlon, point) {\n this.emit('preResetView');\n\n this._moveStart();\n this._move(latlon, point);\n this._moveEnd();\n\n this.emit('postResetView');\n }\n\n _moveStart() {\n this.emit('moveStart');\n }\n\n _move(latlon, point) {\n this._lastPosition = latlon;\n this.emit('move', latlon, point);\n }\n _moveEnd() {\n this.emit('moveEnd');\n }\n\n _update() {\n var delta = this._engine.clock.getDelta();\n\n // Once _update is called it will run forever, for now\n window.requestAnimationFrame(this._update.bind(this));\n\n // Update controls\n this._controls.forEach(controls => {\n controls.update();\n });\n\n this.emit('preUpdate', delta);\n this._engine.update(delta);\n this.emit('postUpdate', delta);\n }\n\n // Set world view\n setView(latlon) {\n // Store initial geographic coordinate for the [0,0,0] world position\n //\n // The origin point doesn't move in three.js / 3D space so only set it once\n // here instead of every time _resetView is called\n //\n // If it was updated every time then coorindates would shift over time and\n // would be out of place / context with previously-placed points (0,0 would\n // refer to a different point each time)\n this._originLatlon = latlon;\n this._originPoint = this.project(latlon);\n\n this._resetView(latlon);\n return this;\n }\n\n // Return world geographic position\n getPosition() {\n return this._lastPosition;\n }\n\n // Transform geographic coordinate to world point\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the origin point of the projection (not the world)\n project(latlon) {\n return this.options.crs.latLonToPoint(LatLon(latlon));\n }\n\n // Transform world point to geographic coordinate\n //\n // This doesn't take into account the origin offset\n //\n // For example, this takes a point relative to the origin point of the\n // projection (not the world) and returns a geographic coordinate\n unproject(point) {\n return this.options.crs.pointToLatLon(Point(point));\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a geographic coordinate and returns a point\n // relative to the three.js / 3D origin (0,0)\n latLonToPoint(latlon) {\n var projectedPoint = this.project(LatLon(latlon));\n return projectedPoint._subtract(this._originPoint);\n }\n\n // Takes into account the origin offset\n //\n // For example, this takes a point relative to the three.js / 3D origin (0,0)\n // and returns the exact geographic coordinate at that point\n pointToLatLon(point) {\n var projectedPoint = Point(point).add(this._originPoint);\n return this.unproject(projectedPoint);\n }\n\n // Return pointscale for a given geographic coordinate\n pointScale(latlon, accurate) {\n return this.options.crs.pointScale(latlon, accurate);\n }\n\n // Convert from real meters to world units\n //\n // TODO: Would be nice not to have to pass in a pointscale here\n metresToWorld(metres, pointScale, zoom) {\n return this.options.crs.metresToWorld(metres, pointScale, zoom);\n }\n\n // Convert from real meters to world units\n //\n // TODO: Would be nice not to have to pass in a pointscale here\n worldToMetres(worldUnits, pointScale, zoom) {\n return this.options.crs.worldToMetres(worldUnits, pointScale, zoom);\n }\n\n // Unsure if it's a good idea to expose this here for components like\n // GridLayer to use (eg. to keep track of a frustum)\n getCamera() {\n return this._engine._camera;\n }\n\n addLayer(layer) {\n layer._addToWorld(this);\n\n this._layers.push(layer);\n\n // Could move this into Layer but it'll do here for now\n this._engine._scene.add(layer._layer);\n\n this.emit('layerAdded', layer);\n return this;\n }\n\n // Remove layer and perform clean up operations\n removeLayer(layer) {\n var layerIndex = this._layers.indexOf(layer);\n\n if (layerIndex > -1) {\n // Remove from this._layers\n this._layers.splice(layerIndex, 1);\n };\n\n this._engine._scene.remove(layer._layer);\n\n layer.destroy();\n\n this.emit('layerRemoved');\n return this;\n }\n\n addControls(controls) {\n controls._addToWorld(this);\n\n this._controls.push(controls);\n\n this.emit('controlsAdded', controls);\n return this;\n }\n\n removeControls(controls) {}\n}\n\n// Initialise without requiring new keyword\nexport default function(domId, options) {\n return new World(domId, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/World.js\n **/","'use strict';\n\n//\n// We store our EE objects in a plain object whose properties are event names.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// `~` to make sure that the built-in object properties are not overridden or\n// used as an attack vector.\n// We also assume that `Object.create(null)` is available when the event name\n// is an ES6 Symbol.\n//\nvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\n/**\n * Representation of a single EventEmitter function.\n *\n * @param {Function} fn Event handler to be called.\n * @param {Mixed} context Context for function execution.\n * @param {Boolean} once Only emit once\n * @api private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Minimal EventEmitter interface that is molded against the Node.js\n * EventEmitter interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() { /* Nothing to set */ }\n\n/**\n * Holds the assigned EventEmitters by name.\n *\n * @type {Object}\n * @private\n */\nEventEmitter.prototype._events = undefined;\n\n/**\n * Return a list of assigned event listeners.\n *\n * @param {String} event The events that should be listed.\n * @param {Boolean} exists We only need to know if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n var evt = prefix ? prefix + event : event\n , available = this._events && this._events[evt];\n\n if (exists) return !!available;\n if (!available) return [];\n if (available.fn) return [available.fn];\n\n for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n ee[i] = available[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Emit an event to all registered event listeners.\n *\n * @param {String} event The name of the event.\n * @returns {Boolean} Indication if we've emitted an event.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if ('function' === typeof listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Register a new EventListener for the given event.\n *\n * @param {String} event Name of the event.\n * @param {Functon} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n var listener = new EE(fn, context || this)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Add an EventListener that's only called once.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} context The context of the function.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n var listener = new EE(fn, context || this, true)\n , evt = prefix ? prefix + event : event;\n\n if (!this._events) this._events = prefix ? {} : Object.create(null);\n if (!this._events[evt]) this._events[evt] = listener;\n else {\n if (!this._events[evt].fn) this._events[evt].push(listener);\n else this._events[evt] = [\n this._events[evt], listener\n ];\n }\n\n return this;\n};\n\n/**\n * Remove event listeners.\n *\n * @param {String} event The event we want to remove.\n * @param {Function} fn The listener that we need to find.\n * @param {Mixed} context Only remove listeners matching this context.\n * @param {Boolean} once Only remove once listeners.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events || !this._events[evt]) return this;\n\n var listeners = this._events[evt]\n , events = [];\n\n if (fn) {\n if (listeners.fn) {\n if (\n listeners.fn !== fn\n || (once && !listeners.once)\n || (context && listeners.context !== context)\n ) {\n events.push(listeners);\n }\n } else {\n for (var i = 0, length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn\n || (once && !listeners[i].once)\n || (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) {\n this._events[evt] = events.length === 1 ? events[0] : events;\n } else {\n delete this._events[evt];\n }\n\n return this;\n};\n\n/**\n * Remove all listeners or only the listeners for the specified event.\n *\n * @param {String} event The event want to remove all listeners for.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n if (!this._events) return this;\n\n if (event) delete this._events[prefix ? prefix + event : event];\n else this._events = prefix ? {} : Object.create(null);\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/eventemitter3/index.js\n ** module id = 2\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar keys = require('lodash.keys'),\n rest = require('lodash.rest');\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if ((!eq(objValue, value) ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object) {\n return copyObjectWith(source, props, object);\n}\n\n/**\n * This function is like `copyObject` except that it accepts a function to\n * customize copied values.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property names to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObjectWith(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index],\n newValue = customizer ? customizer(object[key], source[key], key, object, source) : source[key];\n\n assignValue(object, key, newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return rest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = typeof customizer == 'function' ? (length--, customizer) : undefined;\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Checks if the provided arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Assigns own enumerable properties of source objects to the destination\n * object. Source objects are applied from left to right. Subsequent sources\n * overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * function Foo() {\n * this.c = 3;\n * }\n *\n * function Bar() {\n * this.e = 5;\n * }\n *\n * Foo.prototype.d = 4;\n * Bar.prototype.f = 6;\n *\n * _.assign({ 'a': 1 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3, 'e': 5 }\n */\nvar assign = createAssigner(function(object, source) {\n copyObject(source, keys(source), object);\n});\n\nmodule.exports = assign;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.assign/index.js\n ** module id = 3\n ** module chunks = 0\n **/","/**\n * lodash 4.0.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n stringTag = '[object String]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;\n length = length == null ? MAX_SAFE_INTEGER : length;\n return value > -1 && value % 1 == 0 && value < length;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar getPrototypeOf = Object.getPrototypeOf,\n propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = Object.keys;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n // that are composed entirely of index properties, return `false` for\n // `hasOwnProperty` checks of them.\n return hasOwnProperty.call(object, key) ||\n (typeof object == 'object' && key in object && getPrototypeOf(object) === null);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't skip the constructor\n * property of prototypes or treat sparse arrays as dense.\n *\n * @private\n * @type Function\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n return nativeKeys(Object(object));\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)\n * that affects Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Creates an array of index keys for `object` values of arrays,\n * `arguments` objects, and strings, otherwise `null` is returned.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array|null} Returns index keys, else `null`.\n */\nfunction indexKeys(object) {\n var length = object ? object.length : undefined;\n if (isLength(length) &&\n (isArray(object) || isString(object) || isArguments(object))) {\n return baseTimes(length, String);\n }\n return null;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null &&\n !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n var isProto = isPrototype(object);\n if (!(isProto || isArrayLike(object))) {\n return baseKeys(object);\n }\n var indexes = indexKeys(object),\n skipIndexes = !!indexes,\n result = indexes || [],\n length = result.length;\n\n for (var key in object) {\n if (baseHas(object, key) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n !(isProto && key == 'constructor')) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = keys;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.keys/index.js\n ** module id = 4\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308,\n NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {...*} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n var length = args.length;\n switch (length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that invokes `func` with the `this` binding of the\n * created function and arguments from `start` and beyond provided as an array.\n *\n * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n * @example\n *\n * var say = _.rest(function(what, names) {\n * return what + ' ' + _.initial(names).join(', ') +\n * (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n * });\n *\n * say('hello', 'fred', 'barney', 'pebbles');\n * // => 'hello fred, barney, & pebbles'\n */\nfunction rest(func, start) {\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n switch (start) {\n case 0: return func.call(this, array);\n case 1: return func.call(this, args[0], array);\n case 2: return func.call(this, args[0], args[1], array);\n }\n var otherArgs = Array(start + 1);\n index = -1;\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3');\n * // => 3\n */\nfunction toInteger(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n var remainder = value % 1;\n return value === value ? (remainder ? value - remainder : value) : 0;\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = rest;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.rest/index.js\n ** module id = 5\n ** module chunks = 0\n **/","import EPSG3857 from './CRS.EPSG3857';\nimport {EPSG900913} from './CRS.EPSG3857';\nimport EPSG3395 from './CRS.EPSG3395';\nimport EPSG4326 from './CRS.EPSG4326';\nimport Simple from './CRS.Simple';\nimport Proj4 from './CRS.Proj4';\n\nconst CRS = {};\n\nCRS.EPSG3857 = EPSG3857;\nCRS.EPSG900913 = EPSG900913;\nCRS.EPSG3395 = EPSG3395;\nCRS.EPSG4326 = EPSG4326;\nCRS.Simple = Simple;\nCRS.Proj4 = Proj4;\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/index.js\n **/","/*\n * CRS.EPSG3857 (WGS 84 / Pseudo-Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport SphericalMercator from '../projection/Projection.SphericalMercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3857 = {\n code: 'EPSG:3857',\n projection: SphericalMercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * SphericalMercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * SphericalMercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3857 = extend({}, Earth, _EPSG3857);\n\nconst EPSG900913 = extend({}, EPSG3857, {\n code: 'EPSG:900913'\n});\n\nexport {EPSG900913};\n\nexport default EPSG3857;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/CRS.EPSG3857.js\n **/","/*\n * CRS.Earth is the base class for all CRS representing Earth.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Earth.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLon from '../LatLon';\n\nconst Earth = {\n wrapLon: [-180, 180],\n\n R: 6378137,\n\n // Distance between two geographical points using spherical law of cosines\n // approximation or Haversine\n //\n // See: http://www.movable-type.co.uk/scripts/latlong.html\n distance: function(latlon1, latlon2, accurate) {\n var rad = Math.PI / 180;\n\n var lat1;\n var lat2;\n\n var a;\n\n if (!accurate) {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n a = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos((latlon2.lon - latlon1.lon) * rad);\n\n return this.R * Math.acos(Math.min(a, 1));\n } else {\n lat1 = latlon1.lat * rad;\n lat2 = latlon2.lat * rad;\n\n var lon1 = latlon1.lon * rad;\n var lon2 = latlon2.lon * rad;\n\n var deltaLat = lat2 - lat1;\n var deltaLon = lon2 - lon1;\n\n var halfDeltaLat = deltaLat / 2;\n var halfDeltaLon = deltaLon / 2;\n\n a = Math.sin(halfDeltaLat) * Math.sin(halfDeltaLat) + Math.cos(lat1) * Math.cos(lat2) * Math.sin(halfDeltaLon) * Math.sin(halfDeltaLon);\n\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return this.R * c;\n }\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Defaults to a scale factor of 1 if no calculation method exists\n //\n // Probably need to run this through the CRS transformation or similar so the\n // resulting scale is relative to the dimensions of the world space\n // Eg. 1 metre in projected space is likly scaled up or down to some other\n // number\n pointScale: function(latlon, accurate) {\n return (this.projection.pointScale) ? this.projection.pointScale(latlon, accurate) : [1, 1];\n },\n\n // Convert real metres to projected units\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n metresToProjected: function(metres, pointScale) {\n return metres * pointScale[1];\n },\n\n // Convert projected units to real metres\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n projectedToMetres: function(projectedUnits, pointScale) {\n return projectedUnits / pointScale[1];\n },\n\n // Convert real metres to a value in world (WebGL) units\n metresToWorld: function(metres, pointScale, zoom) {\n // Transform metres to projected metres using the latitude point scale\n //\n // Latitude scale is chosen because it fluctuates more than longitude\n var projectedMetres = this.metresToProjected(metres, pointScale);\n\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n // Scale projected metres\n var scaledMetres = (scale * (this.transformScale * projectedMetres));\n\n // Not entirely sure why this is neccessary\n if (zoom) {\n scaledMetres /= pointScale[1];\n }\n\n return scaledMetres;\n },\n\n // Convert world (WebGL) units to a value in real metres\n worldToMetres: function(worldUnits, pointScale, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var projectedUnits = ((worldUnits / scale) / this.transformScale);\n var realMetres = this.projectedToMetres(projectedUnits, pointScale);\n\n // Not entirely sure why this is neccessary\n if (zoom) {\n realMetres *= pointScale[1];\n }\n\n return realMetres;\n }\n};\n\nexport default extend({}, CRS, Earth);\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/CRS.Earth.js\n **/","/*\n * CRS is the base object for all defined CRS (Coordinate Reference Systems)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\nimport wrapNum from '../../util/wrapNum';\n\nconst CRS = {\n // Scale factor determines final dimensions of world space\n //\n // Projection transformation in range -1 to 1 is multiplied by scale factor to\n // find final world coordinates\n //\n // Scale factor can be considered as half the amount of the desired dimension\n // for the largest side when transformation is equal to 1 or -1, or as the\n // distance between 0 and 1 on the largest side\n //\n // For example, if you want the world dimensions to be between -1000 and 1000\n // then the scale factor will be 1000\n scaleFactor: 1000000,\n\n // Converts geo coords to pixel / WebGL ones\n latLonToPoint: function(latlon, zoom) {\n var projectedPoint = this.projection.project(latlon);\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n return this.transformation._transform(projectedPoint, scale);\n },\n\n // Converts pixel / WebGL coords to geo coords\n pointToLatLon: function(point, zoom) {\n var scale = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n scale /= 2;\n }\n\n var untransformedPoint = this.transformation.untransform(point, scale);\n\n return this.projection.unproject(untransformedPoint);\n },\n\n // Converts geo coords to projection-specific coords (e.g. in meters)\n project: function(latlon) {\n return this.projection.project(latlon);\n },\n\n // Converts projected coords to geo coords\n unproject: function(point) {\n return this.projection.unproject(point);\n },\n\n // If zoom is provided, returns the map width in pixels for a given zoom\n // Else, provides fixed scale value\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom >= 0) {\n return 256 * Math.pow(2, zoom);\n // Else, return fixed scale value to expand projected coordinates from\n // their 0 to 1 range into something more practical\n } else {\n return this.scaleFactor;\n }\n },\n\n // Returns zoom level for a given scale value\n // This only works with a scale value that is based on map pixel width\n zoom: function(scale) {\n return Math.log(scale / 256) / Math.LN2;\n },\n\n // Returns the bounds of the world in projected coords if applicable\n getProjectedBounds: function(zoom) {\n if (this.infinite) { return null; }\n\n var b = this.projection.bounds;\n var s = this.scale(zoom);\n\n // Half scale if using zoom as WebGL origin is in the centre, not top left\n if (zoom) {\n s /= 2;\n }\n\n // Bottom left\n var min = this.transformation.transform(Point(b[0]), s);\n\n // Top right\n var max = this.transformation.transform(Point(b[1]), s);\n\n return [min, max];\n },\n\n // Whether a coordinate axis wraps in a given range (e.g. longitude from -180 to 180); depends on CRS\n // wrapLon: [min, max],\n // wrapLat: [min, max],\n\n // If true, the coordinate space will be unbounded (infinite in all directions)\n // infinite: false,\n\n // Wraps geo coords in certain ranges if applicable\n wrapLatLon: function(latlon) {\n var lat = this.wrapLat ? wrapNum(latlon.lat, this.wrapLat, true) : latlon.lat;\n var lon = this.wrapLon ? wrapNum(latlon.lon, this.wrapLon, true) : latlon.lon;\n var alt = latlon.alt;\n\n return LatLon(lat, lon, alt);\n }\n};\n\nexport default CRS;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/CRS.js\n **/","/*\n * LatLon is a helper class for ensuring consistent geographic coordinates.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/LatLng.js\n */\n\nclass LatLon {\n constructor(lat, lon, alt) {\n if (isNaN(lat) || isNaN(lon)) {\n throw new Error('Invalid LatLon object: (' + lat + ', ' + lon + ')');\n }\n\n this.lat = +lat;\n this.lon = +lon;\n\n if (alt !== undefined) {\n this.alt = +alt;\n }\n }\n\n clone() {\n return new LatLon(this.lat, this.lon, this.alt);\n }\n}\n\n// Initialise without requiring new keyword\n//\n// Accepts (LatLon), ([lat, lon, alt]), ([lat, lon]) and (lat, lon, alt)\n// Also converts between lng and lon\nexport default function(a, b, c) {\n if (a instanceof LatLon) {\n return a;\n }\n if (Array.isArray(a) && typeof a[0] !== 'object') {\n if (a.length === 3) {\n return new LatLon(a[0], a[1], a[2]);\n }\n if (a.length === 2) {\n return new LatLon(a[0], a[1]);\n }\n return null;\n }\n if (a === undefined || a === null) {\n return a;\n }\n if (typeof a === 'object' && 'lat' in a) {\n return new LatLon(a.lat, 'lng' in a ? a.lng : a.lon, a.alt);\n }\n if (b === undefined) {\n return null;\n }\n return new LatLon(a, b, c);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/LatLon.js\n **/","/*\n * Point is a helper class for ensuring consistent world positions.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/Point.js\n */\n\nclass Point {\n constructor(x, y, round) {\n this.x = (round ? Math.round(x) : x);\n this.y = (round ? Math.round(y) : y);\n }\n\n clone() {\n return new Point(this.x, this.y);\n }\n\n // Non-destructive\n add(point) {\n return this.clone()._add(_point(point));\n }\n\n // Destructive\n _add(point) {\n this.x += point.x;\n this.y += point.y;\n return this;\n }\n\n // Non-destructive\n subtract(point) {\n return this.clone()._subtract(_point(point));\n }\n\n // Destructive\n _subtract(point) {\n this.x -= point.x;\n this.y -= point.y;\n return this;\n }\n}\n\n// Accepts (point), ([x, y]) and (x, y, round)\nvar _point = function(x, y, round) {\n if (x instanceof Point) {\n return x;\n }\n if (Array.isArray(x)) {\n return new Point(x[0], x[1]);\n }\n if (x === undefined || x === null) {\n return x;\n }\n return new Point(x, y, round);\n};\n\n// Initialise without requiring new keyword\nexport default _point;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/Point.js\n **/","/*\n * Wrap the given number to lie within a certain range (eg. longitude)\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/core/Util.js\n */\n\nvar wrapNum = function(x, range, includeMax) {\n var max = range[1];\n var min = range[0];\n var d = max - min;\n return x === max && includeMax ? x : ((x - min) % d + d) % d + min;\n};\n\nexport default wrapNum;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/wrapNum.js\n **/","/*\n * Spherical Mercator is the most popular map projection, used by EPSG:3857 CRS\n * used by default.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.SphericalMercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst SphericalMercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n MAX_LATITUDE: 85.0511287798,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var max = this.MAX_LATITUDE;\n var lat = Math.max(Math.min(max, latlon.lat), -max);\n var sin = Math.sin(lat * d);\n\n return Point(\n this.R * latlon.lon * d,\n this.R * Math.log((1 + sin) / (1 - sin)) / 2\n );\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n\n return LatLon(\n (2 * Math.atan(Math.exp(point.y / this.R)) - (Math.PI / 2)) * d,\n point.x * d / this.R\n );\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // Accurate scale factor uses proper Web Mercator scaling\n // See pg.9: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n // See: http://jsfiddle.net/robhawkes/yws924cf/\n pointScale: function(latlon, accurate) {\n var rad = Math.PI / 180;\n\n var k;\n\n if (!accurate) {\n k = 1 / Math.cos(latlon.lat * rad);\n\n // [scaleX, scaleY]\n return [k, k];\n } else {\n var lat = latlon.lat * rad;\n var lon = latlon.lon * rad;\n\n var a = this.R;\n\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n\n var cosLat = Math.cos(lat);\n\n // Radius meridian\n var p = a * (1 - this.ECC2) / Math.pow(1 - this.ECC2 * sinLat2, 3 / 2);\n\n // Radius prime meridian\n var v = a / Math.sqrt(1 - this.ECC2 * sinLat2);\n\n // Scale N/S\n var h = (a / p) / cosLat;\n\n // Scale E/W\n k = (a / v) / cosLat;\n\n // [scaleX, scaleY]\n return [k, h];\n }\n },\n\n // Not using this.R due to scoping\n bounds: (function() {\n var d = 6378137 * Math.PI;\n return [[-d, -d], [d, d]];\n })()\n};\n\nexport default SphericalMercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.SphericalMercator.js\n **/","/*\n * Transformation is an utility class to perform simple point transformations\n * through a 2d-matrix.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geometry/Transformation.js\n */\n\nimport Point from '../geo/Point';\n\nclass Transformation {\n constructor(a, b, c, d) {\n this._a = a;\n this._b = b;\n this._c = c;\n this._d = d;\n }\n\n transform(point, scale) {\n // Copy input point as to not destroy the original data\n return this._transform(point.clone(), scale);\n }\n\n // Destructive transform (faster)\n _transform(point, scale) {\n scale = scale || 1;\n\n point.x = scale * (this._a * point.x + this._b);\n point.y = scale * (this._c * point.y + this._d);\n return point;\n }\n\n untransform(point, scale) {\n scale = scale || 1;\n return Point(\n (point.x / scale - this._b) / this._a,\n (point.y / scale - this._d) / this._c\n );\n }\n}\n\nexport default Transformation;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/Transformation.js\n **/","/*\n * CRS.EPSG3395 (WGS 84 / World Mercator) CRS implementation.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3395.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Mercator from '../projection/Projection.Mercator';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG3395 = {\n code: 'EPSG:3395',\n projection: Mercator,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / (Math.PI * Mercator.R),\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n transformation: (function() {\n // TODO: Cannot use this.transformScale due to scope\n var scale = 1 / (Math.PI * Mercator.R);\n\n return new Transformation(scale, 0, -scale, 0);\n }())\n};\n\nconst EPSG3395 = extend({}, Earth, _EPSG3395);\n\nexport default EPSG3395;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/CRS.EPSG3395.js\n **/","/*\n * Mercator projection that takes into account that the Earth is not a perfect\n * sphere. Less popular than spherical mercator; used by projections like\n * EPSG:3395.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.Mercator.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Mercator = {\n // Radius / WGS84 semi-major axis\n R: 6378137,\n R_MINOR: 6356752.314245179,\n\n // WGS84 eccentricity\n ECC: 0.081819191,\n ECC2: 0.081819191 * 0.081819191,\n\n project: function(latlon) {\n var d = Math.PI / 180;\n var r = this.R;\n var y = latlon.lat * d;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var con = e * Math.sin(y);\n\n var ts = Math.tan(Math.PI / 4 - y / 2) / Math.pow((1 - con) / (1 + con), e / 2);\n y = -r * Math.log(Math.max(ts, 1E-10));\n\n return Point(latlon.lon * d * r, y);\n },\n\n unproject: function(point) {\n var d = 180 / Math.PI;\n var r = this.R;\n var tmp = this.R_MINOR / r;\n var e = Math.sqrt(1 - tmp * tmp);\n var ts = Math.exp(-point.y / r);\n var phi = Math.PI / 2 - 2 * Math.atan(ts);\n\n for (var i = 0, dphi = 0.1, con; i < 15 && Math.abs(dphi) > 1e-7; i++) {\n con = e * Math.sin(phi);\n con = Math.pow((1 - con) / (1 + con), e / 2);\n dphi = Math.PI / 2 - 2 * Math.atan(ts * con) - phi;\n phi += dphi;\n }\n\n return LatLon(phi * d, point.x * d / r);\n },\n\n // Scale factor for converting between real metres and projected metres\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n //\n // See pg.8: http://www.hydrometronics.com/downloads/Web%20Mercator%20-%20Non-Conformal,%20Non-Mercator%20(notes).pdf\n pointScale: function(latlon) {\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n var sinLat = Math.sin(lat);\n var sinLat2 = sinLat * sinLat;\n var cosLat = Math.cos(lat);\n\n var k = Math.sqrt(1 - this.ECC2 * sinLat2) / cosLat;\n\n // [scaleX, scaleY]\n return [k, k];\n },\n\n bounds: [[-20037508.34279, -15496570.73972], [20037508.34279, 18764656.23138]]\n};\n\nexport default Mercator;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Mercator.js\n **/","/*\n * CRS.EPSG4326 is a CRS popular among advanced GIS specialists.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG4326.js\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _EPSG4326 = {\n code: 'EPSG:4326',\n projection: LatLonProjection,\n\n // Work out how to de-dupe this (scoping issue)\n transformScale: 1 / 180,\n\n // Scale and transformation inputs changed to account for central origin in\n // WebGL, instead of top-left origin used in Leaflet\n //\n // TODO: Cannot use this.transformScale due to scope\n transformation: new Transformation(1 / 180, 0, -1 / 180, 0)\n};\n\nconst EPSG4326 = extend({}, Earth, _EPSG4326);\n\nexport default EPSG4326;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/CRS.EPSG4326.js\n **/","/*\n * Simple equirectangular (Plate Carree) projection, used by CRS like EPSG:4326\n * and Simple.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/projection/Projection.LonLat.js\n */\n\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst ProjectionLatLon = {\n project: function(latlon) {\n return Point(latlon.lon, latlon.lat);\n },\n\n unproject: function(point) {\n return LatLon(point.y, point.x);\n },\n\n // Scale factor for converting between real metres and degrees\n //\n // degrees = realMetres * pointScale\n // realMetres = degrees / pointScale\n //\n // See: http://stackoverflow.com/questions/639695/how-to-convert-latitude-or-longitude-to-meters\n // See: http://gis.stackexchange.com/questions/75528/length-of-a-degree-where-do-the-terms-in-this-formula-come-from\n pointScale: function(latlon) {\n var m1 = 111132.92;\n var m2 = -559.82;\n var m3 = 1.175;\n var m4 = -0.0023;\n var p1 = 111412.84;\n var p2 = -93.5;\n var p3 = 0.118;\n\n var rad = Math.PI / 180;\n var lat = latlon.lat * rad;\n\n var latlen = m1 + m2 * Math.cos(2 * lat) + m3 * Math.cos(4 * lat) + m4 * Math.cos(6 * lat);\n var lonlen = p1 * Math.cos(lat) + p2 * Math.cos(3 * lat) + p3 * Math.cos(5 * lat);\n\n return [1 / latlen, 1 / lonlen];\n },\n\n bounds: [[-180, -90], [180, 90]]\n};\n\nexport default ProjectionLatLon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.LatLon.js\n **/","/*\n * A simple CRS that can be used for flat non-Earth maps like panoramas or game\n * maps.\n *\n * Based on:\n * https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.Simple.js\n */\n\nimport extend from 'lodash.assign';\nimport CRS from './CRS';\nimport LatLonProjection from '../projection/Projection.LatLon';\nimport Transformation from '../../util/Transformation';\n\nvar _Simple = {\n projection: LatLonProjection,\n\n // Straight 1:1 mapping (-1, -1 would be top-left)\n transformation: new Transformation(1, 0, 1, 0),\n\n scale: function(zoom) {\n // If zoom is provided then return scale based on map tile zoom\n if (zoom) {\n return Math.pow(2, zoom);\n // Else, make no change to scale – may need to increase this or make it a\n // user-definable variable\n } else {\n return 1;\n }\n },\n\n zoom: function(scale) {\n return Math.log(scale) / Math.LN2;\n },\n\n distance: function(latlon1, latlon2) {\n var dx = latlon2.lon - latlon1.lon;\n var dy = latlon2.lat - latlon1.lat;\n\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n infinite: true\n};\n\nconst Simple = extend({}, CRS, _Simple);\n\nexport default Simple;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/CRS.Simple.js\n **/","/*\n * CRS.Proj4 for any Proj4-supported CRS.\n */\n\nimport extend from 'lodash.assign';\nimport Earth from './CRS.Earth';\nimport Proj4Projection from '../projection/Projection.Proj4';\nimport Transformation from '../../util/Transformation';\n\nvar _Proj4 = function(code, def, bounds) {\n var projection = Proj4Projection(def, bounds);\n\n // Transformation calcuations\n var diffX = projection.bounds[1][0] - projection.bounds[0][0];\n var diffY = projection.bounds[1][1] - projection.bounds[0][1];\n\n var halfX = diffX / 2;\n var halfY = diffY / 2;\n\n // This is the raw scale factor\n var scaleX = 1 / halfX;\n var scaleY = 1 / halfY;\n\n // Find the minimum scale factor\n //\n // The minimum scale factor comes from the largest side and is the one\n // you want to use for both axis so they stay relative in dimension\n var scale = Math.min(scaleX, scaleY);\n\n // Find amount to offset each axis by to make the central point lie on\n // the [0,0] origin\n var offsetX = scale * (projection.bounds[0][0] + halfX);\n var offsetY = scale * (projection.bounds[0][1] + halfY);\n\n return {\n code: code,\n projection: projection,\n\n transformScale: scale,\n\n // Map the input to a [-1,1] range with [0,0] in the centre\n transformation: new Transformation(scale, -offsetX, -scale, offsetY)\n };\n};\n\nconst Proj4 = function(code, def, bounds) {\n return extend({}, Earth, _Proj4(code, def, bounds));\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/crs/CRS.Proj4.js\n **/","/*\n * Proj4 support for any projection.\n */\n\nimport proj4 from 'proj4';\nimport LatLon from '../LatLon';\nimport Point from '../Point';\n\nconst Proj4 = function(def, bounds) {\n var proj = proj4(def);\n\n var project = function(latlon) {\n return Point(proj.forward([latlon.lon, latlon.lat]));\n };\n\n var unproject = function(point) {\n var inverse = proj.inverse([point.x, point.y]);\n return LatLon(inverse[1], inverse[0]);\n };\n\n return {\n project: project,\n unproject: unproject,\n\n // Scale factor for converting between real metres and projected metres\\\n //\n // Need to work out the best way to provide the pointScale calculations\n // for custom, unknown projections (if wanting to override default)\n //\n // For now, user can manually override crs.pointScale or\n // crs.projection.pointScale\n //\n // projectedMetres = realMetres * pointScale\n // realMetres = projectedMetres / pointScale\n pointScale: function(latlon, accurate) {\n return [1, 1];\n },\n\n // Try and calculate bounds if none are provided\n //\n // This will provide incorrect bounds for some projections, so perhaps make\n // bounds a required input instead\n bounds: (function() {\n if (bounds) {\n return bounds;\n } else {\n var bottomLeft = project([-90, -180]);\n var topRight = project([90, 180]);\n\n return [bottomLeft, topRight];\n }\n })()\n };\n};\n\nexport default Proj4;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/geo/projection/Projection.Proj4.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_22__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"proj4\"\n ** module id = 22\n ** module chunks = 0\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from './Scene';\nimport Renderer from './Renderer';\nimport Camera from './Camera';\n\nclass Engine extends EventEmitter {\n constructor(container) {\n console.log('Init Engine');\n\n super();\n\n this._scene = Scene;\n this._renderer = Renderer(container);\n this._camera = Camera(container);\n this.clock = new THREE.Clock();\n\n this._frustum = new THREE.Frustum();\n }\n\n update(delta) {\n this.emit('preRender');\n this._renderer.render(this._scene, this._camera);\n this.emit('postRender');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(container) {\n return new Engine(container);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Engine.js\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_24__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external \"THREE\"\n ** module id = 24\n ** module chunks = 0\n **/","import THREE from 'three';\n\n// This can be imported from anywhere and will still reference the same scene,\n// though there is a helper reference in Engine.scene\n\nexport default (function() {\n var scene = new THREE.Scene();\n\n // TODO: Re-enable when this works with the skybox\n // scene.fog = new THREE.Fog(0xffffff, 1, 15000);\n return scene;\n})();\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Scene.js\n **/","import THREE from 'three';\nimport Scene from './Scene';\n\n// This can only be accessed from Engine.renderer if you want to reference the\n// same scene in multiple places\n\nexport default function(container) {\n var renderer = new THREE.WebGLRenderer({\n antialias: true\n });\n\n // TODO: Re-enable when this works with the skybox\n // renderer.setClearColor(Scene.fog.color, 1);\n\n renderer.setClearColor(0xffffff, 1);\n\n // Gamma settings make things look nicer\n renderer.gammaInput = true;\n renderer.gammaOutput = true;\n\n renderer.shadowMap.enabled = true;\n renderer.shadowMap.cullFace = THREE.CullFaceBack;\n\n container.appendChild(renderer.domElement);\n\n var updateSize = function() {\n renderer.setSize(container.clientWidth, container.clientHeight);\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return renderer;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Renderer.js\n **/","import THREE from 'three';\n\n// This can only be accessed from Engine.camera if you want to reference the\n// same scene in multiple places\n\n// TODO: Ensure that FOV looks natural on all aspect ratios\n// http://stackoverflow.com/q/26655930/997339\n\nexport default function(container) {\n var camera = new THREE.PerspectiveCamera(45, 1, 1, 200000);\n camera.position.y = 400;\n camera.position.z = 400;\n\n var updateSize = function() {\n camera.aspect = container.clientWidth / container.clientHeight;\n camera.updateProjectionMatrix();\n };\n\n window.addEventListener('resize', updateSize, false);\n updateSize();\n\n return camera;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/engine/Camera.js\n **/","import Orbit from './Controls.Orbit';\n\nconst Controls = {\n Orbit: Orbit\n};\n\nexport default Controls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/index.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport OrbitControls from '../vendor/OrbitControls';\n\nclass Orbit extends EventEmitter {\n constructor() {\n super();\n }\n\n // Proxy control events\n //\n // There's currently no distinction between pan, orbit and zoom events\n _initEvents() {\n this._controls.addEventListener('start', (event) => {\n this._world.emit('controlsMoveStart', event.target.target);\n });\n\n this._controls.addEventListener('change', (event) => {\n this._world.emit('controlsMove', event.target.target);\n });\n\n this._controls.addEventListener('end', (event) => {\n this._world.emit('controlsMoveEnd', event.target.target);\n });\n }\n\n // Moving the camera along the [x,y,z] axis based on a target position\n _panTo(point, animate) {}\n _panBy(pointDelta, animate) {}\n\n // Zooming the camera in and out\n _zoomTo(metres, animate) {}\n _zoomBy(metresDelta, animate) {}\n\n // Force camera to look at something other than the target\n _lookAt(point, animate) {}\n\n // Make camera look at the target\n _lookAtTarget() {}\n\n // Tilt (up and down)\n _tiltTo(angle, animate) {}\n _tiltBy(angleDelta, animate) {}\n\n // Rotate (left and right)\n _rotateTo(angle, animate) {}\n _rotateBy(angleDelta, animate) {}\n\n // Fly to the given point, animating pan and tilt/rotation to final position\n // with nice zoom out and in\n //\n // Calling flyTo a second time before the previous animation has completed\n // will immediately start the new animation from wherever the previous one\n // has got to\n _flyTo(point, noZoom) {}\n\n // Proxy to OrbitControls.update()\n update() {\n this._controls.update();\n }\n\n // Add controls to world instance and store world reference\n addTo(world) {\n world.addControls(this);\n return this;\n }\n\n // Internal method called by World.addControls to actually add the controls\n _addToWorld(world) {\n this._world = world;\n\n // TODO: Override panLeft and panUp methods to prevent panning on Y axis\n // See: http://stackoverflow.com/a/26188674/997339\n this._controls = new OrbitControls(world._engine._camera, world._container);\n\n // Disable keys for now as no events are fired for them anyway\n this._controls.keys = false;\n\n // 89 degrees\n this._controls.maxPolarAngle = 1.5533;\n\n // this._controls.enableDamping = true;\n // this._controls.dampingFactor = 0.25;\n\n this._initEvents();\n\n this.emit('added');\n }\n}\n\n// Initialise without requiring new keyword\nexport default function() {\n return new Orbit();\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/controls/Controls.Orbit.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\nimport Hammer from 'hammerjs';\n\n/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one finger move\n// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n// Pan - right mouse, or arrow keys / touch: three finter swipe\n\nvar OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.25;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn theta;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function () {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\n\t\t\ttheta = Math.atan2( offset.x, offset.z );\n\n\t\t\t// angle from y-axis\n\n\t\t\tphi = Math.atan2( Math.sqrt( offset.x * offset.x + offset.z * offset.z ), offset.y );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\ttheta += thetaDelta;\n\t\t\tphi += phiDelta;\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\ttheta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tphi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, phi ) );\n\n\t\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\t\tvar radius = offset.length() * scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tradius = Math.max( scope.minDistance, Math.min( scope.maxDistance, radius ) );\n\n\t\t\t// move target to panned location\n\t\t\tscope.target.add( panOffset );\n\n\t\t\toffset.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\t\toffset.y = radius * Math.cos( phi );\n\t\t\toffset.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tthetaDelta *= ( 1 - scope.dampingFactor );\n\t\t\t\tphiDelta *= ( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tthetaDelta = 0;\n\t\t\t\tphiDelta = 0;\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function() {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\tscope.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar theta;\n\tvar phi;\n\n\tvar phiDelta = 0;\n\tvar thetaDelta = 0;\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tthetaDelta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tphiDelta -= angle;\n\n\t}\n\n\tvar panLeft = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panLeft( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get X column of objectMatrix\n\t\t// \tv.set( te[ 0 ], te[ 1 ], te[ 2 ] );\n //\n\t\t// \tv.multiplyScalar( - distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n // Fixed panning to x/y plane\n return function panLeft(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t // var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 0 ], 0, te[ 2 ]);\n\t v.multiplyScalar(-distance);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n // Fixed panning to x/y plane\n\tvar panUp = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\t// return function panUp( distance, objectMatrix ) {\n //\n\t\t// \tvar te = objectMatrix.elements;\n //\n\t\t// \t// get Y column of objectMatrix\n\t\t// \tv.set( te[ 4 ], te[ 5 ], te[ 6 ] );\n //\n\t\t// \tv.multiplyScalar( distance );\n //\n\t\t// \tpanOffset.add( v );\n //\n\t\t// };\n\n return function panUp(distance, objectMatrix) {\n\t var te = objectMatrix.elements;\n\t var adjDist = distance / Math.cos(phi);\n\n\t v.set(te[ 4 ], 0, te[ 6 ]);\n\t v.multiplyScalar(adjDist);\n\n\t panOffset.add(v);\n\t };\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\t//console.log( 'handleMouseDownPan' );\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\t//console.log( 'handleMouseMovePan' );\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( event ) {\n\n\t\t//console.log( 'handleMouseUp' );\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\t//console.log( 'handleMouseWheel' );\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta !== undefined ) {\n\n\t\t\t// WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta;\n\n\t\t} else if ( event.detail !== undefined ) {\n\n\t\t\t// Firefox\n\n\t\t\tdelta = - event.detail;\n\n\t\t}\n\n\t\tif ( delta > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( delta < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\t//console.log( 'handleKeyDown' );\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\trotateStart.set( event.pointers[ 0 ].pageX, event.pointers[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchStartDolly( event ) {\n\n\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\tvar dx = event.pointers[ 0 ].pageX - event.pointers[ 1 ].pageX;\n\t\tvar dy = event.pointers[ 0 ].pageY - event.pointers[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyStart.set( 0, distance );\n\n\t}\n\n\tfunction handleTouchStartPan( event ) {\n\n\t\t//console.log( 'handleTouchStartPan' );\n\n\t\tpanStart.set( event.deltaX, event.deltaY );\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\trotateEnd.set( event.pointers[ 0 ].pageX, event.pointers[ 0 ].pageY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMoveDolly( event ) {\n\n\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\tvar dx = event.pointers[ 0 ].pageX - event.pointers[ 1 ].pageX;\n\t\tvar dy = event.pointers[ 0 ].pageY - event.pointers[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyEnd.set( 0, distance );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMovePan( event ) {\n\n\t\t//console.log( 'handleTouchMovePan' );\n\n\t\tpanEnd.set( event.deltaX, event.deltaY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchEnd( event ) {\n\n\t\t//console.log( 'handleTouchEnd' );\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseDownRotate( event );\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseDownDolly( event );\n\n\t\t\tstate = STATE.DOLLY;\n\n\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseDownPan( event );\n\n\t\t\tstate = STATE.PAN;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\t\tdocument.addEventListener( 'mouseout', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseMoveRotate( event );\n\n\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseMoveDolly( event );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseMovePan( event );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tscope.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t// scope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\t// scope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\t// scope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\tscope.hammer = new Hammer(scope.domElement);\n\n\tscope.hammer.get('pan').set({\n\t\tpointers: 0,\n\t\tdirection: Hammer.DIRECTION_ALL\n\t});\n\n\tscope.hammer.get('pinch').set({\n\t\tenable: true,\n\t\tthreshold: 0.1\n\t});\n\n\tscope.hammer.on('panstart', function(event) {\n\t\tif (scope.enabled === false) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.pointers.length === 1) {\n\t\t\tif (scope.enablePan === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thandleTouchStartPan(event);\n\t\t\t// panStart.set(event.deltaX, event.deltaY);\n\n\t\t\tstate = STATE.TOUCH_PAN;\n\t\t} else if (event.pointers.length === 2) {\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleTouchStartRotate( event );\n\n\t\t\tstate = STATE.TOUCH_ROTATE;\n\t\t}\n\n\t\tif (state !== STATE.NONE) {\n\t\t\tscope.dispatchEvent(startEvent);\n\t\t}\n\t});\n\n\tscope.hammer.on('panend', onTouchEnd);\n\n\tscope.hammer.on('panmove', function(event) {\n\t\tif ( scope.enabled === false ) return;\n\n\t\t// event.preventDefault();\n\t\t// event.stopPropagation();\n\n\t\tif (event.pointers.length === 1) {\n\t\t\tif ( scope.enablePan === false ) return;\n\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\thandleTouchMovePan( event );\n\n\t\t\t// panEnd.set( event.deltaX, event.deltaY );\n\t\t\t//\n\t\t\t// panDelta.subVectors( panEnd, panStart );\n\t\t\t//\n\t\t\t// pan( panDelta.x, panDelta.y );\n\t\t\t//\n\t\t\t// panStart.copy( panEnd );\n\t\t\t//\n\t\t\t// scope.update();\n\t\t} else if (event.pointers.length === 2) {\n\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\thandleTouchMoveRotate( event );\n\t\t}\n\t});\n\n\tscope.hammer.on('pinchstart', function(event) {\n\t\tif ( scope.enabled === false ) return;\n\n\t\tif ( scope.enableZoom === false ) return;\n\n\t\thandleTouchStartDolly( event );\n\n\t\t// var dx = event.pointers[ 0 ].pageX - event.pointers[ 1 ].pageX;\n\t\t// var dy = event.pointers[ 0 ].pageY - event.pointers[ 1 ].pageY;\n\t\t//\n\t\t// var distance = Math.sqrt( dx * dx + dy * dy );\n\t\t//\n\t\t// dollyStart.set( 0, distance );\n\t\t//\n\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\tif (state !== STATE.NONE) {\n\t\t\tscope.dispatchEvent(startEvent);\n\t\t}\n\t});\n\n\tscope.hammer.on('pinchend', onTouchEnd);\n\n\tscope.hammer.on('pinchmove', function(event) {\n\t\tif ( scope.enabled === false ) return;\n\n\t\t// event.preventDefault();\n\t\t// event.stopPropagation();\n\n\t\tif ( scope.enableZoom === false ) return;\n\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\thandleTouchMoveDolly( event );\n\n\t\t// var dx = event.pointers[ 0 ].pageX - event.pointers[ 1 ].pageX;\n\t\t// var dy = event.pointers[ 0 ].pageY - event.pointers[ 1 ].pageY;\n\t\t//\n\t\t// var distance = Math.sqrt( dx * dx + dy * dy );\n\t\t//\n\t\t// dollyEnd.set( 0, distance );\n\t\t//\n\t\t// dollyDelta.subVectors( dollyEnd, dollyStart );\n\t\t//\n\t\t// if ( dollyDelta.y > 0 ) {\n\t\t//\n\t\t// \tdollyOut( getZoomScale() );\n\t\t//\n\t\t// } else if ( dollyDelta.y < 0 ) {\n\t\t//\n\t\t// \tdollyIn( getZoomScale() );\n\t\t//\n\t\t// }\n\t\t//\n\t\t// dollyStart.copy( dollyEnd );\n\t\t//\n\t\t// scope.update();\n\t});\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nOrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nOrbitControls.prototype.constructor = THREE.OrbitControls;\n\nObject.defineProperties( OrbitControls.prototype, {\n\n\tcenter: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\treturn this.target;\n\n\t\t}\n\n\t},\n\n\t// backward compatibility\n\n\tnoZoom: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\treturn ! this.enableZoom;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\tthis.enableZoom = ! value;\n\n\t\t}\n\n\t},\n\n\tnoRotate: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\treturn ! this.enableRotate;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\tthis.enableRotate = ! value;\n\n\t\t}\n\n\t},\n\n\tnoPan: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\treturn ! this.enablePan;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\tthis.enablePan = ! value;\n\n\t\t}\n\n\t},\n\n\tnoKeys: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\treturn ! this.enableKeys;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\tthis.enableKeys = ! value;\n\n\t\t}\n\n\t},\n\n\tstaticMoving : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\treturn ! this.constraint.enableDamping;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\tthis.constraint.enableDamping = ! value;\n\n\t\t}\n\n\t},\n\n\tdynamicDampingFactor : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\treturn this.constraint.dampingFactor;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\tthis.constraint.dampingFactor = value;\n\n\t\t}\n\n\t}\n\n} );\n\nexport default OrbitControls;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/OrbitControls.js\n **/","/*! Hammer.JS - v2.0.6 - 2015-12-23\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2015 Jorik Tangelder;\n * Licensed under the license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean=false} [merge]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.allow = true; // used by Input.TouchMouse to disable mouse events\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down, and mouse events are allowed (see the TouchMouse input)\n if (!this.pressed || !this.allow) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n // when we're in a touch event, so block all upcoming mouse events\n // most mobile browser also emit mouseevents, right after touchstart\n if (isTouch) {\n this.mouse.allow = false;\n } else if (isMouse && !this.mouse.allow) {\n return;\n }\n\n // reset the allowMouse when we're done\n if (inputEvent & (INPUT_END | INPUT_CANCEL)) {\n this.mouse.allow = true;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n // not needed with native support for the touchAction property\n if (NATIVE_TOUCH_ACTION) {\n return;\n }\n\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.6';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n each(manager.options.cssProps, function(value, name) {\n element.style[prefixed(element.style, name)] = add ? value : '';\n });\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/hammerjs/hammer.js\n ** module id = 31\n ** module chunks = 0\n **/","import Layer from '../Layer';\nimport extend from 'lodash.assign';\nimport THREE from 'three';\nimport Skybox from './Skybox';\n\nclass EnvironmentLayer extends Layer {\n constructor(options) {\n super();\n\n var defaults = {\n skybox: false\n };\n\n this._options = extend(defaults, options);\n }\n\n _onAdd() {\n this._initLights();\n\n if (this._options.skybox) {\n this._initSkybox();\n }\n\n // this._initGrid();\n }\n\n // Not fleshed out or thought through yet\n //\n // Lights could potentially be put it their own 'layer' to keep this class\n // much simpler and less messy\n _initLights() {\n // Position doesn't really matter (the angle is important), however it's\n // used here so the helpers look more natural.\n\n if (!this._options.skybox) {\n var directionalLight = new THREE.DirectionalLight(0x999999);\n directionalLight.intesity = 0.1;\n directionalLight.position.x = 100;\n directionalLight.position.y = 100;\n directionalLight.position.z = 100;\n\n var directionalLight2 = new THREE.DirectionalLight(0x999999);\n directionalLight2.intesity = 0.1;\n directionalLight2.position.x = -100;\n directionalLight2.position.y = 100;\n directionalLight2.position.z = -100;\n\n var helper = new THREE.DirectionalLightHelper(directionalLight, 10);\n var helper2 = new THREE.DirectionalLightHelper(directionalLight2, 10);\n\n this.add(directionalLight);\n this.add(directionalLight2);\n\n this.add(helper);\n this.add(helper2);\n } else {\n // Directional light that will be projected from the sun\n this._skyboxLight = new THREE.DirectionalLight(0xffffff, 1);\n\n this._skyboxLight.castShadow = true;\n\n var d = 1000;\n this._skyboxLight.shadow.camera.left = -d;\n this._skyboxLight.shadow.camera.right = d;\n this._skyboxLight.shadow.camera.top = d;\n this._skyboxLight.shadow.camera.bottom = -d;\n\n this._skyboxLight.shadow.camera.near = 10000;\n this._skyboxLight.shadow.camera.far = 70000;\n\n // TODO: Need to dial in on a good shadowmap size\n this._skyboxLight.shadow.mapSize.width = 2048;\n this._skyboxLight.shadow.mapSize.height = 2048;\n\n // this._skyboxLight.shadowBias = -0.0010;\n // this._skyboxLight.shadow.darkness = 0.15;\n\n // this._layer.add(new THREE.CameraHelper(this._skyboxLight.shadow.camera));\n\n this.add(this._skyboxLight);\n }\n }\n\n _initSkybox() {\n this._skybox = Skybox(this._world, this._skyboxLight);\n this.add(this._skybox._mesh);\n }\n\n // Add grid helper for context during initial development\n _initGrid() {\n var size = 4000;\n var step = 100;\n\n var gridHelper = new THREE.GridHelper(size, step);\n this.add(gridHelper);\n }\n\n // Clean up environment\n destroy() {\n this._skyboxLight = null;\n\n this.remove(this._skybox._mesh);\n this._skybox.destroy();\n this._skybox = null;\n\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(options) {\n return new EnvironmentLayer(options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/environment/EnvironmentLayer.js\n **/","import EventEmitter from 'eventemitter3';\nimport THREE from 'three';\nimport Scene from '../engine/Scene';\n\nclass Layer extends EventEmitter {\n constructor() {\n super();\n\n this._layer = new THREE.Object3D();\n }\n\n // Add THREE object directly to layer\n add(object) {\n this._layer.add(object);\n }\n\n // Remove THREE object from to layer\n remove(object) {\n this._layer.remove(object);\n }\n\n // Add layer to world instance and store world reference\n addTo(world) {\n world.addLayer(this);\n return this;\n }\n\n // Internal method called by World.addLayer to actually add the layer\n _addToWorld(world) {\n this._world = world;\n this._onAdd(world);\n this.emit('added');\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n // Remove everything else in the layer\n var child;\n for (i = this._layer.children.length - 1; i >= 0; i--) {\n child = this._layer.children[i];\n\n if (!child) {\n continue;\n }\n\n this.remove(child);\n\n if (child.geometry) {\n // Dispose of mesh and materials\n child.geometry.dispose();\n child.geometry = null;\n }\n\n if (child.material) {\n if (child.material.map) {\n child.material.map.dispose();\n child.material.map = null;\n }\n\n child.material.dispose();\n child.material = null;\n }\n }\n\n this._world = null;\n this._layer = null;\n }\n}\n\nexport default Layer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/Layer.js\n **/","import THREE from 'three';\nimport Sky from './Sky';\nimport throttle from 'lodash.throttle';\n\nvar cubemap = {\n vertexShader: [\n\t\t'varying vec3 vPosition;',\n\t\t'void main() {',\n\t\t\t'vPosition = position;',\n\t\t\t'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\t\t'}'\n\t].join('\\n'),\n\n fragmentShader: [\n 'uniform samplerCube cubemap;',\n 'varying vec3 vPosition;',\n\n 'void main() {',\n 'gl_FragColor = textureCube(cubemap, normalize(vPosition));',\n '}'\n ].join('\\n')\n};\n\nclass Skybox {\n constructor(world, light) {\n this._world = world;\n this._light = light;\n\n this._settings = {\n distance: 38000,\n turbidity: 10,\n reileigh: 2,\n mieCoefficient: 0.005,\n mieDirectionalG: 0.8,\n luminance: 1,\n // 0.48 is a cracking dusk / sunset\n // 0.4 is a beautiful early-morning / late-afternoon\n // 0.2 is a nice day time\n inclination: 0.48, // Elevation / inclination\n azimuth: 0.25, // Facing front\n };\n\n this._initSkybox();\n this._updateUniforms();\n this._initEvents();\n }\n\n _initEvents() {\n // Throttled to 1 per 100ms\n this._throttledWorldUpdate = throttle(this._update, 100);\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n }\n\n _initSkybox() {\n // Cube camera for skybox\n this._cubeCamera = new THREE.CubeCamera(1, 2000000, 128);\n\n // Cube material\n var cubeTarget = this._cubeCamera.renderTarget;\n\n // Add Sky Mesh\n this._sky = new Sky();\n this._skyScene = new THREE.Scene();\n this._skyScene.add(this._sky.mesh);\n\n // Add Sun Helper\n this._sunSphere = new THREE.Mesh(\n new THREE.SphereBufferGeometry(2000, 16, 8),\n new THREE.MeshBasicMaterial({\n color: 0xffffff\n })\n );\n\n // TODO: This isn't actually visible because it's not added to the layer\n // this._sunSphere.visible = true;\n\n var skyboxUniforms = {\n cubemap: { type: 't', value: cubeTarget }\n };\n\n var skyboxMat = new THREE.ShaderMaterial({\n uniforms: skyboxUniforms,\n vertexShader: cubemap.vertexShader,\n fragmentShader: cubemap.fragmentShader,\n side: THREE.BackSide\n });\n\n this._mesh = new THREE.Mesh(new THREE.BoxGeometry(190000, 190000, 190000), skyboxMat);\n }\n\n _updateUniforms() {\n var settings = this._settings;\n var uniforms = this._sky.uniforms;\n uniforms.turbidity.value = settings.turbidity;\n uniforms.reileigh.value = settings.reileigh;\n uniforms.luminance.value = settings.luminance;\n uniforms.mieCoefficient.value = settings.mieCoefficient;\n uniforms.mieDirectionalG.value = settings.mieDirectionalG;\n\n var theta = Math.PI * (settings.inclination - 0.5);\n var phi = 2 * Math.PI * (settings.azimuth - 0.5);\n\n this._sunSphere.position.x = settings.distance * Math.cos(phi);\n this._sunSphere.position.y = settings.distance * Math.sin(phi) * Math.sin(theta);\n this._sunSphere.position.z = settings.distance * Math.sin(phi) * Math.cos(theta);\n\n // Move directional light to sun position\n this._light.position.copy(this._sunSphere.position);\n\n this._sky.uniforms.sunPosition.value.copy(this._sunSphere.position);\n }\n\n _update(delta) {\n if (!this._done) {\n this._done = true;\n } else {\n return;\n }\n\n // if (!this._angle) {\n // this._angle = 0;\n // }\n //\n // // Animate inclination\n // this._angle += Math.PI * delta;\n // this._settings.inclination = 0.5 * (Math.sin(this._angle) / 2 + 0.5);\n\n // Update light intensity depending on elevation of sun (day to night)\n this._light.intensity = 1 - 0.95 * (this._settings.inclination / 0.5);\n\n // // console.log(delta, this._angle, this._settings.inclination);\n //\n // TODO: Only do this when the uniforms have been changed\n this._updateUniforms();\n\n // TODO: Only do this when the cubemap has actually changed\n this._cubeCamera.updateCubeMap(this._world._engine._renderer, this._skyScene);\n }\n\n getRenderTarget() {\n return this._cubeCamera.renderTarget;\n }\n\n // Destroy the skybox and remove it from memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._throttledWorldUpdate = null;\n\n this._world = null;\n this._light = null;\n\n this._cubeCamera = null;\n\n this._sky.mesh.geometry.dispose();\n this._sky.mesh.geometry = null;\n\n if (this._sky.mesh.material.map) {\n this._sky.mesh.material.map.dispose();\n this._sky.mesh.material.map = null;\n }\n\n this._sky.mesh.material.dispose();\n this._sky.mesh.material = null;\n\n this._sky.mesh = null;\n this._sky = null;\n\n this._skyScene = null;\n\n this._sunSphere.geometry.dispose();\n this._sunSphere.geometry = null;\n\n if (this._sunSphere.material.map) {\n this._sunSphere.material.map.dispose();\n this._sunSphere.material.map = null;\n }\n\n this._sunSphere.material.dispose();\n this._sunSphere.material = null;\n\n this._sunSphere = null;\n\n this._mesh.geometry.dispose();\n this._mesh.geometry = null;\n\n if (this._mesh.material.map) {\n this._mesh.material.map.dispose();\n this._mesh.material.map = null;\n }\n\n this._mesh.material.dispose();\n this._mesh.material = null;\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(world, light) {\n return new Skybox(world, light);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/environment/Skybox.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\n/**\n * @author zz85 / https://github.com/zz85\n *\n * Based on 'A Practical Analytic Model for Daylight'\n * aka The Preetham Model, the de facto standard analytic skydome model\n * http://www.cs.utah.edu/~shirley/papers/sunsky/sunsky.pdf\n *\n * First implemented by Simon Wallner\n * http://www.simonwallner.at/projects/atmospheric-scattering\n *\n * Improved by Martin Upitis\n * http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR\n *\n * Three.js integration by zz85 http://twitter.com/blurspline\n*/\n\nimport THREE from 'three';\n\nTHREE.ShaderLib[ 'sky' ] = {\n\n\tuniforms: {\n\n\t\tluminance:\t { type: 'f', value: 1 },\n\t\tturbidity:\t { type: 'f', value: 2 },\n\t\treileigh:\t { type: 'f', value: 1 },\n\t\tmieCoefficient:\t { type: 'f', value: 0.005 },\n\t\tmieDirectionalG: { type: 'f', value: 0.8 },\n\t\tsunPosition: \t { type: 'v3', value: new THREE.Vector3() }\n\n\t},\n\n\tvertexShader: [\n\n\t\t'varying vec3 vWorldPosition;',\n\n\t\t'void main() {',\n\n\t\t\t'vec4 worldPosition = modelMatrix * vec4( position, 1.0 );',\n\t\t\t'vWorldPosition = worldPosition.xyz;',\n\n\t\t\t'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\n\t\t'}',\n\n\t].join( '\\n' ),\n\n\tfragmentShader: [\n\n\t\t'uniform sampler2D skySampler;',\n\t\t'uniform vec3 sunPosition;',\n\t\t'varying vec3 vWorldPosition;',\n\n\t\t'vec3 cameraPos = vec3(0., 0., 0.);',\n\t\t'// uniform sampler2D sDiffuse;',\n\t\t'// const float turbidity = 10.0; //',\n\t\t'// const float reileigh = 2.; //',\n\t\t'// const float luminance = 1.0; //',\n\t\t'// const float mieCoefficient = 0.005;',\n\t\t'// const float mieDirectionalG = 0.8;',\n\n\t\t'uniform float luminance;',\n\t\t'uniform float turbidity;',\n\t\t'uniform float reileigh;',\n\t\t'uniform float mieCoefficient;',\n\t\t'uniform float mieDirectionalG;',\n\n\t\t'// constants for atmospheric scattering',\n\t\t'const float e = 2.71828182845904523536028747135266249775724709369995957;',\n\t\t'const float pi = 3.141592653589793238462643383279502884197169;',\n\n\t\t'const float n = 1.0003; // refractive index of air',\n\t\t'const float N = 2.545E25; // number of molecules per unit volume for air at',\n\t\t\t\t\t\t\t\t'// 288.15K and 1013mb (sea level -45 celsius)',\n\t\t'const float pn = 0.035;\t// depolatization factor for standard air',\n\n\t\t'// wavelength of used primaries, according to preetham',\n\t\t'const vec3 lambda = vec3(680E-9, 550E-9, 450E-9);',\n\n\t\t'// mie stuff',\n\t\t'// K coefficient for the primaries',\n\t\t'const vec3 K = vec3(0.686, 0.678, 0.666);',\n\t\t'const float v = 4.0;',\n\n\t\t'// optical length at zenith for molecules',\n\t\t'const float rayleighZenithLength = 8.4E3;',\n\t\t'const float mieZenithLength = 1.25E3;',\n\t\t'const vec3 up = vec3(0.0, 1.0, 0.0);',\n\n\t\t'const float EE = 1000.0;',\n\t\t'const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;',\n\t\t'// 66 arc seconds -> degrees, and the cosine of that',\n\n\t\t'// earth shadow hack',\n\t\t'const float cutoffAngle = pi/1.95;',\n\t\t'const float steepness = 1.5;',\n\n\n\t\t'vec3 totalRayleigh(vec3 lambda)',\n\t\t'{',\n\t\t\t'return (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn));',\n\t\t'}',\n\n\t\t// see http://blenderartists.org/forum/showthread.php?321110-Shaders-and-Skybox-madness\n\t\t'// A simplied version of the total Reayleigh scattering to works on browsers that use ANGLE',\n\t\t'vec3 simplifiedRayleigh()',\n\t\t'{',\n\t\t\t'return 0.0005 / vec3(94, 40, 18);',\n\t\t\t// return 0.00054532832366 / (3.0 * 2.545E25 * pow(vec3(680E-9, 550E-9, 450E-9), vec3(4.0)) * 6.245);\n\t\t'}',\n\n\t\t'float rayleighPhase(float cosTheta)',\n\t\t'{\t ',\n\t\t\t'return (3.0 / (16.0*pi)) * (1.0 + pow(cosTheta, 2.0));',\n\t\t'//\treturn (1.0 / (3.0*pi)) * (1.0 + pow(cosTheta, 2.0));',\n\t\t'//\treturn (3.0 / 4.0) * (1.0 + pow(cosTheta, 2.0));',\n\t\t'}',\n\n\t\t'vec3 totalMie(vec3 lambda, vec3 K, float T)',\n\t\t'{',\n\t\t\t'float c = (0.2 * T ) * 10E-18;',\n\t\t\t'return 0.434 * c * pi * pow((2.0 * pi) / lambda, vec3(v - 2.0)) * K;',\n\t\t'}',\n\n\t\t'float hgPhase(float cosTheta, float g)',\n\t\t'{',\n\t\t\t'return (1.0 / (4.0*pi)) * ((1.0 - pow(g, 2.0)) / pow(1.0 - 2.0*g*cosTheta + pow(g, 2.0), 1.5));',\n\t\t'}',\n\n\t\t'float sunIntensity(float zenithAngleCos)',\n\t\t'{',\n\t\t\t'return EE * max(0.0, 1.0 - exp(-((cutoffAngle - acos(zenithAngleCos))/steepness)));',\n\t\t'}',\n\n\t\t'// float logLuminance(vec3 c)',\n\t\t'// {',\n\t\t'// \treturn log(c.r * 0.2126 + c.g * 0.7152 + c.b * 0.0722);',\n\t\t'// }',\n\n\t\t'// Filmic ToneMapping http://filmicgames.com/archives/75',\n\t\t'float A = 0.15;',\n\t\t'float B = 0.50;',\n\t\t'float C = 0.10;',\n\t\t'float D = 0.20;',\n\t\t'float E = 0.02;',\n\t\t'float F = 0.30;',\n\t\t'float W = 1000.0;',\n\n\t\t'vec3 Uncharted2Tonemap(vec3 x)',\n\t\t'{',\n\t\t 'return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;',\n\t\t'}',\n\n\n\t\t'void main() ',\n\t\t'{',\n\t\t\t'float sunfade = 1.0-clamp(1.0-exp((sunPosition.y/450000.0)),0.0,1.0);',\n\n\t\t\t'// luminance = 1.0 ;// vWorldPosition.y / 450000. + 0.5; //sunPosition.y / 450000. * 1. + 0.5;',\n\n\t\t\t '// gl_FragColor = vec4(sunfade, sunfade, sunfade, 1.0);',\n\n\t\t\t'float reileighCoefficient = reileigh - (1.0* (1.0-sunfade));',\n\n\t\t\t'vec3 sunDirection = normalize(sunPosition);',\n\n\t\t\t'float sunE = sunIntensity(dot(sunDirection, up));',\n\n\t\t\t'// extinction (absorbtion + out scattering) ',\n\t\t\t'// rayleigh coefficients',\n\n\t\t\t// 'vec3 betaR = totalRayleigh(lambda) * reileighCoefficient;',\n\t\t\t'vec3 betaR = simplifiedRayleigh() * reileighCoefficient;',\n\n\t\t\t'// mie coefficients',\n\t\t\t'vec3 betaM = totalMie(lambda, K, turbidity) * mieCoefficient;',\n\n\t\t\t'// optical length',\n\t\t\t'// cutoff angle at 90 to avoid singularity in next formula.',\n\t\t\t'float zenithAngle = acos(max(0.0, dot(up, normalize(vWorldPosition - cameraPos))));',\n\t\t\t'float sR = rayleighZenithLength / (cos(zenithAngle) + 0.15 * pow(93.885 - ((zenithAngle * 180.0) / pi), -1.253));',\n\t\t\t'float sM = mieZenithLength / (cos(zenithAngle) + 0.15 * pow(93.885 - ((zenithAngle * 180.0) / pi), -1.253));',\n\n\n\n\t\t\t'// combined extinction factor\t',\n\t\t\t'vec3 Fex = exp(-(betaR * sR + betaM * sM));',\n\n\t\t\t'// in scattering',\n\t\t\t'float cosTheta = dot(normalize(vWorldPosition - cameraPos), sunDirection);',\n\n\t\t\t'float rPhase = rayleighPhase(cosTheta*0.5+0.5);',\n\t\t\t'vec3 betaRTheta = betaR * rPhase;',\n\n\t\t\t'float mPhase = hgPhase(cosTheta, mieDirectionalG);',\n\t\t\t'vec3 betaMTheta = betaM * mPhase;',\n\n\n\t\t\t'vec3 Lin = pow(sunE * ((betaRTheta + betaMTheta) / (betaR + betaM)) * (1.0 - Fex),vec3(1.5));',\n\t\t\t'Lin *= mix(vec3(1.0),pow(sunE * ((betaRTheta + betaMTheta) / (betaR + betaM)) * Fex,vec3(1.0/2.0)),clamp(pow(1.0-dot(up, sunDirection),5.0),0.0,1.0));',\n\n\t\t\t'//nightsky',\n\t\t\t'vec3 direction = normalize(vWorldPosition - cameraPos);',\n\t\t\t'float theta = acos(direction.y); // elevation --> y-axis, [-pi/2, pi/2]',\n\t\t\t'float phi = atan(direction.z, direction.x); // azimuth --> x-axis [-pi/2, pi/2]',\n\t\t\t'vec2 uv = vec2(phi, theta) / vec2(2.0*pi, pi) + vec2(0.5, 0.0);',\n\t\t\t'// vec3 L0 = texture2D(skySampler, uv).rgb+0.1 * Fex;',\n\t\t\t'vec3 L0 = vec3(0.1) * Fex;',\n\n\t\t\t'// composition + solar disc',\n\t\t\t'//if (cosTheta > sunAngularDiameterCos)',\n\t\t\t'float sundisk = smoothstep(sunAngularDiameterCos,sunAngularDiameterCos+0.00002,cosTheta);',\n\t\t\t'// if (normalize(vWorldPosition - cameraPos).y>0.0)',\n\t\t\t'L0 += (sunE * 19000.0 * Fex)*sundisk;',\n\n\n\t\t\t'vec3 whiteScale = 1.0/Uncharted2Tonemap(vec3(W));',\n\n\t\t\t'vec3 texColor = (Lin+L0); ',\n\t\t\t'texColor *= 0.04 ;',\n\t\t\t'texColor += vec3(0.0,0.001,0.0025)*0.3;',\n\n\t\t\t'float g_fMaxLuminance = 1.0;',\n\t\t\t'float fLumScaled = 0.1 / luminance; ',\n\t\t\t'float fLumCompressed = (fLumScaled * (1.0 + (fLumScaled / (g_fMaxLuminance * g_fMaxLuminance)))) / (1.0 + fLumScaled); ',\n\n\t\t\t'float ExposureBias = fLumCompressed;',\n\n\t\t\t'vec3 curr = Uncharted2Tonemap((log2(2.0/pow(luminance,4.0)))*texColor);',\n\t\t\t'vec3 color = curr*whiteScale;',\n\n\t\t\t'vec3 retColor = pow(color,vec3(1.0/(1.2+(1.2*sunfade))));',\n\n\n\t\t\t'gl_FragColor.rgb = retColor;',\n\n\t\t\t'gl_FragColor.a = 1.0;',\n\t\t'}',\n\n\t].join( '\\n' )\n\n};\n\nvar Sky = function () {\n\n\tvar skyShader = THREE.ShaderLib[ 'sky' ];\n\tvar skyUniforms = THREE.UniformsUtils.clone( skyShader.uniforms );\n\n\tvar skyMat = new THREE.ShaderMaterial( {\n\t\tfragmentShader: skyShader.fragmentShader,\n\t\tvertexShader: skyShader.vertexShader,\n\t\tuniforms: skyUniforms,\n\t\tside: THREE.BackSide\n\t} );\n\n\tvar skyGeo = new THREE.SphereBufferGeometry( 450000, 32, 15 );\n\tvar skyMesh = new THREE.Mesh( skyGeo, skyMat );\n\n\n\t// Expose variables\n\tthis.mesh = skyMesh;\n\tthis.uniforms = skyUniforms;\n\n};\n\nexport default Sky;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/environment/Sky.js\n **/","/**\n * lodash 4.0.0 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar debounce = require('lodash.debounce');\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide an options object to indicate whether\n * `func` should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the throttled function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=true] Specify invoking on the leading\n * edge of the timeout.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // avoid excessively updating the position while scrolling\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // cancel a trailing throttled invocation\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, { 'leading': leading, 'maxWait': wait, 'trailing': trailing });\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n // Avoid a V8 JIT bug in Chrome 19-20.\n // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\nmodule.exports = throttle;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/index.js\n ** module id = 36\n ** module chunks = 0\n **/","/**\n * lodash 4.0.1 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @type Function\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => logs the number of milliseconds it took for the deferred function to be invoked\n */\nvar now = Date.now;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide an options object to indicate whether `func` should be invoked on\n * the leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent calls\n * to the debounced function return the result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked\n * on the trailing edge of the timeout only if the the debounced function is\n * invoked more than once during the `wait` timeout.\n *\n * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options] The options object.\n * @param {boolean} [options.leading=false] Specify invoking on the leading\n * edge of the timeout.\n * @param {number} [options.maxWait] The maximum time `func` is allowed to be\n * delayed before it's invoked.\n * @param {boolean} [options.trailing=true] Specify invoking on the trailing\n * edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var args,\n maxTimeoutId,\n result,\n stamp,\n thisArg,\n timeoutId,\n trailingCall,\n lastCalled = 0,\n leading = false,\n maxWait = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxWait = 'maxWait' in options && nativeMax(toNumber(options.maxWait) || 0, wait);\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function cancel() {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (maxTimeoutId) {\n clearTimeout(maxTimeoutId);\n }\n lastCalled = 0;\n args = maxTimeoutId = thisArg = timeoutId = trailingCall = undefined;\n }\n\n function complete(isCalled, id) {\n if (id) {\n clearTimeout(id);\n }\n maxTimeoutId = timeoutId = trailingCall = undefined;\n if (isCalled) {\n lastCalled = now();\n result = func.apply(thisArg, args);\n if (!timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n }\n }\n\n function delayed() {\n var remaining = wait - (now() - stamp);\n if (remaining <= 0 || remaining > wait) {\n complete(trailingCall, maxTimeoutId);\n } else {\n timeoutId = setTimeout(delayed, remaining);\n }\n }\n\n function flush() {\n if ((timeoutId && trailingCall) || (maxTimeoutId && trailing)) {\n result = func.apply(thisArg, args);\n }\n cancel();\n return result;\n }\n\n function maxDelayed() {\n complete(trailing, timeoutId);\n }\n\n function debounced() {\n args = arguments;\n stamp = now();\n thisArg = this;\n trailingCall = trailing && (timeoutId || !leading);\n\n if (maxWait === false) {\n var leadingCall = leading && !timeoutId;\n } else {\n if (!maxTimeoutId && !leading) {\n lastCalled = stamp;\n }\n var remaining = maxWait - (stamp - lastCalled),\n isCalled = remaining <= 0 || remaining > maxWait;\n\n if (isCalled) {\n if (maxTimeoutId) {\n maxTimeoutId = clearTimeout(maxTimeoutId);\n }\n lastCalled = stamp;\n result = func.apply(thisArg, args);\n }\n else if (!maxTimeoutId) {\n maxTimeoutId = setTimeout(maxDelayed, remaining);\n }\n }\n if (isCalled && timeoutId) {\n timeoutId = clearTimeout(timeoutId);\n }\n else if (!timeoutId && wait !== maxWait) {\n timeoutId = setTimeout(delayed, wait);\n }\n if (leadingCall) {\n isCalled = true;\n result = func.apply(thisArg, args);\n }\n if (isCalled && !timeoutId && !maxTimeoutId) {\n args = thisArg = undefined;\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8 which returns 'object' for typed array constructors, and\n // PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.\n * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3);\n * // => 3\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3');\n * // => 3\n */\nfunction toNumber(value) {\n if (isObject(value)) {\n var other = isFunction(value.valueOf) ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lodash.throttle/~/lodash.debounce/index.js\n ** module id = 37\n ** module chunks = 0\n **/","import TileLayer from './TileLayer';\nimport ImageTile from './ImageTile';\nimport ImageTileLayerBaseMaterial from './ImageTileLayerBaseMaterial';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\nimport extend from 'lodash.assign';\n\n// DONE: Find a way to avoid the flashing caused by the gap between old tiles\n// being removed and the new tiles being ready for display\n//\n// DONE: Simplest first step for MVP would be to give each tile mesh the colour\n// of the basemap ground so it blends in a little more, or have a huge ground\n// plane underneath all the tiles that shows through between tile updates.\n//\n// Could keep the old tiles around until the new ones are ready, though they'd\n// probably need to be layered in a way so the old tiles don't overlap new ones,\n// which is similar to how Leaflet approaches this (it has 2 layers)\n//\n// Could keep the tile from the previous quadtree level visible until all 4\n// tiles at the new / current level have finished loading and are displayed.\n// Perhaps by keeping a map of tiles by quadcode and a boolean for each of the\n// child quadcodes showing whether they are loaded and in view. If all true then\n// remove the parent tile, otherwise keep it on a lower layer.\n\n// TODO: Load and display a base layer separate to the LOD grid that is at a low\n// resolution – used as a backup / background to fill in empty areas / distance\n\n// DONE: Fix the issue where some tiles just don't load, or at least the texture\n// never shows up – tends to happen if you quickly zoom in / out past it while\n// it's still loading, leaving a blank space\n\n// TODO: Optimise the request of many image tiles – look at how Leaflet and\n// OpenWebGlobe approach this (eg. batching, queues, etc)\n\n// TODO: Cancel pending tile requests if they get removed from view before they\n// reach a ready state (eg. cancel image requests, etc). Need to ensure that the\n// images are re-requested when the tile is next in scene (even if from cache)\n\n// TODO: Consider not performing an LOD calculation on every frame, instead only\n// on move end so panning, orbiting and zooming stays smooth. Otherwise it's\n// possible for performance to tank if you pan, orbit or zoom rapidly while all\n// the LOD calculations are being made and new tiles requested.\n//\n// Pending tiles should continue to be requested and output to the scene on each\n// frame, but no new LOD calculations should be made.\n\n// This tile layer both updates the quadtree and outputs tiles on every frame\n// (throttled to some amount)\n//\n// This is because the computational complexity of image tiles is generally low\n// and so there isn't much jank when running these calculations and outputs in\n// realtime\n//\n// The benefit to doing this is that the underlying map layer continues to\n// refresh and update during movement, which is an arguably better experience\n\nclass ImageTileLayer extends TileLayer {\n constructor(path, options) {\n var defaults = {\n distance: 40000\n };\n\n options = extend(defaults, options);\n\n super(options);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n // Add base layer\n var geom = new THREE.PlaneBufferGeometry(200000, 200000, 1);\n\n var baseMaterial;\n if (this._world._environment._skybox) {\n baseMaterial = ImageTileLayerBaseMaterial('#f5f5f3', this._world._environment._skybox.getRenderTarget());\n } else {\n baseMaterial = ImageTileLayerBaseMaterial('#f5f5f3');\n }\n\n var mesh = new THREE.Mesh(geom, baseMaterial);\n mesh.rotation.x = -90 * Math.PI / 180;\n\n // TODO: It might be overkill to receive a shadow on the base layer as it's\n // rarely seen (good to have if performance difference is negligible)\n mesh.receiveShadow = true;\n\n this._baseLayer = mesh;\n this.add(mesh);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n this._initEvents();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n }\n\n _onWorldUpdate() {\n this._calculateLOD();\n this._outputTiles();\n }\n\n _onWorldMove(latlon, point) {\n this._moveBaseLayer(point);\n }\n\n _moveBaseLayer(point) {\n this._baseLayer.position.x = point.x;\n this._baseLayer.position.z = point.y;\n }\n\n _createTile(quadcode, layer) {\n return ImageTile(quadcode, this._path, layer);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Dispose of mesh and materials\n this._baseLayer.geometry.dispose();\n this._baseLayer.geometry = null;\n\n if (this._baseLayer.material.map) {\n this._baseLayer.material.map.dispose();\n this._baseLayer.material.map = null;\n }\n\n this._baseLayer.material.dispose();\n this._baseLayer.material = null;\n\n this._baseLayer = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new ImageTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayer.js\n **/","import Layer from '../Layer';\nimport extend from 'lodash.assign';\nimport TileCache from './TileCache';\nimport THREE from 'three';\n\n// TODO: Consider keeping a single TileLayer / LOD instance running by default\n// that keeps a standard LOD grid for other layers to utilise, rather than\n// having to create their own, unique LOD grid and duplicate calculations when\n// they're going to use the same grid setup anyway\n//\n// It still makes sense to be able to have a custom LOD grid for some layers as\n// they may want to customise things, maybe not even using a quadtree at all!\n//\n// Perhaps it makes sense to split out the quadtree stuff into a singleton and\n// pass in the necessary parameters each time for the calculation step.\n//\n// Either way, it seems silly to force layers to have to create a new LOD grid\n// each time and create extra, duplicated processing every frame.\n\n// TODO: Allow passing in of options to define min/max LOD and a distance to use\n// for culling tiles beyond that distance.\n\n// DONE: Prevent tiles from being loaded if they are further than a certain\n// distance from the camera and are unlikely to be seen anyway\n\n// TODO: Avoid performing LOD calculation when it isn't required. For example,\n// when nothing has changed since the last frame and there are no tiles to be\n// loaded or in need of rendering\n\n// TODO: Only remove tiles from the layer that aren't to be rendered in the\n// current frame – it seems excessive to remove all tiles and re-add them on\n// every single frame, even if it's just array manipulation\n\n// TODO: Fix LOD calculation so min and max LOD can be changed without causing\n// problems (eg. making min above 5 causes all sorts of issues)\n\n// TODO: Reuse THREE objects where possible instead of creating new instances\n// on every LOD calculation\n\n// TODO: Consider not using THREE or LatLon / Point objects in LOD calculations\n// to avoid creating unnecessary memory for garbage collection\n\n// TODO: Prioritise loading of tiles at highest level in the quadtree (those\n// closest to the camera) so visual inconsistancies during loading are minimised\n\nclass TileLayer extends Layer {\n constructor(options) {\n super(options);\n\n var defaults = {\n maxCache: 1000,\n maxLOD: 18\n };\n\n this._options = extend(defaults, options);\n\n this._tileCache = TileCache(this._options.maxCache, tile => {\n this._destroyTile(tile);\n });\n\n // List of tiles from the previous LOD calculation\n this._tileList = [];\n\n // TODO: Work out why changing the minLOD causes loads of issues\n this._minLOD = 3;\n this._maxLOD = this._options.maxLOD;\n\n this._frustum = new THREE.Frustum();\n this._tiles = new THREE.Object3D();\n }\n\n _onAdd(world) {\n this.add(this._tiles);\n }\n\n _updateFrustum() {\n var camera = this._world.getCamera();\n var projScreenMatrix = new THREE.Matrix4();\n projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);\n\n this._frustum.setFromMatrix(camera.projectionMatrix);\n this._frustum.setFromMatrix(new THREE.Matrix4().multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse));\n }\n\n _tileInFrustum(tile) {\n var bounds = tile.getBounds();\n return this._frustum.intersectsBox(new THREE.Box3(new THREE.Vector3(bounds[0], 0, bounds[3]), new THREE.Vector3(bounds[2], 0, bounds[1])));\n }\n\n // Update and output tiles from the previous LOD checklist\n _outputTiles() {\n // Remove all tiles from layer\n this._removeTiles();\n\n // Add / re-add tiles\n this._tileList.forEach(tile => {\n // Are the mesh and texture ready?\n //\n // If yes, continue\n // If no, skip\n if (!tile.isReady()) {\n return;\n }\n\n // Add tile to layer (and to scene) if not already there\n this._tiles.add(tile.getMesh());\n });\n }\n\n // Works out tiles in the view frustum and stores them in an array\n //\n // Does not output the tiles, deferring this to _outputTiles()\n _calculateLOD() {\n if (this._stop || !this._world) {\n return;\n }\n\n // var start = performance.now();\n\n var camera = this._world.getCamera();\n\n // 1. Update and retrieve camera frustum\n this._updateFrustum(this._frustum, camera);\n\n // 2. Add the four root items of the quadtree to a check list\n var checkList = this._checklist;\n checkList = [];\n checkList.push(this._requestTile('0', this));\n checkList.push(this._requestTile('1', this));\n checkList.push(this._requestTile('2', this));\n checkList.push(this._requestTile('3', this));\n\n // 3. Call Divide, passing in the check list\n this._divide(checkList);\n\n // // 4. Remove all tiles from layer\n //\n // Moved to _outputTiles() for now\n // this._removeTiles();\n\n // 5. Filter the tiles remaining in the check list\n this._tileList = checkList.filter((tile, index) => {\n // Skip tile if it's not in the current view frustum\n if (!this._tileInFrustum(tile)) {\n return false;\n }\n\n if (this._options.distance && this._options.distance > 0) {\n // TODO: Can probably speed this up\n var center = tile.getCenter();\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n // Manual distance limit to cut down on tiles so far away\n if (dist > this._options.distance) {\n return false;\n }\n }\n\n // Does the tile have a mesh?\n //\n // If yes, continue\n // If no, generate tile mesh, request texture and skip\n if (!tile.getMesh()) {\n tile.requestTileAsync();\n }\n\n return true;\n\n // Are the mesh and texture ready?\n //\n // If yes, continue\n // If no, skip\n // if (!tile.isReady()) {\n // return;\n // }\n //\n // // Add tile to layer (and to scene)\n // this._tiles.add(tile.getMesh());\n });\n\n // console.log(performance.now() - start);\n }\n\n _divide(checkList) {\n var count = 0;\n var currentItem;\n var quadcode;\n\n // 1. Loop until count equals check list length\n while (count != checkList.length) {\n currentItem = checkList[count];\n quadcode = currentItem.getQuadcode();\n\n // 2. Increase count and continue loop if quadcode equals max LOD / zoom\n if (currentItem.length === this._maxLOD) {\n count++;\n continue;\n }\n\n // 3. Else, calculate screen-space error metric for quadcode\n if (this._screenSpaceError(currentItem)) {\n // 4. If error is sufficient...\n\n // 4a. Remove parent item from the check list\n checkList.splice(count, 1);\n\n // 4b. Add 4 child items to the check list\n checkList.push(this._requestTile(quadcode + '0', this));\n checkList.push(this._requestTile(quadcode + '1', this));\n checkList.push(this._requestTile(quadcode + '2', this));\n checkList.push(this._requestTile(quadcode + '3', this));\n\n // 4d. Continue the loop without increasing count\n continue;\n } else {\n // 5. Else, increase count and continue loop\n count++;\n }\n }\n }\n\n _screenSpaceError(tile) {\n var minDepth = this._minLOD;\n var maxDepth = this._maxLOD;\n\n var quadcode = tile.getQuadcode();\n\n var camera = this._world.getCamera();\n\n // Tweak this value to refine specific point that each quad is subdivided\n //\n // It's used to multiple the dimensions of the tile sides before\n // comparing against the tile distance from camera\n var quality = 3.0;\n\n // 1. Return false if quadcode length equals maxDepth (stop dividing)\n if (quadcode.length === maxDepth) {\n return false;\n }\n\n // 2. Return true if quadcode length is less than minDepth\n if (quadcode.length < minDepth) {\n return true;\n }\n\n // 3. Return false if quadcode bounds are not in view frustum\n if (!this._tileInFrustum(tile)) {\n return false;\n }\n\n var center = tile.getCenter();\n\n // 4. Calculate screen-space error metric\n // TODO: Use closest distance to one of the 4 tile corners\n var dist = (new THREE.Vector3(center[0], 0, center[1])).sub(camera.position).length();\n\n var error = quality * tile.getSide() / dist;\n\n // 5. Return true if error is greater than 1.0, else return false\n return (error > 1.0);\n }\n\n _removeTiles() {\n for (var i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n }\n\n // Return a new tile instance\n _createTile(quadcode, layer) {}\n\n // Get a cached tile or request a new one if not in cache\n _requestTile(quadcode, layer) {\n var tile = this._tileCache.getTile(quadcode);\n\n if (!tile) {\n // Set up a brand new tile\n tile = this._createTile(quadcode, layer);\n\n // Add tile to cache, though it won't be ready yet as the data is being\n // requested from various places asynchronously\n this._tileCache.setTile(quadcode, tile);\n }\n\n return tile;\n }\n\n _destroyTile(tile) {\n // Remove tile from scene\n this._tiles.remove(tile.getMesh());\n\n // Delete any references to the tile within this component\n\n // Call destory on tile instance\n tile.destroy();\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n var i;\n\n // Remove all tiles\n for (i = this._tiles.children.length - 1; i >= 0; i--) {\n this._tiles.remove(this._tiles.children[i]);\n }\n\n this._tileCache.destroy();\n this._tileCache = null;\n\n this._tiles = null;\n this._frustum = null;\n\n super.destroy();\n }\n}\n\nexport default TileLayer;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileLayer.js\n **/","import LRUCache from 'lru-cache';\n\n// This process is based on a similar approach taken by OpenWebGlobe\n// See: https://github.com/OpenWebGlobe/WebViewer/blob/master/source/core/globecache.js\n\nclass TileCache {\n constructor(cacheLimit, onDestroyTile) {\n this._cache = LRUCache({\n max: cacheLimit,\n dispose: (key, tile) => {\n onDestroyTile(tile);\n }\n });\n }\n\n // Returns true if all specified tile providers are ready to be used\n // Otherwise, returns false\n isReady() {\n return false;\n }\n\n // Get a cached tile without requesting a new one\n getTile(quadcode) {\n return this._cache.get(quadcode);\n }\n\n // Add tile to cache\n setTile(quadcode, tile) {\n this._cache.set(quadcode, tile);\n }\n\n // Destroy the cache and remove it from memory\n //\n // TODO: Call destroy method on items in cache\n destroy() {\n this._cache.reset();\n this._cache = null;\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(cacheLimit, onDestroyTile) {\n return new TileCache(cacheLimit, onDestroyTile);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TileCache.js\n **/","module.exports = LRUCache\n\n// This will be a proper iterable 'Map' in engines that support it,\n// or a fakey-fake PseudoMap in older versions.\nvar Map = require('pseudomap')\nvar util = require('util')\n\n// A linked list to keep track of recently-used-ness\nvar Yallist = require('yallist')\n\n// use symbols if possible, otherwise just _props\nvar symbols = {}\nvar hasSymbol = typeof Symbol === 'function'\nvar makeSymbol\nif (hasSymbol) {\n makeSymbol = function (key) {\n return Symbol.for(key)\n }\n} else {\n makeSymbol = function (key) {\n return '_' + key\n }\n}\n\nfunction priv (obj, key, val) {\n var sym\n if (symbols[key]) {\n sym = symbols[key]\n } else {\n sym = makeSymbol(key)\n symbols[key] = sym\n }\n if (arguments.length === 2) {\n return obj[sym]\n } else {\n obj[sym] = val\n return val\n }\n}\n\nfunction naiveLength () { return 1 }\n\n// lruList is a yallist where the head is the youngest\n// item, and the tail is the oldest. the list contains the Hit\n// objects as the entries.\n// Each Hit object has a reference to its Yallist.Node. This\n// never changes.\n//\n// cache is a Map (or PseudoMap) that matches the keys to\n// the Yallist.Node object.\nfunction LRUCache (options) {\n if (!(this instanceof LRUCache)) {\n return new LRUCache(options)\n }\n\n if (typeof options === 'number') {\n options = { max: options }\n }\n\n if (!options) {\n options = {}\n }\n\n var max = priv(this, 'max', options.max)\n // Kind of weird to have a default max of Infinity, but oh well.\n if (!max ||\n !(typeof max === 'number') ||\n max <= 0) {\n priv(this, 'max', Infinity)\n }\n\n var lc = options.length || naiveLength\n if (typeof lc !== 'function') {\n lc = naiveLength\n }\n priv(this, 'lengthCalculator', lc)\n\n priv(this, 'allowStale', options.stale || false)\n priv(this, 'maxAge', options.maxAge || 0)\n priv(this, 'dispose', options.dispose)\n this.reset()\n}\n\n// resize the cache when the max changes.\nObject.defineProperty(LRUCache.prototype, 'max', {\n set: function (mL) {\n if (!mL || !(typeof mL === 'number') || mL <= 0) {\n mL = Infinity\n }\n priv(this, 'max', mL)\n trim(this)\n },\n get: function () {\n return priv(this, 'max')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'allowStale', {\n set: function (allowStale) {\n priv(this, 'allowStale', !!allowStale)\n },\n get: function () {\n return priv(this, 'allowStale')\n },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'maxAge', {\n set: function (mA) {\n if (!mA || !(typeof mA === 'number') || mA < 0) {\n mA = 0\n }\n priv(this, 'maxAge', mA)\n trim(this)\n },\n get: function () {\n return priv(this, 'maxAge')\n },\n enumerable: true\n})\n\n// resize the cache when the lengthCalculator changes.\nObject.defineProperty(LRUCache.prototype, 'lengthCalculator', {\n set: function (lC) {\n if (typeof lC !== 'function') {\n lC = naiveLength\n }\n if (lC !== priv(this, 'lengthCalculator')) {\n priv(this, 'lengthCalculator', lC)\n priv(this, 'length', 0)\n priv(this, 'lruList').forEach(function (hit) {\n hit.length = priv(this, 'lengthCalculator').call(this, hit.value, hit.key)\n priv(this, 'length', priv(this, 'length') + hit.length)\n }, this)\n }\n trim(this)\n },\n get: function () { return priv(this, 'lengthCalculator') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'length', {\n get: function () { return priv(this, 'length') },\n enumerable: true\n})\n\nObject.defineProperty(LRUCache.prototype, 'itemCount', {\n get: function () { return priv(this, 'lruList').length },\n enumerable: true\n})\n\nLRUCache.prototype.rforEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').tail; walker !== null;) {\n var prev = walker.prev\n forEachStep(this, fn, walker, thisp)\n walker = prev\n }\n}\n\nfunction forEachStep (self, fn, node, thisp) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) {\n hit = undefined\n }\n }\n if (hit) {\n fn.call(thisp, hit.value, hit.key, self)\n }\n}\n\nLRUCache.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = priv(this, 'lruList').head; walker !== null;) {\n var next = walker.next\n forEachStep(this, fn, walker, thisp)\n walker = next\n }\n}\n\nLRUCache.prototype.keys = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.key\n }, this)\n}\n\nLRUCache.prototype.values = function () {\n return priv(this, 'lruList').toArray().map(function (k) {\n return k.value\n }, this)\n}\n\nLRUCache.prototype.reset = function () {\n if (priv(this, 'dispose') &&\n priv(this, 'lruList') &&\n priv(this, 'lruList').length) {\n priv(this, 'lruList').forEach(function (hit) {\n priv(this, 'dispose').call(this, hit.key, hit.value)\n }, this)\n }\n\n priv(this, 'cache', new Map()) // hash of items by key\n priv(this, 'lruList', new Yallist()) // list of items in order of use recency\n priv(this, 'length', 0) // length of items in the list\n}\n\nLRUCache.prototype.dump = function () {\n return priv(this, 'lruList').map(function (hit) {\n if (!isStale(this, hit)) {\n return {\n k: hit.key,\n v: hit.value,\n e: hit.now + (hit.maxAge || 0)\n }\n }\n }, this).toArray().filter(function (h) {\n return h\n })\n}\n\nLRUCache.prototype.dumpLru = function () {\n return priv(this, 'lruList')\n}\n\nLRUCache.prototype.inspect = function (n, opts) {\n var str = 'LRUCache {'\n var extras = false\n\n var as = priv(this, 'allowStale')\n if (as) {\n str += '\\n allowStale: true'\n extras = true\n }\n\n var max = priv(this, 'max')\n if (max && max !== Infinity) {\n if (extras) {\n str += ','\n }\n str += '\\n max: ' + util.inspect(max, opts)\n extras = true\n }\n\n var maxAge = priv(this, 'maxAge')\n if (maxAge) {\n if (extras) {\n str += ','\n }\n str += '\\n maxAge: ' + util.inspect(maxAge, opts)\n extras = true\n }\n\n var lc = priv(this, 'lengthCalculator')\n if (lc && lc !== naiveLength) {\n if (extras) {\n str += ','\n }\n str += '\\n length: ' + util.inspect(priv(this, 'length'), opts)\n extras = true\n }\n\n var didFirst = false\n priv(this, 'lruList').forEach(function (item) {\n if (didFirst) {\n str += ',\\n '\n } else {\n if (extras) {\n str += ',\\n'\n }\n didFirst = true\n str += '\\n '\n }\n var key = util.inspect(item.key).split('\\n').join('\\n ')\n var val = { value: item.value }\n if (item.maxAge !== maxAge) {\n val.maxAge = item.maxAge\n }\n if (lc !== naiveLength) {\n val.length = item.length\n }\n if (isStale(this, item)) {\n val.stale = true\n }\n\n val = util.inspect(val, opts).split('\\n').join('\\n ')\n str += key + ' => ' + val\n })\n\n if (didFirst || extras) {\n str += '\\n'\n }\n str += '}'\n\n return str\n}\n\nLRUCache.prototype.set = function (key, value, maxAge) {\n maxAge = maxAge || priv(this, 'maxAge')\n\n var now = maxAge ? Date.now() : 0\n var len = priv(this, 'lengthCalculator').call(this, value, key)\n\n if (priv(this, 'cache').has(key)) {\n if (len > priv(this, 'max')) {\n del(this, priv(this, 'cache').get(key))\n return false\n }\n\n var node = priv(this, 'cache').get(key)\n var item = node.value\n\n // dispose of the old one before overwriting\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, item.value)\n }\n\n item.now = now\n item.maxAge = maxAge\n item.value = value\n priv(this, 'length', priv(this, 'length') + (len - item.length))\n item.length = len\n this.get(key)\n trim(this)\n return true\n }\n\n var hit = new Entry(key, value, len, now, maxAge)\n\n // oversized objects fall out of cache automatically.\n if (hit.length > priv(this, 'max')) {\n if (priv(this, 'dispose')) {\n priv(this, 'dispose').call(this, key, value)\n }\n return false\n }\n\n priv(this, 'length', priv(this, 'length') + hit.length)\n priv(this, 'lruList').unshift(hit)\n priv(this, 'cache').set(key, priv(this, 'lruList').head)\n trim(this)\n return true\n}\n\nLRUCache.prototype.has = function (key) {\n if (!priv(this, 'cache').has(key)) return false\n var hit = priv(this, 'cache').get(key).value\n if (isStale(this, hit)) {\n return false\n }\n return true\n}\n\nLRUCache.prototype.get = function (key) {\n return get(this, key, true)\n}\n\nLRUCache.prototype.peek = function (key) {\n return get(this, key, false)\n}\n\nLRUCache.prototype.pop = function () {\n var node = priv(this, 'lruList').tail\n if (!node) return null\n del(this, node)\n return node.value\n}\n\nLRUCache.prototype.del = function (key) {\n del(this, priv(this, 'cache').get(key))\n}\n\nLRUCache.prototype.load = function (arr) {\n // reset the cache\n this.reset()\n\n var now = Date.now()\n // A previous serialized cache has the most recent items first\n for (var l = arr.length - 1; l >= 0; l--) {\n var hit = arr[l]\n var expiresAt = hit.e || 0\n if (expiresAt === 0) {\n // the item was created without expiration in a non aged cache\n this.set(hit.k, hit.v)\n } else {\n var maxAge = expiresAt - now\n // dont add already expired items\n if (maxAge > 0) {\n this.set(hit.k, hit.v, maxAge)\n }\n }\n }\n}\n\nLRUCache.prototype.prune = function () {\n var self = this\n priv(this, 'cache').forEach(function (value, key) {\n get(self, key, false)\n })\n}\n\nfunction get (self, key, doUse) {\n var node = priv(self, 'cache').get(key)\n if (node) {\n var hit = node.value\n if (isStale(self, hit)) {\n del(self, node)\n if (!priv(self, 'allowStale')) hit = undefined\n } else {\n if (doUse) {\n priv(self, 'lruList').unshiftNode(node)\n }\n }\n if (hit) hit = hit.value\n }\n return hit\n}\n\nfunction isStale (self, hit) {\n if (!hit || (!hit.maxAge && !priv(self, 'maxAge'))) {\n return false\n }\n var stale = false\n var diff = Date.now() - hit.now\n if (hit.maxAge) {\n stale = diff > hit.maxAge\n } else {\n stale = priv(self, 'maxAge') && (diff > priv(self, 'maxAge'))\n }\n return stale\n}\n\nfunction trim (self) {\n if (priv(self, 'length') > priv(self, 'max')) {\n for (var walker = priv(self, 'lruList').tail;\n priv(self, 'length') > priv(self, 'max') && walker !== null;) {\n // We know that we're about to delete this one, and also\n // what the next least recently used key will be, so just\n // go ahead and set it now.\n var prev = walker.prev\n del(self, walker)\n walker = prev\n }\n }\n}\n\nfunction del (self, node) {\n if (node) {\n var hit = node.value\n if (priv(self, 'dispose')) {\n priv(self, 'dispose').call(this, hit.key, hit.value)\n }\n priv(self, 'length', priv(self, 'length') - hit.length)\n priv(self, 'cache').delete(hit.key)\n priv(self, 'lruList').removeNode(node)\n }\n}\n\n// classy, since V8 prefers predictable objects.\nfunction Entry (key, value, length, now, maxAge) {\n this.key = key\n this.value = value\n this.length = length\n this.now = now\n this.maxAge = maxAge || 0\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/lru-cache/lib/lru-cache.js\n ** module id = 41\n ** module chunks = 0\n **/","if (process.env.npm_package_name === 'pseudomap' &&\n process.env.npm_lifecycle_script === 'test')\n process.env.TEST_PSEUDOMAP = 'true'\n\nif (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) {\n module.exports = Map\n} else {\n module.exports = require('./pseudomap')\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/map.js\n ** module id = 42\n ** module chunks = 0\n **/","// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\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 = setTimeout(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 clearTimeout(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 setTimeout(drainQueue, 0);\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;\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\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/process/browser.js\n ** module id = 43\n ** module chunks = 0\n **/","var hasOwnProperty = Object.prototype.hasOwnProperty\n\nmodule.exports = PseudoMap\n\nfunction PseudoMap (set) {\n if (!(this instanceof PseudoMap)) // whyyyyyyy\n throw new TypeError(\"Constructor PseudoMap requires 'new'\")\n\n this.clear()\n\n if (set) {\n if ((set instanceof PseudoMap) ||\n (typeof Map === 'function' && set instanceof Map))\n set.forEach(function (value, key) {\n this.set(key, value)\n }, this)\n else if (Array.isArray(set))\n set.forEach(function (kv) {\n this.set(kv[0], kv[1])\n }, this)\n else\n throw new TypeError('invalid argument')\n }\n}\n\nPseudoMap.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n Object.keys(this._data).forEach(function (k) {\n if (k !== 'size')\n fn.call(thisp, this._data[k].value, this._data[k].key)\n }, this)\n}\n\nPseudoMap.prototype.has = function (k) {\n return !!find(this._data, k)\n}\n\nPseudoMap.prototype.get = function (k) {\n var res = find(this._data, k)\n return res && res.value\n}\n\nPseudoMap.prototype.set = function (k, v) {\n set(this._data, k, v)\n}\n\nPseudoMap.prototype.delete = function (k) {\n var res = find(this._data, k)\n if (res) {\n delete this._data[res._index]\n this._data.size--\n }\n}\n\nPseudoMap.prototype.clear = function () {\n var data = Object.create(null)\n data.size = 0\n\n Object.defineProperty(this, '_data', {\n value: data,\n enumerable: false,\n configurable: true,\n writable: false\n })\n}\n\nObject.defineProperty(PseudoMap.prototype, 'size', {\n get: function () {\n return this._data.size\n },\n set: function (n) {},\n enumerable: true,\n configurable: true\n})\n\nPseudoMap.prototype.values =\nPseudoMap.prototype.keys =\nPseudoMap.prototype.entries = function () {\n throw new Error('iterators are not implemented in this version')\n}\n\n// Either identical, or both NaN\nfunction same (a, b) {\n return a === b || a !== a && b !== b\n}\n\nfunction Entry (k, v, i) {\n this.key = k\n this.value = v\n this._index = i\n}\n\nfunction find (data, k) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k))\n return data[key]\n }\n}\n\nfunction set (data, k, v) {\n for (var i = 0, s = '_' + k, key = s;\n hasOwnProperty.call(data, key);\n key = s + i++) {\n if (same(data[key].key, k)) {\n data[key].value = v\n return\n }\n }\n data.size++\n data[key] = new Entry(k, v, key)\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/pseudomap/pseudomap.js\n ** module id = 44\n ** module chunks = 0\n **/","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/util.js\n ** module id = 45\n ** module chunks = 0\n **/","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/util/support/isBufferBrowser.js\n ** module id = 46\n ** module chunks = 0\n **/","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/inherits/inherits_browser.js\n ** module id = 47\n ** module chunks = 0\n **/","module.exports = Yallist\n\nYallist.Node = Node\nYallist.create = Yallist\n\nfunction Yallist (list) {\n var self = this\n if (!(self instanceof Yallist)) {\n self = new Yallist()\n }\n\n self.tail = null\n self.head = null\n self.length = 0\n\n if (list && typeof list.forEach === 'function') {\n list.forEach(function (item) {\n self.push(item)\n })\n } else if (arguments.length > 0) {\n for (var i = 0, l = arguments.length; i < l; i++) {\n self.push(arguments[i])\n }\n }\n\n return self\n}\n\nYallist.prototype.removeNode = function (node) {\n if (node.list !== this) {\n throw new Error('removing node which does not belong to this list')\n }\n\n var next = node.next\n var prev = node.prev\n\n if (next) {\n next.prev = prev\n }\n\n if (prev) {\n prev.next = next\n }\n\n if (node === this.head) {\n this.head = next\n }\n if (node === this.tail) {\n this.tail = prev\n }\n\n node.list.length --\n node.next = null\n node.prev = null\n node.list = null\n}\n\nYallist.prototype.unshiftNode = function (node) {\n if (node === this.head) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var head = this.head\n node.list = this\n node.next = head\n if (head) {\n head.prev = node\n }\n\n this.head = node\n if (!this.tail) {\n this.tail = node\n }\n this.length ++\n}\n\nYallist.prototype.pushNode = function (node) {\n if (node === this.tail) {\n return\n }\n\n if (node.list) {\n node.list.removeNode(node)\n }\n\n var tail = this.tail\n node.list = this\n node.prev = tail\n if (tail) {\n tail.next = node\n }\n\n this.tail = node\n if (!this.head) {\n this.head = node\n }\n this.length ++\n}\n\nYallist.prototype.push = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n push(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.unshift = function () {\n for (var i = 0, l = arguments.length; i < l; i++) {\n unshift(this, arguments[i])\n }\n return this.length\n}\n\nYallist.prototype.pop = function () {\n if (!this.tail)\n return undefined\n\n var res = this.tail.value\n this.tail = this.tail.prev\n this.tail.next = null\n this.length --\n return res\n}\n\nYallist.prototype.shift = function () {\n if (!this.head)\n return undefined\n\n var res = this.head.value\n this.head = this.head.next\n this.head.prev = null\n this.length --\n return res\n}\n\nYallist.prototype.forEach = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.head, i = 0; walker !== null; i++) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.next\n }\n}\n\nYallist.prototype.forEachReverse = function (fn, thisp) {\n thisp = thisp || this\n for (var walker = this.tail, i = this.length - 1; walker !== null; i--) {\n fn.call(thisp, walker.value, i, this)\n walker = walker.prev\n }\n}\n\nYallist.prototype.get = function (n) {\n for (var i = 0, walker = this.head; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.next\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.getReverse = function (n) {\n for (var i = 0, walker = this.tail; walker !== null && i < n; i++) {\n // abort out of the list early if we hit a cycle\n walker = walker.prev\n }\n if (i === n && walker !== null) {\n return walker.value\n }\n}\n\nYallist.prototype.map = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.head; walker !== null; ) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.next\n }\n return res\n}\n\nYallist.prototype.mapReverse = function (fn, thisp) {\n thisp = thisp || this\n var res = new Yallist()\n for (var walker = this.tail; walker !== null;) {\n res.push(fn.call(thisp, walker.value, this))\n walker = walker.prev\n }\n return res\n}\n\nYallist.prototype.reduce = function (fn, initial) {\n var acc\n var walker = this.head\n if (arguments.length > 1) {\n acc = initial\n } else if (this.head) {\n walker = this.head.next\n acc = this.head.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = 0; walker !== null; i++) {\n acc = fn(acc, walker.value, i)\n walker = walker.next\n }\n\n return acc\n}\n\nYallist.prototype.reduceReverse = function (fn, initial) {\n var acc\n var walker = this.tail\n if (arguments.length > 1) {\n acc = initial\n } else if (this.tail) {\n walker = this.tail.prev\n acc = this.tail.value\n } else {\n throw new TypeError('Reduce of empty list with no initial value')\n }\n\n for (var i = this.length - 1; walker !== null; i--) {\n acc = fn(acc, walker.value, i)\n walker = walker.prev\n }\n\n return acc\n}\n\nYallist.prototype.toArray = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.head; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.next\n }\n return arr\n}\n\nYallist.prototype.toArrayReverse = function () {\n var arr = new Array(this.length)\n for (var i = 0, walker = this.tail; walker !== null; i++) {\n arr[i] = walker.value\n walker = walker.prev\n }\n return arr\n}\n\nYallist.prototype.slice = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = 0, walker = this.head; walker !== null && i < from; i++) {\n walker = walker.next\n }\n for (; walker !== null && i < to; i++, walker = walker.next) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.sliceReverse = function (from, to) {\n to = to || this.length\n if (to < 0) {\n to += this.length\n }\n from = from || 0\n if (from < 0) {\n from += this.length\n }\n var ret = new Yallist()\n if (to < from || to < 0) {\n return ret\n }\n if (from < 0) {\n from = 0\n }\n if (to > this.length) {\n to = this.length\n }\n for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) {\n walker = walker.prev\n }\n for (; walker !== null && i > from; i--, walker = walker.prev) {\n ret.push(walker.value)\n }\n return ret\n}\n\nYallist.prototype.reverse = function () {\n var head = this.head\n var tail = this.tail\n for (var walker = head; walker !== null; walker = walker.prev) {\n var p = walker.prev\n walker.prev = walker.next\n walker.next = p\n }\n this.head = tail\n this.tail = head\n return this\n}\n\nfunction push (self, item) {\n self.tail = new Node(item, self.tail, null, self)\n if (!self.head) {\n self.head = self.tail\n }\n self.length ++\n}\n\nfunction unshift (self, item) {\n self.head = new Node(item, null, self.head, self)\n if (!self.tail) {\n self.tail = self.head\n }\n self.length ++\n}\n\nfunction Node (value, prev, next, list) {\n if (!(this instanceof Node)) {\n return new Node(value, prev, next, list)\n }\n\n this.list = list\n this.value = value\n\n if (prev) {\n prev.next = this\n this.prev = prev\n } else {\n this.prev = null\n }\n\n if (next) {\n next.prev = this\n this.next = next\n } else {\n this.next = null\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/yallist/yallist.js\n ** module id = 48\n ** module chunks = 0\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\n\nclass ImageTile extends Tile {\n constructor(quadcode, path, layer) {\n super(quadcode, path, layer);\n }\n\n // Request data for the tile\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n this._requestTile();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear image reference\n this._image = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n\n var material;\n if (!this._world._environment._skybox) {\n material = new THREE.MeshBasicMaterial({\n depthWrite: false\n });\n\n // var material = new THREE.MeshPhongMaterial({\n // depthWrite: false\n // });\n } else {\n // Other MeshStandardMaterial settings\n //\n // material.envMapIntensity will change the amount of colour reflected(?)\n // from the environment map – can be greater than 1 for more intensity\n\n material = new THREE.MeshStandardMaterial({\n depthWrite: false\n });\n material.roughness = 1;\n material.metalness = 0.1;\n material.envMap = this._world._environment._skybox.getRenderTarget();\n }\n\n var localMesh = new THREE.Mesh(geom, material);\n localMesh.rotation.x = -90 * Math.PI / 180;\n\n localMesh.receiveShadow = true;\n\n mesh.add(localMesh);\n mesh.renderOrder = 0;\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n // var box = new BoxHelper(localMesh);\n // mesh.add(box);\n //\n // mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _requestTile() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n var image = document.createElement('img');\n\n image.addEventListener('load', event => {\n var texture = new THREE.Texture();\n\n texture.image = image;\n texture.needsUpdate = true;\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n // Something went wrong and the tile or its material is missing\n //\n // Possibly removed by the cache before the image loaded\n if (!this._mesh || !this._mesh.children[0] || !this._mesh.children[0].material) {\n return;\n }\n\n this._mesh.children[0].material.map = texture;\n this._mesh.children[0].material.needsUpdate = true;\n\n this._texture = texture;\n this._ready = true;\n }, false);\n\n // image.addEventListener('progress', event => {}, false);\n // image.addEventListener('error', event => {}, false);\n\n image.crossOrigin = '';\n\n // Load image\n image.src = url;\n\n this._image = image;\n }\n\n _abortRequest() {\n if (!this._image) {\n return;\n }\n\n this._image.src = '';\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer) {\n return new ImageTile(quadcode, path, layer);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTile.js\n **/","import Point from '../../geo/Point';\nimport LatLon from '../../geo/LatLon';\nimport THREE from 'three';\n\n// Manages a single tile and its layers\n\nvar r2d = 180 / Math.PI;\n\nvar tileURLRegex = /\\{([szxy])\\}/g;\n\nclass Tile {\n constructor(quadcode, path, layer) {\n this._layer = layer;\n this._world = layer._world;\n this._quadcode = quadcode;\n this._path = path;\n\n this._ready = false;\n\n this._tile = this._quadcodeToTile(quadcode);\n\n // Bottom-left and top-right bounds in WGS84 coordinates\n this._boundsLatLon = this._tileBoundsWGS84(this._tile);\n\n // Bottom-left and top-right bounds in world coordinates\n this._boundsWorld = this._tileBoundsFromWGS84(this._boundsLatLon);\n\n // Tile center in world coordinates\n this._center = this._boundsToCenter(this._boundsWorld);\n\n // Tile center in projected coordinates\n this._centerLatlon = this._world.pointToLatLon(VIZI.Point(this._center[0], this._center[1]));\n\n // Length of a tile side in world coorindates\n this._side = this._getSide(this._boundsWorld);\n\n // Point scale for tile (for unit conversion)\n this._pointScale = this._world.pointScale(this._centerLatlon);\n }\n\n // Returns true if the tile mesh and texture are ready to be used\n // Otherwise, returns false\n isReady() {\n return this._ready;\n }\n\n // Request data for the tile\n requestTileAsync() {}\n\n getQuadcode() {\n return this._quadcode;\n }\n\n getBounds() {\n return this._boundsWorld;\n }\n\n getCenter() {\n return this._center;\n }\n\n getSide() {\n return this._side;\n }\n\n getMesh() {\n return this._mesh;\n }\n\n // Destroys the tile and removes it from the layer and memory\n //\n // Ensure that this leaves no trace of the tile – no textures, no meshes,\n // nothing in memory or the GPU\n destroy() {\n // Delete reference to layer and world\n this._layer = null;\n this._world = null;\n\n // Delete location references\n this._boundsLatLon = null;\n this._boundsWorld = null;\n this._center = null;\n\n // Done if no mesh\n if (!this._mesh) {\n return;\n }\n\n if (this._mesh.children) {\n // Dispose of mesh and materials\n this._mesh.children.forEach(child => {\n child.geometry.dispose();\n child.geometry = null;\n\n if (child.material.map) {\n child.material.map.dispose();\n child.material.map = null;\n }\n\n child.material.dispose();\n child.material = null;\n });\n } else {\n this._mesh.geometry.dispose();\n this._mesh.geometry = null;\n\n if (this._mesh.material.map) {\n this._mesh.material.map.dispose();\n this._mesh.material.map = null;\n }\n\n this._mesh.material.dispose();\n this._mesh.material = null;\n }\n }\n\n _createMesh() {}\n _createDebugMesh() {}\n\n _getTileURL(urlParams) {\n if (!urlParams.s) {\n // Default to a random choice of a, b or c\n urlParams.s = String.fromCharCode(97 + Math.floor(Math.random() * 3));\n }\n\n tileURLRegex.lastIndex = 0;\n return this._path.replace(tileURLRegex, function(value, key) {\n // Replace with paramter, otherwise keep existing value\n return urlParams[key];\n });\n }\n\n // Convert from quadcode to TMS tile coordinates\n _quadcodeToTile(quadcode) {\n var x = 0;\n var y = 0;\n var z = quadcode.length;\n\n for (var i = z; i > 0; i--) {\n var mask = 1 << (i - 1);\n var q = +quadcode[z - i];\n if (q === 1) {\n x |= mask;\n }\n if (q === 2) {\n y |= mask;\n }\n if (q === 3) {\n x |= mask;\n y |= mask;\n }\n }\n\n return [x, y, z];\n }\n\n // Convert WGS84 tile bounds to world coordinates\n _tileBoundsFromWGS84(boundsWGS84) {\n var sw = this._layer._world.latLonToPoint(LatLon(boundsWGS84[1], boundsWGS84[0]));\n var ne = this._layer._world.latLonToPoint(LatLon(boundsWGS84[3], boundsWGS84[2]));\n\n return [sw.x, sw.y, ne.x, ne.y];\n }\n\n // Get tile bounds in WGS84 coordinates\n _tileBoundsWGS84(tile) {\n var e = this._tile2lon(tile[0] + 1, tile[2]);\n var w = this._tile2lon(tile[0], tile[2]);\n var s = this._tile2lat(tile[1] + 1, tile[2]);\n var n = this._tile2lat(tile[1], tile[2]);\n return [w, s, e, n];\n }\n\n _tile2lon(x, z) {\n return x / Math.pow(2, z) * 360 - 180;\n }\n\n _tile2lat(y, z) {\n var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n }\n\n _boundsToCenter(bounds) {\n var x = bounds[0] + (bounds[2] - bounds[0]) / 2;\n var y = bounds[1] + (bounds[3] - bounds[1]) / 2;\n\n return [x, y];\n }\n\n _getSide(bounds) {\n return (new THREE.Vector3(bounds[0], 0, bounds[3])).sub(new THREE.Vector3(bounds[0], 0, bounds[1])).length();\n }\n}\n\nexport default Tile;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/Tile.js\n **/","// jscs:disable\n/*eslint eqeqeq:0*/\n\nimport THREE from 'three';\n\n/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nBoxHelper = function ( object ) {\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 THREE.BufferGeometry();\n\tgeometry.setIndex( new THREE.BufferAttribute( indices, 1 ) );\n\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );\n\n\tTHREE.LineSegments.call( this, geometry, new THREE.LineBasicMaterial( { linewidth: 2, color: 0xff0000 } ) );\n\n\tif ( object !== undefined ) {\n\n\t\tthis.update( object );\n\n\t}\n\n};\n\nBoxHelper.prototype = Object.create( THREE.LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = ( function () {\n\n\tvar box = new THREE.Box3();\n\n\treturn function ( object ) {\n\n\t\tbox.setFromObject( object );\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\nexport default BoxHelper;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendor/BoxHelper.js\n **/","import THREE from 'three';\n\nexport default function(colour, skyboxTarget) {\n var canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n\n var context = canvas.getContext('2d');\n context.fillStyle = colour;\n context.fillRect(0, 0, canvas.width, canvas.height);\n // context.strokeStyle = '#D0D0CF';\n // context.strokeRect(0, 0, canvas.width, canvas.height);\n\n var texture = new THREE.Texture(canvas);\n\n // // Silky smooth images when tilted\n // texture.magFilter = THREE.LinearFilter;\n // texture.minFilter = THREE.LinearMipMapLinearFilter;\n // //\n // // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n // texture.anisotropy = 4;\n\n // texture.wrapS = THREE.RepeatWrapping;\n // texture.wrapT = THREE.RepeatWrapping;\n // texture.repeat.set(segments, segments);\n\n texture.needsUpdate = true;\n\n var material;\n\n if (!skyboxTarget) {\n material = new THREE.MeshBasicMaterial({\n map: texture,\n depthWrite: false\n });\n } else {\n material = new THREE.MeshStandardMaterial({\n depthWrite: false\n });\n material.roughness = 1;\n material.metalness = 0.1;\n material.envMap = skyboxTarget;\n }\n\n return material;\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/ImageTileLayerBaseMaterial.js\n **/","import TileLayer from './TileLayer';\nimport extend from 'lodash.assign';\nimport TopoJSONTile from './TopoJSONTile';\nimport throttle from 'lodash.throttle';\nimport THREE from 'three';\n\n// TODO: Consider pausing per-frame output during movement so there's little to\n// no jank caused by previous tiles still processing\n\n// This tile layer only updates the quadtree after world movement has occurred\n//\n// Tiles from previous quadtree updates are updated and outputted every frame\n// (or at least every frame, throttled to some amount)\n//\n// This is because the complexity of TopoJSON tiles requires a lot of processing\n// and so makes movement janky if updates occur every frame – only updating\n// after movement means frame drops are less obvious due to heavy processing\n// occurring while the view is generally stationary\n//\n// The downside is that until new tiles are requested and outputted you will\n// see blank spaces as you orbit and move around\n//\n// An added benefit is that it dramatically reduces the number of tiles being\n// requested over a period of time and the time it takes to go from request to\n// screen output\n//\n// It may be possible to perform these updates per-frame once Web Worker\n// processing is added\n\nclass TopoJSONTileLayer extends TileLayer {\n constructor(path, options) {\n var defaults = {\n maxLOD: 14,\n distance: 2000\n };\n\n options = extend(defaults, options);\n\n super(options);\n\n this._path = path;\n }\n\n _onAdd(world) {\n super._onAdd(world);\n\n // Trigger initial quadtree calculation on the next frame\n //\n // TODO: This is a hack to ensure the camera is all set up - a better\n // solution should be found\n setTimeout(() => {\n this._calculateLOD();\n this._initEvents();\n }, 0);\n }\n\n _initEvents() {\n // Run LOD calculations based on render calls\n //\n // Throttled to 1 LOD calculation per 100ms\n this._throttledWorldUpdate = throttle(this._onWorldUpdate, 100);\n\n this._world.on('preUpdate', this._throttledWorldUpdate, this);\n this._world.on('move', this._onWorldMove, this);\n this._world.on('controlsMove', this._onControlsMove, this);\n }\n\n // Update and output tiles each frame (throttled)\n _onWorldUpdate() {\n if (this._pauseOutput) {\n return;\n }\n\n this._outputTiles();\n }\n\n // Update tiles grid after world move, but don't output them\n _onWorldMove(latlon, point) {\n this._pauseOutput = false;\n this._calculateLOD();\n }\n\n // Pause updates during control movement for less visual jank\n _onControlsMove() {\n this._pauseOutput = true;\n }\n\n _createTile(quadcode, layer) {\n var options = {};\n\n if (this._options.filter) {\n options.filter = this._options.filter;\n }\n\n if (this._options.style) {\n options.style = this._options.style;\n }\n\n return TopoJSONTile(quadcode, this._path, layer, options);\n }\n\n // Destroys the layer and removes it from the scene and memory\n destroy() {\n this._world.off('preUpdate', this._throttledWorldUpdate);\n this._world.off('move', this._onWorldMove);\n\n this._throttledWorldUpdate = null;\n\n // Run common destruction logic from parent\n super.destroy();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(path, options) {\n return new TopoJSONTileLayer(path, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TopoJSONTileLayer.js\n **/","import Tile from './Tile';\nimport BoxHelper from '../../vendor/BoxHelper';\nimport THREE from 'three';\nimport reqwest from 'reqwest';\nimport topojson from 'topojson';\nimport Point from '../../geo/Point';\nimport LatLon from '../../geo/LatLon';\nimport earcut from 'earcut';\nimport extend from 'lodash.assign';\nimport extrudePolygon from '../../util/extrudePolygon';\nimport Offset from 'polygon-offset';\n\n// TODO: Perform tile request and processing in a Web Worker\n//\n// Use Operative (https://github.com/padolsey/operative)\n//\n// Would it make sense to have the worker functionality defined in a static\n// method so it only gets initialised once and not on every tile instance?\n//\n// Otherwise, worker processing logic would have to go in the tile layer so not\n// to waste loads of time setting up a brand new worker with three.js for each\n// tile every single time.\n//\n// Unsure of the best way to get three.js and VIZI into the worker\n//\n// Would need to set up a CRS / projection identical to the world instance\n//\n// Is it possible to bypass requirements on external script by having multiple\n// simple worker methods that each take enough inputs to perform a single task\n// without requiring VIZI or three.js? So long as the heaviest logic is done in\n// the worker and transferrable objects are used then it should be better than\n// nothing. Would probably still need things like earcut...\n//\n// After all, the three.js logic and object creation will still need to be\n// done on the main thread regardless so the worker should try to do as much as\n// possible with as few dependencies as possible.\n//\n// Have a look at how this is done in Tangram before implementing anything as\n// the approach there is pretty similar and robust.\n\nclass TopoJSONTile extends Tile {\n constructor(quadcode, path, layer, options) {\n super(quadcode, path, layer);\n\n var defaults = {\n filter: null,\n style: {\n color: '#ffffff'\n }\n };\n\n this._options = extend(defaults, options);\n }\n\n // Request data for the tile\n requestTileAsync() {\n // Making this asynchronous really speeds up the LOD framerate\n setTimeout(() => {\n if (!this._mesh) {\n this._mesh = this._createMesh();\n // this._shadowCanvas = this._createShadowCanvas();\n this._requestTile();\n }\n }, 0);\n }\n\n destroy() {\n // Cancel any pending requests\n this._abortRequest();\n\n // Clear request reference\n this._request = null;\n\n super.destroy();\n }\n\n _createMesh() {\n // Something went wrong and the tile\n //\n // Possibly removed by the cache before loaded\n if (!this._center) {\n return;\n }\n\n var mesh = new THREE.Object3D();\n\n mesh.position.x = this._center[0];\n mesh.position.z = this._center[1];\n\n // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n //\n // var material = new THREE.MeshBasicMaterial({\n // depthWrite: false\n // });\n //\n // var localMesh = new THREE.Mesh(geom, material);\n // localMesh.rotation.x = -90 * Math.PI / 180;\n //\n // mesh.add(localMesh);\n //\n // var box = new BoxHelper(localMesh);\n // mesh.add(box);\n //\n // mesh.add(this._createDebugMesh());\n\n return mesh;\n }\n\n _createDebugMesh() {\n var canvas = document.createElement('canvas');\n canvas.width = 256;\n canvas.height = 256;\n\n var context = canvas.getContext('2d');\n context.font = 'Bold 20px Helvetica Neue, Verdana, Arial';\n context.fillStyle = '#ff0000';\n context.fillText(this._quadcode, 20, canvas.width / 2 - 5);\n context.fillText(this._tile.toString(), 20, canvas.width / 2 + 25);\n\n var texture = new THREE.Texture(canvas);\n\n // Silky smooth images when tilted\n texture.magFilter = THREE.LinearFilter;\n texture.minFilter = THREE.LinearMipMapLinearFilter;\n\n // TODO: Set this to renderer.getMaxAnisotropy() / 4\n texture.anisotropy = 4;\n\n texture.needsUpdate = true;\n\n var material = new THREE.MeshBasicMaterial({\n map: texture,\n transparent: true,\n depthWrite: false\n });\n\n var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n var mesh = new THREE.Mesh(geom, material);\n\n mesh.rotation.x = -90 * Math.PI / 180;\n mesh.position.y = 0.1;\n\n return mesh;\n }\n\n _createShadowCanvas() {\n var canvas = document.createElement('canvas');\n\n // Rendered at a low resolution and later scaled up for a low-quality blur\n canvas.width = 512;\n canvas.height = 512;\n\n return canvas;\n }\n\n _addShadow(coordinates) {\n var ctx = this._shadowCanvas.getContext('2d');\n var width = this._shadowCanvas.width;\n var height = this._shadowCanvas.height;\n\n var _coords;\n var _offset;\n var offset = new Offset();\n\n // Transform coordinates to shadowCanvas space and draw on canvas\n coordinates.forEach((ring, index) => {\n ctx.beginPath();\n\n _coords = ring.map(coord => {\n var xFrac = (coord[0] - this._boundsWorld[0]) / this._side;\n var yFrac = (coord[1] - this._boundsWorld[3]) / this._side;\n return [xFrac * width, yFrac * height];\n });\n\n if (index > 0) {\n _offset = _coords;\n } else {\n _offset = offset.data(_coords).padding(1.3);\n }\n\n // TODO: This is super flaky and crashes the browser if run on anything\n // put the outer ring (potentially due to winding)\n _offset.forEach((coord, index) => {\n // var xFrac = (coord[0] - this._boundsWorld[0]) / this._side;\n // var yFrac = (coord[1] - this._boundsWorld[3]) / this._side;\n\n if (index === 0) {\n ctx.moveTo(coord[0], coord[1]);\n } else {\n ctx.lineTo(coord[0], coord[1]);\n }\n });\n\n ctx.closePath();\n });\n\n ctx.fillStyle = 'rgba(80, 80, 80, 0.7)';\n ctx.fill();\n }\n\n _requestTile() {\n var urlParams = {\n x: this._tile[0],\n y: this._tile[1],\n z: this._tile[2]\n };\n\n var url = this._getTileURL(urlParams);\n\n this._request = reqwest({\n url: url,\n type: 'json',\n crossOrigin: true\n }).then(res => {\n // Clear request reference\n this._request = null;\n this._processTileData(res);\n }).catch(err => {\n console.error(err);\n\n // Clear request reference\n this._request = null;\n });\n }\n\n _processTileData(data) {\n console.time(this._tile);\n\n var geojson = topojson.feature(data, data.objects.vectile);\n\n var offset = Point(0, 0);\n offset.x = -1 * this._center[0];\n offset.y = -1 * this._center[1];\n\n var coordinates;\n var earcutData;\n var faces;\n\n var allVertices = [];\n var allFaces = [];\n var allColours = [];\n var facesCount = 0;\n\n var colour = new THREE.Color();\n\n var light = new THREE.Color(0xffffff);\n var shadow = new THREE.Color(0x666666);\n\n var features = geojson.features;\n\n // Run filter, if provided\n if (this._options.filter) {\n features = geojson.features.filter(this._options.filter);\n }\n\n var style = this._options.style;\n\n features.forEach(feature => {\n // feature.geometry, feature.properties\n\n // Get style object, if provided\n if (typeof this._options.style === 'function') {\n style = this._options.style(feature);\n }\n\n var coordinates = feature.geometry.coordinates;\n\n // Skip if geometry is a point\n //\n // This should be a user-defined filter as it would be wrong to assume\n // that people won't want to output points\n //\n // The default use-case should be to output points in a different way\n if (!coordinates[0] || !coordinates[0][0] || !Array.isArray(coordinates[0][0])) {\n return;\n }\n\n coordinates = coordinates.map(ring => {\n return ring.map(coordinate => {\n var latlon = LatLon(coordinate[1], coordinate[0]);\n var point = this._layer._world.latLonToPoint(latlon);\n return [point.x, point.y];\n });\n });\n\n // Draw footprint on shadow canvas\n //\n // TODO: Disabled for the time-being until it can be sped up / moved to\n // a worker\n // this._addShadow(coordinates);\n\n earcutData = this._toEarcut(coordinates);\n\n faces = this._triangulate(earcutData.vertices, earcutData.holes, earcutData.dimensions);\n\n var groupedVertices = [];\n for (i = 0, il = earcutData.vertices.length; i < il; i += earcutData.dimensions) {\n groupedVertices.push(earcutData.vertices.slice(i, i + earcutData.dimensions));\n }\n\n var height = 0;\n\n if (style.height) {\n height = this._world.metresToWorld(style.height, this._pointScale);\n }\n\n var extruded = extrudePolygon(groupedVertices, faces, {\n bottom: 0,\n top: height\n });\n\n colour.set(style.color);\n\n var topColor = colour.clone().multiply(light);\n var bottomColor = colour.clone().multiply(shadow);\n\n var _faces = [];\n var _colours = [];\n\n allVertices.push(extruded.positions);\n\n var _colour;\n extruded.top.forEach((face, fi) => {\n _colour = [];\n\n _colour.push([colour.r, colour.g, colour.b]);\n _colour.push([colour.r, colour.g, colour.b]);\n _colour.push([colour.r, colour.g, colour.b]);\n\n _faces.push(face);\n _colours.push(_colour);\n });\n\n // Set up colours for every vertex with poor-mans AO on the sides\n extruded.sides.forEach((face, fi) => {\n _colour = [];\n\n // First face is always bottom-bottom-top\n if (fi % 2 === 0) {\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n _colour.push([topColor.r, topColor.g, topColor.b]);\n // Reverse winding for the second face\n // top-top-bottom\n } else {\n _colour.push([topColor.r, topColor.g, topColor.b]);\n _colour.push([topColor.r, topColor.g, topColor.b]);\n _colour.push([bottomColor.r, bottomColor.g, bottomColor.b]);\n }\n\n _faces.push(face);\n _colours.push(_colour);\n });\n\n // Skip bottom as there's no point rendering it\n // allFaces.push(extruded.faces);\n\n allFaces.push(_faces);\n allColours.push(_colours);\n\n facesCount += _faces.length;\n });\n\n // Output shadow canvas\n //\n // TODO: Disabled for the time-being until it can be sped up / moved to\n // a worker\n\n // var texture = new THREE.Texture(this._shadowCanvas);\n //\n // // Silky smooth images when tilted\n // texture.magFilter = THREE.LinearFilter;\n // texture.minFilter = THREE.LinearMipMapLinearFilter;\n //\n // // TODO: Set this to renderer.getMaxAnisotropy() / 4\n // texture.anisotropy = 4;\n //\n // texture.needsUpdate = true;\n //\n // var material;\n // if (!this._world._environment._skybox) {\n // material = new THREE.MeshBasicMaterial({\n // map: texture,\n // transparent: true,\n // depthWrite: false\n // });\n // } else {\n // material = new THREE.MeshStandardMaterial({\n // map: texture,\n // transparent: true,\n // depthWrite: false\n // });\n // material.roughness = 1;\n // material.metalness = 0.1;\n // material.envMap = this._world._environment._skybox.getRenderTarget();\n // }\n //\n // var geom = new THREE.PlaneBufferGeometry(this._side, this._side, 1);\n // var mesh = new THREE.Mesh(geom, material);\n //\n // mesh.castShadow = false;\n // mesh.receiveShadow = false;\n // mesh.renderOrder = 1;\n //\n // mesh.rotation.x = -90 * Math.PI / 180;\n //\n // this._mesh.add(mesh);\n\n // Skip if no faces\n //\n // Need to check way before this if there are no faces, before even doing\n // earcut triangulation.\n if (facesCount === 0) {\n this._ready = true;\n return;\n }\n\n var geometry = new THREE.BufferGeometry();\n\n // Three components per vertex per face (3 x 3 = 9)\n var vertices = new Float32Array(facesCount * 9);\n var normals = new Float32Array(facesCount * 9);\n var colours = new Float32Array(facesCount * 9);\n\n var pA = new THREE.Vector3();\n var pB = new THREE.Vector3();\n var pC = new THREE.Vector3();\n\n var cb = new THREE.Vector3();\n var ab = new THREE.Vector3();\n\n var dim = 2;\n\n var index;\n var _faces;\n var _vertices;\n var _colour;\n var lastIndex = 0;\n for (var i = 0; i < allFaces.length; i++) {\n _faces = allFaces[i];\n _vertices = allVertices[i];\n _colour = allColours[i];\n\n for (var j = 0; j < _faces.length; j++) {\n // Array of vertex indexes for the face\n index = _faces[j][0];\n\n var ax = _vertices[index][0] + offset.x;\n var ay = _vertices[index][1];\n var az = _vertices[index][2] + offset.y;\n\n var c1 = _colour[j][0];\n\n index = _faces[j][1];\n\n var bx = _vertices[index][0] + offset.x;\n var by = _vertices[index][1];\n var bz = _vertices[index][2] + offset.y;\n\n var c2 = _colour[j][1];\n\n index = _faces[j][2];\n\n var cx = _vertices[index][0] + offset.x;\n var cy = _vertices[index][1];\n var cz = _vertices[index][2] + offset.y;\n\n var c3 = _colour[j][2];\n\n // Flat face normals\n // From: http://threejs.org/examples/webgl_buffergeometry.html\n pA.set(ax, ay, az);\n pB.set(bx, by, bz);\n pC.set(cx, cy, cz);\n\n cb.subVectors(pC, pB);\n ab.subVectors(pA, pB);\n cb.cross(ab);\n\n cb.normalize();\n\n var nx = cb.x;\n var ny = cb.y;\n var nz = cb.z;\n\n vertices[lastIndex * 9 + 0] = ax;\n vertices[lastIndex * 9 + 1] = ay;\n vertices[lastIndex * 9 + 2] = az;\n\n normals[lastIndex * 9 + 0] = nx;\n normals[lastIndex * 9 + 1] = ny;\n normals[lastIndex * 9 + 2] = nz;\n\n colours[lastIndex * 9 + 0] = c1[0];\n colours[lastIndex * 9 + 1] = c1[1];\n colours[lastIndex * 9 + 2] = c1[2];\n\n vertices[lastIndex * 9 + 3] = bx;\n vertices[lastIndex * 9 + 4] = by;\n vertices[lastIndex * 9 + 5] = bz;\n\n normals[lastIndex * 9 + 3] = nx;\n normals[lastIndex * 9 + 4] = ny;\n normals[lastIndex * 9 + 5] = nz;\n\n colours[lastIndex * 9 + 3] = c2[0];\n colours[lastIndex * 9 + 4] = c2[1];\n colours[lastIndex * 9 + 5] = c2[2];\n\n vertices[lastIndex * 9 + 6] = cx;\n vertices[lastIndex * 9 + 7] = cy;\n vertices[lastIndex * 9 + 8] = cz;\n\n normals[lastIndex * 9 + 6] = nx;\n normals[lastIndex * 9 + 7] = ny;\n normals[lastIndex * 9 + 8] = nz;\n\n colours[lastIndex * 9 + 6] = c3[0];\n colours[lastIndex * 9 + 7] = c3[1];\n colours[lastIndex * 9 + 8] = c3[2];\n\n lastIndex++;\n }\n }\n\n // itemSize = 3 because there are 3 values (components) per vertex\n geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));\n geometry.addAttribute('normal', new THREE.BufferAttribute(normals, 3));\n geometry.addAttribute('color', new THREE.BufferAttribute(colours, 3));\n\n geometry.computeBoundingBox();\n\n var material;\n if (!this._world._environment._skybox) {\n material = new THREE.MeshPhongMaterial({\n vertexColors: THREE.VertexColors,\n side: THREE.BackSide\n });\n } else {\n material = new THREE.MeshStandardMaterial({\n vertexColors: THREE.VertexColors,\n side: THREE.BackSide\n });\n material.roughness = 1;\n material.metalness = 0.1;\n material.envMapIntensity = 3;\n material.envMap = this._world._environment._skybox.getRenderTarget();\n }\n\n var mesh = new THREE.Mesh(geometry, material);\n\n mesh.castShadow = true;\n mesh.receiveShadow = true;\n\n // This is only useful for flat objects\n // mesh.renderOrder = 1;\n\n this._mesh.add(mesh);\n\n this._ready = true;\n console.timeEnd(this._tile);\n console.log(`${this._tile}: ${features.length} features`);\n }\n\n _toEarcut(data) {\n var dim = data[0][0].length;\n var result = {vertices: [], holes: [], dimensions: dim};\n var holeIndex = 0;\n\n for (var i = 0; i < data.length; i++) {\n for (var j = 0; j < data[i].length; j++) {\n for (var d = 0; d < dim; d++) {\n result.vertices.push(data[i][j][d]);\n }\n }\n if (i > 0) {\n holeIndex += data[i - 1].length;\n result.holes.push(holeIndex);\n }\n }\n\n return result;\n }\n\n _triangulate(contour, holes, dim) {\n // console.time('earcut');\n\n var faces = earcut(contour, holes, dim);\n var result = [];\n\n for (i = 0, il = faces.length; i < il; i += 3) {\n result.push(faces.slice(i, i + 3));\n }\n\n // console.timeEnd('earcut');\n\n return result;\n }\n\n _abortRequest() {\n if (!this._request) {\n return;\n }\n\n this._request.abort();\n }\n}\n\n// Initialise without requiring new keyword\nexport default function(quadcode, path, layer, options) {\n return new TopoJSONTile(quadcode, path, layer, options);\n};\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/layer/tile/TopoJSONTile.js\n **/","/*!\n * Reqwest! A general purpose XHR connection manager\n * license MIT (c) Dustin Diaz 2015\n * https://github.com/ded/reqwest\n */\n\n!function (name, context, definition) {\n if (typeof module != 'undefined' && module.exports) module.exports = definition()\n else if (typeof define == 'function' && define.amd) define(definition)\n else context[name] = definition()\n}('reqwest', this, function () {\n\n var context = this\n\n if ('window' in context) {\n var doc = document\n , byTag = 'getElementsByTagName'\n , head = doc[byTag]('head')[0]\n } else {\n var XHR2\n try {\n XHR2 = require('xhr2')\n } catch (ex) {\n throw new Error('Peer dependency `xhr2` required! Please npm install xhr2')\n }\n }\n\n\n var httpsRe = /^http/\n , protocolRe = /(^\\w+):\\/\\//\n , twoHundo = /^(20\\d|1223)$/ //http://stackoverflow.com/questions/10046972/msie-returns-status-code-of-1223-for-ajax-request\n , readyState = 'readyState'\n , contentType = 'Content-Type'\n , requestedWith = 'X-Requested-With'\n , uniqid = 0\n , callbackPrefix = 'reqwest_' + (+new Date())\n , lastValue // data stored by the most recent JSONP callback\n , xmlHttpRequest = 'XMLHttpRequest'\n , xDomainRequest = 'XDomainRequest'\n , noop = function () {}\n\n , isArray = typeof Array.isArray == 'function'\n ? Array.isArray\n : function (a) {\n return a instanceof Array\n }\n\n , defaultHeaders = {\n 'contentType': 'application/x-www-form-urlencoded'\n , 'requestedWith': xmlHttpRequest\n , 'accept': {\n '*': 'text/javascript, text/html, application/xml, text/xml, */*'\n , 'xml': 'application/xml, text/xml'\n , 'html': 'text/html'\n , 'text': 'text/plain'\n , 'json': 'application/json, text/javascript'\n , 'js': 'application/javascript, text/javascript'\n }\n }\n\n , xhr = function(o) {\n // is it x-domain\n if (o['crossOrigin'] === true) {\n var xhr = context[xmlHttpRequest] ? new XMLHttpRequest() : null\n if (xhr && 'withCredentials' in xhr) {\n return xhr\n } else if (context[xDomainRequest]) {\n return new XDomainRequest()\n } else {\n throw new Error('Browser does not support cross-origin requests')\n }\n } else if (context[xmlHttpRequest]) {\n return new XMLHttpRequest()\n } else if (XHR2) {\n return new XHR2()\n } else {\n return new ActiveXObject('Microsoft.XMLHTTP')\n }\n }\n , globalSetupOptions = {\n dataFilter: function (data) {\n return data\n }\n }\n\n function succeed(r) {\n var protocol = protocolRe.exec(r.url)\n protocol = (protocol && protocol[1]) || context.location.protocol\n return httpsRe.test(protocol) ? twoHundo.test(r.request.status) : !!r.request.response\n }\n\n function handleReadyState(r, success, error) {\n return function () {\n // use _aborted to mitigate against IE err c00c023f\n // (can't read props on aborted request objects)\n if (r._aborted) return error(r.request)\n if (r._timedOut) return error(r.request, 'Request is aborted: timeout')\n if (r.request && r.request[readyState] == 4) {\n r.request.onreadystatechange = noop\n if (succeed(r)) success(r.request)\n else\n error(r.request)\n }\n }\n }\n\n function setHeaders(http, o) {\n var headers = o['headers'] || {}\n , h\n\n headers['Accept'] = headers['Accept']\n || defaultHeaders['accept'][o['type']]\n || defaultHeaders['accept']['*']\n\n var isAFormData = typeof FormData !== 'undefined' && (o['data'] instanceof FormData);\n // breaks cross-origin requests with legacy browsers\n if (!o['crossOrigin'] && !headers[requestedWith]) headers[requestedWith] = defaultHeaders['requestedWith']\n if (!headers[contentType] && !isAFormData) headers[contentType] = o['contentType'] || defaultHeaders['contentType']\n for (h in headers)\n headers.hasOwnProperty(h) && 'setRequestHeader' in http && http.setRequestHeader(h, headers[h])\n }\n\n function setCredentials(http, o) {\n if (typeof o['withCredentials'] !== 'undefined' && typeof http.withCredentials !== 'undefined') {\n http.withCredentials = !!o['withCredentials']\n }\n }\n\n function generalCallback(data) {\n lastValue = data\n }\n\n function urlappend (url, s) {\n return url + (/\\?/.test(url) ? '&' : '?') + s\n }\n\n function handleJsonp(o, fn, err, url) {\n var reqId = uniqid++\n , cbkey = o['jsonpCallback'] || 'callback' // the 'callback' key\n , cbval = o['jsonpCallbackName'] || reqwest.getcallbackPrefix(reqId)\n , cbreg = new RegExp('((^|\\\\?|&)' + cbkey + ')=([^&]+)')\n , match = url.match(cbreg)\n , script = doc.createElement('script')\n , loaded = 0\n , isIE10 = navigator.userAgent.indexOf('MSIE 10.0') !== -1\n\n if (match) {\n if (match[3] === '?') {\n url = url.replace(cbreg, '$1=' + cbval) // wildcard callback func name\n } else {\n cbval = match[3] // provided callback func name\n }\n } else {\n url = urlappend(url, cbkey + '=' + cbval) // no callback details, add 'em\n }\n\n context[cbval] = generalCallback\n\n script.type = 'text/javascript'\n script.src = url\n script.async = true\n if (typeof script.onreadystatechange !== 'undefined' && !isIE10) {\n // need this for IE due to out-of-order onreadystatechange(), binding script\n // execution to an event listener gives us control over when the script\n // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n script.htmlFor = script.id = '_reqwest_' + reqId\n }\n\n script.onload = script.onreadystatechange = function () {\n if ((script[readyState] && script[readyState] !== 'complete' && script[readyState] !== 'loaded') || loaded) {\n return false\n }\n script.onload = script.onreadystatechange = null\n script.onclick && script.onclick()\n // Call the user callback with the last value stored and clean up values and scripts.\n fn(lastValue)\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n\n // Add the script to the DOM head\n head.appendChild(script)\n\n // Enable JSONP timeout\n return {\n abort: function () {\n script.onload = script.onreadystatechange = null\n err({}, 'Request is aborted: timeout', {})\n lastValue = undefined\n head.removeChild(script)\n loaded = 1\n }\n }\n }\n\n function getRequest(fn, err) {\n var o = this.o\n , method = (o['method'] || 'GET').toUpperCase()\n , url = typeof o === 'string' ? o : o['url']\n // convert non-string objects to query-string form unless o['processData'] is false\n , data = (o['processData'] !== false && o['data'] && typeof o['data'] !== 'string')\n ? reqwest.toQueryString(o['data'])\n : (o['data'] || null)\n , http\n , sendWait = false\n\n // if we're working on a GET request and we have data then we should append\n // query string to end of URL and not post data\n if ((o['type'] == 'jsonp' || method == 'GET') && data) {\n url = urlappend(url, data)\n data = null\n }\n\n if (o['type'] == 'jsonp') return handleJsonp(o, fn, err, url)\n\n // get the xhr from the factory if passed\n // if the factory returns null, fall-back to ours\n http = (o.xhr && o.xhr(o)) || xhr(o)\n\n http.open(method, url, o['async'] === false ? false : true)\n setHeaders(http, o)\n setCredentials(http, o)\n if (context[xDomainRequest] && http instanceof context[xDomainRequest]) {\n http.onload = fn\n http.onerror = err\n // NOTE: see\n // http://social.msdn.microsoft.com/Forums/en-US/iewebdevelopment/thread/30ef3add-767c-4436-b8a9-f1ca19b4812e\n http.onprogress = function() {}\n sendWait = true\n } else {\n http.onreadystatechange = handleReadyState(this, fn, err)\n }\n o['before'] && o['before'](http)\n if (sendWait) {\n setTimeout(function () {\n http.send(data)\n }, 200)\n } else {\n http.send(data)\n }\n return http\n }\n\n function Reqwest(o, fn) {\n this.o = o\n this.fn = fn\n\n init.apply(this, arguments)\n }\n\n function setType(header) {\n // json, javascript, text/plain, text/html, xml\n if (header === null) return undefined; //In case of no content-type.\n if (header.match('json')) return 'json'\n if (header.match('javascript')) return 'js'\n if (header.match('text')) return 'html'\n if (header.match('xml')) return 'xml'\n }\n\n function init(o, fn) {\n\n this.url = typeof o == 'string' ? o : o['url']\n this.timeout = null\n\n // whether request has been fulfilled for purpose\n // of tracking the Promises\n this._fulfilled = false\n // success handlers\n this._successHandler = function(){}\n this._fulfillmentHandlers = []\n // error handlers\n this._errorHandlers = []\n // complete (both success and fail) handlers\n this._completeHandlers = []\n this._erred = false\n this._responseArgs = {}\n\n var self = this\n\n fn = fn || function () {}\n\n if (o['timeout']) {\n this.timeout = setTimeout(function () {\n timedOut()\n }, o['timeout'])\n }\n\n if (o['success']) {\n this._successHandler = function () {\n o['success'].apply(o, arguments)\n }\n }\n\n if (o['error']) {\n this._errorHandlers.push(function () {\n o['error'].apply(o, arguments)\n })\n }\n\n if (o['complete']) {\n this._completeHandlers.push(function () {\n o['complete'].apply(o, arguments)\n })\n }\n\n function complete (resp) {\n o['timeout'] && clearTimeout(self.timeout)\n self.timeout = null\n while (self._completeHandlers.length > 0) {\n self._completeHandlers.shift()(resp)\n }\n }\n\n function success (resp) {\n var type = o['type'] || resp && setType(resp.getResponseHeader('Content-Type')) // resp can be undefined in IE\n resp = (type !== 'jsonp') ? self.request : resp\n // use global data filter on response text\n var filteredResponse = globalSetupOptions.dataFilter(resp.responseText, type)\n , r = filteredResponse\n try {\n resp.responseText = r\n } catch (e) {\n // can't assign this in IE<=8, just ignore\n }\n if (r) {\n switch (type) {\n case 'json':\n try {\n resp = context.JSON ? context.JSON.parse(r) : eval('(' + r + ')')\n } catch (err) {\n return error(resp, 'Could not parse JSON in response', err)\n }\n break\n case 'js':\n resp = eval(r)\n break\n case 'html':\n resp = r\n break\n case 'xml':\n resp = resp.responseXML\n && resp.responseXML.parseError // IE trololo\n && resp.responseXML.parseError.errorCode\n && resp.responseXML.parseError.reason\n ? null\n : resp.responseXML\n break\n }\n }\n\n self._responseArgs.resp = resp\n self._fulfilled = true\n fn(resp)\n self._successHandler(resp)\n while (self._fulfillmentHandlers.length > 0) {\n resp = self._fulfillmentHandlers.shift()(resp)\n }\n\n complete(resp)\n }\n\n function timedOut() {\n self._timedOut = true\n self.request.abort()\n }\n\n function error(resp, msg, t) {\n resp = self.request\n self._responseArgs.resp = resp\n self._responseArgs.msg = msg\n self._responseArgs.t = t\n self._erred = true\n while (self._errorHandlers.length > 0) {\n self._errorHandlers.shift()(resp, msg, t)\n }\n complete(resp)\n }\n\n this.request = getRequest.call(this, success, error)\n }\n\n Reqwest.prototype = {\n abort: function () {\n this._aborted = true\n this.request.abort()\n }\n\n , retry: function () {\n init.call(this, this.o, this.fn)\n }\n\n /**\n * Small deviation from the Promises A CommonJs specification\n * http://wiki.commonjs.org/wiki/Promises/A\n */\n\n /**\n * `then` will execute upon successful requests\n */\n , then: function (success, fail) {\n success = success || function () {}\n fail = fail || function () {}\n if (this._fulfilled) {\n this._responseArgs.resp = success(this._responseArgs.resp)\n } else if (this._erred) {\n fail(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._fulfillmentHandlers.push(success)\n this._errorHandlers.push(fail)\n }\n return this\n }\n\n /**\n * `always` will execute whether the request succeeds or fails\n */\n , always: function (fn) {\n if (this._fulfilled || this._erred) {\n fn(this._responseArgs.resp)\n } else {\n this._completeHandlers.push(fn)\n }\n return this\n }\n\n /**\n * `fail` will execute when the request fails\n */\n , fail: function (fn) {\n if (this._erred) {\n fn(this._responseArgs.resp, this._responseArgs.msg, this._responseArgs.t)\n } else {\n this._errorHandlers.push(fn)\n }\n return this\n }\n , 'catch': function (fn) {\n return this.fail(fn)\n }\n }\n\n function reqwest(o, fn) {\n return new Reqwest(o, fn)\n }\n\n // normalize newline variants according to spec -> CRLF\n function normalize(s) {\n return s ? s.replace(/\\r?\\n/g, '\\r\\n') : ''\n }\n\n function serial(el, cb) {\n var n = el.name\n , t = el.tagName.toLowerCase()\n , optCb = function (o) {\n // IE gives value=\"\" even where there is no value attribute\n // 'specified' ref: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-862529273\n if (o && !o['disabled'])\n cb(n, normalize(o['attributes']['value'] && o['attributes']['value']['specified'] ? o['value'] : o['text']))\n }\n , ch, ra, val, i\n\n // don't serialize elements that are disabled or without a name\n if (el.disabled || !n) return\n\n switch (t) {\n case 'input':\n if (!/reset|button|image|file/i.test(el.type)) {\n ch = /checkbox/i.test(el.type)\n ra = /radio/i.test(el.type)\n val = el.value\n // WebKit gives us \"\" instead of \"on\" if a checkbox has no value, so correct it here\n ;(!(ch || ra) || el.checked) && cb(n, normalize(ch && val === '' ? 'on' : val))\n }\n break\n case 'textarea':\n cb(n, normalize(el.value))\n break\n case 'select':\n if (el.type.toLowerCase() === 'select-one') {\n optCb(el.selectedIndex >= 0 ? el.options[el.selectedIndex] : null)\n } else {\n for (i = 0; el.length && i < el.length; i++) {\n el.options[i].selected && optCb(el.options[i])\n }\n }\n break\n }\n }\n\n // collect up all form elements found from the passed argument elements all\n // the way down to child elements; pass a '<form>' or form fields.\n // called with 'this'=callback to use for serial() on each element\n function eachFormElement() {\n var cb = this\n , e, i\n , serializeSubtags = function (e, tags) {\n var i, j, fa\n for (i = 0; i < tags.length; i++) {\n fa = e[byTag](tags[i])\n for (j = 0; j < fa.length; j++) serial(fa[j], cb)\n }\n }\n\n for (i = 0; i < arguments.length; i++) {\n e = arguments[i]\n if (/input|select|textarea/i.test(e.tagName)) serial(e, cb)\n serializeSubtags(e, [ 'input', 'select', 'textarea' ])\n }\n }\n\n // standard query string style serialization\n function serializeQueryString() {\n return reqwest.toQueryString(reqwest.serializeArray.apply(null, arguments))\n }\n\n // { 'name': 'value', ... } style serialization\n function serializeHash() {\n var hash = {}\n eachFormElement.apply(function (name, value) {\n if (name in hash) {\n hash[name] && !isArray(hash[name]) && (hash[name] = [hash[name]])\n hash[name].push(value)\n } else hash[name] = value\n }, arguments)\n return hash\n }\n\n // [ { name: 'name', value: 'value' }, ... ] style serialization\n reqwest.serializeArray = function () {\n var arr = []\n eachFormElement.apply(function (name, value) {\n arr.push({name: name, value: value})\n }, arguments)\n return arr\n }\n\n reqwest.serialize = function () {\n if (arguments.length === 0) return ''\n var opt, fn\n , args = Array.prototype.slice.call(arguments, 0)\n\n opt = args.pop()\n opt && opt.nodeType && args.push(opt) && (opt = null)\n opt && (opt = opt.type)\n\n if (opt == 'map') fn = serializeHash\n else if (opt == 'array') fn = reqwest.serializeArray\n else fn = serializeQueryString\n\n return fn.apply(null, args)\n }\n\n reqwest.toQueryString = function (o, trad) {\n var prefix, i\n , traditional = trad || false\n , s = []\n , enc = encodeURIComponent\n , add = function (key, value) {\n // If value is a function, invoke it and return its value\n value = ('function' === typeof value) ? value() : (value == null ? '' : value)\n s[s.length] = enc(key) + '=' + enc(value)\n }\n // If an array was passed in, assume that it is an array of form elements.\n if (isArray(o)) {\n for (i = 0; o && i < o.length; i++) add(o[i]['name'], o[i]['value'])\n } else {\n // If traditional, encode the \"old\" way (the way 1.3.2 or older\n // did it), otherwise encode params recursively.\n for (prefix in o) {\n if (o.hasOwnProperty(prefix)) buildParams(prefix, o[prefix], traditional, add)\n }\n }\n\n // spaces should be + according to spec\n return s.join('&').replace(/%20/g, '+')\n }\n\n function buildParams(prefix, obj, traditional, add) {\n var name, i, v\n , rbracket = /\\[\\]$/\n\n if (isArray(obj)) {\n // Serialize array item.\n for (i = 0; obj && i < obj.length; i++) {\n v = obj[i]\n if (traditional || rbracket.test(prefix)) {\n // Treat each array item as a scalar.\n add(prefix, v)\n } else {\n buildParams(prefix + '[' + (typeof v === 'object' ? i : '') + ']', v, traditional, add)\n }\n }\n } else if (obj && obj.toString() === '[object Object]') {\n // Serialize object item.\n for (name in obj) {\n buildParams(prefix + '[' + name + ']', obj[name], traditional, add)\n }\n\n } else {\n // Serialize scalar item.\n add(prefix, obj)\n }\n }\n\n reqwest.getcallbackPrefix = function () {\n return callbackPrefix\n }\n\n // jQuery and Zepto compatibility, differences can be remapped here so you can call\n // .ajax.compat(options, callback)\n reqwest.compat = function (o, fn) {\n if (o) {\n o['type'] && (o['method'] = o['type']) && delete o['type']\n o['dataType'] && (o['type'] = o['dataType'])\n o['jsonpCallback'] && (o['jsonpCallbackName'] = o['jsonpCallback']) && delete o['jsonpCallback']\n o['jsonp'] && (o['jsonpCallback'] = o['jsonp'])\n }\n return new Reqwest(o, fn)\n }\n\n reqwest.ajaxSetup = function (options) {\n options = options || {}\n for (var k in options) {\n globalSetupOptions[k] = options[k]\n }\n }\n\n return reqwest\n});\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/reqwest/reqwest.js\n ** module id = 55\n ** module chunks = 0\n **/","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.topojson = {})));\n}(this, function (exports) { 'use strict';\n\n function noop() {}\n\n function absolute(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n point[0] = (x0 += point[0]) * kx + dx;\n point[1] = (y0 += point[1]) * ky + dy;\n };\n }\n\n function relative(transform) {\n if (!transform) return noop;\n var x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) x0 = y0 = 0;\n var x1 = (point[0] - dx) / kx | 0,\n y1 = (point[1] - dy) / ky | 0;\n point[0] = x1 - x0;\n point[1] = y1 - y0;\n x0 = x1;\n y0 = y1;\n };\n }\n\n function reverse(array, n) {\n var t, j = array.length, i = j - n;\n while (i < --j) t = array[i], array[i++] = array[j], array[j] = t;\n }\n\n function bisect(a, x) {\n var lo = 0, hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (a[mid] < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n function feature(topology, o) {\n return o.type === \"GeometryCollection\" ? {\n type: \"FeatureCollection\",\n features: o.geometries.map(function(o) { return feature$1(topology, o); })\n } : feature$1(topology, o);\n }\n\n function feature$1(topology, o) {\n var f = {\n type: \"Feature\",\n id: o.id,\n properties: o.properties || {},\n geometry: object(topology, o)\n };\n if (o.id == null) delete f.id;\n return f;\n }\n\n function object(topology, o) {\n var absolute$$ = absolute(topology.transform),\n arcs = topology.arcs;\n\n function arc(i, points) {\n if (points.length) points.pop();\n for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length, p; k < n; ++k) {\n points.push(p = a[k].slice());\n absolute$$(p, k);\n }\n if (i < 0) reverse(points, n);\n }\n\n function point(p) {\n p = p.slice();\n absolute$$(p, 0);\n return p;\n }\n\n function line(arcs) {\n var points = [];\n for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points);\n if (points.length < 2) points.push(points[0].slice());\n return points;\n }\n\n function ring(arcs) {\n var points = line(arcs);\n while (points.length < 4) points.push(points[0].slice());\n return points;\n }\n\n function polygon(arcs) {\n return arcs.map(ring);\n }\n\n function geometry(o) {\n var t = o.type;\n return t === \"GeometryCollection\" ? {type: t, geometries: o.geometries.map(geometry)}\n : t in geometryType ? {type: t, coordinates: geometryType[t](o)}\n : null;\n }\n\n var geometryType = {\n Point: function(o) { return point(o.coordinates); },\n MultiPoint: function(o) { return o.coordinates.map(point); },\n LineString: function(o) { return line(o.arcs); },\n MultiLineString: function(o) { return o.arcs.map(line); },\n Polygon: function(o) { return polygon(o.arcs); },\n MultiPolygon: function(o) { return o.arcs.map(polygon); }\n };\n\n return geometry(o);\n }\n\n function stitchArcs(topology, arcs) {\n var stitchedArcs = {},\n fragmentByStart = {},\n fragmentByEnd = {},\n fragments = [],\n emptyIndex = -1;\n\n // Stitch empty arcs first, since they may be subsumed by other arcs.\n arcs.forEach(function(i, j) {\n var arc = topology.arcs[i < 0 ? ~i : i], t;\n if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n }\n });\n\n arcs.forEach(function(i) {\n var e = ends(i),\n start = e[0],\n end = e[1],\n f, g;\n\n if (f = fragmentByEnd[start]) {\n delete fragmentByEnd[f.end];\n f.push(i);\n f.end = end;\n if (g = fragmentByStart[end]) {\n delete fragmentByStart[g.start];\n var fg = g === f ? f : f.concat(g);\n fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else if (f = fragmentByStart[end]) {\n delete fragmentByStart[f.start];\n f.unshift(i);\n f.start = start;\n if (g = fragmentByEnd[start]) {\n delete fragmentByEnd[g.end];\n var gf = g === f ? f : g.concat(f);\n fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else {\n f = [i];\n fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n }\n });\n\n function ends(i) {\n var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n if (topology.transform) p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; });\n else p1 = arc[arc.length - 1];\n return i < 0 ? [p1, p0] : [p0, p1];\n }\n\n function flush(fragmentByEnd, fragmentByStart) {\n for (var k in fragmentByEnd) {\n var f = fragmentByEnd[k];\n delete fragmentByStart[f.start];\n delete f.start;\n delete f.end;\n f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n fragments.push(f);\n }\n }\n\n flush(fragmentByEnd, fragmentByStart);\n flush(fragmentByStart, fragmentByEnd);\n arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) fragments.push([i]); });\n\n return fragments;\n }\n\n function mesh(topology) {\n return object(topology, meshArcs.apply(this, arguments));\n }\n\n function meshArcs(topology, o, filter) {\n var arcs = [];\n\n function arc(i) {\n var j = i < 0 ? ~i : i;\n (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n }\n\n function line(arcs) {\n arcs.forEach(arc);\n }\n\n function polygon(arcs) {\n arcs.forEach(line);\n }\n\n function geometry(o) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(geometry);\n else if (o.type in geometryType) geom = o, geometryType[o.type](o.arcs);\n }\n\n if (arguments.length > 1) {\n var geomsByArc = [],\n geom;\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs) { arcs.forEach(polygon); }\n };\n\n geometry(o);\n\n geomsByArc.forEach(arguments.length < 3\n ? function(geoms) { arcs.push(geoms[0].i); }\n : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) arcs.push(geoms[0].i); });\n } else {\n for (var i = 0, n = topology.arcs.length; i < n; ++i) arcs.push(i);\n }\n\n return {type: \"MultiLineString\", arcs: stitchArcs(topology, arcs)};\n }\n\n function triangle(triangle) {\n var a = triangle[0], b = triangle[1], c = triangle[2];\n return Math.abs((a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]));\n }\n\n function ring(ring) {\n var i = -1,\n n = ring.length,\n a,\n b = ring[n - 1],\n area = 0;\n\n while (++i < n) {\n a = b;\n b = ring[i];\n area += a[0] * b[1] - a[1] * b[0];\n }\n\n return area / 2;\n }\n\n function merge(topology) {\n return object(topology, mergeArcs.apply(this, arguments));\n }\n\n function mergeArcs(topology, objects) {\n var polygonsByArc = {},\n polygons = [],\n components = [];\n\n objects.forEach(function(o) {\n if (o.type === \"Polygon\") register(o.arcs);\n else if (o.type === \"MultiPolygon\") o.arcs.forEach(register);\n });\n\n function register(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n (polygonsByArc[arc = arc < 0 ? ~arc : arc] || (polygonsByArc[arc] = [])).push(polygon);\n });\n });\n polygons.push(polygon);\n }\n\n function exterior(ring$$) {\n return ring(object(topology, {type: \"Polygon\", arcs: [ring$$]}).coordinates[0]) > 0; // TODO allow spherical?\n }\n\n polygons.forEach(function(polygon) {\n if (!polygon._) {\n var component = [],\n neighbors = [polygon];\n polygon._ = 1;\n components.push(component);\n while (polygon = neighbors.pop()) {\n component.push(polygon);\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n polygonsByArc[arc < 0 ? ~arc : arc].forEach(function(polygon) {\n if (!polygon._) {\n polygon._ = 1;\n neighbors.push(polygon);\n }\n });\n });\n });\n }\n }\n });\n\n polygons.forEach(function(polygon) {\n delete polygon._;\n });\n\n return {\n type: \"MultiPolygon\",\n arcs: components.map(function(polygons) {\n var arcs = [], n;\n\n // Extract the exterior (unique) arcs.\n polygons.forEach(function(polygon) {\n polygon.forEach(function(ring$$) {\n ring$$.forEach(function(arc) {\n if (polygonsByArc[arc < 0 ? ~arc : arc].length < 2) {\n arcs.push(arc);\n }\n });\n });\n });\n\n // Stitch the arcs into one or more rings.\n arcs = stitchArcs(topology, arcs);\n\n // If more than one ring is returned,\n // at most one of these rings can be the exterior;\n // this exterior ring has the same winding order\n // as any exterior ring in the original polygons.\n if ((n = arcs.length) > 1) {\n var sgn = exterior(polygons[0][0]);\n for (var i = 0, t; i < n; ++i) {\n if (sgn === exterior(arcs[i])) {\n t = arcs[0], arcs[0] = arcs[i], arcs[i] = t;\n break;\n }\n }\n }\n\n return arcs;\n })\n };\n }\n\n function neighbors(objects) {\n var indexesByArc = {}, // arc index -> array of object indexes\n neighbors = objects.map(function() { return []; });\n\n function line(arcs, i) {\n arcs.forEach(function(a) {\n if (a < 0) a = ~a;\n var o = indexesByArc[a];\n if (o) o.push(i);\n else indexesByArc[a] = [i];\n });\n }\n\n function polygon(arcs, i) {\n arcs.forEach(function(arc) { line(arc, i); });\n }\n\n function geometry(o, i) {\n if (o.type === \"GeometryCollection\") o.geometries.forEach(function(o) { geometry(o, i); });\n else if (o.type in geometryType) geometryType[o.type](o.arcs, i);\n }\n\n var geometryType = {\n LineString: line,\n MultiLineString: polygon,\n Polygon: polygon,\n MultiPolygon: function(arcs, i) { arcs.forEach(function(arc) { polygon(arc, i); }); }\n };\n\n objects.forEach(geometry);\n\n for (var i in indexesByArc) {\n for (var indexes = indexesByArc[i], m = indexes.length, j = 0; j < m; ++j) {\n for (var k = j + 1; k < m; ++k) {\n var ij = indexes[j], ik = indexes[k], n;\n if ((n = neighbors[ij])[i = bisect(n, ik)] !== ik) n.splice(i, 0, ik);\n if ((n = neighbors[ik])[i = bisect(n, ij)] !== ij) n.splice(i, 0, ij);\n }\n }\n }\n\n return neighbors;\n }\n\n function compareArea(a, b) {\n return a[1][2] - b[1][2];\n }\n\n function minAreaHeap() {\n var heap = {},\n array = [],\n size = 0;\n\n heap.push = function(object) {\n up(array[object._ = size] = object, size++);\n return size;\n };\n\n heap.pop = function() {\n if (size <= 0) return;\n var removed = array[0], object;\n if (--size > 0) object = array[size], down(array[object._ = 0] = object, 0);\n return removed;\n };\n\n heap.remove = function(removed) {\n var i = removed._, object;\n if (array[i] !== removed) return; // invalid request\n if (i !== --size) object = array[size], (compareArea(object, removed) < 0 ? up : down)(array[object._ = i] = object, i);\n return i;\n };\n\n function up(object, i) {\n while (i > 0) {\n var j = ((i + 1) >> 1) - 1,\n parent = array[j];\n if (compareArea(object, parent) >= 0) break;\n array[parent._ = i] = parent;\n array[object._ = i = j] = object;\n }\n }\n\n function down(object, i) {\n while (true) {\n var r = (i + 1) << 1,\n l = r - 1,\n j = i,\n child = array[j];\n if (l < size && compareArea(array[l], child) < 0) child = array[j = l];\n if (r < size && compareArea(array[r], child) < 0) child = array[j = r];\n if (j === i) break;\n array[child._ = i] = child;\n array[object._ = i = j] = object;\n }\n }\n\n return heap;\n }\n\n function presimplify(topology, triangleArea) {\n var absolute$$ = absolute(topology.transform),\n relative$$ = relative(topology.transform),\n heap = minAreaHeap();\n\n if (!triangleArea) triangleArea = triangle;\n\n topology.arcs.forEach(function(arc) {\n var triangles = [],\n maxArea = 0,\n triangle,\n i,\n n,\n p;\n\n // To store each point’s effective area, we create a new array rather than\n // extending the passed-in point to workaround a Chrome/V8 bug (getting\n // stuck in smi mode). For midpoints, the initial effective area of\n // Infinity will be computed in the next step.\n for (i = 0, n = arc.length; i < n; ++i) {\n p = arc[i];\n absolute$$(arc[i] = [p[0], p[1], Infinity], i);\n }\n\n for (i = 1, n = arc.length - 1; i < n; ++i) {\n triangle = arc.slice(i - 1, i + 2);\n triangle[1][2] = triangleArea(triangle);\n triangles.push(triangle);\n heap.push(triangle);\n }\n\n for (i = 0, n = triangles.length; i < n; ++i) {\n triangle = triangles[i];\n triangle.previous = triangles[i - 1];\n triangle.next = triangles[i + 1];\n }\n\n while (triangle = heap.pop()) {\n var previous = triangle.previous,\n next = triangle.next;\n\n // If the area of the current point is less than that of the previous point\n // to be eliminated, use the latter's area instead. This ensures that the\n // current point cannot be eliminated without eliminating previously-\n // eliminated points.\n if (triangle[1][2] < maxArea) triangle[1][2] = maxArea;\n else maxArea = triangle[1][2];\n\n if (previous) {\n previous.next = next;\n previous[2] = triangle[2];\n update(previous);\n }\n\n if (next) {\n next.previous = previous;\n next[0] = triangle[0];\n update(next);\n }\n }\n\n arc.forEach(relative$$);\n });\n\n function update(triangle) {\n heap.remove(triangle);\n triangle[1][2] = triangleArea(triangle);\n heap.push(triangle);\n }\n\n return topology;\n }\n\n var version = \"1.6.24\";\n\n exports.version = version;\n exports.mesh = mesh;\n exports.meshArcs = meshArcs;\n exports.merge = merge;\n exports.mergeArcs = mergeArcs;\n exports.feature = feature;\n exports.neighbors = neighbors;\n exports.presimplify = presimplify;\n\n}));\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/topojson/build/topojson.js\n ** module id = 57\n ** module chunks = 0\n **/","'use strict';\n\nmodule.exports = earcut;\n\nfunction earcut(data, holeIndices, dim) {\n\n dim = dim || 2;\n\n var hasHoles = holeIndices && holeIndices.length,\n outerLen = hasHoles ? holeIndices[0] * dim : data.length,\n outerNode = linkedList(data, 0, outerLen, dim, true),\n triangles = [];\n\n if (!outerNode) return triangles;\n\n var minX, minY, maxX, maxY, x, y, size;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = maxX = data[0];\n minY = maxY = data[1];\n\n for (var i = dim; i < outerLen; i += dim) {\n x = data[i];\n y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and size are later used to transform coords into integers for z-order calculation\n size = Math.max(maxX - minX, maxY - minY);\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, size);\n\n return triangles;\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 var sum = 0,\n i, j, last;\n\n // calculate original winding order of a polygon ring\n for (i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n\n // link points into circular doubly-linked list in the specified winding order\n if (clockwise === (sum > 0)) {\n for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);\n } else {\n for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n var p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) return null;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, size, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && size) indexCurve(ear, minX, minY, size);\n\n var stop = ear,\n prev, next;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n prev = ear.prev;\n next = ear.next;\n\n if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) {\n // cut off the triangle\n triangles.push(prev.i / dim);\n triangles.push(ear.i / dim);\n triangles.push(next.i / dim);\n\n removeNode(ear);\n\n // skipping the next vertice leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(ear, triangles, dim);\n earcutLinked(ear, triangles, dim, minX, minY, size, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, size);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n var p = ear.next.next;\n\n while (p !== ear.prev) {\n if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, size) {\n var a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // triangle bbox; min & max are calculated like this for speed\n var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),\n minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),\n maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),\n maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);\n\n // z-order range for the current triangle bbox;\n var minZ = zOrder(minTX, minTY, minX, minY, size),\n maxZ = zOrder(maxTX, maxTY, minX, minY, size);\n\n // first look for points inside the triangle in increasing z-order\n var p = ear.nextZ;\n\n while (p && p.z <= maxZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.nextZ;\n }\n\n // then look for points in decreasing z-order\n p = ear.prevZ;\n\n while (p && p.z >= minZ) {\n if (p !== ear.prev && p !== ear.next &&\n pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles, dim) {\n var p = start;\n do {\n var a = p.prev,\n b = p.next.next;\n\n // a self-intersection where edge (v[i-1],v[i]) intersects (v[i+1],v[i+2])\n if (intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i / dim);\n triangles.push(p.i / dim);\n triangles.push(b.i / dim);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return p;\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, size) {\n // look for a valid diagonal that divides the polygon into two\n var a = start;\n do {\n var b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n var c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, size);\n earcutLinked(c, triangles, dim, minX, minY, size);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n var queue = [],\n i, len, start, end, list;\n\n for (i = 0, len = holeIndices.length; i < len; i++) {\n start = holeIndices[i] * dim;\n end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareX);\n\n // process holes from left to right\n for (i = 0; i < queue.length; i++) {\n eliminateHole(queue[i], outerNode);\n outerNode = filterPoints(outerNode, outerNode.next);\n }\n\n return outerNode;\n}\n\nfunction compareX(a, b) {\n return a.x - b.x;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole(hole, outerNode) {\n outerNode = findHoleBridge(hole, outerNode);\n if (outerNode) {\n var b = splitPolygon(outerNode, hole);\n filterPoints(b, b.next);\n }\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n var p = outerNode,\n hx = hole.x,\n hy = hole.y,\n qx = -Infinity,\n m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n do {\n if (hy <= p.y && hy >= p.next.y) {\n var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n if (hole.x === m.x) return m.prev; // hole touches outer segment; pick lower endpoint\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n var stop = m,\n tanMin = Infinity,\n tan;\n\n p = m.next;\n\n while (p !== stop) {\n if (hx >= p.x && p.x >= m.x &&\n pointInTriangle(hy < m.y ? hx : qx, hy, m.x, m.y, hy < m.y ? qx : hx, hy, p.x, p.y)) {\n\n tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n }\n\n return m;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, size) {\n var p = start;\n do {\n if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\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 var i, p, q, e, tail, numMerges, pSize, qSize,\n inSize = 1;\n\n do {\n p = list;\n list = null;\n tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n q = p;\n pSize = 0;\n for (i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n\n qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize === 0) {\n e = q;\n q = q.nextZ;\n qSize--;\n } else if (qSize === 0 || !q) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else if (p.z <= q.z) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and size of the data bounding box\nfunction zOrder(x, y, minX, minY, size) {\n // coords are transformed into non-negative 15-bit integer range\n x = 32767 * (x - minX) / size;\n y = 32767 * (y - minY) / size;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n var p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&\n (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&\n (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return equals(a, b) || a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&\n locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&\n area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n var p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n var p = a,\n inside = false,\n px = (a.x + b.x) / 2,\n py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\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 var a2 = new Node(a.i, a.x, a.y),\n b2 = new Node(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\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 var p = new Node(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction Node(i, x, y) {\n // vertice index in coordinates array\n this.i = i;\n\n // vertex coordinates\n this.x = x;\n this.y = y;\n\n // previous and next vertice nodes in a polygon ring\n this.prev = null;\n this.next = null;\n\n // z-order curve value\n this.z = null;\n\n // previous and next nodes in z-order\n this.prevZ = null;\n this.nextZ = null;\n\n // indicates whether this is a steiner point\n this.steiner = false;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/earcut/src/earcut.js\n ** module id = 58\n ** module chunks = 0\n **/","/*\n * Extrude a polygon given its vertices and triangulated faces\n *\n * Based on:\n * https://github.com/freeman-lab/extrude\n */\n\nimport extend from 'lodash.assign';\n\nvar extrudePolygon = function(points, faces, _options) {\n var defaults = {\n top: 1,\n bottom: 0,\n closed: true\n };\n\n var options = extend(defaults, _options);\n\n var n = points.length;\n var positions;\n var cells;\n var topCells;\n var bottomCells;\n var sideCells;\n\n // If bottom and top values are identical then return the flat shape\n (options.top === options.bottom) ? flat() : full();\n\n function flat() {\n positions = points.map(function(p) { return [p[0], options.top, p[1]]; });\n cells = faces;\n topCells = faces;\n }\n\n function full() {\n positions = [];\n points.forEach(function(p) { positions.push([p[0], options.top, p[1]]); });\n points.forEach(function(p) { positions.push([p[0], options.bottom, p[1]]); });\n\n cells = [];\n for (var i = 0; i < n; i++) {\n if (i === (n - 1)) {\n cells.push([i + n, n, i]);\n cells.push([0, i, n]);\n } else {\n cells.push([i + n, i + n + 1, i]);\n cells.push([i + 1, i, i + n + 1]);\n }\n }\n\n sideCells = [].concat(cells);\n\n if (options.closed) {\n var top = faces;\n var bottom = top.map(function(p) { return p.map(function(v) { return v + n; }); });\n bottom = bottom.map(function(p) { return [p[0], p[2], p[1]]; });\n cells = cells.concat(top).concat(bottom);\n\n topCells = top;\n bottomCells = bottom;\n }\n }\n\n return {\n positions: positions,\n faces: cells,\n top: topCells,\n bottom: bottomCells,\n sides: sideCells\n };\n};\n\nexport default extrudePolygon;\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/util/extrudePolygon.js\n **/","var GreinerHormann = require('greiner-hormann');\nvar Edge = require('./edge');\nvar intersection = require('./intersection');\n\n\"use strict\";\n\nvar min = Math.min,\n max = Math.max,\n atan2 = Math.atan2;\n\n/**\n * Offset builder\n *\n * @param {Array.<Object>=} vertices\n * @param {Number=} arcSegments\n * @constructor\n */\nfunction Offset(vertices, arcSegments) {\n\n /**\n * @type {Array.<Object>}\n */\n this.vertices = null;\n\n /**\n * @type {Array.<Edge>}\n */\n this.edges = null;\n\n /**\n * @type {Boolean}\n */\n this._closed = false;\n\n if (vertices) {\n this.data(vertices);\n }\n\n /**\n * Segments in edge bounding arches\n * @type {Number}\n */\n this._arcSegments = arcSegments || 5;\n};\n\n/**\n * Change data set\n * @param {Array.<Array>} vertices\n * @return {Offset}\n */\nOffset.prototype.data = function(vertices) {\n vertices = this.validate(vertices);\n\n var edges = [];\n for (var i = 0, len = vertices.length; i < len; i++) {\n edges.push(new Edge(vertices[i], vertices[(i + 1) % len]));\n }\n\n this.vertices = vertices;\n this.edges = edges;\n return this;\n};\n\n/**\n * @param {Number} arcSegments\n * @return {Offset}\n */\nOffset.prototype.arcSegments = function(arcSegments) {\n this._arcSegments = arcSegments;\n return this;\n};\n\n/**\n * Validates if the first and last points repeat\n * TODO: check CCW\n *\n * @param {Array.<Object>} vertices\n */\nOffset.prototype.validate = function(vertices) {\n var len = vertices.length;\n if (vertices[0][0] === vertices[len - 1][0] &&\n vertices[0][1] === vertices[len - 1][1]) {\n vertices = vertices.slice(0, len - 1);\n this._closed = true;\n }\n return vertices;\n};\n\n/**\n * Creates arch between two edges\n *\n * @param {Array.<Object>} vertices\n * @param {Object} center\n * @param {Number} radius\n * @param {Object} startVertex\n * @param {Object} endVertex\n * @param {Number} segments\n * @param {Boolean} outwards\n */\nOffset.prototype.createArc = function(vertices, center, radius, startVertex,\n endVertex, segments, outwards) {\n\n var PI2 = Math.PI * 2,\n startAngle = atan2(startVertex[1] - center[1], startVertex[0] - center[0]),\n endAngle = atan2(endVertex[1] - center[1], endVertex[0] - center[0]);\n\n // odd number please\n if (segments % 2 === 0) {\n segments -= 1;\n }\n\n if (startAngle < 0) {\n startAngle += PI2;\n }\n\n if (endAngle < 0) {\n endAngle += PI2;\n }\n\n var angle = ((startAngle > endAngle) ?\n (startAngle - endAngle) :\n (startAngle + PI2 - endAngle)),\n segmentAngle = ((outwards) ? -angle : PI2 - angle) / segments;\n\n vertices.push(startVertex);\n for (var i = 1; i < segments; ++i) {\n angle = startAngle + segmentAngle * i;\n vertices.push([\n center[0] + Math.cos(angle) * radius,\n center[1] + Math.sin(angle) * radius\n ]);\n }\n vertices.push(endVertex);\n};\n\n/**\n * Create padding polygon\n *\n * @param {Number} distance\n * @return {Array.<Number>}\n */\nOffset.prototype.padding = function(dist) {\n var offsetEdges = [],\n vertices = [],\n i, len, union;\n\n for (i = 0, len = this.edges.length; i < len; i++) {\n var edge = this.edges[i],\n dx = edge._outNormal[0] * dist,\n dy = edge._outNormal[1] * dist;\n offsetEdges.push(edge.offset(dx, dy));\n }\n\n for (i = 0, len = offsetEdges.length; i < len; i++) {\n var thisEdge = offsetEdges[i],\n prevEdge = offsetEdges[(i + len - 1) % len],\n vertex = intersection(\n prevEdge.current,\n prevEdge.next,\n thisEdge.current,\n thisEdge.next);\n\n if (vertex)\n vertices.push(vertex);\n else {\n this.createArc(\n vertices,\n this.edges[i].current,\n dist,\n prevEdge.next,\n thisEdge.current,\n this._arcSegments,\n false);\n }\n }\n union = GreinerHormann.union(vertices, vertices);\n vertices = union ? union[0] : vertices;\n\n vertices = this.ensureLastPoint(vertices);\n return vertices;\n};\n\n/**\n * Creates margin polygon\n * @param {Number} dist\n * @return {Array.<Object>}\n */\nOffset.prototype.margin = function(dist) {\n var offsetEdges = [],\n vertices = [],\n i, len, union;\n for (i = 0, len = this.edges.length; i < len; i++) {\n var edge = this.edges[i],\n dx = edge._inNormal[0] * dist,\n dy = edge._inNormal[1] * dist;\n\n offsetEdges.push(edge.offset(dx, dy));\n }\n\n for (i = 0, len = offsetEdges.length; i < len; i++) {\n var thisEdge = offsetEdges[i],\n prevEdge = offsetEdges[(i + len - 1) % len],\n vertex = intersection(\n prevEdge.current,\n prevEdge.next,\n thisEdge.current,\n thisEdge.next\n );\n\n if (vertex) {\n vertices.push(vertex);\n } else {\n this.createArc(\n vertices,\n this.edges[i].current,\n dist,\n prevEdge.next,\n thisEdge.current,\n this._arcSegments,\n true\n );\n }\n }\n\n union = GreinerHormann.union(vertices, vertices);\n if (union) {\n union = union[0];\n // that's the toll\n vertices = union.slice(0, union.length / 2);\n }\n\n vertices = this.ensureLastPoint(vertices);\n return vertices;\n};\n\n/**\n * @param {Array.<Object>} vertices\n * @return {Array.<Object>}\n */\nOffset.prototype.ensureLastPoint = function(vertices) {\n if (this._closed) {\n vertices.push([\n vertices[0][0],\n vertices[0][1]\n ]);\n }\n return vertices;\n};\n\n/**\n * Decides by the sign if it's a padding or a margin\n *\n * @param {Number} dist\n * @return {Array.<Object>}\n */\nOffset.prototype.offset = function(dist) {\n return dist === 0 ?\n this.vertices :\n (dist > 0 ? this.margin(dist) : this.padding(-dist));\n};\n\nmodule.exports = Offset;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/src/offset.js\n ** module id = 60\n ** module chunks = 0\n **/","var clip = require('./clip');\n\nmodule.exports = {\n /**\n * @api\n * @param {Array.<Array.<Number>|Array.<Object>} polygonA\n * @param {Array.<Array.<Number>|Array.<Object>} polygonB\n * @return {Array.<Array.<Number>>|Array.<Array.<Object>|Null}\n */\n union: function(polygonA, polygonB) {\n return clip(polygonA, polygonB, false, false);\n },\n\n /**\n * @api\n * @param {Array.<Array.<Number>|Array.<Object>} polygonA\n * @param {Array.<Array.<Number>|Array.<Object>} polygonB\n * @return {Array.<Array.<Number>>|Array.<Array.<Object>>|Null}\n */\n intersection: function(polygonA, polygonB) {\n return clip(polygonA, polygonB, true, true);\n },\n\n /**\n * @api\n * @param {Array.<Array.<Number>|Array.<Object>} polygonA\n * @param {Array.<Array.<Number>|Array.<Object>} polygonB\n * @return {Array.<Array.<Number>>|Array.<Array.<Object>>|Null}\n */\n diff: function(polygonA, polygonB) {\n return clip(polygonA, polygonB, false, true);\n },\n\n clip: clip\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/~/greiner-hormann/src/greiner-hormann.js\n ** module id = 61\n ** module chunks = 0\n **/","var Polygon = require('./polygon');\n\n/**\n * Clip driver\n * @api\n * @param {Array.<Array.<Number>>} polygonA\n * @param {Array.<Array.<Number>>} polygonB\n * @param {Boolean} sourceForwards\n * @param {Boolean} clipForwards\n * @return {Array.<Array.<Number>>}\n */\nmodule.exports = function(polygonA, polygonB, eA, eB) {\n var result, source = new Polygon(polygonA),\n clip = new Polygon(polygonB),\n result = source.clip(clip, eA, eB);\n\n return result;\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/~/greiner-hormann/src/clip.js\n ** module id = 62\n ** module chunks = 0\n **/","var Vertex = require('./vertex');\nvar Intersection = require('./intersection');\n\n/**\n * Polygon representation\n * @param {Array.<Array.<Number>>} p\n * @param {Boolean=} arrayVertices\n *\n * @constructor\n */\nvar Polygon = function(p, arrayVertices) {\n\n /**\n * @type {Vertex}\n */\n this.first = null;\n\n /**\n * @type {Number}\n */\n this.vertices = 0;\n\n /**\n * @type {Vertex}\n */\n this._lastUnprocessed = null;\n\n /**\n * Whether to handle input and output as [x,y] or {x:x,y:y}\n * @type {Boolean}\n */\n this._arrayVertices = (typeof arrayVertices === \"undefined\") ?\n Array.isArray(p[0]) :\n arrayVertices;\n\n for (var i = 0, len = p.length; i < len; i++) {\n this.addVertex(new Vertex(p[i]));\n }\n};\n\n/**\n * Add a vertex object to the polygon\n * (vertex is added at the 'end' of the list')\n *\n * @param vertex\n */\nPolygon.prototype.addVertex = function(vertex) {\n if (this.first == null) {\n this.first = vertex;\n this.first.next = vertex;\n this.first.prev = vertex;\n } else {\n var next = this.first,\n prev = next.prev;\n\n next.prev = vertex;\n vertex.next = next;\n vertex.prev = prev;\n prev.next = vertex;\n }\n this.vertices++;\n};\n\n/**\n * Inserts a vertex inbetween start and end\n *\n * @param {Vertex} vertex\n * @param {Vertex} start\n * @param {Vertex} end\n */\nPolygon.prototype.insertVertex = function(vertex, start, end) {\n var prev, curr = start;\n\n while (!curr.equals(end) && curr._distance < vertex._distance) {\n curr = curr.next;\n }\n\n vertex.next = curr;\n prev = curr.prev;\n\n vertex.prev = prev;\n prev.next = vertex;\n curr.prev = vertex;\n\n this.vertices++;\n};\n\n/**\n * Get next non-intersection point\n * @param {Vertex} v\n * @return {Vertex}\n */\nPolygon.prototype.getNext = function(v) {\n var c = v;\n while (c._isIntersection) {\n c = c.next;\n }\n return c;\n};\n\n/**\n * Unvisited intersection\n * @return {Vertex}\n */\nPolygon.prototype.getFirstIntersect = function() {\n var v = this._firstIntersect || this.first;\n\n do {\n if (v._isIntersection && !v._visited) {\n break;\n }\n\n v = v.next;\n } while (!v.equals(this.first));\n\n this._firstIntersect = v;\n return v;\n};\n\n/**\n * Does the polygon have unvisited vertices\n * @return {Boolean} [description]\n */\nPolygon.prototype.hasUnprocessed = function() {\n var v = this._lastUnprocessed || this.first;\n do {\n if (v._isIntersection && !v._visited) {\n this._lastUnprocessed = v;\n return true;\n }\n\n v = v.next;\n } while (!v.equals(this.first));\n\n this._lastUnprocessed = null;\n return false;\n};\n\n/**\n * The output depends on what you put in, arrays or objects\n * @return {Array.<Array<Number>|Array.<Object>}\n */\nPolygon.prototype.getPoints = function() {\n var points = [],\n v = this.first;\n\n if (this._arrayVertices) {\n do {\n points.push([v.x, v.y]);\n v = v.next;\n } while (v !== this.first);\n } else {\n do {\n points.push({\n x: v.x,\n y: v.y\n });\n v = v.next;\n } while (v !== this.first);\n }\n\n return points;\n};\n\n/**\n * Clip polygon against another one.\n * Result depends on algorithm direction:\n *\n * Intersection: forwards forwards\n * Union: backwars backwards\n * Diff: backwards forwards\n *\n * @param {Polygon} clip\n * @param {Boolean} sourceForwards\n * @param {Boolean} clipForwards\n */\nPolygon.prototype.clip = function(clip, sourceForwards, clipForwards) {\n var sourceVertex = this.first,\n clipVertex = clip.first,\n sourceInClip, clipInSource;\n\n // calculate and mark intersections\n do {\n if (!sourceVertex._isIntersection) {\n do {\n if (!clipVertex._isIntersection) {\n var i = new Intersection(\n sourceVertex,\n this.getNext(sourceVertex.next),\n clipVertex, clip.getNext(clipVertex.next));\n\n if (i.valid()) {\n var sourceIntersection =\n Vertex.createIntersection(i.x, i.y, i.toSource),\n clipIntersection =\n Vertex.createIntersection(i.x, i.y, i.toClip);\n\n sourceIntersection._corresponding = clipIntersection;\n clipIntersection._corresponding = sourceIntersection;\n\n this.insertVertex(\n sourceIntersection,\n sourceVertex,\n this.getNext(sourceVertex.next));\n clip.insertVertex(\n clipIntersection,\n clipVertex,\n clip.getNext(clipVertex.next));\n }\n }\n clipVertex = clipVertex.next;\n } while (!clipVertex.equals(clip.first));\n }\n\n sourceVertex = sourceVertex.next;\n } while (!sourceVertex.equals(this.first));\n\n // phase two - identify entry/exit points\n sourceVertex = this.first;\n clipVertex = clip.first;\n\n sourceInClip = sourceVertex.isInside(clip);\n clipInSource = clipVertex.isInside(this);\n\n sourceForwards ^= sourceInClip;\n clipForwards ^= clipInSource;\n\n do {\n if (sourceVertex._isIntersection) {\n sourceVertex._isEntry = sourceForwards;\n sourceForwards = !sourceForwards;\n }\n sourceVertex = sourceVertex.next;\n } while (!sourceVertex.equals(this.first));\n\n do {\n if (clipVertex._isIntersection) {\n clipVertex._isEntry = clipForwards;\n clipForwards = !clipForwards;\n }\n clipVertex = clipVertex.next;\n } while (!clipVertex.equals(clip.first));\n\n // phase three - construct a list of clipped polygons\n var list = [];\n\n while (this.hasUnprocessed()) {\n var current = this.getFirstIntersect(),\n // keep format\n clipped = new Polygon([], this._arrayVertices);\n\n clipped.addVertex(new Vertex(current.x, current.y));\n do {\n current.visit();\n if (current._isEntry) {\n do {\n current = current.next;\n clipped.addVertex(new Vertex(current.x, current.y));\n } while (!current._isIntersection);\n\n } else {\n do {\n current = current.prev;\n clipped.addVertex(new Vertex(current.x, current.y));\n } while (!current._isIntersection);\n }\n current = current._corresponding;\n } while (!current._visited);\n\n list.push(clipped.getPoints());\n }\n\n if (list.length === 0) {\n if (sourceInClip) {\n list.push(this.getPoints());\n }\n if (clipInSource) {\n list.push(clip.getPoints());\n }\n if (list.length === 0) {\n list = null;\n }\n }\n\n return list;\n};\n\nmodule.exports = Polygon;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/~/greiner-hormann/src/polygon.js\n ** module id = 63\n ** module chunks = 0\n **/","/**\n * Vertex representation\n *\n * @param {Number|Array.<Number>} x\n * @param {Number=} y\n *\n * @constructor\n */\nvar Vertex = function(x, y) {\n\n if (arguments.length === 1) {\n // Coords\n if (Array.isArray(x)) {\n y = x[1];\n x = x[0];\n } else {\n y = x.y;\n x = x.x;\n }\n }\n\n /**\n * X coordinate\n * @type {Number}\n */\n this.x = x;\n\n /**\n * Y coordinate\n * @type {Number}\n */\n this.y = y;\n\n /**\n * Next node\n * @type {Vertex}\n */\n this.next = null;\n\n /**\n * Previous vertex\n * @type {Vertex}\n */\n this.prev = null;\n\n /**\n * Corresponding intersection in other polygon\n */\n this._corresponding = null;\n\n /**\n * Distance from previous\n */\n this._distance = 0.0;\n\n /**\n * Entry/exit point in another polygon\n * @type {Boolean}\n */\n this._isEntry = true;\n\n /**\n * Intersection vertex flag\n * @type {Boolean}\n */\n this._isIntersection = false;\n\n /**\n * Loop check\n * @type {Boolean}\n */\n this._visited = false;\n};\n\n/**\n * Creates intersection vertex\n * @param {Number} x\n * @param {Number} y\n * @param {Number} distance\n * @return {Vertex}\n */\nVertex.createIntersection = function(x, y, distance) {\n var vertex = new Vertex(x, y);\n vertex._distance = distance;\n vertex._isIntersection = true;\n vertex._isEntry = false;\n return vertex;\n};\n\n/**\n * Mark as visited\n */\nVertex.prototype.visit = function() {\n this._visited = true;\n if (this._corresponding !== null && !this._corresponding._visited) {\n this._corresponding.visit();\n }\n};\n\n/**\n * Convenience\n * @param {Vertex} v\n * @return {Boolean}\n */\nVertex.prototype.equals = function(v) {\n return this.x === v.x && this.y === v.y;\n};\n\n/**\n * Check if vertex is inside a polygon by odd-even rule:\n * If the number of intersections of a ray out of the point and polygon\n * segments is odd - the point is inside.\n * @param {Polygon} poly\n * @return {Boolean}\n */\nVertex.prototype.isInside = function(poly) {\n var oddNodes = false,\n vertex = poly.first,\n next = vertex.next,\n x = this.x,\n y = this.y;\n\n do {\n if ((vertex.y < y && next.y >= y ||\n next.y < y && vertex.y >= y) &&\n (vertex.x <= x || next.x <= x)) {\n\n oddNodes ^= (vertex.x + (y - vertex.y) /\n (next.y - vertex.y) * (next.x - vertex.x) < x);\n }\n\n vertex = vertex.next;\n next = vertex.next || poly.first;\n } while (!vertex.equals(poly.first));\n\n return oddNodes;\n};\n\nmodule.exports = Vertex;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/~/greiner-hormann/src/vertex.js\n ** module id = 64\n ** module chunks = 0\n **/","/**\n * Intersection\n * @param {Vertex} s1\n * @param {Vertex} s2\n * @param {Vertex} c1\n * @param {Vertex} c2\n * @constructor\n */\nvar Intersection = function(s1, s2, c1, c2) {\n\n /**\n * @type {Number}\n */\n this.x = 0.0;\n\n /**\n * @type {Number}\n */\n this.y = 0.0;\n\n /**\n * @type {Number}\n */\n this.toSource = 0.0;\n\n /**\n * @type {Number}\n */\n this.toClip = 0.0;\n\n var d = (c2.y - c1.y) * (s2.x - s1.x) - (c2.x - c1.x) * (s2.y - s1.y);\n\n if (d === 0) {\n return;\n }\n\n /**\n * @type {Number}\n */\n this.toSource = ((c2.x - c1.x) * (s1.y - c1.y) - (c2.y - c1.y) * (s1.x - c1.x)) / d;\n\n /**\n * @type {Number}\n */\n this.toClip = ((s2.x - s1.x) * (s1.y - c1.y) - (s2.y - s1.y) * (s1.x - c1.x)) / d;\n\n if (this.valid()) {\n this.x = s1.x + this.toSource * (s2.x - s1.x);\n this.y = s1.y + this.toSource * (s2.y - s1.y);\n }\n};\n\n/**\n * @return {Boolean}\n */\nIntersection.prototype.valid = function() {\n return (0 < this.toSource && this.toSource < 1) && (0 < this.toClip && this.toClip < 1);\n};\n\nmodule.exports = Intersection;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/~/greiner-hormann/src/intersection.js\n ** module id = 65\n ** module chunks = 0\n **/","\"use strict\";\n\n/**\n * Offset edge of the polygon\n *\n * @param {Object} current\n * @param {Object} next\n * @cosntructor\n */\nfunction Edge(current, next) {\n\n /**\n * @type {Object}\n */\n this.current = current;\n\n /**\n * @type {Object}\n */\n this.next = next;\n\n /**\n * @type {Object}\n */\n this._inNormal = this.inwardsNormal();\n\n /**\n * @type {Object}\n */\n this._outNormal = this.outwardsNormal();\n};\n\n/**\n * Creates outwards normal\n * @return {Object}\n */\nEdge.prototype.outwardsNormal = function() {\n var inwards = this.inwardsNormal();\n return [\n -inwards[0],\n -inwards[1]\n ];\n};\n\n/**\n * Creates inwards normal\n * @return {Object}\n */\nEdge.prototype.inwardsNormal = function() {\n var dx = this.next[0] - this.current[0],\n dy = this.next[1] - this.current[1],\n edgeLength = Math.sqrt(dx * dx + dy * dy);\n\n return [\n -dy / edgeLength,\n dx / edgeLength\n ];\n};\n\n/**\n * Offsets the edge by dx, dy\n * @param {Number} dx\n * @param {Number} dy\n * @return {Edge}\n */\nEdge.prototype.offset = function(dx, dy) {\n var current = this.current,\n next = this.next;\n\n return new Edge([\n current[0] + dx,\n current[1] + dy\n ], [\n next[0] + dx,\n next[1] + dy\n ]);\n};\n\nmodule.exports = Edge;\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/src/edge.js\n ** module id = 66\n ** module chunks = 0\n **/","\"use strict\";\n\n/**\n * Vector intersection, if present\n *\n * @param {Object} A0\n * @param {Object} A1\n * @param {Object} B0\n * @param {Object} B1\n *\n * @return {Object|null}\n */\nmodule.exports = function intersection(A0, A1, B0, B1) {\n var den = (B1[1] - B0[1]) * (A1[0] - A0[0]) -\n (B1[0] - B0[0]) * (A1[1] - A0[1]);\n\n // lines are parallel or conincident\n if (den == 0) {\n return null;\n }\n\n var ua = ((B1[0] - B0[0]) * (A0[1] - B0[1]) -\n (B1[1] - B0[1]) * (A0[0] - B0[0])) / den;\n\n var ub = ((A1[0] - A0[0]) * (A0[1] - B0[1]) -\n (A1[1] - A0[1]) * (A0[0] - B0[0])) / den;\n\n if (ua < 0 || ub < 0 || ua > 1 || ub > 1) {\n return null;\n }\n\n return [\n A0[0] + ua * (A1[0] - A0[0]),\n A0[1] + ua * (A1[1] - A0[1])\n ];\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./~/polygon-offset/src/intersection.js\n ** module id = 67\n ** module chunks = 0\n **/"],"sourceRoot":"/source/"} |