The bit's position in the INPUT: its splitBits index for bitmark input, its entry index in the top-level array for JSON input, its position among the bits the import finds for markup input. An entry that is not a bit gets no span, so the indexes can have gaps.
Offset just past its last character in the input. A markup element that holds the next bit's element ends where that element starts.
Offset of the bit's first character in the input: for bitmark, its
splitBits start; for JSON, the start of its top-level entry;
for markup, the start of the element it was read from.
Offset just past its last character in the output. A bit that produced
no output (e.g. an empty bit in "text" output) has
outputEnd === outputStart, at the point where its output would begin.
Offset of the bit's first character in the output.
Where one top-level bit's text is in the input and in the output.