public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {
			List<String> incidents = new ArrayList<String>();
			//compile the individual incident dates into a list
			while (values.hasNext()) {
				incidents.add(values.next().toString());
			}
			if (incidents.size() > 0) {
				// sort that list by date
				Collections.sort(incidents);
				java.util.Map<Integer, Integer> weekSummary = new HashMap<Integer, Integer>();
				for (int i=0; i<16; i++) {
					weekSummary.put(i, 0);
				}
				// aggregate each incident into weekly buckets
				for (String incidentDay : incidents) {
					try {
						Date d = getDate(incidentDay);
						Calendar cal = Calendar.getInstance();
						cal.setTime(d);
						int week = cal.get(Calendar.WEEK_OF_MONTH);
						int month = cal.get(Calendar.MONTH);
						int bucket = (month * 5) + week;
						if (weekSummary.containsKey(bucket)) {
							weekSummary.put(bucket, new Integer(weekSummary.get(bucket).intValue() + 1));
						} else {
							weekSummary.put(bucket, new Integer(1));
						}
					} catch (ParseException pe) {
						log.warning(MessageFormat.format("Invalid date {0}", new Object[]{incidentDay}));
					}
				}
				// generate the output report line
				StringBuffer rpt = new StringBuffer();
				boolean first = true;
				for (int week : weekSummary.keySet()) {
					if (first) {
						first = false;
					} else {
						rpt.append(",");
					}
					rpt.append(new Integer(weekSummary.get(week)).toString());
				}
				String list = rpt.toString();
				Text tv = new Text();
				tv.set(list);
				output.collect(key, tv);
			}
		}