///|
fn main {
  try {
    let input = @r.Symbols::from_bytes(b"relay-cannot-yet-decode")
    let source = @r.Encoder::new(23, input, 8)
    let relay = @r.Relay::new(source.generation())
    ignore(relay.admit(source.systematic(0, 0)))
    ignore(relay.admit(source.systematic(2, 2)))
    assert_eq(relay.rank(), 2)
    assert_eq(source.generation().count(), 3)
    // The relay never has full rank. Mix two rows without recovering the source.
    let downstream = @r.Decoder::new(source.generation())
    ignore(
      downstream.admit(
        @r.packet_from_wire(relay.mix(@r.Symbols::new([1, 1]), 20).to_wire()),
      ),
    )
    ignore(
      downstream.admit(
        @r.packet_from_wire(relay.mix(@r.Symbols::new([1, 2]), 21).to_wire()),
      ),
    )
    assert_eq(downstream.rank(), 2)
    assert_eq(relay.rank(), 2)
    ignore(downstream.admit(source.systematic(1, 22)))
    assert_true(downstream.recover().equal(input))
    println(
      "relay: rank-2 incomplete relay recoded; downstream recovered rank-3 generation",
    )
    println(downstream.report().to_json())
  } catch {
    error => {
      println(error.to_string())
      panic()
    }
  }
}