| function dataFunctionManager(){ |
| var frameRate = 0; |
| var matrixInstance = new MatrixManager(); |
| var degToRads = Math.PI/180; |
| |
| function convertNumericValue(data,multiplier){ |
| var i, len = data.length; |
| var j, jLen; |
| for(i=0;i<len;i+=1){ |
| if(data[i].t !== undefined){ |
| if(!!(data[i].s instanceof Array)){ |
| jLen = data[i].s.length; |
| for(j=0;j<jLen;j+=1){ |
| data[i].s[j] *= multiplier; |
| if(data[i].e !== undefined){ |
| data[i].e[j] *= multiplier; |
| } |
| } |
| }else if(data[i].s){ |
| data[i].s *= multiplier; |
| if(data[i].e){ |
| data[i].e *= multiplier; |
| } |
| } |
| }else{ |
| data[i] = data[i]*multiplier; |
| } |
| } |
| } |
| |
| function completeLayers(layers, comps){ |
| var layerFrames, offsetFrame, layerData; |
| var animArray, lastFrame; |
| var i, len = layers.length; |
| var j, jLen, k, kLen; |
| for(i=0;i<len;i+=1){ |
| layerData = layers[i]; |
| if(!('ks' in layerData) || layerData.completed){ |
| continue; |
| } |
| layerData.completed = true; |
| layerFrames = bm_rounder(layerData.op - layerData.st); |
| offsetFrame = layerData.st; |
| if(layerData.tt){ |
| layers[i-1].td = layerData.tt; |
| } |
| layerData.renderedFrame = {}; |
| layerData.renderedData = {}; |
| layerData.__lastMatrix = [0,0,0,0,0]; |
| animArray = []; |
| lastFrame = -1; |
| if(layerData.tm){ |
| layerData.trmp = layerData.tm; |
| var timeValues = new Array(bm_rounder(layerFrames)); |
| for(j=0 ; j<layerFrames; j+=1){ |
| timeValues[j] = bm_floor(getInterpolatedValue(layerData.tm,j,offsetFrame)*frameRate); |
| } |
| layerData.tm = timeValues; |
| } |
| if(layerData.ks.o instanceof Array){ |
| convertNumericValue(layerData.ks.o,1/100); |
| }else{ |
| layerData.ks.o /= 100; |
| } |
| if(layerData.ks.s instanceof Array){ |
| convertNumericValue(layerData.ks.s,1/100); |
| }else{ |
| layerData.ks.s /= 100; |
| } |
| if(layerData.ks.r instanceof Array){ |
| convertNumericValue(layerData.ks.r,degToRads); |
| }else{ |
| layerData.ks.r *= degToRads; |
| } |
| if(layerData.hasMask){ |
| var maskProps = layerData.masksProperties; |
| jLen = maskProps.length; |
| for(j=0;j<jLen;j+=1){ |
| if(maskProps[j].pt.i){ |
| convertPathsToAbsoluteValues(maskProps[j].pt); |
| }else{ |
| kLen = maskProps[j].pt.length; |
| for(k=0;k<kLen;k+=1){ |
| if(maskProps[j].pt[k].s){ |
| convertPathsToAbsoluteValues(maskProps[j].pt[k].s[0]); |
| } |
| if(maskProps[j].pt[k].e){ |
| convertPathsToAbsoluteValues(maskProps[j].pt[k].e[0]); |
| } |
| } |
| } |
| } |
| } |
| if(layerData.ty===0){ |
| layerData.layers = findCompLayers(layerData.refId, comps); |
| completeLayers(layerData.layers, comps); |
| }else if(layerData.ty === 4){ |
| completeShapes(layerData.shapes); |
| } |
| } |
| } |
| |
| function findCompLayers(id,comps){ |
| var i = 0, len = comps.length; |
| while(i<len){ |
| if(comps[i].id === id){ |
| return comps[i].layers; |
| } |
| i += 1; |
| } |
| } |
| |
| function completeShapes(arr,trimmedFlag){ |
| var i, len = arr.length; |
| var j, jLen; |
| var transformData; |
| var isTrimmed = trimmedFlag ? trimmedFlag : false; |
| for(i=len-1;i>=0;i-=1){ |
| arr[i].renderedData = []; |
| if(arr[i].ty == 'tm'){ |
| isTrimmed = true; |
| } |
| if(arr[i].ty == 'fl' || arr[i].ty == 'st'){ |
| if(arr[i].o instanceof Array){ |
| convertNumericValue(arr[i].o,1/100); |
| }else{ |
| arr[i].o *= 1/100; |
| } |
| }else if(arr[i].ty == 'sh'){ |
| arr[i].trimmed = isTrimmed; |
| if(arr[i].ks.i){ |
| convertPathsToAbsoluteValues(arr[i].ks); |
| }else{ |
| jLen = arr[i].ks.length; |
| for(j=0;j<jLen;j+=1){ |
| if(arr[i].ks[j].s){ |
| convertPathsToAbsoluteValues(arr[i].ks[j].s[0]); |
| convertPathsToAbsoluteValues(arr[i].ks[j].e[0]); |
| } |
| } |
| } |
| }else if(arr[i].ty == 'gr'){ |
| completeShapes(arr[i].it,isTrimmed); |
| }else if(arr[i].ty == 'tr'){ |
| transformData = arr[i]; |
| transformData.renderedData = []; |
| if(transformData.o instanceof Array){ |
| convertNumericValue(transformData.o,1/100); |
| }else{ |
| transformData.o /= 100; |
| } |
| if(transformData.s instanceof Array){ |
| convertNumericValue(transformData.s,1/100); |
| }else{ |
| transformData.s /= 100; |
| } |
| if(transformData.r instanceof Array){ |
| convertNumericValue(transformData.r,degToRads); |
| }else{ |
| transformData.r *= degToRads; |
| } |
| transformData.lastMat = [0,0,0,0,0]; |
| }else if(arr[i].ty == 'rc'){ |
| arr[i].trimmed = isTrimmed; |
| arr[i].trimmed = true; |
| arr[i].lastData = { |
| pos:null, |
| size:null, |
| round:0 |
| } |
| }else if(arr[i].ty == 'el'){ |
| arr[i].trimmed = isTrimmed; |
| arr[i].trimmed = true; |
| arr[i].lastData = { |
| pos:null, |
| size:null |
| } |
| |
| } |
| } |
| } |
| |
| function convertPathsToAbsoluteValues(path){ |
| var i, len = path.i.length; |
| for(i=0;i<len;i+=1){ |
| path.i[i][0] += path.v[i][0]; |
| path.i[i][1] += path.v[i][1]; |
| path.o[i][0] += path.v[i][0]; |
| path.o[i][1] += path.v[i][1]; |
| } |
| } |
| |
| function completeData(animationData){ |
| animationData.__renderedFrames = new Array(bm_floor(animationData.tf)); |
| animationData.__renderFinished = false; |
| frameRate = animationData.fr; |
| completeLayers(animationData.layers, animationData.assets); |
| } |
| |
| function convertLayerNameToID(string){ |
| string = string.replace(/ /g,"_"); |
| string = string.replace(/-/g,"_"); |
| string = string.replace(/\./g,"_"); |
| string = string.replace(/\//g,"_"); |
| return string; |
| } |
| |
| function getInterpolatedValue(keyframes, frameNum, offsetTime,paramArr,arrPos,arrLen){ |
| var keyData, nextKeyData,propertyArray,bezierData; |
| var i; |
| var len,paramCnt = 0; |
| if(!(keyframes.length)){ |
| if(paramArr){ |
| while(arrLen>0){ |
| paramArr[arrPos+paramCnt] = keyframes; |
| paramCnt += 1; |
| arrLen -= 1; |
| } |
| } |
| return keyframes; |
| }else if(keyframes[0].t === undefined){ |
| if(paramArr){ |
| while(arrLen>0){ |
| paramArr[arrPos+paramCnt] = keyframes[paramCnt]; |
| paramCnt += 1; |
| arrLen -= 1; |
| } |
| } |
| return keyframes; |
| } |
| i = 0; |
| len = keyframes.length- 1; |
| var dir=1; |
| var flag = true; |
| |
| while(flag){ |
| keyData = keyframes[i]; |
| nextKeyData = keyframes[i+1]; |
| if(i == len-1 && frameNum >= nextKeyData.t - offsetTime){ |
| break; |
| } |
| if((nextKeyData.t - offsetTime) > frameNum && dir == 1){ |
| break; |
| }else if((nextKeyData.t - offsetTime) < frameNum && dir == -1){ |
| i += 1; |
| keyData = keyframes[i]; |
| nextKeyData = keyframes[i+1]; |
| break; |
| } |
| if(i < len - 1 && dir == 1 || i > 0 && dir == -1){ |
| i += dir; |
| }else{ |
| flag = false; |
| } |
| } |
| |
| if(keyData.to && !keyData.bezierData){ |
| bez.buildBezierData(keyData); |
| } |
| var k, kLen; |
| var perc,jLen, j = 0; |
| var fnc; |
| if(!paramArr){ |
| propertyArray = []; |
| } |
| if(keyData.to){ |
| bezierData = keyData.bezierData; |
| if(frameNum >= nextKeyData.t-offsetTime || frameNum < keyData.t-offsetTime){ |
| var ind = frameNum >= nextKeyData.t-offsetTime ? bezierData.points.length - 1 : 0; |
| if(paramArr){ |
| while(arrLen>0){ |
| paramArr[arrPos+paramCnt] = bezierData.points[ind].point[paramCnt]; |
| paramCnt += 1; |
| arrLen -= 1; |
| } |
| } |
| return bezierData.points[ind].point; |
| } |
| if(keyData.__fnct){ |
| fnc = keyData.__fnct; |
| }else{ |
| fnc = bez.getEasingCurve(keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y,keyData.n); |
| keyData.__fnct = fnc; |
| } |
| perc = fnc('',(frameNum)-(keyData.t-offsetTime),0,1,(nextKeyData.t-offsetTime)-(keyData.t-offsetTime)); |
| var distanceInLine = bezierData.segmentLength*perc; |
| |
| var segmentPerc; |
| var addedLength = 0; |
| dir = 1; |
| flag = true; |
| jLen = bezierData.points.length; |
| while(flag){ |
| addedLength +=bezierData.points[j].partialLength*dir; |
| if(distanceInLine === 0 || perc === 0 || j == bezierData.points.length - 1){ |
| if(paramArr){ |
| while(arrLen>0){ |
| paramArr[arrPos+paramCnt] = bezierData.points[j].point[paramCnt]; |
| paramCnt += 1; |
| arrLen -= 1; |
| } |
| }else{ |
| propertyArray = bezierData.points[j].point; |
| } |
| break; |
| }else if(distanceInLine > addedLength && distanceInLine < addedLength + bezierData.points[j+1].partialLength){ |
| segmentPerc = (distanceInLine-addedLength)/(bezierData.points[j+1].partialLength); |
| if(paramArr){ |
| while(arrLen>0){ |
| paramArr[arrPos+paramCnt] = bezierData.points[j].point[paramCnt] + (bezierData.points[j+1].point[paramCnt] - bezierData.points[j].point[paramCnt])*segmentPerc; |
| paramCnt += 1; |
| arrLen -= 1; |
| } |
| }else{ |
| kLen = bezierData.points[j].point.length; |
| for(k=0;k<kLen;k+=1){ |
| propertyArray.push(bezierData.points[j].point[k] + (bezierData.points[j+1].point[k] - bezierData.points[j].point[k])*segmentPerc); |
| } |
| } |
| break; |
| } |
| if(j < jLen - 1 && dir == 1 || j > 0 && dir == -1){ |
| j += dir; |
| }else{ |
| flag = false; |
| } |
| } |
| }else{ |
| var outX,outY,inX,inY, isArray = false, keyValue; |
| len = keyData.s.length; |
| for(i=0;i<len;i+=1){ |
| if(keyData.h !== 1){ |
| if(keyData.o.x instanceof Array){ |
| isArray = true; |
| if(!keyData.__fnct){ |
| keyData.__fnct = []; |
| } |
| if(!keyData.__fnct[i]){ |
| outX = keyData.o.x[i] ? keyData.o.x[i] : keyData.o.x[0]; |
| outY = keyData.o.y[i] ? keyData.o.y[i] : keyData.o.y[0]; |
| inX = keyData.i.x[i] ? keyData.i.x[i] : keyData.i.x[0]; |
| inY = keyData.i.y[i] ? keyData.i.y[i] : keyData.i.y[0]; |
| } |
| }else{ |
| isArray = false; |
| if(!keyData.__fnct) { |
| outX = keyData.o.x; |
| outY = keyData.o.y; |
| inX = keyData.i.x; |
| inY = keyData.i.y; |
| } |
| } |
| if(isArray){ |
| if(keyData.__fnct[i]){ |
| fnc = keyData.__fnct[i]; |
| }else{ |
| fnc = bez.getEasingCurve(outX,outY,inX,inY); |
| keyData.__fnct[i] = fnc; |
| } |
| }else{ |
| if(keyData.__fnct){ |
| fnc = keyData.__fnct; |
| }else{ |
| fnc = bez.getEasingCurve(outX,outY,inX,inY); |
| keyData.__fnct = fnc; |
| } |
| } |
| if(frameNum >= nextKeyData.t-offsetTime){ |
| perc = 1; |
| }else if(frameNum < keyData.t-offsetTime){ |
| perc = 0; |
| }else{ |
| perc = fnc('',(frameNum)-(keyData.t-offsetTime),0,1,(nextKeyData.t-offsetTime)-(keyData.t-offsetTime)); |
| } |
| } |
| keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i]+(keyData.e[i]-keyData.s[i])*perc; |
| if(paramArr){ |
| if(arrLen > 0) { |
| paramArr[arrPos + paramCnt] = keyValue; |
| paramCnt += 1; |
| arrLen -= 1; |
| } |
| }else{ |
| if(len === 1){ |
| propertyArray = keyValue; |
| }else{ |
| propertyArray.push(keyValue); |
| } |
| } |
| } |
| } |
| return propertyArray; |
| } |
| |
| function getSegmentsLength(keyframes,closed){ |
| if(keyframes.__lengths){ |
| return; |
| } |
| keyframes.__lengths = []; |
| keyframes.__totalLength = 0; |
| var pathV = keyframes.v; |
| var pathO = keyframes.o; |
| var pathI = keyframes.i; |
| var i, len = pathV.length; |
| for(i=0;i<len-1;i+=1){ |
| keyframes.__lengths.push(bez.getBezierLength(pathV[i],pathV[i+1],pathO[i],pathI[i+1])); |
| keyframes.__totalLength += keyframes.__lengths[i].addedLength; |
| } |
| if(closed){ |
| keyframes.__lengths.push(bez.getBezierLength(pathV[i],pathV[0],pathO[i],pathI[0])); |
| keyframes.__totalLength += keyframes.__lengths[i].addedLength; |
| } |
| } |
| |
| function interpolateShape(shapeData, frameNum, offsetTime, renderType, isMask, trimData){ |
| var isTrimmed = trimData && trimData.length > 0; |
| var pathData = {}; |
| pathData.closed = isMask ? shapeData.cl : shapeData.closed; |
| var keyframes = isMask ? shapeData.pt : shapeData.ks; |
| if(keyframes.v){ |
| if(!isTrimmed){ |
| pathData.pathNodes = keyframes; |
| }else{ |
| pathData.pathNodes = trimPath(keyframes,pathData.closed, trimData, false); |
| } |
| return pathData; |
| }else{ |
| var j,jLen, k, kLen; |
| var coordsIData,coordsOData,coordsVData; |
| if(frameNum < keyframes[0].t-offsetTime || frameNum > keyframes[keyframes.length - 1].t-offsetTime){ |
| var ob, pos, stored, key; |
| if(frameNum < keyframes[0].t-offsetTime){ |
| key = '__minValue'; |
| pos = 0; |
| stored = keyframes.__minValue; |
| ob = keyframes[pos].s; |
| }else{ |
| key = '__maxValue'; |
| pos = keyframes.length - 2; |
| stored = keyframes.__maxValue; |
| ob = keyframes[pos].e; |
| } |
| if(!stored){ |
| jLen = keyframes[pos].s[0].i.length; |
| shapeData = { |
| i: new Array(jLen), |
| o: new Array(jLen), |
| v: new Array(jLen) |
| }; |
| for(j=0;j<jLen;j+=1){ |
| kLen = keyframes[pos].s[0].i[j].length; |
| coordsIData = new Array(kLen); |
| coordsOData = new Array(kLen); |
| coordsVData = new Array(kLen); |
| for(k=0;k<kLen;k+=1){ |
| coordsIData[k] = ob[0].i[j][k]; |
| coordsOData[k] = ob[0].o[j][k]; |
| coordsVData[k] = ob[0].v[j][k]; |
| } |
| shapeData.i[j] = coordsIData; |
| shapeData.o[j] = coordsOData; |
| shapeData.v[j] = coordsVData; |
| } |
| keyframes[key] = shapeData; |
| stored = shapeData; |
| } |
| pathData.pathNodes = isTrimmed ? trimPath(stored,pathData.closed, trimData, false) : stored; |
| return pathData; |
| }else{ |
| var lastNodes; |
| var newNodes = false; |
| if(keyframes.__lastData){ |
| lastNodes = keyframes.__lastData.pathNodes; |
| }else{ |
| newNodes = true; |
| } |
| var i = 0; |
| var len = keyframes.length- 1; |
| var dir = 1; |
| var flag = true; |
| var keyData,nextKeyData; |
| |
| while(flag){ |
| keyData = keyframes[i]; |
| nextKeyData = keyframes[i+1]; |
| if((nextKeyData.t - offsetTime) > frameNum && dir == 1){ |
| break; |
| } |
| if(i < len - 1 && dir == 1 || i > 0 && dir == -1){ |
| i += dir; |
| }else{ |
| flag = false; |
| } |
| } |
| |
| var perc; |
| if(keyData.h !== 1){ |
| var fnc; |
| if(keyData.__fnct){ |
| fnc = keyData.__fnct; |
| }else{ |
| fnc = bez.getEasingCurve(keyData.o.x,keyData.o.y,keyData.i.x,keyData.i.y); |
| keyData.__fnct = fnc; |
| } |
| if(frameNum >= nextKeyData.t-offsetTime){ |
| perc = 1; |
| }else if(frameNum < keyData.t-offsetTime){ |
| perc = 0; |
| }else{ |
| perc = fnc('',(frameNum)-(keyData.t-offsetTime),0,1,(nextKeyData.t-offsetTime)-(keyData.t-offsetTime)); |
| } |
| } |
| if(keyData.h === 1 && keyData.__hValue){ |
| shapeData = keyData.__hValue; |
| }else{ |
| jLen = keyData.s[0].i.length; |
| shapeData = { |
| i: new Array(jLen), |
| o: new Array(jLen), |
| v: new Array(jLen) |
| }; |
| for(j=0;j<jLen;j+=1){ |
| kLen = keyData.s[0].i[j].length; |
| coordsIData = new Array(kLen); |
| coordsOData = new Array(kLen); |
| coordsVData = new Array(kLen); |
| for(k=0;k<kLen;k+=1){ |
| if(keyData.h === 1){ |
| coordsIData[k] = keyData.s[0].i[j][k]; |
| coordsOData[k] = keyData.s[0].o[j][k]; |
| coordsVData[k] = keyData.s[0].v[j][k]; |
| }else{ |
| coordsIData[k] = keyData.s[0].i[j][k]+(keyData.e[0].i[j][k]-keyData.s[0].i[j][k])*perc; |
| coordsOData[k] = keyData.s[0].o[j][k]+(keyData.e[0].o[j][k]-keyData.s[0].o[j][k])*perc; |
| coordsVData[k] = keyData.s[0].v[j][k]+(keyData.e[0].v[j][k]-keyData.s[0].v[j][k])*perc; |
| } |
| if(lastNodes){ |
| if(!lastNodes.i[j] || !lastNodes.o[j] || !lastNodes.v[j] || (lastNodes.i[j][k] !== coordsIData[k] || lastNodes.o[j][k] !== coordsOData[k] || lastNodes.v[j][k] !== coordsVData[k])){ |
| newNodes = true; |
| } |
| } |
| } |
| shapeData.i[j] = coordsIData; |
| shapeData.o[j] = coordsOData; |
| shapeData.v[j] = coordsVData; |
| if(keyData.h === 1){ |
| keyData.__hValue = shapeData; |
| } |
| } |
| } |
| if(isTrimmed){ |
| pathData.pathNodes = trimPath(shapeData,pathData.closed, trimData, false); |
| }else{ |
| if(!newNodes){ |
| pathData.pathNodes = keyframes.__lastData; |
| }else{ |
| pathData.pathNodes = shapeData; |
| keyframes.__lastData = pathData; |
| } |
| pathData.pathNodes = shapeData; |
| } |
| return pathData; |
| } |
| } |
| } |
| |
| var trimPath = (function(){ |
| |
| var pathStarted = false; |
| var pathString = ''; |
| var nextI,nextV,nextO, stops; |
| var nextLengths; |
| var nextTotalLength; |
| var segmentCount; |
| function addSegment(pt1,pt2,pt3,pt4, lengthData){ |
| nextO[segmentCount] = pt2; |
| nextI[segmentCount+1] = pt3; |
| nextV[segmentCount+1] = pt4; |
| if(!pathStarted){ |
| pathString += " M"+pt1.join(','); |
| pathStarted = true; |
| stops[segmentCount] = pt1; |
| }else{ |
| nextV[segmentCount] = pt1; |
| } |
| pathString += " C"+pt2.join(',') + " "+pt3.join(',') + " "+pt4.join(','); |
| //nextLengths[segmentCount] = lengthData; |
| segmentCount+=1; |
| //nextTotalLength += lengthData.addedLength; |
| } |
| |
| return function trimPath_(paths,closed, trimData, stringifyFlag){ |
| getSegmentsLength(paths,closed); |
| var j, jLen = trimData.length; |
| var finalPaths = paths; |
| nextV = nextI = nextO = stops = null; |
| var pathV,pathO,pathI; |
| var k, kLen; |
| for(j=jLen-1;j>=0;j-=1){ |
| var segments = []; |
| var o = (trimData[j].o%360)/360; |
| if(o === 0 && trimData[j].s === 0 && trimData[j].e == 100){ |
| continue; |
| } |
| pathString = ''; |
| pathStarted = false; |
| nextI = []; |
| nextO = []; |
| nextV = []; |
| stops = []; |
| nextLengths = []; |
| nextTotalLength = 0; |
| if(o < 0){ |
| o += 1; |
| } |
| var s = trimData[j].s/100 + o; |
| var e = (trimData[j].e/100) + o; |
| if(s == e){ |
| if(stringifyFlag){ |
| return ''; |
| }else{ |
| return {}; |
| } |
| } |
| if(s>e){ |
| var _s = s; |
| s = e; |
| e = _s; |
| } |
| if(e <= 1){ |
| segments.push({s:finalPaths.__totalLength*s,e:finalPaths.__totalLength*e}); |
| }else if(s >= 1){ |
| segments.push({s:finalPaths.__totalLength*(s-1),e:finalPaths.__totalLength*(e-1)}); |
| }else{ |
| segments.push({s:finalPaths.__totalLength*s,e:finalPaths.__totalLength}); |
| segments.push({s:0,e:finalPaths.__totalLength*(e-1)}); |
| } |
| |
| pathV=[]; |
| pathO=[]; |
| pathI=[]; |
| |
| var lengths; |
| pathV = finalPaths.v; |
| pathO = finalPaths.o; |
| pathI = finalPaths.i; |
| lengths = finalPaths.__lengths; |
| kLen = pathV.length; |
| var addedLength = 0, segmentLength = 0; |
| var i, len = segments.length; |
| var segment; |
| segmentCount = 0; |
| for(i=0;i<len;i+=1){ |
| addedLength = 0; |
| for(k=1;k<kLen;k++){ |
| segmentLength = lengths[k-1].addedLength; |
| if(addedLength + segmentLength < segments[i].s){ |
| addedLength += segmentLength; |
| continue; |
| }else if(addedLength > segments[i].e){ |
| break; |
| } |
| if(segments[i].s <= addedLength && segments[i].e >= addedLength + segmentLength){ |
| addSegment(pathV[k-1],pathO[k-1],pathI[k],pathV[k],lengths[k-1]); |
| }else{ |
| segment = bez.getNewSegment(pathV[k-1],pathV[k],pathO[k-1],pathI[k], (segments[i].s - addedLength)/segmentLength,(segments[i].e - addedLength)/segmentLength, lengths[k-1]); |
| addSegment(segment.pt1,segment.pt3,segment.pt4,segment.pt2/*,bez.getBezierLength(segment.pt1,segment.pt4,segment.pt2,segment.pt3)*/); |
| } |
| addedLength += segmentLength; |
| } |
| if(closed !== false){ |
| if(addedLength <= segments[i].e){ |
| segmentLength = lengths[k-1].addedLength; |
| if(segments[i].s <= addedLength && segments[i].e >= addedLength + segmentLength){ |
| addSegment(pathV[k-1],pathO[k-1],pathI[0],pathV[0],lengths[k-1]); |
| }else{ |
| segment = bez.getNewSegment(pathV[k-1],pathV[0],pathO[k-1],pathI[0], (segments[i].s - addedLength)/segmentLength,(segments[i].e - addedLength)/segmentLength, lengths[k-1]); |
| addSegment(segment.pt1,segment.pt3,segment.pt4,segment.pt2/*,bez.getBezierLength(segment.pt1,segment.pt4,segment.pt2,segment.pt3)*/); |
| } |
| } |
| }else{ |
| pathStarted = false; |
| } |
| } |
| closed = false; |
| } |
| if(!nextV){ |
| pathV = finalPaths.v; |
| pathO = finalPaths.o; |
| pathI = finalPaths.i; |
| stops = []; |
| }else{ |
| pathV = nextV; |
| pathO = nextO; |
| pathI = nextI; |
| } |
| kLen = pathV.length; |
| if(stringifyFlag){ |
| pathString = ''; |
| for(k=1;k<kLen;k++){ |
| if(stops[k-1]){ |
| pathString += "M"+stops[k-1].join(','); |
| }else if(k == 1){ |
| pathString += "M"+pathV[0].join(','); |
| } |
| pathString += " C"+pathO[k-1].join(',') + " "+pathI[k].join(',') + " "+pathV[k].join(','); |
| } |
| if(closed !== false){ |
| pathString += " C"+pathO[k-1].join(',') + " "+pathI[0].join(',') + " "+pathV[0].join(','); |
| } |
| return pathString; |
| }else{ |
| return { |
| i: pathI, |
| o: pathO, |
| v: pathV, |
| s: stops, |
| c: closed |
| }; |
| } |
| }; |
| }()); |
| |
| function RenderedTransform(a,o,m){ |
| this.a = a; |
| this.o = o; |
| this.m = m; |
| } |
| |
| var mtParams = [0,1,1,0,0]; |
| function iterateLayers(layers, frameNum,renderType){ |
| var maskProps; |
| var timeRemapped; |
| |
| var offsettedFrameNum, i, len, renderedData; |
| var j, jLen = layers.length, item, newData; |
| for(j=0;j<jLen;j+=1){ |
| item = layers[j]; |
| if(!('ks' in layers[j])) { |
| continue; |
| } |
| offsettedFrameNum = frameNum - item.st; |
| var a = getInterpolatedValue(item.ks.a,offsettedFrameNum, item.st); |
| var o = getInterpolatedValue(item.ks.o,offsettedFrameNum, item.st); |
| if(item.ks.p.s){ |
| getInterpolatedValue(item.ks.p.x,offsettedFrameNum, item.st,mtParams,3,1); |
| getInterpolatedValue(item.ks.p.y,offsettedFrameNum, item.st,mtParams,4,1); |
| }else{ |
| getInterpolatedValue(item.ks.p,offsettedFrameNum, item.st,mtParams,3,2); |
| } |
| getInterpolatedValue(item.ks.r,offsettedFrameNum, item.st,mtParams,0,1); |
| getInterpolatedValue(item.ks.s,offsettedFrameNum, item.st,mtParams,1,2); |
| renderedData = {}; |
| newData = false; |
| |
| if(!item.__lastRenderAn || o !== item.__lastRenderAn.o || a !== item.__lastRenderAn.a || mtParams[0] !== item.__lastMatrix[0] |
| || mtParams[1] !== item.__lastMatrix[1] || mtParams[2] !== item.__lastMatrix[2] || mtParams[3] !== item.__lastMatrix[3] || mtParams[4] !== item.__lastMatrix[4] ){ |
| renderedData.an = new RenderedTransform(a,o,matrixInstance.getMatrixArrayFromParams(mtParams[0],mtParams[1],mtParams[2],mtParams[3],mtParams[4])) |
| item.__lastRenderAn = renderedData.an; |
| for(i=0;i<5;i+=1){ |
| item.__lastMatrix[i] = mtParams[i]; |
| } |
| }else{ |
| renderedData.an = item.__lastRenderAn; |
| } |
| item.renderedData[offsettedFrameNum] = renderedData; |
| if(item.hasMask){ |
| maskProps = item.masksProperties; |
| len = maskProps.length; |
| for(i=0;i<len;i+=1){ |
| if(!maskProps[i].paths){ |
| maskProps[i].paths = []; |
| maskProps[i].opacity = []; |
| } |
| |
| maskProps[i].paths[offsettedFrameNum] = interpolateShape(maskProps[i],offsettedFrameNum, item.st,renderType,true); |
| maskProps[i].opacity[offsettedFrameNum] = getInterpolatedValue(maskProps[i].o,offsettedFrameNum, item.st)/100; |
| } |
| } |
| if((frameNum < item.ip || frameNum > item.op)){ |
| continue; |
| } |
| if(item.ty === 0){ |
| timeRemapped = item.tm ? item.tm[offsettedFrameNum] < 0 ? 0 : offsettedFrameNum >= item.tm.length ? item.tm[item.tm.length - 1] : item.tm[offsettedFrameNum] : offsettedFrameNum; |
| if(timeRemapped === undefined){ |
| timeRemapped = getInterpolatedValue(item.trmp,offsettedFrameNum, 0)[0]*frameRate; |
| item.tm[offsettedFrameNum] = timeRemapped; |
| } |
| iterateLayers(item.layers,timeRemapped,renderType); |
| }else if(item.ty === 4){ |
| iterateShape(item.shapes,offsettedFrameNum,item.st,renderType); |
| } |
| } |
| } |
| |
| function convertRectToPath(pos,size,round, d){ |
| round = bm_min(size[0]/2,size[1]/2,round/2); |
| var nextV = new Array(8); |
| var nextI = new Array(8); |
| var nextO = new Array(8); |
| var cPoint = round/2; |
| //round *= 1; |
| |
| if(d === 2 || d === 1) { |
| |
| nextV[0] = [pos[0]+size[0]/2,pos[1]-size[1]/2+round]; |
| nextO[0] = nextV[0]; |
| nextI[0] = [pos[0]+size[0]/2,pos[1]-size[1]/2+cPoint]; |
| |
| nextV[1] = [pos[0]+size[0]/2,pos[1]+size[1]/2-round]; |
| nextO[1] = [pos[0]+size[0]/2,pos[1]+size[1]/2-cPoint]; |
| nextI[1] = nextV[1]; |
| |
| nextV[2] = [pos[0]+size[0]/2-round,pos[1]+size[1]/2]; |
| nextO[2] = nextV[2]; |
| nextI[2] = [pos[0]+size[0]/2-cPoint,pos[1]+size[1]/2]; |
| |
| nextV[3] = [pos[0]-size[0]/2+round,pos[1]+size[1]/2]; |
| nextO[3] = [pos[0]-size[0]/2+cPoint,pos[1]+size[1]/2]; |
| nextI[3] = nextV[3]; |
| |
| nextV[4] = [pos[0]-size[0]/2,pos[1]+size[1]/2-round]; |
| nextO[4] = nextV[4]; |
| nextI[4] = [pos[0]-size[0]/2,pos[1]+size[1]/2-cPoint]; |
| |
| nextV[5] = [pos[0]-size[0]/2,pos[1]-size[1]/2+round]; |
| nextO[5] = [pos[0]-size[0]/2,pos[1]-size[1]/2+cPoint]; |
| nextI[5] = nextV[5]; |
| |
| nextV[6] = [pos[0]-size[0]/2+round,pos[1]-size[1]/2]; |
| nextO[6] = nextV[6]; |
| nextI[6] = [pos[0]-size[0]/2+cPoint,pos[1]-size[1]/2]; |
| |
| nextV[7] = [pos[0]+size[0]/2-round,pos[1]-size[1]/2]; |
| nextO[7] = [pos[0]+size[0]/2-cPoint,pos[1]-size[1]/2]; |
| nextI[7] = nextV[7]; |
| }else{ |
| nextV[0] = [pos[0]+size[0]/2,pos[1]-size[1]/2+round]; |
| nextO[0] = [pos[0]+size[0]/2,pos[1]-size[1]/2+cPoint]; |
| nextI[0] = nextV[0]; |
| |
| nextV[1] = [pos[0]+size[0]/2-round,pos[1]-size[1]/2]; |
| nextO[1] = nextV[1]; |
| nextI[1] = [pos[0]+size[0]/2-cPoint,pos[1]-size[1]/2]; |
| |
| nextV[2] = [pos[0]-size[0]/2+round,pos[1]-size[1]/2]; |
| nextO[2] = [pos[0]-size[0]/2+cPoint,pos[1]-size[1]/2]; |
| nextI[2] = nextV[2]; |
| |
| nextV[3] = [pos[0]-size[0]/2,pos[1]-size[1]/2+round]; |
| nextO[3] = nextV[3]; |
| nextI[3] = [pos[0]-size[0]/2,pos[1]-size[1]/2+cPoint]; |
| |
| nextV[4] = [pos[0]-size[0]/2,pos[1]+size[1]/2-round]; |
| nextO[4] = [pos[0]-size[0]/2,pos[1]+size[1]/2-cPoint]; |
| nextI[4] = nextV[4]; |
| |
| nextV[5] = [pos[0]-size[0]/2+round,pos[1]+size[1]/2]; |
| nextO[5] = nextV[5]; |
| nextI[5] = [pos[0]-size[0]/2+cPoint,pos[1]+size[1]/2]; |
| |
| nextV[6] = [pos[0]+size[0]/2-round,pos[1]+size[1]/2]; |
| nextO[6] = [pos[0]+size[0]/2-cPoint,pos[1]+size[1]/2]; |
| nextI[6] = nextV[6]; |
| |
| nextV[7] = [pos[0]+size[0]/2,pos[1]+size[1]/2-round]; |
| nextO[7] = nextV[7]; |
| nextI[7] = [pos[0]+size[0]/2,pos[1]+size[1]/2-cPoint]; |
| |
| } |
| |
| |
| return {v:nextV,o:nextO,i:nextI,c:true}; |
| } |
| |
| function iterateShape(arr,offsettedFrameNum,startTime,renderType,addedTrim){ |
| var i, len = arr.length; |
| var shapeItem; |
| var fillColor, fillOpacity; |
| var elmPos,elmSize,elmRound; |
| var strokeColor,strokeOpacity,strokeWidth; |
| if(!addedTrim){ |
| addedTrim = []; |
| } |
| var trimS,trimE,trimO; |
| var j, jLen; |
| for(i=len-1;i>=0;i-=1){ |
| shapeItem = arr[i]; |
| if(shapeItem.ty == 'sh'){ |
| shapeItem.renderedData[offsettedFrameNum] = { |
| path: interpolateShape(shapeItem,offsettedFrameNum, startTime,renderType,false,addedTrim) |
| }; |
| }else if(shapeItem.ty == 'fl'){ |
| fillColor = getInterpolatedValue(shapeItem.c,offsettedFrameNum, startTime); |
| fillOpacity = getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime); |
| if(shapeItem.lastData && shapeItem.lastData.opacity == fillOpacity && shapeItem.lastColor == fillColor){ |
| shapeItem.renderedData[offsettedFrameNum] = shapeItem.lastData; |
| }else{ |
| shapeItem.renderedData[offsettedFrameNum] = { |
| opacity: fillOpacity instanceof Array ? fillOpacity[0] : fillOpacity |
| }; |
| fillColor[0] = bm_rounder(fillColor[0]); |
| fillColor[1] = bm_rounder(fillColor[1]); |
| fillColor[2] = bm_rounder(fillColor[2]); |
| if(renderType == 'canvas'){ |
| shapeItem.renderedData[offsettedFrameNum].color = fillColor; |
| }else{ |
| shapeItem.renderedData[offsettedFrameNum].color = rgbToHex(fillColor[0],fillColor[1],fillColor[2]); |
| } |
| shapeItem.lastData = shapeItem.renderedData[offsettedFrameNum]; |
| shapeItem.lastColor = fillColor; |
| } |
| }else if(shapeItem.ty == 'rc'){ |
| elmPos = getInterpolatedValue(shapeItem.p,offsettedFrameNum, startTime); |
| elmSize = getInterpolatedValue(shapeItem.s,offsettedFrameNum, startTime); |
| elmRound = getInterpolatedValue(shapeItem.r,offsettedFrameNum, startTime); |
| if(!addedTrim.length && shapeItem.lastData.pos && shapeItem.lastData.pos[0] == elmPos[0] && shapeItem.lastData.pos[1] == elmPos[1] |
| && shapeItem.lastData.size[0] == elmSize[0] && shapeItem.lastData.size[1] == elmSize[1] && elmRound == shapeItem.lastData.round){ |
| shapeItem.renderedData[offsettedFrameNum] = shapeItem.lastRender; |
| }else{ |
| shapeItem.closed = true; |
| shapeItem.renderedData[offsettedFrameNum] = { |
| path: { |
| closed: true |
| } |
| }; |
| shapeItem.renderedData[offsettedFrameNum].path.pathNodes = trimPath(convertRectToPath(elmPos,elmSize,elmRound,shapeItem.d),true, addedTrim, false); |
| shapeItem.lastData.pos = elmPos; |
| shapeItem.lastData.size = elmSize; |
| shapeItem.lastData.round = elmRound; |
| shapeItem.lastData = { |
| pos: elmPos, |
| size: elmSize, |
| round: elmRound |
| }; |
| shapeItem.lastRender = shapeItem.renderedData[offsettedFrameNum]; |
| } |
| }else if(shapeItem.ty == 'el'){ |
| elmPos = getInterpolatedValue(shapeItem.p,offsettedFrameNum, startTime); |
| elmSize = getInterpolatedValue(shapeItem.s,offsettedFrameNum, startTime); |
| if(!addedTrim.length && shapeItem.renderData && shapeItem.lastData.p[0] == elmPos[0] && shapeItem.lastData.p[1] == elmPos[1] && shapeItem.lastData.size[0] == elmSize[0] && shapeItem.lastData.size[1] == elmSize[1]){ |
| shapeItem.renderedData[offsettedFrameNum] = shapeItem.renderData; |
| }else{ |
| shapeItem.renderedData[offsettedFrameNum] = { |
| p : elmPos, |
| size : elmSize |
| }; |
| shapeItem.lastData.p = elmPos; |
| shapeItem.lastData.size = elmSize; |
| if(renderType == 'svg'){ |
| |
| var pathNodes = { |
| v: new Array(4), |
| i:new Array(4), |
| o:new Array(4) |
| }; |
| if(shapeItem.d !== 2 && shapeItem.d !== 3){ |
| pathNodes.v[0] = [elmPos[0],elmPos[1]-elmSize[1]/2]; |
| pathNodes.i[0] = [elmPos[0] - (elmSize[0]/2)*0.55,elmPos[1] - elmSize[1]/2]; |
| pathNodes.o[0] = [elmPos[0] + (elmSize[0]/2)*0.55,elmPos[1] - elmSize[1]/2]; |
| pathNodes.v[1] = [elmPos[0] + elmSize[0]/2,elmPos[1]]; |
| pathNodes.i[1] = [elmPos[0] + (elmSize[0]/2),elmPos[1] - (elmSize[1]/2)*0.55]; |
| pathNodes.o[1] = [elmPos[0] + (elmSize[0]/2),elmPos[1] + (elmSize[1]/2)*0.55]; |
| pathNodes.v[2] = [elmPos[0],elmPos[1]+elmSize[1]/2]; |
| pathNodes.i[2] = [elmPos[0] + (elmSize[0]/2)*0.55,elmPos[1] + (elmSize[1]/2)]; |
| pathNodes.o[2] = [elmPos[0] - (elmSize[0]/2)*0.55,elmPos[1] + (elmSize[1]/2)]; |
| pathNodes.v[3] = [elmPos[0] - elmSize[0]/2,elmPos[1]]; |
| pathNodes.i[3] = [elmPos[0] - (elmSize[0]/2),elmPos[1] + (elmSize[1]/2)*0.55]; |
| pathNodes.o[3] = [elmPos[0] - (elmSize[0]/2),elmPos[1] - (elmSize[1]/2)*0.55]; |
| }else{ |
| pathNodes.v[0] = [elmPos[0],elmPos[1]-elmSize[1]/2]; |
| pathNodes.o[0] = [elmPos[0] - (elmSize[0]/2)*0.55,elmPos[1] - elmSize[1]/2]; |
| pathNodes.i[0] = [elmPos[0] + (elmSize[0]/2)*0.55,elmPos[1] - elmSize[1]/2]; |
| pathNodes.v[1] = [elmPos[0] - elmSize[0]/2,elmPos[1]]; |
| pathNodes.o[1] = [elmPos[0] - (elmSize[0]/2),elmPos[1] + (elmSize[1]/2)*0.55]; |
| pathNodes.i[1] = [elmPos[0] - (elmSize[0]/2),elmPos[1] - (elmSize[1]/2)*0.55]; |
| pathNodes.v[2] = [elmPos[0],elmPos[1]+elmSize[1]/2]; |
| pathNodes.o[2] = [elmPos[0] + (elmSize[0]/2)*0.55,elmPos[1] + (elmSize[1]/2)]; |
| pathNodes.i[2] = [elmPos[0] - (elmSize[0]/2)*0.55,elmPos[1] + (elmSize[1]/2)]; |
| pathNodes.v[3] = [elmPos[0] + elmSize[0]/2,elmPos[1]]; |
| pathNodes.o[3] = [elmPos[0] + (elmSize[0]/2),elmPos[1] - (elmSize[1]/2)*0.55]; |
| pathNodes.i[3] = [elmPos[0] + (elmSize[0]/2),elmPos[1] + (elmSize[1]/2)*0.55]; |
| } |
| |
| shapeItem.renderedData[offsettedFrameNum] = { |
| path: { |
| closed: true |
| } |
| }; |
| shapeItem.renderedData[offsettedFrameNum].path.pathNodes = trimPath(pathNodes,true, addedTrim, false); |
| shapeItem.closed = true; |
| } |
| shapeItem.renderData = shapeItem.renderedData[offsettedFrameNum]; |
| } |
| |
| }else if(shapeItem.ty == 'st'){ |
| strokeColor = getInterpolatedValue(shapeItem.c,offsettedFrameNum, startTime); |
| strokeOpacity = getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime); |
| strokeWidth = getInterpolatedValue(shapeItem.w,offsettedFrameNum, startTime); |
| if(!shapeItem.d && shapeItem.lastData && shapeItem.lastData.opacity === strokeOpacity && shapeItem.lastData.width === strokeWidth && shapeItem.lastColor === strokeColor){ |
| shapeItem.renderedData[offsettedFrameNum] = shapeItem.lastData; |
| }else{ |
| shapeItem.renderedData[offsettedFrameNum] = { |
| opacity : strokeOpacity, |
| width : strokeWidth |
| }; |
| if(shapeItem.d){ |
| var dashes = []; |
| jLen = shapeItem.d.length; |
| var val; |
| for(j=0;j<jLen;j+=1){ |
| val = getInterpolatedValue(shapeItem.d[j].v,offsettedFrameNum, startTime); |
| dashes.push({ |
| v : val, |
| n : shapeItem.d[j].n |
| }); |
| } |
| shapeItem.renderedData[offsettedFrameNum].dashes = dashes; |
| } |
| roundColor(strokeColor); |
| if(renderType == 'canvas'){ |
| shapeItem.renderedData[offsettedFrameNum].color = strokeColor; |
| }else{ |
| shapeItem.renderedData[offsettedFrameNum].color = rgbToHex(strokeColor[0],strokeColor[1],strokeColor[2]); |
| } |
| shapeItem.lastData = shapeItem.renderedData[offsettedFrameNum]; |
| shapeItem.lastColor = strokeColor; |
| } |
| }else if(shapeItem.ty == 'tr'){ |
| var a = getInterpolatedValue(shapeItem.a,offsettedFrameNum, startTime); |
| var o = getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime); |
| getInterpolatedValue(shapeItem.s,offsettedFrameNum, startTime,mtParams,1,2); |
| getInterpolatedValue(shapeItem.r,offsettedFrameNum, startTime,mtParams,0,1); |
| getInterpolatedValue(shapeItem.p,offsettedFrameNum, startTime,mtParams,3,2); |
| if(shapeItem.lastData && shapeItem.lastData.a == a && shapeItem.lastData.o == o && shapeItem.lastMat[0] == mtParams[0] |
| && shapeItem.lastMat[1] == mtParams[1] && shapeItem.lastMat[2] == mtParams[2] && shapeItem.lastMat[3] == mtParams[3] && shapeItem.lastMat[4] == mtParams[4]){ |
| shapeItem.renderedData[offsettedFrameNum] = shapeItem.lastData; |
| }else{ |
| shapeItem.renderedData[offsettedFrameNum] = new RenderedTransform(a,o,matrixInstance.getMatrixArrayFromParams(mtParams[0],mtParams[1],mtParams[2],mtParams[3],mtParams[4])); |
| for(j=0;j<5;j+=1){ |
| shapeItem.lastMat[j] = mtParams[j]; |
| } |
| shapeItem.lastData = shapeItem.renderedData[offsettedFrameNum]; |
| } |
| }else if(shapeItem.ty == 'tm'){ |
| trimS = getInterpolatedValue(shapeItem.s,offsettedFrameNum, startTime); |
| trimE = getInterpolatedValue(shapeItem.e,offsettedFrameNum, startTime); |
| trimO = getInterpolatedValue(shapeItem.o,offsettedFrameNum, startTime); |
| var trimData = { |
| s: trimS, |
| e: trimE, |
| o: trimO |
| }; |
| addedTrim.push(trimData); |
| shapeItem.renderedData[offsettedFrameNum] = trimData; |
| /*var currentStrimS = addedTrim.s; |
| var currentStrimE = addedTrim.e; |
| addedTrim.o += trimData.o; |
| addedTrim.s = currentStrimS + (currentStrimE - currentStrimS)*(trimData.s/100); |
| addedTrim.e = currentStrimE - (currentStrimE - currentStrimS)*(trimData.e/100);*/ |
| }else if(shapeItem.ty == 'gr'){ |
| iterateShape(shapeItem.it,offsettedFrameNum,startTime,renderType,addedTrim); |
| } |
| } |
| } |
| |
| function roundColor(arr){ |
| var i, len = arr.length; |
| for(i=0;i<len ;i+=1){ |
| arr[i] = bm_rounder(arr[i]); |
| } |
| } |
| |
| function prerenderFrames(animationData,num){ |
| var totalFrames = 1; |
| while(totalFrames > 0){ |
| num += 1; |
| if(num >= bm_floor(animationData.tf)){ |
| animationData.__renderFinished = true; |
| break; |
| } |
| if(!animationData.__renderedFrames[num]){ |
| renderFrame(animationData,num); |
| totalFrames -= 1; |
| } |
| } |
| } |
| |
| function renderFrame(animationData,num){ |
| if(animationData.__renderedFrames[num]==2){ |
| if(!animationData.__renderFinished){ |
| prerenderFrames(animationData,num); |
| } |
| return; |
| } |
| frameRate = animationData.fr; |
| animationData.__renderedFrames[num] = 2; |
| iterateLayers(animationData.layers, num, animationData._animType); |
| } |
| |
| function populateLayers(layers, num, rendered){ |
| var i, len = layers.length, j, jLen; |
| var offsettedFrameNum, timeRemapped; |
| var shapes; |
| for(i=0;i<len;i+=1){ |
| if(rendered[i] === ''){ |
| continue; |
| } |
| offsettedFrameNum = num - layers[i].st; |
| layers[i].renderedData[offsettedFrameNum] = rendered[i]; |
| if(layers[i].ty === 0){ |
| timeRemapped = layers[i].tm ? layers[i].tm[offsettedFrameNum] < 0 ? 0 : offsettedFrameNum >= layers[i].tm.length ? layers[i].tm[layers[i].tm.length - 1] : layers[i].tm[offsettedFrameNum] : offsettedFrameNum; |
| populateLayers(layers[i].layers,timeRemapped,rendered.renderedArray); |
| }else if(layers[i].ty === 4){ |
| shapes = layers[i].shapes; |
| jLen = shapes.length; |
| for(j=0;j<jLen;j+=1){ |
| shapes[j].renderedData[offsettedFrameNum] = rendered[i].shapes[j]; |
| } |
| } |
| } |
| } |
| |
| var moduleOb = {}; |
| moduleOb.completeData = completeData; |
| moduleOb.renderFrame = renderFrame; |
| |
| return moduleOb; |
| } |
| |
| var dataManager = dataFunctionManager(); |