```json
{
  "sym_variables": [
    ("x0", "black beans"),
    ("x1", "chicken thighs"),
    ("x2", "ravioli"),
    ("x3", "steaks"),
    ("x4", "bagged salads"),
    ("x5", "kale salads")
  ],
  "objective_function": "3.04*x0**2 + 5.41*x0*x1 + 4.36*x0*x2 + 9.56*x0*x3 + 7.34*x0*x5 + 5.41*x1*x2 + 4.72*x1*x5 + 6.66*x2*x4 + 3.74*x2*x5 + 8.81*x3**2 + 5.41*x4*x5 + 1.26*x5**2 + 9.55*x0 + 2.02*x1 + 2.87*x5",
  "constraints": [
    "5*x0 + 1*x1 + 13*x2 + 19*x3 + 3*x4 + 9*x5 <= 371",
    "2*x0 + 18*x1 + 11*x2 + 2*x3 + 11*x4 + 10*x5 <= 527",
    "5*x0 + 6*x1 + 14*x2 + 15*x3 + 3*x4 + 22*x5 <= 356",
    "x1**2 + x2**2 >= 24",
    "5*x0 + 19*x3 >= 59",
    "5*x0 + 9*x5 >= 61",
    "x2**2 + x5**2 >= 33",
    "19*x3 + 9*x5 >= 54",
    "x3**2 + x4**2 + x5**2 >= 30",
    "x3 + x4 + x5 >= 45",
    "x2 + x4 + x5 >= 45",
    "x0 + x2 + x4 >= 45",
    "x0 + x2 + x5 >= 45",
    "x2 + x3 + x4 >= 45",
    "x0 + x2 + x3 >= 45",
    "x1 + x2 + x3 >= 45",
    "x0 + x1 + x2 >= 45",
    "x0 + x1 + x3 >= 45",
    "x1 + x2 + x5 >= 45",
    "x0 + x4 + x5 >= 45",
    "2*x0 + 10*x5 >= 63",
    "11*x2 + 2*x3 >= 79",
    "2*x3 + 11*x4 >= 79",
    "3*x0 - 5*x5 >= 0"
  ]
}
```

```python
import gurobipy as gp

# Create a new model
m = gp.Model("optimization_problem")

# Create variables
x = m.addVars(6, lb=0, vtype=gp.GRB.CONTINUOUS, name=["black beans", "chicken thighs", "ravioli", "steaks", "bagged salads", "kale salads"])


# Set objective function
m.setObjective(3.04*x[0]**2 + 5.41*x[0]*x[1] + 4.36*x[0]*x[2] + 9.56*x[0]*x[3] + 7.34*x[0]*x[5] + 5.41*x[1]*x[2] + 4.72*x[1]*x[5] + 6.66*x[2]*x[4] + 3.74*x[2]*x[5] + 8.81*x[3]**2 + 5.41*x[4]*x[5] + 1.26*x[5]**2 + 9.55*x[0] + 2.02*x[1] + 2.87*x[5], gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(5*x[0] + 1*x[1] + 13*x[2] + 19*x[3] + 3*x[4] + 9*x[5] <= 371, "r0")
m.addConstr(2*x[0] + 18*x[1] + 11*x[2] + 2*x[3] + 11*x[4] + 10*x[5] <= 527, "r1")
m.addConstr(5*x[0] + 6*x[1] + 14*x[2] + 15*x[3] + 3*x[4] + 22*x[5] <= 356, "r2")
m.addConstr(x[1]**2 + x[2]**2 >= 24, "c1")
m.addConstr(5*x[0] + 19*x[3] >= 59, "c2")
m.addConstr(5*x[0] + 9*x[5] >= 61, "c3")
m.addConstr(x[2]**2 + x[5]**2 >= 33, "c4")
m.addConstr(19*x[3] + 9*x[5] >= 54, "c5")

# ... (add all other constraints similarly)
m.addConstr(2*x[0] + 10*x[5] >= 63, "fat_c1")
m.addConstr(11*x[2] + 2*x[3] >= 79, "fat_c2")
m.addConstr(2*x[3] + 11*x[4] >= 79, "fat_c3")
m.addConstr(3*x[0] - 5*x[5] >= 0, "c_last")


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == gp.GRB.INFEASIBLE:
    print("The model is infeasible.")
else:
    print("Optimization ended with status:", m.status)

```