Skip to content

Commit 9d3fb8a

Browse files
author
Adrian Reimann
committed
full solution for day 20
1 parent 2a7d2c6 commit 9d3fb8a

File tree

5 files changed

+351
-0
lines changed

5 files changed

+351
-0
lines changed

day_20/20-1.php

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
<?php
2+
3+
//define how often to reprocess the image
4+
if(!isset($iterations)) {
5+
$iterations = 2;
6+
}
7+
8+
//read input (first line is the algorithm the rest a multidimensional array acting as input image)
9+
$algorithm = '';
10+
$input_img = [];
11+
$input = fopen("input.txt", "r");
12+
while (($input_line = fgets($input)) !== false) {
13+
$line = trim($input_line);
14+
15+
if(empty($line)) continue; //skip the line between algorithm and input image
16+
17+
//if the algorithm has not been set yet this must be the first line
18+
if(empty($algorithm)) {
19+
$algorithm = $line;
20+
}
21+
else {
22+
$input_img[] = str_split($line, 1);
23+
}
24+
}
25+
fclose($input);
26+
27+
//replace . and # with 0 and 1 already in image and algo, for binary string and later LED count (we have no use for the inital representation)
28+
$algorithm = str_replace(['.', '#'], [0, 1], $algorithm);;
29+
foreach ($input_img as $row_no => $img_row) {
30+
foreach ($img_row as $loc => $led) {
31+
$input_img[$row_no][$loc] = str_replace(['.', '#'], [0, 1], $led);
32+
}
33+
}
34+
35+
//pad image as many times as there are iterations
36+
$input_img = padImage($input_img, $iterations);
37+
38+
//process input as often as defined by $iterations
39+
for($i = 0; $i < $iterations; $i++) {
40+
$input_img = processImage($input_img, $algorithm, $i);
41+
}
42+
43+
//count switched on LEDs
44+
$led_count = 0;
45+
foreach ($input_img as $row_no => $img_row) {
46+
$led_count += array_sum($img_row);
47+
}
48+
49+
//result
50+
echo "After processing the input image twice, $led_count LEDs are lit up." . PHP_EOL;
51+
52+
53+
/**
54+
* Add 0 values in columns and rows to all four sides of the input as often as specified by count
55+
*
56+
* @author Adrian
57+
* @date_created 2021-12-20
58+
*
59+
* @param array $input_img multidimensional array to be padded
60+
* @param int $count how many rows/cols to add (per side)
61+
*
62+
* @return array the padded image
63+
*/
64+
function padImage(array $input_img, int $count)
65+
{
66+
for ($i = 1; $i <= $count; $i++) {
67+
68+
//add columns left and right
69+
foreach ($input_img as $row_no => $input_row) {
70+
array_unshift($input_img[$row_no], '0');
71+
array_push($input_img[$row_no], '0');
72+
}
73+
74+
//add rows above and below
75+
array_unshift($input_img, array_fill(0, count($input_img[0]), '0'));
76+
array_push($input_img, array_fill(0, count($input_img[0]), '0'));
77+
}
78+
79+
return $input_img;
80+
}
81+
82+
/**
83+
* Use the supplied algorithm to "enhance" the image by changing 0s and 1s into each other as specified.
84+
* Takes as optional parameter the current iteration count to handle the outer "infinite" image.
85+
*
86+
* @author Adrian
87+
* @date_created 2021-12-20
88+
*
89+
* @param array $input_img image to be processed/enhanced
90+
* @param string $algorithm The algorithm to apply to the image
91+
* @param int $i Optional iteration count to handle an algorithm that changes 0 to 1 for decimal 0
92+
*
93+
* @return array the processed/enhanced image
94+
*/
95+
function processImage($input_img, $algorithm, $i = 0) {
96+
97+
//if the algorithm converts 9 dots to 0, nothing changes, if it converts them to 1, means the "infinite" pixels aroud need to all become 1 every odd iteration
98+
$alt = $algorithm[0] == 0 ? 0 : $i%2;
99+
100+
$output_img = [];
101+
foreach ($input_img as $row_no => $img_row) {
102+
foreach ($img_row as $loc => $led) {
103+
104+
//find the nine LEDs around it and build the string, add 0 if not exists as "infinite image"
105+
$led_string = '';
106+
foreach (range(-1, 1) as $row_mod) {
107+
foreach (range(-1, 1) as $loc_mod) {
108+
$led_string .= $input_img[$row_no+$row_mod][$loc+$loc_mod] ?? $alt;
109+
}
110+
}
111+
112+
//lookup dec location on algorithm and set on new output
113+
$offset = bindec($led_string);
114+
$output_img[$row_no][$loc] = substr($algorithm, $offset, 1);
115+
}
116+
}
117+
118+
return $output_img;
119+
}

day_20/20-2.php

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
//just run 50 instead of 2 iterations
4+
$iterations = 50;
5+
6+
include('20-1.php');

day_20/input.txt

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
####....#.....##.####..#.##.###.########.##.#..#.##.#...#..##.######..#......#..###.#.##.####.#.#.#....######.###...###.#.###.####..###.......#..#.#.#.#.#.####..####.#..####.#..####..##.#.#.#.###..##..#....#...###.#....###....##.###...##..#..#..#...##...#.#..#..###...####.#.#.###..#.#.#..###.##.##.#..###...#.#.#.##...#...#..#...##..###..###..#...###.#....#.##.#.####...##...##.#.####.#####.##...#######.###..##.#####.##.....####.#######.#.#.##....#...##...#..##.###.######.#######.#.#.#....#..##.###.#..##..##.
2+
3+
###..#..........#.#.###.###.#.#..###.#.###.###.#....#.#.....###.#...#####.####...####.#..####....##.
4+
#..####.##.##..###..#.#...#.######.#.#.#.......######......#...###.####...#..#..#.#.###.#.##.#..#..#
5+
#..#####.....###....#..##..#...##...#.####..##...#..##.#.#...#.#.......#...#.#....##.##.#..#..#.###.
6+
.#.#..#..##.##.#.##..##....###...#..#.#.#..##..#.####...#..##...###.#.#.#..#.#..##..##.#.##......###
7+
##.#.###...#.#.#.#..#.....##.....##.#.#.#.###..#.#...####..###.##...#..#.##....##....#...#..#.###..#
8+
###..#.#.#.....#....#.##.####..###.#####..#..########.##.#.#..#...#####..####.#...#..###..###...#..#
9+
#.#.##..###..##.##.#.#..###.##...#..#..#..#...#..#.#.###...#..##.##.##..###.#.#.#..#....#....####.#.
10+
#.###.#..##..#.###.#####.#..#.###..##...#..#.#.###...##.#...###...#...#...##..#...##.#..##.##.###...
11+
.#.###..#.#.#.####.#.##...#....#....#.#.##....##.#####.#....#....#####..#.#......###....###..##....#
12+
.##.......#...#.#.#....#....#..#..#.###.#.#.##########.##..#####..#.#.##...#..#.###.#...#.#....#####
13+
..#..#.###.#.#.####..###.####.#.###.#..#..#.#...#..#.#..####.#.#####.#..#...##.#.#.###.##.####......
14+
.##..#..#####...#..#.#..#.......#.#.#.#..####.##..#..##.##...#...######..####...#....#....##.#.#.##.
15+
...#.##.#..##..#.##.##.##.#.#.....#.....#..#.#.#..#...####.#####.##.###.#..####..####..#.##....###.#
16+
.##.##......##.#..#....#######..##.####.#...######....######.##.#.##..#..#.#..##..##.#.#####.#.....#
17+
###..#####.#..#...#.##...###...##.#.##..##.##.####.###..#.##.#.##.###....#..#.##.###..##.##.##..##.#
18+
.#.#.##.#.......#.#..#...#.######..#..##.##.##.###.##.###.#.#.#...#..##.##.###..#..#..#..##..#.#.#..
19+
##..###..#...##.#....##....#...##.#.#####.#..#.###.#..#..#####.##.#######.####.##.#..##.##..#.####.#
20+
.#..###.##...#.#.###.#.#.##.##.#.#...#..#.###..#.#.#####..#..###...#.#..#.###......###.#.#...##.##.#
21+
...#.#..#...###...#..#####.##..####..###.###.#....#....#...#.###.#..##.#.#.##...#.###..###..##.##.#.
22+
##..#.#.###.#####...#####..#.###..##.#.#.#...##.#####.####.....#.###...##.####.#...#....#..#..###.##
23+
#.....#.#.##.###...#..######.#.#.#######.#..#.##.#.#...#..###.###.#..........####..#..#...#######...
24+
.##..##.#..#.#...##.###.....##.#..#...#..##.#.....#.#.#.##.###.#######..###.....#.###..#....##.#.#..
25+
.##.#.##.....#...#...#.#.#..#......##.#.##.#..#....#....#####.######..#......####...#.###.##.##..##.
26+
.#.####....###...#..##.#####.#....##.#.##..#.#.#.#.##.#.#......###.#..###.###.....#.#.###...#.##.#..
27+
..#.....##...##...#.#..##...#.....#..#.#.####.#......#.###...#.#.#..##.##.##.##.#....##..###.#.#.#.#
28+
#.###..#...#..#.#.....##.####.#......#####...#####.##.#######..####.......##.###....#.###....##..#..
29+
##.#.#..........#....###...##.###.##.#.#....##..#....#.##.##..####...##...##.##..#.#.#######..###.##
30+
.###.##.#..###############.#.#..#..##..#.#####.##.#..##.#......#.##...####.......#####..########.#.#
31+
......#..#..#.#####.#..#.#.##.##..###.###..####.##...#.#.....####..#..#..#..##...#.#..#.###.#..##...
32+
#....###...##.###..###..#.##.....#.#....##..###..###.##..##..#.##..###.##.##.#..#.....##.#.#.##.....
33+
.#.###.###..#.##..#...##..##..##....#..#..#..####.##..##..##....#.##..#.#...#....###.##..#.#..#.#.##
34+
.#.#.###.#..###.#..#.#.#.##..#.#...#####.#.#.########.###...####.##.....#...#..#..####..#.########..
35+
..##.##.#.##.##.##..##.#..#.##.##.##.########.####...##.#.##.#####...###..#....##....##..#..####...#
36+
..##.###.......##......##.#####.####.###.#.#.#.#.#.#.##.###.#...#.#..##..#....#......#.#..#....#.#..
37+
######..#..######..##.##.#..#..##...#.#.##.##.#.####.##..##..#.###.#...##..#..#.#........##.##.##...
38+
.#..##...#.#..##.#.....######..#.#######..#.#..#.##.##.#.####.#..##.#..#...#..##...#.#.###.######.##
39+
......#....##.####....#.####..#..#...####...#.##..##....##....##.#.#.##.########..#....#.###.#...#.#
40+
.......#.....#.#.##..#....##.###.#..##.#.#...#..#......#.#..#......#...#....#..#.##....###.##.###...
41+
#..#.##.#...#.##..######..#.##...###..#...#..####.#......#..#.#..##.#.####.#...##.#...#.#.#..##.#.#.
42+
#...##.#...#.##..#.##..#..#.#.#..#.##...######..#..#..#..#..#...###..##.###.#.#...#..####.####...#.#
43+
####.#....###.#..##.#.#..#...#..##.##.##...##.#########..#.......#######...#.#.####.#...#...##....##
44+
.##..#.#..#.#.#..#.###.##.##.#.#.#####.......#####.......#.#.##.##..##......#.#####..###......#..###
45+
...##..#.#.##..#######.#..#..#.....#..#.########..###.###.#.##.#..###...#..#....##.#.#####.##.##.#.#
46+
##....#...#.###.#...#....###.#.#...###.....##.##.#...#.##..##.##.##.##....##.##.##.##.####.......#.#
47+
##.####.###..####..#...###..####.##.##.#######.#..####.##.######.#...#.####.##.##.#....#.##..#.#.##.
48+
..##..######.#.#.##..#..#####..#.#..#......###..######.##....#........#.##.#.##.##.#.....###...#.#.#
49+
#.#...#..##.#..##.#.#..#..######.#....#..##.#....###..##.#.#.#.#.#..###.###.###..##...#.......##.#.#
50+
#.#.#.#####.##...####.##.##.##...#..##.##.##.###.#...##...#.##..##..#.#...##..#....##..#......#####.
51+
##.##.....#.#.#...####.#...#####.##...#.....#..#..#.#.#.#..#....#.#.##....##.##....##.##.#.#......##
52+
#.#.##..#.#..#.....#..#.#..###.#..#####....####..######..#..##.#.#.#..##..####.....#######...#.#.##.
53+
##...###.....##...#.#.##.####..#...###.#..######.....######....##..####..#####..##.###......#..##..#
54+
##.#.###.#.##.####.###.##..##........#..#####.....#.###.#.#....##.#.###.#...#.#..#.........##.#.##..
55+
....#.####...#.#........###..#.###.###..####..####...#.##...###########.#.##.###..#..####.#..#.##.##
56+
.#####....##.#.#..#..#.##...##......##.#.#....######.......###.#.#.##.#.....#...#.#.....#.###...###.
57+
##..#..####..###.###...#...#.##.#.#..##.#.##.##.##....#.#.#...#...#..#.#.###....#..##.......##.#.#..
58+
##.#.#.##.#.#.######..###..#..####.........##.#..##########.###..#.#..#...##.##...#####.....#.#..#.#
59+
##.#..#..#.#.##...######.#...##..###..##..##.#..####..#..##.#....##.#........#####.###...###.##...#.
60+
....#.#.##...##...##..####.#####.#.#####.#..#.########....##.....###.#.##.#..####.##.#.....###.#.#..
61+
#####.#.#.###.#####.##...###.####..##.##..##.##.##.#.###.####..##...#.##.#..##...######...#.....##.#
62+
#..##.#.###.###....#..###..........#.##.#..#.#.####..#.####..###......##.....#.###....###.#.....#.##
63+
.######...#####.###..##.#......###...###..#.#.#.###..#.###.....#.#...##..#..##.##.##..#......#.####.
64+
#..##..#...##.##...###......#..#.###..###..##....##...##.##.#...####.####..##...##.#..#....##.#.#.#.
65+
#.##..##.......#.#.##.##.#....###....#.###.##.#....#.#..####....###.##.#.##...#..#.##...#......#.#..
66+
..#..#...#.....#.##.#.####......#....#.##...###.#...##.#..#..#......#...##.###.###..#.##.####...#...
67+
#..##.##.#.##..####.#.##...#.#.#.#.##.#.##....#.#.#...#.####...####.#.##......###..#..##.##...#..#.#
68+
...#..#.#.#...#....####.#.##....###.#..#.####.##..#.##.##...#.#.##.#.#.....#.....###.###..###.#####.
69+
..#.####.....#..##.##..#...##..#...##....#.#####.#..#...#..#..#..#####.#.##.#.....#.###..###..#...##
70+
#.##...#.##...#..#.......#.....###...##.#..#.......#...#.#..####...#...#..##....####..#..###.#..#...
71+
......##...#..#..####..##.#.#...#.#...###....###.##..#.#.##.#.##.##.#.#.#####.##.####.###.#.#.###...
72+
#.#.#.#..#...#...#....##.######....###.#..#..#.#..##..##.###...#..#.##...###..####...###...##.######
73+
.####..###.#.#...#.#.#.#..###....##.###.##.....#.#.####...#.##..###.#.####.##.###..###.##..#.....#.#
74+
.......#..##.##.######..#.####.#...##.##..##.##.##.#.##.##.#.#...##.#.#..#..#.#..#.#.##.###.###.#...
75+
.#.......#..#.#..#.#..##...##..#.....#.#.##.##...#.#######.#.##.#..#....#.##...#####..###.#.#.#.##..
76+
##.##..#.###...##......#..#.#.#..#...#.#.#...##.###..#.#####..###.##....#..###.......##.#...#..#.###
77+
#.####..#....#...###.#.##.##..#..#..###...#..#.####.##....#.#..#..#.##.##..###.##.##..##.#.#.##.###.
78+
###.#...###...##...##.#..#..#####.#....##.#..##...###..#..##.#.####.##.#..###.##..#.#..##....#..##..
79+
#.####.####.##.#.....###..#.##..##..#....#......##...#...#.###..##.###..#......####.##.#..#.#.##.#..
80+
.......###.#.#.....####.#..####.......##......#.#.#....#####...##..###.....#.#..###..#.####.##.#.###
81+
#..#..#...#..#####..###..#..##.#.#...####..#.#......#.#...##.##..#.##.####..#####.####..#.#..####.##
82+
#..######..#......#..####..##....###.#.##.#.#.#####.#.##.#..##..#.##.####.#.##.#.#.###..###.###...##
83+
...#.#.####.##..##....####..#......###..##...##.#...#.#...#..#.#..##....###.##.#..#####.##..###.#.##
84+
..#####.##..####..#...#...#.###..#..##.#..#.#....#.####.##...#.#####..#.##..#.#######.#..#.##......#
85+
##....##.#.#.#.##...######..##..#.#.##....##.#...###.#..######.#.##..######.##..#...#..#..###..#.##.
86+
.###...###..#####.#......####.......####..#.....##..#.##..#..#####..##.#...#.#...#.###..###....#####
87+
.###.#...#.##.#.##.#.....#..#..#.#####.....####.##..####..#...#.###.#..#.##.#...####..#....#.##...#.
88+
#...##..##.#.##.###.##..#..#.....#..#.###.####.#...#.##.##....#.#.#####.######.#...###.##.#.#.#.#.#.
89+
#.#####...#.#.#####..#.#..#...######...##.##.###.#....#..###.........#.##...#.##...#.##...####....#.
90+
.###.#####..##.##..#.###.....######.######....##..##.#.##.#####..###..###...##.#..##.#..#..........#
91+
....#.#.#.##...#####..###...#..#.####.##..####...####..........#....#.#.#..#...####.##.........#####
92+
####.##..##...#.#.###..#####.....##.#....#.#...#.#####.#####...#.##.##..###.......##.##..##..####.#.
93+
#..#####...##....#.#.#######.#..##..##..##.#..######.###.#.###..##.####.##..#.#.##.##..#.##.#.###.##
94+
#####...#...#.##.##..##.###.##.###..####...##..##..#.#.#.#.#.####.#.#..#.###...#.#........#..###.#..
95+
.###.#..#.##.#.####.#....###..#.#.##.#.....#..#.###..####..###..#.##.#.##.##.....###..#.##...#..#...
96+
.#.#....#.###.#.#...#.#.##..#..#....#####.....###.###..#.####..###.###.#####...#..#.###.#..##.#..##.
97+
.##...#.#....###...###.#.#.##.##.#..###.#.#...#.###.#.#...##..###.##.......#....#..#..#...#..#...###
98+
.###.###.###.##.#.#.#...#.#..#..#.#.#.#.#.#.##.###.##.##..##..#...#.#.####..#.##..##......#...#.#.##
99+
#####.#........#...#####..#.#.####..##.##..##..####.#......##.#.....#..#.###.#..######.#..#.#..#..#.
100+
#...#..####...###.#####..#.#.#..####....#.##..##..#..#.#..###.....#...#.#....##.###.....#...###.###.
101+
...#......#...#.###.#...#....##.....##...###.###.#....##.##.#...##.####.#.##.###.##.###..#.#.###.##.
102+
#####...###.##.##.#..###.#...#..#..#..#...#####.#####..#..#......#.#.######.##.#########..##.###..#.

day_20/puzzle.txt

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
--- Day 20: Trench Map ---
2+
3+
With the scanners fully deployed, you turn their attention to mapping the floor of the ocean trench.
4+
5+
When you get back the image from the scanners, it seems to just be random noise. Perhaps you can combine an image enhancement algorithm and the input image (your puzzle input) to clean it up a little.
6+
7+
For example:
8+
9+
..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..##
10+
#..######.###...####..#..#####..##..#.#####...##.#.#..#.##..#.#......#.###
11+
.######.###.####...#.##.##..#..#..#####.....#.#....###..#.##......#.....#.
12+
.#..#..##..#...##.######.####.####.#.#...#.......#..#.#.#...####.##.#.....
13+
.#..#...##.#.##..#...##.#.##..###.#......#.#.......#.#.#.####.###.##...#..
14+
...####.#..#..#.##.#....##..#.####....##...##..#...#......#.#.......#.....
15+
..##..####..#...#.#.#...##..#.#..###..#####........#..####......#..#
16+
17+
#..#.
18+
#....
19+
##..#
20+
..#..
21+
..###
22+
23+
The first section is the image enhancement algorithm. It is normally given on a single line, but it has been wrapped to multiple lines in this example for legibility. The second section is the input image, a two-dimensional grid of light pixels (#) and dark pixels (.).
24+
25+
The image enhancement algorithm describes how to enhance an image by simultaneously converting all pixels in the input image into an output image. Each pixel of the output image is determined by looking at a 3x3 square of pixels centered on the corresponding input image pixel. So, to determine the value of the pixel at (5,10) in the output image, nine pixels from the input image need to be considered: (4,9), (4,10), (4,11), (5,9), (5,10), (5,11), (6,9), (6,10), and (6,11). These nine input pixels are combined into a single binary number that is used as an index in the image enhancement algorithm string.
26+
27+
For example, to determine the output pixel that corresponds to the very middle pixel of the input image, the nine pixels marked by [...] would need to be considered:
28+
29+
# . . # .
30+
#[. . .].
31+
#[# . .]#
32+
.[. # .].
33+
. . # # #
34+
35+
Starting from the top-left and reading across each row, these pixels are ..., then #.., then .#.; combining these forms ...#...#.. By turning dark pixels (.) into 0 and light pixels (#) into 1, the binary number 000100010 can be formed, which is 34 in decimal.
36+
37+
The image enhancement algorithm string is exactly 512 characters long, enough to match every possible 9-bit binary number. The first few characters of the string (numbered starting from zero) are as follows:
38+
39+
0 10 20 30 34 40 50 60 70
40+
| | | | | | | | |
41+
..#.#..#####.#.#.#.###.##.....###.##.#..###.####..#####..#....#..#..##..##
42+
43+
In the middle of this first group of characters, the character at index 34 can be found: #. So, the output pixel in the center of the output image should be #, a light pixel.
44+
45+
This process can then be repeated to calculate every pixel of the output image.
46+
47+
Through advances in imaging technology, the images being operated on here are infinite in size. Every pixel of the infinite output image needs to be calculated exactly based on the relevant pixels of the input image. The small input image you have is only a small region of the actual infinite input image; the rest of the input image consists of dark pixels (.). For the purposes of the example, to save on space, only a portion of the infinite-sized input and output images will be shown.
48+
49+
The starting input image, therefore, looks something like this, with more dark pixels (.) extending forever in every direction not shown here:
50+
51+
...............
52+
...............
53+
...............
54+
...............
55+
...............
56+
.....#..#......
57+
.....#.........
58+
.....##..#.....
59+
.......#.......
60+
.......###.....
61+
...............
62+
...............
63+
...............
64+
...............
65+
...............
66+
67+
By applying the image enhancement algorithm to every pixel simultaneously, the following output image can be obtained:
68+
69+
...............
70+
...............
71+
...............
72+
...............
73+
.....##.##.....
74+
....#..#.#.....
75+
....##.#..#....
76+
....####..#....
77+
.....#..##.....
78+
......##..#....
79+
.......#.#.....
80+
...............
81+
...............
82+
...............
83+
...............
84+
85+
Through further advances in imaging technology, the above output image can also be used as an input image! This allows it to be enhanced a second time:
86+
87+
...............
88+
...............
89+
...............
90+
..........#....
91+
....#..#.#.....
92+
...#.#...###...
93+
...#...##.#....
94+
...#.....#.#...
95+
....#.#####....
96+
.....#.#####...
97+
......##.##....
98+
.......###.....
99+
...............
100+
...............
101+
...............
102+
103+
Truly incredible - now the small details are really starting to come through. After enhancing the original input image twice, 35 pixels are lit.
104+
105+
Start with the original input image and apply the image enhancement algorithm twice, being careful to account for the infinite size of the images. How many pixels are lit in the resulting image?
106+
107+
Your puzzle answer was 5819.
108+
109+
--- Part Two ---
110+
111+
You still can't quite make out the details in the image. Maybe you just didn't enhance it enough.
112+
113+
If you enhance the starting input image in the above example a total of 50 times, 3351 pixels are lit in the final output image.
114+
115+
Start again with the original input image and apply the image enhancement algorithm 50 times. How many pixels are lit in the resulting image?
116+
117+
Your puzzle answer was 18516.

0 commit comments

Comments
 (0)