def convert_add(add):
    if add.ADD():
        lh = convert_add(add.additive(0))
        rh = convert_add(add.additive(1))
        if (lh.is_Matrix or rh.is_Matrix):
            return mat_add_flat(lh, rh)
        else:
            return add_flat(lh, rh)
    elif add.SUB():
        lh = convert_add(add.additive(0))
        rh = convert_add(add.additive(1))
        if (lh.is_Matrix or rh.is_Matrix):
            return mat_add_flat(lh, mat_mul_flat((- 1), rh))
        else:
            if ((not rh.is_Matrix) and rh.func.is_Number):
                rh = (- rh)
            else:
                rh = mul_flat((- 1), rh)
            return add_flat(lh, rh)
    else:
        return convert_mp(add.mp())
def convert_add(add):
    if add.ADD():
        lh = convert_add(add.additive(0))
        rh = convert_add(add.additive(1))
        if (lh.is_Matrix or rh.is_Matrix):
            return mat_add_flat(lh, rh)
        else:
            return add_flat(lh, rh)
    elif add.SUB():
        lh = convert_add(add.additive(0))
        rh = convert_add(add.additive(1))
        if (lh.is_Matrix or rh.is_Matrix):
            return mat_add_flat(lh, mat_mul_flat((- 1), rh))
        else:
            if ((not rh.is_Matrix) and rh.func.is_Number):
                rh = (- rh)
            else:
                rh = mul_flat((- 1), rh)
            return add_flat(lh, rh)
    else:
        return convert_mp(add.mp())