ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/utils.C
Revision: 1.52
Committed: Fri Apr 27 14:41:37 2007 UTC (17 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.51: +3 -0 lines
Log Message:
we get ever more nifty

File Contents

# User Rev Content
1 elmex 1.1 /*
2 pippijn 1.39 * CrossFire, A Multiplayer game for X-windows
3     *
4     * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team
5     * Copyright (C) 2002 Mark Wedel & Crossfire Development Team
6     * Copyright (C) 1992 Frank Tore Johansen
7     *
8     * This program is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation; either version 2 of the License, or
11     * (at your option) any later version.
12     *
13     * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17     *
18     * You should have received a copy of the GNU General Public License
19     * along with this program; if not, write to the Free Software
20     * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21     *
22     * The authors can be reached via e-mail at <crossfire@schmorp.de>
23     */
24 elmex 1.1
25     /*
26     * General convenience functions for crossfire.
27     */
28    
29 root 1.37 #include <cstdlib>
30     #include <sys/types.h>
31     #include <unistd.h>
32     #include <sys/time.h>
33     #include <time.h>
34     #include <signal.h>
35    
36 elmex 1.1 #include <global.h>
37     #include <funcpoint.h>
38     #include <material.h>
39    
40 root 1.4 #include <glib.h>
41    
42 root 1.42 rand_gen rndm;
43 root 1.40
44 root 1.42 void
45     tausworthe_random_generator::seed (uint32_t seed)
46 root 1.40 {
47 root 1.49 state [0] = seed * 69069U; if (state [0] < 2U) state [0] += 2U;
48     state [1] = state [0] * 69069U; if (state [0] < 8U) state [0] += 8U;
49     state [2] = state [1] * 69069U; if (state [0] < 16U) state [0] += 16U;
50     state [3] = state [2] * 69069U; if (state [0] < 128) state [0] += 128U;
51 root 1.40
52     for (int i = 11; --i; )
53     operator ()();
54     }
55    
56     uint32_t
57     tausworthe_random_generator::next ()
58     {
59     state [0] = ((state [0] & 0xFFFFFFFEU) << 18U) ^ (((state [0] << 6U) ^ state [0]) >> 13U);
60     state [1] = ((state [1] & 0xFFFFFFF8U) << 2U) ^ (((state [1] << 2U) ^ state [1]) >> 27U);
61     state [2] = ((state [2] & 0xFFFFFFF0U) << 7U) ^ (((state [2] << 13U) ^ state [2]) >> 21U);
62     state [3] = ((state [3] & 0xFFFFFF80U) << 13U) ^ (((state [3] << 3U) ^ state [3]) >> 12U);
63    
64     return state [0] ^ state [1] ^ state [2] ^ state [3];
65     }
66    
67 root 1.42 uint32_t
68 root 1.50 tausworthe_random_generator::get_range (uint32_t num)
69 root 1.42 {
70 root 1.50 return (next () * (uint64_t)num) >> 32U;
71 root 1.42 }
72    
73     // return a number within (min .. max)
74     int
75     tausworthe_random_generator::get_range (int r_min, int r_max)
76     {
77 root 1.50 return r_min + get_range (max (r_max - r_min + 1, 0));
78 root 1.42 }
79    
80 elmex 1.1 /*
81     * The random functions here take luck into account when rolling random
82     * dice or numbers. This function has less of an impact the larger the
83     * difference becomes in the random numbers. IE, the effect is lessened
84     * on a 1-1000 roll, vs a 1-6 roll. This can be used by crafty programmers,
85     * to specifically disable luck in certain rolls, simply by making the
86     * numbers larger (ie, 1d1000 > 500 vs 1d6 > 3)
87     */
88    
89     /*
90     * Roll a random number between min and max. Uses op to determine luck,
91     * and if goodbad is non-zero, luck increases the roll, if zero, it decreases.
92     * Generally, op should be the player/caster/hitter requesting the roll,
93     * not the recipient (ie, the poor slob getting hit). [garbled 20010916]
94     */
95 root 1.9 int
96 root 1.41 random_roll (int r_min, int r_max, const object *op, int goodbad)
97 root 1.9 {
98 root 1.41 int base = r_max - r_min > 1 ? 20 : 50; /* d2 and d3 are corner cases */
99 elmex 1.1
100 root 1.41 if (r_max < 1 || r_max < r_min)
101 root 1.9 {
102 root 1.41 LOG (llevError, "Calling random_roll with min=%d max=%d\n", r_min, r_max);
103     return r_min;
104 elmex 1.1 }
105    
106 root 1.41 if (op->type == PLAYER)
107 root 1.9 {
108 root 1.41 int luck = op->stats.luck;
109 elmex 1.1
110 root 1.41 if (rndm (base) < min (10, abs (luck)))
111     {
112     //TODO: take luck into account
113     }
114 elmex 1.1 }
115 root 1.41
116     return rndm (r_min, r_max);
117 elmex 1.1 }
118    
119     /*
120     * This is a 64 bit version of random_roll above. This is needed
121     * for exp loss calculations for players changing religions.
122     */
123 root 1.9 sint64
124     random_roll64 (sint64 min, sint64 max, const object *op, int goodbad)
125     {
126     sint64 omin, diff, luck, ran;
127     int base;
128    
129     omin = min;
130     diff = max - min + 1;
131     ((diff > 2) ? (base = 20) : (base = 50)); /* d2 and d3 are corner cases */
132 elmex 1.1
133 root 1.9 if (max < 1 || diff < 1)
134     {
135 root 1.20 LOG (llevError, "Calling random_roll with min=%" PRId64 " max=%" PRId64 "\n", min, max);
136 root 1.9 return (min); /* avoids a float exception */
137 elmex 1.1 }
138    
139 root 1.45 /*
140     * Make a call to get two 32 bit unsigned random numbers, and just to
141     * a little bitshifting.
142 root 1.9 */
143 root 1.45 ran = (sint64) rndm.next () ^ ((sint64) rndm.next () << 31);
144 root 1.9
145     if (op->type != PLAYER)
146     return ((ran % diff) + min);
147    
148     luck = op->stats.luck;
149 root 1.45 if (rndm (base) < MIN (10, abs (luck)))
150 root 1.9 {
151     /* we have a winner */
152     ((luck > 0) ? (luck = 1) : (luck = -1));
153     diff -= luck;
154     if (diff < 1)
155     return (omin); /*check again */
156     ((goodbad) ? (min += luck) : (diff));
157 elmex 1.1
158 root 1.9 return (MAX (omin, MIN (max, (ran % diff) + min)));
159 elmex 1.1 }
160 root 1.45
161 root 1.9 return ((ran % diff) + min);
162 elmex 1.1 }
163    
164     /*
165     * Roll a number of dice (2d3, 4d6). Uses op to determine luck,
166     * If goodbad is non-zero, luck increases the roll, if zero, it decreases.
167     * Generally, op should be the player/caster/hitter requesting the roll,
168     * not the recipient (ie, the poor slob getting hit).
169     * The args are num D size (ie 4d6) [garbled 20010916]
170     */
171    
172 root 1.9 int
173     die_roll (int num, int size, const object *op, int goodbad)
174     {
175 root 1.45 int min, diff, luck, total, i, gotlucky, base;
176 root 1.9
177     diff = size;
178     min = 1;
179     luck = total = gotlucky = 0;
180     ((diff > 2) ? (base = 20) : (base = 50)); /* d2 and d3 are corner cases */
181     if (size < 2 || diff < 1)
182     {
183     LOG (llevError, "Calling die_roll with num=%d size=%d\n", num, size);
184     return (num); /* avoids a float exception */
185     }
186 elmex 1.1
187 root 1.9 if (op->type == PLAYER)
188     luck = op->stats.luck;
189    
190     for (i = 0; i < num; i++)
191     {
192 root 1.45 if (rndm (base) < MIN (10, abs (luck)) && !gotlucky)
193 root 1.9 {
194     /* we have a winner */
195     gotlucky++;
196     ((luck > 0) ? (luck = 1) : (luck = -1));
197     diff -= luck;
198     if (diff < 1)
199     return (num); /*check again */
200     ((goodbad) ? (min += luck) : (diff));
201 root 1.45 total += MAX (1, MIN (size, rndm (diff) + min));
202 root 1.9 }
203     else
204 root 1.45 total += rndm (size) + 1;
205 elmex 1.1 }
206 root 1.45
207     return total;
208 elmex 1.1 }
209    
210 root 1.33 /* decay and destroy perishable items in a map */
211 root 1.9 void
212 root 1.32 maptile::decay_objects ()
213 elmex 1.1 {
214 root 1.35 if (!spaces)
215     return;
216    
217     for (mapspace *ms = spaces + size (); ms-- > spaces; )
218     for (object *above, *op = ms->bot; op; op = above)
219     {
220     above = op->above;
221    
222     bool destroy = 0;
223 root 1.32
224 root 1.35 // do not decay anything above unique floor tiles (yet :)
225     if (QUERY_FLAG (op, FLAG_IS_FLOOR) && QUERY_FLAG (op, FLAG_UNIQUE))
226     break;
227 root 1.32
228 root 1.35 if (QUERY_FLAG (op, FLAG_IS_FLOOR)
229     || QUERY_FLAG (op, FLAG_OBJ_ORIGINAL)
230     || QUERY_FLAG (op, FLAG_OBJ_SAVE_ON_OVL)
231     || QUERY_FLAG (op, FLAG_UNIQUE)
232     || QUERY_FLAG (op, FLAG_OVERLAY_FLOOR)
233     || QUERY_FLAG (op, FLAG_UNPAID)
234     || op->is_alive ())
235     ; // do not decay
236     else if (op->is_weapon ())
237     {
238     op->stats.dam--;
239     if (op->stats.dam < 0)
240     destroy = 1;
241     }
242     else if (op->is_armor ())
243     {
244     op->stats.ac--;
245     if (op->stats.ac < 0)
246     destroy = 1;
247     }
248     else if (op->type == FOOD)
249     {
250     op->stats.food -= rndm (5, 20);
251     if (op->stats.food < 0)
252     destroy = 1;
253     }
254     else
255     {
256 root 1.47 int mat = op->materials;
257 root 1.35
258     if (mat & M_PAPER
259     || mat & M_LEATHER
260     || mat & M_WOOD
261     || mat & M_ORGANIC
262     || mat & M_CLOTH
263     || mat & M_LIQUID
264     || (mat & M_IRON && rndm (1, 5) == 1)
265     || (mat & M_GLASS && rndm (1, 2) == 1)
266     || ((mat & M_STONE || mat & M_ADAMANT) && rndm (1, 10) == 1)
267     || ((mat & M_SOFT_METAL || mat & M_BONE) && rndm (1, 3) == 1)
268     || (mat & M_ICE && temp > 32))
269     destroy = 1;
270     }
271    
272     /* adjust overall chance below */
273     if (destroy && rndm (0, 1))
274     op->destroy ();
275     }
276 elmex 1.1 }
277    
278     /* convert materialname to materialtype_t */
279    
280 root 1.9 materialtype_t *
281 root 1.47 name_to_material (const shstr &name)
282 elmex 1.1 {
283 root 1.47 for (materialtype_t *mt = materialt; mt && mt->next; mt = mt->next)
284     if (name == mt->name)
285     return mt;
286 elmex 1.1
287 root 1.47 return materialt;
288 elmex 1.1 }
289    
290     /* when doing transmutation of objects, we have to recheck the resistances,
291     * as some that did not apply previously, may apply now.
292     */
293    
294 root 1.9 void
295     transmute_materialname (object *op, const object *change)
296 elmex 1.1 {
297 root 1.9 materialtype_t *mt;
298     int j;
299 elmex 1.1
300 root 1.9 if (op->materialname == NULL)
301     return;
302 elmex 1.1
303 root 1.9 if (change->materialname != NULL && strcmp (op->materialname, change->materialname))
304     return;
305    
306 root 1.26 if (!op->is_armor ())
307 root 1.9 return;
308    
309     mt = name_to_material (op->materialname);
310     if (!mt)
311     {
312     LOG (llevError, "archetype '%s>%s' uses nonexistent material '%s'\n", &op->arch->name, &op->name, &op->materialname);
313     return;
314     }
315    
316     for (j = 0; j < NROFATTACKS; j++)
317     if (op->resist[j] == 0 && change->resist[j] != 0)
318     {
319     op->resist[j] += mt->mod[j];
320     if (op->resist[j] > 100)
321     op->resist[j] = 100;
322     if (op->resist[j] < -100)
323     op->resist[j] = -100;
324     }
325 elmex 1.1 }
326    
327     /* set the materialname and type for an item */
328 root 1.9 void
329     set_materialname (object *op, int difficulty, materialtype_t *nmt)
330 elmex 1.1 {
331 root 1.9 materialtype_t *mt, *lmt;
332    
333 pippijn 1.5 #ifdef NEW_MATERIAL_CODE
334 root 1.9 int j;
335 pippijn 1.5 #endif
336 elmex 1.1
337 root 1.9 if (op->materialname != NULL)
338     return;
339 elmex 1.1
340    
341    
342 root 1.9 if (nmt == NULL)
343     {
344     lmt = NULL;
345 elmex 1.1 #ifndef NEW_MATERIAL_CODE
346 root 1.47 for (mt = materialt; mt && mt->next; mt = mt->next)
347 root 1.9 {
348 root 1.47 if (op->materials & mt->material)
349 root 1.9 {
350     lmt = mt;
351     break;
352 root 1.2 }
353     }
354 elmex 1.1
355     #else
356 root 1.47 for (mt = materialt; mt && mt->next; mt = mt->next)
357 root 1.9 {
358 root 1.47 if (op->materials & mt->material && rndm (1, 100) <= mt->chance &&
359 root 1.9 difficulty >= mt->difficulty && (op->magic >= mt->magic || mt->magic == 0))
360     {
361     lmt = mt;
362 root 1.26 if (!(op->is_weapon () || op->is_armor ()))
363 root 1.9 break;
364 root 1.2 }
365     }
366 elmex 1.1 #endif
367 root 1.9 }
368     else
369     {
370     lmt = nmt;
371 elmex 1.1 }
372    
373 root 1.9 if (lmt != NULL)
374     {
375 elmex 1.1 #ifndef NEW_MATERIAL_CODE
376 root 1.9 op->materialname = lmt->name;
377     return;
378 elmex 1.1 #else
379    
380 root 1.26 if (op->stats.dam && op->is_weapon ())
381 root 1.9 {
382     op->stats.dam += lmt->damage;
383     if (op->stats.dam < 1)
384     op->stats.dam = 1;
385     }
386 root 1.46
387 root 1.9 if (op->stats.sp && op->type == BOW)
388     op->stats.sp += lmt->sp;
389 root 1.26 if (op->stats.wc && op->is_weapon ())
390 root 1.9 op->stats.wc += lmt->wc;
391 root 1.26 if (op->is_armor ())
392 root 1.9 {
393     if (op->stats.ac)
394     op->stats.ac += lmt->ac;
395     for (j = 0; j < NROFATTACKS; j++)
396     if (op->resist[j] != 0)
397     {
398     op->resist[j] += lmt->mod[j];
399     if (op->resist[j] > 100)
400     op->resist[j] = 100;
401     if (op->resist[j] < -100)
402     op->resist[j] = -100;
403     }
404     }
405 root 1.46 op->materialname = lmt->name;
406 root 1.9 /* dont make it unstackable if it doesn't need to be */
407 root 1.26 if (op->is_weapon () || op->is_armor ())
408 root 1.9 {
409     op->weight = (op->weight * lmt->weight) / 100;
410     op->value = (op->value * lmt->value) / 100;
411 root 1.2 }
412 elmex 1.1 #endif
413     }
414     }
415    
416     /*
417     * Strip out the media tags from a String.
418     * Warning the input string will contain the result string
419     */
420 root 1.9 void
421     strip_media_tag (char *message)
422     {
423     int in_tag = 0;
424     char *dest;
425     char *src;
426    
427     src = dest = message;
428     while (*src != '\0')
429     {
430     if (*src == '[')
431     {
432     in_tag = 1;
433     }
434     else if (in_tag && (*src == ']'))
435     in_tag = 0;
436     else if (!in_tag)
437     {
438     *dest = *src;
439     dest++;
440     }
441     src++;
442     }
443     *dest = '\0';
444     }
445    
446     const char *
447     strrstr (const char *haystack, const char *needle)
448     {
449     const char *lastneedle;
450    
451     lastneedle = NULL;
452     while ((haystack = strstr (haystack, needle)) != NULL)
453     {
454     lastneedle = haystack;
455     haystack++;
456 elmex 1.1 }
457 root 1.9 return lastneedle;
458    
459 elmex 1.1 }
460 root 1.9
461 elmex 1.1 #define EOL_SIZE (sizeof("\n")-1)
462 root 1.9 void
463     strip_endline (char *buf)
464     {
465     if (strlen (buf) < sizeof ("\n"))
466     {
467     return;
468 elmex 1.1 }
469 root 1.9 if (!strcmp (buf + strlen (buf) - EOL_SIZE, "\n"))
470     buf[strlen (buf) - EOL_SIZE] = '\0';
471 elmex 1.1 }
472    
473     /**
474     * Replace in string src all occurrences of key by replacement. The resulting
475     * string is put into result; at most resultsize characters (including the
476     * terminating null character) will be written to result.
477     */
478 root 1.9 void
479     replace (const char *src, const char *key, const char *replacement, char *result, size_t resultsize)
480 elmex 1.1 {
481 root 1.9 size_t resultlen;
482     size_t keylen;
483 elmex 1.1
484 root 1.9 /* special case to prevent infinite loop if key==replacement=="" */
485     if (strcmp (key, replacement) == 0)
486     {
487     snprintf (result, resultsize, "%s", src);
488     return;
489     }
490    
491     keylen = strlen (key);
492    
493     resultlen = 0;
494     while (*src != '\0' && resultlen + 1 < resultsize)
495     {
496     if (strncmp (src, key, keylen) == 0)
497 root 1.2 {
498 root 1.9 snprintf (result + resultlen, resultsize - resultlen, "%s", replacement);
499     resultlen += strlen (result + resultlen);
500     src += keylen;
501 root 1.2 }
502 root 1.9 else
503 root 1.2 {
504 root 1.9 result[resultlen++] = *src++;
505 root 1.2 }
506 root 1.9 }
507     result[resultlen] = '\0';
508 elmex 1.1 }
509    
510     /**
511     * Taking a string as an argument, mutate it into a string that looks like a list.
512     * a 'list' for the purposes here, is a string of items, seperated by commas, except
513     * for the last entry, which has an 'and' before it, and a full stop (period) after it.
514     * This function will also strip all trailing non alphanumeric characters.
515     * It does not insert an oxford comma.
516     */
517    
518 root 1.9 void
519     make_list_like (char *input)
520     {
521     char *p, tmp[MAX_BUF];
522     int i;
523    
524     if (!input || strlen (input) > MAX_BUF - 5)
525 elmex 1.1 return;
526 root 1.9 /* bad stuff would happen if we continued here, the -5 is to make space for ' and ' */
527    
528     strncpy (tmp, input, MAX_BUF - 5);
529     /*trim all trailing commas, spaces etc. */
530     for (i = strlen (tmp); !isalnum (tmp[i]) && i >= 0; i--)
531     tmp[i] = '\0';
532 root 1.11
533 root 1.9 strcat (tmp, ".");
534    
535     p = strrchr (tmp, ',');
536     if (p)
537     {
538     *p = '\0';
539     strcpy (input, tmp);
540     p++;
541     strcat (input, " and");
542     strcat (input, p);
543     }
544     else
545     strcpy (input, tmp);
546 root 1.11
547 root 1.9 return;
548 elmex 1.1 }
549 root 1.3
550 root 1.14 /////////////////////////////////////////////////////////////////////////////
551    
552 root 1.37 void
553     fork_abort (const char *msg)
554     {
555     if (!fork ())
556     {
557     signal (SIGABRT, SIG_DFL);
558 root 1.52 // try to put corefiles into a subdirectory, if existing, to allow
559     // an administrator to reduce the I/O load.
560     chdir ("cores");
561 root 1.37 abort ();
562     }
563    
564 root 1.38 LOG (llevError, "fork abort: %s\n", msg);
565 root 1.37 }
566 root 1.38
567 root 1.25 void *salloc_ (int n) throw (std::bad_alloc)
568 root 1.10 {
569 root 1.44 #ifdef PREFER_MALLOC
570     void *ptr = malloc (n);
571     #else
572 root 1.25 void *ptr = g_slice_alloc (n);
573 root 1.44 #endif
574 root 1.13
575 root 1.23 if (!ptr)
576 root 1.13 throw std::bad_alloc ();
577 root 1.4
578 root 1.23 return ptr;
579     }
580    
581 root 1.25 void *salloc_ (int n, void *src) throw (std::bad_alloc)
582 root 1.23 {
583 root 1.25 void *ptr = salloc_ (n);
584 root 1.23
585 root 1.24 if (src)
586 root 1.25 memcpy (ptr, src, n);
587 root 1.24 else
588 root 1.25 memset (ptr, 0, n);
589 root 1.23
590     return ptr;
591 root 1.3 }
592 root 1.11
593     void assign (char *dst, const char *src, int maxlen)
594     {
595     if (!src)
596     src = "";
597    
598     int len = strlen (src);
599    
600     if (len >= maxlen - 1)
601     {
602     if (maxlen <= 4)
603     {
604     memset (dst, '.', maxlen - 1);
605     dst [maxlen - 1] = 0;
606     }
607     else
608     {
609     memcpy (dst, src, maxlen - 4);
610     memcpy (dst + maxlen - 4, "...", 4);
611     }
612     }
613     else
614     memcpy (dst, src, len + 1);
615     }
616    
617 root 1.51 const std::string
618     format (const char *format, ...)
619     {
620     int len;
621    
622     {
623     char buf[128];
624    
625     va_list ap;
626     va_start (ap, format);
627     len = vsnprintf (buf, sizeof (buf), format, ap);
628     va_end (ap);
629    
630     assert (len >= 0); // shield againstz broken vsnprintf's
631    
632     // was our static buffer short enough?
633     if (len < sizeof (buf))
634     return std::string (buf, len);
635     }
636    
637     {
638     // longer, try harder
639     char *buf = salloc<char> (len + 1);
640    
641     va_list ap;
642     va_start (ap, format);
643     vsnprintf (buf, len + 1, format, ap);
644     va_end (ap);
645    
646     const std::string s (buf, len);
647     sfree<char> (buf, len + 1);
648    
649     return buf;
650     }
651     }
652    
653 root 1.23 tstamp now ()
654     {
655     struct timeval tv;
656    
657     gettimeofday (&tv, 0);
658     return tstamp (tv.tv_sec) + tstamp (tv.tv_usec) * tstamp (1e-6);
659     }
660 root 1.17
661 root 1.32 int
662     similar_direction (int a, int b)
663     {
664     if (!a || !b)
665     return 0;
666    
667     int diff = (b - a) & 7;
668     return diff <= 1 || diff >= 7;
669     }
670    
671 root 1.48 /* crc32 0xdebb20e3 table and supplementary functions. */
672     extern const uint32_t crc_32_tab[256] =
673     {
674     0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
675     0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
676     0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
677     0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
678     0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
679     0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
680     0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
681     0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
682     0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
683     0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
684     0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
685     0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
686     0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
687     0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
688     0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
689     0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
690     0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
691     0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
692     0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
693     0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
694     0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
695     0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
696     0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
697     0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
698     0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
699     0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
700     0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
701     0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
702     0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
703     0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
704     0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
705     0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
706     0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
707     0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
708     0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
709     0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
710     0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
711     0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
712     0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
713     0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
714     0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
715     0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
716     0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
717     0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
718     0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
719     0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
720     0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
721     0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
722     0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
723     0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
724     0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
725     0x2d02ef8dL
726     };
727    
728