]> sourceware.org Git - systemtap.git/blob - session.cxx
PR 11844 - --use-server-on-error option
[systemtap.git] / session.cxx
1 // session functions
2 // Copyright (C) 2010-2011 Red Hat Inc.
3 //
4 // This file is part of systemtap, and is free software. You can
5 // redistribute it and/or modify it under the terms of the GNU General
6 // Public License (GPL); either version 2, or (at your option) any
7 // later version.
8
9 #include "config.h"
10 #include "session.h"
11 #include "cache.h"
12 #include "elaborate.h"
13 #include "translate.h"
14 #include "buildrun.h"
15 #include "coveragedb.h"
16 #include "hash.h"
17 #include "task_finder.h"
18 #include "csclient.h"
19 #include "rpm_finder.h"
20 #include "util.h"
21 #include "git_version.h"
22
23 #include <cerrno>
24 #include <cstdlib>
25
26 extern "C" {
27 #include <getopt.h>
28 #include <limits.h>
29 #include <grp.h>
30 #include <sys/stat.h>
31 #include <sys/utsname.h>
32 #include <elfutils/libdwfl.h>
33 }
34
35 #if HAVE_NSS
36 extern "C" {
37 #include <nspr.h>
38 }
39 #endif
40
41 #include <string>
42
43 using namespace std;
44
45 /* getopt variables */
46 extern int optind;
47
48 #define PATH_TBD string("__TBD__")
49
50 bool systemtap_session::NSPR_Initialized = false;
51
52 systemtap_session::systemtap_session ():
53 // NB: pointer members must be manually initialized!
54 base_hash(0),
55 pattern_root(new match_node),
56 user_file (0),
57 be_derived_probes(0),
58 dwarf_derived_probes(0),
59 kprobe_derived_probes(0),
60 hwbkpt_derived_probes(0),
61 perf_derived_probes(0),
62 uprobe_derived_probes(0),
63 utrace_derived_probes(0),
64 itrace_derived_probes(0),
65 task_finder_derived_probes(0),
66 timer_derived_probes(0),
67 profile_derived_probes(0),
68 mark_derived_probes(0),
69 tracepoint_derived_probes(0),
70 hrtimer_derived_probes(0),
71 procfs_derived_probes(0),
72 op (0), up (0),
73 sym_kprobes_text_start (0),
74 sym_kprobes_text_end (0),
75 sym_stext (0),
76 module_cache (0),
77 last_token (0)
78 {
79 struct utsname buf;
80 (void) uname (& buf);
81 kernel_release = string (buf.release);
82 release = kernel_release;
83 kernel_build_tree = "/lib/modules/" + kernel_release + "/build";
84 architecture = machine = normalize_machine(buf.machine);
85
86 for (unsigned i=0; i<5; i++) perpass_verbose[i]=0;
87 verbose = 0;
88
89 have_script = false;
90 runtime_specified = false;
91 include_arg_start = -1;
92 timing = false;
93 guru_mode = false;
94 bulk_mode = false;
95 unoptimized = false;
96 suppress_warnings = false;
97 panic_warnings = false;
98 listing_mode = false;
99 listing_mode_vars = false;
100
101 #ifdef ENABLE_PROLOGUES
102 prologue_searching = true;
103 #else
104 prologue_searching = false;
105 #endif
106
107 buffer_size = 0;
108 last_pass = 5;
109 module_name = "stap_" + lex_cast(getpid());
110 stapconf_name = "stapconf_" + lex_cast(getpid()) + ".h";
111 output_file = ""; // -o FILE
112 save_module = false;
113 keep_tmpdir = false;
114 cmd = "";
115 target_pid = 0;
116 use_cache = true;
117 use_script_cache = true;
118 poison_cache = false;
119 tapset_compile_coverage = false;
120 need_uprobes = false;
121 uprobes_path = "";
122 consult_symtab = false;
123 ignore_vmlinux = false;
124 ignore_dwarf = false;
125 load_only = false;
126 skip_badvars = false;
127 unprivileged = false;
128 omit_werror = false;
129 compatible = VERSION; // XXX: perhaps also process GIT_SHAID if available?
130 unwindsym_ldd = false;
131 client_options = false;
132 use_server_on_error = true;
133 try_server_status = try_server_unset;
134 systemtap_v_check = false;
135
136 /* adding in the XDG_DATA_DIRS variable path,
137 * this searches in conjunction with SYSTEMTAP_TAPSET
138 * to locate stap scripts, either can be disabled if
139 * needed using env $PATH=/dev/null where $PATH is the
140 * path you want disabled
141 */
142 const char* s_p1 = getenv ("XDG_DATA_DIRS");
143 if ( s_p1 != NULL )
144 {
145 vector<string> dirs;
146 tokenize(s_p1, dirs, ":");
147 for(vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i)
148 {
149 include_path.push_back(*i + "/systemtap/tapset");
150 }
151 }
152
153 const char* s_p = getenv ("SYSTEMTAP_TAPSET");
154 if (s_p != NULL)
155 {
156 include_path.push_back (s_p);
157 }
158 else
159 {
160 include_path.push_back (string(PKGDATADIR) + "/tapset");
161 }
162
163 const char* s_r = getenv ("SYSTEMTAP_RUNTIME");
164 if (s_r != NULL)
165 runtime_path = s_r;
166 else
167 runtime_path = string(PKGDATADIR) + "/runtime";
168
169 const char* s_d = getenv ("SYSTEMTAP_DIR");
170 if (s_d != NULL)
171 data_path = s_d;
172 else
173 data_path = get_home_directory() + string("/.systemtap");
174 if (create_dir(data_path.c_str()) == 1)
175 {
176 const char* e = strerror (errno);
177 if (! suppress_warnings)
178 cerr << "Warning: failed to create systemtap data directory (\""
179 << data_path << "\"): " << e
180 << ", disabling cache support." << endl;
181 use_cache = use_script_cache = false;
182 }
183
184 if (use_cache)
185 {
186 cache_path = data_path + "/cache";
187 if (create_dir(cache_path.c_str()) == 1)
188 {
189 const char* e = strerror (errno);
190 if (! suppress_warnings)
191 cerr << "Warning: failed to create cache directory (\""
192 << cache_path << "\"): " << e
193 << ", disabling cache support." << endl;
194 use_cache = use_script_cache = false;
195 }
196 }
197
198 const char* s_tc = getenv ("SYSTEMTAP_COVERAGE");
199 if (s_tc != NULL)
200 tapset_compile_coverage = true;
201
202 const char* s_kr = getenv ("SYSTEMTAP_RELEASE");
203 if (s_kr != NULL) {
204 setup_kernel_release(s_kr);
205 }
206 }
207
208 systemtap_session::~systemtap_session ()
209 {
210 delete_map(subsessions);
211 }
212
213 void
214 systemtap_session::NSPR_init ()
215 {
216 #if HAVE_NSS
217 if (! NSPR_Initialized)
218 {
219 PR_Init (PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
220 NSPR_Initialized = true;
221 }
222 #endif // HAVE_NSS
223 }
224
225 systemtap_session*
226 systemtap_session::clone(const string& arch, const string& release)
227 {
228 if (this->architecture == arch && this->kernel_release == release)
229 return this;
230
231 systemtap_session*& s = subsessions[make_pair(arch, release)];
232 if (!s)
233 {
234 s = new systemtap_session(*this);
235 s->machine = s->architecture = arch;
236 s->setup_kernel_release(release.c_str());
237 }
238 return s;
239 }
240
241 void
242 systemtap_session::version ()
243 {
244 clog
245 << "SystemTap translator/driver "
246 << "(version " << VERSION << "/" << dwfl_version (NULL)
247 << " " << GIT_MESSAGE << ")" << endl
248 << "Copyright (C) 2005-2011 Red Hat, Inc. and others" << endl
249 << "This is free software; see the source for copying conditions." << endl;
250 clog << "enabled features:"
251 #ifdef HAVE_AVAHI
252 << " AVAHI"
253 #endif
254 #ifdef HAVE_LIBRPM
255 << " LIBRPM"
256 #endif
257 #ifdef HAVE_LIBSQLITE3
258 << " LIBSQLITE3"
259 #endif
260 #ifdef HAVE_NSS
261 << " NSS"
262 #endif
263 #ifdef HAVE_BOOST_SHARED_PTR_HPP
264 << " BOOST_SHARED_PTR"
265 #endif
266 #ifdef HAVE_TR1_UNORDERED_MAP
267 << " TR1_UNORDERED_MAP"
268 #endif
269 #ifdef ENABLE_PROLOGUES
270 << " PROLOGUES"
271 #endif
272 << endl;
273 }
274
275 void
276 systemtap_session::usage (int exitcode)
277 {
278 version ();
279 clog
280 << endl
281 << "Usage: stap [options] FILE Run script in file."
282 << endl
283 << " or: stap [options] - Run script on stdin."
284 << endl
285 << " or: stap [options] -e SCRIPT Run given script."
286 << endl
287 << " or: stap [options] -l PROBE List matching probes."
288 << endl
289 << " or: stap [options] -L PROBE List matching probes and local variables."
290 << endl
291 << endl
292 << "Options:" << endl
293 << " -- end of translator options, script options follow" << endl
294 << " -h --help show help" << endl
295 << " -V show version" << endl
296 << " -p NUM stop after pass NUM 1-5, instead of " << last_pass << endl
297 << " (parse, elaborate, translate, compile, run)" << endl
298 << " -v add verbosity to all passes" << endl
299 << " --vp {N}+ add per-pass verbosity [";
300 for (unsigned i=0; i<5; i++)
301 clog << (perpass_verbose[i] <= 9 ? perpass_verbose[i] : 9);
302 clog
303 << "]" << endl
304 << " -k keep temporary directory" << endl
305 << " -u unoptimized translation" << (unoptimized ? " [set]" : "") << endl
306 << " -w suppress warnings" << (suppress_warnings ? " [set]" : "") << endl
307 << " -W turn warnings into errors" << (panic_warnings ? " [set]" : "") << endl
308 << " -g guru mode" << (guru_mode ? " [set]" : "") << endl
309 << " -P prologue-searching for function probes"
310 << (prologue_searching ? " [set]" : "") << endl
311 << " -b bulk (percpu file) mode" << (bulk_mode ? " [set]" : "") << endl
312 << " -s NUM buffer size in megabytes, instead of " << buffer_size << endl
313 << " -I DIR look in DIR for additional .stp script files";
314 if (include_path.size() == 0)
315 clog << endl;
316 else
317 clog << ", in addition to" << endl;
318 for (unsigned i=0; i<include_path.size(); i++)
319 clog << " " << include_path[i] << endl;
320 clog
321 << " -D NM=VAL emit macro definition into generated C code" << endl
322 << " -B NM=VAL pass option to kbuild make" << endl
323 << " -G VAR=VAL set global variable to value" << endl
324 << " -R DIR look in DIR for runtime, instead of" << endl
325 << " " << runtime_path << endl
326 << " -r DIR cross-compile to kernel with given build tree; or else" << endl
327 << " -r RELEASE cross-compile to kernel /lib/modules/RELEASE/build, instead of" << endl
328 << " " << kernel_build_tree << endl
329 << " -a ARCH cross-compile to given architecture, instead of " << architecture << endl
330 << " -m MODULE set probe module name, instead of " << endl
331 << " " << module_name << endl
332 << " -o FILE send script output to file, instead of stdout. This supports" << endl
333 << " strftime(3) formats for FILE" << endl
334 << " -c CMD start the probes, run CMD, and exit when it finishes" << endl
335 << " -x PID sets target() to PID" << endl
336 << " -F run as on-file flight recorder with -o." << endl
337 << " run as on-memory flight recorder without -o." << endl
338 << " -S size[,n] set maximum of the size and the number of files." << endl
339 << " -d OBJECT add unwind/symbol data for OBJECT file";
340 if (unwindsym_modules.size() == 0)
341 clog << endl;
342 else
343 clog << ", in addition to" << endl;
344 {
345 vector<string> syms (unwindsym_modules.begin(), unwindsym_modules.end());
346 for (unsigned i=0; i<syms.size(); i++)
347 clog << " " << syms[i] << endl;
348 }
349 clog
350 << " --ldd add unwind/symbol data for all referenced OBJECT files." << endl
351 << " --all-modules" << endl
352 << " add unwind/symbol data for all loaded kernel objects." << endl
353 << " -t collect probe timing information" << endl
354 #ifdef HAVE_LIBSQLITE3
355 << " -q generate information on tapset coverage" << endl
356 #endif /* HAVE_LIBSQLITE3 */
357 << " --unprivileged" << endl
358 << " restrict usage to features available to unprivileged users" << endl
359 #if 0 /* PR6864: disable temporarily; should merge with -d somehow */
360 << " --kelf make do with symbol table from vmlinux" << endl
361 << " --kmap[=FILE]" << endl
362 << " make do with symbol table from nm listing" << endl
363 #endif
364 // Formerly present --ignore-{vmlinux,dwarf} options are for testsuite use
365 // only, and don't belong in the eyesight of a plain user.
366 << " --compatible=VERSION" << endl
367 << " suppress incompatible language/tapset changes beyond VERSION," << endl
368 << " instead of " << compatible << endl
369 << " --check-version" << endl
370 << " displays warnings where a syntax element may be " << endl
371 << " version dependent" << endl
372 << " --skip-badvars" << endl
373 << " substitute zero for bad context $variables" << endl
374 << " --use-server[=SERVER-SPEC]" << endl
375 << " specify systemtap compile-servers" << endl
376 << " --list-servers[=PROPERTIES]" << endl
377 << " report on the status of the specified compile-servers" << endl
378 #if HAVE_NSS
379 << " --trust-servers[=TRUST-SPEC]" << endl
380 << " add/revoke trust of specified compile-servers" << endl
381 << " --use-server-on-error[=yes/no]" << endl
382 << " retry compilation using a compile server upon compilation error" << endl
383 #endif
384 << " --remote=HOSTNAME" << endl
385 << " run pass 5 on the specified ssh host (EXPERIMENTAL)" << endl
386 ;
387
388 time_t now;
389 time (& now);
390 struct tm* t = localtime (& now);
391 if (t && t->tm_mon*3 + t->tm_mday*173 == 0xb6)
392 clog << morehelp << endl;
393
394 exit (exitcode);
395 }
396
397 int
398 systemtap_session::parse_cmdline (int argc, char * const argv [])
399 {
400 client_options_disallowed = "";
401 while (true)
402 {
403 int long_opt;
404 char * num_endptr;
405
406 // NB: when adding new options, consider very carefully whether they
407 // should be restricted from stap clients (after --client-options)!
408 #define LONG_OPT_KELF 1
409 #define LONG_OPT_KMAP 2
410 #define LONG_OPT_IGNORE_VMLINUX 3
411 #define LONG_OPT_IGNORE_DWARF 4
412 #define LONG_OPT_VERBOSE_PASS 5
413 #define LONG_OPT_SKIP_BADVARS 6
414 #define LONG_OPT_UNPRIVILEGED 7
415 #define LONG_OPT_OMIT_WERROR 8
416 #define LONG_OPT_CLIENT_OPTIONS 9
417 #define LONG_OPT_HELP 10
418 #define LONG_OPT_DISABLE_CACHE 11
419 #define LONG_OPT_POISON_CACHE 12
420 #define LONG_OPT_CLEAN_CACHE 13
421 #define LONG_OPT_COMPATIBLE 14
422 #define LONG_OPT_LDD 15
423 #define LONG_OPT_USE_SERVER 16
424 #define LONG_OPT_LIST_SERVERS 17
425 #define LONG_OPT_TRUST_SERVERS 18
426 #define LONG_OPT_ALL_MODULES 19
427 #define LONG_OPT_REMOTE 20
428 #define LONG_OPT_CHECK_VERSION 21
429 #define LONG_OPT_USE_SERVER_ON_ERROR 22
430 // NB: also see find_hash(), usage(), switch stmt below, stap.1 man page
431 static struct option long_options[] = {
432 { "kelf", 0, &long_opt, LONG_OPT_KELF },
433 { "kmap", 2, &long_opt, LONG_OPT_KMAP },
434 { "ignore-vmlinux", 0, &long_opt, LONG_OPT_IGNORE_VMLINUX },
435 { "ignore-dwarf", 0, &long_opt, LONG_OPT_IGNORE_DWARF },
436 { "skip-badvars", 0, &long_opt, LONG_OPT_SKIP_BADVARS },
437 { "vp", 1, &long_opt, LONG_OPT_VERBOSE_PASS },
438 { "unprivileged", 0, &long_opt, LONG_OPT_UNPRIVILEGED },
439 #define OWE5 "tter"
440 #define OWE1 "uild-"
441 #define OWE6 "fu-kb"
442 #define OWE2 "i-kno"
443 #define OWE4 "st"
444 #define OWE3 "w-be"
445 { OWE4 OWE6 OWE1 OWE2 OWE3 OWE5, 0, &long_opt, LONG_OPT_OMIT_WERROR },
446 { "client-options", 0, &long_opt, LONG_OPT_CLIENT_OPTIONS },
447 { "help", 0, &long_opt, LONG_OPT_HELP },
448 { "disable-cache", 0, &long_opt, LONG_OPT_DISABLE_CACHE },
449 { "poison-cache", 0, &long_opt, LONG_OPT_POISON_CACHE },
450 { "clean-cache", 0, &long_opt, LONG_OPT_CLEAN_CACHE },
451 { "compatible", 1, &long_opt, LONG_OPT_COMPATIBLE },
452 { "ldd", 0, &long_opt, LONG_OPT_LDD },
453 { "use-server", 2, &long_opt, LONG_OPT_USE_SERVER },
454 { "list-servers", 2, &long_opt, LONG_OPT_LIST_SERVERS },
455 { "trust-servers", 2, &long_opt, LONG_OPT_TRUST_SERVERS },
456 { "use-server-on-error", 2, &long_opt, LONG_OPT_USE_SERVER_ON_ERROR },
457 { "all-modules", 0, &long_opt, LONG_OPT_ALL_MODULES },
458 { "remote", 1, &long_opt, LONG_OPT_REMOTE },
459 { "check-version", 0, &long_opt, LONG_OPT_CHECK_VERSION },
460 { NULL, 0, NULL, 0 }
461 };
462 int grc = getopt_long (argc, argv, "hVvtp:I:e:o:R:r:a:m:kgPc:x:D:bs:uqwl:d:L:FS:B:WG:",
463 long_options, NULL);
464 // NB: when adding new options, consider very carefully whether they
465 // should be restricted from stap clients (after --client-options)!
466
467 if (grc < 0)
468 break;
469 bool push_server_opt = false;
470 switch (grc)
471 {
472 case 'V':
473 push_server_opt = true;
474 version ();
475 exit (0);
476
477 case 'v':
478 push_server_opt = true;
479 for (unsigned i=0; i<5; i++)
480 perpass_verbose[i] ++;
481 verbose ++;
482 break;
483
484 case 'G':
485 // Make sure the global option is only composed of the
486 // following chars: [_=a-zA-Z0-9]
487 assert_regexp_match("-G parameter", optarg, "^[a-z_][a-z0-9_]+=[a-z0-9_-]+$");
488
489 globalopts.push_back (string(optarg));
490 break;
491
492 case 't':
493 push_server_opt = true;
494 timing = true;
495 break;
496
497 case 'w':
498 push_server_opt = true;
499 suppress_warnings = true;
500 break;
501
502 case 'W':
503 push_server_opt = true;
504 panic_warnings = true;
505 break;
506
507 case 'p':
508 last_pass = (int)strtoul(optarg, &num_endptr, 10);
509 if (*num_endptr != '\0' || last_pass < 1 || last_pass > 5)
510 {
511 cerr << "Invalid pass number (should be 1-5)." << endl;
512 return 1;
513 }
514 if (listing_mode && last_pass != 2)
515 {
516 cerr << "Listing (-l) mode implies pass 2." << endl;
517 return 1;
518 }
519 push_server_opt = true;
520 break;
521
522 case 'I':
523 if (client_options)
524 client_options_disallowed += client_options_disallowed.empty () ? "-I" : ", -I";
525 if (include_arg_start == -1)
526 include_arg_start = include_path.size ();
527 include_path.push_back (string (optarg));
528 break;
529
530 case 'd':
531 push_server_opt = true;
532 {
533 // At runtime user module names are resolved through their
534 // canonical (absolute) path.
535 const char *mpath = canonicalize_file_name (optarg);
536 if (mpath == NULL) // Must be a kernel module name
537 mpath = optarg;
538 unwindsym_modules.insert (string (mpath));
539 // PR10228: trigger vma tracker logic early if -d /USER-MODULE/
540 // given. XXX This is actually too early. Having a user module
541 // is a good indicator that something will need vma tracking.
542 // But it is not 100%, this really should only trigger through
543 // a user mode tapset /* pragma:vma */ or a probe doing a
544 // variable lookup through a dynamic module.
545 if (mpath[0] == '/')
546 enable_vma_tracker (*this);
547 break;
548 }
549
550 case 'e':
551 if (have_script)
552 {
553 cerr << "Only one script can be given on the command line."
554 << endl;
555 return 1;
556 }
557 push_server_opt = true;
558 cmdline_script = string (optarg);
559 have_script = true;
560 break;
561
562 case 'o':
563 // NB: client_options not a problem, since pass 1-4 does not use output_file.
564 push_server_opt = true;
565 output_file = string (optarg);
566 break;
567
568 case 'R':
569 if (client_options) { cerr << "ERROR: -R invalid with --client-options" << endl; return 1; }
570 runtime_specified = true;
571 runtime_path = string (optarg);
572 break;
573
574 case 'm':
575 if (client_options)
576 client_options_disallowed += client_options_disallowed.empty () ? "-m" : ", -m";
577 module_name = string (optarg);
578 save_module = true;
579 {
580 // If the module name ends with '.ko', chop it off since
581 // modutils doesn't like modules named 'foo.ko.ko'.
582 if (endswith(module_name, ".ko"))
583 {
584 module_name.erase(module_name.size() - 3);
585 cerr << "Truncating module name to '" << module_name
586 << "'" << endl;
587 }
588
589 // Make sure an empty module name wasn't specified (-m "")
590 if (module_name.empty())
591 {
592 cerr << "Module name cannot be empty." << endl;
593 return 1;
594 }
595
596 // Make sure the module name is only composed of the
597 // following chars: [a-z0-9_]
598 assert_regexp_match("-m parameter", module_name, "^[a-z0-9_]+$");
599
600 // Make sure module name isn't too long.
601 if (module_name.size() >= (MODULE_NAME_LEN - 1))
602 {
603 module_name.resize(MODULE_NAME_LEN - 1);
604 cerr << "Truncating module name to '" << module_name
605 << "'" << endl;
606 }
607 }
608
609 push_server_opt = true;
610 use_script_cache = false;
611 break;
612
613 case 'r':
614 if (client_options) // NB: no paths!
615 assert_regexp_match("-r parameter from client", optarg, "^[a-z0-9_.-]+$");
616 push_server_opt = true;
617 setup_kernel_release(optarg);
618 break;
619
620 case 'a':
621 assert_regexp_match("-a parameter", optarg, "^[a-z0-9_-]+$");
622 push_server_opt = true;
623 architecture = string(optarg);
624 break;
625
626 case 'k':
627 push_server_opt = true;
628 keep_tmpdir = true;
629 use_script_cache = false; /* User wants to keep a usable build tree. */
630 break;
631
632 case 'g':
633 push_server_opt = true;
634 guru_mode = true;
635 break;
636
637 case 'P':
638 push_server_opt = true;
639 prologue_searching = true;
640 break;
641
642 case 'b':
643 push_server_opt = true;
644 bulk_mode = true;
645 break;
646
647 case 'u':
648 push_server_opt = true;
649 unoptimized = true;
650 break;
651
652 case 's':
653 buffer_size = (int) strtoul (optarg, &num_endptr, 10);
654 if (*num_endptr != '\0' || buffer_size < 1 || buffer_size > 4095)
655 {
656 cerr << "Invalid buffer size (should be 1-4095)." << endl;
657 return 1;
658 }
659 push_server_opt = true;
660 break;
661
662 case 'c':
663 push_server_opt = true;
664 cmd = string (optarg);
665 if (cmd == "")
666 {
667 // This would mess with later code deciding to pass -c
668 // through to staprun
669 cerr << "Empty CMD string invalid." << endl;
670 return 1;
671 }
672 break;
673
674 case 'x':
675 target_pid = (int) strtoul(optarg, &num_endptr, 10);
676 if (*num_endptr != '\0')
677 {
678 cerr << "Invalid target process ID number." << endl;
679 return 1;
680 }
681 push_server_opt = true;
682 break;
683
684 case 'D':
685 assert_regexp_match ("-D parameter", optarg, "^[a-z_][a-z_0-9]*(=-?[a-z_0-9]+)?$");
686 if (client_options)
687 client_options_disallowed += client_options_disallowed.empty () ? "-D" : ", -D";
688 push_server_opt = true;
689 macros.push_back (string (optarg));
690 break;
691
692 case 'S':
693 assert_regexp_match ("-S parameter", optarg, "^[0-9]+(,[0-9]+)?$");
694 push_server_opt = true;
695 size_option = string (optarg);
696 break;
697
698 case 'q':
699 if (client_options) { cerr << "ERROR: -q invalid with --client-options" << endl; return 1; }
700 push_server_opt = true;
701 tapset_compile_coverage = true;
702 break;
703
704 case 'h':
705 usage (0);
706 break;
707
708 case 'L':
709 listing_mode_vars = true;
710 unoptimized = true; // This causes retention of variables for listing_mode
711 // fallthrough
712 case 'l':
713 suppress_warnings = true;
714 listing_mode = true;
715 last_pass = 2;
716 if (have_script)
717 {
718 cerr << "Only one script can be given on the command line."
719 << endl;
720 return 1;
721 }
722 push_server_opt = true;
723 cmdline_script = string("probe ") + string(optarg) + " {}";
724 have_script = true;
725 break;
726
727 case 'F':
728 push_server_opt = true;
729 load_only = true;
730 break;
731
732 case 'B':
733 if (client_options) { cerr << "ERROR: -B invalid with --client-options" << endl; return 1; }
734 push_server_opt = true;
735 kbuildflags.push_back (string (optarg));
736 break;
737
738 case 0:
739 switch (long_opt)
740 {
741 case LONG_OPT_KELF:
742 push_server_opt = true;
743 consult_symtab = true;
744 break;
745 case LONG_OPT_KMAP:
746 // Leave consult_symtab unset for now, to ease error checking.
747 if (!kernel_symtab_path.empty())
748 {
749 cerr << "You can't specify multiple --kmap options." << endl;
750 return 1;
751 }
752 push_server_opt = true;
753 if (optarg)
754 kernel_symtab_path = optarg;
755 else
756 kernel_symtab_path = PATH_TBD;
757 break;
758 case LONG_OPT_IGNORE_VMLINUX:
759 push_server_opt = true;
760 ignore_vmlinux = true;
761 break;
762 case LONG_OPT_IGNORE_DWARF:
763 push_server_opt = true;
764 ignore_dwarf = true;
765 break;
766 case LONG_OPT_VERBOSE_PASS:
767 {
768 bool ok = true;
769 if (strlen(optarg) < 1 || strlen(optarg) > 5)
770 ok = false;
771 if (ok)
772 for (unsigned i=0; i<strlen(optarg); i++)
773 if (isdigit (optarg[i]))
774 perpass_verbose[i] += optarg[i]-'0';
775 else
776 ok = false;
777
778 if (! ok)
779 {
780 cerr << "Invalid --vp argument: it takes 1 to 5 digits." << endl;
781 return 1;
782 }
783 // NB: we don't do this: last_pass = strlen(optarg);
784 push_server_opt = true;
785 break;
786 }
787 case LONG_OPT_SKIP_BADVARS:
788 push_server_opt = true;
789 skip_badvars = true;
790 break;
791 case LONG_OPT_UNPRIVILEGED:
792 push_server_opt = true;
793 unprivileged = true;
794 /* NB: for server security, it is essential that once this flag is
795 set, no future flag be able to unset it. */
796 break;
797 case LONG_OPT_OMIT_WERROR:
798 push_server_opt = true;
799 omit_werror = true;
800 break;
801 case LONG_OPT_CLIENT_OPTIONS:
802 client_options = true;
803 break;
804 case LONG_OPT_USE_SERVER:
805 if (client_options)
806 client_options_disallowed += client_options_disallowed.empty () ? "--use-server" : ", --use-server";
807 if (optarg)
808 specified_servers.push_back (optarg);
809 else
810 specified_servers.push_back ("");
811 break;
812 case LONG_OPT_USE_SERVER_ON_ERROR:
813 if (client_options)
814 client_options_disallowed += client_options_disallowed.empty () ? "--use-server-on-error" : ", --use-server-on-error";
815 if (optarg)
816 {
817 string arg = optarg;
818 for (unsigned i = 0; i < arg.size (); ++i)
819 arg[i] = tolower (arg[i]);
820 if (arg == "yes" || arg == "ye" || arg == "y")
821 use_server_on_error = true;
822 else if (arg == "no" || arg == "n")
823 use_server_on_error = false;
824 else
825 cerr << "Invalid argument '" << optarg << "' for --use-server-on-error." << endl;
826 }
827 else
828 use_server_on_error = true;
829 break;
830 case LONG_OPT_LIST_SERVERS:
831 if (client_options)
832 client_options_disallowed += client_options_disallowed.empty () ? "--list-servers" : ", --list-servers";
833 if (optarg)
834 server_status_strings.push_back (optarg);
835 else
836 server_status_strings.push_back ("");
837 break;
838 case LONG_OPT_TRUST_SERVERS:
839 if (client_options)
840 client_options_disallowed += client_options_disallowed.empty () ? "--trust-servers" : ", --trust-servers";
841 if (optarg)
842 server_trust_spec = optarg;
843 else
844 server_trust_spec = "ssl";
845 break;
846 case LONG_OPT_HELP:
847 usage (0);
848 break;
849
850 // The caching options should not be available to server clients
851 case LONG_OPT_DISABLE_CACHE:
852 if (client_options) {
853 cerr << "ERROR: --disable-cache is invalid with --client-options" << endl;
854 return 1;
855 }
856 use_cache = use_script_cache = false;
857 break;
858 case LONG_OPT_POISON_CACHE:
859 if (client_options) {
860 cerr << "ERROR: --poison-cache is invalid with --client-options" << endl;
861 return 1;
862 }
863 poison_cache = true;
864 break;
865 case LONG_OPT_CLEAN_CACHE:
866 if (client_options) {
867 cerr << "ERROR: --clean-cache is invalid with --client-options" << endl;
868 return 1;
869 }
870 clean_cache(*this);
871 exit(0);
872
873 case LONG_OPT_COMPATIBLE:
874 push_server_opt = true;
875 compatible = optarg;
876 break;
877
878 case LONG_OPT_LDD:
879 if (client_options) {
880 cerr << "ERROR: --ldd is invalid with --client-options" << endl;
881 return 1;
882 }
883 push_server_opt = true;
884 unwindsym_ldd = true;
885 break;
886
887 case LONG_OPT_ALL_MODULES:
888 if (client_options) {
889 cerr << "ERROR: --all-modules is invalid with --client-options" << endl;
890 return 1;
891 }
892 insert_loaded_modules();
893 break;
894
895 case LONG_OPT_REMOTE:
896 if (client_options) {
897 cerr << "ERROR: --remote is invalid with --client-options" << endl;
898 return 1;
899 }
900
901 remote_uris.push_back(optarg);
902 break;
903
904 case LONG_OPT_CHECK_VERSION:
905 push_server_opt = true;
906 systemtap_v_check = true;
907 break;
908
909 default:
910 // NOTREACHED unless one added a getopt option but not a corresponding switch/case:
911 cerr << "Unhandled long argument id " << long_opt << endl;
912 return 1;
913 }
914 break;
915
916 case '?':
917 // Invalid/unrecognized option given or argument required, but
918 // not given. In both cases getopt_long() will have printed the
919 // appropriate error message to stderr already.
920 return 1;
921 break;
922
923 default:
924 // NOTREACHED unless one added a getopt option but not a corresponding switch/case:
925 cerr << "Unhandled argument code " << (char)grc << endl;
926 return 1;
927 break;
928 }
929
930 // Pass selected options on to the server, if any.
931 if (push_server_opt)
932 {
933 if (grc == 0)
934 server_args.push_back (string ("--") +
935 long_options[long_opt - 1].name);
936 else
937 server_args.push_back (string ("-") + (char)grc);
938 if (optarg)
939 server_args.push_back (optarg);
940 }
941 }
942
943 return 0;
944 }
945
946 void
947 systemtap_session::check_options (int argc, char * const argv [])
948 {
949 for (int i = optind; i < argc; i++)
950 {
951 if (! have_script)
952 {
953 script_file = string (argv[i]);
954 have_script = true;
955 }
956 else
957 args.push_back (string (argv[i]));
958 }
959
960 // need a user file
961 // NB: this is also triggered if stap is invoked with no arguments at all
962 if (! have_script)
963 {
964 // We don't need a script if --list-servers or --trust-servers was specified
965 if (server_status_strings.empty () && server_trust_spec.empty ())
966 {
967 cerr << "A script must be specified." << endl;
968 usage(1);
969 }
970 }
971
972 #if ! HAVE_NSS
973 if (client_options)
974 cerr << "WARNING: --client-options is not supported by this version of systemtap" << endl;
975 #endif
976
977 #if ! HAVE_NSS
978 if (! server_trust_spec.empty ())
979 {
980 cerr << "WARNING: --trust-servers is not supported by this version of systemtap" << endl;
981 server_trust_spec.clear ();
982 }
983 #endif
984
985 if (runtime_specified && ! specified_servers.empty ())
986 {
987 cerr << "Warning: Ignoring --use-server due to the use of -R" << endl;
988 specified_servers.clear ();
989 }
990
991 if (client_options && last_pass > 4)
992 {
993 last_pass = 4; /* Quietly downgrade. Server passed through -p5 naively. */
994 }
995
996 // If phase 5 has been requested and the user is a member of stapusr but not
997 // stapdev, then add --unprivileged and --use-server to the invocation,
998 // if not already specified.
999 // XXX Eventually we could check remote hosts, but disable that case for now.
1000 if (last_pass > 4 && have_script && remote_uris.empty())
1001 {
1002 struct group *stgr = getgrnam ("stapusr");
1003 if (stgr && in_group_id (stgr->gr_gid))
1004 {
1005 stgr = getgrnam ("stapdev");
1006 if (! stgr || ! in_group_id (stgr->gr_gid))
1007 {
1008 if (! unprivileged)
1009 {
1010 if (perpass_verbose[0] > 1)
1011 cerr << "Using --unprivileged for member of the group stapusr" << endl;
1012 unprivileged = true;
1013 server_args.push_back ("--unprivileged");
1014 }
1015 if (specified_servers.empty ())
1016 {
1017 if (perpass_verbose[0] > 1)
1018 cerr << "Using --use-server for member of the group stapusr" << endl;
1019 specified_servers.push_back ("");
1020 }
1021 }
1022 }
1023 }
1024
1025 if (client_options && unprivileged && ! client_options_disallowed.empty ())
1026 {
1027 cerr << "You can't specify " << client_options_disallowed << " when --unprivileged is specified." << endl;
1028 usage (1);
1029 }
1030 if ((cmd != "") && (target_pid))
1031 {
1032 cerr << "You can't specify -c and -x options together." << endl;
1033 usage (1);
1034 }
1035 if (unprivileged && guru_mode)
1036 {
1037 cerr << "You can't specify -g and --unprivileged together." << endl;
1038 usage (1);
1039 }
1040 if (!kernel_symtab_path.empty())
1041 {
1042 if (consult_symtab)
1043 {
1044 cerr << "You can't specify --kelf and --kmap together." << endl;
1045 usage (1);
1046 }
1047 consult_symtab = true;
1048 if (kernel_symtab_path == PATH_TBD)
1049 kernel_symtab_path = string("/boot/System.map-") + kernel_release;
1050 }
1051 // Warn in case the target kernel release doesn't match the running one.
1052 if (last_pass > 4 &&
1053 (release != kernel_release ||
1054 machine != architecture)) // NB: squashed ARCH by PR4186 logic
1055 {
1056 if(! suppress_warnings)
1057 cerr << "WARNING: kernel release/architecture mismatch with host forces last-pass 4." << endl;
1058 last_pass = 4;
1059 }
1060
1061 // translate path of runtime to absolute path
1062 if (runtime_path[0] != '/')
1063 {
1064 char cwd[PATH_MAX];
1065 if (getcwd(cwd, sizeof(cwd)))
1066 {
1067 runtime_path = string(cwd) + "/" + runtime_path;
1068 }
1069 }
1070 }
1071
1072
1073 void
1074 systemtap_session::init_try_server ()
1075 {
1076 #if HAVE_NSS
1077 // If the option is disabled or we are a server or we are already using a
1078 // server, then never retry compilation using a server.
1079 if (! use_server_on_error || client_options || ! specified_servers.empty ())
1080 try_server_status = dont_try_server;
1081 else
1082 try_server_status = try_server_unset;
1083 #else
1084 // No client, so don't bother.
1085 try_server_status = dont_try_server;
1086 #endif
1087 }
1088
1089 void
1090 systemtap_session::set_try_server (int t)
1091 {
1092 if (try_server_status != dont_try_server)
1093 try_server_status = t;
1094 }
1095
1096
1097 void systemtap_session::insert_loaded_modules()
1098 {
1099 char line[1024];
1100 ifstream procmods ("/proc/modules");
1101 while (procmods.good()) {
1102 procmods.getline (line, sizeof(line));
1103 strtok(line, " \t");
1104 if (line[0] == '\0')
1105 break; // maybe print a warning?
1106 unwindsym_modules.insert (string (line));
1107 }
1108 procmods.close();
1109 unwindsym_modules.insert ("kernel");
1110 }
1111
1112 void
1113 systemtap_session::setup_kernel_release (const char* kstr)
1114 {
1115 if (kstr[0] == '/') // fully specified path
1116 {
1117 kernel_build_tree = kstr;
1118 string version_file_name = kernel_build_tree + "/include/config/kernel.release";
1119 // The file include/config/kernel.release within the
1120 // build tree is used to pull out the version information
1121 ifstream version_file (version_file_name.c_str());
1122 if (version_file.fail ())
1123 {
1124 cerr << "Missing " << version_file_name << endl;
1125 exit(1);
1126 }
1127 else
1128 {
1129 char c;
1130 kernel_release = "";
1131 while (version_file.get(c) && c != '\n')
1132 kernel_release.push_back(c);
1133 }
1134
1135 // PR10745
1136 // Maybe it's a full kernel source tree, for purposes of PR10745.
1137 // In case CONFIG_DEBUG_INFO was set, we'd find it anyway with the
1138 // normal search in tapsets.cxx. Without CONFIG_DEBUG_INFO, we'd
1139 // need heuristics such as this one:
1140
1141 string some_random_source_only_file = kernel_build_tree + "/COPYING";
1142 ifstream epic (some_random_source_only_file.c_str());
1143 if (! epic.fail())
1144 {
1145 kernel_source_tree = kernel_build_tree;
1146 if (verbose > 2)
1147 clog << "Located kernel source tree (COPYING) at '"
1148 << kernel_source_tree << "'" << endl;
1149 }
1150 }
1151 else
1152 {
1153 kernel_release = string (kstr);
1154 kernel_build_tree = "/lib/modules/" + kernel_release + "/build";
1155
1156 // PR10745
1157 // Let's not look for the kernel_source_tree; it's definitely
1158 // not THERE. tapsets.cxx might try to find it later if tracepoints
1159 // need it.
1160 }
1161 }
1162
1163
1164 // Register all the aliases we've seen in library files, and the user
1165 // file, as patterns.
1166 void
1167 systemtap_session::register_library_aliases()
1168 {
1169 vector<stapfile*> files(library_files);
1170 files.push_back(user_file);
1171
1172 for (unsigned f = 0; f < files.size(); ++f)
1173 {
1174 stapfile * file = files[f];
1175 for (unsigned a = 0; a < file->aliases.size(); ++a)
1176 {
1177 probe_alias * alias = file->aliases[a];
1178 try
1179 {
1180 for (unsigned n = 0; n < alias->alias_names.size(); ++n)
1181 {
1182 probe_point * name = alias->alias_names[n];
1183 match_node * n = pattern_root;
1184 for (unsigned c = 0; c < name->components.size(); ++c)
1185 {
1186 probe_point::component * comp = name->components[c];
1187 // XXX: alias parameters
1188 if (comp->arg)
1189 throw semantic_error("alias component "
1190 + comp->functor
1191 + " contains illegal parameter");
1192 n = n->bind(comp->functor);
1193 }
1194 n->bind(new alias_expansion_builder(alias));
1195 }
1196 }
1197 catch (const semantic_error& e)
1198 {
1199 semantic_error* er = new semantic_error (e); // copy it
1200 stringstream msg;
1201 msg << e.msg2;
1202 msg << " while registering probe alias ";
1203 alias->printsig(msg);
1204 er->msg2 = msg.str();
1205 print_error (* er);
1206 delete er;
1207 }
1208 }
1209 }
1210 }
1211
1212
1213 // Print this given token, but abbreviate it if the last one had the
1214 // same file name.
1215 void
1216 systemtap_session::print_token (ostream& o, const token* tok)
1217 {
1218 assert (tok);
1219
1220 if (last_token && last_token->location.file == tok->location.file)
1221 {
1222 stringstream tmpo;
1223 tmpo << *tok;
1224 string ts = tmpo.str();
1225 // search & replace the file name with nothing
1226 size_t idx = ts.find (tok->location.file->name);
1227 if (idx != string::npos)
1228 ts.replace (idx, tok->location.file->name.size(), "");
1229
1230 o << ts;
1231 }
1232 else
1233 o << *tok;
1234
1235 last_token = tok;
1236 }
1237
1238
1239
1240 void
1241 systemtap_session::print_error (const semantic_error& e)
1242 {
1243 string message_str[2];
1244 string align_semantic_error (" ");
1245
1246 // We generate two messages. The second one ([1]) is printed
1247 // without token compression, for purposes of duplicate elimination.
1248 // This way, the same message that may be generated once with a
1249 // compressed and once with an uncompressed token still only gets
1250 // printed once.
1251 for (int i=0; i<2; i++)
1252 {
1253 stringstream message;
1254
1255 message << "semantic error: " << e.what ();
1256 if (e.tok1 || e.tok2)
1257 message << ": ";
1258 if (e.tok1)
1259 {
1260 if (i == 0) print_token (message, e.tok1);
1261 else message << *e.tok1;
1262 }
1263 message << e.msg2;
1264 if (e.tok2)
1265 {
1266 if (i == 0) print_token (message, e.tok2);
1267 else message << *e.tok2;
1268 }
1269 message << endl;
1270 message_str[i] = message.str();
1271 }
1272
1273 // Duplicate elimination
1274 if (seen_errors.find (message_str[1]) == seen_errors.end())
1275 {
1276 seen_errors.insert (message_str[1]);
1277 cerr << message_str[0];
1278
1279 if (e.tok1)
1280 print_error_source (cerr, align_semantic_error, e.tok1);
1281
1282 if (e.tok2)
1283 print_error_source (cerr, align_semantic_error, e.tok2);
1284 }
1285
1286 if (e.chain)
1287 print_error (* e.chain);
1288 }
1289
1290 void
1291 systemtap_session::print_error_source (std::ostream& message,
1292 std::string& align, const token* tok)
1293 {
1294 unsigned i = 0;
1295
1296 assert (tok);
1297 if (!tok->location.file)
1298 //No source to print, silently exit
1299 return;
1300
1301 unsigned line = tok->location.line;
1302 unsigned col = tok->location.column;
1303 const string &file_contents = tok->location.file->file_contents;
1304
1305 size_t start_pos = 0, end_pos = 0;
1306 //Navigate to the appropriate line
1307 while (i != line && end_pos != std::string::npos)
1308 {
1309 start_pos = end_pos;
1310 end_pos = file_contents.find ('\n', start_pos) + 1;
1311 i++;
1312 }
1313 message << align << "source: " << file_contents.substr (start_pos, end_pos-start_pos-1) << endl;
1314 message << align << " ";
1315 //Navigate to the appropriate column
1316 for (i=start_pos; i<start_pos+col-1; i++)
1317 {
1318 if(isspace(file_contents[i]))
1319 message << file_contents[i];
1320 else
1321 message << ' ';
1322 }
1323 message << "^" << endl;
1324 }
1325
1326 void
1327 systemtap_session::print_warning (const string& message_str, const token* tok)
1328 {
1329 // Duplicate elimination
1330 string align_warning (" ");
1331 if (seen_warnings.find (message_str) == seen_warnings.end())
1332 {
1333 seen_warnings.insert (message_str);
1334 clog << "WARNING: " << message_str;
1335 if (tok) { clog << ": "; print_token (clog, tok); }
1336 clog << endl;
1337 if (tok) { print_error_source (clog, align_warning, tok); }
1338 }
1339 }
1340
1341 // --------------------------------------------------------------------------
1342
1343 /*
1344 Perngrq sebz fzvyrlgnc.fit, rkcbegrq gb n 1484k1110 fzvyrlgnc.cat,
1345 gurapr catgbcnz | cazfpnyr -jvqgu 160 |
1346 cczqvgure -qvz 4 -erq 2 -terra 2 -oyhr 2 | cczgbnafv -2k4 | bq -i -j19 -g k1 |
1347 phg -s2- -q' ' | frq -r 'f,^,\\k,' -r 'f, ,\\k,t' -r 'f,^,",' -r 'f,$,",'
1348 */
1349 const char*
1350 systemtap_session::morehelp =
1351 "\x1b\x5b\x30\x6d\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1352 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1353 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1354 "\x20\x20\x20\x60\x20\x20\x2e\x60\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1355 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20"
1356 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1357 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1358 "\x20\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x1b\x5b"
1359 "\x33\x33\x6d\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1360 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1361 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1362 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x1b\x5b\x33\x33\x6d\x20\x60"
1363 "\x2e\x60\x1b\x5b\x33\x37\x6d\x20\x3a\x2c\x3a\x2e\x60\x20\x60\x20\x60\x20\x60"
1364 "\x2c\x3b\x2c\x3a\x20\x1b\x5b\x33\x33\x6d\x60\x2e\x60\x20\x1b\x5b\x33\x37\x6d"
1365 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20"
1366 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1367 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x1b\x5b\x33"
1368 "\x33\x6d\x20\x60\x20\x60\x20\x3a\x27\x60\x1b\x5b\x33\x37\x6d\x20\x60\x60\x60"
1369 "\x20\x20\x20\x60\x20\x60\x60\x60\x20\x1b\x5b\x33\x33\x6d\x60\x3a\x60\x20\x60"
1370 "\x20\x60\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1371 "\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1372 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1373 "\x20\x2e\x1b\x5b\x33\x33\x6d\x60\x2e\x60\x20\x60\x20\x60\x20\x20\x1b\x5b\x33"
1374 "\x37\x6d\x20\x3a\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x2e\x1b\x5b\x33\x33"
1375 "\x6d\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20"
1376 "\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x2e\x3a\x20\x20"
1377 "\x20\x20\x20\x20\x20\x20\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1378 "\x20\x20\x2e\x76\x53\x1b\x5b\x33\x34\x6d\x53\x1b\x5b\x33\x37\x6d\x53\x1b\x5b"
1379 "\x33\x31\x6d\x2b\x1b\x5b\x33\x33\x6d\x60\x20\x60\x20\x60\x20\x20\x20\x20\x1b"
1380 "\x5b\x33\x31\x6d\x3f\x1b\x5b\x33\x30\x6d\x53\x1b\x5b\x33\x33\x6d\x2b\x1b\x5b"
1381 "\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x2e\x1b\x5b\x33\x30\x6d\x24\x1b\x5b"
1382 "\x33\x37\x6d\x3b\x1b\x5b\x33\x31\x6d\x7c\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60"
1383 "\x20\x60\x20\x60\x1b\x5b\x33\x31\x6d\x2c\x1b\x5b\x33\x32\x6d\x53\x1b\x5b\x33"
1384 "\x37\x6d\x53\x53\x3e\x2c\x2e\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x2e"
1385 "\x3b\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3c\x20\x20\x20\x20\x20\x20"
1386 "\x20\x20\x20\x2e\x2e\x3a\x1b\x5b\x33\x30\x6d\x26\x46\x46\x46\x48\x46\x1b\x5b"
1387 "\x33\x33\x6d\x60\x2e\x60\x20\x60\x20\x60\x20\x60\x1b\x5b\x33\x30\x6d\x4d\x4d"
1388 "\x46\x1b\x5b\x33\x33\x6d\x20\x20\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x1b\x5b"
1389 "\x33\x33\x6d\x20\x3a\x1b\x5b\x33\x30\x6d\x4d\x4d\x46\x1b\x5b\x33\x33\x6d\x20"
1390 "\x20\x20\x60\x20\x60\x2e\x60\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x30\x6d\x46"
1391 "\x46\x46\x24\x53\x46\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x0a\x20\x20\x20"
1392 "\x20\x2e\x3c\x3a\x60\x20\x20\x20\x20\x2e\x3a\x2e\x3a\x2e\x2e\x3b\x27\x20\x20"
1393 "\x20\x20\x20\x20\x2e\x60\x2e\x3a\x60\x60\x3c\x27\x1b\x5b\x33\x31\x6d\x3c\x27"
1394 "\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60\x3c\x1b\x5b\x33"
1395 "\x30\x6d\x26\x1b\x5b\x33\x31\x6d\x3f\x1b\x5b\x33\x33\x6d\x20\x1b\x5b\x33\x37"
1396 "\x6d\x20\x1b\x5b\x33\x33\x6d\x20\x20\x20\x20\x20\x1b\x5b\x33\x37\x6d\x60\x1b"
1397 "\x5b\x33\x30\x6d\x2a\x46\x1b\x5b\x33\x37\x6d\x27\x1b\x5b\x33\x33\x6d\x20\x60"
1398 "\x20\x60\x20\x60\x20\x60\x20\x1b\x5b\x33\x31\x6d\x60\x3a\x1b\x5b\x33\x37\x6d"
1399 "\x27\x3c\x1b\x5b\x33\x30\x6d\x23\x1b\x5b\x33\x37\x6d\x3c\x60\x3a\x20\x20\x20"
1400 "\x0a\x20\x20\x20\x20\x3a\x60\x3a\x60\x20\x20\x20\x60\x3a\x2e\x2e\x2e\x2e\x3c"
1401 "\x3c\x20\x20\x20\x20\x20\x20\x3a\x2e\x60\x3a\x60\x20\x20\x20\x60\x1b\x5b\x33"
1402 "\x33\x6d\x3a\x1b\x5b\x33\x31\x6d\x60\x1b\x5b\x33\x33\x6d\x20\x60\x2e\x60\x20"
1403 "\x60\x20\x60\x20\x60\x20\x60\x1b\x5b\x33\x37\x6d\x20\x20\x1b\x5b\x33\x33\x6d"
1404 "\x20\x60\x20\x20\x20\x60\x1b\x5b\x33\x37\x6d\x20\x60\x20\x60\x1b\x5b\x33\x33"
1405 "\x6d\x20\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x3a\x1b\x5b\x33\x37\x6d\x20\x20"
1406 "\x20\x60\x3a\x2e\x60\x2e\x20\x0a\x20\x20\x20\x60\x3a\x60\x3a\x60\x20\x20\x20"
1407 "\x20\x20\x60\x60\x60\x60\x20\x3a\x2d\x20\x20\x20\x20\x20\x60\x20\x60\x20\x20"
1408 "\x20\x20\x20\x60\x1b\x5b\x33\x33\x6d\x3a\x60\x2e\x60\x20\x60\x20\x60\x20\x60"
1409 "\x20\x60\x20\x20\x2e\x3b\x1b\x5b\x33\x31\x6d\x76\x1b\x5b\x33\x30\x6d\x24\x24"
1410 "\x24\x1b\x5b\x33\x31\x6d\x2b\x53\x1b\x5b\x33\x33\x6d\x2c\x60\x20\x60\x20\x60"
1411 "\x20\x60\x20\x60\x20\x60\x2e\x1b\x5b\x33\x31\x6d\x60\x1b\x5b\x33\x33\x6d\x3a"
1412 "\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x60\x2e\x60\x20\x20\x0a\x20\x20\x20\x60"
1413 "\x3a\x3a\x3a\x3a\x20\x20\x20\x20\x3a\x60\x60\x60\x60\x3a\x53\x20\x20\x20\x20"
1414 "\x20\x20\x3a\x2e\x60\x2e\x20\x20\x20\x20\x20\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b"
1415 "\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20\x60"
1416 "\x20\x3a\x1b\x5b\x33\x30\x6d\x24\x46\x46\x48\x46\x46\x46\x46\x46\x1b\x5b\x33"
1417 "\x31\x6d\x53\x1b\x5b\x33\x33\x6d\x2e\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x2e"
1418 "\x1b\x5b\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x20\x20"
1419 "\x20\x2e\x60\x2e\x3a\x20\x20\x0a\x20\x20\x20\x60\x3a\x3a\x3a\x60\x20\x20\x20"
1420 "\x60\x3a\x20\x2e\x20\x3b\x27\x3a\x20\x20\x20\x20\x20\x20\x3a\x2e\x60\x3a\x20"
1421 "\x20\x20\x20\x20\x3a\x1b\x5b\x33\x33\x6d\x3c\x3a\x1b\x5b\x33\x31\x6d\x60\x1b"
1422 "\x5b\x33\x33\x6d\x2e\x60\x20\x60\x20\x60\x20\x60\x2e\x1b\x5b\x33\x30\x6d\x53"
1423 "\x46\x46\x46\x53\x46\x46\x46\x53\x46\x46\x1b\x5b\x33\x33\x6d\x20\x60\x20\x60"
1424 "\x20\x60\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x37\x6d\x20"
1425 "\x20\x20\x20\x3a\x60\x3a\x60\x20\x20\x0a\x20\x20\x20\x20\x60\x3c\x3b\x3c\x20"
1426 "\x20\x20\x20\x20\x60\x60\x60\x20\x3a\x3a\x20\x20\x20\x20\x20\x20\x20\x3a\x3a"
1427 "\x2e\x60\x20\x20\x20\x20\x20\x3a\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d"
1428 "\x3c\x3a\x60\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x60\x3a\x1b\x5b\x33\x30"
1429 "\x6d\x53\x46\x53\x46\x46\x46\x53\x46\x46\x46\x53\x1b\x5b\x33\x33\x6d\x2e\x60"
1430 "\x20\x60\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b"
1431 "\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x60\x3a\x3a\x60\x20\x20\x20\x0a\x20\x20"
1432 "\x20\x20\x20\x60\x3b\x3c\x20\x20\x20\x20\x20\x20\x20\x3a\x3b\x60\x20\x20\x20"
1433 "\x20\x20\x20\x20\x20\x20\x60\x3a\x60\x2e\x20\x20\x20\x20\x20\x3a\x1b\x5b\x33"
1434 "\x33\x6d\x3c\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33"
1435 "\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x2e\x60\x2e\x60\x20\x1b\x5b\x33\x31\x6d\x3a"
1436 "\x1b\x5b\x33\x30\x6d\x46\x53\x46\x53\x46\x53\x46\x53\x46\x1b\x5b\x33\x31\x6d"
1437 "\x3f\x1b\x5b\x33\x33\x6d\x20\x60\x2e\x60\x2e\x3a\x3a\x1b\x5b\x33\x31\x6d\x3c"
1438 "\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x37\x6d\x60\x20"
1439 "\x20\x20\x3a\x3a\x3a\x60\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x53\x3c"
1440 "\x20\x20\x20\x20\x20\x20\x3a\x53\x3a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1441 "\x20\x60\x3a\x3a\x60\x2e\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b"
1442 "\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3a"
1443 "\x60\x2e\x60\x3c\x1b\x5b\x33\x30\x6d\x53\x46\x53\x24\x53\x46\x53\x24\x1b\x5b"
1444 "\x33\x33\x6d\x60\x3a\x1b\x5b\x33\x31\x6d\x3a\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b"
1445 "\x33\x31\x6d\x3a\x3b\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b"
1446 "\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x60\x20\x20\x2e\x60\x3a\x3a\x60\x20"
1447 "\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x3b\x3c\x2e\x2e\x2c\x2e\x2e\x20"
1448 "\x3a\x3c\x3b\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x3a\x3a"
1449 "\x60\x20\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x33\x6d\x3c\x3b\x1b\x5b\x33\x31"
1450 "\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33"
1451 "\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x3c\x3c\x1b\x5b\x33\x30\x6d\x53\x24\x53\x1b"
1452 "\x5b\x33\x31\x6d\x53\x1b\x5b\x33\x37\x6d\x27\x1b\x5b\x33\x33\x6d\x2e\x3a\x3b"
1453 "\x1b\x5b\x33\x31\x6d\x3c\x3b\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x31\x6d"
1454 "\x3c\x1b\x5b\x33\x33\x6d\x3a\x1b\x5b\x33\x37\x6d\x60\x20\x20\x20\x60\x2e\x3a"
1455 "\x3a\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x2e\x3a\x3a\x3c\x53\x3c\x3a\x60"
1456 "\x3a\x3a\x3a\x3a\x53\x1b\x5b\x33\x32\x6d\x53\x1b\x5b\x33\x37\x6d\x3b\x27\x3a"
1457 "\x3c\x2c\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x3a\x3a\x3a\x2e\x60"
1458 "\x2e\x60\x2e\x60\x3a\x1b\x5b\x33\x33\x6d\x3c\x3a\x1b\x5b\x33\x31\x6d\x3c\x1b"
1459 "\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b"
1460 "\x33\x31\x6d\x3c\x2c\x1b\x5b\x33\x33\x6d\x3c\x3b\x3a\x1b\x5b\x33\x31\x6d\x2c"
1461 "\x1b\x5b\x33\x33\x6d\x3c\x3b\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x53"
1462 "\x1b\x5b\x33\x31\x6d\x3c\x1b\x5b\x33\x33\x6d\x3b\x3c\x1b\x5b\x33\x37\x6d\x3a"
1463 "\x60\x2e\x60\x2e\x3b\x1b\x5b\x33\x34\x6d\x53\x1b\x5b\x33\x37\x6d\x53\x3f\x27"
1464 "\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x2e\x60\x3a\x60\x3a\x3c\x53\x53\x3b\x3c"
1465 "\x3a\x60\x3a\x3a\x53\x53\x53\x3c\x3a\x60\x3a\x1b\x5b\x33\x30\x6d\x53\x1b\x5b"
1466 "\x33\x37\x6d\x2b\x20\x20\x20\x20\x20\x20\x60\x20\x20\x20\x3a\x1b\x5b\x33\x34"
1467 "\x6d\x53\x1b\x5b\x33\x30\x6d\x53\x46\x24\x1b\x5b\x33\x37\x6d\x2c\x60\x3a\x3a"
1468 "\x3a\x3c\x3a\x3c\x1b\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x37\x6d\x3c\x1b\x5b\x33"
1469 "\x33\x6d\x53\x1b\x5b\x33\x31\x6d\x53\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31"
1470 "\x6d\x53\x3b\x53\x1b\x5b\x33\x33\x6d\x3b\x1b\x5b\x33\x31\x6d\x53\x1b\x5b\x33"
1471 "\x33\x6d\x53\x1b\x5b\x33\x37\x6d\x3c\x1b\x5b\x33\x33\x6d\x53\x1b\x5b\x33\x37"
1472 "\x6d\x3c\x53\x3c\x3a\x3a\x3a\x3a\x3f\x1b\x5b\x33\x30\x6d\x53\x24\x48\x1b\x5b"
1473 "\x33\x37\x6d\x27\x60\x20\x60\x20\x20\x20\x20\x20\x20\x0a\x2e\x60\x3a\x60\x2e"
1474 "\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x2e\x1b\x5b\x33"
1475 "\x30\x6d\x53\x46\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x60\x20\x20\x20\x60\x20"
1476 "\x60\x3a\x1b\x5b\x33\x30\x6d\x3c\x46\x46\x46\x1b\x5b\x33\x37\x6d\x3f\x2e\x60"
1477 "\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x3c\x3a\x60\x3a\x27\x3a\x60\x3a\x60\x3a"
1478 "\x60\x3a\x60\x3b\x1b\x5b\x33\x30\x6d\x53\x46\x48\x46\x1b\x5b\x33\x37\x6d\x27"
1479 "\x20\x60\x20\x60\x20\x60\x20\x20\x20\x20\x0a\x20\x3c\x3b\x3a\x2e\x60\x20\x60"
1480 "\x2e\x60\x20\x60\x2e\x60\x20\x60\x2e\x60\x2c\x53\x1b\x5b\x33\x32\x6d\x53\x1b"
1481 "\x5b\x33\x30\x6d\x53\x1b\x5b\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1482 "\x20\x20\x60\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x46\x46\x46\x1b\x5b\x33\x34\x6d"
1483 "\x2b\x1b\x5b\x33\x37\x6d\x3a\x20\x60\x20\x60\x20\x60\x2e\x60\x20\x60\x2e\x60"
1484 "\x20\x60\x2e\x60\x20\x60\x20\x60\x2c\x1b\x5b\x33\x30\x6d\x24\x46\x48\x46\x1b"
1485 "\x5b\x33\x37\x6d\x27\x20\x60\x20\x20\x20\x60\x20\x20\x20\x20\x20\x20\x0a\x20"
1486 "\x60\x3a\x1b\x5b\x33\x30\x6d\x53\x24\x1b\x5b\x33\x37\x6d\x53\x53\x53\x3b\x3c"
1487 "\x2c\x60\x2c\x3b\x3b\x53\x3f\x53\x1b\x5b\x33\x30\x6d\x24\x46\x3c\x1b\x5b\x33"
1488 "\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x20\x60"
1489 "\x3c\x1b\x5b\x33\x30\x6d\x48\x46\x46\x46\x1b\x5b\x33\x37\x6d\x3f\x2e\x60\x20"
1490 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x3b\x76\x1b\x5b\x33\x30\x6d"
1491 "\x48\x46\x48\x46\x1b\x5b\x33\x37\x6d\x27\x20\x60\x20\x20\x20\x60\x20\x20\x20"
1492 "\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x46\x24\x1b"
1493 "\x5b\x33\x37\x6d\x53\x53\x53\x53\x53\x53\x1b\x5b\x33\x30\x6d\x53\x24\x53\x46"
1494 "\x46\x46\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1495 "\x20\x20\x20\x20\x20\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x23\x46\x46\x46"
1496 "\x24\x1b\x5b\x33\x37\x6d\x76\x2c\x2c\x20\x2e\x20\x2e\x20\x2c\x2c\x76\x1b\x5b"
1497 "\x33\x30\x6d\x26\x24\x46\x46\x48\x3c\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x20"
1498 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x60"
1499 "\x3c\x1b\x5b\x33\x30\x6d\x53\x46\x46\x24\x46\x24\x46\x46\x48\x46\x53\x1b\x5b"
1500 "\x33\x37\x6d\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x60\x20\x60\x2e\x60\x2e\x60"
1501 "\x2e\x60\x2e\x60\x3a\x3a\x3a\x3a\x3a\x1b\x5b\x33\x30\x6d\x2a\x46\x46\x46\x48"
1502 "\x46\x48\x46\x48\x46\x46\x46\x48\x46\x48\x46\x48\x1b\x5b\x33\x37\x6d\x3c\x22"
1503 "\x2e\x60\x2e\x60\x2e\x60\x2e\x60\x2e\x60\x20\x20\x20\x20\x20\x20\x20\x20\x0a"
1504 "\x20\x20\x20\x20\x20\x20\x20\x60\x3a\x1b\x5b\x33\x30\x6d\x48\x46\x46\x46\x48"
1505 "\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x20\x20\x20\x60\x20\x60\x2e\x60\x20\x60"
1506 "\x2e\x60\x2e\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x3a\x3a\x60\x3a\x3c\x3c"
1507 "\x1b\x5b\x33\x30\x6d\x3c\x46\x48\x46\x46\x46\x48\x46\x46\x46\x1b\x5b\x33\x37"
1508 "\x6d\x27\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20"
1509 "\x60\x20\x60\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x22\x1b\x5b"
1510 "\x33\x30\x6d\x2a\x46\x48\x46\x1b\x5b\x33\x37\x6d\x3f\x20\x20\x20\x60\x20\x60"
1511 "\x2e\x60\x20\x60\x2e\x60\x2e\x60\x3a\x60\x2e\x60\x3a\x60\x3a\x60\x3a\x60\x3a"
1512 "\x60\x3a\x60\x3a\x60\x3a\x60\x3a\x1b\x5b\x33\x30\x6d\x46\x46\x48\x46\x48\x46"
1513 "\x1b\x5b\x33\x37\x6d\x27\x3a\x60\x3a\x60\x3a\x60\x3a\x60\x2e\x60\x3a\x60\x2e"
1514 "\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x20\x60\x0a\x20\x20\x20\x20\x20\x20\x20"
1515 "\x20\x20\x20\x20\x60\x3c\x1b\x5b\x33\x30\x6d\x48\x46\x46\x1b\x5b\x33\x37\x6d"
1516 "\x2b\x60\x20\x20\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x2e\x60\x20"
1517 "\x60\x2e\x60\x20\x60\x2e\x60\x20\x60\x3a\x60\x2e\x60\x3b\x1b\x5b\x33\x30\x6d"
1518 "\x48\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x2e\x60\x2e\x60\x20\x60\x2e\x60\x20"
1519 "\x60\x2e\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60\x20\x20\x0a\x20"
1520 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x22\x1b\x5b\x33\x30\x6d\x3c"
1521 "\x48\x46\x53\x1b\x5b\x33\x37\x6d\x2b\x3a\x20\x20\x20\x60\x20\x60\x20\x60\x20"
1522 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x2c\x1b"
1523 "\x5b\x33\x30\x6d\x24\x46\x48\x46\x1b\x5b\x33\x37\x6d\x3f\x20\x60\x20\x60\x20"
1524 "\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x60\x20\x20\x20\x60"
1525 "\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1526 "\x60\x22\x3c\x1b\x5b\x33\x30\x6d\x48\x24\x46\x46\x1b\x5b\x33\x37\x6d\x3e\x2c"
1527 "\x2e\x2e\x20\x20\x20\x20\x20\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x3b"
1528 "\x2c\x2c\x1b\x5b\x33\x30\x6d\x24\x53\x46\x46\x46\x1b\x5b\x33\x37\x6d\x27\x22"
1529 "\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x60\x20\x20\x20\x20\x20\x20\x20\x20"
1530 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20\x20\x20\x20\x20\x20\x20"
1531 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x60\x22\x1b\x5b\x33\x30\x6d\x2a\x3c\x48"
1532 "\x46\x46\x24\x53\x24\x1b\x5b\x33\x37\x6d\x53\x53\x53\x3e\x3e\x3e\x3e\x3e\x53"
1533 "\x3e\x53\x1b\x5b\x33\x30\x6d\x24\x53\x24\x46\x24\x48\x46\x23\x1b\x5b\x33\x37"
1534 "\x6d\x27\x22\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1535 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x20\x20"
1536 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1537 "\x60\x60\x22\x3c\x1b\x5b\x33\x30\x6d\x2a\x3c\x3c\x3c\x48\x46\x46\x46\x48\x46"
1538 "\x46\x46\x23\x3c\x1b\x5b\x33\x36\x6d\x3c\x1b\x5b\x33\x37\x6d\x3c\x27\x22\x22"
1539 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
1540 "\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x0a\x1b"
1541 "\x5b\x30\x6d";
1542
1543 /* vim: set sw=2 ts=8 cino=>4,n-2,{2,^-2,t0,(0,u0,w1,M1 : */
This page took 0.127648 seconds and 6 git commands to generate.