function ShapeTransformManager() {
    this.sequences = {};
    this.sequenceList = [];
    this.transform_key_count = 0;
}

ShapeTransformManager.prototype = {
    addTransformSequence: function(transforms) {
        var i, len = transforms.length;
        var key = '_';
        for(i = 0; i < len; i += 1) {
            key += transforms[i].transform.key + '_';
        }
        var sequence = this.sequences[key];
        if(!sequence) {
            sequence = {
                transforms: [].concat(transforms),
                finalTransform: new Matrix(),
                _mdf: false
            };
            this.sequences[key] = sequence;
            this.sequenceList.push(sequence);
        }
        return sequence;
    },
    processSequence: function(sequence, isFirstFrame) {
        var i = 0, len = sequence.transforms.length, _mdf = isFirstFrame;
        while (i < len && !isFirstFrame) {
            if (sequence.transforms[i].transform.mProps._mdf) {
                _mdf = true;
                break;
            }
            i += 1
        }
        if (_mdf) {
            var props;
            sequence.finalTransform.reset();
            for (i = len - 1; i >= 0; i -= 1) {
                props = sequence.transforms[i].transform.mProps.v.props;
                sequence.finalTransform.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]);
            }
        }
        sequence._mdf = _mdf;
        
    },
    processSequences: function(isFirstFrame) {
        var i, len = this.sequenceList.length;
        for (i = 0; i < len; i += 1) {
            this.processSequence(this.sequenceList[i], isFirstFrame);
        }

    },
    getNewKey: function() {
        return '_' + this.transform_key_count++;
    }
}
