A moving-boundary model of biomass pyrolysis