Skip to content

Instantly share code, notes, and snippets.

@skeeto
Last active January 19, 2019 02:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skeeto/5354d0531fe2162b1849a37251e5dff7 to your computer and use it in GitHub Desktop.
Save skeeto/5354d0531fe2162b1849a37251e5dff7 to your computer and use it in GitHub Desktop.
#define _POSIX_C_SOURCE 200112L
#include "taps.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static const short *
find(int n)
{
for (int i = 0; i < NTAPS; i++)
if (taps[i * 5] == n)
return taps + i * 5 + 1;
return 0;
}
static void
generate_c_ull_shr(int n)
{
const short *t = find(n);
int blocks = (n + 63) / 64;
unsigned long long masks[4096 / 64] = {0};
for (int i = 0; i < 4; i++) {
if (t[i]) {
int b = t[i] - 1;
masks[b / 64] |= 1ULL << (b % 64);
}
}
printf("#define LFSR%d_TAPS {", n);
for (int i = 0; i < 4; i++)
if (t[i])
printf("%s%d", i ? ", " : "", t[i]);
printf("}\n");
printf("static int\nlfsr%d(unsigned long long s[%d])\n{\n", n, blocks);
printf(" unsigned long long b = s[0] & 1ULL;\n");
for (int i = 0; i < blocks - 1; i++)
printf(" s[%d] = s[%d] >> 1 | s[%d] << 63;\n", i, i, i + 1);
printf(" s[%d] = s[%d] >> 1;\n", blocks - 1, blocks - 1);
for (int i = 0; i < blocks; i++)
if (masks[i])
printf(" s[%d] ^= -b & 0x%016llxULL;\n", i, masks[i]);
printf(" return b;\n}\n");
}
static void
generate_c_ull_shl(int n)
{
const short *t = find(n);
int blocks = (n + 63) / 64;
unsigned long long masks[4096 / 64] = {0};
for (int i = 0; i < 4; i++) {
if (t[i]) {
int b = t[i] - 1;
masks[b / 64] |= 1ULL << (63 - (b % 64));
}
}
printf("#define LFSR%d_TAPS {", n);
for (int i = 0; i < 4; i++)
if (t[i])
printf("%s%d", i ? ", " : "", t[i]);
printf("}\n");
printf("static int\nlfsr%d(unsigned long long s[%d])\n{\n", n, blocks);
printf(" unsigned long long b = s[0] >> 63;\n");
for (int i = 0; i < blocks - 1; i++)
printf(" s[%d] = s[%d] << 1 | s[%d] >> 63;\n", i, i, i + 1);
printf(" s[%d] = s[%d] << 1;\n", blocks - 1, blocks - 1);
for (int i = 0; i < blocks; i++)
if (masks[i])
printf(" s[%d] ^= -b & 0x%016llxULL;\n", i, masks[i]);
printf(" return b;\n}\n");
}
static void
generate_js(int n)
{
const short *t = find(n);
int blocks = (n + 31) / 32;
unsigned long tbits = n % 32;
unsigned long masks[4096 / 32] = {0};
for (int i = 0; i < 4; i++) {
if (t[i]) {
int b = t[i] - 1;
masks[b / 32] |= 1ULL << (b % 32);
}
}
printf("function lfsr%d() {\n", n);
printf(" let taps = [");
for (int i = 0; i < 4; i++)
if (t[i])
printf("%s%d", i ? ", " : "", t[i]);
printf("];\n");
printf(" let s = new Uint32Array(%d);\n", blocks);
printf(" for (let i = 0; i < %d; i++)\n", tbits ? blocks - 1 : blocks);
printf(" s[i] = Math.random() * 4294967296;\n" );
if (tbits)
printf(" s[%d] = Math.random() * %lu;\n", blocks - 1, 1UL << tbits);
printf(" function next() {\n");
printf(" let b = s[0] & 1;\n");
for (int i = 0; i < blocks - 1; i++)
printf(" s[%d] = s[%d] >>> 1 | s[%d] << 31;\n", i, i, i + 1);
printf(" s[%d] = s[%d] >>> 1;\n", blocks - 1, blocks - 1);
for (int i = 0; i < blocks; i++)
if (masks[i])
printf(" s[%d] ^= -b & 0x%08lx;\n", i, masks[i]);
printf(" return b;\n }\n");
printf(" function bit(n) {\n");
printf(" return s[Math.floor(n / 32)] >> (n %% 32) & 1;\n");
printf(" }\n");
printf(" return {next: next, bit: bit, n: %d, taps: taps};\n", n);
printf("}\n");
}
static void
usage(FILE *f)
{
fprintf(f, "usage: lfsrgen [-hr] [-l LANG] [-n BITS]\n");
fprintf(f, " -h print this message\n");
fprintf(f, " -l LANG output language (c, js)\n");
fprintf(f, " -n BITS LFSR size\n");
fprintf(f, " -r reverse shift\n");
}
int
main(int argc, char *argv[])
{
int n = 256;
int option;
int shift = 'L';
const char *lang = "c";
while ((option = getopt(argc, argv, "hl:n:r")) != -1) {
switch (option) {
case 'h': {
usage(stdout);
exit(EXIT_SUCCESS);
} break;
case 'l': {
lang = optarg;
} break;
case 'n': {
n = atoi(optarg);
} break;
case 'r': {
shift = 'R';
} break;
default: {
usage(stderr);
exit(EXIT_FAILURE);
} break;
}
}
if (!find(n)) {
fprintf(stderr, "lfsrgen: %d bits unsupported\n", n);
exit(EXIT_FAILURE);
}
switch (lang[0]) {
case 'c':
switch (shift) {
case 'R': generate_c_ull_shr(n); break;
case 'L': generate_c_ull_shl(n); break;
}
break;
case 'j':
generate_js(n);
break;
default:
fprintf(stderr, "lfsrgen: unknown language -- %s\n", lang);
exit(EXIT_FAILURE);
break;
}
}
#define NTAPS (int)(sizeof(taps) / sizeof(*taps) / 5)
static const short taps[] = {
2, 2, 1, 0, 0,
3, 3, 2, 0, 0,
4, 4, 3, 0, 0,
5, 5, 4, 3, 2,
6, 6, 5, 3, 2,
7, 7, 6, 5, 4,
8, 8, 6, 5, 4,
9, 9, 8, 6, 5,
10, 10, 9, 7, 6,
11, 11, 10, 9, 7,
12, 12, 11, 8, 6,
13, 13, 12, 10, 9,
14, 14, 13, 11, 9,
15, 15, 14, 13, 11,
16, 16, 14, 13, 11,
17, 17, 16, 15, 14,
18, 18, 17, 16, 13,
19, 19, 18, 17, 14,
20, 20, 19, 16, 14,
21, 21, 20, 19, 16,
22, 22, 19, 18, 17,
23, 23, 22, 20, 18,
24, 24, 23, 21, 20,
25, 25, 24, 23, 22,
26, 26, 25, 24, 20,
27, 27, 26, 25, 22,
28, 28, 27, 24, 22,
29, 29, 28, 27, 25,
30, 30, 29, 26, 24,
31, 31, 30, 29, 28,
32, 32, 30, 26, 25,
33, 33, 32, 29, 27,
34, 34, 31, 30, 26,
35, 35, 34, 28, 27,
36, 36, 35, 29, 28,
37, 37, 36, 33, 31,
38, 38, 37, 33, 32,
39, 39, 38, 35, 32,
40, 40, 37, 36, 35,
41, 41, 40, 39, 38,
42, 42, 40, 37, 35,
43, 43, 42, 38, 37,
44, 44, 42, 39, 38,
45, 45, 44, 42, 41,
46, 46, 40, 39, 38,
47, 47, 46, 43, 42,
48, 48, 44, 41, 39,
49, 49, 45, 44, 43,
50, 50, 48, 47, 46,
51, 51, 50, 48, 45,
52, 52, 51, 49, 46,
53, 53, 52, 51, 47,
54, 54, 51, 48, 46,
55, 55, 54, 53, 49,
56, 56, 54, 52, 49,
57, 57, 55, 54, 52,
58, 58, 57, 53, 52,
59, 59, 57, 55, 52,
60, 60, 58, 56, 55,
61, 61, 60, 59, 56,
62, 62, 59, 57, 56,
63, 63, 62, 59, 58,
64, 64, 63, 61, 60,
65, 65, 64, 62, 61,
66, 66, 60, 58, 57,
67, 67, 66, 65, 62,
68, 68, 67, 63, 61,
69, 69, 67, 64, 63,
70, 70, 69, 67, 65,
71, 71, 70, 68, 66,
72, 72, 69, 63, 62,
73, 73, 71, 70, 69,
74, 74, 71, 70, 67,
75, 75, 74, 72, 69,
76, 76, 74, 72, 71,
77, 77, 75, 72, 71,
78, 78, 77, 76, 71,
79, 79, 77, 76, 75,
80, 80, 78, 76, 71,
81, 81, 79, 78, 75,
82, 82, 78, 76, 73,
83, 83, 81, 79, 76,
84, 84, 83, 77, 75,
85, 85, 84, 83, 77,
86, 86, 84, 81, 80,
87, 87, 86, 82, 80,
88, 88, 80, 79, 77,
89, 89, 86, 84, 83,
90, 90, 88, 87, 85,
91, 91, 90, 86, 83,
92, 92, 90, 87, 86,
93, 93, 91, 90, 87,
94, 94, 93, 89, 88,
95, 95, 94, 90, 88,
96, 96, 90, 87, 86,
97, 97, 95, 93, 91,
98, 98, 97, 91, 90,
99, 99, 95, 94, 92,
100, 100, 98, 93, 92,
101, 101, 100, 95, 94,
102, 102, 99, 97, 96,
103, 103, 102, 99, 94,
104, 104, 103, 94, 93,
105, 105, 104, 99, 98,
106, 106, 105, 101, 100,
107, 107, 105, 99, 98,
108, 108, 103, 97, 96,
109, 109, 107, 105, 104,
110, 110, 109, 106, 104,
111, 111, 109, 107, 104,
112, 112, 108, 106, 101,
113, 113, 111, 110, 108,
114, 114, 113, 112, 103,
115, 115, 110, 108, 107,
116, 116, 114, 111, 110,
117, 117, 116, 115, 112,
118, 118, 116, 113, 112,
119, 119, 116, 111, 110,
120, 120, 118, 114, 111,
121, 121, 120, 116, 113,
122, 122, 121, 120, 116,
123, 123, 122, 119, 115,
124, 124, 119, 118, 117,
125, 125, 120, 119, 118,
126, 126, 124, 122, 119,
127, 127, 126, 124, 120,
128, 128, 127, 126, 121,
129, 129, 128, 125, 124,
130, 130, 129, 128, 125,
131, 131, 129, 128, 123,
132, 132, 130, 127, 123,
133, 133, 131, 125, 124,
134, 134, 133, 129, 127,
135, 135, 132, 131, 129,
136, 136, 134, 133, 128,
137, 137, 136, 133, 126,
138, 138, 137, 131, 130,
139, 139, 136, 134, 131,
140, 140, 139, 136, 132,
141, 141, 140, 135, 128,
142, 142, 141, 139, 132,
143, 143, 141, 140, 138,
144, 144, 142, 140, 137,
145, 145, 144, 140, 139,
146, 146, 144, 143, 141,
147, 147, 145, 143, 136,
148, 148, 145, 143, 141,
149, 149, 142, 140, 139,
150, 150, 148, 147, 142,
151, 151, 150, 149, 148,
152, 152, 150, 149, 146,
153, 153, 149, 148, 145,
154, 154, 153, 149, 145,
155, 155, 151, 150, 148,
156, 156, 153, 151, 147,
157, 157, 155, 152, 151,
158, 158, 153, 152, 150,
159, 159, 156, 153, 148,
160, 160, 158, 157, 155,
161, 161, 159, 158, 155,
162, 162, 158, 155, 154,
163, 163, 160, 157, 156,
164, 164, 159, 158, 152,
165, 165, 162, 157, 156,
166, 166, 164, 163, 156,
167, 167, 165, 163, 161,
168, 168, 162, 159, 152,
169, 169, 164, 163, 161,
170, 170, 169, 166, 161,
171, 171, 169, 166, 165,
172, 172, 169, 165, 161,
173, 173, 171, 168, 165,
174, 174, 169, 166, 165,
175, 175, 173, 171, 169,
176, 176, 167, 165, 164,
177, 177, 175, 174, 172,
178, 178, 176, 171, 170,
179, 179, 178, 177, 175,
180, 180, 173, 170, 168,
181, 181, 180, 175, 174,
182, 182, 181, 176, 174,
183, 183, 179, 176, 175,
184, 184, 177, 176, 175,
185, 185, 184, 182, 177,
186, 186, 180, 178, 177,
187, 187, 182, 181, 180,
188, 188, 186, 183, 182,
189, 189, 187, 184, 183,
190, 190, 188, 184, 177,
191, 191, 187, 185, 184,
192, 192, 190, 178, 177,
193, 193, 189, 186, 184,
194, 194, 192, 191, 190,
195, 195, 193, 192, 187,
196, 196, 194, 187, 185,
197, 197, 195, 193, 188,
198, 198, 193, 190, 183,
199, 199, 198, 195, 190,
200, 200, 198, 197, 195,
201, 201, 199, 198, 195,
202, 202, 198, 196, 195,
203, 203, 202, 196, 195,
204, 204, 201, 200, 194,
205, 205, 203, 200, 196,
206, 206, 201, 197, 196,
207, 207, 206, 201, 198,
208, 208, 207, 205, 199,
209, 209, 207, 206, 204,
210, 210, 207, 206, 198,
211, 211, 203, 201, 200,
212, 212, 209, 208, 205,
213, 213, 211, 208, 207,
214, 214, 213, 211, 209,
215, 215, 212, 210, 209,
216, 216, 215, 213, 209,
217, 217, 213, 212, 211,
218, 218, 217, 211, 210,
219, 219, 218, 215, 211,
220, 220, 211, 210, 208,
221, 221, 219, 215, 213,
222, 222, 220, 217, 214,
223, 223, 221, 219, 218,
224, 224, 222, 217, 212,
225, 225, 224, 220, 215,
226, 226, 223, 219, 216,
227, 227, 223, 218, 217,
228, 228, 226, 217, 216,
229, 229, 228, 225, 219,
230, 230, 224, 223, 222,
231, 231, 229, 227, 224,
232, 232, 228, 223, 221,
233, 233, 232, 229, 224,
234, 234, 232, 225, 223,
235, 235, 234, 229, 226,
236, 236, 229, 228, 226,
237, 237, 236, 233, 230,
238, 238, 237, 236, 233,
239, 239, 238, 232, 227,
240, 240, 237, 235, 232,
241, 241, 237, 233, 232,
242, 242, 241, 236, 231,
243, 243, 242, 238, 235,
244, 244, 243, 240, 235,
245, 245, 244, 241, 239,
246, 246, 245, 244, 235,
247, 247, 245, 243, 238,
248, 248, 238, 234, 233,
249, 249, 248, 245, 242,
250, 250, 247, 245, 240,
251, 251, 249, 247, 244,
252, 252, 251, 247, 241,
253, 253, 252, 247, 246,
254, 254, 253, 252, 247,
255, 255, 253, 252, 250,
256, 256, 254, 251, 246,
257, 257, 255, 251, 250,
258, 258, 254, 252, 249,
259, 259, 257, 253, 249,
260, 260, 253, 252, 250,
261, 261, 257, 255, 254,
262, 262, 258, 254, 253,
263, 263, 261, 258, 252,
264, 264, 263, 255, 254,
265, 265, 263, 262, 260,
266, 266, 265, 260, 259,
267, 267, 264, 261, 259,
268, 268, 267, 264, 258,
269, 269, 268, 263, 262,
270, 270, 267, 263, 260,
271, 271, 265, 264, 260,
272, 272, 270, 266, 263,
273, 273, 272, 271, 266,
274, 274, 272, 267, 265,
275, 275, 266, 265, 264,
276, 276, 275, 273, 270,
277, 277, 274, 271, 265,
278, 278, 277, 274, 273,
279, 279, 278, 275, 274,
280, 280, 278, 275, 271,
281, 281, 280, 277, 272,
282, 282, 278, 277, 272,
283, 283, 278, 276, 271,
284, 284, 279, 278, 276,
285, 285, 280, 278, 275,
286, 286, 285, 276, 271,
287, 287, 285, 282, 281,
288, 288, 287, 278, 277,
289, 289, 286, 285, 277,
290, 290, 288, 287, 285,
291, 291, 286, 280, 279,
292, 292, 291, 289, 285,
293, 293, 292, 287, 282,
294, 294, 292, 291, 285,
295, 295, 293, 291, 290,
296, 296, 292, 287, 285,
297, 297, 296, 293, 292,
298, 298, 294, 290, 287,
299, 299, 295, 293, 288,
300, 300, 290, 288, 287,
301, 301, 299, 296, 292,
302, 302, 297, 293, 290,
303, 303, 297, 291, 290,
304, 304, 303, 302, 293,
305, 305, 303, 299, 298,
306, 306, 305, 303, 299,
307, 307, 305, 303, 299,
308, 308, 306, 299, 293,
309, 309, 307, 302, 299,
310, 310, 309, 305, 302,
311, 311, 308, 306, 304,
312, 312, 307, 302, 301,
313, 313, 312, 310, 306,
314, 314, 311, 305, 300,
315, 315, 314, 306, 305,
316, 316, 309, 305, 304,
317, 317, 315, 313, 310,
318, 318, 313, 312, 310,
319, 319, 318, 317, 308,
320, 320, 319, 317, 316,
321, 321, 319, 316, 314,
322, 322, 321, 320, 305,
323, 323, 322, 320, 313,
324, 324, 321, 320, 318,
325, 325, 323, 320, 315,
326, 326, 325, 323, 316,
327, 327, 325, 322, 319,
328, 328, 323, 321, 319,
329, 329, 326, 323, 321,
330, 330, 328, 323, 322,
331, 331, 329, 325, 321,
332, 332, 325, 321, 320,
333, 333, 331, 329, 325,
334, 334, 333, 330, 327,
335, 335, 333, 328, 325,
336, 336, 335, 332, 329,
337, 337, 336, 331, 327,
338, 338, 336, 335, 332,
339, 339, 332, 329, 323,
340, 340, 337, 336, 329,
341, 341, 336, 330, 327,
342, 342, 341, 340, 331,
343, 343, 338, 335, 333,
344, 344, 338, 334, 333,
345, 345, 343, 341, 337,
346, 346, 344, 339, 335,
347, 347, 344, 337, 336,
348, 348, 344, 341, 340,
349, 349, 347, 344, 343,
350, 350, 340, 337, 336,
351, 351, 348, 345, 343,
352, 352, 346, 341, 339,
353, 353, 349, 346, 344,
354, 354, 349, 341, 340,
355, 355, 354, 350, 349,
356, 356, 349, 347, 346,
357, 357, 355, 347, 346,
358, 358, 351, 350, 344,
359, 359, 358, 352, 350,
360, 360, 359, 335, 334,
361, 361, 360, 357, 354,
362, 362, 360, 351, 344,
363, 363, 362, 356, 355,
364, 364, 363, 359, 352,
365, 365, 360, 359, 356,
366, 366, 362, 359, 352,
367, 367, 365, 363, 358,
368, 368, 361, 359, 351,
369, 369, 367, 359, 358,
370, 370, 368, 367, 365,
371, 371, 369, 368, 363,
372, 372, 369, 365, 357,
373, 373, 371, 366, 365,
374, 374, 369, 368, 366,
375, 375, 374, 368, 367,
376, 376, 371, 369, 368,
377, 377, 376, 374, 369,
378, 378, 374, 365, 363,
379, 379, 375, 370, 369,
380, 380, 377, 374, 366,
381, 381, 380, 379, 376,
382, 382, 379, 375, 364,
383, 383, 382, 378, 374,
384, 384, 378, 369, 368,
385, 385, 383, 381, 379,
386, 386, 381, 380, 376,
387, 387, 385, 379, 378,
388, 388, 387, 385, 374,
389, 389, 384, 380, 379,
390, 390, 388, 380, 377,
391, 391, 390, 389, 385,
392, 392, 386, 382, 379,
393, 393, 392, 391, 386,
394, 394, 392, 387, 386,
395, 395, 390, 389, 384,
396, 396, 392, 390, 389,
397, 397, 392, 387, 385,
398, 398, 393, 392, 384,
399, 399, 397, 390, 388,
400, 400, 398, 397, 395,
401, 401, 399, 392, 389,
402, 402, 399, 398, 393,
403, 403, 398, 395, 394,
404, 404, 400, 398, 397,
405, 405, 398, 397, 388,
406, 406, 402, 397, 393,
407, 407, 402, 400, 398,
408, 408, 407, 403, 401,
409, 409, 406, 404, 402,
410, 410, 407, 406, 400,
411, 411, 408, 401, 399,
412, 412, 409, 404, 401,
413, 413, 407, 406, 403,
414, 414, 405, 401, 398,
415, 415, 413, 411, 406,
416, 416, 414, 411, 407,
417, 417, 416, 414, 407,
418, 418, 417, 415, 403,
419, 419, 415, 414, 404,
420, 420, 412, 410, 407,
421, 421, 419, 417, 416,
422, 422, 421, 416, 412,
423, 423, 420, 418, 414,
424, 424, 422, 417, 415,
425, 425, 422, 421, 418,
426, 426, 415, 414, 412,
427, 427, 422, 421, 416,
428, 428, 426, 425, 417,
429, 429, 422, 421, 419,
430, 430, 419, 417, 415,
431, 431, 430, 428, 426,
432, 432, 429, 428, 419,
433, 433, 430, 428, 422,
434, 434, 429, 423, 422,
435, 435, 430, 426, 423,
436, 436, 432, 431, 430,
437, 437, 436, 435, 431,
438, 438, 436, 432, 421,
439, 439, 437, 436, 431,
440, 440, 439, 437, 436,
441, 441, 440, 433, 430,
442, 442, 440, 437, 435,
443, 443, 442, 437, 433,
444, 444, 435, 432, 431,
445, 445, 441, 439, 438,
446, 446, 442, 439, 431,
447, 447, 446, 441, 438,
448, 448, 444, 442, 437,
449, 449, 446, 440, 438,
450, 450, 443, 438, 434,
451, 451, 450, 441, 435,
452, 452, 448, 447, 446,
453, 453, 449, 447, 438,
454, 454, 449, 445, 444,
455, 455, 453, 449, 444,
456, 456, 454, 445, 433,
457, 457, 454, 449, 446,
458, 458, 453, 448, 445,
459, 459, 457, 454, 447,
460, 460, 459, 455, 451,
461, 461, 460, 455, 454,
462, 462, 457, 451, 450,
463, 463, 456, 455, 452,
464, 464, 460, 455, 441,
465, 465, 463, 462, 457,
466, 466, 460, 455, 452,
467, 467, 466, 461, 456,
468, 468, 464, 459, 453,
469, 469, 467, 464, 460,
470, 470, 468, 462, 461,
471, 471, 469, 468, 465,
472, 472, 470, 469, 461,
473, 473, 470, 467, 465,
474, 474, 465, 463, 456,
475, 475, 471, 467, 466,
476, 476, 475, 468, 466,
477, 477, 470, 462, 461,
478, 478, 477, 474, 472,
479, 479, 475, 472, 470,
480, 480, 473, 467, 464,
481, 481, 480, 472, 471,
482, 482, 477, 476, 473,
483, 483, 479, 477, 474,
484, 484, 483, 482, 470,
485, 485, 479, 469, 468,
486, 486, 481, 478, 472,
487, 487, 485, 483, 478,
488, 488, 487, 485, 484,
489, 489, 484, 483, 480,
490, 490, 485, 483, 481,
491, 491, 488, 485, 480,
492, 492, 491, 485, 484,
493, 493, 490, 488, 483,
494, 494, 493, 489, 481,
495, 495, 494, 486, 480,
496, 496, 494, 491, 480,
497, 497, 493, 488, 486,
498, 498, 495, 489, 487,
499, 499, 494, 493, 488,
500, 500, 499, 494, 490,
501, 501, 499, 497, 496,
502, 502, 498, 497, 494,
503, 503, 502, 501, 500,
504, 504, 502, 490, 483,
505, 505, 500, 497, 493,
506, 506, 501, 494, 491,
507, 507, 504, 501, 494,
508, 508, 505, 500, 495,
509, 509, 506, 502, 501,
510, 510, 501, 500, 498,
511, 511, 509, 503, 501,
512, 512, 510, 507, 504,
513, 513, 505, 503, 500,
514, 514, 511, 509, 507,
515, 515, 511, 508, 501,
516, 516, 514, 511, 509,
517, 517, 515, 507, 505,
518, 518, 516, 515, 507,
519, 519, 517, 511, 507,
520, 520, 509, 507, 503,
521, 521, 519, 514, 512,
522, 522, 518, 509, 507,
523, 523, 521, 517, 510,
524, 524, 523, 519, 515,
525, 525, 524, 521, 519,
526, 526, 525, 521, 517,
527, 527, 526, 520, 518,
528, 528, 526, 522, 517,
529, 529, 528, 525, 522,
530, 530, 527, 523, 520,
531, 531, 529, 525, 519,
532, 532, 529, 528, 522,
533, 533, 531, 530, 529,
534, 534, 533, 529, 527,
535, 535, 533, 529, 527,
536, 536, 533, 531, 529,
537, 537, 536, 535, 527,
538, 538, 537, 536, 533,
539, 539, 535, 534, 529,
540, 540, 537, 534, 529,
541, 541, 537, 531, 528,
542, 542, 540, 539, 533,
543, 543, 538, 536, 532,
544, 544, 538, 535, 531,
545, 545, 539, 537, 532,
546, 546, 545, 544, 538,
547, 547, 543, 540, 534,
548, 548, 545, 543, 538,
549, 549, 546, 545, 533,
550, 550, 546, 533, 529,
551, 551, 550, 547, 542,
552, 552, 550, 547, 532,
553, 553, 550, 549, 542,
554, 554, 551, 546, 543,
555, 555, 551, 546, 545,
556, 556, 549, 546, 540,
557, 557, 552, 551, 550,
558, 558, 553, 549, 544,
559, 559, 557, 552, 550,
560, 560, 554, 551, 549,
561, 561, 558, 552, 550,
562, 562, 560, 558, 551,
563, 563, 561, 554, 549,
564, 564, 563, 561, 558,
565, 565, 564, 559, 554,
566, 566, 564, 561, 560,
567, 567, 563, 557, 556,
568, 568, 558, 557, 551,
569, 569, 568, 559, 557,
570, 570, 563, 558, 552,
571, 571, 569, 566, 561,
572, 572, 571, 564, 560,
573, 573, 569, 567, 563,
574, 574, 569, 565, 560,
575, 575, 572, 570, 569,
576, 576, 573, 572, 563,
577, 577, 575, 574, 569,
578, 578, 562, 556, 555,
579, 579, 572, 570, 567,
580, 580, 579, 576, 574,
581, 581, 575, 574, 568,
582, 582, 579, 576, 571,
583, 583, 581, 577, 575,
584, 584, 581, 571, 570,
585, 585, 583, 582, 577,
586, 586, 584, 581, 579,
587, 587, 586, 581, 576,
588, 588, 577, 572, 571,
589, 589, 586, 585, 579,
590, 590, 588, 587, 578,
591, 591, 587, 585, 582,
592, 592, 591, 573, 568,
593, 593, 588, 585, 584,
594, 594, 586, 584, 583,
595, 595, 594, 593, 586,
596, 596, 592, 591, 590,
597, 597, 588, 585, 583,
598, 598, 597, 592, 591,
599, 599, 593, 591, 590,
600, 600, 599, 590, 589,
601, 601, 600, 597, 589,
602, 602, 596, 594, 591,
603, 603, 600, 599, 597,
604, 604, 600, 598, 589,
605, 605, 600, 598, 595,
606, 606, 602, 599, 591,
607, 607, 600, 598, 595,
608, 608, 606, 602, 585,
609, 609, 601, 600, 597,
610, 610, 602, 600, 599,
611, 611, 609, 607, 601,
612, 612, 607, 602, 598,
613, 613, 609, 603, 594,
614, 614, 613, 612, 607,
615, 615, 614, 609, 608,
616, 616, 614, 602, 597,
617, 617, 612, 608, 607,
618, 618, 615, 604, 598,
619, 619, 614, 611, 610,
620, 620, 619, 618, 611,
621, 621, 616, 615, 609,
622, 622, 612, 610, 605,
623, 623, 614, 613, 612,
624, 624, 617, 615, 612,
625, 625, 620, 617, 613,
626, 626, 623, 621, 613,
627, 627, 622, 617, 613,
628, 628, 626, 617, 616,
629, 629, 627, 624, 623,
630, 630, 628, 626, 623,
631, 631, 625, 623, 617,
632, 632, 629, 619, 613,
633, 633, 632, 631, 626,
634, 634, 631, 629, 627,
635, 635, 631, 625, 621,
636, 636, 632, 628, 623,
637, 637, 636, 628, 623,
638, 638, 637, 633, 632,
639, 639, 636, 635, 629,
640, 640, 638, 637, 626,
641, 641, 640, 636, 622,
642, 642, 636, 633, 632,
643, 643, 641, 640, 632,
644, 644, 634, 633, 632,
645, 645, 641, 637, 634,
646, 646, 635, 634, 633,
647, 647, 646, 643, 642,
648, 648, 647, 626, 625,
649, 649, 648, 644, 638,
650, 650, 644, 635, 632,
651, 651, 646, 638, 637,
652, 652, 647, 643, 641,
653, 653, 646, 645, 643,
654, 654, 649, 643, 640,
655, 655, 653, 639, 638,
656, 656, 646, 638, 637,
657, 657, 656, 650, 649,
658, 658, 651, 648, 646,
659, 659, 657, 655, 644,
660, 660, 657, 656, 648,
661, 661, 657, 650, 649,
662, 662, 659, 656, 650,
663, 663, 655, 652, 649,
664, 664, 662, 660, 649,
665, 665, 661, 659, 654,
666, 666, 664, 659, 656,
667, 667, 664, 660, 649,
668, 668, 658, 656, 651,
669, 669, 667, 665, 664,
670, 670, 669, 665, 664,
671, 671, 669, 665, 662,
672, 672, 667, 666, 661,
673, 673, 666, 664, 663,
674, 674, 671, 665, 660,
675, 675, 674, 672, 669,
676, 676, 675, 671, 664,
677, 677, 674, 673, 669,
678, 678, 675, 673, 663,
679, 679, 676, 667, 661,
680, 680, 679, 650, 645,
681, 681, 678, 672, 670,
682, 682, 681, 679, 675,
683, 683, 682, 677, 672,
684, 684, 681, 671, 666,
685, 685, 684, 682, 681,
686, 686, 684, 674, 673,
687, 687, 682, 675, 673,
688, 688, 682, 674, 669,
689, 689, 686, 683, 681,
690, 690, 687, 683, 680,
691, 691, 689, 685, 678,
692, 692, 687, 686, 678,
693, 693, 691, 685, 678,
694, 694, 691, 681, 677,
695, 695, 694, 691, 686,
696, 696, 694, 686, 673,
697, 697, 689, 685, 681,
698, 698, 690, 689, 688,
699, 699, 698, 689, 684,
700, 700, 698, 695, 694,
701, 701, 699, 697, 685,
702, 702, 701, 699, 695,
703, 703, 702, 696, 691,
704, 704, 701, 699, 692,
705, 705, 704, 698, 697,
706, 706, 697, 695, 692,
707, 707, 702, 699, 692,
708, 708, 706, 704, 703,
709, 709, 708, 706, 705,
710, 710, 709, 696, 695,
711, 711, 704, 703, 700,
712, 712, 709, 708, 707,
713, 713, 706, 703, 696,
714, 714, 709, 707, 701,
715, 715, 714, 711, 708,
716, 716, 706, 705, 704,
717, 717, 716, 710, 701,
718, 718, 717, 716, 713,
719, 719, 711, 710, 707,
720, 720, 718, 712, 709,
721, 721, 720, 713, 712,
722, 722, 721, 718, 707,
723, 723, 717, 710, 707,
724, 724, 719, 716, 711,
725, 725, 720, 719, 716,
726, 726, 725, 722, 721,
727, 727, 721, 719, 716,
728, 728, 726, 725, 724,
729, 729, 726, 724, 718,
730, 730, 726, 715, 711,
731, 731, 729, 725, 723,
732, 732, 729, 728, 725,
733, 733, 731, 726, 725,
734, 734, 724, 721, 720,
735, 735, 733, 728, 727,
736, 736, 730, 728, 723,
737, 737, 736, 733, 732,
738, 738, 730, 729, 727,
739, 739, 731, 723, 721,
740, 740, 737, 728, 716,
741, 741, 738, 733, 732,
742, 742, 741, 738, 730,
743, 743, 742, 731, 730,
744, 744, 743, 733, 731,
745, 745, 740, 738, 737,
746, 746, 738, 733, 728,
747, 747, 743, 741, 737,
748, 748, 744, 743, 733,
749, 749, 748, 743, 742,
750, 750, 746, 741, 734,
751, 751, 750, 748, 740,
752, 752, 749, 732, 731,
753, 753, 748, 745, 740,
754, 754, 742, 740, 735,
755, 755, 754, 745, 743,
756, 756, 755, 747, 740,
757, 757, 756, 751, 750,
758, 758, 757, 746, 741,
759, 759, 757, 756, 750,
760, 760, 757, 747, 734,
761, 761, 760, 759, 758,
762, 762, 761, 755, 745,
763, 763, 754, 749, 747,
764, 764, 761, 759, 758,
765, 765, 760, 755, 754,
766, 766, 757, 747, 744,
767, 767, 763, 760, 759,
768, 768, 764, 751, 749,
769, 769, 763, 762, 760,
770, 770, 768, 765, 756,
771, 771, 765, 756, 754,
772, 772, 767, 766, 764,
773, 773, 767, 765, 763,
774, 774, 767, 760, 758,
775, 775, 771, 769, 768,
776, 776, 773, 764, 759,
777, 777, 776, 767, 761,
778, 778, 775, 762, 759,
779, 779, 776, 771, 769,
780, 780, 775, 772, 764,
781, 781, 779, 765, 764,
782, 782, 780, 779, 773,
783, 783, 782, 776, 773,
784, 784, 778, 775, 771,
785, 785, 780, 776, 775,
786, 786, 782, 780, 771,
1024, 1024, 1015, 1002, 1001,
2048, 2048, 2035, 2034, 2029,
4096, 4096, 4095, 4081, 4069
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment