```json
{
  "sym_variables": [
    ("x0", "milkshakes"),
    ("x1", "bowls of cereal"),
    ("x2", "hot dogs"),
    ("x3", "kale salads"),
    ("x4", "ravioli")
  ],
  "objective_function": "8.26*x0**2 + 6.29*x0*x1 + 5.17*x0*x2 + 9.02*x0*x3 + 4.68*x0*x4 + 6.36*x1**2 + 4.2*x1*x2 + 6.29*x1*x3 + 3.33*x1*x4 + 8.22*x2**2 + 7.14*x2*x3 + 9.06*x2*x4 + 3.84*x3**2 + 7.38*x3*x4 + 8.11*x4**2 + 5.69*x0 + 5.73*x1 + 9.5*x2 + 9.78*x3 + 3.99*x4",
  "constraints": [
    "14.32*x0 + 16.47*x1 + 19.27*x2 + 16.95*x3 + 19.77*x4 <= 378",  // tastiness rating
    "6.96*x0 + 14.12*x1 + 8.59*x2 + 9.72*x3 + 14.01*x4 <= 415",  // umami index
    "19.27*x2 + 16.95*x3 >= 72",
    "16.47*x1 + 19.77*x4 >= 75",
    "6.96*x0 + 14.12*x1 + 9.72*x3 >= 76",
    "(14.12*x1)**2 + (9.72*x3)**2 + (14.01*x4)**2 >= 76",
    "6.96*x0 + 14.12*x1 + 9.72*x3 >= 55",
    "(14.12*x1)**2 + (9.72*x3)**2 + (14.01*x4)**2 >= 55",
    "14.32*x0 + 19.77*x4 <= 300",
    "(14.32*x0)**2 + (16.47*x1)**2 <= 122",
    "16.47*x1 + 19.27*x2 <= 79",
    "(14.32*x0)**2 + (16.95*x3)**2 <= 205",
    "(16.95*x3)**2 + (19.77*x4)**2 <= 186",
    "14.32*x0 + 16.47*x1 + 19.27*x2 + 16.95*x3 + 19.77*x4 <= 186",
    "(9.72*x3)**2 + (14.01*x4)**2 <= 195",
    "(6.96*x0)**2 + (8.59*x2)**2 <= 415",
    "6.96*x0 + 9.72*x3 <= 116",
    "8.59*x2 + 9.72*x3 <= 187",
    "(14.12*x1)**2 + (14.01*x4)**2 <= 284",
    "6.96*x0 + 14.12*x1 + 14.01*x4 <= 285",
    "6.96*x0 + 8.59*x2 + 14.01*x4 <= 224",
    "(14.12*x1)**2 + (8.59*x2)**2 + (14.01*x4)**2 <= 197",
    "6.96*x0 + 14.12*x1 + 9.72*x3 <= 323",
    "6.96*x0 + 14.12*x1 + 8.59*x2 + 9.72*x3 + 14.01*x4 <= 323"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
x = m.addVars(5, lb=0, names=['milkshakes', 'bowls_of_cereal', 'hot_dogs', 'kale_salads', 'ravioli'])


# Set objective function
objective = 8.26*x[0]**2 + 6.29*x[0]*x[1] + 5.17*x[0]*x[2] + 9.02*x[0]*x[3] + 4.68*x[0]*x[4] + 6.36*x[1]**2 + 4.2*x[1]*x[2] + 6.29*x[1]*x[3] + 3.33*x[1]*x[4] + 8.22*x[2]**2 + 7.14*x[2]*x[3] + 9.06*x[2]*x[4] + 3.84*x[3]**2 + 7.38*x[3]*x[4] + 8.11*x[4]**2 + 5.69*x[0] + 5.73*x[1] + 9.5*x[2] + 9.78*x[3] + 3.99*x[4]
m.setObjective(objective, gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(14.32*x[0] + 16.47*x[1] + 19.27*x[2] + 16.95*x[3] + 19.77*x[4] <= 378)
m.addConstr(6.96*x[0] + 14.12*x[1] + 8.59*x[2] + 9.72*x[3] + 14.01*x[4] <= 415)
m.addConstr(19.27*x[2] + 16.95*x[3] >= 72)
m.addConstr(16.47*x[1] + 19.77*x[4] >= 75)
m.addConstr(6.96*x[0] + 14.12*x[1] + 9.72*x[3] >= 76)
m.addConstr((14.12*x[1])**2 + (9.72*x[3])**2 + (14.01*x[4])**2 >= 76)
m.addConstr(6.96*x[0] + 14.12*x[1] + 9.72*x[3] >= 55)
m.addConstr((14.12*x[1])**2 + (9.72*x[3])**2 + (14.01*x[4])**2 >= 55)
m.addConstr(14.32*x[0] + 19.77*x[4] <= 300)
m.addConstr((14.32*x[0])**2 + (16.47*x[1])**2 <= 122)
m.addConstr(16.47*x[1] + 19.27*x[2] <= 79)
m.addConstr((14.32*x[0])**2 + (16.95*x[3])**2 <= 205)
m.addConstr((16.95*x[3])**2 + (19.77*x[4])**2 <= 186)
m.addConstr(14.32*x[0] + 16.47*x[1] + 19.27*x[2] + 16.95*x[3] + 19.77*x[4] <= 186)
m.addConstr((9.72*x[3])**2 + (14.01*x[4])**2 <= 195)
m.addConstr((6.96*x[0])**2 + (8.59*x[2])**2 <= 415)
m.addConstr(6.96*x[0] + 9.72*x[3] <= 116)
m.addConstr(8.59*x[2] + 9.72*x[3] <= 187)
m.addConstr((14.12*x[1])**2 + (14.01*x[4])**2 <= 284)
m.addConstr(6.96*x[0] + 14.12*x[1] + 14.01*x[4] <= 285)
m.addConstr(6.96*x[0] + 8.59*x[2] + 14.01*x[4] <= 224)
m.addConstr((14.12*x[1])**2 + (8.59*x[2])**2 + (14.01*x[4])**2 <= 197)
m.addConstr(6.96*x[0] + 14.12*x[1] + 9.72*x[3] <= 323)
m.addConstr(6.96*x[0] + 14.12*x[1] + 8.59*x[2] + 9.72*x[3] + 14.01*x[4] <= 323)


# 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('Model is infeasible')
else:
    print('Optimization ended with status %d' % m.status)

```
