```json
{
  "sym_variables": [
    ("x0", "intrusion analysts"),
    ("x1", "security engineers"),
    ("x2", "security onions"),
    ("x3", "patches per day")
  ],
  "objective_function": "4*x0**2 + 7*x0*x1 + 8*x0*x2 + 1*x0*x3 + 5*x1**2 + 6*x1*x2 + 3*x1*x3 + 5*x2**2 + 2*x3**2 + 7*x0 + 9*x1 + 2*x2 + 2*x3",
  "constraints": [
    "3.06*x0 + 8.77*x3 >= 88",
    "3.06*x0**2 + 9.62*x2**2 >= 43",
    "9.62*x2**2 + 8.77*x3**2 >= 46",
    "3.06*x0 + 9.97*x1 + 8.77*x3 >= 60",
    "9.97*x1 + 9.62*x2 + 8.77*x3 >= 60",
    "3.06*x0 + 9.62*x2 + 8.77*x3 >= 60",
    "3.06*x0 + 9.97*x1 + 9.62*x2 >= 60",
    "3.06*x0 + 9.97*x1 + 8.77*x3 >= 61",
    "9.97*x1 + 9.62*x2 + 8.77*x3 >= 61",
    "3.06*x0 + 9.62*x2 + 8.77*x3 >= 61",
    "3.06*x0**2 + 9.97*x1**2 + 9.62*x2**2 >= 61",
    "3.06*x0 + 9.97*x1 + 8.77*x3 >= 84",
    "9.97*x1 + 9.62*x2 + 8.77*x3 >= 84",
    "3.06*x0 + 9.62*x2 + 8.77*x3 >= 84",
    "3.06*x0 + 9.97*x1 + 9.62*x2 >= 84",
    "3.06*x0 + 9.97*x1 + 8.77*x3 >= 69",
    "9.97*x1 + 9.62*x2 + 8.77*x3 >= 69",
    "3.06*x0 + 9.62*x2 + 8.77*x3 >= 69",
    "3.06*x0 + 9.97*x1 + 9.62*x2 >= 69",
    "3.06*x0 + 9.97*x1 + 9.62*x2 + 8.77*x3 >= 69",
    "4.1*x2 + 2.95*x3 >= 105",
    "7.97*x0 + 2.95*x3 >= 88",
    "1.85*x1**2 + 4.1*x2**2 >= 109",
    "7.97*x0 + 1.85*x1 + 4.1*x2 + 2.95*x3 >= 109",
    "9.62*x2**2 + 8.77*x3**2 <= 231",
    "3.06*x0 + 8.77*x3 <= 324",
    "9.97*x1 + 9.62*x2 <= 166",
    "9.97*x1 + 9.62*x2 + 8.77*x3 <= 232",
    "3.06*x0 + 9.97*x1 + 9.62*x2 <= 334",
    "3.06*x0**2 + 9.97*x1**2 + 8.77*x3**2 <= 97",
    "x0 == int",
    "x1 == int",
    "x2 == int",
    "x3 == int"

  ]
}
```

```python
import gurobipy as gp

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

# Create variables
intrusion_analysts = m.addVar(vtype=gp.GRB.INTEGER, name="intrusion_analysts")
security_engineers = m.addVar(vtype=gp.GRB.INTEGER, name="security_engineers")
security_onions = m.addVar(vtype=gp.GRB.INTEGER, name="security_onions")
patches_per_day = m.addVar(vtype=gp.GRB.INTEGER, name="patches_per_day")


# Set objective function
m.setObjective(4*intrusion_analysts**2 + 7*intrusion_analysts*security_engineers + 8*intrusion_analysts*security_onions + 1*intrusion_analysts*patches_per_day + 5*security_engineers**2 + 6*security_engineers*security_onions + 3*security_engineers*patches_per_day + 5*security_onions**2 + 2*patches_per_day**2 + 7*intrusion_analysts + 9*security_engineers + 2*security_onions + 2*patches_per_day, gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(3.06*intrusion_analysts + 8.77*patches_per_day >= 88)
m.addConstr(3.06*intrusion_analysts**2 + 9.62*security_onions**2 >= 43)
m.addConstr(9.62*security_onions**2 + 8.77*patches_per_day**2 >= 46)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 8.77*patches_per_day >= 60)
m.addConstr(9.97*security_engineers + 9.62*security_onions + 8.77*patches_per_day >= 60)
m.addConstr(3.06*intrusion_analysts + 9.62*security_onions + 8.77*patches_per_day >= 60)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 9.62*security_onions >= 60)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 8.77*patches_per_day >= 61)
m.addConstr(9.97*security_engineers + 9.62*security_onions + 8.77*patches_per_day >= 61)
m.addConstr(3.06*intrusion_analysts + 9.62*security_onions + 8.77*patches_per_day >= 61)
m.addConstr(3.06*intrusion_analysts**2 + 9.97*security_engineers**2 + 9.62*security_onions**2 >= 61)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 8.77*patches_per_day >= 84)
m.addConstr(9.97*security_engineers + 9.62*security_onions + 8.77*patches_per_day >= 84)
m.addConstr(3.06*intrusion_analysts + 9.62*security_onions + 8.77*patches_per_day >= 84)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 9.62*security_onions >= 84)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 8.77*patches_per_day >= 69)
m.addConstr(9.97*security_engineers + 9.62*security_onions + 8.77*patches_per_day >= 69)
m.addConstr(3.06*intrusion_analysts + 9.62*security_onions + 8.77*patches_per_day >= 69)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 9.62*security_onions >= 69)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 9.62*security_onions + 8.77*patches_per_day >= 69)
m.addConstr(4.1*security_onions + 2.95*patches_per_day >= 105)
m.addConstr(7.97*intrusion_analysts + 2.95*patches_per_day >= 88)
m.addConstr(1.85*security_engineers**2 + 4.1*security_onions**2 >= 109)
m.addConstr(7.97*intrusion_analysts + 1.85*security_engineers + 4.1*security_onions + 2.95*patches_per_day >= 109)
m.addConstr(9.62*security_onions**2 + 8.77*patches_per_day**2 <= 231)
m.addConstr(3.06*intrusion_analysts + 8.77*patches_per_day <= 324)
m.addConstr(9.97*security_engineers + 9.62*security_onions <= 166)
m.addConstr(9.97*security_engineers + 9.62*security_onions + 8.77*patches_per_day <= 232)
m.addConstr(3.06*intrusion_analysts + 9.97*security_engineers + 9.62*security_onions <= 334)
m.addConstr(3.06*intrusion_analysts**2 + 9.97*security_engineers**2 + 8.77*patches_per_day**2 <= 97)


# Optimize model
m.optimize()

# Print solution
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("The model could not be solved to optimality.")

```