star and polygon
diff --git a/build/player/bodymovin.js b/build/player/bodymovin.js
index 3080706..3c9880b 100644
--- a/build/player/bodymovin.js
+++ b/build/player/bodymovin.js
Binary files differ
diff --git a/extension/jsx/utils/PropertyFactory.jsx b/extension/jsx/utils/PropertyFactory.jsx
index 0629e7b..8f03301 100644
--- a/extension/jsx/utils/PropertyFactory.jsx
+++ b/extension/jsx/utils/PropertyFactory.jsx
@@ -79,7 +79,7 @@
                                 }
                             }
                             break;
-                        } else if (distanceInLine > addedLength && distanceInLine < addedLength + bezierData.points[j + 1].partialLength) {
+                        } else if (distanceInLine >= addedLength && distanceInLine < addedLength + bezierData.points[j + 1].partialLength) {
                             segmentPerc = (distanceInLine - addedLength) / (bezierData.points[j + 1].partialLength);
                             kLen = bezierData.points[j].point.length;
                             for (k = 0; k < kLen; k += 1) {
@@ -690,6 +690,139 @@
             }
         }
     }());
+    
+    var StarShapeProperty = (function() {
+
+        function convertPolygonToPath(){
+            var numPts = Math.floor(this.pt.v);
+            var angle = Math.PI*2/numPts;
+            this.v.v.length = numPts;
+            this.v.i.length = numPts;
+            this.v.o.length = numPts;
+            var rad = this.or.v;
+            var roundness = this.os.v;
+            var perimSegment = 2*Math.PI*rad/(numPts*4);
+            var i, currentAng = -Math.PI/ 2;
+            var dir = this.data.d === 3 ? -1 : 1;
+            currentAng += this.r.v;
+            for(i=0;i<numPts;i+=1){
+                var x = rad * Math.cos(currentAng);
+                var y = rad * Math.sin(currentAng);
+                var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);
+                var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);
+                x +=  + this.p.v[0];
+                y +=  + this.p.v[1];
+                this.v.v[i] = [x,y];
+                this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];
+                this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];
+                currentAng += angle*dir;
+            }
+            this.numNodes = numPts;
+        }
+
+        function convertStarToPath() {
+            var numPts = Math.floor(this.pt.v)*2;
+            var angle = Math.PI*2/numPts;
+            this.v.v.length = numPts;
+            this.v.i.length = numPts;
+            this.v.o.length = numPts;
+            var longFlag = true;
+            var longRad = this.or.v;
+            var shortRad = this.ir.v;
+            var longRound = this.os.v;
+            var shortRound = this.is.v;
+            var longPerimSegment = 2*Math.PI*longRad/(numPts*2);
+            var shortPerimSegment = 2*Math.PI*shortRad/(numPts*2);
+            var i, rad,roundness,perimSegment, currentAng = -Math.PI/ 2;
+            currentAng += this.r.v;
+            var dir = this.data.d === 3 ? -1 : 1;
+            for(i=0;i<numPts;i+=1){
+                rad = longFlag ? longRad : shortRad;
+                roundness = longFlag ? longRound : shortRound;
+                perimSegment = longFlag ? longPerimSegment : shortPerimSegment;
+                var x = rad * Math.cos(currentAng);
+                var y = rad * Math.sin(currentAng);
+                var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);
+                var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);
+                x +=  + this.p.v[0];
+                y +=  + this.p.v[1];
+                this.v.v[i] = [x,y];
+                this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];
+                this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];
+                longFlag = !longFlag;
+                currentAng += angle*dir;
+            }
+            this.numNodes = numPts;
+        }
+
+        function processKeys() {
+            if(this.elem.globalData.frameId === this.frameId){
+                return;
+            }
+            this.mdf = false;
+            this.frameId = this.elem.globalData.frameId;
+            var i, len = this.dynamicProperties.length;
+
+            for(i=0;i<len;i+=1){
+                this.dynamicProperties[i].getValue();
+                if(this.dynamicProperties[i].mdf){
+                    this.mdf = true;
+                }
+            }
+            if(this.mdf){
+                this.convertToPath();
+            }
+        }
+
+        function getKeys(arr){
+            this.pt.getKeys(arr);
+            this.p.getKeys(arr);
+            this.r.getKeys(arr);
+            this.or.getKeys(arr);
+            this.os.getKeys(arr);
+            if(this.data.sy === 1){
+                this.ir.getKeys(arr);
+                this.is.getKeys(arr);
+            }
+        }
+
+        return function StarShapeProperty(elem,data) {
+            this.v = {
+                v: [],
+                i: [],
+                o: [],
+                c: true
+            };
+            this.elem = elem;
+            this.comp = elem.comp;
+            this.data = data;
+            this.frameId = -1;
+            this.d = data.d;
+            this.dynamicProperties = [];
+            this.mdf = false;
+            data.closed = true;
+            this.closed = true;
+            this.getValue = processKeys;
+            if(data.sy === 1){
+                this.ir = getProp(elem,data.ir,0,0,this.dynamicProperties);
+                this.is = getProp(elem,data.is,0,0.01,this.dynamicProperties);
+                this.convertToPath = convertStarToPath;
+            } else {
+                this.convertToPath = convertPolygonToPath;
+            }
+            this.getKeys = getKeys;
+            this.pt = getProp(elem,data.pt,0,0,this.dynamicProperties);
+            this.p = getProp(elem,data.p,1,0,this.dynamicProperties);
+            this.r = getProp(elem,data.r,0,degToRads,this.dynamicProperties);
+            this.or = getProp(elem,data.or,0,0,this.dynamicProperties);
+            this.os = getProp(elem,data.os,0,0.01,this.dynamicProperties);
+            if(this.dynamicProperties.length){
+                this.k = true;
+            }else{
+                this.convertToPath();
+            }
+        }
+    }());
 
     function getShapeProp(elem,data,type, arr, trims){
         var prop;
@@ -704,6 +837,8 @@
             prop = new RectShapeProperty(elem, data);
         }else if(type === 6){
             prop = new EllShapeProperty(elem, data);
+        }else if(type === 7){
+            prop = new StarShapeProperty(elem, data);
         }
         var hasTrims = false;
         if(trims){
diff --git a/extension/jsx/utils/shapeHelper.jsx b/extension/jsx/utils/shapeHelper.jsx
index 73d15e4..05125c0 100644
--- a/extension/jsx/utils/shapeHelper.jsx
+++ b/extension/jsx/utils/shapeHelper.jsx
@@ -6,6 +6,7 @@
         shape: 'sh',
         rect: 'rc',
         ellipse: 'el',
+        star: 'sr',
         fill: 'fl',
         stroke: 'st',
         merge: 'mm',
@@ -14,9 +15,12 @@
     };
 
     function getItemType(matchName) {
+        bm_eventDispatcher.log(matchName);
         switch (matchName) {
         case 'ADBE Vector Shape - Group':
             return shapeItemTypes.shape;
+        case 'ADBE Vector Shape - Star':
+            return shapeItemTypes.star;
         case 'ADBE Vector Shape - Rect':
             return shapeItemTypes.rect;
         case 'ADBE Vector Shape - Ellipse':
@@ -97,6 +101,21 @@
                     ob.s = bm_keyframeHelper.exportKeyframes(prop.property('Size'), frameRate);
                     ob.p = bm_keyframeHelper.exportKeyframes(prop.property('Position'), frameRate);
                     ob.r = bm_keyframeHelper.exportKeyframes(prop.property('Roundness'), frameRate);
+                } else if(itemType === shapeItemTypes.star && !isText) {
+                    ob = {};
+                    bm_generalUtils.iterateProperty(prop);
+                    ob.ty = itemType;
+                    ob.sy = prop.property("Type").value;
+                    ob.d = prop.property("Shape Direction").value;
+                    ob.pt = bm_keyframeHelper.exportKeyframes(prop.property('Points'), frameRate);
+                    ob.p = bm_keyframeHelper.exportKeyframes(prop.property('Position'), frameRate);
+                    ob.r = bm_keyframeHelper.exportKeyframes(prop.property('Rotation'), frameRate);
+                    if(ob.sy === 1) {
+                        ob.ir = bm_keyframeHelper.exportKeyframes(prop.property('Inner Radius'), frameRate);
+                        ob.is = bm_keyframeHelper.exportKeyframes(prop.property('Inner Roundness'), frameRate);
+                    }
+                    ob.or = bm_keyframeHelper.exportKeyframes(prop.property('Outer Radius'), frameRate);
+                    ob.os = bm_keyframeHelper.exportKeyframes(prop.property('Outer Roundness'), frameRate);
                 } else if (itemType === shapeItemTypes.ellipse) {
                     ob = {};
                     ob.d = prop.property("Shape Direction").value;
@@ -262,6 +281,8 @@
             shapeProp = PropertyFactory.getShapeProp(data, shapeData, 5, [], []);
         } else if (shapeData.ty === 'el') {
             shapeProp = PropertyFactory.getShapeProp(data, shapeData, 6, [], []);
+        } else if (shapeData.ty === 'sr') {
+            shapeProp = PropertyFactory.getShapeProp(data, shapeData, 7, [], []);
         }
         shapeProp.getKeys(arr);
         var j, jLen = arr.length, matr = new Matrix();
@@ -321,7 +342,7 @@
         matr = matr.concat(matrices);
         strk = strk.concat(strokes);
         for (i = len - 1; i >= 0; i -= 1) {
-            if (arr[i].ty === 'sh' || arr[i].ty === 'el' || arr[i].ty === 'rc') {
+            if (arr[i].ty === 'sh' || arr[i].ty === 'el' || arr[i].ty === 'rc' || arr[i].ty === 'sr') {
                 setBounds(arr[i], bounds, matr, strk, data);
             } else if (arr[i].ty === 'gr') {
                 completeShapes(arr[i].it, bounds, matr, strk, data);
diff --git a/player/index.html b/player/index.html
index 4c6f63b..7ccadeb 100644
--- a/player/index.html
+++ b/player/index.html
@@ -60,14 +60,12 @@
     <script src="js/elements/CompElement.js"></script>
     <script src="js/elements/ImageElement.js"></script>
     <script src="js/elements/ShapeElement.js"></script>
-    <script src="js/elements/ShapeItemElement.js"></script>
     <script src="js/elements/SolidElement.js"></script>
     <script src="js/elements/canvasElements/CVBaseElement.js"></script>
     <script src="js/elements/canvasElements/CVCompElement.js"></script>
     <script src="js/elements/canvasElements/CVImageElement.js"></script>
     <script src="js/elements/canvasElements/CVMaskElement.js"></script>
     <script src="js/elements/canvasElements/CVShapeElement.js"></script>
-    <script src="js/elements/canvasElements/CVShapeItemElement.js"></script>
     <script src="js/elements/canvasElements/CVSolidElement.js"></script>
     <script src="js/elements/canvasElements/CVTextElement.js"></script>
     <script src="js/elements/htmlElements/HBaseElement.js"></script>
diff --git a/player/js/animation/AnimationItem.js b/player/js/animation/AnimationItem.js
index 7998cf5..2f65571 100644
--- a/player/js/animation/AnimationItem.js
+++ b/player/js/animation/AnimationItem.js
@@ -219,7 +219,7 @@
     this.firstFrame = Math.round(this.animationData.ip);
     this.frameMult = this.animationData.fr / 1000;
     /*
-    this.firstFrame = 0;
+    this.firstFrame = 25;
     this.totalFrames = 1;
     this.animationData.tf = 1;
     //this.frameMult = 1/100;
diff --git a/player/js/elements/ShapeElement.js b/player/js/elements/ShapeElement.js
index f172e3d..cc02e8b 100644
--- a/player/js/elements/ShapeElement.js
+++ b/player/js/elements/ShapeElement.js
@@ -118,7 +118,7 @@
                 },
                 elements: []
             };
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el'){
+        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
             data[i] = {
                 elements : [],
                 styles : [],
@@ -129,6 +129,8 @@
                 ty = 5;
             }else if(arr[i].ty == 'el'){
                 ty = 6;
+            }else if(arr[i].ty == 'sr'){
+                ty = 7;
             }
             if(addedTrims.length){
                 arr[i].trimmed = true;
@@ -247,7 +249,7 @@
             }else{
                 groupTransform.opacity = groupTransform.op.o;
             }
-        }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc'){
+        }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc' || items[i].ty == 'sr'){
             this.renderPath(items[i],data[i],groupTransform);
         }else if(items[i].ty == 'fl'){
             this.renderFill(items[i],data[i],groupTransform);
diff --git a/player/js/elements/canvasElements/CVShapeElement.js b/player/js/elements/canvasElements/CVShapeElement.js
index 8040b99..d5da054 100644
--- a/player/js/elements/canvasElements/CVShapeElement.js
+++ b/player/js/elements/canvasElements/CVShapeElement.js
@@ -84,7 +84,7 @@
                 },
                 elements: []
             };
-        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el'){
+        }else if(arr[i].ty == 'sh' || arr[i].ty == 'rc' || arr[i].ty == 'el' || arr[i].ty == 'sr'){
             data[i] = {
                 nodes:[],
                 trNodes:[],
@@ -95,6 +95,8 @@
                 ty = 5;
             }else if(arr[i].ty == 'el'){
                 ty = 6;
+            }else if(arr[i].ty == 'sr'){
+                ty = 7;
             }
             if(addedTrims.length){
                 arr[i].trimmed = true;
@@ -179,7 +181,7 @@
             }else{
                 groupTransform.opacity = groupTransform.op.o;
             }
-        }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc'){
+        }else if(items[i].ty == 'sh' || items[i].ty == 'el' || items[i].ty == 'rc' || items[i].ty == 'sr'){
             this.renderPath(items[i],data[i],groupTransform);
         }else if(items[i].ty == 'fl'){
             this.renderFill(items[i],data[i],groupTransform);
diff --git a/player/js/utils/PropertyFactory.js b/player/js/utils/PropertyFactory.js
index feb334c..30a97ea 100644
--- a/player/js/utils/PropertyFactory.js
+++ b/player/js/utils/PropertyFactory.js
@@ -80,7 +80,7 @@
                                 }
                             }
                             break;
-                        }else if(distanceInLine > addedLength && distanceInLine < addedLength + bezierData.points[j+1].partialLength){
+                        }else if(distanceInLine >= addedLength && distanceInLine < addedLength + bezierData.points[j+1].partialLength){
                             segmentPerc = (distanceInLine-addedLength)/(bezierData.points[j+1].partialLength);
                             kLen = bezierData.points[j].point.length;
                             for(k=0;k<kLen;k+=1){
@@ -103,10 +103,6 @@
                 }
             }else{
                 var outX,outY,inX,inY, isArray = false, keyValue;
-                if(!keyData.s){
-                    console.log(this.keyframes);
-                    console.log(keyData);
-                }
                 len = keyData.s.length;
                 for(i=0;i<len;i+=1){
                     if(keyData.h !== 1){
@@ -328,7 +324,6 @@
     }
 
     function KeyframedMultidimensionalProperty(elem, data, mult){
-        console.log(data);
         var i, len = data.k.length;
         var s, e,to,ti;
         for(i=0;i<len-1;i+=1){
@@ -337,7 +332,8 @@
                 e = data.k[i].e;
                 to = data.k[i].to;
                 ti = data.k[i].ti;
-                if(bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],s[0] + to[0],s[1] + to[1],s[2] + to[2]) && bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],e[0] + ti[0],e[1] + ti[1],e[2] + ti[2])){
+                if((s.length == 2 && bez.pointOnLine2D(s[0],s[1],e[0],e[1],s[0] + to[0],s[1] + to[1]) && bez.pointOnLine2D(s[0],s[1],e[0],e[1],e[0] + ti[0],e[1] + ti[1])) || (bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],s[0] + to[0],s[1] + to[1],s[2] + to[2]) && bez.pointOnLine3D(s[0],s[1],s[2],e[0],e[1],e[2],e[0] + ti[0],e[1] + ti[1],e[2] + ti[2]))){
+
                     data.k[i].to = null;
                     data.k[i].ti = null;
                 }
@@ -544,6 +540,10 @@
         return p;
     }
 
+    function getShapeValue(){
+        return this.v;
+    }
+
     function ShapeProperty(elem, data, type){
         this.comp = elem.comp;
         this.k = false;
@@ -552,6 +552,7 @@
         this.numNodes = type === 3 ? data.pt.k.v.length : data.ks.k.v.length;
         this.v = type === 3 ? data.pt.k : data.ks.k;
         var shapeData = type === 3 ? data.pt : data.ks;
+        this.getValue = getShapeValue;
         this.pv = this.v;
         checkExpressions.bind(this)(elem,shapeData);
     }
@@ -643,7 +644,7 @@
             }
         }
 
-        return function(elem,data) {
+        return function EllShapeProperty(elem,data) {
             this.v = {
                 v: new Array(4),
                 i: new Array(4),
@@ -671,6 +672,126 @@
         }
     }());
 
+    var StarShapeProperty = (function() {
+
+        function convertPolygonToPath(){
+            var numPts = Math.floor(this.pt.v);
+            var angle = Math.PI*2/numPts;
+            this.v.v.length = numPts;
+            this.v.i.length = numPts;
+            this.v.o.length = numPts;
+            var rad = this.or.v;
+            var roundness = this.os.v;
+            var perimSegment = 2*Math.PI*rad/(numPts*4);
+            var i, currentAng = -Math.PI/ 2;
+            var dir = this.data.d === 3 ? -1 : 1;
+            currentAng += this.r.v;
+            for(i=0;i<numPts;i+=1){
+                var x = rad * Math.cos(currentAng);
+                var y = rad * Math.sin(currentAng);
+                var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);
+                var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);
+                x +=  + this.p.v[0];
+                y +=  + this.p.v[1];
+                this.v.v[i] = [x,y];
+                this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];
+                this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];
+                currentAng += angle*dir;
+            }
+            this.numNodes = numPts;
+        }
+
+        function convertStarToPath() {
+            var numPts = Math.floor(this.pt.v)*2;
+            var angle = Math.PI*2/numPts;
+            this.v.v.length = numPts;
+            this.v.i.length = numPts;
+            this.v.o.length = numPts;
+            var longFlag = true;
+            var longRad = this.or.v;
+            var shortRad = this.ir.v;
+            var longRound = this.os.v;
+            var shortRound = this.is.v;
+            var longPerimSegment = 2*Math.PI*longRad/(numPts*2);
+            var shortPerimSegment = 2*Math.PI*shortRad/(numPts*2);
+            var i, rad,roundness,perimSegment, currentAng = -Math.PI/ 2;
+            currentAng += this.r.v;
+            var dir = this.data.d === 3 ? -1 : 1;
+            for(i=0;i<numPts;i+=1){
+                rad = longFlag ? longRad : shortRad;
+                roundness = longFlag ? longRound : shortRound;
+                perimSegment = longFlag ? longPerimSegment : shortPerimSegment;
+                var x = rad * Math.cos(currentAng);
+                var y = rad * Math.sin(currentAng);
+                var ox = x === 0 && y === 0 ? 0 : y/Math.sqrt(x*x + y*y);
+                var oy = x === 0 && y === 0 ? 0 : -x/Math.sqrt(x*x + y*y);
+                x +=  + this.p.v[0];
+                y +=  + this.p.v[1];
+                this.v.v[i] = [x,y];
+                this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir];
+                this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir];
+                longFlag = !longFlag;
+                currentAng += angle*dir;
+            }
+            this.numNodes = numPts;
+        }
+
+        function processKeys() {
+            if(this.elem.globalData.frameId === this.frameId){
+                return;
+            }
+            this.mdf = false;
+            this.frameId = this.elem.globalData.frameId;
+            var i, len = this.dynamicProperties.length;
+
+            for(i=0;i<len;i+=1){
+                this.dynamicProperties[i].getValue();
+                if(this.dynamicProperties[i].mdf){
+                    this.mdf = true;
+                }
+            }
+            if(this.mdf){
+                this.convertToPath();
+            }
+        }
+
+        return function StarShapeProperty(elem,data) {
+            this.v = {
+                v: [],
+                i: [],
+                o: [],
+                c: true
+            };
+            this.elem = elem;
+            this.comp = elem.comp;
+            this.data = data;
+            this.frameId = -1;
+            this.d = data.d;
+            this.dynamicProperties = [];
+            this.mdf = false;
+            data.closed = true;
+            this.closed = true;
+            this.getValue = processKeys;
+            if(data.sy === 1){
+                this.ir = getProp(elem,data.ir,0,0,this.dynamicProperties);
+                this.is = getProp(elem,data.is,0,0.01,this.dynamicProperties);
+                this.convertToPath = convertStarToPath;
+            } else {
+                this.convertToPath = convertPolygonToPath;
+            }
+            this.pt = getProp(elem,data.pt,0,0,this.dynamicProperties);
+            this.p = getProp(elem,data.p,1,0,this.dynamicProperties);
+            this.r = getProp(elem,data.r,0,degToRads,this.dynamicProperties);
+            this.or = getProp(elem,data.or,0,0,this.dynamicProperties);
+            this.os = getProp(elem,data.os,0,0.01,this.dynamicProperties);
+            if(this.dynamicProperties.length){
+                this.k = true;
+            }else{
+                this.convertToPath();
+            }
+        }
+    }());
+
     var RectShapeProperty = (function() {
         function processKeys(frameNum){
             if(this.elem.globalData.frameId === this.frameId){
@@ -766,7 +887,7 @@
             }
         }
 
-        return function(elem,data) {
+        return function RectShapeProperty(elem,data) {
             this.v = {
                 v: new Array(8),
                 i: new Array(8),
@@ -835,7 +956,7 @@
                 this.oValue = o;
             }
         }
-        return function(elem,data){
+        return function TrimProperty(elem,data){
             this.elem = elem;
             this.frameId = -1;
             this.dynamicProperties = [];
@@ -1056,6 +1177,8 @@
             prop = new RectShapeProperty(elem, data);
         }else if(type === 6){
             prop = new EllShapeProperty(elem, data);
+        }else if(type === 7){
+            prop = new StarShapeProperty(elem, data);
         }
         var hasTrims = false;
         if(trims){
diff --git a/player/js/utils/bez.js b/player/js/utils/bez.js
index ad04cbb..a48abce 100644
--- a/player/js/utils/bez.js
+++ b/player/js/utils/bez.js
@@ -4,22 +4,12 @@
     var math = Math;
 
     function pointOnLine2D(x1,y1, x2,y2, x3,y3){
-        return bm_abs(((x2 - x1) * (y3 - y1)) - ((x3 - x1) * (y2 - y1))) < 0.00001;
+        var det1 = (x1*y2) + (y1*x3) + (x2*y3) - (x3*y2) - (y3*x1) - (x2*y1);
+        return det1 > -0.0001 && det1 < 0.0001;
     }
 
     function pointOnLine3D(x1,y1,z1, x2,y2,z2, x3,y3,z3){
-        /* x1 y1 1   x1 y1
-           x2 y2 1   x2 y2
-           x3 y3 1   x3 y3
-
-         x1 z1 1
-         x2 z2 1
-         x3 z3 1
-
-         */
-        var det1 = (x1*y2) + (y1*x3) + (x2*y3) - (x3*y2) - (y3*x1) - (x2*y1);
-        var det2 = (x1*z2) + (z1*x3) + (x2*z3) - (x3*z2) - (z3*x1) - (x2*z1);
-        return det1 > -0.0001 && det1 < 0.00001 && det2 > -0.00001 && det2 < 0.00001;
+        return pointOnLine2D(x1,y1, x2,y2, x3,y3) && pointOnLine2D(x1,z1, x2,z2, x3,z3);
     }
 
     function getEasingCurve(aa,bb,cc,dd,encodedFuncName) {
@@ -75,6 +65,7 @@
                 segments: []
             };
             if((pt1[0] != pt2[0] || pt1[1] != pt2[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt3[0],pt3[1]) && pointOnLine2D(pt1[0],pt1[1],pt2[0],pt2[1],pt4[0],pt4[1])){
+                console.log('asdasd');
                 curveSegments = 2;
             }
             len = pt3.length;