///|
/// Independent serialized packets can arrive unordered and some can fail CRC.
fn main raise {
  let codec = try! @lib.Codec::new(4, 2)
  let original = b"Network packet groups may arrive out of order or be lost."
  let object = try! @lib.encode_object(
    codec,
    original,
    81,
    stripe_payload_limit=13,
  )
  let frames = object.frames()
  let received : Array[Bytes] = []
  for index = frames.length() - 1; index >= 0; index = index - 1 {
    let frame = frames[index]
    if frame.shard_index() != 0 {
      let packet = frame.to_bytes()
      if frame.shard_index() == 5 {
        let damaged = packet.to_array()
        damaged[damaged.length() - 1] = (damaged[damaged.length() - 1].to_int() ^
        1).to_byte()
        received.push(Bytes::from_array(damaged))
      } else {
        received.push(packet)
      }
    }
  }
  let result = try! @lib.recover_serialized_object(object.manifest(), received)
  assert_eq(result.recovery().payload(), original)
  println("rejected damaged packets: " + result.issues().length().to_string())
  println(
    "recovered bytes: " + result.recovery().payload().length().to_string(),
  )
  println("packet transfer recovery: ok")
}