// Path: controller-core/src/main/java/com/palominolabs/benchpress/controller/SliceStatusResponse.java
// @NotThreadSafe
// public final class SliceStatusResponse {
//     /**
//      * The worker that was given this slice
//      */
//     private final WorkerMetadata workerMetadata;
// 
//     private final boolean finished;
//     private final Duration duration;
//     private final Task task;
//     private final List<ProgressItem> progress;
// 
//     SliceStatusResponse(Task task, WorkerMetadata workerMetadata, boolean finished,
//             Duration duration, List<ProgressItem> progress) {
//         this.task = task;
//         this.workerMetadata = workerMetadata;
//         this.finished = finished;
//         this.duration = duration;
//         this.progress = progress;
//     }
// 
//     @JsonProperty("worker")
//     public WorkerMetadata getWorkerMetadata() {
//         return workerMetadata;
//     }
// 
//     @JsonProperty("finished")
//     public boolean isFinished() {
//         return finished;
//     }
// 
//     @JsonProperty("duration")
//     public Duration getDuration() {
//         return duration;
//     }
// 
//     @JsonProperty("task")
//     public Task getTask() {
//         return task;
//     }
// 
//     @JsonProperty("progress")
//     public List<ProgressItem> getProgress() {
//         return progress;
//     }
// }
// 
// Path: job/src/main/java/com/palominolabs/benchpress/job/json/Job.java
// public final class Job {
//     private final UUID jobId;
// 
//     private final Task task;
// 
//     @VisibleForTesting
//     @JsonCreator
//     public Job(@JsonProperty("task") Task task, @JsonProperty("jobId") @Nullable UUID jobId) {
//         this.jobId = jobId == null ? UUID.randomUUID() : jobId;
//         this.task = task;
//     }
// 
//     public UUID getJobId() {
//         return jobId;
//     }
// 
//     public Task getTask() {
//         return task;
//     }
// }


import com.fasterxml.jackson.annotation.JsonProperty;
import com.palominolabs.benchpress.controller.SliceStatusResponse;
import com.palominolabs.benchpress.job.json.Job;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
package com.palominolabs.benchpress.controller;


public final class JobStatusResponse {
    @JsonProperty("job")
    private final Job job;

    @JsonProperty("slices")
    private final List<SliceStatusResponse> slices;

    @JsonProperty("finished")
    private final boolean finished;

    @Nullable
    @JsonProperty("finalDuration")
    private final Duration finalDuration;

// Path: controller-core/src/main/java/com/palominolabs/benchpress/controller/SliceStatusResponse.java
// @NotThreadSafe
// public final class SliceStatusResponse {
//     /**
//      * The worker that was given this slice
//      */
//     private final WorkerMetadata workerMetadata;
// 
//     private final boolean finished;
//     private final Duration duration;
//     private final Task task;
//     private final List<ProgressItem> progress;
// 
//     SliceStatusResponse(Task task, WorkerMetadata workerMetadata, boolean finished,
//             Duration duration, List<ProgressItem> progress) {
//         this.task = task;
//         this.workerMetadata = workerMetadata;
//         this.finished = finished;
//         this.duration = duration;
//         this.progress = progress;
//     }
// 
//     @JsonProperty("worker")
//     public WorkerMetadata getWorkerMetadata() {
//         return workerMetadata;
//     }
// 
//     @JsonProperty("finished")
//     public boolean isFinished() {
//         return finished;
//     }
// 
//     @JsonProperty("duration")
//     public Duration getDuration() {
//         return duration;
//     }
// 
//     @JsonProperty("task")
//     public Task getTask() {
//         return task;
//     }
// 
//     @JsonProperty("progress")
//     public List<ProgressItem> getProgress() {
//         return progress;
//     }
// }
// 
// Path: job/src/main/java/com/palominolabs/benchpress/job/json/Job.java
// public final class Job {
//     private final UUID jobId;
// 
//     private final Task task;
// 
//     @VisibleForTesting
//     @JsonCreator
//     public Job(@JsonProperty("task") Task task, @JsonProperty("jobId") @Nullable UUID jobId) {
//         this.jobId = jobId == null ? UUID.randomUUID() : jobId;
//         this.task = task;
//     }
// 
//     public UUID getJobId() {
//         return jobId;
//     }
// 
//     public Task getTask() {
//         return task;
//     }
// }


// Path: controller-core/src/main/java/com/palominolabs/benchpress/controller/JobStatusResponse.java
import com.fasterxml.jackson.annotation.JsonProperty;
import com.palominolabs.benchpress.controller.SliceStatusResponse;
import com.palominolabs.benchpress.job.json.Job;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;

package com.palominolabs.benchpress.controller;


public final class JobStatusResponse {
    @JsonProperty("job")
    private final Job job;

    @JsonProperty("slices")
    private final List<SliceStatusResponse> slices;

    @JsonProperty("finished")
    private final boolean finished;

    @Nullable
    @JsonProperty("finalDuration")
    private final Duration finalDuration;

    public JobStatusResponse(Job job, List<SliceStatusResponse> slices, boolean finished,