From 129ac460f73972097700ad2def6b4c36d6ebe6e1 Mon Sep 17 00:00:00 2001 From: Matias Linares Date: Tue, 8 Dec 2020 13:56:32 -0300 Subject: Add day 5 --- 2020/day5.raku | 46 ++++ 2020/day5.txt | 851 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 897 insertions(+) create mode 100644 2020/day5.raku create mode 100644 2020/day5.txt diff --git a/2020/day5.raku b/2020/day5.raku new file mode 100644 index 0000000..98151ef --- /dev/null +++ b/2020/day5.raku @@ -0,0 +1,46 @@ + +sub binary-partition(@code, $from is copy, $to is copy, $lower, $upper --> Int) { + for @code[0..*-1] { + when $lower { $to = ($from + $to) div 2 } + when $upper { $from = (($from + $to) div 2) + 1 } + } + return @code[*-1] eq $lower ?? $from !! $to; +} + +sub row(@code) { + binary-partition(@code, 0, 127, 'F', 'B') +} + +sub column(@code --> Int) { + binary-partition(@code, 0, 7, 'L', 'R') +} + +sub get-id($input) { + my $row = row($input.comb[0..^7]); + my $column = column($input.comb[7..^10]); + ($row * 8) + $column +} + +multi sub MAIN('part1', $file) { + say $file.IO.lines.map(*.&get-id).max; +} + +multi sub MAIN('part2', $file) { + my $gap = $file.IO.lines.map(*.&get-id).sort.rotor(2=>-1).grep( + -> ($a, $b) { + $a+1 != $b + } + ).head; + + say $gap.head + 1; +} + +multi sub MAIN('test') { + use Test; + is row(), 44, 'row'; + is column(), 5, 'column'; + + is get-id('BFFFBBFRRR'), 567, 'example 1'; + is get-id('FFFBBBFRRR'), 119, 'example 2'; + is get-id('BBFFBBFRLL'), 820, 'example 3'; +} diff --git a/2020/day5.txt b/2020/day5.txt new file mode 100644 index 0000000..47541e9 --- /dev/null +++ b/2020/day5.txt @@ -0,0 +1,851 @@ +FFFBBFBLLR +BFBBBFFRLR +BFBBBBFLRR +BBFBFFFLLR +BBFBFBFLLL +BFBFBFBLLR +FBBFFBFRLR +BFFBBBFLLR +FBFBFFBRLR +FBFFBFFRRR +BBFFFFFLRL +FFBFBBFLLL +BFBBBFBRLL +BFFBBFFRRR +BBFBBFBLLR +BBFBBBBRLL +FFBFFBBRRL +FBFBBFFLLR +BFFFBFBRLL +BFBFBBBRRR +FBBFBFBRLR +BFFBBBFLLL +BFBFBFFRLR +BFFFFBFRLR +BBFFFBFLLL +BBFBFBBLRR +FFBBFBFRRL +FBBFBFFRRR +BFBBBBFRRL +FBBBFFFRRL +FBFFFBBRRL +BBFBBBBLLL +BBFBFFFLLL +BFBFBFBLLL +BBFFBFBLLR +FBFFFBBLRL +BFBBFFBRRL +FFBFFFBRRL +BFFFFFFLRR +BBFBFBBRLL +BBFFBBFRRL +FFBFFFBRRR +BFFFBBFLRR +FBBBBBBRRL +BFBFFBFLRL +FFFFBBBRRR +BFFBFBBRLR +FFFFBBBLLL +FFBFBBFRLL +FBBFFFFRRR +FFFBFBFLLR +FFFBBFFLLR +FBFFFFBRRR +FBBFFBFRRL +FFBBFBBLLR +BFFBBBBRLR +FBFBBFBRLL +FFFBBFBLRL +FBFBBFFLLL +FBFFFFFRRR +FBFBBFBLLL +FBBFFBFRLL +FBFFBBFLLL +BFFFBFBLRL +BFFBFFBRLR +FBBFFFFRLL +BBFBBFFLLL +BFBFFFFLRR +FBBBBBBRRR +FBBFFFBRRR +FFFFBBBRRL +BBBFFFFRLL +FBFBBBFLRL +FBBBBFBRLL +FFBBBFFLRR +FBFFBBBLLL +BFBBFFFRRL +BFFFBBFRRL +BFFBFBBRLL +BFBFBBFLLL +FFFBBBBLRL +FBFBFBFRLL +BBFFBBFRLR +FBBBBBBLLR +BFFFBBBRRR +FFFBBBBLLR +FBBFBFBLRR +FFBBFFBLRR +BFFBFFFRLR +FFBBFBBLRL +FBBFBFFLLL +BFFFFBBLRL +FFBBFBBLLL +FBBBBBBLLL +FBFFFFBLLL +BFBBFBBRRR +FBFBFFFLRR +FFFBFFFRLR +FBFFFBFLRL +BFFBBFFLLR +FBBBBFFLLL +BBFBFBFRRR +BFFFBBBRLL +BFBFBFBLRR +FBFFFFFLLR +BFFFFBFLLR +BBFBFFBRRR +FBFBFFBLLL +FFFFBBBLLR +BFBFBBBLLR +FBBFBBFRRR +FBBFBBBRLR +BFFBFBFLLL +BFFBFFFLRR +FBBBFFFLLL +BFBBBFBRRR +FBBFBFFLLR +BFBBFBFRRR +FBFBBFBLRL +FBFBFFBRRR +BFBBFBBRLR +BFFFFFBLLL +FFBBFFBRLL +FFBBFFFLLR +BBFBFBFLRR +BBFFBBBRLR +BBFBBBFRRR +BBFBBFBLRR +FBBBFBFRRL +BFBBFBFLLR +BFBBFBBLLR +FFFBFFFLLL +FFBFFBFRRR +BFFBBFBRRR +FFFBFBBLLR +BBFFFBFRRL +FBFBBBFRLR +BFBFBBFRLL +BFFFBBFRLL +BBFBBFFLRR +BFFFBBBLLR +FBBFBBFRLR +FBFFBFBLLR +BBFFFBFLRR +BFBFBFBLRL +BFBFBFBRRR +FBBFFBBLRL +FFBBFBFLLL +BFBFFBFRLR +BBFBBBFRRL +BFBFFFFRRL +FFFBFFFRLL +BBFBFFBRRL +BBBFFFBLLR +BBFBFFFLRL +FFBFBBBLRR +FBFFFFFLLL +FFBBFFBLLL +FBBBBBFRLR +FBBFBFFRLR +BBBFFFFRLR +BFBBBBFRLR +FFBFFFFLRL +BFFFFFBRLL +FFBFFFBLLR +FFFBFBFLRL +FBBBBFBLRR +FBFFFBFLRR +BBFBBFFRLR +BFFFFFBRRR +BFFBBFBLLL +FBBBBFBLLL +BBFBBBBLRL +FBFBFBFRRL +BBFBBBBRRL +FFBFFFFRLL +FFBBBBBRLR +FFFBBBFRLL +FBFBBBBRLR +FFBFFBFRLR +FBFFBFFLLR +FFFBBFFRLL +BBFBFBBLLR +FBBFFFFLRR +FBFFBBBRLL +BFBFFBFLLL +BFBFFBFRRR +FFBBBBBRLL +FFBFBBBRRR +BFFBFFFRRR +FBBBBFFRLR +BBFFFFBRRR +BBFBBBBLRR +BFFFBBBLLL +BFFFFFFLRL +BFFBBBFRLR +FFBBFBBRLL +FBFFFBFLLL +FFFBFFBRLL +BFFFBFFLRL +FFBBFBFRLL +FBBBBBFRRR +BFFFFBFRLL +FBBBBFFRLL +BFBBBBBRLL +FBBBFBFLLL +FFFBBBBLRR +FFBFFBFLRL +FBFFBFBRLR +BFBFBFFLLR +FFBFFBBLRR +FFFBFBFLLL +BFBBBFFRRL +FFFBBFFRRR +BBFFBBFLLL +BBFFBBBLLR +FBFBFBBLLR +BFBFBBFLLR +FBBFBFBLLL +FFFBBBBRRR +FBFBFBFLRL +FFFBFFBRRR +FFFFBBBRLL +BBFBBBFLRL +FBBFFFFLLR +FBFFFFFLRR +FBBBFBBRLR +BFFFBFFRLL +FBBBFFBRRR +FBBBFFBLRR +BFFBBBBLLL +FBBFBBBLLR +FBBBBBFRRL +FBFBFBBRRL +FBFBFBFLLL +BBFBBFFRRR +FFFBFBBRRR +FFBBBBBLLL +BFBBBFFLRR +FFFBBBFRLR +FFFBFFBLRL +FBBFFBBLLR +FBFBBBBLLR +BFFFFFFRLL +FFBFFFFRLR +BBFFBBFLRL +BFBBBFBRLR +BFFBFBFRLR +FBBFFFBLLL +FBBBFFBRLR +FFBBFFFRRL +FBFBBFBRRR +BFFBBFBRRL +FBBBFBFRRR +FBBFBFFRRL +FBFFBBBLRL +BFBFFFBRRL +FBBBBBBLRL +BBFBFFBLRL +BBFFFFFRLL +FBFBBBBRLL +BBFBBFBRRL +BBFFFFFLLL +BFBBFFBRLR +BBFBFFBLLL +FBBFBBFLLL +BFFFBFBLLL +BBFBFFFRRR +FBBBBBFLRR +BFFFFFBRLR +FFBBFFFLLL +FFBBFBBRRL +FFFBFFFLRL +FBFFBFBLRL +BBFFBFFLRL +BFFBBFFRLL +BBFBBBFLLR +FBBBFFBRLL +BFBBFBBLRR +BBFFFBFRRR +FFBFFBBLRL +FFFBBBFLLL +FFBBBBFRLR +BFBBFBFLRL +BFFBFBFRRR +FBBFFFFRRL +BBFBBFBLLL +FFBBBFBRRL +BFFFBFFLLR +FBBFFFBRLL +BFBBFBFLLL +FBBFBFFLRR +BFBFFFFLLL +FFBBBFBRRR +FFBBBFBLRR +FFBBBFFRLR +FFBBBFBLLL +FFFBFBBRLR +BFBFFFFLLR +BBFFBBBRLL +BBFBFBFLLR +FFBBBFFRLL +FBFFBFBRLL +FFFBFFFLLR +BBFBBBBLLR +FBFBBBFRRR +BBFBBFBRLL +FFBBBBFRLL +BFBFBFBRLL +FBFFFFBLLR +BFFFFBFLLL +BFBBBBBRLR +BFFFBFBRLR +BFFBFBBLLL +FBFFFBFRLR +FFFBFFFRRL +BBBFFFFRRL +FFFBBBBRLL +FBBFFFFLLL +FFFBFBBLLL +BFFFBBFLRL +FBBBBBFRLL +FBFFBBFRLL +BFFBFFBRRL +BBFFFBBLRL +BBFBBFBRLR +BFBFBFFRLL +BBFFBFFLRR +FFBBBBBRRR +FFBFBBFLLR +FFFBBBFLRR +FBBFFFBRRL +BBFBBBFRLR +FFFBBBBRLR +BFBBFBFLRR +BBFFBBBRRR +FBFFFFBLRL +FBBFFBFLLR +FBBFBBFLRR +BBFFBFFLLR +FFBFFFFLRR +BFBFFFBRLL +FBFBFFFRRL +FBBFFFBRLR +BFFBFFFRRL +FBFFFBBRLR +FBFFBBFRRL +FFBFFBBLLL +BFBFFBBRRL +BFBFBBBRLL +FBFFFBBLRR +FBBFBBBRLL +FBBBBFBRRR +FBBBFFBLLR +BBFBFBBRRR +FFFBBBFLLR +BFFFBBBLRR +FFFBFFBLLR +FFBFFFBRLL +BFBBBBBLLL +FBFFFBBRRR +FFBBFFBLLR +BFFBBFFLRL +FFBBBBBLRL +FFBFBBBRLL +FBBFBBBLRR +FFFBFFBLLL +FFBFBBBLLR +BBFFBBFLLR +FFFBFBBRLL +FFBFBBFRLR +BFFBBBFRRR +BFBFFBFRLL +FFBBFBBRRR +FFBFBFBLRR +BFBBBFBLLL +FFBFBFBRLL +BFFBFFFLRL +BBFBFBFRLL +BFFFBFFLLL +FBFBFBFRLR +FFBFBFFLLR +FBBFBBFLLR +FBBBBFBLLR +FBFFBFFLLL +FFBBBFFRRR +FBBFFFFLRL +FBFFBBFLLR +FFBBBBFLRL +FBBFBFFLRL +BFBFFFBLRL +BFFFFFBLRR +FFBBBBFLLL +BFBBBFFLLR +FBBFBBBLLL +BBFFBBBLRL +FBFBFFFRLR +BFFBFBFRLL +BFBBFBBLRL +BBFFBFFRRR +FBBBFBBLLR +BFBBFFBLRL +FFBFBFFLLL +BFBFBBBRLR +FBBFBFBLLR +FFBBBFFLLR +FFBBBFBRLR +BFFFBBBLRL +FBBFBFFRLL +FBFBFBBLLL +BFFBFBFLRR +FFBFBFFRLL +BBFFBFFRLR +BFBFBBBLLL +BBFFBBBLRR +FBFBBBBLRR +FBBFFBFRRR +BBFBFFFLRR +BFFFFBBRRL +FFBBBFFLLL +BFBBBBFLLL +BBFFFBBRLL +BFFBFFFLLL +FFBBBBFLLR +BBFFFFFRRR +BBFFFFFLRR +BBFBFBBLLL +BBFBFBFRRL +FBBBFFFRLR +FFBBBFBRLL +FBFFBFFLRL +BFBFFFFRLL +FBFFBBBRRR +FBBBFBFLRL +BFBBFFFLRL +BBFBFBFLRL +FFBFFBFRLL +FFBFBBBLRL +FFFBBFFLRR +FBBFBBBLRL +BFBBFFFLLL +FBBFFBFLRL +BFFBFBFLLR +BBFFFFBRRL +BFFFFBFLRR +FFFBBFBRLR +FFBBFBBRLR +FFBFBFBLRL +BFFFFFBRRL +FBBFFBFLLL +FBFFBFFLRR +FFBBBBFRRL +FBFFBBFLRR +FBBBFBFRLR +BFBBFFFLRR +FBFFFBBLLL +FBFBBBFRLL +FBFFBFFRLR +FFBBBFFLRL +FFBFFFBLLL +FBBBFBBRRL +BFFBFBFLRL +FFBFFFFLLR +FBBBFFFLRL +BFFFFBFLRL +BBFBBFBRRR +FFFBBBBRRL +BBFBFFFRLR +BFBFBBBLRR +FFFBBFBLLL +BFBBBBFLRL +FBBFFBBLRR +FFBBFFBRLR +BFBBBBFRRR +BFFBBFBLRR +FBFBFFBRLL +BBFBBBBRLR +BBFFFBFLLR +BFFFFBBLLL +FBBFFFBLRR +FFFBFBFLRR +FBFFBBFRRR +FBBBFFFLLR +BFFFFBFRRR +FBBBFBBRRR +FBFFFFFRRL +BFBFFBBLLR +BFBFFFFRRR +BFBFBBFRRR +BFBBBFBLRR +BFFBFBBRRR +BBFFFBBLRR +BFFBBBBLLR +FBFFFFFLRL +BBFBBBFLRR +BFBBBBBRRR +BFBBFBFRLR +FFBFFFBRLR +BBFBBFFLRL +FBFFFFBLRR +FFFBFBFRRR +BFFBFBFRRL +FFBBBBBLRR +FBFFFFFRLL +BFFBFBBLLR +BBFBFFBRLL +FBBBFBBLRR +FBFBBFFLRL +BFFFFFFRLR +BFFBBBFLRL +BFFBFFBLRR +BFFFFBFRRL +BFFBBBFRRL +BFFFFFBLRL +FFBBBBBRRL +FFFFBBBRLR +BFFBBFFRRL +FBBBFFFRLL +FBBFFBBRLR +FBBBBFFRRL +FBBBFBBRLL +FFBBFFBRRL +BBFFFFBRLL +FBBFFFFRLR +BFBFFFBRLR +FBFFBBFRLR +FBBFFFBLLR +BFBBFFBRLL +FBFFFFFRLR +FFFBBFBRRR +BBFBFBBLRL +BBFFFBFRLR +BFBFBBFRLR +BBFFBFBRLR +FBFBBBBLLL +FBBBFFBLLL +FBFBFFFRLL +BFFBBFFLLL +FBBBBBFLLR +BFFFBBBRRL +FBFFFBFRLL +FBFBFBFLLR +FBFFFFBRLR +BFBBBBBLRR +FFBFFFFLLL +BFBFBFFRRL +FFBFFBBRRR +BBFFFBFRLL +FFBFBFBRRR +FFBFFBFLRR +FBBFFBBRLL +BBFFBBFRLL +FFBFBBFLRL +FBFBFFFLLL +FFFBBBFLRL +BFFBBBFRLL +BFFFFBBLRR +FFBBFFFRLL +BBFFBBBLLL +FFFBBFBRRL +BFFBFFBLRL +FFBFFFFRRL +FFBBFFFLRR +BFBBFFFRLR +BFBFFBBRLR +BBFBBFFLLR +BFFBFBBLRR +BBBFFFFLLR +FBBBFFFLRR +BBFBFFFRLL +FFBFBFBLLR +FFFBBFBRLL +BBFBBBFRLL +FBBBBFBLRL +FBFFBFFRRL +BFBFBFFRRR +BFBBBFBLLR +BFFBBFFRLR +FBFFFBFRRL +FBFBFFBLRL +FFBBFBBLRR +BFFBBFBLLR +FFFBBFBLRR +BFBFFBBLRL +FFBFBBFLRR +BFFFBFBRRR +BFBBFFFLLR +BBFFBFBLLL +BFFFBFFRLR +FBFBBFFRLR +FFBFBFBRRL +BBFBFBBRRL +FBBFBFBLRL +BFBFFBFRRL +BFBFFBFLLR +BFFFBBFRRR +BBFBBBBRRR +FBBFBBBRRR +FBBFBFBRLL +FFBFFBBLLR +BBFFBFBLRR +FBFFBBBLLR +BBFBFFBLRR +BBFBFFFRRL +BFFBBFBRLR +BBFFBBBRRL +FBBFFBFLRR +BFBBBFFRLL +BFFFBBFLLR +BFFBBBBLRR +BBFFBBFRRR +BFBFBBFLRR +FBFBFBBRLL +BBFFFFBRLR +FFBFBBBRRL +BBFBFBBRLR +FBFBFFFLLR +FBFBBBFLRR +FFBFBFFRRR +BFFBFFBRRR +BFFFFFFRRL +BFBFFBBRLL +FBFBFFFLRL +FFBBBFFRRL +BFFFFBBRLR +FFBFFFBLRR +FFBBFBFLRR +BBFFFBBRLR +FBFBBFFRLL +FFFBBFFLLL +FBBBFBBLRL +BBFFFFFLLR +BBFFFBFLRL +FBBBBBFLLL +FFFBFFFRRR +FBFBFBBRRR +BFBBFFBLRR +FBFBBBFRRL +FBBBFBFRLL +BBFFFBBRRL +FBFFBFBLLL +BFBBFBBLLL +FFBFFBFLLR +BBFBBFFRRL +FBFFFFBRLL +BFFFBBFLLL +FFFBFFBLRR +BFBBFFBLLL +FBBBBBBRLL +FFBBFFBLRL +BFBBBBBLRL +FBBBBFFLLR +BFFBBFBRLL +BFBFBFFLRL +BBFFFFFRRL +BFBFBFFLLL +FBFFBBFLRL +BBFBBFFRLL +BFBFFBBLLL +BFFFBFBLLR +BBBFFFBLLL +BBFBBBFLLL +FFBFBFFLRR +BFFFFFFLLL +BBFFBFBRRR +FFFBFBFRLR +FBBBFBFLLR +FFBFBFFLRL +BFBFBFBRRL +FBBFFBBRRR +BFFBBFFLRR +BFFBFBBLRL +FFBFFBBRLL +FBFBFFBLLR +BFFFFFFLLR +FFFFBBBLRR +FBFFFBFRRR +BFBBBFFRRR +BFBBFBBRLL +FFBFBFFRRL +BFFBFFBLLL +FFBBFFFLRL +FBBBBBBRLR +FBBBFBFLRR +FBFBFBBLRR +BFFFBBFRLR +FFBFBBFRRL +FBFFFBFLLR +BBFFBBFLRR +BBBFFFFLRL +BBBFFFFRRR +FBFFFFBRRL +BFBFFFBRRR +BFFFBFBRRL +FBFBFBBLRL +BFBFFFFLRL +FBFBBBBRRR +BFFFBBBRLR +FBBBFFBLRL +FFFBFBBRRL +FBBFBBFRRL +BFBBBFBRRL +FFBBFFFRLR +BBFBBFBLRL +FBFBBFBRLR +BBFFBFFRLL +FBBFBBBRRL +FBBFBBFRLL +BFBFBBFRRL +FFBFFFBLRL +BFFBFFFRLL +BFBFBBBRRL +FFBBFBFLRL +FBFBBBBLRL +BFFBBBFLRR +FFFFBBFRRR +FBFBBFFRRR +BFFFBFFRRL +BFBBFFFRLL +FFBBBFBLLR +BFBFFBFLRR +FBFBBFFLRR +FFBFBFFRLR +FBBBBFFLRL +FFFBBFFLRL +FBFBFFBRRL +BFBBFBFRRL +FBBFBFBRRL +FFFBBFFRLR +FFBFBFBRLR +FFBFFBBRLR +BBFFBFFLLL +BFBFFBBRRR +BFBBBBBRRL +BFBFFFBLRR +FBFBBFFRRL +BBFBFBFRLR +BFFFFFBLLR +FBBBFFBRRL +FBFFBBBLRR +BBFFFFBLLL +BFBFFFBLLR +FFBFBBBLLL +BFFFFBBRLL +BFFBBBBRRL +FBFBFBBRLR +FBFBBBFLLR +FFBFFBFLLL +BFBBFBFRLL +BFBBFFFRRR +BFBBFFBRRR +BFFBBFBLRL +BFFBBBBLRL +FFFBFFFLRR +BFBBFFBLLR +FFFBFFBRRL +BFBBBBFRLL +FFBBFBFRLR +FBBBFBBLLL +BBBFFFFLLL +BBFFFFBLRL +BBFBFFBRLR +BFBFBBFLRL +FFFBFFBRLR +FFFBFBFRLL +BBFFFFBLLR +BFBFBFBRLR +FBFBBFBLRR +BBFFFBBLLR +FBFBBBFLLL +BFFFBFFRRR +BBFBFFBLLR +BFFBFBBRRL +FBBBBFFRRR +BFFFFBBRRR +FFBBBFBLRL +BFBBBBBLLR +FFBBFFFRRR +FFFBBBBLLL +FBBBBFBRLR +BBBFFFBLRL +FBFBFBFLRR +BFFBFFBRLL +BFFBBBBRLL +BBFFBFBRRL +FFBFBBFRRR +FBFFBFBRRL +BFBBBFFLLL +FBBBFFFRRR +FBBBBBFLRL +FBBFBBFLRL +FFBFFFFRRR +FFFFBBBLRL +FBFBBFBRRL +BBBFFFFLRR +FFFBFBBLRR +BBFFBFBRLL +FFBBFFBRRR +FBFFBFFRLL +FFBFFBFRRL +FBFBFFFRRR +BFFBFFFLLR +BFBBFBBRRL +FFFBFBFRRL +BFBBBBFLLR +BFFFBFFLRR +FBBFFFBLRL +BFFFFBBLLR +BFBFBFFLRR +FFBBBBFLRR +FBBBBFFLRR +FBBBBFBRRL +BBFFFFFRLR +FBFFFBBLLR +FFFBBBFRRR +BBFFFBBRRR +FBBFBFBRRR +FBBBBBBLRR +FFFBFBBLRL +BFBFFFBLLL +FFBBFBFLLR +FFBBBBFRRR +FBFFBBBRLR +FBFBFFBLRR +BBFFBFBLRL +FBFFBFBRRR +BFBFBBBLRL +FFFBBBFRRL +BFBBBFFLRL +BBFFBFFRRL +FFFBBFFRRL +BFBFFBBLRR +BBFFFBBLLL +BFBBBFBLRL +BFFBFFBLLR +BFBFFFFRLR +FFBBBBBLLR +BFFBBBBRRR +FBBFFBBLLL +FBFBFBFRRR +FBFBBFBLLR +FBBFFBBRRL +FFBFBFBLLL +BFFFBFBLRR +FBFBBBBRRL +FBFFBFBLRR +FBFFBBBRRL +FFBFBBBRLR +BBFFFFBLRR +FBFFFBBRLL +FFBBFBFRRR -- cgit v1.2.3-70-g09d2