hpack_codec 0.1.1

Encoder and Decoder for HPACK (RFC 7541)
Documentation
use crate::Result;
use std::cmp;
use trackable::error::Failed;

#[derive(Debug)]
pub struct BitReader<'a> {
    data: &'a [u8],
    offset: usize,
}
impl<'a> BitReader<'a> {
    pub fn new(data: &'a [u8]) -> Self {
        BitReader { data, offset: 0 }
    }
    pub fn remaining_bits(&self) -> usize {
        self.data.len() * 8 - self.offset
    }
    pub fn read_bits(&mut self, bits: usize) -> Result<u32> {
        debug_assert!(1 <= bits && bits <= 5);
        debug_assert!(self.offset + bits <= self.data.len() * 8);
        let new_offset = self.offset + bits;

        let mut value = 0;
        for i in self.offset..new_offset {
            let bit = (self.data[i / 8] >> (7 - (i % 8))) & 0b1;
            value = (value << 1) | bit as u32;
        }

        self.offset = new_offset;
        Ok(value)
    }
}

pub fn decode(data: &[u8]) -> Result<Vec<u8>> {
    let mut buf = Vec::new();
    let mut value = 0;
    let mut next_bits = 5;
    let mut acc_bits = 0;
    let mut reader = BitReader::new(data);
    while reader.remaining_bits() > 0 {
        next_bits = cmp::min(next_bits, reader.remaining_bits());
        value = (value << next_bits) + track!(reader.read_bits(next_bits))?;
        acc_bits += next_bits;
        if let Ok(i) = DECODING_TABLE.binary_search_by_key(&(value, acc_bits), |e| (e.0, e.1)) {
            track_assert_ne!(i, 256, Failed);
            buf.push(DECODING_TABLE[i].2 as u8);
            next_bits = 5;
            acc_bits = 0;
            value = 0;
        } else {
            next_bits = 1;
        }
    }
    track_assert_eq!(value, (1 << acc_bits) - 1, Failed);
    Ok(buf)
}

#[derive(Debug)]
struct BitWriter {
    buf: Vec<u8>,
    offset: usize,
}
impl BitWriter {
    pub fn new() -> Self {
        BitWriter {
            buf: Vec::new(),
            offset: 0,
        }
    }
    pub fn write_bit(&mut self, bit: u8) {
        if self.offset == 0 {
            self.buf.push(0);
            self.offset = 8;
        }
        self.offset -= 1;
        let b = self.buf.last_mut().expect("Never fails");
        *b |= bit << self.offset;
    }
    pub fn finish(mut self) -> Vec<u8> {
        for i in 0..self.offset {
            let b = self.buf.last_mut().expect("Never fails");
            *b |= 1 << i;
        }
        self.buf
    }
}

pub fn encode(data: &[u8]) -> Vec<u8> {
    // FIXME: optimize
    let mut writer = BitWriter::new();
    for b in data.iter() {
        let (code, bitwidth) = ENCODING_TABLE[*b as usize];
        for i in 0..bitwidth {
            let bit = (code >> (bitwidth - i - 1)) & 0b1;
            writer.write_bit(bit as u8);
        }
    }
    writer.finish()
}

const DECODING_TABLE: [(u32, usize, u16); 257] = [
    (0b0000_0, 5, 48),
    (0b0000_1, 5, 49),
    (0b0001_0, 5, 50),
    (0b0001_1, 5, 97),
    (0b0010_0, 5, 99),
    (0b0010_1, 5, 101),
    (0b0011_0, 5, 105),
    (0b0011_1, 5, 111),
    (0b0100_0, 5, 115),
    (0b0100_1, 5, 116),
    (0b0101_00, 6, 32),
    (0b0101_01, 6, 37),
    (0b0101_10, 6, 45),
    (0b0101_11, 6, 46),
    (0b0110_00, 6, 47),
    (0b0110_01, 6, 51),
    (0b0110_10, 6, 52),
    (0b0110_11, 6, 53),
    (0b0111_00, 6, 54),
    (0b0111_01, 6, 55),
    (0b0111_10, 6, 56),
    (0b0111_11, 6, 57),
    (0b1000_00, 6, 61),
    (0b1000_01, 6, 65),
    (0b1000_10, 6, 95),
    (0b1000_11, 6, 98),
    (0b1001_00, 6, 100),
    (0b1001_01, 6, 102),
    (0b1001_10, 6, 103),
    (0b1001_11, 6, 104),
    (0b1010_00, 6, 108),
    (0b1010_01, 6, 109),
    (0b1010_10, 6, 110),
    (0b1010_11, 6, 112),
    (0b1011_00, 6, 114),
    (0b1011_01, 6, 117),
    (0b1011_100, 7, 58),
    (0b1011_101, 7, 66),
    (0b1011_110, 7, 67),
    (0b1011_111, 7, 68),
    (0b1100_000, 7, 69),
    (0b1100_001, 7, 70),
    (0b1100_010, 7, 71),
    (0b1100_011, 7, 72),
    (0b1100_100, 7, 73),
    (0b1100_101, 7, 74),
    (0b1100_110, 7, 75),
    (0b1100_111, 7, 76),
    (0b1101_000, 7, 77),
    (0b1101_001, 7, 78),
    (0b1101_010, 7, 79),
    (0b1101_011, 7, 80),
    (0b1101_100, 7, 81),
    (0b1101_101, 7, 82),
    (0b1101_110, 7, 83),
    (0b1101_111, 7, 84),
    (0b1110_000, 7, 85),
    (0b1110_001, 7, 86),
    (0b1110_010, 7, 87),
    (0b1110_011, 7, 89),
    (0b1110_100, 7, 106),
    (0b1110_101, 7, 107),
    (0b1110_110, 7, 113),
    (0b1110_111, 7, 118),
    (0b1111_000, 7, 119),
    (0b1111_001, 7, 120),
    (0b1111_010, 7, 121),
    (0b1111_011, 7, 122),
    (0b1111_1000, 8, 38),
    (0b1111_1001, 8, 42),
    (0b1111_1010, 8, 44),
    (0b1111_1011, 8, 59),
    (0b1111_1100, 8, 88),
    (0b1111_1101, 8, 90),
    (0b1111_1110_00, 10, 33),
    (0b1111_1110_01, 10, 34),
    (0b1111_1110_10, 10, 40),
    (0b1111_1110_11, 10, 41),
    (0b1111_1111_00, 10, 63),
    (0b1111_1111_010, 11, 39),
    (0b1111_1111_011, 11, 43),
    (0b1111_1111_100, 11, 124),
    (0b1111_1111_1010, 12, 35),
    (0b1111_1111_1011, 12, 62),
    (0b1111_1111_1100_0, 13, 0),
    (0b1111_1111_1100_1, 13, 36),
    (0b1111_1111_1101_0, 13, 64),
    (0b1111_1111_1101_1, 13, 91),
    (0b1111_1111_1110_0, 13, 93),
    (0b1111_1111_1110_1, 13, 126),
    (0b1111_1111_1111_00, 14, 94),
    (0b1111_1111_1111_01, 14, 125),
    (0b1111_1111_1111_100, 15, 60),
    (0b1111_1111_1111_101, 15, 96),
    (0b1111_1111_1111_110, 15, 123),
    (0b1111_1111_1111_1110_000, 19, 92),
    (0b1111_1111_1111_1110_001, 19, 195),
    (0b1111_1111_1111_1110_010, 19, 208),
    (0b1111_1111_1111_1110_0110, 20, 128),
    (0b1111_1111_1111_1110_0111, 20, 130),
    (0b1111_1111_1111_1110_1000, 20, 131),
    (0b1111_1111_1111_1110_1001, 20, 162),
    (0b1111_1111_1111_1110_1010, 20, 184),
    (0b1111_1111_1111_1110_1011, 20, 194),
    (0b1111_1111_1111_1110_1100, 20, 224),
    (0b1111_1111_1111_1110_1101, 20, 226),
    (0b1111_1111_1111_1110_1110_0, 21, 153),
    (0b1111_1111_1111_1110_1110_1, 21, 161),
    (0b1111_1111_1111_1110_1111_0, 21, 167),
    (0b1111_1111_1111_1110_1111_1, 21, 172),
    (0b1111_1111_1111_1111_0000_0, 21, 176),
    (0b1111_1111_1111_1111_0000_1, 21, 177),
    (0b1111_1111_1111_1111_0001_0, 21, 179),
    (0b1111_1111_1111_1111_0001_1, 21, 209),
    (0b1111_1111_1111_1111_0010_0, 21, 216),
    (0b1111_1111_1111_1111_0010_1, 21, 217),
    (0b1111_1111_1111_1111_0011_0, 21, 227),
    (0b1111_1111_1111_1111_0011_1, 21, 229),
    (0b1111_1111_1111_1111_0100_0, 21, 230),
    (0b1111_1111_1111_1111_0100_10, 22, 129),
    (0b1111_1111_1111_1111_0100_11, 22, 132),
    (0b1111_1111_1111_1111_0101_00, 22, 133),
    (0b1111_1111_1111_1111_0101_01, 22, 134),
    (0b1111_1111_1111_1111_0101_10, 22, 136),
    (0b1111_1111_1111_1111_0101_11, 22, 146),
    (0b1111_1111_1111_1111_0110_00, 22, 154),
    (0b1111_1111_1111_1111_0110_01, 22, 156),
    (0b1111_1111_1111_1111_0110_10, 22, 160),
    (0b1111_1111_1111_1111_0110_11, 22, 163),
    (0b1111_1111_1111_1111_0111_00, 22, 164),
    (0b1111_1111_1111_1111_0111_01, 22, 169),
    (0b1111_1111_1111_1111_0111_10, 22, 170),
    (0b1111_1111_1111_1111_0111_11, 22, 173),
    (0b1111_1111_1111_1111_1000_00, 22, 178),
    (0b1111_1111_1111_1111_1000_01, 22, 181),
    (0b1111_1111_1111_1111_1000_10, 22, 185),
    (0b1111_1111_1111_1111_1000_11, 22, 186),
    (0b1111_1111_1111_1111_1001_00, 22, 187),
    (0b1111_1111_1111_1111_1001_01, 22, 189),
    (0b1111_1111_1111_1111_1001_10, 22, 190),
    (0b1111_1111_1111_1111_1001_11, 22, 196),
    (0b1111_1111_1111_1111_1010_00, 22, 198),
    (0b1111_1111_1111_1111_1010_01, 22, 228),
    (0b1111_1111_1111_1111_1010_10, 22, 232),
    (0b1111_1111_1111_1111_1010_11, 22, 233),
    (0b1111_1111_1111_1111_1011_000, 23, 1),
    (0b1111_1111_1111_1111_1011_001, 23, 135),
    (0b1111_1111_1111_1111_1011_010, 23, 137),
    (0b1111_1111_1111_1111_1011_011, 23, 138),
    (0b1111_1111_1111_1111_1011_100, 23, 139),
    (0b1111_1111_1111_1111_1011_101, 23, 140),
    (0b1111_1111_1111_1111_1011_110, 23, 141),
    (0b1111_1111_1111_1111_1011_111, 23, 143),
    (0b1111_1111_1111_1111_1100_000, 23, 147),
    (0b1111_1111_1111_1111_1100_001, 23, 149),
    (0b1111_1111_1111_1111_1100_010, 23, 150),
    (0b1111_1111_1111_1111_1100_011, 23, 151),
    (0b1111_1111_1111_1111_1100_100, 23, 152),
    (0b1111_1111_1111_1111_1100_101, 23, 155),
    (0b1111_1111_1111_1111_1100_110, 23, 157),
    (0b1111_1111_1111_1111_1100_111, 23, 158),
    (0b1111_1111_1111_1111_1101_000, 23, 165),
    (0b1111_1111_1111_1111_1101_001, 23, 166),
    (0b1111_1111_1111_1111_1101_010, 23, 168),
    (0b1111_1111_1111_1111_1101_011, 23, 174),
    (0b1111_1111_1111_1111_1101_100, 23, 175),
    (0b1111_1111_1111_1111_1101_101, 23, 180),
    (0b1111_1111_1111_1111_1101_110, 23, 182),
    (0b1111_1111_1111_1111_1101_111, 23, 183),
    (0b1111_1111_1111_1111_1110_000, 23, 188),
    (0b1111_1111_1111_1111_1110_001, 23, 191),
    (0b1111_1111_1111_1111_1110_010, 23, 197),
    (0b1111_1111_1111_1111_1110_011, 23, 231),
    (0b1111_1111_1111_1111_1110_100, 23, 239),
    (0b1111_1111_1111_1111_1110_1010, 24, 9),
    (0b1111_1111_1111_1111_1110_1011, 24, 142),
    (0b1111_1111_1111_1111_1110_1100, 24, 144),
    (0b1111_1111_1111_1111_1110_1101, 24, 145),
    (0b1111_1111_1111_1111_1110_1110, 24, 148),
    (0b1111_1111_1111_1111_1110_1111, 24, 159),
    (0b1111_1111_1111_1111_1111_0000, 24, 171),
    (0b1111_1111_1111_1111_1111_0001, 24, 206),
    (0b1111_1111_1111_1111_1111_0010, 24, 215),
    (0b1111_1111_1111_1111_1111_0011, 24, 225),
    (0b1111_1111_1111_1111_1111_0100, 24, 236),
    (0b1111_1111_1111_1111_1111_0101, 24, 237),
    (0b1111_1111_1111_1111_1111_0110_0, 25, 199),
    (0b1111_1111_1111_1111_1111_0110_1, 25, 207),
    (0b1111_1111_1111_1111_1111_0111_0, 25, 234),
    (0b1111_1111_1111_1111_1111_0111_1, 25, 235),
    (0b1111_1111_1111_1111_1111_1000_00, 26, 192),
    (0b1111_1111_1111_1111_1111_1000_01, 26, 193),
    (0b1111_1111_1111_1111_1111_1000_10, 26, 200),
    (0b1111_1111_1111_1111_1111_1000_11, 26, 201),
    (0b1111_1111_1111_1111_1111_1001_00, 26, 202),
    (0b1111_1111_1111_1111_1111_1001_01, 26, 205),
    (0b1111_1111_1111_1111_1111_1001_10, 26, 210),
    (0b1111_1111_1111_1111_1111_1001_11, 26, 213),
    (0b1111_1111_1111_1111_1111_1010_00, 26, 218),
    (0b1111_1111_1111_1111_1111_1010_01, 26, 219),
    (0b1111_1111_1111_1111_1111_1010_10, 26, 238),
    (0b1111_1111_1111_1111_1111_1010_11, 26, 240),
    (0b1111_1111_1111_1111_1111_1011_00, 26, 242),
    (0b1111_1111_1111_1111_1111_1011_01, 26, 243),
    (0b1111_1111_1111_1111_1111_1011_10, 26, 255),
    (0b1111_1111_1111_1111_1111_1011_110, 27, 203),
    (0b1111_1111_1111_1111_1111_1011_111, 27, 204),
    (0b1111_1111_1111_1111_1111_1100_000, 27, 211),
    (0b1111_1111_1111_1111_1111_1100_001, 27, 212),
    (0b1111_1111_1111_1111_1111_1100_010, 27, 214),
    (0b1111_1111_1111_1111_1111_1100_011, 27, 221),
    (0b1111_1111_1111_1111_1111_1100_100, 27, 222),
    (0b1111_1111_1111_1111_1111_1100_101, 27, 223),
    (0b1111_1111_1111_1111_1111_1100_110, 27, 241),
    (0b1111_1111_1111_1111_1111_1100_111, 27, 244),
    (0b1111_1111_1111_1111_1111_1101_000, 27, 245),
    (0b1111_1111_1111_1111_1111_1101_001, 27, 246),
    (0b1111_1111_1111_1111_1111_1101_010, 27, 247),
    (0b1111_1111_1111_1111_1111_1101_011, 27, 248),
    (0b1111_1111_1111_1111_1111_1101_100, 27, 250),
    (0b1111_1111_1111_1111_1111_1101_101, 27, 251),
    (0b1111_1111_1111_1111_1111_1101_110, 27, 252),
    (0b1111_1111_1111_1111_1111_1101_111, 27, 253),
    (0b1111_1111_1111_1111_1111_1110_000, 27, 254),
    (0b1111_1111_1111_1111_1111_1110_0010, 28, 2),
    (0b1111_1111_1111_1111_1111_1110_0011, 28, 3),
    (0b1111_1111_1111_1111_1111_1110_0100, 28, 4),
    (0b1111_1111_1111_1111_1111_1110_0101, 28, 5),
    (0b1111_1111_1111_1111_1111_1110_0110, 28, 6),
    (0b1111_1111_1111_1111_1111_1110_0111, 28, 7),
    (0b1111_1111_1111_1111_1111_1110_1000, 28, 8),
    (0b1111_1111_1111_1111_1111_1110_1001, 28, 11),
    (0b1111_1111_1111_1111_1111_1110_1010, 28, 12),
    (0b1111_1111_1111_1111_1111_1110_1011, 28, 14),
    (0b1111_1111_1111_1111_1111_1110_1100, 28, 15),
    (0b1111_1111_1111_1111_1111_1110_1101, 28, 16),
    (0b1111_1111_1111_1111_1111_1110_1110, 28, 17),
    (0b1111_1111_1111_1111_1111_1110_1111, 28, 18),
    (0b1111_1111_1111_1111_1111_1111_0000, 28, 19),
    (0b1111_1111_1111_1111_1111_1111_0001, 28, 20),
    (0b1111_1111_1111_1111_1111_1111_0010, 28, 21),
    (0b1111_1111_1111_1111_1111_1111_0011, 28, 23),
    (0b1111_1111_1111_1111_1111_1111_0100, 28, 24),
    (0b1111_1111_1111_1111_1111_1111_0101, 28, 25),
    (0b1111_1111_1111_1111_1111_1111_0110, 28, 26),
    (0b1111_1111_1111_1111_1111_1111_0111, 28, 27),
    (0b1111_1111_1111_1111_1111_1111_1000, 28, 28),
    (0b1111_1111_1111_1111_1111_1111_1001, 28, 29),
    (0b1111_1111_1111_1111_1111_1111_1010, 28, 30),
    (0b1111_1111_1111_1111_1111_1111_1011, 28, 31),
    (0b1111_1111_1111_1111_1111_1111_1100, 28, 127),
    (0b1111_1111_1111_1111_1111_1111_1101, 28, 220),
    (0b1111_1111_1111_1111_1111_1111_1110, 28, 249),
    (0b1111_1111_1111_1111_1111_1111_1111_00, 30, 10),
    (0b1111_1111_1111_1111_1111_1111_1111_01, 30, 13),
    (0b1111_1111_1111_1111_1111_1111_1111_10, 30, 22),
    (0b1111_1111_1111_1111_1111_1111_1111_11, 30, 256),
];

const ENCODING_TABLE: [(u32, u8); 257] = [
    (0b1111_1111_1100_0, 13),
    (0b1111_1111_1111_1111_1011_000, 23),
    (0b1111_1111_1111_1111_1111_1110_0010, 28),
    (0b1111_1111_1111_1111_1111_1110_0011, 28),
    (0b1111_1111_1111_1111_1111_1110_0100, 28),
    (0b1111_1111_1111_1111_1111_1110_0101, 28),
    (0b1111_1111_1111_1111_1111_1110_0110, 28),
    (0b1111_1111_1111_1111_1111_1110_0111, 28),
    (0b1111_1111_1111_1111_1111_1110_1000, 28),
    (0b1111_1111_1111_1111_1110_1010, 24),
    (0b1111_1111_1111_1111_1111_1111_1111_00, 30),
    (0b1111_1111_1111_1111_1111_1110_1001, 28),
    (0b1111_1111_1111_1111_1111_1110_1010, 28),
    (0b1111_1111_1111_1111_1111_1111_1111_01, 30),
    (0b1111_1111_1111_1111_1111_1110_1011, 28),
    (0b1111_1111_1111_1111_1111_1110_1100, 28),
    (0b1111_1111_1111_1111_1111_1110_1101, 28),
    (0b1111_1111_1111_1111_1111_1110_1110, 28),
    (0b1111_1111_1111_1111_1111_1110_1111, 28),
    (0b1111_1111_1111_1111_1111_1111_0000, 28),
    (0b1111_1111_1111_1111_1111_1111_0001, 28),
    (0b1111_1111_1111_1111_1111_1111_0010, 28),
    (0b1111_1111_1111_1111_1111_1111_1111_10, 30),
    (0b1111_1111_1111_1111_1111_1111_0011, 28),
    (0b1111_1111_1111_1111_1111_1111_0100, 28),
    (0b1111_1111_1111_1111_1111_1111_0101, 28),
    (0b1111_1111_1111_1111_1111_1111_0110, 28),
    (0b1111_1111_1111_1111_1111_1111_0111, 28),
    (0b1111_1111_1111_1111_1111_1111_1000, 28),
    (0b1111_1111_1111_1111_1111_1111_1001, 28),
    (0b1111_1111_1111_1111_1111_1111_1010, 28),
    (0b1111_1111_1111_1111_1111_1111_1011, 28),
    (0b0101_00, 6),
    (0b1111_1110_00, 10),
    (0b1111_1110_01, 10),
    (0b1111_1111_1010, 12),
    (0b1111_1111_1100_1, 13),
    (0b0101_01, 6),
    (0b1111_1000, 8),
    (0b1111_1111_010, 11),
    (0b1111_1110_10, 10),
    (0b1111_1110_11, 10),
    (0b1111_1001, 8),
    (0b1111_1111_011, 11),
    (0b1111_1010, 8),
    (0b0101_10, 6),
    (0b0101_11, 6),
    (0b0110_00, 6),
    (0b0000_0, 5),
    (0b0000_1, 5),
    (0b0001_0, 5),
    (0b0110_01, 6),
    (0b0110_10, 6),
    (0b0110_11, 6),
    (0b0111_00, 6),
    (0b0111_01, 6),
    (0b0111_10, 6),
    (0b0111_11, 6),
    (0b1011_100, 7),
    (0b1111_1011, 8),
    (0b1111_1111_1111_100, 15),
    (0b1000_00, 6),
    (0b1111_1111_1011, 12),
    (0b1111_1111_00, 10),
    (0b1111_1111_1101_0, 13),
    (0b1000_01, 6),
    (0b1011_101, 7),
    (0b1011_110, 7),
    (0b1011_111, 7),
    (0b1100_000, 7),
    (0b1100_001, 7),
    (0b1100_010, 7),
    (0b1100_011, 7),
    (0b1100_100, 7),
    (0b1100_101, 7),
    (0b1100_110, 7),
    (0b1100_111, 7),
    (0b1101_000, 7),
    (0b1101_001, 7),
    (0b1101_010, 7),
    (0b1101_011, 7),
    (0b1101_100, 7),
    (0b1101_101, 7),
    (0b1101_110, 7),
    (0b1101_111, 7),
    (0b1110_000, 7),
    (0b1110_001, 7),
    (0b1110_010, 7),
    (0b1111_1100, 8),
    (0b1110_011, 7),
    (0b1111_1101, 8),
    (0b1111_1111_1101_1, 13),
    (0b1111_1111_1111_1110_000, 19),
    (0b1111_1111_1110_0, 13),
    (0b1111_1111_1111_00, 14),
    (0b1000_10, 6),
    (0b1111_1111_1111_101, 15),
    (0b0001_1, 5),
    (0b1000_11, 6),
    (0b0010_0, 5),
    (0b1001_00, 6),
    (0b0010_1, 5),
    (0b1001_01, 6),
    (0b1001_10, 6),
    (0b1001_11, 6),
    (0b0011_0, 5),
    (0b1110_100, 7),
    (0b1110_101, 7),
    (0b1010_00, 6),
    (0b1010_01, 6),
    (0b1010_10, 6),
    (0b0011_1, 5),
    (0b1010_11, 6),
    (0b1110_110, 7),
    (0b1011_00, 6),
    (0b0100_0, 5),
    (0b0100_1, 5),
    (0b1011_01, 6),
    (0b1110_111, 7),
    (0b1111_000, 7),
    (0b1111_001, 7),
    (0b1111_010, 7),
    (0b1111_011, 7),
    (0b1111_1111_1111_110, 15),
    (0b1111_1111_100, 11),
    (0b1111_1111_1111_01, 14),
    (0b1111_1111_1110_1, 13),
    (0b1111_1111_1111_1111_1111_1111_1100, 28),
    (0b1111_1111_1111_1110_0110, 20),
    (0b1111_1111_1111_1111_0100_10, 22),
    (0b1111_1111_1111_1110_0111, 20),
    (0b1111_1111_1111_1110_1000, 20),
    (0b1111_1111_1111_1111_0100_11, 22),
    (0b1111_1111_1111_1111_0101_00, 22),
    (0b1111_1111_1111_1111_0101_01, 22),
    (0b1111_1111_1111_1111_1011_001, 23),
    (0b1111_1111_1111_1111_0101_10, 22),
    (0b1111_1111_1111_1111_1011_010, 23),
    (0b1111_1111_1111_1111_1011_011, 23),
    (0b1111_1111_1111_1111_1011_100, 23),
    (0b1111_1111_1111_1111_1011_101, 23),
    (0b1111_1111_1111_1111_1011_110, 23),
    (0b1111_1111_1111_1111_1110_1011, 24),
    (0b1111_1111_1111_1111_1011_111, 23),
    (0b1111_1111_1111_1111_1110_1100, 24),
    (0b1111_1111_1111_1111_1110_1101, 24),
    (0b1111_1111_1111_1111_0101_11, 22),
    (0b1111_1111_1111_1111_1100_000, 23),
    (0b1111_1111_1111_1111_1110_1110, 24),
    (0b1111_1111_1111_1111_1100_001, 23),
    (0b1111_1111_1111_1111_1100_010, 23),
    (0b1111_1111_1111_1111_1100_011, 23),
    (0b1111_1111_1111_1111_1100_100, 23),
    (0b1111_1111_1111_1110_1110_0, 21),
    (0b1111_1111_1111_1111_0110_00, 22),
    (0b1111_1111_1111_1111_1100_101, 23),
    (0b1111_1111_1111_1111_0110_01, 22),
    (0b1111_1111_1111_1111_1100_110, 23),
    (0b1111_1111_1111_1111_1100_111, 23),
    (0b1111_1111_1111_1111_1110_1111, 24),
    (0b1111_1111_1111_1111_0110_10, 22),
    (0b1111_1111_1111_1110_1110_1, 21),
    (0b1111_1111_1111_1110_1001, 20),
    (0b1111_1111_1111_1111_0110_11, 22),
    (0b1111_1111_1111_1111_0111_00, 22),
    (0b1111_1111_1111_1111_1101_000, 23),
    (0b1111_1111_1111_1111_1101_001, 23),
    (0b1111_1111_1111_1110_1111_0, 21),
    (0b1111_1111_1111_1111_1101_010, 23),
    (0b1111_1111_1111_1111_0111_01, 22),
    (0b1111_1111_1111_1111_0111_10, 22),
    (0b1111_1111_1111_1111_1111_0000, 24),
    (0b1111_1111_1111_1110_1111_1, 21),
    (0b1111_1111_1111_1111_0111_11, 22),
    (0b1111_1111_1111_1111_1101_011, 23),
    (0b1111_1111_1111_1111_1101_100, 23),
    (0b1111_1111_1111_1111_0000_0, 21),
    (0b1111_1111_1111_1111_0000_1, 21),
    (0b1111_1111_1111_1111_1000_00, 22),
    (0b1111_1111_1111_1111_0001_0, 21),
    (0b1111_1111_1111_1111_1101_101, 23),
    (0b1111_1111_1111_1111_1000_01, 22),
    (0b1111_1111_1111_1111_1101_110, 23),
    (0b1111_1111_1111_1111_1101_111, 23),
    (0b1111_1111_1111_1110_1010, 20),
    (0b1111_1111_1111_1111_1000_10, 22),
    (0b1111_1111_1111_1111_1000_11, 22),
    (0b1111_1111_1111_1111_1001_00, 22),
    (0b1111_1111_1111_1111_1110_000, 23),
    (0b1111_1111_1111_1111_1001_01, 22),
    (0b1111_1111_1111_1111_1001_10, 22),
    (0b1111_1111_1111_1111_1110_001, 23),
    (0b1111_1111_1111_1111_1111_1000_00, 26),
    (0b1111_1111_1111_1111_1111_1000_01, 26),
    (0b1111_1111_1111_1110_1011, 20),
    (0b1111_1111_1111_1110_001, 19),
    (0b1111_1111_1111_1111_1001_11, 22),
    (0b1111_1111_1111_1111_1110_010, 23),
    (0b1111_1111_1111_1111_1010_00, 22),
    (0b1111_1111_1111_1111_1111_0110_0, 25),
    (0b1111_1111_1111_1111_1111_1000_10, 26),
    (0b1111_1111_1111_1111_1111_1000_11, 26),
    (0b1111_1111_1111_1111_1111_1001_00, 26),
    (0b1111_1111_1111_1111_1111_1011_110, 27),
    (0b1111_1111_1111_1111_1111_1011_111, 27),
    (0b1111_1111_1111_1111_1111_1001_01, 26),
    (0b1111_1111_1111_1111_1111_0001, 24),
    (0b1111_1111_1111_1111_1111_0110_1, 25),
    (0b1111_1111_1111_1110_010, 19),
    (0b1111_1111_1111_1111_0001_1, 21),
    (0b1111_1111_1111_1111_1111_1001_10, 26),
    (0b1111_1111_1111_1111_1111_1100_000, 27),
    (0b1111_1111_1111_1111_1111_1100_001, 27),
    (0b1111_1111_1111_1111_1111_1001_11, 26),
    (0b1111_1111_1111_1111_1111_1100_010, 27),
    (0b1111_1111_1111_1111_1111_0010, 24),
    (0b1111_1111_1111_1111_0010_0, 21),
    (0b1111_1111_1111_1111_0010_1, 21),
    (0b1111_1111_1111_1111_1111_1010_00, 26),
    (0b1111_1111_1111_1111_1111_1010_01, 26),
    (0b1111_1111_1111_1111_1111_1111_1101, 28),
    (0b1111_1111_1111_1111_1111_1100_011, 27),
    (0b1111_1111_1111_1111_1111_1100_100, 27),
    (0b1111_1111_1111_1111_1111_1100_101, 27),
    (0b1111_1111_1111_1110_1100, 20),
    (0b1111_1111_1111_1111_1111_0011, 24),
    (0b1111_1111_1111_1110_1101, 20),
    (0b1111_1111_1111_1111_0011_0, 21),
    (0b1111_1111_1111_1111_1010_01, 22),
    (0b1111_1111_1111_1111_0011_1, 21),
    (0b1111_1111_1111_1111_0100_0, 21),
    (0b1111_1111_1111_1111_1110_011, 23),
    (0b1111_1111_1111_1111_1010_10, 22),
    (0b1111_1111_1111_1111_1010_11, 22),
    (0b1111_1111_1111_1111_1111_0111_0, 25),
    (0b1111_1111_1111_1111_1111_0111_1, 25),
    (0b1111_1111_1111_1111_1111_0100, 24),
    (0b1111_1111_1111_1111_1111_0101, 24),
    (0b1111_1111_1111_1111_1111_1010_10, 26),
    (0b1111_1111_1111_1111_1110_100, 23),
    (0b1111_1111_1111_1111_1111_1010_11, 26),
    (0b1111_1111_1111_1111_1111_1100_110, 27),
    (0b1111_1111_1111_1111_1111_1011_00, 26),
    (0b1111_1111_1111_1111_1111_1011_01, 26),
    (0b1111_1111_1111_1111_1111_1100_111, 27),
    (0b1111_1111_1111_1111_1111_1101_000, 27),
    (0b1111_1111_1111_1111_1111_1101_001, 27),
    (0b1111_1111_1111_1111_1111_1101_010, 27),
    (0b1111_1111_1111_1111_1111_1101_011, 27),
    (0b1111_1111_1111_1111_1111_1111_1110, 28),
    (0b1111_1111_1111_1111_1111_1101_100, 27),
    (0b1111_1111_1111_1111_1111_1101_101, 27),
    (0b1111_1111_1111_1111_1111_1101_110, 27),
    (0b1111_1111_1111_1111_1111_1101_111, 27),
    (0b1111_1111_1111_1111_1111_1110_000, 27),
    (0b1111_1111_1111_1111_1111_1011_10, 26),
    (0b1111_1111_1111_1111_1111_1111_1111_11, 30),
];