function ExpressionValue(elementProp, mult, type) {
  mult = mult || 1;
  var expressionValue, arrayValue;

  if (elementProp.k) {
    elementProp.getValue();
  }
  var i, len, arrValue, val;
  if (type) {
    if(type === 'color') {
      len = 4;
      expressionValue = createTypedArray('float32', len);
      arrValue = createTypedArray('float32', len);
      for (i = 0; i < len; i += 1) {
        expressionValue[i] = arrValue[i] = (i < 3) ? elementProp.v[i] * mult : 1;
      }
      expressionValue.value = arrValue;
    }
  } else if (elementProp.propType === 'unidimensional') {
    val = elementProp.v * mult;
    expressionValue = new Number(val);
    expressionValue.value = val;
  } else {
    len = elementProp.pv.length;
    expressionValue = createTypedArray('float32', len);
    arrValue = createTypedArray('float32', len);
    for (i = 0; i < len; i += 1) {
      expressionValue[i] = arrValue[i] = elementProp.v[i] * mult;
    }
    expressionValue.value = arrValue;
  }
    
  expressionValue.numKeys = elementProp.keyframes ? elementProp.keyframes.length : 0;
  expressionValue.key = function (pos) {
    if (!expressionValue.numKeys) {
      return 0;
    } else {
      return elementProp.keyframes[pos - 1].t;
    }
  };
  expressionValue.valueAtTime = elementProp.getValueAtTime;
  expressionValue.speedAtTime = elementProp.getSpeedAtTime;
  expressionValue.velocityAtTime = elementProp.getVelocityAtTime;
  expressionValue.propertyGroup = elementProp.propertyGroup;
  Object.defineProperty(expressionValue, 'velocity', {
    get: function () {
      return elementProp.getVelocityAtTime(elementProp.comp.currentFrame);
    },
  });
  return expressionValue;
};
