```json
{
  "sym_variables": [
    ("x0", "hours worked by Bill"),
    ("x1", "hours worked by George"),
    ("x2", "hours worked by Dale"),
    ("x3", "hours worked by Hank"),
    ("x4", "hours worked by Mary")
  ],
  "objective_function": "4.59*x0*x1 + 9.42*x0*x2 + 7.04*x0*x4 + 8.5*x1*x2 + 2.53*x1*x4 + 2.72*x3**2 + 7.49*x3*x4 + 4.85*x4**2 + 3.42*x0 + 5.86*x1 + 1.44*x4",
  "constraints": [
    "13*x0 + 13*x1 >= 29",
    "15*x2 + 11*x4 >= 29",
    "13*x0 + 15*x2 >= 29",
    "13*x0 + 16*x3 >= 48",
    "13*x0 + 16*x3 + 11*x4 >= 49",
    "13*x0 + 13*x1 + 15*x2 + 16*x3 + 11*x4 >= 49",
    "6*x0 + 17*x1 >= 58",
    "16*x3**2 + 5*x4**2 >= 86",
    "2*x2 + 16*x3 >= 62",
    "17*x1**2 + 16*x3**2 + 5*x4**2 >= 99",
    "17*x1 + 2*x2 + 5*x4 >= 99",
    "6*x0 + 2*x2 + 5*x4 >= 99",
    "17*x1 + 2*x2 + 16*x3 >= 99",
    "17*x1 + 16*x3 + 5*x4 >= 56",
    "17*x1 + 2*x2 + 5*x4 >= 56",
    "6*x0**2 + 2*x2**2 + 5*x4**2 >= 56",
    "17*x1 + 2*x2 + 16*x3 >= 56",
    "17*x1 + 16*x3 + 5*x4 >= 79",
    "17*x1**2 + 2*x2**2 + 5*x4**2 >= 79",
    "6*x0 + 2*x2 + 5*x4 >= 79",
    "17*x1**2 + 2*x2**2 + 16*x3**2 >= 79",
    "17*x1**2 + 16*x3**2 + 5*x4**2 >= 65",
    "17*x1**2 + 2*x2**2 + 5*x4**2 >= 65",
    "6*x0**2 + 2*x2**2 + 5*x4**2 >= 65",
    "17*x1**2 + 2*x2**2 + 16*x3**2 >= 65",
    "6*x0 + 17*x1 + 2*x2 + 16*x3 + 5*x4 >= 65",
    "9*x0**2 - 4*x1**2 >= 0",
    "-9*x2 + 9*x3 >= 0",
    "13*x0**2 + 11*x4**2 <= 100",
    "13*x0**2 + 16*x3**2 <= 197",
    "13*x1 + 11*x4 <= 80",
    "15*x2 + 16*x3 <= 80",
    "13*x1 + 15*x2 <= 305",
    "13*x0 + 15*x2 <= 77",
    "13*x0 + 13*x1 <= 118",
    "13*x0 + 15*x2 + 11*x4 <= 143",
    "15*x2**2 + 16*x3**2 + 11*x4**2 <= 213",
    "17*x1 + 5*x4 <= 272",
    "6*x0 + 5*x4 <= 288",
    "2*x2 + 16*x3 <= 457",
    "6*x0 + 17*x1 + 5*x4 <= 411",
    "6*x0 + 17*x1 + 2*x2 <= 191",
    "17*x1 + 16*x3 + 5*x4 <= 354",
    "6*x0**2 + 17*x1**2 + 16*x3**2 <= 354",
    "6*x0 + 2*x2 + 16*x3 <= 286",
    "6*x0 + 2*x2 + 5*x4 <= 418",
    "6*x0**2 + 16*x3**2 + 5*x4**2 <= 239",
    "17*x1 + 2*x2 + 5*x4 <= 350"
  ]
}
```

```python
import gurobipy as gp

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

# Create variables
x = m.addVars(5, lb=0, vtype=gp.GRB.CONTINUOUS, name=["Bill", "George", "Dale", "Hank", "Mary"])

# Set objective function
m.setObjective(4.59*x[0]*x[1] + 9.42*x[0]*x[2] + 7.04*x[0]*x[4] + 8.5*x[1]*x[2] + 2.53*x[1]*x[4] + 2.72*x[3]**2 + 7.49*x[3]*x[4] + 4.85*x[4]**2 + 3.42*x[0] + 5.86*x[1] + 1.44*x[4], gp.GRB.MINIMIZE)

# Add constraints
m.addConstr(13*x[0] + 13*x[1] >= 29)
m.addConstr(15*x[2] + 11*x[4] >= 29)
m.addConstr(13*x[0] + 15*x[2] >= 29)
m.addConstr(13*x[0] + 16*x[3] >= 48)
m.addConstr(13*x[0] + 16*x[3] + 11*x[4] >= 49)
m.addConstr(13*x[0] + 13*x[1] + 15*x[2] + 16*x[3] + 11*x[4] >= 49)
m.addConstr(6*x[0] + 17*x[1] >= 58)
m.addConstr(16*x[3]**2 + 5*x[4]**2 >= 86)
m.addConstr(2*x[2] + 16*x[3] >= 62)
m.addConstr(17*x[1]**2 + 16*x[3]**2 + 5*x[4]**2 >= 99)
m.addConstr(17*x[1] + 2*x[2] + 5*x[4] >= 99)
m.addConstr(6*x[0] + 2*x[2] + 5*x[4] >= 99)
m.addConstr(17*x[1] + 2*x[2] + 16*x[3] >= 99)
m.addConstr(17*x[1] + 16*x[3] + 5*x[4] >= 56)
m.addConstr(17*x[1] + 2*x[2] + 5*x[4] >= 56)
m.addConstr(6*x[0]**2 + 2*x[2]**2 + 5*x[4]**2 >= 56)
m.addConstr(17*x[1] + 2*x[2] + 16*x[3] >= 56)
m.addConstr(17*x[1] + 16*x[3] + 5*x[4] >= 79)
m.addConstr(17*x[1]**2 + 2*x[2]**2 + 5*x[4]**2 >= 79)
m.addConstr(6*x[0] + 2*x[2] + 5*x[4] >= 79)
m.addConstr(17*x[1]**2 + 2*x[2]**2 + 16*x[3]**2 >= 79)
m.addConstr(17*x[1]**2 + 16*x[3]**2 + 5*x[4]**2 >= 65)
m.addConstr(17*x[1]**2 + 2*x[2]**2 + 5*x[4]**2 >= 65)
m.addConstr(6*x[0]**2 + 2*x[2]**2 + 5*x[4]**2 >= 65)
m.addConstr(17*x[1]**2 + 2*x[2]**2 + 16*x[3]**2 >= 65)
m.addConstr(6*x[0] + 17*x[1] + 2*x[2] + 16*x[3] + 5*x[4] >= 65)
m.addConstr(9*x[0]**2 - 4*x[1]**2 >= 0)
m.addConstr(-9*x[2] + 9*x[3] >= 0)
m.addConstr(13*x[0]**2 + 11*x[4]**2 <= 100)
m.addConstr(13*x[0]**2 + 16*x[3]**2 <= 197)
m.addConstr(13*x[1] + 11*x[4] <= 80)
m.addConstr(15*x[2] + 16*x[3] <= 80)
m.addConstr(13*x[1] + 15*x[2] <= 305)
m.addConstr(13*x[0] + 15*x[2] <= 77)
m.addConstr(13*x[0] + 13*x[1] <= 118)
m.addConstr(13*x[0] + 15*x[2] + 11*x[4] <= 143)
m.addConstr(15*x[2]**2 + 16*x[3]**2 + 11*x[4]**2 <= 213)
m.addConstr(17*x[1] + 5*x[4] <= 272)
m.addConstr(6*x[0] + 5*x[4] <= 288)
m.addConstr(2*x[2] + 16*x[3] <= 457)
m.addConstr(6*x[0] + 17*x[1] + 5*x[4] <= 411)
m.addConstr(6*x[0] + 17*x[1] + 2*x[2] <= 191)
m.addConstr(17*x[1] + 16*x[3] + 5*x[4] <= 354)
m.addConstr(6*x[0]**2 + 17*x[1]**2 + 16*x[3]**2 <= 354)
m.addConstr(6*x[0] + 2*x[2] + 16*x[3] <= 286)
m.addConstr(6*x[0] + 2*x[2] + 5*x[4] <= 418)
m.addConstr(6*x[0]**2 + 16*x[3]**2 + 5*x[4]**2 <= 239)
m.addConstr(17*x[1] + 2*x[2] + 5*x[4] <= 350)


# Optimize model
m.optimize()

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