diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index d843f34..35eb1dd 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,4 +1,6 @@
-
+
+
+
\ No newline at end of file
diff --git a/.output/bpf/bpf.h b/.output/bpf/bpf.h
index 972e17e..a4a7b1a 100644
--- a/.output/bpf/bpf.h
+++ b/.output/bpf/bpf.h
@@ -100,7 +100,7 @@ struct bpf_prog_load_opts {
__u32 log_level;
__u32 log_size;
char *log_buf;
- /* output: actual total log contents size (including termintaing zero).
+ /* output: actual total log contents size (including terminating zero).
* It could be both larger than original log_size (if log was
* truncated), or smaller (if log buffer wasn't filled completely).
* If kernel doesn't support this feature, log_size is left unchanged.
@@ -129,7 +129,7 @@ struct bpf_btf_load_opts {
char *log_buf;
__u32 log_level;
__u32 log_size;
- /* output: actual total log contents size (including termintaing zero).
+ /* output: actual total log contents size (including terminating zero).
* It could be both larger than original log_size (if log was
* truncated), or smaller (if log buffer wasn't filled completely).
* If kernel doesn't support this feature, log_size is left unchanged.
diff --git a/.output/bpf/bpf_helper_defs.h b/.output/bpf/bpf_helper_defs.h
index fecfcf3..0cf177a 100644
--- a/.output/bpf/bpf_helper_defs.h
+++ b/.output/bpf/bpf_helper_defs.h
@@ -44,6 +44,14 @@ struct bpf_dynptr;
struct iphdr;
struct ipv6hdr;
+#ifndef __bpf_fastcall
+#if __has_attribute(bpf_fastcall)
+#define __bpf_fastcall __attribute__((bpf_fastcall))
+#else
+#define __bpf_fastcall
+#endif
+#endif
+
/*
* bpf_map_lookup_elem
*
@@ -203,7 +211,7 @@ static __u32 (* const bpf_get_prandom_u32)(void) = (void *) 7;
* Returns
* The SMP id of the processor running the program.
*/
-static __u32 (* const bpf_get_smp_processor_id)(void) = (void *) 8;
+static __bpf_fastcall __u32 (* const bpf_get_smp_processor_id)(void) = (void *) 8;
/*
* bpf_skb_store_bytes
@@ -1224,7 +1232,7 @@ static long (* const bpf_set_hash)(struct __sk_buff *skb, __u32 hash) = (void *)
* **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**,
* **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**,
* **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**,
- * **TCP_BPF_RTO_MIN**.
+ * **TCP_BPF_RTO_MIN**, **TCP_BPF_SOCK_OPS_CB_FLAGS**.
* * **IPPROTO_IP**, which supports *optname* **IP_TOS**.
* * **IPPROTO_IPV6**, which supports the following *optname*\ s:
* **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**.
@@ -1511,10 +1519,6 @@ static long (* const bpf_getsockopt)(void *bpf_socket, int level, int optname, v
* option, and in this case it only works on functions tagged with
* **ALLOW_ERROR_INJECTION** in the kernel code.
*
- * Also, the helper is only available for the architectures having
- * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing,
- * x86 architecture is the only one to support this feature.
- *
* Returns
* 0
*/
@@ -4220,7 +4224,7 @@ static long (* const bpf_find_vma)(struct task_struct *task, __u64 addr, void *c
* Currently, the **flags** must be 0. Currently, nr_loops is
* limited to 1 << 23 (~8 million) loops.
*
- * long (\*callback_fn)(u32 index, void \*ctx);
+ * long (\*callback_fn)(u64 index, void \*ctx);
*
* where **index** is the current index in the loop. The index
* is zero-indexed.
@@ -4424,9 +4428,10 @@ static long (* const bpf_ima_file_hash)(struct file *file, void *dst, __u32 size
/*
* bpf_kptr_xchg
*
- * Exchange kptr at pointer *map_value* with *ptr*, and return the
- * old value. *ptr* can be NULL, otherwise it must be a referenced
- * pointer which will be released when this helper is called.
+ * Exchange kptr at pointer *dst* with *ptr*, and return the old value.
+ * *dst* can be map value or local kptr. *ptr* can be NULL, otherwise
+ * it must be a referenced pointer which will be released when this helper
+ * is called.
*
* Returns
* The old value of kptr (which can be NULL). The returned pointer
@@ -4434,7 +4439,7 @@ static long (* const bpf_ima_file_hash)(struct file *file, void *dst, __u32 size
* corresponding release function, or moved into a BPF map before
* program exit.
*/
-static void *(* const bpf_kptr_xchg)(void *map_value, void *ptr) = (void *) 194;
+static void *(* const bpf_kptr_xchg)(void *dst, void *ptr) = (void *) 194;
/*
* bpf_map_lookup_percpu_elem
diff --git a/.output/bpf/bpf_helpers.h b/.output/bpf/bpf_helpers.h
index 305c628..686824b 100644
--- a/.output/bpf/bpf_helpers.h
+++ b/.output/bpf/bpf_helpers.h
@@ -185,6 +185,7 @@ enum libbpf_tristate {
#define __kptr_untrusted __attribute__((btf_type_tag("kptr_untrusted")))
#define __kptr __attribute__((btf_type_tag("kptr")))
#define __percpu_kptr __attribute__((btf_type_tag("percpu_kptr")))
+#define __uptr __attribute__((btf_type_tag("uptr")))
#if defined (__clang__)
#define bpf_ksym_exists(sym) ({ \
@@ -341,7 +342,7 @@ extern void bpf_iter_num_destroy(struct bpf_iter_num *it) __weak __ksym;
* I.e., it looks almost like high-level for each loop in other languages,
* supports continue/break, and is verifiable by BPF verifier.
*
- * For iterating integers, the difference betwen bpf_for_each(num, i, N, M)
+ * For iterating integers, the difference between bpf_for_each(num, i, N, M)
* and bpf_for(i, N, M) is in that bpf_for() provides additional proof to
* verifier that i is in [N, M) range, and in bpf_for_each() case i is `int
* *`, not just `int`. So for integers bpf_for() is more convenient.
diff --git a/.output/bpf/bpf_tracing.h b/.output/bpf/bpf_tracing.h
index 9314fa9..a8f6cd4 100644
--- a/.output/bpf/bpf_tracing.h
+++ b/.output/bpf/bpf_tracing.h
@@ -163,7 +163,7 @@
struct pt_regs___s390 {
unsigned long orig_gpr2;
-};
+} __attribute__((preserve_access_index));
/* s390 provides user_pt_regs instead of struct pt_regs to userspace */
#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x))
@@ -179,7 +179,7 @@ struct pt_regs___s390 {
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
#define __PT_PARM6_SYSCALL_REG gprs[7]
-#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x)
+#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___s390 *)(x))->__PT_PARM1_SYSCALL_REG)
#define PT_REGS_PARM1_CORE_SYSCALL(x) \
BPF_CORE_READ((const struct pt_regs___s390 *)(x), __PT_PARM1_SYSCALL_REG)
@@ -222,7 +222,7 @@ struct pt_regs___s390 {
struct pt_regs___arm64 {
unsigned long orig_x0;
-};
+} __attribute__((preserve_access_index));
/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */
#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x))
@@ -241,7 +241,7 @@ struct pt_regs___arm64 {
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG
-#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x)
+#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___arm64 *)(x))->__PT_PARM1_SYSCALL_REG)
#define PT_REGS_PARM1_CORE_SYSCALL(x) \
BPF_CORE_READ((const struct pt_regs___arm64 *)(x), __PT_PARM1_SYSCALL_REG)
@@ -351,6 +351,10 @@ struct pt_regs___arm64 {
* https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#risc-v-calling-conventions
*/
+struct pt_regs___riscv {
+ unsigned long orig_a0;
+} __attribute__((preserve_access_index));
+
/* riscv provides struct user_regs_struct instead of struct pt_regs to userspace */
#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x))
#define __PT_PARM1_REG a0
@@ -362,12 +366,15 @@ struct pt_regs___arm64 {
#define __PT_PARM7_REG a6
#define __PT_PARM8_REG a7
-#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG
+#define __PT_PARM1_SYSCALL_REG orig_a0
#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG
#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG
+#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___riscv *)(x))->__PT_PARM1_SYSCALL_REG)
+#define PT_REGS_PARM1_CORE_SYSCALL(x) \
+ BPF_CORE_READ((const struct pt_regs___riscv *)(x), __PT_PARM1_SYSCALL_REG)
#define __PT_RET_REG ra
#define __PT_FP_REG s0
@@ -473,7 +480,7 @@ struct pt_regs;
#endif
/*
* Similarly, syscall-specific conventions might differ between function call
- * conventions within each architecutre. All supported architectures pass
+ * conventions within each architecture. All supported architectures pass
* either 6 or 7 syscall arguments in registers.
*
* See syscall(2) manpage for succinct table with information on each arch.
@@ -515,7 +522,7 @@ struct pt_regs;
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; })
#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
-#elif defined(bpf_target_sparc)
+#elif defined(bpf_target_sparc) || defined(bpf_target_arm64)
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); })
#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
@@ -651,7 +658,7 @@ struct pt_regs;
* BPF_PROG is a convenience wrapper for generic tp_btf/fentry/fexit and
* similar kinds of BPF programs, that accept input arguments as a single
* pointer to untyped u64 array, where each u64 can actually be a typed
- * pointer or integer of different size. Instead of requring user to write
+ * pointer or integer of different size. Instead of requiring user to write
* manual casts and work with array elements by index, BPF_PROG macro
* allows user to declare a list of named and typed input arguments in the
* same syntax as for normal C function. All the casting is hidden and
@@ -801,7 +808,7 @@ struct pt_regs;
* tp_btf/fentry/fexit BPF programs. It hides the underlying platform-specific
* low-level way of getting kprobe input arguments from struct pt_regs, and
* provides a familiar typed and named function arguments syntax and
- * semantics of accessing kprobe input paremeters.
+ * semantics of accessing kprobe input parameters.
*
* Original struct pt_regs* context is preserved as 'ctx' argument. This might
* be necessary when using BPF helpers like bpf_perf_event_output().
diff --git a/.output/bpf/btf.h b/.output/bpf/btf.h
index b68d216..47ee8f6 100644
--- a/.output/bpf/btf.h
+++ b/.output/bpf/btf.h
@@ -167,6 +167,9 @@ LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset);
LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size);
LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext);
LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size);
+LIBBPF_API enum btf_endianness btf_ext__endianness(const struct btf_ext *btf_ext);
+LIBBPF_API int btf_ext__set_endianness(struct btf_ext *btf_ext,
+ enum btf_endianness endian);
LIBBPF_API int btf__find_str(struct btf *btf, const char *s);
LIBBPF_API int btf__add_str(struct btf *btf, const char *s);
@@ -286,7 +289,7 @@ LIBBPF_API void btf_dump__free(struct btf_dump *d);
LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id);
struct btf_dump_emit_type_decl_opts {
- /* size of this struct, for forward/backward compatiblity */
+ /* size of this struct, for forward/backward compatibility */
size_t sz;
/* optional field name for type declaration, e.g.:
* - struct my_struct
diff --git a/.output/bpf/libbpf.h b/.output/bpf/libbpf.h
index 64a6a3d..b2ce3a7 100644
--- a/.output/bpf/libbpf.h
+++ b/.output/bpf/libbpf.h
@@ -152,7 +152,7 @@ struct bpf_object_open_opts {
* log_buf and log_level settings.
*
* If specified, this log buffer will be passed for:
- * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overriden
+ * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overridden
* with bpf_program__set_log() on per-program level, to get
* BPF verifier log output.
* - during BPF object's BTF load into kernel (BPF_BTF_LOAD) to get
@@ -294,6 +294,14 @@ LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj);
LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj);
LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version);
+/**
+ * @brief **bpf_object__token_fd** is an accessor for BPF token FD associated
+ * with BPF object.
+ * @param obj Pointer to a valid BPF object
+ * @return BPF token FD or -1, if it wasn't set
+ */
+LIBBPF_API int bpf_object__token_fd(const struct bpf_object *obj);
+
struct btf;
LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj);
LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj);
@@ -455,7 +463,7 @@ LIBBPF_API int bpf_link__destroy(struct bpf_link *link);
/**
* @brief **bpf_program__attach()** is a generic function for attaching
* a BPF program based on auto-detection of program type, attach type,
- * and extra paremeters, where applicable.
+ * and extra parameters, where applicable.
*
* @param prog BPF program to attach
* @return Reference to the newly created BPF link; or NULL is returned on error,
@@ -569,10 +577,12 @@ struct bpf_uprobe_multi_opts {
size_t cnt;
/* create return uprobes */
bool retprobe;
+ /* create session kprobes */
+ bool session;
size_t :0;
};
-#define bpf_uprobe_multi_opts__last_field retprobe
+#define bpf_uprobe_multi_opts__last_field session
/**
* @brief **bpf_program__attach_uprobe_multi()** attaches a BPF program
@@ -679,7 +689,7 @@ struct bpf_uprobe_opts {
/**
* @brief **bpf_program__attach_uprobe()** attaches a BPF program
* to the userspace function which is found by binary path and
- * offset. You can optionally specify a particular proccess to attach
+ * offset. You can optionally specify a particular process to attach
* to. You can also optionally attach the program to the function
* exit instead of entry.
*
@@ -1593,11 +1603,11 @@ LIBBPF_API int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_i
* memory region of the ring buffer.
* This ring buffer can be used to implement a custom events consumer.
* The ring buffer starts with the *struct perf_event_mmap_page*, which
- * holds the ring buffer managment fields, when accessing the header
+ * holds the ring buffer management fields, when accessing the header
* structure it's important to be SMP aware.
* You can refer to *perf_event_read_simple* for a simple example.
* @param pb the perf buffer structure
- * @param buf_idx the buffer index to retreive
+ * @param buf_idx the buffer index to retrieve
* @param buf (out) gets the base pointer of the mmap()'ed memory
* @param buf_size (out) gets the size of the mmap()'ed region
* @return 0 on success, negative error code for failure
diff --git a/.output/bpf/libbpf_legacy.h b/.output/bpf/libbpf_legacy.h
index 1e1be46..60b2600 100644
--- a/.output/bpf/libbpf_legacy.h
+++ b/.output/bpf/libbpf_legacy.h
@@ -76,7 +76,7 @@ enum libbpf_strict_mode {
* first BPF program or map creation operation. This is done only if
* kernel is too old to support memcg-based memory accounting for BPF
* subsystem. By default, RLIMIT_MEMLOCK limit is set to RLIM_INFINITY,
- * but it can be overriden with libbpf_set_memlock_rlim() API.
+ * but it can be overridden with libbpf_set_memlock_rlim() API.
* Note that libbpf_set_memlock_rlim() needs to be called before
* the very first bpf_prog_load(), bpf_map_create() or bpf_object__load()
* operation.
@@ -97,7 +97,7 @@ LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode);
* @brief **libbpf_get_error()** extracts the error code from the passed
* pointer
* @param ptr pointer returned from libbpf API function
- * @return error code; or 0 if no error occured
+ * @return error code; or 0 if no error occurred
*
* Note, as of libbpf 1.0 this function is not necessary and not recommended
* to be used. Libbpf doesn't return error code embedded into the pointer
diff --git a/.output/bpf/libbpf_version.h b/.output/bpf/libbpf_version.h
index d6e5eff..28c58fb 100644
--- a/.output/bpf/libbpf_version.h
+++ b/.output/bpf/libbpf_version.h
@@ -4,6 +4,6 @@
#define __LIBBPF_VERSION_H
#define LIBBPF_MAJOR_VERSION 1
-#define LIBBPF_MINOR_VERSION 5
+#define LIBBPF_MINOR_VERSION 6
#endif /* __LIBBPF_VERSION_H */
diff --git a/.output/bpf/skel_internal.h b/.output/bpf/skel_internal.h
index 1e82ab0..4d5fa07 100644
--- a/.output/bpf/skel_internal.h
+++ b/.output/bpf/skel_internal.h
@@ -107,7 +107,7 @@ static inline void skel_free(const void *p)
* The loader program will perform probe_read_kernel() from maps.rodata.initial_value.
* skel_finalize_map_data() sets skel->rodata to point to actual value in a bpf map and
* does maps.rodata.initial_value = ~0ULL to signal skel_free_map_data() that kvfree
- * is not nessary.
+ * is not necessary.
*
* For user space:
* skel_prep_map_data() mmaps anon memory into skel->rodata that can be accessed directly.
@@ -351,10 +351,11 @@ static inline int bpf_load_and_run(struct bpf_load_and_run_opts *opts)
attr.test.ctx_size_in = opts->ctx->sz;
err = skel_sys_bpf(BPF_PROG_RUN, &attr, test_run_attr_sz);
if (err < 0 || (int)attr.test.retval < 0) {
- opts->errstr = "failed to execute loader prog";
if (err < 0) {
+ opts->errstr = "failed to execute loader prog";
set_err;
} else {
+ opts->errstr = "error returned by loader prog";
err = (int)attr.test.retval;
#ifndef __KERNEL__
errno = -err;
diff --git a/.output/bpf/usdt.bpf.h b/.output/bpf/usdt.bpf.h
index 76359bc..b811f75 100644
--- a/.output/bpf/usdt.bpf.h
+++ b/.output/bpf/usdt.bpf.h
@@ -39,7 +39,7 @@ enum __bpf_usdt_arg_type {
struct __bpf_usdt_arg_spec {
/* u64 scalar interpreted depending on arg_type, see below */
__u64 val_off;
- /* arg location case, see bpf_udst_arg() for details */
+ /* arg location case, see bpf_usdt_arg() for details */
enum __bpf_usdt_arg_type arg_type;
/* offset of referenced register within struct pt_regs */
short reg_off;
diff --git a/.output/bpftool/bootstrap/bpftool b/.output/bpftool/bootstrap/bpftool
index db1b2a1..abb6d2b 100755
Binary files a/.output/bpftool/bootstrap/bpftool and b/.output/bpftool/bootstrap/bpftool differ
diff --git a/.output/bpftool/bootstrap/btf.d b/.output/bpftool/bootstrap/btf.d
index bd6fce0..80cdece 100644
--- a/.output/bpftool/bootstrap/btf.d
+++ b/.output/bpftool/bootstrap/btf.d
@@ -1,19 +1,18 @@
-/home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/btf.o: \
- btf.c /home/ne0/sys_competition/start/bpftool/include/linux/err.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/types.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/btf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
- json_writer.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler_types.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler-gcc.h \
- main.h /home/ne0/sys_competition/start/bpftool/include/linux/kernel.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/build_bug.h
+/home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/btf.o: btf.c \
+ /home/ne1/sys_competition/bpftool/include/linux/err.h \
+ /home/ne1/sys_competition/bpftool/include/linux/types.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/btf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
+ json_writer.h /home/ne1/sys_competition/bpftool/include/linux/compiler.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler_types.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler-gcc.h main.h \
+ /home/ne1/sys_competition/bpftool/include/linux/kernel.h \
+ /home/ne1/sys_competition/bpftool/include/linux/build_bug.h
diff --git a/.output/bpftool/bootstrap/btf.o b/.output/bpftool/bootstrap/btf.o
index 26fde6d..907acd4 100644
Binary files a/.output/bpftool/bootstrap/btf.o and b/.output/bpftool/bootstrap/btf.o differ
diff --git a/.output/bpftool/bootstrap/common.d b/.output/bpftool/bootstrap/common.d
index 6703b64..db5c08f 100644
--- a/.output/bpftool/bootstrap/common.d
+++ b/.output/bpftool/bootstrap/common.d
@@ -1,18 +1,18 @@
-/home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/common.o: \
- common.c /home/ne0/sys_competition/start/bpftool/include/linux/filter.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/btf.h main.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler_types.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler-gcc.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/kernel.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/build_bug.h \
+/home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/common.o: \
+ common.c /home/ne1/sys_competition/bpftool/include/linux/filter.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/btf.h main.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler_types.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler-gcc.h \
+ /home/ne1/sys_competition/bpftool/include/linux/kernel.h \
+ /home/ne1/sys_competition/bpftool/include/linux/build_bug.h \
json_writer.h
diff --git a/.output/bpftool/bootstrap/common.o b/.output/bpftool/bootstrap/common.o
index d962531..585193f 100644
Binary files a/.output/bpftool/bootstrap/common.o and b/.output/bpftool/bootstrap/common.o differ
diff --git a/.output/bpftool/bootstrap/gen.d b/.output/bpftool/bootstrap/gen.d
index 39ae973..bc4c7ea 100644
--- a/.output/bpftool/bootstrap/gen.d
+++ b/.output/bpftool/bootstrap/gen.d
@@ -1,23 +1,22 @@
-/home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/gen.o: \
- gen.c /home/ne0/sys_competition/start/bpftool/include/linux/err.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/types.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_internal.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/relo_core.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/btf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
- json_writer.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler_types.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler-gcc.h \
- main.h /home/ne0/sys_competition/start/bpftool/include/linux/kernel.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/build_bug.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h
+/home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/gen.o: gen.c \
+ /home/ne1/sys_competition/bpftool/include/linux/err.h \
+ /home/ne1/sys_competition/bpftool/include/linux/types.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_internal.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/relo_core.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/btf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
+ json_writer.h /home/ne1/sys_competition/bpftool/include/linux/compiler.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler_types.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler-gcc.h main.h \
+ /home/ne1/sys_competition/bpftool/include/linux/kernel.h \
+ /home/ne1/sys_competition/bpftool/include/linux/build_bug.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h
diff --git a/.output/bpftool/bootstrap/gen.o b/.output/bpftool/bootstrap/gen.o
index 884907f..a7f1075 100644
Binary files a/.output/bpftool/bootstrap/gen.o and b/.output/bpftool/bootstrap/gen.o differ
diff --git a/.output/bpftool/bootstrap/json_writer.d b/.output/bpftool/bootstrap/json_writer.d
index 8a18281..34d3f36 100644
--- a/.output/bpftool/bootstrap/json_writer.d
+++ b/.output/bpftool/bootstrap/json_writer.d
@@ -1,5 +1,5 @@
-/home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/json_writer.o: \
+/home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/json_writer.o: \
json_writer.c json_writer.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler_types.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler-gcc.h
+ /home/ne1/sys_competition/bpftool/include/linux/compiler.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler_types.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler-gcc.h
diff --git a/.output/bpftool/bootstrap/json_writer.o b/.output/bpftool/bootstrap/json_writer.o
index 6077c69..e4f0bf3 100644
Binary files a/.output/bpftool/bootstrap/json_writer.o and b/.output/bpftool/bootstrap/json_writer.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h
index 972e17e..a4a7b1a 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h
@@ -100,7 +100,7 @@ struct bpf_prog_load_opts {
__u32 log_level;
__u32 log_size;
char *log_buf;
- /* output: actual total log contents size (including termintaing zero).
+ /* output: actual total log contents size (including terminating zero).
* It could be both larger than original log_size (if log was
* truncated), or smaller (if log buffer wasn't filled completely).
* If kernel doesn't support this feature, log_size is left unchanged.
@@ -129,7 +129,7 @@ struct bpf_btf_load_opts {
char *log_buf;
__u32 log_level;
__u32 log_size;
- /* output: actual total log contents size (including termintaing zero).
+ /* output: actual total log contents size (including terminating zero).
* It could be both larger than original log_size (if log was
* truncated), or smaller (if log buffer wasn't filled completely).
* If kernel doesn't support this feature, log_size is left unchanged.
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helper_defs.h b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helper_defs.h
index fecfcf3..0cf177a 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helper_defs.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helper_defs.h
@@ -44,6 +44,14 @@ struct bpf_dynptr;
struct iphdr;
struct ipv6hdr;
+#ifndef __bpf_fastcall
+#if __has_attribute(bpf_fastcall)
+#define __bpf_fastcall __attribute__((bpf_fastcall))
+#else
+#define __bpf_fastcall
+#endif
+#endif
+
/*
* bpf_map_lookup_elem
*
@@ -203,7 +211,7 @@ static __u32 (* const bpf_get_prandom_u32)(void) = (void *) 7;
* Returns
* The SMP id of the processor running the program.
*/
-static __u32 (* const bpf_get_smp_processor_id)(void) = (void *) 8;
+static __bpf_fastcall __u32 (* const bpf_get_smp_processor_id)(void) = (void *) 8;
/*
* bpf_skb_store_bytes
@@ -1224,7 +1232,7 @@ static long (* const bpf_set_hash)(struct __sk_buff *skb, __u32 hash) = (void *)
* **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**,
* **TCP_NODELAY**, **TCP_MAXSEG**, **TCP_WINDOW_CLAMP**,
* **TCP_THIN_LINEAR_TIMEOUTS**, **TCP_BPF_DELACK_MAX**,
- * **TCP_BPF_RTO_MIN**.
+ * **TCP_BPF_RTO_MIN**, **TCP_BPF_SOCK_OPS_CB_FLAGS**.
* * **IPPROTO_IP**, which supports *optname* **IP_TOS**.
* * **IPPROTO_IPV6**, which supports the following *optname*\ s:
* **IPV6_TCLASS**, **IPV6_AUTOFLOWLABEL**.
@@ -1511,10 +1519,6 @@ static long (* const bpf_getsockopt)(void *bpf_socket, int level, int optname, v
* option, and in this case it only works on functions tagged with
* **ALLOW_ERROR_INJECTION** in the kernel code.
*
- * Also, the helper is only available for the architectures having
- * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing,
- * x86 architecture is the only one to support this feature.
- *
* Returns
* 0
*/
@@ -4220,7 +4224,7 @@ static long (* const bpf_find_vma)(struct task_struct *task, __u64 addr, void *c
* Currently, the **flags** must be 0. Currently, nr_loops is
* limited to 1 << 23 (~8 million) loops.
*
- * long (\*callback_fn)(u32 index, void \*ctx);
+ * long (\*callback_fn)(u64 index, void \*ctx);
*
* where **index** is the current index in the loop. The index
* is zero-indexed.
@@ -4424,9 +4428,10 @@ static long (* const bpf_ima_file_hash)(struct file *file, void *dst, __u32 size
/*
* bpf_kptr_xchg
*
- * Exchange kptr at pointer *map_value* with *ptr*, and return the
- * old value. *ptr* can be NULL, otherwise it must be a referenced
- * pointer which will be released when this helper is called.
+ * Exchange kptr at pointer *dst* with *ptr*, and return the old value.
+ * *dst* can be map value or local kptr. *ptr* can be NULL, otherwise
+ * it must be a referenced pointer which will be released when this helper
+ * is called.
*
* Returns
* The old value of kptr (which can be NULL). The returned pointer
@@ -4434,7 +4439,7 @@ static long (* const bpf_ima_file_hash)(struct file *file, void *dst, __u32 size
* corresponding release function, or moved into a BPF map before
* program exit.
*/
-static void *(* const bpf_kptr_xchg)(void *map_value, void *ptr) = (void *) 194;
+static void *(* const bpf_kptr_xchg)(void *dst, void *ptr) = (void *) 194;
/*
* bpf_map_lookup_percpu_elem
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h
index 305c628..686824b 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_helpers.h
@@ -185,6 +185,7 @@ enum libbpf_tristate {
#define __kptr_untrusted __attribute__((btf_type_tag("kptr_untrusted")))
#define __kptr __attribute__((btf_type_tag("kptr")))
#define __percpu_kptr __attribute__((btf_type_tag("percpu_kptr")))
+#define __uptr __attribute__((btf_type_tag("uptr")))
#if defined (__clang__)
#define bpf_ksym_exists(sym) ({ \
@@ -341,7 +342,7 @@ extern void bpf_iter_num_destroy(struct bpf_iter_num *it) __weak __ksym;
* I.e., it looks almost like high-level for each loop in other languages,
* supports continue/break, and is verifiable by BPF verifier.
*
- * For iterating integers, the difference betwen bpf_for_each(num, i, N, M)
+ * For iterating integers, the difference between bpf_for_each(num, i, N, M)
* and bpf_for(i, N, M) is in that bpf_for() provides additional proof to
* verifier that i is in [N, M) range, and in bpf_for_each() case i is `int
* *`, not just `int`. So for integers bpf_for() is more convenient.
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_tracing.h b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_tracing.h
index 9314fa9..a8f6cd4 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_tracing.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/bpf_tracing.h
@@ -163,7 +163,7 @@
struct pt_regs___s390 {
unsigned long orig_gpr2;
-};
+} __attribute__((preserve_access_index));
/* s390 provides user_pt_regs instead of struct pt_regs to userspace */
#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x))
@@ -179,7 +179,7 @@ struct pt_regs___s390 {
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
#define __PT_PARM6_SYSCALL_REG gprs[7]
-#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x)
+#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___s390 *)(x))->__PT_PARM1_SYSCALL_REG)
#define PT_REGS_PARM1_CORE_SYSCALL(x) \
BPF_CORE_READ((const struct pt_regs___s390 *)(x), __PT_PARM1_SYSCALL_REG)
@@ -222,7 +222,7 @@ struct pt_regs___s390 {
struct pt_regs___arm64 {
unsigned long orig_x0;
-};
+} __attribute__((preserve_access_index));
/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */
#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x))
@@ -241,7 +241,7 @@ struct pt_regs___arm64 {
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG
-#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1_CORE_SYSCALL(x)
+#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___arm64 *)(x))->__PT_PARM1_SYSCALL_REG)
#define PT_REGS_PARM1_CORE_SYSCALL(x) \
BPF_CORE_READ((const struct pt_regs___arm64 *)(x), __PT_PARM1_SYSCALL_REG)
@@ -351,6 +351,10 @@ struct pt_regs___arm64 {
* https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc#risc-v-calling-conventions
*/
+struct pt_regs___riscv {
+ unsigned long orig_a0;
+} __attribute__((preserve_access_index));
+
/* riscv provides struct user_regs_struct instead of struct pt_regs to userspace */
#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x))
#define __PT_PARM1_REG a0
@@ -362,12 +366,15 @@ struct pt_regs___arm64 {
#define __PT_PARM7_REG a6
#define __PT_PARM8_REG a7
-#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG
+#define __PT_PARM1_SYSCALL_REG orig_a0
#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG
#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG
#define __PT_PARM4_SYSCALL_REG __PT_PARM4_REG
#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG
+#define PT_REGS_PARM1_SYSCALL(x) (((const struct pt_regs___riscv *)(x))->__PT_PARM1_SYSCALL_REG)
+#define PT_REGS_PARM1_CORE_SYSCALL(x) \
+ BPF_CORE_READ((const struct pt_regs___riscv *)(x), __PT_PARM1_SYSCALL_REG)
#define __PT_RET_REG ra
#define __PT_FP_REG s0
@@ -473,7 +480,7 @@ struct pt_regs;
#endif
/*
* Similarly, syscall-specific conventions might differ between function call
- * conventions within each architecutre. All supported architectures pass
+ * conventions within each architecture. All supported architectures pass
* either 6 or 7 syscall arguments in registers.
*
* See syscall(2) manpage for succinct table with information on each arch.
@@ -515,7 +522,7 @@ struct pt_regs;
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; })
#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
-#elif defined(bpf_target_sparc)
+#elif defined(bpf_target_sparc) || defined(bpf_target_arm64)
#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); })
#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP
@@ -651,7 +658,7 @@ struct pt_regs;
* BPF_PROG is a convenience wrapper for generic tp_btf/fentry/fexit and
* similar kinds of BPF programs, that accept input arguments as a single
* pointer to untyped u64 array, where each u64 can actually be a typed
- * pointer or integer of different size. Instead of requring user to write
+ * pointer or integer of different size. Instead of requiring user to write
* manual casts and work with array elements by index, BPF_PROG macro
* allows user to declare a list of named and typed input arguments in the
* same syntax as for normal C function. All the casting is hidden and
@@ -801,7 +808,7 @@ struct pt_regs;
* tp_btf/fentry/fexit BPF programs. It hides the underlying platform-specific
* low-level way of getting kprobe input arguments from struct pt_regs, and
* provides a familiar typed and named function arguments syntax and
- * semantics of accessing kprobe input paremeters.
+ * semantics of accessing kprobe input parameters.
*
* Original struct pt_regs* context is preserved as 'ctx' argument. This might
* be necessary when using BPF helpers like bpf_perf_event_output().
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h b/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h
index b68d216..47ee8f6 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h
@@ -167,6 +167,9 @@ LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset);
LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size);
LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext);
LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size);
+LIBBPF_API enum btf_endianness btf_ext__endianness(const struct btf_ext *btf_ext);
+LIBBPF_API int btf_ext__set_endianness(struct btf_ext *btf_ext,
+ enum btf_endianness endian);
LIBBPF_API int btf__find_str(struct btf *btf, const char *s);
LIBBPF_API int btf__add_str(struct btf *btf, const char *s);
@@ -286,7 +289,7 @@ LIBBPF_API void btf_dump__free(struct btf_dump *d);
LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id);
struct btf_dump_emit_type_decl_opts {
- /* size of this struct, for forward/backward compatiblity */
+ /* size of this struct, for forward/backward compatibility */
size_t sz;
/* optional field name for type declaration, e.g.:
* - struct my_struct
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h b/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h
index c12f832..0c4f155 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h
@@ -166,8 +166,8 @@ bool hashmap_find(const struct hashmap *map, long key, long *value);
* @bkt: integer used as a bucket loop cursor
*/
#define hashmap__for_each_entry(map, cur, bkt) \
- for (bkt = 0; bkt < map->cap; bkt++) \
- for (cur = map->buckets[bkt]; cur; cur = cur->next)
+ for (bkt = 0; bkt < (map)->cap; bkt++) \
+ for (cur = (map)->buckets[bkt]; cur; cur = cur->next)
/*
* hashmap__for_each_entry_safe - iterate over all entries in hashmap, safe
@@ -178,8 +178,8 @@ bool hashmap_find(const struct hashmap *map, long key, long *value);
* @bkt: integer used as a bucket loop cursor
*/
#define hashmap__for_each_entry_safe(map, cur, tmp, bkt) \
- for (bkt = 0; bkt < map->cap; bkt++) \
- for (cur = map->buckets[bkt]; \
+ for (bkt = 0; bkt < (map)->cap; bkt++) \
+ for (cur = (map)->buckets[bkt]; \
cur && ({tmp = cur->next; true; }); \
cur = tmp)
@@ -190,19 +190,19 @@ bool hashmap_find(const struct hashmap *map, long key, long *value);
* @key: key to iterate entries for
*/
#define hashmap__for_each_key_entry(map, cur, _key) \
- for (cur = map->buckets \
- ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
+ for (cur = (map)->buckets \
+ ? (map)->buckets[hash_bits((map)->hash_fn((_key), (map)->ctx), (map)->cap_bits)] \
: NULL; \
cur; \
cur = cur->next) \
- if (map->equal_fn(cur->key, (_key), map->ctx))
+ if ((map)->equal_fn(cur->key, (_key), (map)->ctx))
#define hashmap__for_each_key_entry_safe(map, cur, tmp, _key) \
- for (cur = map->buckets \
- ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \
+ for (cur = (map)->buckets \
+ ? (map)->buckets[hash_bits((map)->hash_fn((_key), (map)->ctx), (map)->cap_bits)] \
: NULL; \
cur && ({ tmp = cur->next; true; }); \
cur = tmp) \
- if (map->equal_fn(cur->key, (_key), map->ctx))
+ if ((map)->equal_fn(cur->key, (_key), (map)->ctx))
#endif /* __LIBBPF_HASHMAP_H */
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h
index 64a6a3d..b2ce3a7 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h
@@ -152,7 +152,7 @@ struct bpf_object_open_opts {
* log_buf and log_level settings.
*
* If specified, this log buffer will be passed for:
- * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overriden
+ * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overridden
* with bpf_program__set_log() on per-program level, to get
* BPF verifier log output.
* - during BPF object's BTF load into kernel (BPF_BTF_LOAD) to get
@@ -294,6 +294,14 @@ LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj);
LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj);
LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version);
+/**
+ * @brief **bpf_object__token_fd** is an accessor for BPF token FD associated
+ * with BPF object.
+ * @param obj Pointer to a valid BPF object
+ * @return BPF token FD or -1, if it wasn't set
+ */
+LIBBPF_API int bpf_object__token_fd(const struct bpf_object *obj);
+
struct btf;
LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj);
LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj);
@@ -455,7 +463,7 @@ LIBBPF_API int bpf_link__destroy(struct bpf_link *link);
/**
* @brief **bpf_program__attach()** is a generic function for attaching
* a BPF program based on auto-detection of program type, attach type,
- * and extra paremeters, where applicable.
+ * and extra parameters, where applicable.
*
* @param prog BPF program to attach
* @return Reference to the newly created BPF link; or NULL is returned on error,
@@ -569,10 +577,12 @@ struct bpf_uprobe_multi_opts {
size_t cnt;
/* create return uprobes */
bool retprobe;
+ /* create session kprobes */
+ bool session;
size_t :0;
};
-#define bpf_uprobe_multi_opts__last_field retprobe
+#define bpf_uprobe_multi_opts__last_field session
/**
* @brief **bpf_program__attach_uprobe_multi()** attaches a BPF program
@@ -679,7 +689,7 @@ struct bpf_uprobe_opts {
/**
* @brief **bpf_program__attach_uprobe()** attaches a BPF program
* to the userspace function which is found by binary path and
- * offset. You can optionally specify a particular proccess to attach
+ * offset. You can optionally specify a particular process to attach
* to. You can also optionally attach the program to the function
* exit instead of entry.
*
@@ -1593,11 +1603,11 @@ LIBBPF_API int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_i
* memory region of the ring buffer.
* This ring buffer can be used to implement a custom events consumer.
* The ring buffer starts with the *struct perf_event_mmap_page*, which
- * holds the ring buffer managment fields, when accessing the header
+ * holds the ring buffer management fields, when accessing the header
* structure it's important to be SMP aware.
* You can refer to *perf_event_read_simple* for a simple example.
* @param pb the perf buffer structure
- * @param buf_idx the buffer index to retreive
+ * @param buf_idx the buffer index to retrieve
* @param buf (out) gets the base pointer of the mmap()'ed memory
* @param buf_size (out) gets the size of the mmap()'ed region
* @return 0 on success, negative error code for failure
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_internal.h b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_internal.h
index 408df59..de498e2 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_internal.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_internal.h
@@ -10,6 +10,7 @@
#define __LIBBPF_LIBBPF_INTERNAL_H
#include
+#include
#include
#include
#include
@@ -448,11 +449,11 @@ struct btf_ext_info {
*
* The func_info subsection layout:
* record size for struct bpf_func_info in the func_info subsection
- * struct btf_sec_func_info for section #1
+ * struct btf_ext_info_sec for section #1
* a list of bpf_func_info records for section #1
* where struct bpf_func_info mimics one in include/uapi/linux/bpf.h
* but may not be identical
- * struct btf_sec_func_info for section #2
+ * struct btf_ext_info_sec for section #2
* a list of bpf_func_info records for section #2
* ......
*
@@ -484,6 +485,8 @@ struct btf_ext {
struct btf_ext_header *hdr;
void *data;
};
+ void *data_swapped;
+ bool swapped_endian;
struct btf_ext_info func_info;
struct btf_ext_info line_info;
struct btf_ext_info core_relo_info;
@@ -511,6 +514,32 @@ struct bpf_line_info_min {
__u32 line_col;
};
+/* Functions to byte-swap info records */
+
+typedef void (*info_rec_bswap_fn)(void *);
+
+static inline void bpf_func_info_bswap(struct bpf_func_info *i)
+{
+ i->insn_off = bswap_32(i->insn_off);
+ i->type_id = bswap_32(i->type_id);
+}
+
+static inline void bpf_line_info_bswap(struct bpf_line_info *i)
+{
+ i->insn_off = bswap_32(i->insn_off);
+ i->file_name_off = bswap_32(i->file_name_off);
+ i->line_off = bswap_32(i->line_off);
+ i->line_col = bswap_32(i->line_col);
+}
+
+static inline void bpf_core_relo_bswap(struct bpf_core_relo *i)
+{
+ i->insn_off = bswap_32(i->insn_off);
+ i->type_id = bswap_32(i->type_id);
+ i->access_str_off = bswap_32(i->access_str_off);
+ i->kind = bswap_32(i->kind);
+}
+
enum btf_field_iter_kind {
BTF_FIELD_ITER_IDS,
BTF_FIELD_ITER_STRS,
@@ -588,6 +617,16 @@ static inline bool is_ldimm64_insn(struct bpf_insn *insn)
return insn->code == (BPF_LD | BPF_IMM | BPF_DW);
}
+static inline void bpf_insn_bswap(struct bpf_insn *insn)
+{
+ __u8 tmp_reg = insn->dst_reg;
+
+ insn->dst_reg = insn->src_reg;
+ insn->src_reg = tmp_reg;
+ insn->off = bswap_16(insn->off);
+ insn->imm = bswap_32(insn->imm);
+}
+
/* Unconditionally dup FD, ensuring it doesn't use [0, 2] range.
* Original FD is not closed or altered in any other way.
* Preserves original FD value, if it's invalid (negative).
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h
index 1e1be46..60b2600 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h
@@ -76,7 +76,7 @@ enum libbpf_strict_mode {
* first BPF program or map creation operation. This is done only if
* kernel is too old to support memcg-based memory accounting for BPF
* subsystem. By default, RLIMIT_MEMLOCK limit is set to RLIM_INFINITY,
- * but it can be overriden with libbpf_set_memlock_rlim() API.
+ * but it can be overridden with libbpf_set_memlock_rlim() API.
* Note that libbpf_set_memlock_rlim() needs to be called before
* the very first bpf_prog_load(), bpf_map_create() or bpf_object__load()
* operation.
@@ -97,7 +97,7 @@ LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode);
* @brief **libbpf_get_error()** extracts the error code from the passed
* pointer
* @param ptr pointer returned from libbpf API function
- * @return error code; or 0 if no error occured
+ * @return error code; or 0 if no error occurred
*
* Note, as of libbpf 1.0 this function is not necessary and not recommended
* to be used. Libbpf doesn't return error code embedded into the pointer
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h
index d6e5eff..28c58fb 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h
@@ -4,6 +4,6 @@
#define __LIBBPF_VERSION_H
#define LIBBPF_MAJOR_VERSION 1
-#define LIBBPF_MINOR_VERSION 5
+#define LIBBPF_MINOR_VERSION 6
#endif /* __LIBBPF_VERSION_H */
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/skel_internal.h b/.output/bpftool/bootstrap/libbpf/include/bpf/skel_internal.h
index 1e82ab0..4d5fa07 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/skel_internal.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/skel_internal.h
@@ -107,7 +107,7 @@ static inline void skel_free(const void *p)
* The loader program will perform probe_read_kernel() from maps.rodata.initial_value.
* skel_finalize_map_data() sets skel->rodata to point to actual value in a bpf map and
* does maps.rodata.initial_value = ~0ULL to signal skel_free_map_data() that kvfree
- * is not nessary.
+ * is not necessary.
*
* For user space:
* skel_prep_map_data() mmaps anon memory into skel->rodata that can be accessed directly.
@@ -351,10 +351,11 @@ static inline int bpf_load_and_run(struct bpf_load_and_run_opts *opts)
attr.test.ctx_size_in = opts->ctx->sz;
err = skel_sys_bpf(BPF_PROG_RUN, &attr, test_run_attr_sz);
if (err < 0 || (int)attr.test.retval < 0) {
- opts->errstr = "failed to execute loader prog";
if (err < 0) {
+ opts->errstr = "failed to execute loader prog";
set_err;
} else {
+ opts->errstr = "error returned by loader prog";
err = (int)attr.test.retval;
#ifndef __KERNEL__
errno = -err;
diff --git a/.output/bpftool/bootstrap/libbpf/include/bpf/usdt.bpf.h b/.output/bpftool/bootstrap/libbpf/include/bpf/usdt.bpf.h
index 76359bc..b811f75 100644
--- a/.output/bpftool/bootstrap/libbpf/include/bpf/usdt.bpf.h
+++ b/.output/bpftool/bootstrap/libbpf/include/bpf/usdt.bpf.h
@@ -39,7 +39,7 @@ enum __bpf_usdt_arg_type {
struct __bpf_usdt_arg_spec {
/* u64 scalar interpreted depending on arg_type, see below */
__u64 val_off;
- /* arg location case, see bpf_udst_arg() for details */
+ /* arg location case, see bpf_usdt_arg() for details */
enum __bpf_usdt_arg_type arg_type;
/* offset of referenced register within struct pt_regs */
short reg_off;
diff --git a/.output/bpftool/bootstrap/libbpf/libbpf.a b/.output/bpftool/bootstrap/libbpf/libbpf.a
index 95b29fa..34480d2 100644
Binary files a/.output/bpftool/bootstrap/libbpf/libbpf.a and b/.output/bpftool/bootstrap/libbpf/libbpf.a differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/bpf.o b/.output/bpftool/bootstrap/libbpf/staticobjs/bpf.o
index 012d27d..6c68372 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/bpf.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/bpf.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/bpf_prog_linfo.o b/.output/bpftool/bootstrap/libbpf/staticobjs/bpf_prog_linfo.o
index 5ecefbe..b556b50 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/bpf_prog_linfo.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/bpf_prog_linfo.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/btf.o b/.output/bpftool/bootstrap/libbpf/staticobjs/btf.o
index 8bc9d32..c3ff86a 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/btf.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/btf.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/btf_dump.o b/.output/bpftool/bootstrap/libbpf/staticobjs/btf_dump.o
index 7b33cab..ffb8df3 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/btf_dump.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/btf_dump.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/btf_iter.o b/.output/bpftool/bootstrap/libbpf/staticobjs/btf_iter.o
index 398a257..c63c817 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/btf_iter.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/btf_iter.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/btf_relocate.o b/.output/bpftool/bootstrap/libbpf/staticobjs/btf_relocate.o
index 82e388b..51aba66 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/btf_relocate.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/btf_relocate.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/elf.o b/.output/bpftool/bootstrap/libbpf/staticobjs/elf.o
index 8bb0ddd..dcdf721 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/elf.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/elf.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/features.o b/.output/bpftool/bootstrap/libbpf/staticobjs/features.o
index 449e132..4ec8029 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/features.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/features.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/gen_loader.o b/.output/bpftool/bootstrap/libbpf/staticobjs/gen_loader.o
index 51eda88..4698e5c 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/gen_loader.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/gen_loader.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/hashmap.o b/.output/bpftool/bootstrap/libbpf/staticobjs/hashmap.o
index d51d700..ce121cf 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/hashmap.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/hashmap.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf.o b/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf.o
index 46c6a1a..e61fcd6 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_errno.o b/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_errno.o
index ae1997d..ba22328 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_errno.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_errno.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_probes.o b/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_probes.o
index c37f288..3360f34 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_probes.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/libbpf_probes.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/linker.o b/.output/bpftool/bootstrap/libbpf/staticobjs/linker.o
index ffca2eb..d8b793c 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/linker.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/linker.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/netlink.o b/.output/bpftool/bootstrap/libbpf/staticobjs/netlink.o
index 7227ecb..cebc948 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/netlink.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/netlink.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/nlattr.o b/.output/bpftool/bootstrap/libbpf/staticobjs/nlattr.o
index 9f4911c..792fb13 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/nlattr.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/nlattr.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/relo_core.o b/.output/bpftool/bootstrap/libbpf/staticobjs/relo_core.o
index 24434c5..00f4872 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/relo_core.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/relo_core.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/ringbuf.o b/.output/bpftool/bootstrap/libbpf/staticobjs/ringbuf.o
index eacf1c6..3eea9c8 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/ringbuf.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/ringbuf.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/str_error.o b/.output/bpftool/bootstrap/libbpf/staticobjs/str_error.o
index 452df18..b171028 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/str_error.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/str_error.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/strset.o b/.output/bpftool/bootstrap/libbpf/staticobjs/strset.o
index e2b6372..994176c 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/strset.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/strset.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/usdt.o b/.output/bpftool/bootstrap/libbpf/staticobjs/usdt.o
index d280fc1..7ac654c 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/usdt.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/usdt.o differ
diff --git a/.output/bpftool/bootstrap/libbpf/staticobjs/zip.o b/.output/bpftool/bootstrap/libbpf/staticobjs/zip.o
index 1fc9adc..48f1799 100644
Binary files a/.output/bpftool/bootstrap/libbpf/staticobjs/zip.o and b/.output/bpftool/bootstrap/libbpf/staticobjs/zip.o differ
diff --git a/.output/bpftool/bootstrap/main.d b/.output/bpftool/bootstrap/main.d
index 7a7d47e..bce41d9 100644
--- a/.output/bpftool/bootstrap/main.d
+++ b/.output/bpftool/bootstrap/main.d
@@ -1,18 +1,18 @@
-/home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/main.o: \
- main.c /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/types.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/bpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
- /home/ne0/sys_competition/start/bpftool/include/uapi/linux/btf.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h \
- /home/ne0/sys_competition/start/cpu_watcher/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
- main.h /home/ne0/sys_competition/start/bpftool/include/linux/compiler.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler_types.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/compiler-gcc.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/kernel.h \
- /home/ne0/sys_competition/start/bpftool/include/linux/build_bug.h \
+/home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/main.o: \
+ main.c /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf.h \
+ /home/ne1/sys_competition/bpftool/include/linux/types.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/bpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/bpf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_common.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_version.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf_legacy.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/btf.h \
+ /home/ne1/sys_competition/bpftool/include/uapi/linux/btf.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/hashmap.h \
+ /home/ne1/sys_competition/scx-plug/.output/bpftool/bootstrap/libbpf/include/bpf/libbpf.h \
+ main.h /home/ne1/sys_competition/bpftool/include/linux/compiler.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler_types.h \
+ /home/ne1/sys_competition/bpftool/include/linux/compiler-gcc.h \
+ /home/ne1/sys_competition/bpftool/include/linux/kernel.h \
+ /home/ne1/sys_competition/bpftool/include/linux/build_bug.h \
json_writer.h
diff --git a/.output/bpftool/bootstrap/main.o b/.output/bpftool/bootstrap/main.o
index 0a7696e..9e45b3a 100644
Binary files a/.output/bpftool/bootstrap/main.o and b/.output/bpftool/bootstrap/main.o differ
diff --git a/.output/cpu_controller.o b/.output/cpu_controller.o
index c234771..7a1a9ed 100644
Binary files a/.output/cpu_controller.o and b/.output/cpu_controller.o differ
diff --git a/.output/cpu_stats.bpf.o b/.output/cpu_stats.bpf.o
deleted file mode 100644
index 8920098..0000000
Binary files a/.output/cpu_stats.bpf.o and /dev/null differ
diff --git a/.output/cpu_stats.skel.h b/.output/cpu_stats.skel.h
deleted file mode 100644
index 874eb55..0000000
--- a/.output/cpu_stats.skel.h
+++ /dev/null
@@ -1,4323 +0,0 @@
-/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
-
-/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
-#ifndef __CPU_STATS_BPF_SKEL_H__
-#define __CPU_STATS_BPF_SKEL_H__
-
-#include
-#include
-#include
-
-#define BPF_SKEL_SUPPORTS_MAP_AUTO_ATTACH 1
-
-struct cpu_stats_bpf {
- struct bpf_object_skeleton *skeleton;
- struct bpf_object *obj;
- struct {
- struct bpf_map *task_cpu_usage_map;
- struct bpf_map *cpu_usage_times_map;
- struct bpf_map *cpu_usage_percent_map;
- struct bpf_map *runqlat_map;
- struct bpf_map *thread_occupied_map;
- struct bpf_map *stack_traces_map;
- struct bpf_map *task_trace_data_map;
- struct bpf_map *cpu_usr_map;
- struct bpf_map *cpu_ema_ctrl_map;
- struct bpf_map *process_map;
- struct bpf_map *process_occupied_map;
- struct bpf_map *cpu_usage_buffer;
- struct bpf_map *task_occupied_buffer;
- struct bpf_map *process_occupied_buffer;
- struct bpf_map *runqlat_buffer;
- struct bpf_map *task_backtrace_buffer;
- struct bpf_map *rodata;
- struct bpf_map *bss;
- } maps;
- struct {
- struct bpf_program *handle_sched_wakeup;
- struct bpf_program *handle_sched_wakeup_new;
- struct bpf_program *handle_task_create;
- struct bpf_program *handle_task_exit;
- struct bpf_program *record_task_switch;
- struct bpf_program *record_backtrace;
- struct bpf_program *record_cpu_idle;
- struct bpf_program *trace_sys_enter;
- struct bpf_program *trace_sys_exit;
- struct bpf_program *trace_cpu_softirq_entry;
- struct bpf_program *trace_cpu_softirq_exit;
- struct bpf_program *trace_cpu_irq_entry;
- struct bpf_program *trace_cpu_irq_exit;
- struct bpf_program *handle_cpu_event;
- struct bpf_program *handle_sys_latency_event;
- } progs;
- struct {
- struct bpf_link *handle_sched_wakeup;
- struct bpf_link *handle_sched_wakeup_new;
- struct bpf_link *handle_task_create;
- struct bpf_link *handle_task_exit;
- struct bpf_link *record_task_switch;
- struct bpf_link *record_backtrace;
- struct bpf_link *record_cpu_idle;
- struct bpf_link *trace_sys_enter;
- struct bpf_link *trace_sys_exit;
- struct bpf_link *trace_cpu_softirq_entry;
- struct bpf_link *trace_cpu_softirq_exit;
- struct bpf_link *trace_cpu_irq_entry;
- struct bpf_link *trace_cpu_irq_exit;
- struct bpf_link *handle_cpu_event;
- struct bpf_link *handle_sys_latency_event;
- } links;
- struct cpu_stats_bpf__rodata {
- u32 zero;
- u32 one;
- } *rodata;
- struct cpu_stats_bpf__bss {
- char __pad0[8];
- struct time_window latency_bk_window;
- struct ema_para latency_ema;
- struct ema_para usage_ema;
- struct ema_para task_csw_ema;
- struct ema_para task_preempt_ema;
- } *bss;
-
-#ifdef __cplusplus
- static inline struct cpu_stats_bpf *open(const struct bpf_object_open_opts *opts = nullptr);
- static inline struct cpu_stats_bpf *open_and_load();
- static inline int load(struct cpu_stats_bpf *skel);
- static inline int attach(struct cpu_stats_bpf *skel);
- static inline void detach(struct cpu_stats_bpf *skel);
- static inline void destroy(struct cpu_stats_bpf *skel);
- static inline const void *elf_bytes(size_t *sz);
-#endif /* __cplusplus */
-};
-
-static void
-cpu_stats_bpf__destroy(struct cpu_stats_bpf *obj)
-{
- if (!obj)
- return;
- if (obj->skeleton)
- bpf_object__destroy_skeleton(obj->skeleton);
- free(obj);
-}
-
-static inline int
-cpu_stats_bpf__create_skeleton(struct cpu_stats_bpf *obj);
-
-static inline struct cpu_stats_bpf *
-cpu_stats_bpf__open_opts(const struct bpf_object_open_opts *opts)
-{
- struct cpu_stats_bpf *obj;
- int err;
-
- obj = (struct cpu_stats_bpf *)calloc(1, sizeof(*obj));
- if (!obj) {
- errno = ENOMEM;
- return NULL;
- }
-
- err = cpu_stats_bpf__create_skeleton(obj);
- if (err)
- goto err_out;
-
- err = bpf_object__open_skeleton(obj->skeleton, opts);
- if (err)
- goto err_out;
-
- return obj;
-err_out:
- cpu_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
-}
-
-static inline struct cpu_stats_bpf *
-cpu_stats_bpf__open(void)
-{
- return cpu_stats_bpf__open_opts(NULL);
-}
-
-static inline int
-cpu_stats_bpf__load(struct cpu_stats_bpf *obj)
-{
- return bpf_object__load_skeleton(obj->skeleton);
-}
-
-static inline struct cpu_stats_bpf *
-cpu_stats_bpf__open_and_load(void)
-{
- struct cpu_stats_bpf *obj;
- int err;
-
- obj = cpu_stats_bpf__open();
- if (!obj)
- return NULL;
- err = cpu_stats_bpf__load(obj);
- if (err) {
- cpu_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
- }
- return obj;
-}
-
-static inline int
-cpu_stats_bpf__attach(struct cpu_stats_bpf *obj)
-{
- return bpf_object__attach_skeleton(obj->skeleton);
-}
-
-static inline void
-cpu_stats_bpf__detach(struct cpu_stats_bpf *obj)
-{
- bpf_object__detach_skeleton(obj->skeleton);
-}
-
-static inline const void *cpu_stats_bpf__elf_bytes(size_t *sz);
-
-static inline int
-cpu_stats_bpf__create_skeleton(struct cpu_stats_bpf *obj)
-{
- struct bpf_object_skeleton *s;
- struct bpf_map_skeleton *map __attribute__((unused));
- int err;
-
- s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));
- if (!s) {
- err = -ENOMEM;
- goto err;
- }
-
- s->sz = sizeof(*s);
- s->name = "cpu_stats_bpf";
- s->obj = &obj->obj;
-
- /* maps */
- s->map_cnt = 18;
- s->map_skel_sz = 24;
- s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt,
- sizeof(*s->maps) > 24 ? sizeof(*s->maps) : 24);
- if (!s->maps) {
- err = -ENOMEM;
- goto err;
- }
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 0 * s->map_skel_sz);
- map->name = "task_cpu_usage_map";
- map->map = &obj->maps.task_cpu_usage_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 1 * s->map_skel_sz);
- map->name = "cpu_usage_times_map";
- map->map = &obj->maps.cpu_usage_times_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 2 * s->map_skel_sz);
- map->name = "cpu_usage_percent_map";
- map->map = &obj->maps.cpu_usage_percent_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 3 * s->map_skel_sz);
- map->name = "runqlat_map";
- map->map = &obj->maps.runqlat_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 4 * s->map_skel_sz);
- map->name = "thread_occupied_map";
- map->map = &obj->maps.thread_occupied_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 5 * s->map_skel_sz);
- map->name = "stack_traces_map";
- map->map = &obj->maps.stack_traces_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 6 * s->map_skel_sz);
- map->name = "task_trace_data_map";
- map->map = &obj->maps.task_trace_data_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 7 * s->map_skel_sz);
- map->name = "cpu_usr_map";
- map->map = &obj->maps.cpu_usr_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 8 * s->map_skel_sz);
- map->name = "cpu_ema_ctrl_map";
- map->map = &obj->maps.cpu_ema_ctrl_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 9 * s->map_skel_sz);
- map->name = "process_map";
- map->map = &obj->maps.process_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 10 * s->map_skel_sz);
- map->name = "process_occupied_map";
- map->map = &obj->maps.process_occupied_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 11 * s->map_skel_sz);
- map->name = "cpu_usage_buffer";
- map->map = &obj->maps.cpu_usage_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 12 * s->map_skel_sz);
- map->name = "task_occupied_buffer";
- map->map = &obj->maps.task_occupied_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 13 * s->map_skel_sz);
- map->name = "process_occupied_buffer";
- map->map = &obj->maps.process_occupied_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 14 * s->map_skel_sz);
- map->name = "runqlat_buffer";
- map->map = &obj->maps.runqlat_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 15 * s->map_skel_sz);
- map->name = "task_backtrace_buffer";
- map->map = &obj->maps.task_backtrace_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 16 * s->map_skel_sz);
- map->name = "cpu_stat.rodata";
- map->map = &obj->maps.rodata;
- map->mmaped = (void **)&obj->rodata;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 17 * s->map_skel_sz);
- map->name = "cpu_stat.bss";
- map->map = &obj->maps.bss;
- map->mmaped = (void **)&obj->bss;
-
- /* programs */
- s->prog_cnt = 15;
- s->prog_skel_sz = sizeof(*s->progs);
- s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);
- if (!s->progs) {
- err = -ENOMEM;
- goto err;
- }
-
- s->progs[0].name = "handle_sched_wakeup";
- s->progs[0].prog = &obj->progs.handle_sched_wakeup;
- s->progs[0].link = &obj->links.handle_sched_wakeup;
-
- s->progs[1].name = "handle_sched_wakeup_new";
- s->progs[1].prog = &obj->progs.handle_sched_wakeup_new;
- s->progs[1].link = &obj->links.handle_sched_wakeup_new;
-
- s->progs[2].name = "handle_task_create";
- s->progs[2].prog = &obj->progs.handle_task_create;
- s->progs[2].link = &obj->links.handle_task_create;
-
- s->progs[3].name = "handle_task_exit";
- s->progs[3].prog = &obj->progs.handle_task_exit;
- s->progs[3].link = &obj->links.handle_task_exit;
-
- s->progs[4].name = "record_task_switch";
- s->progs[4].prog = &obj->progs.record_task_switch;
- s->progs[4].link = &obj->links.record_task_switch;
-
- s->progs[5].name = "record_backtrace";
- s->progs[5].prog = &obj->progs.record_backtrace;
- s->progs[5].link = &obj->links.record_backtrace;
-
- s->progs[6].name = "record_cpu_idle";
- s->progs[6].prog = &obj->progs.record_cpu_idle;
- s->progs[6].link = &obj->links.record_cpu_idle;
-
- s->progs[7].name = "trace_sys_enter";
- s->progs[7].prog = &obj->progs.trace_sys_enter;
- s->progs[7].link = &obj->links.trace_sys_enter;
-
- s->progs[8].name = "trace_sys_exit";
- s->progs[8].prog = &obj->progs.trace_sys_exit;
- s->progs[8].link = &obj->links.trace_sys_exit;
-
- s->progs[9].name = "trace_cpu_softirq_entry";
- s->progs[9].prog = &obj->progs.trace_cpu_softirq_entry;
- s->progs[9].link = &obj->links.trace_cpu_softirq_entry;
-
- s->progs[10].name = "trace_cpu_softirq_exit";
- s->progs[10].prog = &obj->progs.trace_cpu_softirq_exit;
- s->progs[10].link = &obj->links.trace_cpu_softirq_exit;
-
- s->progs[11].name = "trace_cpu_irq_entry";
- s->progs[11].prog = &obj->progs.trace_cpu_irq_entry;
- s->progs[11].link = &obj->links.trace_cpu_irq_entry;
-
- s->progs[12].name = "trace_cpu_irq_exit";
- s->progs[12].prog = &obj->progs.trace_cpu_irq_exit;
- s->progs[12].link = &obj->links.trace_cpu_irq_exit;
-
- s->progs[13].name = "handle_cpu_event";
- s->progs[13].prog = &obj->progs.handle_cpu_event;
- s->progs[13].link = &obj->links.handle_cpu_event;
-
- s->progs[14].name = "handle_sys_latency_event";
- s->progs[14].prog = &obj->progs.handle_sys_latency_event;
- s->progs[14].link = &obj->links.handle_sys_latency_event;
-
- s->data = cpu_stats_bpf__elf_bytes(&s->data_sz);
-
- obj->skeleton = s;
- return 0;
-err:
- bpf_object__destroy_skeleton(s);
- return err;
-}
-
-static inline const void *cpu_stats_bpf__elf_bytes(size_t *sz)
-{
- static const char data[] __attribute__((__aligned__(8))) = "\
-\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x10\x73\x01\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x25\0\
-\x01\0\0\x2e\x73\x74\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x74\
-\x65\x78\x74\0\x72\x61\x77\x5f\x74\x70\x2f\x73\x63\x68\x65\x64\x5f\x77\x61\x6b\
-\x65\x75\x70\0\x72\x61\x77\x5f\x74\x70\x2f\x73\x63\x68\x65\x64\x5f\x77\x61\x6b\
-\x65\x75\x70\x5f\x6e\x65\x77\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\
-\x63\x68\x65\x64\x2f\x73\x63\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\
-\x66\x6f\x72\x6b\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\
-\x64\x2f\x73\x63\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x65\x78\x69\
-\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\
-\x63\x68\x65\x64\x5f\x73\x77\x69\x74\x63\x68\0\x74\x72\x61\x63\x65\x70\x6f\x69\
-\x6e\x74\x2f\x70\x6f\x77\x65\x72\x2f\x63\x70\x75\x5f\x69\x64\x6c\x65\0\x74\x72\
-\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x72\x61\x77\x5f\x73\x79\x73\x63\x61\x6c\
-\x6c\x73\x2f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\0\x74\x72\x61\x63\x65\x70\x6f\
-\x69\x6e\x74\x2f\x72\x61\x77\x5f\x73\x79\x73\x63\x61\x6c\x6c\x73\x2f\x73\x79\
-\x73\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\
-\x71\x2f\x73\x6f\x66\x74\x69\x72\x71\x5f\x65\x6e\x74\x72\x79\0\x74\x72\x61\x63\
-\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\x71\x2f\x73\x6f\x66\x74\x69\x72\x71\x5f\
-\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\x71\x2f\
-\x69\x72\x71\x5f\x68\x61\x6e\x64\x6c\x65\x72\x5f\x65\x6e\x74\x72\x79\0\x74\x72\
-\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\x71\x2f\x69\x72\x71\x5f\x68\x61\
-\x6e\x64\x6c\x65\x72\x5f\x65\x78\x69\x74\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\
-\x74\0\x6c\x69\x63\x65\x6e\x73\x65\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x6d\x61\
-\x70\x73\0\x2e\x62\x73\x73\0\x63\x70\x75\x5f\x73\x74\x61\x74\x73\x2e\x62\x70\
-\x66\x2e\x63\0\x4c\x42\x42\x30\x5f\x31\x30\0\x4c\x42\x42\x30\x5f\x38\0\x4c\x42\
-\x42\x30\x5f\x37\0\x4c\x42\x42\x30\x5f\x36\0\x4c\x42\x42\x30\x5f\x39\0\x4c\x42\
-\x42\x31\x5f\x31\x30\0\x4c\x42\x42\x31\x5f\x38\0\x4c\x42\x42\x31\x5f\x37\0\x4c\
-\x42\x42\x31\x5f\x36\0\x4c\x42\x42\x31\x5f\x39\0\x4c\x42\x42\x32\x5f\x32\0\x4c\
-\x42\x42\x33\x5f\x31\x30\0\x4c\x42\x42\x33\x5f\x35\0\x4c\x42\x42\x33\x5f\x37\0\
-\x4c\x42\x42\x34\x5f\x32\0\x4c\x42\x42\x34\x5f\x31\x30\x31\0\x4c\x42\x42\x34\
-\x5f\x37\x34\0\x4c\x42\x42\x34\x5f\x36\0\x4c\x42\x42\x34\x5f\x37\x33\0\x4c\x42\
-\x42\x34\x5f\x39\0\x4c\x42\x42\x34\x5f\x31\x31\0\x4c\x42\x42\x34\x5f\x37\x30\0\
-\x4c\x42\x42\x34\x5f\x36\x36\0\x4c\x42\x42\x34\x5f\x31\x36\0\x74\x61\x73\x6b\
-\x5f\x63\x6f\x6e\x63\x65\x72\x6e\x65\x64\x5f\x75\x70\x64\x61\x74\x65\x2e\x5f\
-\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x34\x5f\x37\x31\0\x4c\x42\x42\x34\x5f\
-\x36\x39\0\x4c\x42\x42\x34\x5f\x31\x38\0\x4c\x42\x42\x34\x5f\x36\x35\0\x4c\x42\
-\x42\x34\x5f\x32\x32\0\x70\x65\x72\x66\x5f\x74\x61\x73\x6b\x5f\x62\x61\x63\x6b\
-\x74\x72\x61\x63\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x34\x5f\x34\
-\x33\0\x4c\x42\x42\x34\x5f\x36\x34\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x75\x70\
-\x64\x61\x74\x65\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x4c\x42\x42\x34\x5f\x31\x30\
-\x30\0\x4c\x42\x42\x34\x5f\x37\x37\0\x4c\x42\x42\x34\x5f\x39\x39\0\x4c\x42\x42\
-\x34\x5f\x37\x39\0\x4c\x42\x42\x34\x5f\x39\x32\0\x4c\x42\x42\x34\x5f\x38\x31\0\
-\x4c\x42\x42\x34\x5f\x38\x33\0\x4c\x42\x42\x34\x5f\x38\x35\0\x4c\x42\x42\x34\
-\x5f\x38\x37\0\x4c\x42\x42\x34\x5f\x38\x39\0\x4c\x42\x42\x34\x5f\x39\x31\0\x4c\
-\x42\x42\x34\x5f\x39\x34\0\x4c\x42\x42\x34\x5f\x39\x35\0\x4c\x42\x42\x34\x5f\
-\x39\x38\0\x4c\x42\x42\x35\x5f\x32\0\x4c\x42\x42\x35\x5f\x31\x39\0\x4c\x42\x42\
-\x35\x5f\x35\0\x4c\x42\x42\x35\x5f\x37\0\x4c\x42\x42\x35\x5f\x31\x38\0\x4c\x42\
-\x42\x35\x5f\x31\x33\0\x4c\x42\x42\x35\x5f\x31\x32\0\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x63\x6f\x6e\x63\x65\x72\x6e\x65\x64\x5f\x75\x70\x64\x61\x74\x65\x2e\
-\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x35\x5f\x31\x36\0\x4c\x42\x42\x35\
-\x5f\x31\x37\0\x4c\x42\x42\x36\x5f\x31\x37\0\x4c\x42\x42\x36\x5f\x34\0\x72\x65\
-\x63\x6f\x72\x64\x5f\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x2e\x5f\x5f\x5f\x5f\
-\x66\x6d\x74\0\x4c\x42\x42\x36\x5f\x38\0\x4c\x42\x42\x36\x5f\x37\0\x4c\x42\x42\
-\x36\x5f\x39\0\x4c\x42\x42\x36\x5f\x31\x31\0\x72\x65\x63\x6f\x72\x64\x5f\x62\
-\x61\x63\x6b\x74\x72\x61\x63\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\x4c\
-\x42\x42\x36\x5f\x31\x33\0\x4c\x42\x42\x36\x5f\x31\x36\0\x4c\x42\x42\x37\x5f\
-\x32\0\x4c\x42\x42\x37\x5f\x37\0\x4c\x42\x42\x37\x5f\x35\0\x4c\x42\x42\x37\x5f\
-\x38\0\x4c\x42\x42\x37\x5f\x36\0\x4c\x42\x42\x38\x5f\x31\x33\0\x4c\x42\x42\x38\
-\x5f\x33\0\x4c\x42\x42\x38\x5f\x31\x32\0\x4c\x42\x42\x38\x5f\x31\x31\0\x4c\x42\
-\x42\x38\x5f\x39\0\x4c\x42\x42\x38\x5f\x38\0\x4c\x42\x42\x38\x5f\x31\x30\0\x4c\
-\x42\x42\x39\x5f\x31\x33\0\x4c\x42\x42\x39\x5f\x33\0\x4c\x42\x42\x39\x5f\x31\
-\x32\0\x4c\x42\x42\x39\x5f\x31\x31\0\x4c\x42\x42\x39\x5f\x39\0\x4c\x42\x42\x39\
-\x5f\x38\0\x4c\x42\x42\x39\x5f\x31\x30\0\x4c\x42\x42\x31\x30\x5f\x34\0\x4c\x42\
-\x42\x31\x30\x5f\x33\0\x4c\x42\x42\x31\x30\x5f\x35\0\x4c\x42\x42\x31\x31\x5f\
-\x33\0\x4c\x42\x42\x31\x31\x5f\x35\0\x4c\x42\x42\x31\x31\x5f\x34\0\x4c\x42\x42\
-\x31\x32\x5f\x34\0\x4c\x42\x42\x31\x32\x5f\x33\0\x4c\x42\x42\x31\x32\x5f\x35\0\
-\x4c\x42\x42\x31\x33\x5f\x33\0\x4c\x42\x42\x31\x33\x5f\x35\0\x4c\x42\x42\x31\
-\x33\x5f\x34\0\x69\x6e\x69\x74\x5f\x63\x70\x75\x73\x5f\x6e\x75\x6d\0\x4c\x42\
-\x42\x31\x34\x5f\x33\0\x4c\x42\x42\x31\x34\x5f\x32\x30\0\x6e\x72\x5f\x63\x70\
-\x75\x73\0\x4c\x42\x42\x31\x34\x5f\x34\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\
-\x75\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x31\
-\x34\x5f\x31\x39\0\x4c\x42\x42\x31\x34\x5f\x31\x31\0\x4c\x42\x42\x31\x34\x5f\
-\x31\x32\0\x4c\x42\x42\x31\x34\x5f\x31\x35\0\x5f\x5f\x75\x70\x64\x61\x74\x65\
-\x5f\x70\x65\x72\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\
-\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x31\x34\x5f\x31\x34\0\
-\x4c\x42\x42\x31\x34\x5f\x31\x37\0\x4c\x42\x42\x31\x34\x5f\x31\x38\0\x4c\x42\
-\x42\x31\x34\x5f\x31\x36\0\x4c\x42\x42\x31\x34\x5f\x38\0\x75\x70\x64\x61\x74\
-\x65\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\
-\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\x75\x5f\
-\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\x4c\x42\x42\x31\
-\x35\x5f\x32\0\x70\x65\x72\x66\x5f\x72\x75\x6e\x71\x6c\x61\x74\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\0\x4c\x42\x42\x31\x35\x5f\x31\x39\0\x4c\x42\x42\x31\x35\x5f\
-\x34\0\x4c\x42\x42\x31\x35\x5f\x36\0\x4c\x42\x42\x31\x35\x5f\x38\0\x4c\x42\x42\
-\x31\x35\x5f\x31\x30\0\x4c\x42\x42\x31\x35\x5f\x31\x32\0\x4c\x42\x42\x31\x35\
-\x5f\x31\x34\0\x4c\x42\x42\x31\x35\x5f\x31\x36\0\x4c\x42\x42\x31\x35\x5f\x31\
-\x38\0\x68\x61\x6e\x64\x6c\x65\x5f\x73\x63\x68\x65\x64\x5f\x77\x61\x6b\x65\x75\
-\x70\0\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\
-\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x61\x70\0\x68\x61\x6e\x64\x6c\x65\x5f\
-\x73\x63\x68\x65\x64\x5f\x77\x61\x6b\x65\x75\x70\x5f\x6e\x65\x77\0\x68\x61\x6e\
-\x64\x6c\x65\x5f\x74\x61\x73\x6b\x5f\x63\x72\x65\x61\x74\x65\0\x68\x61\x6e\x64\
-\x6c\x65\x5f\x74\x61\x73\x6b\x5f\x65\x78\x69\x74\0\x74\x68\x72\x65\x61\x64\x5f\
-\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\0\x74\x61\x73\x6b\x5f\x74\x72\
-\x61\x63\x65\x5f\x64\x61\x74\x61\x5f\x6d\x61\x70\0\x70\x72\x6f\x63\x65\x73\x73\
-\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\0\x72\x65\x63\x6f\x72\x64\
-\x5f\x74\x61\x73\x6b\x5f\x73\x77\x69\x74\x63\x68\0\x63\x70\x75\x5f\x75\x73\x61\
-\x67\x65\x5f\x74\x69\x6d\x65\x73\x5f\x6d\x61\x70\0\x63\x70\x75\x5f\x75\x73\x61\
-\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x5f\x6d\x61\x70\0\x74\x61\x73\x6b\x5f\
-\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x62\x75\x66\x66\x65\x72\0\x74\x61\x73\x6b\
-\x5f\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x5f\x62\x75\x66\x66\x65\x72\0\x72\x75\
-\x6e\x71\x6c\x61\x74\x5f\x6d\x61\x70\0\x6f\x6e\x65\0\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x62\x75\x66\x66\x65\x72\0\x72\x65\
-\x63\x6f\x72\x64\x5f\x62\x61\x63\x6b\x74\x72\x61\x63\x65\0\x73\x74\x61\x63\x6b\
-\x5f\x74\x72\x61\x63\x65\x73\x5f\x6d\x61\x70\0\x72\x65\x63\x6f\x72\x64\x5f\x63\
-\x70\x75\x5f\x69\x64\x6c\x65\0\x74\x72\x61\x63\x65\x5f\x73\x79\x73\x5f\x65\x6e\
-\x74\x65\x72\0\x74\x72\x61\x63\x65\x5f\x73\x79\x73\x5f\x65\x78\x69\x74\0\x74\
-\x72\x61\x63\x65\x5f\x63\x70\x75\x5f\x73\x6f\x66\x74\x69\x72\x71\x5f\x65\x6e\
-\x74\x72\x79\0\x74\x72\x61\x63\x65\x5f\x63\x70\x75\x5f\x73\x6f\x66\x74\x69\x72\
-\x71\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x5f\x63\x70\x75\x5f\x69\x72\x71\
-\x5f\x65\x6e\x74\x72\x79\0\x74\x72\x61\x63\x65\x5f\x63\x70\x75\x5f\x69\x72\x71\
-\x5f\x65\x78\x69\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\x75\x5f\x65\x76\x65\
-\x6e\x74\0\x63\x70\x75\x5f\x75\x73\x72\x5f\x6d\x61\x70\0\x7a\x65\x72\x6f\0\x63\
-\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x62\x75\x66\x66\x65\x72\0\x68\x61\x6e\x64\
-\x6c\x65\x5f\x73\x79\x73\x5f\x6c\x61\x74\x65\x6e\x63\x79\x5f\x65\x76\x65\x6e\
-\x74\0\x72\x75\x6e\x71\x6c\x61\x74\x5f\x62\x75\x66\x66\x65\x72\0\x4c\x49\x43\
-\x45\x4e\x53\x45\0\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x6b\x5f\x77\x69\x6e\x64\
-\x6f\x77\0\x6c\x61\x74\x65\x6e\x63\x79\x5f\x65\x6d\x61\0\x75\x73\x61\x67\x65\
-\x5f\x65\x6d\x61\0\x74\x61\x73\x6b\x5f\x63\x73\x77\x5f\x65\x6d\x61\0\x74\x61\
-\x73\x6b\x5f\x70\x72\x65\x65\x6d\x70\x74\x5f\x65\x6d\x61\0\x63\x70\x75\x5f\x65\
-\x6d\x61\x5f\x63\x74\x72\x6c\x5f\x6d\x61\x70\0\x2e\x72\x65\x6c\x2e\x74\x65\x78\
-\x74\0\x2e\x72\x65\x6c\x72\x61\x77\x5f\x74\x70\x2f\x73\x63\x68\x65\x64\x5f\x77\
-\x61\x6b\x65\x75\x70\0\x2e\x72\x65\x6c\x72\x61\x77\x5f\x74\x70\x2f\x73\x63\x68\
-\x65\x64\x5f\x77\x61\x6b\x65\x75\x70\x5f\x6e\x65\x77\0\x2e\x72\x65\x6c\x74\x72\
-\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\x68\x65\
-\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x66\x6f\x72\x6b\0\x2e\x72\x65\x6c\x74\
-\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\x68\
-\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x65\x78\x69\x74\0\x2e\x72\x65\x6c\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\
-\x68\x65\x64\x5f\x73\x77\x69\x74\x63\x68\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\
-\x70\x6f\x69\x6e\x74\x2f\x70\x6f\x77\x65\x72\x2f\x63\x70\x75\x5f\x69\x64\x6c\
-\x65\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x72\x61\x77\
-\x5f\x73\x79\x73\x63\x61\x6c\x6c\x73\x2f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\0\
-\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x72\x61\x77\x5f\
-\x73\x79\x73\x63\x61\x6c\x6c\x73\x2f\x73\x79\x73\x5f\x65\x78\x69\x74\0\x2e\x72\
-\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\x71\x2f\x73\x6f\
-\x66\x74\x69\x72\x71\x5f\x65\x6e\x74\x72\x79\0\x2e\x72\x65\x6c\x74\x72\x61\x63\
-\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\x71\x2f\x73\x6f\x66\x74\x69\x72\x71\x5f\
-\x65\x78\x69\x74\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\
-\x69\x72\x71\x2f\x69\x72\x71\x5f\x68\x61\x6e\x64\x6c\x65\x72\x5f\x65\x6e\x74\
-\x72\x79\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\
-\x71\x2f\x69\x72\x71\x5f\x68\x61\x6e\x64\x6c\x65\x72\x5f\x65\x78\x69\x74\0\x2e\
-\x72\x65\x6c\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x2e\x42\x54\x46\0\x2e\
-\x42\x54\x46\x2e\x65\x78\x74\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xa6\x01\0\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x03\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb6\x01\0\0\0\0\x04\0\x40\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbe\x01\0\0\0\
-\0\x04\0\xf8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc5\x01\0\0\0\0\x04\0\x50\x04\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xcc\x01\0\0\0\0\x04\0\xa8\x03\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\xd3\x01\0\0\0\0\x04\0\x30\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\
-\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xda\x01\0\0\0\0\x05\0\x40\x04\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xe2\x01\0\0\0\0\x05\0\xf8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xe9\x01\0\0\0\0\x05\0\x50\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf0\x01\0\0\0\0\x05\
-\0\xa8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf7\x01\0\0\0\0\x05\0\x30\x04\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xfe\x01\
-\0\0\0\0\x06\0\xb0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x07\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x05\x02\0\0\0\0\x07\0\xd8\x01\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x0d\x02\0\0\0\0\x07\0\xc8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14\x02\0\0\0\0\
-\x07\0\x20\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x08\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x1b\x02\0\0\0\0\x08\0\x98\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x22\
-\x02\0\0\0\0\x08\0\xa0\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2b\x02\0\0\0\0\x08\0\
-\x50\x10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x33\x02\0\0\0\0\x08\0\xa8\x03\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x3a\x02\0\0\0\0\x08\0\0\x10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x42\
-\x02\0\0\0\0\x08\0\xf0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x49\x02\0\0\0\0\x08\0\
-\x90\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x51\x02\0\0\0\0\x08\0\x90\x0f\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x59\x02\0\0\0\0\x08\0\x88\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\
-\x02\0\0\0\0\x08\0\x10\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x69\x02\0\0\x01\0\x12\0\
-\x6a\0\0\0\0\0\0\0\x1d\0\0\0\0\0\0\0\x87\x02\0\0\0\0\x08\0\xc8\x0f\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x8f\x02\0\0\0\0\x08\0\xd8\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x97\
-\x02\0\0\0\0\x08\0\xa8\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9f\x02\0\0\0\0\x08\0\
-\x80\x0f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa7\x02\0\0\0\0\x08\0\x60\x08\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\xaf\x02\0\0\x01\0\x12\0\x87\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\
-\xcb\x02\0\0\0\0\x08\0\xd0\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd3\x02\0\0\0\0\x08\
-\0\x70\x0f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xdb\x02\0\0\x02\0\x03\0\0\0\0\0\0\0\0\0\
-\x38\x04\0\0\0\0\0\0\xf2\x02\0\0\0\0\x08\0\x60\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xfb\x02\0\0\0\0\x08\0\x18\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\x03\0\0\0\0\x08\
-\0\x50\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\x03\0\0\0\0\x08\0\x60\x12\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x13\x03\0\0\0\0\x08\0\xf8\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x1b\x03\0\0\0\0\x08\0\x78\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x23\x03\0\0\0\0\x08\
-\0\x90\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2b\x03\0\0\0\0\x08\0\xa8\x12\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x33\x03\0\0\0\0\x08\0\xc0\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x3b\x03\0\0\0\0\x08\0\xd8\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x43\x03\0\0\0\0\x08\
-\0\xf0\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4b\x03\0\0\0\0\x08\0\x68\x13\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x53\x03\0\0\0\0\x08\0\xa8\x13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x5b\x03\0\0\0\0\x08\0\x18\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\x03\0\0\0\0\x03\
-\0\xf8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x6a\x03\0\0\0\0\x03\0\x30\x04\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x72\x03\0\0\0\0\x03\0\x40\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\
-\x03\0\0\0\0\x03\0\xd8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x03\0\0\0\0\x03\0\
-\xf8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x88\x03\0\0\0\0\x03\0\xc8\x02\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x90\x03\0\0\0\0\x03\0\x28\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\
-\x03\0\0\x01\0\x12\0\xa7\0\0\0\0\0\0\0\x1c\0\0\0\0\0\0\0\xb9\x03\0\0\0\0\x03\0\
-\x08\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc1\x03\0\0\0\0\x03\0\xf0\x03\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\xc9\x03\0\0\0\0\x08\0\x18\x18\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd1\
-\x03\0\0\0\0\x08\0\x80\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd8\x03\0\0\x01\0\x12\0\
-\x08\0\0\0\0\0\0\0\x22\0\0\0\0\0\0\0\xf1\x03\0\0\0\0\x08\0\x80\x16\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\xf8\x03\0\0\0\0\x08\0\x20\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xff\
-\x03\0\0\0\0\x08\0\xa8\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x06\x04\0\0\0\0\x08\0\
-\x08\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0e\x04\0\0\x01\0\x12\0\x2a\0\0\0\0\0\0\0\
-\x1e\0\0\0\0\0\0\0\x29\x04\0\0\0\0\x08\0\x50\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x31\x04\0\0\0\0\x08\0\xe0\x17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x09\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x39\x04\0\0\0\0\x09\0\x70\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x40\x04\0\0\0\0\x09\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x47\x04\
-\0\0\0\0\x09\0\xc8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4e\x04\0\0\0\0\x09\0\x08\
-\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x55\x04\0\0\0\0\x09\0\xd0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x03\0\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5c\x04\0\0\0\
-\0\x0a\0\x58\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x64\x04\0\0\0\0\x0a\0\xe0\x02\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x6b\x04\0\0\0\0\x0a\0\x48\x04\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x73\x04\0\0\0\0\x0a\0\x10\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x04\0\0\0\0\
-\x0a\0\xc0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x04\0\0\0\0\x0a\0\x70\x03\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x89\x04\0\0\0\0\x0a\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x03\0\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x91\x04\0\0\0\0\x0b\0\x50\
-\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x99\x04\0\0\0\0\x0b\0\xd8\x02\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xa0\x04\0\0\0\0\x0b\0\x40\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa8\x04\
-\0\0\0\0\x0b\0\x08\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\x04\0\0\0\0\x0b\0\xb8\
-\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\x0b\0\x68\x03\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xbe\x04\0\0\0\0\x0b\0\xf8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc6\x04\0\0\0\0\x0c\0\xe0\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xce\x04\0\0\0\0\x0c\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\xd6\x04\0\0\0\0\x0c\0\x28\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\
-\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xde\x04\0\0\0\0\x0d\0\xa0\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xe6\x04\0\0\0\0\x0d\0\x08\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xee\x04\0\0\0\0\x0d\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0e\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf6\x04\0\0\0\0\x0e\0\xe0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xfe\x04\0\0\0\0\x0e\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x06\x05\
-\0\0\0\0\x0e\0\x28\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0f\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x0e\x05\0\0\0\0\x0f\0\xa0\x01\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x16\x05\0\0\0\0\x0f\0\x08\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1e\x05\0\0\0\0\
-\x0f\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x10\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x26\x05\0\0\x01\0\x14\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\x34\
-\x05\0\0\0\0\x10\0\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3c\x05\0\0\0\0\x10\0\xb8\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x45\x05\0\0\x01\0\x14\0\x04\0\0\0\0\0\0\0\x04\0\
-\0\0\0\0\0\0\x4d\x05\0\0\0\0\x10\0\x20\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x55\x05\
-\0\0\x01\0\x12\0\x48\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x6e\x05\0\0\0\0\x10\0\xe8\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x77\x05\0\0\0\0\x10\0\xf0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x80\x05\0\0\0\0\x10\0\x58\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x89\x05\0\0\
-\0\0\x10\0\x50\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x92\x05\0\0\x01\0\x12\0\xde\0\0\
-\0\0\0\0\0\x1c\0\0\0\0\0\0\0\xb8\x05\0\0\0\0\x10\0\xe8\x06\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xc1\x05\0\0\0\0\x10\0\xe8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xca\x05\0\0\
-\0\0\x10\0\x10\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd3\x05\0\0\0\0\x10\0\xb8\x06\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xdc\x05\0\0\0\0\x10\0\x90\x05\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xe4\x05\0\0\x01\0\x12\0\xc3\0\0\0\0\0\0\0\x1b\0\0\0\0\0\0\0\x05\x06\0\0\
-\x01\0\x12\0\x5c\0\0\0\0\0\0\0\x0e\0\0\0\0\0\0\0\x20\x06\0\0\0\0\x10\0\x78\x07\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x28\x06\0\0\x01\0\x12\0\xfa\0\0\0\0\0\0\0\x21\0\0\
-\0\0\0\0\0\x3d\x06\0\0\0\0\x10\0\x80\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x46\x06\0\
-\0\0\0\x10\0\xf8\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4e\x06\0\0\0\0\x10\0\x58\x08\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x56\x06\0\0\0\0\x10\0\xa8\x08\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x5e\x06\0\0\0\0\x10\0\x08\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x67\x06\0\0\
-\0\0\x10\0\x58\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x70\x06\0\0\0\0\x10\0\xb8\x09\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x06\0\0\0\0\x10\0\x08\x0a\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x82\x06\0\0\0\0\x10\0\x60\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\
-\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x14\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x8b\x06\0\0\x12\0\x04\0\0\0\0\0\0\0\0\0\x98\x04\0\0\0\0\0\0\x9f\
-\x06\0\0\x11\0\x13\0\0\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xb2\x06\0\0\x11\0\x13\0\
-\x20\x01\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xbe\x06\0\0\x12\0\x05\0\0\0\0\0\0\0\0\0\
-\x98\x04\0\0\0\0\0\0\xd6\x06\0\0\x12\0\x06\0\0\0\0\0\0\0\0\0\xc0\x01\0\0\0\0\0\
-\0\xe9\x06\0\0\x12\0\x07\0\0\0\0\0\0\0\0\0\xe8\x01\0\0\0\0\0\0\xfa\x06\0\0\x11\
-\0\x13\0\x80\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x0e\x07\0\0\x11\0\x13\0\xc0\0\0\0\
-\0\0\0\0\x20\0\0\0\0\0\0\0\x22\x07\0\0\x11\0\x13\0\x40\x01\0\0\0\0\0\0\x20\0\0\
-\0\0\0\0\0\x37\x07\0\0\x12\0\x08\0\0\0\0\0\0\0\0\0\xb0\x14\0\0\0\0\0\0\x4a\x07\
-\0\0\x11\0\x13\0\x20\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x5e\x07\0\0\x11\0\x13\0\
-\x40\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x74\x07\0\0\x11\0\x13\0\x70\x01\0\0\0\0\0\
-\0\x10\0\0\0\0\0\0\0\x89\x07\0\0\x11\0\x13\0\xa0\x01\0\0\0\0\0\0\x10\0\0\0\0\0\
-\0\0\x9f\x07\0\0\x11\0\x13\0\x60\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xab\x07\0\0\
-\x11\0\x12\0\x04\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\xaf\x07\0\0\x11\0\x13\0\x80\
-\x01\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xc7\x07\0\0\x12\0\x08\0\xb0\x14\0\0\0\0\0\0\
-\x78\x03\0\0\0\0\0\0\xd8\x07\0\0\x11\0\x13\0\xa0\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\
-\0\xe9\x07\0\0\x12\0\x09\0\0\0\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\xf9\x07\0\0\x12\
-\0\x0a\0\0\0\0\0\0\0\0\0\x68\x04\0\0\0\0\0\0\x09\x08\0\0\x12\0\x0b\0\0\0\0\0\0\
-\0\0\0\x60\x04\0\0\0\0\0\0\x18\x08\0\0\x12\0\x0c\0\0\0\0\0\0\0\0\0\x38\x02\0\0\
-\0\0\0\0\x30\x08\0\0\x12\0\x0d\0\0\0\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\x47\x08\0\
-\0\x12\0\x0e\0\0\0\0\0\0\0\0\0\x38\x02\0\0\0\0\0\0\x5b\x08\0\0\x12\0\x0f\0\0\0\
-\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\x6e\x08\0\0\x12\0\x10\0\0\0\0\0\0\0\0\0\x10\
-\x07\0\0\0\0\0\0\x7f\x08\0\0\x11\0\x13\0\xe0\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\
-\x8b\x08\0\0\x11\0\x12\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\x90\x08\0\0\x11\0\
-\x13\0\x60\x01\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xa1\x08\0\0\x12\0\x10\0\x10\x07\0\
-\0\0\0\0\0\x80\x03\0\0\0\0\0\0\xba\x08\0\0\x11\0\x13\0\x90\x01\0\0\0\0\0\0\x10\
-\0\0\0\0\0\0\0\xc9\x08\0\0\x11\0\x11\0\0\0\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\xd1\
-\x08\0\0\x11\0\x14\0\x08\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\xe3\x08\0\0\x11\0\x14\
-\0\x10\0\0\0\0\0\0\0\x0c\0\0\0\0\0\0\0\xef\x08\0\0\x11\0\x14\0\x1c\0\0\0\0\0\0\
-\0\x0c\0\0\0\0\0\0\0\xf9\x08\0\0\x11\0\x14\0\x28\0\0\0\0\0\0\0\x0c\0\0\0\0\0\0\
-\0\x06\x09\0\0\x11\0\x14\0\x34\0\0\0\0\0\0\0\x0c\0\0\0\0\0\0\0\x17\x09\0\0\x11\
-\0\x13\0\0\x01\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xbf\x48\0\0\0\0\0\0\xbf\x39\0\0\0\
-\0\0\0\xbf\x27\0\0\0\0\0\0\x63\x1a\xb4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xb4\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\
-\xbf\x06\0\0\0\0\0\0\x55\x06\x14\0\0\0\0\0\x61\xa1\xb4\xff\0\0\0\0\x63\x1a\xfc\
-\xff\0\0\0\0\xb7\x02\0\0\x01\0\0\0\x63\x2a\xbc\xff\0\0\0\0\x63\x1a\xb8\xff\0\0\
-\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\
-\x03\0\0\xb8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\
-\0\x85\0\0\0\x02\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb4\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\
-\x67\0\0\0\0\0\x61\xa1\xb4\xff\0\0\0\0\x63\x16\0\0\0\0\0\0\x15\x09\x06\0\0\0\0\
-\0\x79\x61\x10\0\0\0\0\0\x3d\x81\x04\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x16\x20\
-\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\x06\x10\0\0\0\0\0\x79\x61\x20\0\0\0\0\0\x0f\
-\x71\0\0\0\0\0\0\x7b\x16\x20\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb4\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x04\0\0\0\
-\0\0\0\x85\0\0\0\x02\0\0\0\x79\x68\x20\0\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x07\0\
-\0\0\0\0\0\x61\x61\0\0\0\0\0\0\x63\x1a\xb8\xff\0\0\0\0\x79\x61\x30\0\0\0\0\0\
-\x55\x01\x02\0\0\0\0\0\x7b\x76\x30\0\0\0\0\0\x05\0\x44\0\0\0\0\0\xbf\x72\0\0\0\
-\0\0\0\x1f\x12\0\0\0\0\0\0\x71\x61\x08\0\0\0\0\0\x55\x01\x1a\0\0\0\0\0\x27\x08\
-\0\0\x64\0\0\0\x37\x08\0\0\0\x65\xcd\x1d\x67\x08\0\0\x20\0\0\0\x77\x08\0\0\x20\
-\0\0\0\xb7\x03\0\0\x0a\0\0\0\x2d\x83\x14\0\0\0\0\0\x25\x02\x13\0\xff\x64\xcd\
-\x1d\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb8\xff\xff\xff\xb7\x08\0\0\0\0\0\0\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x23\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\
-\0\0\x02\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x40\0\0\0\xb7\
-\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\x55\0\x11\0\0\0\0\0\x18\x01\0\0\xa7\0\0\0\
-\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1c\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x2d\0\0\0\0\0\
-\xb7\x03\0\0\x01\x65\xcd\x1d\x2d\x23\x2b\0\0\0\0\0\x55\x01\x05\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xb8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x85\0\0\0\x03\0\0\0\x7b\x76\x30\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x16\x20\0\
-\0\0\0\0\x05\0\x19\0\0\0\0\0\x7b\x80\x38\0\0\0\0\0\x7b\x80\x30\0\0\0\0\0\x7b\
-\x80\x28\0\0\0\0\0\x7b\x80\x20\0\0\0\0\0\x7b\x80\x18\0\0\0\0\0\x7b\x80\x10\0\0\
-\0\0\0\x7b\x80\x08\0\0\0\0\0\x7b\x80\0\0\0\0\0\0\x79\x61\x30\0\0\0\0\0\x61\xa2\
-\xb8\xff\0\0\0\0\x63\x20\0\0\0\0\0\0\x61\x62\x04\0\0\0\0\0\x63\x20\x04\0\0\0\0\
-\0\x1f\x17\0\0\0\0\0\0\x27\x07\0\0\x0a\0\0\0\x37\x07\0\0\0\x65\xcd\x1d\x79\x61\
-\x20\0\0\0\0\0\x2f\x17\0\0\0\0\0\0\x27\x07\0\0\x64\0\0\0\x37\x07\0\0\0\x65\xcd\
-\x1d\x63\x70\x38\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\
-\x84\0\0\0\xb7\x01\0\0\x01\0\0\0\x73\x16\x08\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xb8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x95\0\0\0\0\0\0\0\xb7\x02\0\0\x78\
-\x05\0\0\x79\x16\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x23\0\0\0\0\0\0\xbf\xa1\0\
-\0\0\0\0\0\x07\x01\0\0\x20\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\
-\0\x61\xa1\x20\xff\0\0\0\0\x63\x1a\xb0\xff\0\0\0\0\x15\x01\x7d\0\0\0\0\0\xb7\
-\x01\0\0\x7c\x05\0\0\xbf\x67\0\0\0\0\0\0\x0f\x17\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\
-\0\x07\x01\0\0\x20\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\
-\0\0\x71\0\0\0\x61\xa1\x20\xff\0\0\0\0\x7b\x1a\x18\xff\0\0\0\0\x85\0\0\0\x08\0\
-\0\0\xbf\x08\0\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb0\xff\xff\xff\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x09\0\0\0\0\0\0\x55\
-\x09\x61\0\0\0\0\0\xb7\x01\0\0\x78\x05\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\
-\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x90\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\
-\0\0\0\x71\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x20\xff\xff\xff\xb7\x02\0\0\
-\x04\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x63\x8a\x98\xff\0\0\0\0\x61\
-\xa1\x20\xff\0\0\0\0\x63\x1a\x94\xff\0\0\0\0\xb7\x01\0\0\x88\x07\0\0\x0f\x16\0\
-\0\0\0\0\0\xb7\x08\0\0\0\0\0\0\x63\x8a\xa0\xff\0\0\0\0\x63\x8a\x9c\xff\0\0\0\0\
-\x63\x8a\xa8\xff\0\0\0\0\x63\x8a\xa4\xff\0\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\
-\0\x20\xff\xff\xff\xbf\x71\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\xbf\x63\0\0\0\0\0\
-\0\x85\0\0\0\x71\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x9c\xff\xff\xff\xb7\x02\
-\0\0\x10\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x73\0\0\0\x79\xa1\x90\xff\0\0\0\0\
-\x7b\x1a\x20\xff\0\0\0\0\x79\xa1\x98\xff\0\0\0\0\x7b\x1a\x28\xff\0\0\0\0\x79\
-\xa1\xa0\xff\0\0\0\0\x7b\x1a\x30\xff\0\0\0\0\x61\xa1\xa8\xff\0\0\0\0\x63\x1a\
-\x38\xff\0\0\0\0\x63\x8a\x88\xff\0\0\0\0\x63\x8a\x84\xff\0\0\0\0\x63\x8a\x80\
-\xff\0\0\0\0\x63\x8a\x7c\xff\0\0\0\0\x63\x8a\x78\xff\0\0\0\0\x63\x8a\x74\xff\0\
-\0\0\0\x63\x8a\x70\xff\0\0\0\0\x63\x8a\x6c\xff\0\0\0\0\x63\x8a\x68\xff\0\0\0\0\
-\x63\x8a\x64\xff\0\0\0\0\x63\x8a\x60\xff\0\0\0\0\x63\x8a\x5c\xff\0\0\0\0\x63\
-\x8a\x58\xff\0\0\0\0\x63\x8a\x54\xff\0\0\0\0\x63\x8a\x50\xff\0\0\0\0\x63\x8a\
-\x4c\xff\0\0\0\0\x63\x8a\x48\xff\0\0\0\0\x63\x8a\x44\xff\0\0\0\0\x63\x8a\x40\
-\xff\0\0\0\0\x63\x8a\x3c\xff\0\0\0\0\x63\x8a\x8c\xff\0\0\0\0\x85\0\0\0\x05\0\0\
-\0\x7b\x0a\x60\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb0\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\x20\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x61\xa6\xb0\xff\0\0\0\0\x79\xa1\x18\
-\xff\0\0\0\0\x63\x1a\xb4\xff\0\0\0\0\x15\x01\x1e\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\
-\x07\x02\0\0\xb4\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\
-\0\0\0\x55\0\x1a\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x02\0\0\x01\0\0\0\x61\xa1\
-\xb4\xff\0\0\0\0\x1d\x31\x01\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x63\x1a\xfc\xff\0\
-\0\0\0\x63\x2a\xbc\xff\0\0\0\0\x63\x1a\xb8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xb8\xff\xff\xff\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\
-\x09\x40\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb0\xff\xff\xff\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x93\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x61\x01\x04\0\0\0\0\0\x07\x01\0\0\
-\x01\0\0\0\x63\x10\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb4\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x03\0\0\0\0\0\0\x05\0\xf3\xff\0\0\
-\0\0\xb7\x02\0\0\x78\x05\0\0\x79\x16\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x23\0\
-\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x20\xff\xff\xff\xb7\x02\0\0\x04\0\0\
-\0\x85\0\0\0\x71\0\0\0\x61\xa1\x20\xff\0\0\0\0\x63\x1a\xb0\xff\0\0\0\0\x15\x01\
-\x7d\0\0\0\0\0\xb7\x01\0\0\x7c\x05\0\0\xbf\x67\0\0\0\0\0\0\x0f\x17\0\0\0\0\0\0\
-\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x20\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\xbf\x73\
-\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x61\xa1\x20\xff\0\0\0\0\x7b\x1a\x18\xff\0\0\0\
-\0\x85\0\0\0\x08\0\0\0\xbf\x08\0\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb0\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x09\0\
-\0\0\0\0\0\x55\x09\x61\0\0\0\0\0\xb7\x01\0\0\x78\x05\0\0\xbf\x63\0\0\0\0\0\0\
-\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x90\xff\xff\xff\xb7\x02\0\
-\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x20\xff\xff\
-\xff\xb7\x02\0\0\x04\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x63\x8a\x98\
-\xff\0\0\0\0\x61\xa1\x20\xff\0\0\0\0\x63\x1a\x94\xff\0\0\0\0\xb7\x01\0\0\x88\
-\x07\0\0\x0f\x16\0\0\0\0\0\0\xb7\x08\0\0\0\0\0\0\x63\x8a\xa0\xff\0\0\0\0\x63\
-\x8a\x9c\xff\0\0\0\0\x63\x8a\xa8\xff\0\0\0\0\x63\x8a\xa4\xff\0\0\0\0\xbf\xa7\0\
-\0\0\0\0\0\x07\x07\0\0\x20\xff\xff\xff\xbf\x71\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\
-\0\xbf\x63\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x9c\
-\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x73\0\0\0\x79\
-\xa1\x90\xff\0\0\0\0\x7b\x1a\x20\xff\0\0\0\0\x79\xa1\x98\xff\0\0\0\0\x7b\x1a\
-\x28\xff\0\0\0\0\x79\xa1\xa0\xff\0\0\0\0\x7b\x1a\x30\xff\0\0\0\0\x61\xa1\xa8\
-\xff\0\0\0\0\x63\x1a\x38\xff\0\0\0\0\x63\x8a\x88\xff\0\0\0\0\x63\x8a\x84\xff\0\
-\0\0\0\x63\x8a\x80\xff\0\0\0\0\x63\x8a\x7c\xff\0\0\0\0\x63\x8a\x78\xff\0\0\0\0\
-\x63\x8a\x74\xff\0\0\0\0\x63\x8a\x70\xff\0\0\0\0\x63\x8a\x6c\xff\0\0\0\0\x63\
-\x8a\x68\xff\0\0\0\0\x63\x8a\x64\xff\0\0\0\0\x63\x8a\x60\xff\0\0\0\0\x63\x8a\
-\x5c\xff\0\0\0\0\x63\x8a\x58\xff\0\0\0\0\x63\x8a\x54\xff\0\0\0\0\x63\x8a\x50\
-\xff\0\0\0\0\x63\x8a\x4c\xff\0\0\0\0\x63\x8a\x48\xff\0\0\0\0\x63\x8a\x44\xff\0\
-\0\0\0\x63\x8a\x40\xff\0\0\0\0\x63\x8a\x3c\xff\0\0\0\0\x63\x8a\x8c\xff\0\0\0\0\
-\x85\0\0\0\x05\0\0\0\x7b\x0a\x60\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xb0\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x20\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x61\xa6\xb0\xff\
-\0\0\0\0\x79\xa1\x18\xff\0\0\0\0\x63\x1a\xb4\xff\0\0\0\0\x15\x01\x1e\0\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb4\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x1a\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x02\0\0\
-\x01\0\0\0\x61\xa1\xb4\xff\0\0\0\0\x1d\x31\x01\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\
-\x63\x1a\xfc\xff\0\0\0\0\x63\x2a\xbc\xff\0\0\0\0\x63\x1a\xb8\xff\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\
-\xb8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x07\0\0\0\0\0\x85\0\
-\0\0\x05\0\0\0\x7b\x09\x40\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xb0\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x93\0\0\0\0\0\0\xb7\x04\0\0\0\
-\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x61\x01\x04\0\0\
-\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x10\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xb4\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x03\0\0\0\0\0\0\
-\x05\0\xf3\xff\0\0\0\0\xbf\x16\0\0\0\0\0\0\x61\x61\x2c\0\0\0\0\0\x63\x1a\xfc\
-\xff\0\0\0\0\x85\0\0\0\x08\0\0\0\xbf\x07\0\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
-\0\x55\0\x2b\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x7b\x1a\xe8\
-\xff\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x7b\x1a\xd8\xff\0\0\0\0\x7b\x1a\xd0\xff\0\
-\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\x7b\x1a\xc0\xff\0\0\0\0\x7b\x1a\xb8\xff\0\0\0\0\
-\x7b\x1a\xb0\xff\0\0\0\0\x7b\x1a\xa8\xff\0\0\0\0\x7b\x1a\xa0\xff\0\0\0\0\x63\
-\x7a\x70\xff\0\0\0\0\x61\xa2\xfc\xff\0\0\0\0\x63\x2a\x68\xff\0\0\0\0\x63\x1a\
-\x78\xff\0\0\0\0\x63\x1a\x74\xff\0\0\0\0\x63\x1a\x6c\xff\0\0\0\0\x63\x1a\x80\
-\xff\0\0\0\0\x63\x1a\x7c\xff\0\0\0\0\xb7\x01\0\0\x1c\0\0\0\x0f\x16\0\0\0\0\0\0\
-\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x74\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\xbf\x63\
-\0\0\0\0\0\0\x85\0\0\0\x73\0\0\0\x79\xa1\x68\xff\0\0\0\0\x7b\x1a\x88\xff\0\0\0\
-\0\x79\xa1\x70\xff\0\0\0\0\x7b\x1a\x90\xff\0\0\0\0\x79\xa1\x78\xff\0\0\0\0\x7b\
-\x1a\x98\xff\0\0\0\0\x61\xa1\x80\xff\0\0\0\0\x63\x1a\xa0\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x88\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x63\x0a\xfc\xff\
-\0\0\0\0\xbf\x01\0\0\0\0\0\0\x77\x01\0\0\x20\0\0\0\x63\x1a\xf8\xff\0\0\0\0\x67\
-\0\0\0\x20\0\0\0\x77\0\0\0\x20\0\0\0\x15\0\x33\0\0\0\0\0\x15\x01\x32\0\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x85\0\0\0\x03\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\
-\x06\x26\0\0\0\0\0\x61\x61\x04\0\0\0\0\0\x15\x01\x02\0\0\0\0\0\x07\x01\0\0\xff\
-\xff\xff\xff\x63\x16\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x05\0\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x85\0\0\0\x03\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\
-\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\x61\x61\x04\0\0\0\0\0\
-\x55\x01\x10\0\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xf8\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x05\0\
-\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xbf\x18\
-\0\0\0\0\0\0\x61\x81\x18\0\0\0\0\0\x63\x1a\xfc\xff\0\0\0\0\x61\x86\x38\0\0\0\0\
-\0\x63\x6a\xf8\xff\0\0\0\0\x85\0\0\0\x08\0\0\0\x63\x0a\xf4\xff\0\0\0\0\x85\0\0\
-\0\x05\0\0\0\x7b\x0a\x48\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x24\0\0\
-\0\0\0\xb7\x09\0\0\0\0\0\0\x7b\x9a\x98\xff\0\0\0\0\x7b\x9a\x90\xff\0\0\0\0\x7b\
-\x9a\x88\xff\0\0\0\0\x7b\x9a\x80\xff\0\0\0\0\x7b\x9a\x78\xff\0\0\0\0\x7b\x9a\
-\x70\xff\0\0\0\0\x7b\x9a\x68\xff\0\0\0\0\x7b\x9a\x60\xff\0\0\0\0\x7b\x9a\x58\
-\xff\0\0\0\0\x7b\x9a\x50\xff\0\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\xf4\xff\
-\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x50\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\xbf\x72\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\
-\x01\0\0\0\x65\xcd\x1d\x7b\x1a\xe0\xff\0\0\0\0\x7b\x9a\xc0\xff\0\0\0\0\x61\xa1\
-\xf4\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\x7b\x9a\xe8\xff\0\0\0\0\x7b\x9a\xd8\
-\xff\0\0\0\0\x7b\x9a\xd0\xff\0\0\0\0\x7b\x9a\xc8\xff\0\0\0\0\xbf\xa3\0\0\0\0\0\
-\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x72\0\0\
-\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
-\0\xf4\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\
-\x07\0\0\0\0\0\0\x18\x09\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x15\x07\x58\x02\0\
-\0\0\0\x7b\x7a\x40\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x15\x01\xcb\x01\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x30\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xb8\
-\xff\0\0\0\0\x7b\x1a\xb0\xff\0\0\0\0\x7b\x1a\xa8\xff\0\0\0\0\x7b\x1a\xa0\xff\0\
-\0\0\0\x7b\x1a\x98\xff\0\0\0\0\x7b\x1a\x90\xff\0\0\0\0\x7b\x1a\x88\xff\0\0\0\0\
-\x7b\x1a\x80\xff\0\0\0\0\x7b\x1a\x78\xff\0\0\0\0\x7b\x1a\x70\xff\0\0\0\0\x7b\
-\x1a\x68\xff\0\0\0\0\x61\xa2\xfc\xff\0\0\0\0\x63\x2a\xc0\xff\0\0\0\0\x61\xa2\
-\xf4\xff\0\0\0\0\x63\x2a\xc8\xff\0\0\0\0\x63\x1a\xc4\xff\0\0\0\0\x63\x1a\xd0\
-\xff\0\0\0\0\x63\x1a\xcc\xff\0\0\0\0\x63\x1a\xd8\xff\0\0\0\0\x63\x1a\xd4\xff\0\
-\0\0\0\xb7\x01\0\0\x08\0\0\0\xbf\x83\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\
-\0\0\0\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x73\0\0\
-\0\x79\xa1\x48\xff\0\0\0\0\x7b\x1a\xa0\xff\0\0\0\0\x7b\x1a\x88\xff\0\0\0\0\x79\
-\xa1\xc0\xff\0\0\0\0\x7b\x1a\x50\xff\0\0\0\0\x79\xa1\xc8\xff\0\0\0\0\x7b\x1a\
-\x58\xff\0\0\0\0\x79\xa1\xd0\xff\0\0\0\0\x7b\x1a\x60\xff\0\0\0\0\x61\xa1\xd8\
-\xff\0\0\0\0\x63\x1a\x68\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\
-\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x50\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x95\x01\0\0\0\0\
-\xbf\x09\0\0\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x19\0\0\0\0\0\0\x79\x93\x38\0\
-\0\0\0\0\x15\x03\x86\x01\0\0\0\0\x71\x94\x1c\0\0\0\0\0\xb7\x02\0\0\x20\0\0\0\
-\x15\x04\x01\0\0\0\0\0\xb7\x02\0\0\x28\0\0\0\x79\xa4\x48\xff\0\0\0\0\x1f\x34\0\
-\0\0\0\0\0\x0f\x20\0\0\0\0\0\0\x79\x03\0\0\0\0\0\0\x0f\x43\0\0\0\0\0\0\x7b\x30\
-\0\0\0\0\0\0\x0f\x27\0\0\0\0\0\0\x79\x72\0\0\0\0\0\0\x0f\x42\0\0\0\0\0\0\x7b\
-\x27\0\0\0\0\0\0\xbf\x47\0\0\0\0\0\0\x79\x96\x30\0\0\0\0\0\x0f\x76\0\0\0\0\0\0\
-\x7b\x69\x30\0\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x91\x50\
-\0\0\0\0\0\x55\x01\x02\0\0\0\0\0\x7b\x09\x50\0\0\0\0\0\x05\0\x60\x01\0\0\0\0\
-\xbf\x02\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\x71\x91\x1e\0\0\0\0\0\x55\x01\x1b\0\0\
-\0\0\0\x27\x06\0\0\x64\0\0\0\x37\x06\0\0\0\x65\xcd\x1d\x67\x06\0\0\x20\0\0\0\
-\x77\x06\0\0\x20\0\0\0\xb7\x03\0\0\x05\0\0\0\x2d\x63\x15\0\0\0\0\0\x25\x02\x14\
-\0\xff\x64\xcd\x1d\x7b\x0a\x38\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xc0\
-\xff\xff\xff\xb7\x06\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x23\0\
-\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xb7\x02\0\0\x70\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\x55\0\
-\x16\0\0\0\0\0\x18\x01\0\0\x6a\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1d\0\0\0\x85\
-\0\0\0\x06\0\0\0\x05\0\x48\x01\0\0\0\0\xb7\x03\0\0\x01\x65\xcd\x1d\x2d\x23\x46\
-\x01\0\0\0\0\x55\x01\x07\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xc0\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x06\0\0\0\0\0\0\x85\0\0\0\x03\0\0\
-\0\xbf\x60\0\0\0\0\0\0\x7b\x09\x50\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x19\x20\0\
-\0\0\0\0\x73\x19\x1e\0\0\0\0\0\x7b\x19\x28\0\0\0\0\0\x7b\x19\x30\0\0\0\0\0\x05\
-\0\x30\x01\0\0\0\0\x7b\x60\x68\0\0\0\0\0\x7b\x60\x60\0\0\0\0\0\x7b\x60\x58\0\0\
-\0\0\0\x7b\x60\x50\0\0\0\0\0\x7b\x60\x48\0\0\0\0\0\x7b\x60\x40\0\0\0\0\0\x7b\
-\x60\x38\0\0\0\0\0\x7b\x60\x30\0\0\0\0\0\x7b\x60\x28\0\0\0\0\0\x7b\x60\x20\0\0\
-\0\0\0\x7b\x60\x18\0\0\0\0\0\x7b\x60\x10\0\0\0\0\0\x7b\x60\x08\0\0\0\0\0\x7b\
-\x60\0\0\0\0\0\0\x79\x91\0\0\0\0\0\0\x7b\x10\0\0\0\0\0\0\x79\x91\x08\0\0\0\0\0\
-\x7b\x10\x08\0\0\0\0\0\x79\x91\x10\0\0\0\0\0\x7b\x10\x10\0\0\0\0\0\x61\x91\x18\
-\0\0\0\0\0\x63\x10\x18\0\0\0\0\0\x79\x91\x50\0\0\0\0\0\x79\xa6\x38\xff\0\0\0\0\
-\xbf\x62\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\x27\x02\0\0\x0a\0\0\0\x37\x02\0\0\0\
-\x65\xcd\x1d\x79\x91\x30\0\0\0\0\0\xbf\x13\0\0\0\0\0\0\x2f\x23\0\0\0\0\0\0\x27\
-\x03\0\0\x64\0\0\0\x37\x03\0\0\0\x65\xcd\x1d\x63\x30\x68\0\0\0\0\0\x79\x92\x28\
-\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x63\x20\x64\0\0\0\0\0\x79\x92\x20\0\0\0\0\0\x3f\
-\x12\0\0\0\0\0\0\x63\x20\x60\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\
-\x85\0\0\0\x84\0\0\0\xb7\x01\0\0\x01\0\0\0\x73\x19\x1e\0\0\0\0\0\x79\x91\x58\0\
-\0\0\0\0\x15\x01\x04\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\xb7\x01\
-\0\0\x01\xf2\x05\x2a\x2d\x21\xfd\0\0\0\0\0\x61\xa6\xc0\xff\0\0\0\0\x63\x6a\x50\
-\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\x15\x06\xf7\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\x50\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
-\0\x15\0\xf1\0\0\0\0\0\x7b\x0a\x30\xff\0\0\0\0\xb7\x06\0\0\0\0\0\0\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x60\x01\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\
-\x83\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\x87\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\
-\0\x20\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\xe4\0\0\0\0\0\x7b\x60\x58\x01\0\0\0\0\
-\x7b\x60\x50\x01\0\0\0\0\x7b\x60\x48\x01\0\0\0\0\x7b\x60\x40\x01\0\0\0\0\x7b\
-\x60\x38\x01\0\0\0\0\x7b\x60\x30\x01\0\0\0\0\x7b\x60\x28\x01\0\0\0\0\x7b\x60\
-\x20\x01\0\0\0\0\x7b\x60\x18\x01\0\0\0\0\x7b\x60\x10\x01\0\0\0\0\x7b\x60\x08\
-\x01\0\0\0\0\x7b\x60\0\x01\0\0\0\0\x7b\x60\xf8\0\0\0\0\0\x7b\x60\xf0\0\0\0\0\0\
-\x7b\x60\xe8\0\0\0\0\0\x7b\x60\xe0\0\0\0\0\0\x7b\x60\xd8\0\0\0\0\0\x7b\x60\xd0\
-\0\0\0\0\0\x7b\x60\xc8\0\0\0\0\0\x7b\x60\xc0\0\0\0\0\0\x7b\x60\xb8\0\0\0\0\0\
-\x7b\x60\xb0\0\0\0\0\0\x7b\x60\xa8\0\0\0\0\0\x7b\x60\xa0\0\0\0\0\0\x7b\x60\x98\
-\0\0\0\0\0\x7b\x60\x90\0\0\0\0\0\x7b\x60\x88\0\0\0\0\0\x7b\x60\x80\0\0\0\0\0\
-\x7b\x60\x78\0\0\0\0\0\x7b\x60\x70\0\0\0\0\0\x7b\x60\x68\0\0\0\0\0\x7b\x60\x60\
-\0\0\0\0\0\x7b\x60\x58\0\0\0\0\0\x7b\x60\x50\0\0\0\0\0\x7b\x60\x48\0\0\0\0\0\
-\x7b\x60\x40\0\0\0\0\0\x7b\x60\x38\0\0\0\0\0\x7b\x60\x30\0\0\0\0\0\x7b\x60\x28\
-\0\0\0\0\0\x7b\x60\x20\0\0\0\0\0\x7b\x60\x18\0\0\0\0\0\x7b\x60\x10\0\0\0\0\0\
-\x7b\x60\x08\0\0\0\0\0\x7b\x60\0\0\0\0\0\0\x61\xa1\x50\xff\0\0\0\0\x63\x10\0\0\
-\0\0\0\0\xbf\x01\0\0\0\0\0\0\x07\x01\0\0\x04\0\0\0\x79\xa3\x30\xff\0\0\0\0\x07\
-\x03\0\0\x04\0\0\0\xb7\x02\0\0\x10\0\0\0\x7b\x0a\x28\xff\0\0\0\0\x85\0\0\0\x2d\
-\0\0\0\x79\xa1\x28\xff\0\0\0\0\x79\xa5\x30\xff\0\0\0\0\x61\x52\x14\0\0\0\0\0\
-\x63\x21\x14\0\0\0\0\0\x61\x52\x18\0\0\0\0\0\x63\x21\x18\0\0\0\0\0\x61\x54\x14\
-\0\0\0\0\0\xbf\x42\0\0\0\0\0\0\x67\x02\0\0\x20\0\0\0\xbf\x23\0\0\0\0\0\0\xc7\
-\x03\0\0\x20\0\0\0\x6d\x36\x4d\0\0\0\0\0\x79\x53\x20\0\0\0\0\0\x7b\x31\x20\0\0\
-\0\0\0\x77\x02\0\0\x20\0\0\0\x15\x02\x49\0\0\0\0\0\x79\x52\x28\0\0\0\0\0\x7b\
-\x21\x28\0\0\0\0\0\xbf\x42\0\0\0\0\0\0\x15\x02\x45\0\x01\0\0\0\x79\x53\x30\0\0\
-\0\0\0\x7b\x31\x30\0\0\0\0\0\x15\x02\x42\0\x02\0\0\0\x79\x52\x38\0\0\0\0\0\x7b\
-\x21\x38\0\0\0\0\0\xbf\x42\0\0\0\0\0\0\xb7\x03\0\0\x04\0\0\0\x2d\x23\x3d\0\0\0\
-\0\0\x79\x53\x40\0\0\0\0\0\x7b\x31\x40\0\0\0\0\0\x15\x02\x3a\0\x04\0\0\0\x79\
-\x52\x48\0\0\0\0\0\x7b\x21\x48\0\0\0\0\0\xbf\x42\0\0\0\0\0\0\xb7\x03\0\0\x06\0\
-\0\0\x2d\x23\x35\0\0\0\0\0\x79\x53\x50\0\0\0\0\0\x7b\x31\x50\0\0\0\0\0\x15\x02\
-\x32\0\x06\0\0\0\x79\x52\x58\0\0\0\0\0\x7b\x21\x58\0\0\0\0\0\xbf\x42\0\0\0\0\0\
-\0\xb7\x03\0\0\x08\0\0\0\x2d\x23\x2d\0\0\0\0\0\x79\x53\x60\0\0\0\0\0\x7b\x31\
-\x60\0\0\0\0\0\x15\x02\x2a\0\x08\0\0\0\x79\x52\x68\0\0\0\0\0\x7b\x21\x68\0\0\0\
-\0\0\xbf\x42\0\0\0\0\0\0\xb7\x03\0\0\x0a\0\0\0\x2d\x23\x25\0\0\0\0\0\x79\x53\
-\x70\0\0\0\0\0\x7b\x31\x70\0\0\0\0\0\x15\x02\x22\0\x0a\0\0\0\x79\x52\x78\0\0\0\
-\0\0\x7b\x21\x78\0\0\0\0\0\xbf\x42\0\0\0\0\0\0\xb7\x03\0\0\x0c\0\0\0\x2d\x23\
-\x1d\0\0\0\0\0\x79\x53\x80\0\0\0\0\0\x7b\x31\x80\0\0\0\0\0\x15\x02\x1a\0\x0c\0\
-\0\0\x79\x52\x88\0\0\0\0\0\x7b\x21\x88\0\0\0\0\0\xbf\x42\0\0\0\0\0\0\xb7\x03\0\
-\0\x0e\0\0\0\x2d\x23\x15\0\0\0\0\0\x79\x53\x90\0\0\0\0\0\x7b\x31\x90\0\0\0\0\0\
-\x15\x02\x12\0\x0e\0\0\0\x79\x52\x98\0\0\0\0\0\x7b\x21\x98\0\0\0\0\0\xbf\x42\0\
-\0\0\0\0\0\xb7\x03\0\0\x10\0\0\0\x2d\x23\x0d\0\0\0\0\0\x79\x53\xa0\0\0\0\0\0\
-\x7b\x31\xa0\0\0\0\0\0\x15\x02\x0a\0\x10\0\0\0\x79\x52\xa8\0\0\0\0\0\x7b\x21\
-\xa8\0\0\0\0\0\xbf\x43\0\0\0\0\0\0\xb7\x02\0\0\x12\0\0\0\x2d\x32\x05\0\0\0\0\0\
-\x79\x52\xb0\0\0\0\0\0\x7b\x21\xb0\0\0\0\0\0\x15\x03\x02\0\x12\0\0\0\x79\x52\
-\xb8\0\0\0\0\0\x7b\x21\xb8\0\0\0\0\0\x61\x50\x18\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\
-\x67\x02\0\0\x20\0\0\0\xbf\x23\0\0\0\0\0\0\xc7\x03\0\0\x20\0\0\0\xb7\x04\0\0\0\
-\0\0\0\x6d\x34\x4d\0\0\0\0\0\x79\x53\xc0\0\0\0\0\0\x7b\x31\xc0\0\0\0\0\0\x77\
-\x02\0\0\x20\0\0\0\x15\x02\x49\0\0\0\0\0\x79\x52\xc8\0\0\0\0\0\x7b\x21\xc8\0\0\
-\0\0\0\xbf\x02\0\0\0\0\0\0\x15\x02\x45\0\x01\0\0\0\x79\x53\xd0\0\0\0\0\0\x7b\
-\x31\xd0\0\0\0\0\0\x15\x02\x42\0\x02\0\0\0\x79\x52\xd8\0\0\0\0\0\x7b\x21\xd8\0\
-\0\0\0\0\xbf\x02\0\0\0\0\0\0\xb7\x03\0\0\x04\0\0\0\x2d\x23\x3d\0\0\0\0\0\x79\
-\x53\xe0\0\0\0\0\0\x7b\x31\xe0\0\0\0\0\0\x15\x02\x3a\0\x04\0\0\0\x79\x52\xe8\0\
-\0\0\0\0\x7b\x21\xe8\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\xb7\x03\0\0\x06\0\0\0\x2d\
-\x23\x35\0\0\0\0\0\x79\x53\xf0\0\0\0\0\0\x7b\x31\xf0\0\0\0\0\0\x15\x02\x32\0\
-\x06\0\0\0\x79\x52\xf8\0\0\0\0\0\x7b\x21\xf8\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\xb7\
-\x03\0\0\x08\0\0\0\x2d\x23\x2d\0\0\0\0\0\x79\x53\0\x01\0\0\0\0\x7b\x31\0\x01\0\
-\0\0\0\x15\x02\x2a\0\x08\0\0\0\x79\x52\x08\x01\0\0\0\0\x7b\x21\x08\x01\0\0\0\0\
-\xbf\x02\0\0\0\0\0\0\xb7\x03\0\0\x0a\0\0\0\x2d\x23\x25\0\0\0\0\0\x79\x53\x10\
-\x01\0\0\0\0\x7b\x31\x10\x01\0\0\0\0\x15\x02\x22\0\x0a\0\0\0\x79\x52\x18\x01\0\
-\0\0\0\x7b\x21\x18\x01\0\0\0\0\xbf\x02\0\0\0\0\0\0\xb7\x03\0\0\x0c\0\0\0\x2d\
-\x23\x1d\0\0\0\0\0\x79\x53\x20\x01\0\0\0\0\x7b\x31\x20\x01\0\0\0\0\x15\x02\x1a\
-\0\x0c\0\0\0\x79\x52\x28\x01\0\0\0\0\x7b\x21\x28\x01\0\0\0\0\xbf\x02\0\0\0\0\0\
-\0\xb7\x03\0\0\x0e\0\0\0\x2d\x23\x15\0\0\0\0\0\x79\x53\x30\x01\0\0\0\0\x7b\x31\
-\x30\x01\0\0\0\0\x15\x02\x12\0\x0e\0\0\0\x79\x52\x38\x01\0\0\0\0\x7b\x21\x38\
-\x01\0\0\0\0\xbf\x02\0\0\0\0\0\0\xb7\x03\0\0\x10\0\0\0\x2d\x23\x0d\0\0\0\0\0\
-\x79\x53\x40\x01\0\0\0\0\x7b\x31\x40\x01\0\0\0\0\x15\x02\x0a\0\x10\0\0\0\x79\
-\x52\x48\x01\0\0\0\0\x7b\x21\x48\x01\0\0\0\0\xbf\x03\0\0\0\0\0\0\xb7\x02\0\0\
-\x12\0\0\0\x2d\x32\x05\0\0\0\0\0\x79\x52\x50\x01\0\0\0\0\x7b\x21\x50\x01\0\0\0\
-\0\x15\x03\x02\0\x12\0\0\0\x79\x52\x58\x01\0\0\0\0\x7b\x21\x58\x01\0\0\0\0\xb7\
-\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x79\xa1\x38\xff\0\0\0\0\x7b\x19\x58\0\0\0\
-\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\xbf\x93\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x61\x91\
-\x04\0\0\0\0\0\x15\x01\x05\0\0\0\0\0\x79\xa2\x40\xff\0\0\0\0\x79\x24\x18\0\0\0\
-\0\0\xbf\x72\0\0\0\0\0\0\xb7\x03\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x79\
-\xa1\x48\xff\0\0\0\0\x7b\x19\x38\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x93\0\0\0\0\0\0\xb7\x04\0\
-\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x61\xa6\xf8\xff\0\0\0\0\x67\x06\0\0\x20\0\0\0\
-\x77\x06\0\0\x20\0\0\0\x79\xa7\x40\xff\0\0\0\0\x15\x06\x7e\0\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\xbf\x09\0\0\0\0\0\0\x55\x09\x2e\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\
-\x7b\x1a\xb8\xff\0\0\0\0\x7b\x1a\xb0\xff\0\0\0\0\x7b\x1a\xa8\xff\0\0\0\0\x7b\
-\x1a\xa0\xff\0\0\0\0\x7b\x1a\x98\xff\0\0\0\0\x7b\x1a\x90\xff\0\0\0\0\x7b\x1a\
-\x88\xff\0\0\0\0\x7b\x1a\x80\xff\0\0\0\0\x7b\x1a\x78\xff\0\0\0\0\x7b\x1a\x70\
-\xff\0\0\0\0\x7b\x1a\x68\xff\0\0\0\0\x61\xa2\xf8\xff\0\0\0\0\x63\x2a\xc0\xff\0\
-\0\0\0\x61\xa2\xf4\xff\0\0\0\0\x63\x2a\xc8\xff\0\0\0\0\x63\x1a\xc4\xff\0\0\0\0\
-\x63\x1a\xd0\xff\0\0\0\0\x63\x1a\xcc\xff\0\0\0\0\x63\x1a\xd8\xff\0\0\0\0\x63\
-\x1a\xd4\xff\0\0\0\0\xb7\x01\0\0\x28\0\0\0\x0f\x18\0\0\0\0\0\0\xbf\xa1\0\0\0\0\
-\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\xbf\x83\0\0\0\0\0\0\x85\
-\0\0\0\x73\0\0\0\x79\xa1\x48\xff\0\0\0\0\x7b\x1a\xa0\xff\0\0\0\0\x7b\x1a\x88\
-\xff\0\0\0\0\x79\xa1\xc0\xff\0\0\0\0\x7b\x1a\x50\xff\0\0\0\0\x79\xa1\xc8\xff\0\
-\0\0\0\x7b\x1a\x58\xff\0\0\0\0\x79\xa1\xd0\xff\0\0\0\0\x7b\x1a\x60\xff\0\0\0\0\
-\x61\xa1\xd8\xff\0\0\0\0\x63\x1a\x68\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
-\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x50\xff\xff\xff\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x47\0\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x19\0\
-\0\0\0\0\0\x79\x92\x40\0\0\0\0\0\x79\xa1\x48\xff\0\0\0\0\x1f\x21\0\0\0\0\0\0\
-\x7b\x19\x48\0\0\0\0\0\x25\x01\x02\0\xe7\x03\0\0\xb7\x01\0\0\0\0\0\0\x05\0\x13\
-\0\0\0\0\0\x25\x01\x02\0\x87\x13\0\0\xb7\x01\0\0\x01\0\0\0\x05\0\x10\0\0\0\0\0\
-\x25\x01\x02\0\x67\x42\0\0\xb7\x01\0\0\x02\0\0\0\x05\0\x0d\0\0\0\0\0\x25\x01\
-\x02\0\xe7\xfd\0\0\xb7\x01\0\0\x03\0\0\0\x05\0\x0a\0\0\0\0\0\x25\x01\x02\0\xe7\
-\xeb\x03\0\xb7\x01\0\0\x04\0\0\0\x05\0\x07\0\0\0\0\0\x25\x01\x02\0\x3f\x42\x0f\
-\0\xb7\x01\0\0\x05\0\0\0\x05\0\x04\0\0\0\0\0\x25\x01\x02\0\xff\x08\x3d\0\xb7\
-\x01\0\0\x06\0\0\0\x05\0\x01\0\0\0\0\0\xb7\x01\0\0\x07\0\0\0\x63\x1a\x50\xff\0\
-\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\x50\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x07\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\x50\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x03\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x05\0\x08\0\0\0\0\0\x61\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\
-\0\x63\x10\0\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\x50\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x03\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\x79\x74\x18\0\0\0\0\0\x79\x91\x38\0\0\0\0\0\x3d\x41\x09\0\0\0\0\0\
-\xb7\x01\0\0\0\0\0\0\x7b\x19\x30\0\0\0\0\0\x7b\x19\x28\0\0\0\0\0\x7b\x19\x20\0\
-\0\0\0\0\x61\x91\x04\0\0\0\0\0\x15\x01\x03\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\xb7\
-\x03\0\0\x01\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x79\xa1\x48\xff\0\0\0\0\x7b\x19\
-\x38\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\xbf\x93\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xb7\x09\0\0\0\0\0\0\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\xbf\x90\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xbf\x16\0\0\0\0\0\0\x61\x61\
-\x18\0\0\0\0\0\x63\x1a\xfc\xff\0\0\0\0\x15\x01\x69\0\0\0\0\0\xbf\xa2\0\0\0\0\0\
-\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
-\x01\0\0\0\x15\0\x63\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xb7\x03\0\0\0\x04\0\0\x85\0\0\0\x1b\0\0\0\xbf\x07\0\0\0\0\0\0\xbf\x71\
-\0\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\xc7\x01\0\0\x20\0\0\0\x65\x01\x06\0\xff\xff\
-\xff\xff\x18\x01\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x22\0\0\0\xbf\x73\0\
-\0\0\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x53\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\
-\x55\0\x1a\0\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\x98\xfe\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\x15\0\x06\0\0\0\0\0\x07\0\0\0\x0c\0\0\0\xbf\xa1\0\0\0\0\0\0\
-\x07\x01\0\0\x9c\xfe\xff\xff\xb7\x02\0\0\x10\0\0\0\xbf\x03\0\0\0\0\0\0\x85\0\0\
-\0\x73\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\xb0\xfe\0\0\0\0\x63\x1a\xac\xfe\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\
-\0\0\x98\xfe\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\
-\x85\0\0\0\x02\0\0\0\x05\0\x05\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\xbf\x08\0\0\0\0\0\0\x55\x08\x05\0\0\0\0\0\x18\x01\0\0\x2a\0\0\
-\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1e\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x22\0\0\0\0\
-\0\x63\x78\x14\0\0\0\0\0\x67\x07\0\0\x20\0\0\0\x15\x07\x06\0\0\0\0\0\xbf\x81\0\
-\0\0\0\0\0\x07\x01\0\0\x20\0\0\0\xc7\x07\0\0\x1d\0\0\0\xb7\x02\0\0\xa0\0\0\0\
-\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\0\x05\0\0\x85\0\0\0\x1b\0\0\0\xbf\x03\0\0\0\0\0\
-\0\x67\x03\0\0\x20\0\0\0\xbf\x31\0\0\0\0\0\0\xc7\x01\0\0\x20\0\0\0\xb7\x02\0\0\
-\0\0\0\0\x6d\x12\x07\0\0\0\0\0\x63\x08\x18\0\0\0\0\0\x15\x03\x05\0\0\0\0\0\xbf\
-\x81\0\0\0\0\0\0\x07\x01\0\0\xc0\0\0\0\xc7\x03\0\0\x1d\0\0\0\xb7\x02\0\0\xa0\0\
-\0\0\x85\0\0\0\x71\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x83\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\
-\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x61\x12\x0c\0\0\0\0\0\x63\
-\x2a\xfc\xff\0\0\0\0\x61\x17\x08\0\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x06\0\0\0\0\
-\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x23\0\0\0\0\0\xb7\x07\0\0\0\0\0\0\x7b\x7a\
-\xf0\xff\0\0\0\0\x7b\x7a\xe8\xff\0\0\0\0\x7b\x7a\xe0\xff\0\0\0\0\x7b\x7a\xd8\
-\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\0\0\0\x7b\x7a\xc0\xff\0\
-\0\0\0\x7b\x7a\xb8\xff\0\0\0\0\x7b\x7a\xb0\xff\0\0\0\0\x7b\x7a\xa8\xff\0\0\0\0\
-\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\
-\0\xa8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\xb7\
-\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\0\x65\xcd\x1d\x7b\x1a\x98\xff\
-\0\0\0\0\x7b\x7a\x78\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\x78\xff\0\0\0\
-\0\x7b\x7a\xa0\xff\0\0\0\0\x7b\x7a\x90\xff\0\0\0\0\x7b\x7a\x88\xff\0\0\0\0\x7b\
-\x7a\x80\xff\0\0\0\0\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x78\xff\xff\xff\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x05\0\x11\0\0\0\0\0\xbf\x71\0\0\
-\0\0\0\0\x18\x02\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5d\x21\x07\0\0\0\0\0\x79\
-\x01\0\0\0\0\0\0\x15\x01\x0d\0\0\0\0\0\x1f\x16\0\0\0\0\0\0\x79\x01\x30\0\0\0\0\
-\0\x0f\x16\0\0\0\0\0\0\x7b\x60\x30\0\0\0\0\0\x05\0\x01\0\0\0\0\0\x7b\x60\0\0\0\
-\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xbf\x03\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\
-\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x23\0\0\0\xbf\x06\0\0\0\0\0\0\xb7\x01\
-\0\0\x78\x05\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\
-\x07\x01\0\0\x68\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x61\xa7\
-\x68\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\xb7\x01\0\0\x7c\x05\0\0\xbf\x63\0\0\0\
-\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x68\xff\xff\xff\xb7\
-\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x15\x07\x78\0\0\0\0\0\x61\xa8\x68\xff\0\
-\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x41\0\0\0\0\0\x85\
-\0\0\0\x08\0\0\0\xbf\x07\0\0\0\0\0\0\xb7\x01\0\0\x78\x05\0\0\xbf\x63\0\0\0\0\0\
-\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xd8\xff\xff\xff\xb7\x02\
-\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x7c\x05\0\0\xbf\x63\0\0\0\0\0\0\
-\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x68\xff\xff\xff\xb7\x02\0\
-\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x63\x7a\xe0\xff\0\0\0\0\x61\xa1\x68\xff\0\0\0\
-\0\x63\x1a\xdc\xff\0\0\0\0\xb7\x01\0\0\x88\x07\0\0\x0f\x16\0\0\0\0\0\0\xb7\x08\
-\0\0\0\0\0\0\x63\x8a\xe8\xff\0\0\0\0\x63\x8a\xe4\xff\0\0\0\0\x63\x8a\xf0\xff\0\
-\0\0\0\x63\x8a\xec\xff\0\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\x68\xff\xff\xff\
-\xbf\x71\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\xbf\x63\0\0\0\0\0\0\x85\0\0\0\x71\0\
-\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xe4\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\xbf\
-\x73\0\0\0\0\0\0\x85\0\0\0\x73\0\0\0\x61\xa1\xf0\xff\0\0\0\0\x63\x1a\x80\xff\0\
-\0\0\0\x79\xa1\xe8\xff\0\0\0\0\x7b\x1a\x78\xff\0\0\0\0\x79\xa1\xe0\xff\0\0\0\0\
-\x7b\x1a\x70\xff\0\0\0\0\x79\xa1\xd8\xff\0\0\0\0\x7b\x1a\x68\xff\0\0\0\0\xb7\
-\x01\0\0\x01\0\0\0\x6b\x1a\x84\xff\0\0\0\0\x7b\x8a\x88\xff\0\0\0\0\x73\x8a\x86\
-\xff\0\0\0\0\x7b\x8a\x90\xff\0\0\0\0\x7b\x8a\x98\xff\0\0\0\0\x7b\x8a\xa0\xff\0\
-\0\0\0\x7b\x8a\xa8\xff\0\0\0\0\x7b\x8a\xb0\xff\0\0\0\0\x7b\x8a\xb8\xff\0\0\0\0\
-\x7b\x8a\xc0\xff\0\0\0\0\x7b\x8a\xc8\xff\0\0\0\0\x63\x8a\xd0\xff\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\
-\x68\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x2d\0\0\0\0\0\x61\
-\x71\x04\0\0\0\0\0\x55\x01\x24\0\0\0\0\0\x63\x87\x04\0\0\0\0\0\x61\xa6\xf8\xff\
-\0\0\0\0\x63\x8a\xfc\xff\0\0\0\0\xbf\x81\0\0\0\0\0\0\x15\x01\x1f\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x85\0\0\0\x01\0\0\0\x55\0\x0f\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x02\0\0\x01\
-\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x1d\x31\x01\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x63\
-\x1a\xd8\xff\0\0\0\0\x63\x2a\x6c\xff\0\0\0\0\x63\x1a\x68\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xd8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x68\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x08\0\0\0\0\0\x61\x01\x04\0\
-\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x10\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x03\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\x01\0\0\0\x73\x17\x1c\0\
-\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\
-\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x23\0\0\0\xbf\x06\0\0\0\0\0\0\xb7\
-\x01\0\0\x78\x05\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\
-\0\x07\x01\0\0\x68\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x61\
-\xa7\x68\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\xb7\x01\0\0\x7c\x05\0\0\xbf\x63\0\
-\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x68\xff\xff\xff\
-\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x15\x07\x77\0\0\0\0\0\x61\xa8\x68\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x40\0\0\0\0\
-\0\x85\0\0\0\x08\0\0\0\xbf\x07\0\0\0\0\0\0\xb7\x01\0\0\x78\x05\0\0\xbf\x63\0\0\
-\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xd8\xff\xff\xff\
-\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x7c\x05\0\0\xbf\x63\0\0\
-\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x68\xff\xff\xff\
-\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x63\x7a\xe0\xff\0\0\0\0\x61\xa1\x68\
-\xff\0\0\0\0\x63\x1a\xdc\xff\0\0\0\0\xb7\x01\0\0\x88\x07\0\0\x0f\x16\0\0\0\0\0\
-\0\xb7\x08\0\0\0\0\0\0\x63\x8a\xe8\xff\0\0\0\0\x63\x8a\xe4\xff\0\0\0\0\x63\x8a\
-\xf0\xff\0\0\0\0\x63\x8a\xec\xff\0\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\x68\
-\xff\xff\xff\xbf\x71\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\xbf\x63\0\0\0\0\0\0\x85\
-\0\0\0\x71\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xe4\xff\xff\xff\xb7\x02\0\0\
-\x10\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x73\0\0\0\x61\xa1\xf0\xff\0\0\0\0\x63\
-\x1a\x80\xff\0\0\0\0\x79\xa1\xe8\xff\0\0\0\0\x7b\x1a\x78\xff\0\0\0\0\x79\xa1\
-\xe0\xff\0\0\0\0\x7b\x1a\x70\xff\0\0\0\0\x79\xa1\xd8\xff\0\0\0\0\x7b\x1a\x68\
-\xff\0\0\0\0\x7b\x8a\x88\xff\0\0\0\0\x73\x8a\x86\xff\0\0\0\0\x6b\x8a\x84\xff\0\
-\0\0\0\x7b\x8a\x90\xff\0\0\0\0\x7b\x8a\x98\xff\0\0\0\0\x7b\x8a\xa0\xff\0\0\0\0\
-\x7b\x8a\xa8\xff\0\0\0\0\x7b\x8a\xb0\xff\0\0\0\0\x7b\x8a\xb8\xff\0\0\0\0\x7b\
-\x8a\xc0\xff\0\0\0\0\x7b\x8a\xc8\xff\0\0\0\0\x63\x8a\xd0\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x68\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x2d\0\0\0\0\0\x61\x71\x04\0\
-\0\0\0\0\x55\x01\x24\0\0\0\0\0\x63\x87\x04\0\0\0\0\0\x61\xa6\xf8\xff\0\0\0\0\
-\x63\x8a\xfc\xff\0\0\0\0\xbf\x81\0\0\0\0\0\0\x15\x01\x1f\0\0\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\
-\0\0\x01\0\0\0\x55\0\x0f\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x02\0\0\x01\0\0\0\
-\x61\xa1\xfc\xff\0\0\0\0\x1d\x31\x01\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x63\x1a\
-\xd8\xff\0\0\0\0\x63\x2a\x6c\xff\0\0\0\0\x63\x1a\x68\xff\0\0\0\0\xbf\xa2\0\0\0\
-\0\0\0\x07\x02\0\0\xd8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x68\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x08\0\0\0\0\0\x61\x01\x04\0\0\0\
-\0\0\x07\x01\0\0\x01\0\0\0\x63\x10\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
-\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x03\0\0\0\0\0\0\xb7\
-\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\0\0\0\0\x73\x17\x1c\0\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\
-\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x08\0\0\0\x63\x0a\x74\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x33\0\0\0\0\0\x61\xa1\x74\xff\0\0\
-\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\
-\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x24\0\0\0\0\0\
-\xb7\x07\0\0\0\0\0\0\x7b\x7a\xf0\xff\0\0\0\0\x7b\x7a\xe8\xff\0\0\0\0\x7b\x7a\
-\xe0\xff\0\0\0\0\x7b\x7a\xd8\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\
-\xff\0\0\0\0\x7b\x7a\xc0\xff\0\0\0\0\x7b\x7a\xb8\xff\0\0\0\0\x7b\x7a\xb0\xff\0\
-\0\0\0\x7b\x7a\xa8\xff\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xfc\xff\xff\xff\
-\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xa8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xbf\x62\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\
-\0\x65\xcd\x1d\x7b\x1a\x98\xff\0\0\0\0\x7b\x7a\x78\xff\0\0\0\0\x61\xa1\xfc\xff\
-\0\0\0\0\x63\x1a\x78\xff\0\0\0\0\x7b\x7a\xa0\xff\0\0\0\0\x7b\x7a\x90\xff\0\0\0\
-\0\x7b\x7a\x88\xff\0\0\0\0\x7b\x7a\x80\xff\0\0\0\0\xbf\xa3\0\0\0\0\0\0\x07\x03\
-\0\0\x78\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\
-\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\x74\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\
-\0\0\0\0\0\x15\x06\x09\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\x06\x08\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xbf\x63\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\
-\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x08\0\0\0\x63\x0a\x74\xff\0\0\0\0\xbf\xa2\0\0\0\
-\0\0\0\x07\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\
-\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x2b\0\0\0\0\0\x61\xa1\x74\xff\0\0\0\0\
-\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x30\0\0\0\0\0\xb7\
-\x07\0\0\0\0\0\0\x7b\x7a\xf0\xff\0\0\0\0\x7b\x7a\xe8\xff\0\0\0\0\x7b\x7a\xe0\
-\xff\0\0\0\0\x7b\x7a\xd8\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\
-\0\0\0\x7b\x7a\xc0\xff\0\0\0\0\x7b\x7a\xb8\xff\0\0\0\0\x7b\x7a\xb0\xff\0\0\0\0\
-\x7b\x7a\xa8\xff\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xfc\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xa8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xbf\x62\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\0\
-\x65\xcd\x1d\x7b\x1a\x98\xff\0\0\0\0\x7b\x7a\x78\xff\0\0\0\0\x61\xa1\xfc\xff\0\
-\0\0\0\x63\x1a\x78\xff\0\0\0\0\x7b\x7a\xa0\xff\0\0\0\0\x7b\x7a\x90\xff\0\0\0\0\
-\x7b\x7a\x88\xff\0\0\0\0\x7b\x7a\x80\xff\0\0\0\0\xbf\xa3\0\0\0\0\0\0\x07\x03\0\
-\0\x78\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x05\
-\0\x0b\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\x08\0\0\0\0\0\x1f\x10\0\0\0\0\0\0\
-\x79\x61\x48\0\0\0\0\0\x0f\x10\0\0\0\0\0\0\x7b\x06\x48\0\0\0\0\0\xbf\xa2\0\0\0\
-\0\0\0\x07\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x63\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\
-\0\0\0\0\0\x85\0\0\0\x08\0\0\0\x63\x0a\x74\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
-\0\xbf\x06\0\0\0\0\0\0\x55\x06\x33\0\0\0\0\0\x61\xa1\x74\xff\0\0\0\0\x63\x1a\
-\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x24\0\0\0\0\0\xb7\x07\0\0\0\0\
-\0\0\x7b\x7a\xf0\xff\0\0\0\0\x7b\x7a\xe8\xff\0\0\0\0\x7b\x7a\xe0\xff\0\0\0\0\
-\x7b\x7a\xd8\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\0\0\0\x7b\
-\x7a\xc0\xff\0\0\0\0\x7b\x7a\xb8\xff\0\0\0\0\x7b\x7a\xb0\xff\0\0\0\0\x7b\x7a\
-\xa8\xff\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\
-\0\0\0\x07\x03\0\0\xa8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\0\x65\xcd\x1d\
-\x7b\x1a\x98\xff\0\0\0\0\x7b\x7a\x78\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\
-\x1a\x78\xff\0\0\0\0\x7b\x7a\xa0\xff\0\0\0\0\x7b\x7a\x90\xff\0\0\0\0\x7b\x7a\
-\x88\xff\0\0\0\0\x7b\x7a\x80\xff\0\0\0\0\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x78\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\xb7\x04\0\
-\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\x74\xff\xff\xff\
-\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\
-\x15\x06\x09\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\x06\x10\0\0\0\0\0\xbf\xa2\0\0\0\
-\0\0\0\x07\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x63\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\
-\0\0\0\0\0\x85\0\0\0\x08\0\0\0\x63\x0a\x74\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
-\0\xbf\x06\0\0\0\0\0\0\x55\x06\x2b\0\0\0\0\0\x61\xa1\x74\xff\0\0\0\0\x63\x1a\
-\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x30\0\0\0\0\0\xb7\x07\0\0\0\0\
-\0\0\x7b\x7a\xf0\xff\0\0\0\0\x7b\x7a\xe8\xff\0\0\0\0\x7b\x7a\xe0\xff\0\0\0\0\
-\x7b\x7a\xd8\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\0\0\0\x7b\
-\x7a\xc0\xff\0\0\0\0\x7b\x7a\xb8\xff\0\0\0\0\x7b\x7a\xb0\xff\0\0\0\0\x7b\x7a\
-\xa8\xff\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\
-\0\0\0\x07\x03\0\0\xa8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\0\x65\xcd\x1d\
-\x7b\x1a\x98\xff\0\0\0\0\x7b\x7a\x78\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\
-\x1a\x78\xff\0\0\0\0\x7b\x7a\xa0\xff\0\0\0\0\x7b\x7a\x90\xff\0\0\0\0\x7b\x7a\
-\x88\xff\0\0\0\0\x7b\x7a\x80\xff\0\0\0\0\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\x78\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x05\0\x0b\
-\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\x10\0\0\0\0\0\x1f\x10\0\0\0\0\0\0\x79\
-\x61\x40\0\0\0\0\0\x0f\x10\0\0\0\0\0\0\x7b\x06\x40\0\0\0\0\0\xbf\xa2\0\0\0\0\0\
-\0\x07\x02\0\0\x74\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x63\0\0\
-\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\
-\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x71\x11\0\0\0\0\0\0\x55\x01\x0e\0\0\
-\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x85\0\0\0\x01\0\0\0\x15\0\x0d\0\0\0\0\0\x61\x01\0\0\0\0\0\0\x18\x02\0\0\x04\0\
-\0\0\0\0\0\0\0\0\0\0\x63\x12\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xb7\x02\0\0\x01\0\0\0\x73\x21\0\0\0\0\0\0\xb7\x09\0\0\0\0\0\0\x85\0\0\0\x05\0\
-\0\0\x7b\x0a\xb8\xff\0\0\0\0\xb7\x06\0\0\0\0\0\0\x05\0\x6d\0\0\0\0\0\x18\x01\0\
-\0\x48\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x14\0\0\0\x85\0\0\0\x06\0\0\0\x18\0\0\
-\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x74\x20\0\0\0\0\0\x27\
-\x04\0\0\x28\0\0\0\x37\x04\0\0\0\x65\xcd\x1d\x27\x03\0\0\x3c\0\0\0\x67\x03\0\0\
-\x20\0\0\0\x77\x03\0\0\x20\0\0\0\x37\x03\0\0\x64\0\0\0\x0f\x43\0\0\0\0\0\0\x63\
-\x38\x04\0\0\0\0\0\x27\x02\0\0\x3c\0\0\0\x67\x02\0\0\x20\0\0\0\x77\x02\0\0\x20\
-\0\0\0\x37\x02\0\0\x64\0\0\0\x79\x73\x28\0\0\0\0\0\x27\x03\0\0\x28\0\0\0\x37\
-\x03\0\0\0\x65\xcd\x1d\x0f\x32\0\0\0\0\0\0\x63\x28\x08\0\0\0\0\0\x27\x01\0\0\
-\x3c\0\0\0\x67\x01\0\0\x20\0\0\0\x77\x01\0\0\x20\0\0\0\x37\x01\0\0\x64\0\0\0\
-\x79\x72\x30\0\0\0\0\0\x27\x02\0\0\x28\0\0\0\x37\x02\0\0\0\x65\xcd\x1d\x0f\x21\
-\0\0\0\0\0\0\x61\x82\x18\0\0\0\0\0\x27\x02\0\0\x3c\0\0\0\x67\x02\0\0\x20\0\0\0\
-\x77\x02\0\0\x20\0\0\0\x37\x02\0\0\x64\0\0\0\x63\x18\x0c\0\0\0\0\0\x79\x73\x48\
-\0\0\0\0\0\x27\x03\0\0\x28\0\0\0\x37\x03\0\0\0\x65\xcd\x1d\x0f\x32\0\0\0\0\0\0\
-\x63\x28\x18\0\0\0\0\0\x27\x01\0\0\x3c\0\0\0\x67\x01\0\0\x20\0\0\0\x77\x01\0\0\
-\x20\0\0\0\x37\x01\0\0\x64\0\0\0\x79\x72\x40\0\0\0\0\0\x27\x02\0\0\x28\0\0\0\
-\x37\x02\0\0\0\x65\xcd\x1d\x0f\x21\0\0\0\0\0\0\x63\x18\x14\0\0\0\0\0\xbf\xa9\0\
-\0\0\0\0\0\x07\x09\0\0\xc8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\
-\x92\0\0\0\0\0\0\xbf\x83\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\
-\xb7\x06\0\0\0\0\0\0\x7b\x67\x48\0\0\0\0\0\x7b\x67\x20\0\0\0\0\0\x7b\x67\x28\0\
-\0\0\0\0\x7b\x67\x30\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x92\0\0\
-\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x30\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\
-\x83\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\xde\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\
-\0\x1c\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x73\0\0\0\0\0\x7b\x60\x28\0\0\0\0\0\x7b\
-\x60\x20\0\0\0\0\0\x7b\x60\x18\0\0\0\0\0\x7b\x60\x10\0\0\0\0\0\x7b\x60\x08\0\0\
-\0\0\0\x7b\x60\0\0\0\0\0\0\x61\x81\0\0\0\0\0\0\x63\x10\0\0\0\0\0\0\x61\x81\x0c\
-\0\0\0\0\0\x63\x10\x0c\0\0\0\0\0\x61\x81\x08\0\0\0\0\0\x63\x10\x08\0\0\0\0\0\
-\x61\x81\x04\0\0\0\0\0\x63\x10\x04\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\xb7\x02\0\0\0\
-\0\0\0\x85\0\0\0\x84\0\0\0\xb7\x09\0\0\0\0\0\0\x79\xa6\xc0\xff\0\0\0\0\x07\x06\
-\0\0\x01\0\0\0\xbf\x61\0\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\x77\x01\0\0\x20\0\0\0\
-\x55\x01\x02\0\x80\0\0\0\xb7\0\0\0\0\0\0\0\x05\0\x99\xff\0\0\0\0\x18\x01\0\0\
-\x04\0\0\0\0\0\0\0\0\0\0\0\x61\x11\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x67\x02\0\0\
-\x20\0\0\0\x77\x02\0\0\x20\0\0\0\x3d\x12\xf7\xff\0\0\0\0\x63\x6a\xfc\xff\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x15\x07\x44\0\0\0\0\0\xbf\xa2\
-\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x85\0\0\0\x01\0\0\0\xbf\x08\0\0\0\0\0\0\x55\x08\x18\0\0\0\0\0\xb7\x01\0\0\0\
-\x65\xcd\x1d\x7b\x1a\xe8\xff\0\0\0\0\x7b\x9a\xc8\xff\0\0\0\0\x61\xa1\xfc\xff\0\
-\0\0\0\x63\x1a\xc8\xff\0\0\0\0\x7b\x9a\xf0\xff\0\0\0\0\x7b\x9a\xe0\xff\0\0\0\0\
-\x7b\x9a\xd8\xff\0\0\0\0\x7b\x9a\xd0\xff\0\0\0\0\xbf\xa8\0\0\0\0\0\0\x07\x08\0\
-\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc8\xff\xff\xff\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\x85\0\0\0\x01\0\
-\0\0\xbf\x08\0\0\0\0\0\0\x15\x08\x2b\0\0\0\0\0\x79\xa1\xb8\xff\0\0\0\0\x7b\x17\
-\x18\0\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\xc8\xff\0\0\0\0\x63\x18\0\0\0\0\
-\0\0\x61\x83\x04\0\0\0\0\0\x61\x82\x08\0\0\0\0\0\x61\x81\x0c\0\0\0\0\0\xbf\x14\
-\0\0\0\0\0\0\x4f\x24\0\0\0\0\0\0\x67\x04\0\0\x20\0\0\0\x77\x04\0\0\x20\0\0\0\
-\x7b\x6a\xc0\xff\0\0\0\0\x55\x04\x5e\xff\0\0\0\0\xb7\x02\0\0\0\0\0\0\xbf\x34\0\
-\0\0\0\0\0\x55\x04\x5b\xff\0\0\0\0\x79\x71\x20\0\0\0\0\0\x27\x01\0\0\x64\0\0\0\
-\x37\x01\0\0\0\x65\xcd\x1d\x63\x18\x04\0\0\0\0\0\x79\x71\x28\0\0\0\0\0\x27\x01\
-\0\0\x64\0\0\0\x37\x01\0\0\0\x65\xcd\x1d\x63\x18\x08\0\0\0\0\0\x79\x71\x30\0\0\
-\0\0\0\x27\x01\0\0\x64\0\0\0\x37\x01\0\0\0\x65\xcd\x1d\x63\x18\x0c\0\0\0\0\0\
-\x79\x71\x48\0\0\0\0\0\x27\x01\0\0\x64\0\0\0\x37\x01\0\0\0\x65\xcd\x1d\x63\x18\
-\x18\0\0\0\0\0\x79\x71\x40\0\0\0\0\0\x27\x01\0\0\x64\0\0\0\x37\x01\0\0\0\x65\
-\xcd\x1d\x05\0\x74\xff\0\0\0\0\x61\xa3\xfc\xff\0\0\0\0\x18\x01\0\0\xc3\0\0\0\0\
-\0\0\0\0\0\0\0\xb7\x02\0\0\x1b\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\xa0\xff\0\0\0\0\
-\x18\x01\0\0\x5c\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x0e\0\0\0\x85\0\0\0\x06\0\0\
-\0\x05\0\xa0\xff\0\0\0\0\xb7\x07\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x02\0\0\x20\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x06\0\0\0\
-\0\0\0\x55\x06\x05\0\0\0\0\0\x18\x01\0\0\xfa\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\
-\x21\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x61\0\0\0\0\0\x63\x76\x1c\0\0\0\0\0\x63\
-\x76\x18\0\0\0\0\0\x63\x76\x14\0\0\0\0\0\x63\x76\x10\0\0\0\0\0\x63\x76\x0c\0\0\
-\0\0\0\x63\x76\x08\0\0\0\0\0\x63\x76\x04\0\0\0\0\0\x63\x76\0\0\0\0\0\0\x63\x7a\
-\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\0\0\0\0\0\x61\x07\0\0\0\0\
-\0\0\x63\x76\0\0\0\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\
-\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x85\0\0\0\x01\0\0\0\xb7\x07\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x15\0\x01\0\0\0\0\
-\0\x61\x01\0\0\0\0\0\0\x63\x16\x04\0\0\0\0\0\xb7\x01\0\0\x02\0\0\0\x63\x1a\xfc\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\0\0\0\0\0\x61\x07\0\0\0\0\0\0\
-\x63\x76\x08\0\0\0\0\0\xb7\x01\0\0\x03\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\xb7\x07\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x15\0\x01\0\0\0\0\0\
-\x61\x01\0\0\0\0\0\0\x63\x16\x0c\0\0\0\0\0\xb7\x01\0\0\x04\0\0\0\x63\x1a\xfc\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\0\0\0\0\0\x61\x07\0\0\0\0\0\0\
-\x63\x76\x10\0\0\0\0\0\xb7\x01\0\0\x05\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\xb7\x07\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x15\0\x01\0\0\0\0\0\
-\x61\x01\0\0\0\0\0\0\x63\x16\x14\0\0\0\0\0\xb7\x01\0\0\x06\0\0\0\x63\x1a\xfc\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\0\0\0\0\0\x61\x07\0\0\0\0\0\0\
-\x63\x76\x18\0\0\0\0\0\xb7\x01\0\0\x07\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\xb7\x01\0\0\0\0\0\0\x15\0\x01\0\0\0\0\0\x61\x01\0\0\0\0\0\0\
-\x63\x16\x1c\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\
-\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x44\x75\x61\x6c\x20\x42\x53\x44\x2f\
-\x47\x50\x4c\0\0\0\0\0\0\0\0\x01\0\0\0\x67\x65\x74\x20\x73\x74\x61\x63\x6b\x20\
-\x65\x72\x72\x6f\x72\x2c\x20\x65\x72\x72\x6f\x72\x20\x63\x6f\x64\x65\x20\x69\
-\x73\x20\x25\x69\0\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x20\x73\x74\x72\x75\x63\
-\x74\x20\x69\x6e\x69\x74\x20\x66\x61\x69\x6c\x65\x64\x0a\0\x67\x65\x74\x20\x63\
-\x70\x75\x20\x6e\x75\x6d\x73\x20\x65\x72\x72\x6f\x72\x0a\0\x75\x70\x64\x61\x74\
-\x65\x20\x65\x72\x72\x6f\x72\x0a\0\x74\x68\x65\x20\x74\x61\x73\x6b\x5f\x63\x70\
-\x75\x20\x62\x75\x66\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\x62\x61\
-\x63\x6b\x74\x72\x61\x63\x65\x20\x62\x75\x66\x66\x20\x61\x6c\x6c\x6f\x63\x61\
-\x74\x65\x20\x66\x61\x69\x6c\x65\x64\x0a\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\
-\x70\x75\x20\x62\x75\x66\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\x64\
-\x61\x74\x61\x20\x6e\x6f\x74\x20\x66\x6f\x75\x6e\x64\x20\x66\x6f\x72\x20\x63\
-\x70\x75\x20\x25\x75\x0a\0\x52\x69\x6e\x67\x20\x62\x75\x66\x66\x65\x72\x20\x72\
-\x65\x73\x65\x72\x76\x65\x20\x66\x61\x69\x6c\x65\x64\x0a\0\x72\x75\x6e\x71\x6c\
-\x61\x74\x20\x72\x69\x6e\x67\x62\x75\x66\x66\x20\x72\x65\x73\x65\x72\x76\x65\
-\x20\x66\x61\x69\x6c\x65\x64\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x01\0\0\0\
-\x94\0\0\0\xa0\0\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\xd0\0\0\0\0\0\0\0\x01\0\0\0\
-\x94\0\0\0\x68\x01\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\x48\x02\0\0\0\0\0\0\x01\0\0\
-\0\x9a\0\0\0\x70\x02\0\0\0\0\0\0\x01\0\0\0\xa2\0\0\0\xa0\x02\0\0\0\0\0\0\x01\0\
-\0\0\x90\0\0\0\xf0\x02\0\0\0\0\0\0\x01\0\0\0\x9a\0\0\0\x08\x04\0\0\0\0\0\0\x01\
-\0\0\0\x94\0\0\0\xc8\0\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x10\x03\0\0\0\0\0\0\x01\
-\0\0\0\x93\0\0\0\x60\x03\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\xe0\x03\0\0\0\0\0\0\
-\x01\0\0\0\x94\0\0\0\x18\x04\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x78\x04\0\0\0\0\0\
-\0\x01\0\0\0\x94\0\0\0\xc8\0\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x10\x03\0\0\0\0\0\
-\0\x01\0\0\0\x93\0\0\0\x60\x03\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\xe0\x03\0\0\0\0\
-\0\0\x01\0\0\0\x94\0\0\0\x18\x04\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x78\x04\0\0\0\
-\0\0\0\x01\0\0\0\x94\0\0\0\x38\0\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x90\x01\0\0\0\
-\0\0\0\x01\0\0\0\x93\0\0\0\x58\0\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x80\0\0\0\0\0\
-\0\0\x01\0\0\0\x94\0\0\0\xd8\0\0\0\0\0\0\0\x01\0\0\0\x98\0\0\0\x08\x01\0\0\0\0\
-\0\0\x01\0\0\0\x98\0\0\0\x30\x01\0\0\0\0\0\0\x01\0\0\0\x99\0\0\0\x68\x01\0\0\0\
-\0\0\0\x01\0\0\0\x94\0\0\0\x88\x01\0\0\0\0\0\0\x01\0\0\0\x9a\0\0\0\xc0\x01\0\0\
-\0\0\0\0\x01\0\0\0\x9a\0\0\0\x58\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\xf0\0\0\0\0\
-\0\0\0\x01\0\0\0\x9c\0\0\0\x70\x01\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\xa8\x01\0\0\
-\0\0\0\0\x01\0\0\0\x9c\0\0\0\x08\x02\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x80\x03\0\
-\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x08\x05\0\0\0\0\0\0\x01\0\0\0\x98\0\0\0\x30\x05\
-\0\0\0\0\0\0\x01\0\0\0\x9e\0\0\0\x60\x05\0\0\0\0\0\0\x01\0\0\0\x90\0\0\0\xb0\
-\x05\0\0\0\0\0\0\x01\0\0\0\x98\0\0\0\xd8\x07\0\0\0\0\0\0\x01\0\0\0\x99\0\0\0\
-\x08\x08\0\0\0\0\0\0\x01\0\0\0\x9f\0\0\0\x38\x08\0\0\0\0\0\0\x01\0\0\0\x90\0\0\
-\0\xa0\x0f\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\xf8\x0f\0\0\0\0\0\0\x0a\0\0\0\x02\0\
-\0\0\x20\x10\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x80\x10\0\0\0\0\0\0\x01\0\0\0\x93\
-\0\0\0\0\x12\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x10\x13\0\0\0\0\0\0\x01\0\0\0\xa0\
-\0\0\0\x40\x13\0\0\0\0\0\0\x01\0\0\0\xa0\0\0\0\x50\x13\0\0\0\0\0\0\x01\0\0\0\
-\xa1\0\0\0\x90\x13\0\0\0\0\0\0\x01\0\0\0\xa0\0\0\0\x10\x14\0\0\0\0\0\0\x0a\0\0\
-\0\x02\0\0\0\x38\x14\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x78\x14\0\0\0\0\0\0\x01\0\
-\0\0\x9c\0\0\0\xe0\x14\0\0\0\0\0\0\x01\0\0\0\x98\0\0\0\x08\x15\0\0\0\0\0\0\x01\
-\0\0\0\xa4\0\0\0\x50\x15\0\0\0\0\0\0\x01\0\0\0\x90\0\0\0\x90\x15\0\0\0\0\0\0\
-\x01\0\0\0\x99\0\0\0\xd0\x15\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x58\x16\0\0\0\0\0\
-\0\x01\0\0\0\x99\0\0\0\x90\x16\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\xb8\x16\0\0\0\0\
-\0\0\x01\0\0\0\x99\0\0\0\xe0\x16\0\0\0\0\0\0\x01\0\0\0\x90\0\0\0\x58\x17\0\0\0\
-\0\0\0\x01\0\0\0\xa4\0\0\0\xf0\x17\0\0\0\0\0\0\x01\0\0\0\x99\0\0\0\x38\0\0\0\0\
-\0\0\0\x01\0\0\0\x9c\0\0\0\xd0\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\x50\x01\0\0\0\
-\0\0\0\x01\0\0\0\x9d\0\0\0\xe0\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\xb0\0\0\0\0\
-\0\0\0\x01\0\0\0\x93\0\0\0\xc8\x02\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x28\x03\0\0\
-\0\0\0\0\x01\0\0\0\x94\0\0\0\xa8\x03\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\xe8\x03\0\
-\0\0\0\0\0\x01\0\0\0\x94\0\0\0\x30\x04\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\xb0\0\0\
-\0\0\0\0\0\x01\0\0\0\x93\0\0\0\xc0\x02\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\x20\x03\
-\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\xa0\x03\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\xe0\
-\x03\0\0\0\0\0\0\x01\0\0\0\x94\0\0\0\x28\x04\0\0\0\0\0\0\x01\0\0\0\x93\0\0\0\
-\x20\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\0\
-\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\x80\x01\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\
-\xb8\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\0\x02\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\
-\x20\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\0\
-\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\x80\x01\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\
-\xe0\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\x20\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\
-\x68\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\0\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\
-\x80\x01\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\xb8\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\
-\0\0\x02\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\x20\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\
-\x68\0\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\0\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\0\
-\x80\x01\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\xe0\x01\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\
-\0\0\0\0\0\0\0\0\0\x01\0\0\0\x91\0\0\0\x20\0\0\0\0\0\0\0\x01\0\0\0\xad\0\0\0\
-\x30\0\0\0\0\0\0\0\x01\0\0\0\xae\0\0\0\x58\0\0\0\0\0\0\0\x01\0\0\0\x91\0\0\0\
-\x70\0\0\0\0\0\0\0\x01\0\0\0\x91\0\0\0\xb8\0\0\0\0\0\0\0\x01\0\0\0\x90\0\0\0\
-\x70\x02\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\xc8\x02\0\0\0\0\0\0\x01\0\0\0\x9c\0\0\
-\0\xf8\x02\0\0\0\0\0\0\x01\0\0\0\xaf\0\0\0\x28\x03\0\0\0\0\0\0\x01\0\0\0\x90\0\
-\0\0\x20\x04\0\0\0\0\0\0\x01\0\0\0\x91\0\0\0\x70\x04\0\0\0\0\0\0\x01\0\0\0\x9c\
-\0\0\0\xa8\x04\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\x38\x05\0\0\0\0\0\0\x01\0\0\0\
-\x9d\0\0\0\x60\x05\0\0\0\0\0\0\x01\0\0\0\x9d\0\0\0\xc0\x06\0\0\0\0\0\0\x01\0\0\
-\0\x90\0\0\0\xe8\x06\0\0\0\0\0\0\x01\0\0\0\x90\0\0\0\x18\x07\0\0\0\0\0\0\x01\0\
-\0\0\xb1\0\0\0\x50\x07\0\0\0\0\0\0\x01\0\0\0\x90\0\0\0\xd0\x07\0\0\0\0\0\0\x01\
-\0\0\0\xa0\0\0\0\x20\x08\0\0\0\0\0\0\x01\0\0\0\xa0\0\0\0\x80\x08\0\0\0\0\0\0\
-\x01\0\0\0\xa0\0\0\0\xd0\x08\0\0\0\0\0\0\x01\0\0\0\xa0\0\0\0\x30\x09\0\0\0\0\0\
-\0\x01\0\0\0\xa0\0\0\0\x80\x09\0\0\0\0\0\0\x01\0\0\0\xa0\0\0\0\xe0\x09\0\0\0\0\
-\0\0\x01\0\0\0\xa0\0\0\0\x30\x0a\0\0\0\0\0\0\x01\0\0\0\xa0\0\0\0\x9f\xeb\x01\0\
-\x18\0\0\0\0\0\0\0\x4c\x51\0\0\x4c\x51\0\0\x14\x73\0\0\0\0\0\0\0\0\0\x02\x03\0\
-\0\0\x01\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\
-\0\0\x04\0\0\0\x01\0\0\0\x05\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\
-\x02\x06\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\
-\0\0\0\x02\x08\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x70\0\0\0\0\
-\0\0\0\0\0\0\x02\x0a\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x90\
-\x01\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\
-\0\0\0\x40\0\0\0\x27\0\0\0\x07\0\0\0\x80\0\0\0\x32\0\0\0\x09\0\0\0\xc0\0\0\0\
-\x3e\0\0\0\0\0\0\x0e\x0b\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x0e\0\0\0\0\0\0\0\0\
-\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\x02\x10\0\0\0\0\0\
-\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x50\0\0\0\0\0\0\0\0\0\0\x02\x12\0\0\
-\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x40\0\0\0\0\0\0\0\x04\0\0\x04\
-\x20\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\
-\x0f\0\0\0\x80\0\0\0\x32\0\0\0\x11\0\0\0\xc0\0\0\0\x51\0\0\0\0\0\0\x0e\x13\0\0\
-\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x16\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\
-\x04\0\0\0\x30\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\
-\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x15\0\0\0\x80\0\0\0\x32\0\0\0\x11\0\0\
-\0\xc0\0\0\0\x65\0\0\0\0\0\0\x0e\x17\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x1a\0\0\
-\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\x04\0\0\x04\
-\x20\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\
-\x05\0\0\0\x80\0\0\0\x32\0\0\0\x19\0\0\0\xc0\0\0\0\x7b\0\0\0\0\0\0\x0e\x1b\0\0\
-\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x1e\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\
-\x04\0\0\0\0\x02\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\
-\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x05\0\0\0\x80\0\0\0\x32\0\0\0\x1d\0\0\
-\0\xc0\0\0\0\x87\0\0\0\0\0\0\x0e\x1f\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x22\0\0\
-\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x07\0\0\0\0\0\0\0\0\0\0\x02\
-\x24\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x08\0\0\0\0\0\0\x04\
-\0\0\x04\x20\0\0\0\x19\0\0\0\x21\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\
-\x27\0\0\0\x19\0\0\0\x80\0\0\0\x32\0\0\0\x23\0\0\0\xc0\0\0\0\x9b\0\0\0\0\0\0\
-\x0e\x25\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x28\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
-\x02\0\0\0\x04\0\0\0\x60\x01\0\0\0\0\0\0\0\0\0\x02\x2a\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x04\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\
-\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x27\0\0\0\x80\0\0\0\
-\x32\0\0\0\x29\0\0\0\xc0\0\0\0\xac\0\0\0\0\0\0\x0e\x2b\0\0\0\x01\0\0\0\0\0\0\0\
-\0\0\0\x02\x2e\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x10\0\0\0\0\
-\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\
-\x40\0\0\0\x27\0\0\0\x05\0\0\0\x80\0\0\0\x32\0\0\0\x2d\0\0\0\xc0\0\0\0\xc0\0\0\
-\0\0\0\0\x0e\x2f\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x32\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x02\0\0\0\x04\0\0\0\x0c\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\
-\x0d\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x31\0\0\0\x80\0\0\0\
-\x32\0\0\0\x05\0\0\0\xc0\0\0\0\xcc\0\0\0\0\0\0\x0e\x33\0\0\0\x01\0\0\0\0\0\0\0\
-\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\
-\0\x27\0\0\0\x11\0\0\0\x80\0\0\0\x32\0\0\0\x23\0\0\0\xc0\0\0\0\xdd\0\0\0\0\0\0\
-\x0e\x35\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x38\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
-\x02\0\0\0\x04\0\0\0\0\x01\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\
-\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x05\0\0\0\x80\0\0\0\x32\0\0\
-\0\x37\0\0\0\xc0\0\0\0\xe9\0\0\0\0\0\0\x0e\x39\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\
-\x02\x3c\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x1b\0\0\0\0\0\0\0\
-\0\0\0\x02\x3e\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\x04\0\0\
-\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x3b\0\0\0\0\0\0\0\x32\0\0\0\x3d\0\0\0\
-\x40\0\0\0\xfe\0\0\0\0\0\0\x0e\x3f\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x42\0\0\0\
-\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\x08\0\0\0\0\0\x02\0\0\x04\
-\x10\0\0\0\x19\0\0\0\x3b\0\0\0\0\0\0\0\x32\0\0\0\x41\0\0\0\x40\0\0\0\x0f\x01\0\
-\0\0\0\0\x0e\x43\0\0\0\x01\0\0\0\x24\x01\0\0\0\0\0\x0e\x43\0\0\0\x01\0\0\0\0\0\
-\0\0\0\0\0\x02\x47\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x80\0\
-\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x3b\0\0\0\0\0\0\0\x32\0\0\0\x46\0\0\
-\0\x40\0\0\0\x3c\x01\0\0\0\0\0\x0e\x48\0\0\0\x01\0\0\0\x4b\x01\0\0\0\0\0\x0e\
-\x43\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x4c\0\0\0\x61\x01\0\0\0\0\0\x01\x08\0\0\
-\0\x40\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x74\x01\0\0\x4b\0\0\0\x78\x01\0\0\
-\x01\0\0\x0c\x4d\0\0\0\x8c\x01\0\0\xfd\0\0\x84\x40\x27\0\0\x98\x01\0\0\x50\0\0\
-\0\0\0\0\0\xa4\x01\0\0\x54\0\0\0\xc0\0\0\0\xac\x01\0\0\x55\0\0\0\0\x01\0\0\xb2\
-\x01\0\0\x56\0\0\0\x40\x01\0\0\xb8\x01\0\0\x54\0\0\0\x60\x01\0\0\xbe\x01\0\0\
-\x54\0\0\0\x80\x01\0\0\xc5\x01\0\0\x02\0\0\0\xa0\x01\0\0\xcc\x01\0\0\x5a\0\0\0\
-\xc0\x01\0\0\xd7\x01\0\0\x54\0\0\0\x40\x02\0\0\xe3\x01\0\0\x51\0\0\0\x80\x02\0\
-\0\xf7\x01\0\0\x61\0\0\0\xc0\x02\0\0\x02\x02\0\0\x02\0\0\0\0\x03\0\0\x12\x02\0\
-\0\x02\0\0\0\x20\x03\0\0\x1b\x02\0\0\x02\0\0\0\x40\x03\0\0\x21\x02\0\0\x02\0\0\
-\0\x60\x03\0\0\x26\x02\0\0\x02\0\0\0\x80\x03\0\0\x32\x02\0\0\x02\0\0\0\xa0\x03\
-\0\0\x3e\x02\0\0\x54\0\0\0\xc0\x03\0\0\x4a\x02\0\0\x62\0\0\0\0\x04\0\0\x4d\x02\
-\0\0\x6e\0\0\0\0\x0c\0\0\x50\x02\0\0\x70\0\0\0\x80\x0d\0\0\x53\x02\0\0\x80\0\0\
-\0\x80\x14\0\0\x5f\x02\0\0\x82\0\0\0\xc0\x14\0\0\x70\x02\0\0\x83\0\0\0\0\x16\0\
-\0\x76\x02\0\0\x54\0\0\0\0\x1e\0\0\x81\x02\0\0\x54\0\0\0\x20\x1e\0\0\x88\x02\0\
-\0\x02\0\0\0\x40\x1e\0\0\x98\x02\0\0\x84\0\0\0\x80\x1e\0\0\xa1\x02\0\0\x87\0\0\
-\0\xc0\x1e\0\0\xaf\x02\0\0\x86\0\0\0\0\x1f\0\0\xb9\x02\0\0\x55\0\0\0\x80\x1f\0\
-\0\xcb\x02\0\0\x60\0\0\0\xc0\x1f\0\0\xde\x02\0\0\x60\0\0\0\xd0\x1f\0\0\xee\x02\
-\0\0\x02\0\0\0\xe0\x1f\0\0\x04\x03\0\0\x8a\0\0\0\0\x20\0\0\x1c\x03\0\0\x66\0\0\
-\0\x40\x20\0\0\x2b\x03\0\0\x8c\0\0\0\xc0\x20\0\0\x3c\x03\0\0\x51\0\0\0\0\x21\0\
-\0\x4c\x03\0\0\x7c\0\0\0\x40\x21\0\0\x5e\x03\0\0\x7c\0\0\0\x48\x21\0\0\x6c\x03\
-\0\0\x02\0\0\0\x60\x21\0\0\x7f\x03\0\0\x66\0\0\0\x80\x21\0\0\x96\x03\0\0\x02\0\
-\0\0\0\x22\0\0\xa9\x03\0\0\x02\0\0\0\x20\x22\0\0\xb8\x03\0\0\x8a\0\0\0\x40\x22\
-\0\0\xcb\x03\0\0\x66\0\0\0\x80\x22\0\0\xdc\x03\0\0\x66\0\0\0\0\x23\0\0\xea\x03\
-\0\0\x02\0\0\0\x80\x23\0\0\xf7\x03\0\0\x8d\0\0\0\xc0\x23\0\0\x02\x04\0\0\x66\0\
-\0\0\xc0\x24\0\0\x08\x04\0\0\x8e\0\0\0\x40\x25\0\0\x17\x04\0\0\x64\0\0\0\x80\
-\x26\0\0\x29\x04\0\0\x8f\0\0\0\x40\x27\0\0\x2c\x04\0\0\x8f\0\0\0\x80\x27\0\0\
-\x36\x04\0\0\x90\0\0\0\xc0\x27\0\0\x3f\x04\0\0\x02\0\0\0\x60\x28\0\0\x4a\x04\0\
-\0\x02\0\0\0\x80\x28\0\0\x54\x04\0\0\x02\0\0\0\xa0\x28\0\0\x60\x04\0\0\x02\0\0\
-\0\xc0\x28\0\0\x6e\x04\0\0\x51\0\0\0\0\x29\0\0\x75\x04\0\0\x54\0\0\0\x40\x29\0\
-\0\x81\x04\0\0\x54\0\0\0\x60\x29\0\x01\x95\x04\0\0\x54\0\0\0\x61\x29\0\x01\xaf\
-\x04\0\0\x54\0\0\0\x62\x29\0\x01\xbe\x04\0\0\x54\0\0\0\x80\x29\0\x01\xd2\x04\0\
-\0\x54\0\0\0\x81\x29\0\x01\xdc\x04\0\0\x54\0\0\0\x82\x29\0\x01\xe6\x04\0\0\x54\
-\0\0\0\x83\x29\0\x01\xf6\x04\0\0\x54\0\0\0\x84\x29\0\x01\x04\x05\0\0\x54\0\0\0\
-\x85\x29\0\x01\x13\x05\0\0\x54\0\0\0\x86\x29\0\x01\x27\x05\0\0\x54\0\0\0\x87\
-\x29\0\x01\x2e\x05\0\0\x54\0\0\0\x88\x29\0\x01\x3b\x05\0\0\x54\0\0\0\x89\x29\0\
-\x01\x46\x05\0\0\x54\0\0\0\x8a\x29\0\x01\x5a\x05\0\0\x54\0\0\0\x8b\x29\0\x01\
-\x67\x05\0\0\x51\0\0\0\xc0\x29\0\0\x74\x05\0\0\x91\0\0\0\0\x2a\0\0\x82\x05\0\0\
-\xa2\0\0\0\xc0\x2b\0\0\x86\x05\0\0\xa2\0\0\0\xe0\x2b\0\0\x8b\x05\0\0\x51\0\0\0\
-\0\x2c\0\0\x98\x05\0\0\x61\0\0\0\x40\x2c\0\0\xa4\x05\0\0\x61\0\0\0\x80\x2c\0\0\
-\xab\x05\0\0\x66\0\0\0\xc0\x2c\0\0\xb4\x05\0\0\x66\0\0\0\x40\x2d\0\0\xbc\x05\0\
-\0\x61\0\0\0\xc0\x2d\0\0\xc9\x05\0\0\x66\0\0\0\0\x2e\0\0\xd1\x05\0\0\x66\0\0\0\
-\x80\x2e\0\0\xde\x05\0\0\xa4\0\0\0\0\x2f\0\0\xe9\x05\0\0\xa8\0\0\0\x40\x2f\0\0\
-\xf3\x05\0\0\x66\0\0\0\x40\x31\0\0\0\x06\0\0\x66\0\0\0\xc0\x31\0\0\x0c\x06\0\0\
-\xa9\0\0\0\x40\x32\0\0\x17\x06\0\0\xaa\0\0\0\x80\x32\0\0\x25\x06\0\0\xaa\0\0\0\
-\xc0\x32\0\0\x35\x06\0\0\x55\0\0\0\0\x33\0\0\x44\x06\0\0\x68\0\0\0\x40\x33\0\0\
-\x4a\x06\0\0\x68\0\0\0\x80\x33\0\0\x50\x06\0\0\x68\0\0\0\xc0\x33\0\0\x56\x06\0\
-\0\xab\0\0\0\0\x34\0\0\x63\x06\0\0\x51\0\0\0\x80\x36\0\0\x69\x06\0\0\x51\0\0\0\
-\xc0\x36\0\0\x70\x06\0\0\x68\0\0\0\0\x37\0\0\x7b\x06\0\0\x68\0\0\0\x40\x37\0\0\
-\x8a\x06\0\0\x51\0\0\0\x80\x37\0\0\x92\x06\0\0\x51\0\0\0\xc0\x37\0\0\x9a\x06\0\
-\0\xc2\0\0\0\0\x38\0\0\xaa\x06\0\0\xc8\0\0\0\x80\x3a\0\0\xbf\x06\0\0\xcd\0\0\0\
-\x40\x3b\0\0\xcc\x06\0\0\xcd\0\0\0\x80\x3b\0\0\xd6\x06\0\0\xcd\0\0\0\xc0\x3b\0\
-\0\xdb\x06\0\0\xcf\0\0\0\0\x3c\0\0\xf0\x06\0\0\xd0\0\0\0\x40\x3c\0\0\xf5\x06\0\
-\0\xd1\0\0\0\xc0\x3c\0\0\xff\x06\0\0\xd2\0\0\0\0\x3d\0\0\x07\x07\0\0\xd4\0\0\0\
-\x40\x3d\0\0\x0f\x07\0\0\x51\0\0\0\xc0\x3d\0\0\x21\x07\0\0\x51\0\0\0\0\x3e\0\0\
-\x32\x07\0\0\xd5\0\0\0\x40\x3e\0\0\x35\x07\0\0\xd6\0\0\0\x80\x3e\0\0\x3b\x07\0\
-\0\xd7\0\0\0\xc0\x3e\0\0\x44\x07\0\0\xd8\0\0\0\0\x3f\0\0\x4c\x07\0\0\xd9\0\0\0\
-\x40\x3f\0\0\x53\x07\0\0\xda\0\0\0\x80\x3f\0\0\x5b\x07\0\0\xdb\0\0\0\xc0\x3f\0\
-\0\x63\x07\0\0\xdb\0\0\0\0\x40\0\0\x70\x07\0\0\xdb\0\0\0\x40\x40\0\0\x7e\x07\0\
-\0\xde\0\0\0\x80\x40\0\0\x86\x07\0\0\x51\0\0\0\x40\x41\0\0\x90\x07\0\0\xdf\0\0\
-\0\x80\x41\0\0\x9c\x07\0\0\x54\0\0\0\xc0\x41\0\0\xa9\x07\0\0\xca\0\0\0\0\x42\0\
-\0\xb4\x07\0\0\xe2\0\0\0\x40\x42\0\0\xc2\x07\0\0\xe3\0\0\0\x80\x42\0\0\xcb\x07\
-\0\0\x54\0\0\0\xa0\x42\0\0\xd5\x07\0\0\xe7\0\0\0\xc0\x42\0\0\xdd\x07\0\0\xe9\0\
-\0\0\x40\x43\0\0\xee\x07\0\0\x68\0\0\0\x40\x44\0\0\xfd\x07\0\0\x68\0\0\0\x80\
-\x44\0\0\x0a\x08\0\0\xed\0\0\0\xc0\x44\0\0\x15\x08\0\0\xac\0\0\0\xc0\x46\0\0\
-\x1d\x08\0\0\xf2\0\0\0\xc0\x48\0\0\x24\x08\0\0\xc5\0\0\0\0\x49\0\0\x2f\x08\0\0\
-\x61\0\0\0\x80\x49\0\0\x3b\x08\0\0\xf4\0\0\0\xc0\x49\0\0\x49\x08\0\0\xf5\0\0\0\
-\0\x4a\0\0\x54\x08\0\0\x02\0\0\0\x40\x4a\0\0\x64\x08\0\0\xf6\0\0\0\x80\x4a\0\0\
-\x6d\x08\0\0\x54\0\0\0\x40\x4c\0\0\x7e\x08\0\0\x68\0\0\0\x80\x4c\0\0\x90\x08\0\
-\0\x02\0\0\0\xc0\x4c\0\0\xa1\x08\0\0\x02\0\0\0\xe0\x4c\0\0\xb1\x08\0\0\x02\0\0\
-\0\0\x4d\0\0\xbc\x08\0\0\x68\0\0\0\x40\x4d\0\0\xcb\x08\0\0\x02\0\0\0\x80\x4d\0\
-\0\xd9\x08\0\0\x54\0\0\0\xa0\x4d\0\0\xeb\x08\0\0\xf9\0\0\0\xc0\x4d\0\0\xf6\x08\
-\0\0\x55\0\0\0\xc0\x89\0\0\x03\x09\0\0\xfa\0\0\0\0\x8a\0\0\x0c\x09\0\0\xfb\0\0\
-\0\x40\x8a\0\0\x11\x09\0\0\xfc\0\0\0\x80\x8a\0\0\x1f\x09\0\0\xfd\0\0\0\xc0\x8a\
-\0\0\x30\x09\0\0\xfe\0\0\0\0\x8b\0\0\x3b\x09\0\0\xff\0\0\0\x40\x8b\0\0\x4b\x09\
-\0\0\x51\0\0\0\x80\x8b\0\0\x5a\x09\0\0\0\x01\0\0\xc0\x8b\0\0\x67\x09\0\0\x02\
-\x01\0\0\0\x8c\0\0\x6c\x09\0\0\x68\0\0\0\xc0\x8d\0\0\x7a\x09\0\0\x68\0\0\0\0\
-\x8e\0\0\x87\x09\0\0\x68\0\0\0\x40\x8e\0\0\x94\x09\0\0\x03\x01\0\0\x80\x8e\0\0\
-\xa1\x09\0\0\x05\x01\0\0\xc0\x8e\0\0\xb2\x09\0\0\x02\0\0\0\x80\x90\0\0\xca\x09\
-\0\0\x02\0\0\0\xa0\x90\0\0\xe3\x09\0\0\x0a\x01\0\0\xc0\x90\0\0\xeb\x09\0\0\x66\
-\0\0\0\0\x91\0\0\xf3\x09\0\0\x0b\x01\0\0\x80\x91\0\0\xff\x09\0\0\x66\0\0\0\xc0\
-\x91\0\0\x0d\x0a\0\0\x0c\x01\0\0\x40\x92\0\0\x1c\x0a\0\0\x0d\x01\0\0\x80\x92\0\
-\0\x2d\x0a\0\0\x54\0\0\0\0\x97\0\0\x39\x0a\0\0\x18\x01\0\0\x40\x97\0\0\x49\x0a\
-\0\0\x0d\x01\0\0\xc0\x97\0\0\x5a\x0a\0\0\x66\0\0\0\x40\x9c\0\0\x6a\x0a\0\0\x51\
-\0\0\0\xc0\x9c\0\0\x7d\x0a\0\0\x19\x01\0\0\0\x9d\0\0\x87\x0a\0\0\x1a\x01\0\0\
-\x40\x9d\0\0\x8f\x0a\0\0\x1a\x01\0\0\x50\x9d\0\0\x9e\x0a\0\0\x02\0\0\0\x60\x9d\
-\0\0\xac\x0a\0\0\x54\0\0\0\x80\x9d\0\0\xbd\x0a\0\0\x54\0\0\0\xa0\x9d\0\0\xd2\
-\x0a\0\0\x02\0\0\0\xc0\x9d\0\0\xe5\x0a\0\0\x51\0\0\0\0\x9e\0\0\xf8\x0a\0\0\x68\
-\0\0\0\x40\x9e\0\0\x03\x0b\0\0\x68\0\0\0\x80\x9e\0\0\x1c\x0b\0\0\x68\0\0\0\xc0\
-\x9e\0\0\x32\x0b\0\0\xc9\0\0\0\0\x9f\0\0\x3c\x0b\0\0\x1b\x01\0\0\x80\x9f\0\0\
-\x47\x0b\0\0\x1c\x01\0\0\xc0\x9f\0\0\x53\x0b\0\0\x51\0\0\0\0\xa0\0\0\x65\x0b\0\
-\0\x1d\x01\0\0\x40\xa0\0\0\x7a\x0b\0\0\x51\0\0\0\0\xa1\0\0\x8e\x0b\0\0\x1e\x01\
-\0\0\x40\xa1\0\0\x93\x0b\0\0\x52\0\0\0\x80\xa1\0\0\x9c\x0b\0\0\x51\0\0\0\xc0\
-\xa1\0\0\xac\x0b\0\0\x1f\x01\0\0\0\xa2\0\0\0\0\0\0\x21\x01\0\0\xc0\xa2\0\0\xb4\
-\x0b\0\0\x22\x01\0\0\x40\xa3\0\0\xc0\x0b\0\0\x23\x01\0\0\x80\xa3\0\0\xca\x0b\0\
-\0\x25\x01\0\0\0\xa4\0\0\xd1\x0b\0\0\x02\0\0\0\x40\xa4\0\0\xde\x0b\0\0\x54\0\0\
-\0\x60\xa4\0\0\xe7\x0b\0\0\x02\0\0\0\x80\xa4\0\0\xf2\x0b\0\0\x02\0\0\0\xa0\xa4\
-\0\0\x03\x0c\0\0\x51\0\0\0\xc0\xa4\0\0\x15\x0c\0\0\x68\0\0\0\0\xa5\0\0\x24\x0c\
-\0\0\x68\0\0\0\x40\xa5\0\0\x3b\x0c\0\0\x02\0\0\0\x80\xa5\0\0\x4a\x0c\0\0\x02\0\
-\0\0\xa0\xa5\0\0\x59\x0c\0\0\x26\x01\0\0\xc0\xa5\0\0\x63\x0c\0\0\x4c\0\0\0\0\
-\xa6\0\0\x74\x0c\0\0\x58\0\0\0\x40\xa6\0\0\x82\x0c\0\0\x58\0\0\0\x60\xa6\0\0\
-\x96\x0c\0\0\x51\0\0\0\x80\xa6\0\0\xa6\x0c\0\0\x27\x01\0\0\xc0\xa6\0\0\xb3\x0c\
-\0\0\x28\x01\0\0\0\xa7\0\0\xc6\x0c\0\0\x02\0\0\0\x20\xa7\0\0\xd6\x0c\0\0\x54\0\
-\0\0\x40\xa7\0\0\xef\x0c\0\0\x27\x01\0\0\x80\xa7\0\0\xfc\x0c\0\0\x29\x01\0\0\
-\xc0\xa7\0\0\x0b\x0d\0\0\x2a\x01\0\0\0\xa8\0\0\x11\x0d\0\0\x2b\x01\0\0\x40\xa8\
-\0\0\x1b\x0d\0\0\x51\0\0\0\x40\xa8\0\0\x2d\x0d\0\0\x02\0\0\0\x80\xa8\0\0\x40\
-\x0d\0\0\x61\0\0\0\xc0\xa8\0\0\x50\x0d\0\0\x2c\x01\0\0\0\xa9\0\0\x61\x0d\0\0\
-\x30\x01\0\0\x80\xab\0\0\x6f\x0d\0\0\x56\0\0\0\xc0\xab\0\0\x7e\x0d\0\0\x55\0\0\
-\0\0\xac\0\0\x87\x0d\0\0\x31\x01\0\0\x40\xac\0\0\x93\x0d\0\0\x32\x01\0\0\x80\
-\xac\0\0\x9b\x0d\0\0\x55\0\0\0\xc0\xac\0\0\xa5\x0d\0\0\x69\0\0\0\0\xad\0\0\xb0\
-\x0d\0\0\x68\0\0\0\x40\xad\0\0\xb9\x0d\0\0\x69\0\0\0\x80\xad\0\x01\xc2\x0d\0\0\
-\x69\0\0\0\x81\xad\0\x01\xd1\x0d\0\0\x69\0\0\0\x82\xad\0\x3e\xe0\x0d\0\0\xc9\0\
-\0\0\xc0\xad\0\0\xec\x0d\0\0\x02\0\0\0\x40\xae\0\0\xf6\x0d\0\0\x33\x01\0\0\x80\
-\xae\0\0\x0a\x0e\0\0\x33\x01\0\0\xc0\xae\0\0\x13\x0e\0\0\xc9\0\0\0\0\xaf\0\0\
-\x22\x0e\0\0\x34\x01\0\0\0\xb0\0\0\x98\x01\0\0\x04\0\0\x04\x18\0\0\0\xb8\x01\0\
-\0\x51\0\0\0\0\0\0\0\x29\x0e\0\0\x51\0\0\0\x40\0\0\0\x36\x0e\0\0\x52\0\0\0\x80\
-\0\0\0\x3d\x0e\0\0\x52\0\0\0\xa0\0\0\0\x41\x0e\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\
-\0\x4f\x0e\0\0\0\0\0\x08\x53\0\0\0\x53\x0e\0\0\0\0\0\x08\x54\0\0\0\x59\x0e\0\0\
-\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\0\x66\x0e\0\0\0\0\0\x08\
-\x57\0\0\0\x71\x0e\0\0\x01\0\0\x04\x04\0\0\0\x81\x0e\0\0\x58\0\0\0\0\0\0\0\x86\
-\x0e\0\0\0\0\0\x08\x59\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\0\x8f\x0e\0\0\x02\0\0\
-\0\0\0\0\0\x97\x0e\0\0\x04\0\0\x04\x10\0\0\0\xaa\x0e\0\0\x5b\0\0\0\0\0\0\0\0\0\
-\0\0\x5d\0\0\0\x40\0\0\0\xb0\x0e\0\0\x5e\0\0\0\x60\0\0\0\xb4\x0e\0\0\x5e\0\0\0\
-\x70\0\0\0\xb8\x0e\0\0\x01\0\0\x04\x08\0\0\0\xc3\x0e\0\0\x5c\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x02\x5b\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\xc8\x0e\0\0\x54\0\0\0\0\
-\0\0\0\xd0\x0e\0\0\x58\0\0\0\0\0\0\0\xd8\x0e\0\0\0\0\0\x08\x5f\0\0\0\xdc\x0e\0\
-\0\0\0\0\x08\x60\0\0\0\xe2\x0e\0\0\0\0\0\x01\x02\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\
-\x02\x4f\0\0\0\xf1\x0e\0\0\x0f\0\0\x04\0\x01\0\0\xfe\x0e\0\0\x63\0\0\0\0\0\0\0\
-\x03\x0f\0\0\x64\0\0\0\x80\0\0\0\x0c\x0f\0\0\x66\0\0\0\x40\x01\0\0\x1b\x02\0\0\
-\x54\0\0\0\xc0\x01\0\0\x17\x0f\0\0\x68\0\0\0\0\x02\0\0\x22\x0f\0\0\x68\0\0\0\
-\x40\x02\0\0\x33\x0f\0\0\x68\0\0\0\x80\x02\0\0\x3c\x0f\0\0\x68\0\0\0\xc0\x02\0\
-\0\x52\x0f\0\0\x68\0\0\0\0\x03\0\0\x60\x0f\0\0\x02\0\0\0\x40\x03\0\0\xa4\x05\0\
-\0\x6a\0\0\0\x80\x03\0\0\x66\x0f\0\0\x6b\0\0\0\xc0\x03\0\0\x6d\x0f\0\0\x6b\0\0\
-\0\0\x04\0\0\x72\x0f\0\0\x51\0\0\0\x40\x04\0\0\x82\x0f\0\0\x6c\0\0\0\0\x06\0\0\
-\x86\x0f\0\0\x02\0\0\x04\x10\0\0\0\x92\x0f\0\0\x51\0\0\0\0\0\0\0\x99\x0f\0\0\
-\x52\0\0\0\x40\0\0\0\xa4\x0f\0\0\x03\0\0\x04\x18\0\0\0\xac\x0f\0\0\x51\0\0\0\0\
-\0\0\0\xbe\x0f\0\0\x65\0\0\0\x40\0\0\0\xc7\x0f\0\0\x65\0\0\0\x80\0\0\0\0\0\0\0\
-\0\0\0\x02\x64\0\0\0\xcf\x0f\0\0\x02\0\0\x04\x10\0\0\0\xc3\x0e\0\0\x67\0\0\0\0\
-\0\0\0\xd9\x0f\0\0\x67\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x66\0\0\0\xde\x0f\0\0\
-\0\0\0\x08\x69\0\0\0\xe2\x0f\0\0\0\0\0\x08\x4c\0\0\0\0\0\0\0\0\0\0\x02\x62\0\0\
-\0\0\0\0\0\0\0\0\x02\xec\x01\0\0\xe8\x0f\0\0\x09\0\0\x04\x40\0\0\0\xf2\x0f\0\0\
-\x68\0\0\0\0\0\0\0\x03\x10\0\0\x68\0\0\0\x40\0\0\0\x0c\x10\0\0\x68\0\0\0\x80\0\
-\0\0\x19\x10\0\0\x52\0\0\0\xc0\0\0\0\x22\x10\0\0\x52\0\0\0\xe0\0\0\0\x31\x10\0\
-\0\x51\0\0\0\0\x01\0\0\x3a\x10\0\0\x51\0\0\0\x40\x01\0\0\x47\x10\0\0\x51\0\0\0\
-\x80\x01\0\0\x50\x10\0\0\x6d\0\0\0\xc0\x01\0\0\x50\x10\0\0\x02\0\0\x04\x08\0\0\
-\0\x59\x10\0\0\x54\0\0\0\0\0\0\0\x62\x10\0\0\x54\0\0\0\x20\0\0\0\x67\x10\0\0\
-\x07\0\0\x04\x30\0\0\0\x77\x10\0\0\x66\0\0\0\0\0\0\0\x80\x10\0\0\x51\0\0\0\x80\
-\0\0\0\x88\x10\0\0\x51\0\0\0\xc0\0\0\0\x97\x10\0\0\x54\0\0\0\0\x01\0\0\x1b\x02\
-\0\0\x60\0\0\0\x20\x01\0\0\xa2\x10\0\0\x60\0\0\0\x30\x01\0\0\xaa\x10\0\0\x6f\0\
-\0\0\x40\x01\0\0\0\0\0\0\0\0\0\x02\x6e\0\0\0\xaf\x10\0\0\x10\0\0\x84\xe0\0\0\0\
-\xa4\x0f\0\0\x64\0\0\0\0\0\0\0\xbf\x10\0\0\x68\0\0\0\xc0\0\0\0\xca\x10\0\0\x68\
-\0\0\0\0\x01\0\0\xd6\x10\0\0\x68\0\0\0\x40\x01\0\0\xe0\x10\0\0\x68\0\0\0\x80\
-\x01\0\0\xe6\x10\0\0\x68\0\0\0\xc0\x01\0\0\xf1\x10\0\0\x71\0\0\0\0\x02\0\0\xf9\
-\x10\0\0\x68\0\0\0\x40\x02\0\0\xb8\x01\0\0\x54\0\0\0\x80\x02\0\0\x02\x11\0\0\
-\x54\0\0\0\xa0\x02\0\x01\x0f\x11\0\0\x54\0\0\0\xa1\x02\0\x01\x1a\x11\0\0\x54\0\
-\0\0\xa2\x02\0\x01\x2c\x11\0\0\x54\0\0\0\xa3\x02\0\x01\x37\x11\0\0\x74\0\0\0\
-\xc0\x02\0\0\x40\x11\0\0\x74\0\0\0\xc0\x04\0\0\x4f\x11\0\0\x7f\0\0\0\xc0\x06\0\
-\0\x55\x11\0\0\0\0\0\x08\x72\0\0\0\x59\x11\0\0\0\0\0\x08\x73\0\0\0\x5f\x11\0\0\
-\0\0\0\x01\x08\0\0\0\x40\0\0\x01\x69\x11\0\0\x08\0\0\x04\x40\0\0\0\x71\x11\0\0\
-\x75\0\0\0\0\0\0\0\x76\x11\0\0\x76\0\0\0\0\x01\0\0\x83\x11\0\0\x77\0\0\0\x40\
-\x01\0\0\x8c\x11\0\0\x7b\0\0\0\x80\x01\0\0\x91\x11\0\0\x7c\0\0\0\xc0\x01\0\0\
-\x97\x11\0\0\x7c\0\0\0\xc8\x01\0\0\x9e\x11\0\0\x7c\0\0\0\xd0\x01\0\0\xa6\x11\0\
-\0\x7c\0\0\0\xd8\x01\0\0\xae\x11\0\0\x02\0\0\x04\x20\0\0\0\x71\x11\0\0\x64\0\0\
-\0\0\0\0\0\xbe\x11\0\0\x76\0\0\0\xc0\0\0\0\xc6\x11\0\0\0\0\0\x08\x71\0\0\0\0\0\
-\0\0\0\0\0\x02\x78\0\0\0\0\0\0\0\x01\0\0\x0d\x79\0\0\0\0\0\0\0\x7a\0\0\0\xce\
-\x11\0\0\x02\0\0\x06\x04\0\0\0\xde\x11\0\0\0\0\0\0\xf0\x11\0\0\x01\0\0\0\0\0\0\
-\0\0\0\0\x02\x74\0\0\0\0\0\0\0\0\0\0\x02\xf7\x01\0\0\0\x12\0\0\0\0\0\x08\x7d\0\
-\0\0\x03\x12\0\0\0\0\0\x08\x7e\0\0\0\x08\x12\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\0\
-\0\0\0\0\0\0\0\x02\x70\0\0\0\0\0\0\0\0\0\0\x02\x81\0\0\0\0\0\0\0\0\0\0\x0a\x1a\
-\x02\0\0\0\0\0\0\0\0\0\x02\x20\x02\0\0\x16\x12\0\0\x1c\0\0\x04\0\x01\0\0\x27\
-\x12\0\0\x68\0\0\0\0\0\0\0\x32\x12\0\0\x68\0\0\0\x40\0\0\0\x3b\x12\0\0\x68\0\0\
-\0\x80\0\0\0\x46\x12\0\0\x68\0\0\0\xc0\0\0\0\x4f\x12\0\0\x68\0\0\0\0\x01\0\0\
-\x5c\x12\0\0\x68\0\0\0\x40\x01\0\0\x67\x12\0\0\x68\0\0\0\x80\x01\0\0\x73\x12\0\
-\0\x68\0\0\0\xc0\x01\0\0\x7d\x12\0\0\x71\0\0\0\0\x02\0\0\x8f\x12\0\0\x68\0\0\0\
-\x40\x02\0\0\x9b\x12\0\0\x68\0\0\0\x80\x02\0\0\xa5\x12\0\0\x71\0\0\0\xc0\x02\0\
-\0\xb7\x12\0\0\x68\0\0\0\0\x03\0\0\xc0\x12\0\0\x68\0\0\0\x40\x03\0\0\xca\x12\0\
-\0\x68\0\0\0\x80\x03\0\0\xdd\x12\0\0\x68\0\0\0\xc0\x03\0\0\xf9\x12\0\0\x68\0\0\
-\0\0\x04\0\0\x16\x13\0\0\x68\0\0\0\x40\x04\0\0\x2f\x13\0\0\x68\0\0\0\x80\x04\0\
-\0\x44\x13\0\0\x68\0\0\0\xc0\x04\0\0\x4f\x13\0\0\x68\0\0\0\0\x05\0\0\x5f\x13\0\
-\0\x68\0\0\0\x40\x05\0\0\x72\x13\0\0\x68\0\0\0\x80\x05\0\0\x83\x13\0\0\x68\0\0\
-\0\xc0\x05\0\0\x95\x13\0\0\x68\0\0\0\0\x06\0\0\xa7\x13\0\0\x68\0\0\0\x40\x06\0\
-\0\xc2\x13\0\0\x68\0\0\0\x80\x06\0\0\xd5\x13\0\0\x68\0\0\0\xc0\x06\0\0\0\0\0\0\
-\0\0\0\x02\x85\0\0\0\0\0\0\0\0\0\0\x0a\x86\0\0\0\xe5\x13\0\0\0\0\0\x08\x88\0\0\
-\0\0\0\0\0\0\0\0\x02\x86\0\0\0\xef\x13\0\0\x01\0\0\x04\x10\0\0\0\xf7\x13\0\0\
-\x89\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x51\0\0\0\x04\0\0\0\x02\0\0\0\xfc\
-\x13\0\0\x02\0\0\x05\x04\0\0\0\x08\x14\0\0\x8b\0\0\0\0\0\0\0\x0a\x14\0\0\x52\0\
-\0\0\0\0\0\0\0\0\0\0\x04\0\0\x04\x04\0\0\0\x5b\x07\0\0\x7c\0\0\0\0\0\0\0\x0c\
-\x14\0\0\x7c\0\0\0\x08\0\0\0\x14\x14\0\0\x7c\0\0\0\x10\0\0\0\x1d\x14\0\0\x7c\0\
-\0\0\x18\0\0\0\0\0\0\0\0\0\0\x02\x14\x02\0\0\xf7\x03\0\0\x04\0\0\x04\x20\0\0\0\
-\x25\x14\0\0\x51\0\0\0\0\0\0\0\x2c\x14\0\0\x4c\0\0\0\x40\0\0\0\x36\x14\0\0\x4c\
-\0\0\0\x80\0\0\0\x43\x14\0\0\x4c\0\0\0\xc0\0\0\0\x4f\x14\0\0\x03\0\0\x04\x28\0\
-\0\0\x21\x02\0\0\x02\0\0\0\0\0\0\0\x5a\x14\0\0\x66\0\0\0\x40\0\0\0\x64\x14\0\0\
-\x66\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\x02\x02\0\0\x6e\x14\0\0\x02\0\0\x04\x14\
-\0\0\0\x7c\x14\0\0\x02\0\0\0\0\0\0\0\x83\x14\0\0\x06\0\0\0\x20\0\0\0\x74\x05\0\
-\0\x03\0\0\x04\x38\0\0\0\x89\x14\0\0\x51\0\0\0\0\0\0\0\x93\x14\0\0\x92\0\0\0\
-\x40\0\0\0\0\0\0\0\x96\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x93\0\0\0\0\0\0\0\x01\
-\0\0\x0d\x94\0\0\0\0\0\0\0\x95\0\0\0\x96\x14\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\
-\x01\0\0\0\0\0\0\0\x02\x91\0\0\0\0\0\0\0\x03\0\0\x05\x28\0\0\0\x9b\x14\0\0\x97\
-\0\0\0\0\0\0\0\xa1\x14\0\0\x99\0\0\0\0\0\0\0\xab\x14\0\0\xa0\0\0\0\0\0\0\0\0\0\
-\0\0\x06\0\0\x04\x28\0\0\0\xb0\x14\0\0\x98\0\0\0\0\0\0\0\xb6\x14\0\0\x52\0\0\0\
-\x40\0\0\0\xb8\x01\0\0\x52\0\0\0\x60\0\0\0\xba\x14\0\0\x52\0\0\0\x80\0\0\0\xc1\
-\x14\0\0\x68\0\0\0\xc0\0\0\0\xc6\x14\0\0\x98\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\x02\
-\x52\0\0\0\0\0\0\0\x04\0\0\x04\x18\0\0\0\xcd\x14\0\0\x9a\0\0\0\0\0\0\0\x19\0\0\
-\0\x9c\0\0\0\x20\0\0\0\0\0\0\0\x9d\0\0\0\x40\0\0\0\xbe\x11\0\0\x68\0\0\0\x80\0\
-\0\0\xd5\x14\0\0\0\0\0\x08\x9b\0\0\0\xdf\x14\0\0\0\0\0\x08\x02\0\0\0\xf2\x14\0\
-\0\x03\0\0\x06\x04\0\0\0\0\x15\0\0\0\0\0\0\x08\x15\0\0\x01\0\0\0\x12\x15\0\0\
-\x02\0\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\x1c\x15\0\0\x9e\0\0\0\0\0\0\0\x21\x15\
-\0\0\x9f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xe3\x01\0\0\0\0\0\0\0\0\0\x02\x07\x02\
-\0\0\0\0\0\0\x05\0\0\x04\x20\0\0\0\x2d\x15\0\0\xa1\0\0\0\0\0\0\0\x32\x15\0\0\
-\x02\0\0\0\x40\0\0\0\x37\x15\0\0\x02\0\0\0\x60\0\0\0\x43\x15\0\0\x51\0\0\0\x80\
-\0\0\0\x4a\x15\0\0\x51\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\x13\x02\0\0\x52\x15\0\
-\0\0\0\0\x08\xa3\0\0\0\x58\x15\0\0\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\x02\x0f\
-\x02\0\0\x67\x15\0\0\x02\0\0\x04\x10\0\0\0\xc3\x0e\0\0\xa6\0\0\0\0\0\0\0\x72\
-\x15\0\0\xa7\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\xa5\0\0\0\0\0\0\0\0\0\0\x02\xa6\
-\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xa5\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\
-\x02\xed\x01\0\0\0\0\0\0\0\0\0\x02\x02\0\0\0\x56\x06\0\0\x03\0\0\x04\x50\0\0\0\
-\x44\x06\0\0\x68\0\0\0\0\0\0\0\x4a\x06\0\0\x68\0\0\0\x40\0\0\0\x78\x15\0\0\xac\
-\0\0\0\x80\0\0\0\x7d\x15\0\0\0\0\0\x08\xad\0\0\0\x8c\x15\0\0\x05\0\0\x04\x40\0\
-\0\0\x99\x15\0\0\xae\0\0\0\0\0\0\0\xa2\x15\0\0\x54\0\0\0\x20\0\0\0\xa8\x15\0\0\
-\x54\0\0\0\x40\0\0\0\xb2\x15\0\0\x55\0\0\0\x80\0\0\0\xb8\x15\0\0\xb3\0\0\0\xc0\
-\0\0\0\xc0\x15\0\0\0\0\0\x08\xaf\0\0\0\xd0\x15\0\0\x01\0\0\x04\x04\0\0\0\0\0\0\
-\0\xb0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\x05\x04\0\0\0\xb6\x14\0\0\x58\0\0\0\0\0\0\
-\0\0\0\0\0\xb1\0\0\0\0\0\0\0\0\0\0\0\xb2\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x02\
-\0\0\0\xda\x15\0\0\x7c\0\0\0\0\0\0\0\x7e\x07\0\0\x7c\0\0\0\x08\0\0\0\0\0\0\0\
-\x02\0\0\x04\x04\0\0\0\xe1\x15\0\0\x5e\0\0\0\0\0\0\0\xf0\x15\0\0\x5e\0\0\0\x10\
-\0\0\0\xf5\x15\0\0\x06\0\0\x04\x28\0\0\0\x01\x16\0\0\xb4\0\0\0\0\0\0\0\x05\x16\
-\0\0\xc1\0\0\0\x40\0\0\0\x11\x16\0\0\xbe\0\0\0\xc0\0\0\0\x16\x16\0\0\x7c\0\0\0\
-\0\x01\0\0\x26\x16\0\0\x7c\0\0\0\x08\x01\0\0\x36\x16\0\0\x7c\0\0\0\x10\x01\0\0\
-\0\0\0\0\0\0\0\x02\xfd\x01\0\0\0\0\0\0\0\0\0\x02\xb6\0\0\0\x40\x16\0\0\x0e\0\0\
-\x04\xc0\0\0\0\x4b\x16\0\0\xa5\0\0\0\0\0\0\0\x56\x16\0\0\x66\0\0\0\x80\0\0\0\
-\x61\x16\0\0\x66\0\0\0\0\x01\0\0\x6d\x16\0\0\x66\0\0\0\x80\x01\0\0\x01\x16\0\0\
-\xb7\0\0\0\0\x02\0\0\x7a\x16\0\0\x54\0\0\0\x40\x02\0\0\x83\x16\0\0\x54\0\0\0\
-\x60\x02\0\0\x8e\x16\0\0\x51\0\0\0\x80\x02\0\0\x99\x16\0\0\xbd\0\0\0\xc0\x02\0\
-\0\xa6\x16\0\0\x02\0\0\0\x40\x05\0\0\x11\x16\0\0\xbe\0\0\0\x80\x05\0\0\x26\x16\
-\0\0\x7c\0\0\0\xc0\x05\0\0\x16\x16\0\0\x7c\0\0\0\xc8\x05\0\0\x36\x16\0\0\x7c\0\
-\0\0\xd0\x05\0\0\0\0\0\0\0\0\0\x02\xb8\0\0\0\0\0\0\0\0\0\0\x0a\xfe\x01\0\0\0\0\
-\0\0\0\0\0\x02\xba\0\0\0\0\0\0\0\0\0\0\x0a\xbb\0\0\0\xb3\x16\0\0\x04\0\0\x04\
-\x18\0\0\0\x4b\x16\0\0\xa5\0\0\0\0\0\0\0\xbe\x16\0\0\x52\0\0\0\x80\0\0\0\xc3\
-\x16\0\0\x52\0\0\0\xa0\0\0\0\xce\x16\0\0\xbc\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x51\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xb9\0\0\0\x04\0\
-\0\0\x0a\0\0\0\0\0\0\0\0\0\0\x02\xbf\0\0\0\0\0\0\0\0\0\0\x0a\xc0\0\0\0\xd6\x16\
-\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\xb5\0\0\0\x04\0\
-\0\0\x02\0\0\0\x9a\x06\0\0\x03\0\0\x04\x50\0\0\0\xdb\x16\0\0\xc7\0\0\0\0\0\0\0\
-\xe1\x16\0\0\x54\0\0\0\x40\x02\0\0\xef\x16\0\0\x54\0\0\0\x60\x02\0\0\xfd\x16\0\
-\0\x02\0\0\x04\x18\0\0\0\x11\x17\0\0\x68\0\0\0\0\0\0\0\x19\x17\0\0\xc4\0\0\0\
-\x40\0\0\0\x20\x17\0\0\x01\0\0\x04\x10\0\0\0\x30\x17\0\0\xc5\0\0\0\0\0\0\0\x38\
-\x17\0\0\x02\0\0\x04\x10\0\0\0\x30\x17\0\0\xc6\0\0\0\0\0\0\0\x47\x17\0\0\x65\0\
-\0\0\x40\0\0\0\x30\x17\0\0\x01\0\0\x04\x08\0\0\0\xa4\x0f\0\0\x65\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x03\0\0\0\0\xc3\0\0\0\x04\0\0\0\x03\0\0\0\xaa\x06\0\0\x02\0\0\
-\x04\x18\0\0\0\x53\x17\0\0\xc9\0\0\0\0\0\0\0\x58\x17\0\0\x54\0\0\0\x80\0\0\0\
-\x62\x17\0\0\x02\0\0\x04\x10\0\0\0\xc3\x0e\0\0\xca\0\0\0\0\0\0\0\x70\x17\0\0\
-\xcb\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\xc9\0\0\0\0\0\0\0\0\0\0\x02\xcc\0\0\0\0\
-\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\xca\0\0\0\0\0\0\0\0\0\0\x02\xce\0\0\0\0\0\0\
-\0\0\0\0\x0a\xee\x01\0\0\0\0\0\0\0\0\0\x02\xfc\x01\0\0\0\0\0\0\0\0\0\x03\0\0\0\
-\0\xc0\0\0\0\x04\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\x02\x04\x02\0\0\x75\x17\0\0\x01\
-\0\0\x04\x08\0\0\0\x7e\x17\0\0\xd3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x1c\x02\0\0\
-\x88\x17\0\0\x01\0\0\x04\x10\0\0\0\x91\x17\0\0\x66\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x02\xf3\x01\0\0\0\0\0\0\0\0\0\x02\xf2\x01\0\0\0\0\0\0\0\0\0\x02\xfa\x01\0\0\0\
-\0\0\0\0\0\0\x02\x05\x02\0\0\0\0\0\0\0\0\0\x02\x1e\x02\0\0\0\0\0\0\0\0\0\x02\
-\x1d\x02\0\0\x9b\x17\0\0\0\0\0\x08\xdc\0\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\xa4\
-\x17\0\0\xdd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x51\0\0\0\x04\0\0\0\x01\0\
-\0\0\xa8\x17\0\0\x02\0\0\x04\x18\0\0\0\xb3\x17\0\0\x66\0\0\0\0\0\0\0\x4c\x07\0\
-\0\xdb\0\0\0\x80\0\0\0\xb8\x17\0\0\0\0\0\x08\xe0\0\0\0\xbf\x17\0\0\0\0\0\x08\
-\xe1\0\0\0\xcf\x17\0\0\0\0\0\x08\x51\0\0\0\0\0\0\0\0\0\0\x02\xe4\x01\0\0\xe0\
-\x17\0\0\0\0\0\x08\xe4\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\0\xb6\x14\0\0\xe5\0\0\
-\0\0\0\0\0\xe7\x17\0\0\0\0\0\x08\xe6\0\0\0\xed\x17\0\0\0\0\0\x08\x54\0\0\0\xd5\
-\x07\0\0\x03\0\0\x04\x10\0\0\0\xfe\x17\0\0\x02\0\0\0\0\0\0\0\x03\x18\0\0\x58\0\
-\0\0\x20\0\0\0\x10\x18\0\0\xe8\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x1b\x02\0\0\
-\x17\x18\0\0\x04\0\0\x04\x20\0\0\0\x2d\x18\0\0\xea\0\0\0\0\0\0\0\x36\x18\0\0\
-\x51\0\0\0\x40\0\0\0\x3d\x18\0\0\x51\0\0\0\x80\0\0\0\x41\x18\0\0\xeb\0\0\0\xc0\
-\0\0\0\0\0\0\0\0\0\0\x02\xc0\0\0\0\x4d\x18\0\0\0\0\0\x08\xec\0\0\0\x52\x18\0\0\
-\0\0\0\x01\x01\0\0\0\x08\0\0\x04\x58\x18\0\0\0\0\0\x08\xee\0\0\0\x63\x18\0\0\
-\x01\0\0\x04\x40\0\0\0\0\0\0\0\xef\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\x40\0\0\0\
-\x6c\x18\0\0\xad\0\0\0\0\0\0\0\0\0\0\0\xf0\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\
-\x40\0\0\0\x72\x18\0\0\xf1\0\0\0\0\0\0\0\xb8\x15\0\0\xb3\0\0\0\xc0\0\0\0\0\0\0\
-\0\0\0\0\x03\0\0\0\0\x7c\0\0\0\x04\0\0\0\x18\0\0\0\x7c\x18\0\0\x01\0\0\x04\x08\
-\0\0\0\xc3\x0e\0\0\xf3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xf2\0\0\0\0\0\0\0\0\0\0\
-\x02\x19\x02\0\0\0\0\0\0\0\0\0\x02\x03\x02\0\0\x88\x18\0\0\x09\0\0\x04\x38\0\0\
-\0\x98\x18\0\0\x54\0\0\0\0\0\0\0\xa3\x18\0\0\x51\0\0\0\x40\0\0\0\xb5\x18\0\0\
-\x51\0\0\0\x80\0\0\0\xc8\x18\0\0\x54\0\0\0\xc0\0\0\0\xdd\x18\0\0\x54\0\0\0\xe0\
-\0\0\0\xf3\x18\0\0\x51\0\0\0\0\x01\0\0\x06\x19\0\0\x51\0\0\0\x40\x01\0\0\x18\
-\x19\0\0\x54\0\0\0\x80\x01\0\0\x2e\x19\0\0\x54\0\0\0\xa0\x01\0\0\x43\x19\0\0\
-\x0c\0\0\x84\x28\0\0\0\x4d\x19\0\0\x68\0\0\0\0\0\0\0\x5c\x19\0\0\x51\0\0\0\x40\
-\0\0\0\x67\x19\0\0\xf8\0\0\0\x80\0\0\0\x70\x19\0\0\xf8\0\0\0\xc0\0\0\0\x7a\x19\
-\0\0\x54\0\0\0\0\x01\0\x0d\x84\x19\0\0\x54\0\0\0\x0d\x01\0\x02\x90\x19\0\0\x54\
-\0\0\0\x0f\x01\0\x01\x98\x19\0\0\x54\0\0\0\x10\x01\0\x02\x9d\x19\0\0\x54\0\0\0\
-\x12\x01\0\x01\xa3\x19\0\0\x54\0\0\0\x13\x01\0\x01\xb0\x19\0\0\x54\0\0\0\x14\
-\x01\0\x0c\xbb\x19\0\0\x54\0\0\0\x20\x01\0\0\0\0\0\0\0\0\0\x02\xb3\0\0\0\0\0\0\
-\0\0\0\0\x03\0\0\0\0\xf7\0\0\0\x04\0\0\0\x30\0\0\0\0\0\0\0\0\0\0\x02\xe6\x01\0\
-\0\0\0\0\0\0\0\0\x02\xe7\x01\0\0\0\0\0\0\0\0\0\x02\x15\x02\0\0\0\0\0\0\0\0\0\
-\x02\xe5\x01\0\0\0\0\0\0\0\0\0\x02\xf9\x01\0\0\0\0\0\0\0\0\0\x02\xeb\x01\0\0\0\
-\0\0\0\0\0\0\x02\x01\x01\0\0\xc5\x19\0\0\0\0\0\x08\xfb\x01\0\0\xd6\x19\0\0\x07\
-\0\0\x04\x38\0\0\0\xe9\x19\0\0\x68\0\0\0\0\0\0\0\xef\x19\0\0\x68\0\0\0\x40\0\0\
-\0\xf5\x19\0\0\x68\0\0\0\x80\0\0\0\xfb\x19\0\0\x68\0\0\0\xc0\0\0\0\x01\x1a\0\0\
-\x68\0\0\0\0\x01\0\0\x0c\x1a\0\0\x68\0\0\0\x40\x01\0\0\x18\x1a\0\0\x68\0\0\0\
-\x80\x01\0\0\x2e\x1a\0\0\0\0\0\x08\x04\x01\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\
-\xf7\x13\0\0\xdd\0\0\0\0\0\0\0\x39\x1a\0\0\0\0\0\x08\x06\x01\0\0\x4d\x1a\0\0\
-\x02\0\0\x04\x38\0\0\0\x5f\x1a\0\0\x07\x01\0\0\0\0\0\0\x78\x15\0\0\x09\x01\0\0\
-\x80\x01\0\0\x68\x1a\0\0\0\0\0\x08\x08\x01\0\0\x5f\x1a\0\0\x02\0\0\x04\x30\0\0\
-\0\x73\x1a\0\0\x54\0\0\0\0\0\0\0\xb8\x15\0\0\xb3\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\
-\x02\xed\0\0\0\0\0\0\0\0\0\0\x02\xef\x01\0\0\0\0\0\0\0\0\0\x02\x17\x02\0\0\0\0\
-\0\0\0\0\0\x02\xf6\x01\0\0\x7c\x1a\0\0\x06\0\0\x04\x90\0\0\0\xb2\x15\0\0\x0e\
-\x01\0\0\0\0\0\0\x82\x1a\0\0\xac\0\0\0\x40\0\0\0\x8c\x1a\0\0\x11\x01\0\0\x40\
-\x02\0\0\x90\x1a\0\0\x66\0\0\0\x80\x02\0\0\xa2\x15\0\0\x55\0\0\0\0\x03\0\0\xb8\
-\x15\0\0\xb3\0\0\0\x40\x03\0\0\x9a\x1a\0\0\0\0\0\x08\x0f\x01\0\0\xa8\x1a\0\0\0\
-\0\0\x08\x10\x01\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\x8f\x0e\0\0\x71\0\0\0\0\0\0\
-\0\xb3\x1a\0\0\x01\0\0\x04\x04\0\0\0\xf0\x15\0\0\x58\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x02\x13\x01\0\0\xc9\x1a\0\0\x1e\0\0\x04\xc0\x01\0\0\xdc\x1a\0\0\x14\x01\0\0\
-\0\0\0\0\x78\x15\0\0\xac\0\0\0\x40\0\0\0\x7c\x1a\0\0\x0d\x01\0\0\x40\x02\0\0\
-\xe0\x1a\0\0\x66\0\0\0\xc0\x06\0\0\xf0\x1a\0\0\x15\x01\0\0\x40\x07\0\0\xfe\x1a\
-\0\0\x15\x01\0\0\xc0\x07\0\0\x0e\x1b\0\0\x66\0\0\0\x40\x08\0\0\x19\x1b\0\0\x66\
-\0\0\0\xc0\x08\0\0\x27\x1b\0\0\x66\0\0\0\x40\x09\0\0\x37\x1b\0\0\x02\0\0\0\xc0\
-\x09\0\0\x41\x1b\0\0\x02\0\0\0\xe0\x09\0\0\x4b\x1b\0\0\x02\0\0\0\0\x0a\0\0\x53\
-\x1b\0\0\x02\0\0\0\x20\x0a\0\0\x5d\x1b\0\0\x02\0\0\0\x40\x0a\0\0\x65\x1b\0\0\
-\x02\0\0\0\x60\x0a\0\0\x6d\x1b\0\0\x02\0\0\0\x80\x0a\0\0\x7c\x1b\0\0\x02\0\0\0\
-\xa0\x0a\0\0\x8d\x1b\0\0\x56\0\0\0\xc0\x0a\0\0\x96\x1b\0\0\x61\0\0\0\0\x0b\0\0\
-\xc1\x14\0\0\x68\0\0\0\x40\x0b\0\0\x9b\x1b\0\0\x68\0\0\0\x80\x0b\0\0\xa5\x1b\0\
-\0\x68\0\0\0\xc0\x0b\0\0\xb0\x1b\0\0\x12\x01\0\0\0\x0c\0\0\xbb\x1b\0\0\x68\0\0\
-\0\x40\x0c\0\0\xc6\x1b\0\0\x68\0\0\0\x80\x0c\0\0\xbb\x19\0\0\x02\0\0\0\xc0\x0c\
-\0\0\xd1\x1b\0\0\x02\0\0\0\xe0\x0c\0\0\xdc\x1b\0\0\x55\0\0\0\0\x0d\0\0\x62\x17\
-\0\0\xc9\0\0\0\x40\x0d\0\0\xea\x1b\0\0\x16\x01\0\0\xc0\x0d\0\0\0\0\0\0\0\0\0\
-\x02\x12\x02\0\0\xf5\x1b\0\0\x02\0\0\x04\x10\0\0\0\x07\x1c\0\0\xc6\0\0\0\0\0\0\
-\0\x0c\x1c\0\0\x68\0\0\0\x40\0\0\0\x12\x1c\0\0\0\0\0\x08\x17\x01\0\0\0\0\0\0\
-\x01\0\0\x04\x08\0\0\0\x1a\x1c\0\0\x0e\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\
-\0\x12\x01\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\x02\x01\x02\0\0\x1c\x1c\0\0\0\
-\0\0\x01\x02\0\0\0\x10\0\0\x01\0\0\0\0\0\0\0\x02\x06\x02\0\0\0\0\0\0\0\0\0\x02\
-\x51\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x51\0\0\0\x04\0\0\0\x03\0\0\0\0\0\0\0\0\0\
-\0\x02\x18\x02\0\0\x22\x1c\0\0\x03\0\0\x04\x18\0\0\0\x37\x1c\0\0\x20\x01\0\0\0\
-\0\0\0\x3c\x1c\0\0\xeb\0\0\0\x80\0\0\0\x4b\x1c\0\0\xeb\0\0\0\x88\0\0\0\x54\x1c\
-\0\0\x01\0\0\x04\x10\0\0\0\xef\x13\0\0\x88\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\
-\x10\0\0\0\x6e\x1c\0\0\x56\0\0\0\0\0\0\0\x78\x1c\0\0\xc9\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x02\x11\x02\0\0\x7c\x1c\0\0\x03\0\0\x04\x10\0\0\0\x86\x1c\0\0\x24\x01\0\
-\0\0\0\0\0\x36\x18\0\0\x53\0\0\0\x40\0\0\0\x8b\x1c\0\0\x53\0\0\0\x60\0\0\0\0\0\
-\0\0\0\0\0\x02\x08\x02\0\0\0\0\0\0\0\0\0\x02\x1f\x02\0\0\0\0\0\0\0\0\0\x02\xf5\
-\x01\0\0\0\0\0\0\0\0\0\x02\0\x02\0\0\x90\x1c\0\0\0\0\0\x08\x54\0\0\0\0\0\0\0\0\
-\0\0\x02\x16\x02\0\0\0\0\0\0\0\0\0\x02\x22\x02\0\0\x11\x0d\0\0\0\0\0\x04\0\0\0\
-\0\x96\x1c\0\0\x05\0\0\x04\x50\0\0\0\xa1\x1c\0\0\xa5\0\0\0\0\0\0\0\xbe\x11\0\0\
-\x51\0\0\0\x80\0\0\0\x83\x11\0\0\x2d\x01\0\0\xc0\0\0\0\xb8\x01\0\0\x52\0\0\0\0\
-\x01\0\0\xf5\x15\0\0\xb3\0\0\0\x40\x01\0\0\0\0\0\0\0\0\0\x02\x2e\x01\0\0\0\0\0\
-\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x2f\x01\0\0\0\0\0\0\0\0\0\x02\x2c\x01\0\0\0\0\0\
-\0\0\0\0\x02\x23\x02\0\0\0\0\0\0\0\0\0\x02\xe8\x01\0\0\0\0\0\0\0\0\0\x02\xea\
-\x01\0\0\xa7\x1c\0\0\x01\0\0\x04\x08\0\0\0\xb2\x1c\0\0\x5c\0\0\0\0\0\0\0\xb8\
-\x1c\0\0\x14\0\0\x84\x40\x11\0\0\xc6\x1c\0\0\x36\x01\0\0\0\0\0\0\xd0\x1c\0\0\
-\x51\0\0\0\xc0\0\0\0\xd3\x1c\0\0\x60\0\0\0\0\x01\0\0\xd6\x1c\0\0\x60\0\0\0\x10\
-\x01\0\0\xd9\x1c\0\0\x60\0\0\0\x20\x01\0\0\xe1\x1c\0\0\x60\0\0\0\x30\x01\0\0\
-\xe9\x1c\0\0\x51\0\0\0\x40\x01\0\0\xf0\x1c\0\0\x51\0\0\0\x80\x01\0\0\xf7\x1c\0\
-\0\x86\x01\0\0\xc0\x01\0\0\x02\x1d\0\0\x51\0\0\0\xc0\x02\0\0\x0e\x1d\0\0\x51\0\
-\0\0\0\x03\0\0\x19\x1d\0\0\x51\0\0\0\x40\x03\0\0\x1d\x1d\0\0\x51\0\0\0\x80\x03\
-\0\0\x25\x1d\0\0\x51\0\0\0\xc0\x03\0\0\x30\x1d\0\0\x87\x01\0\0\0\x04\0\0\x3a\
-\x1d\0\0\x51\0\0\0\x40\x04\0\0\x44\x1d\0\0\x54\0\0\0\x80\x04\0\x01\x4e\x1d\0\0\
-\x54\0\0\0\x81\x04\0\x01\x61\x1d\0\0\x52\0\0\0\xa0\x04\0\0\x66\x1d\0\0\x88\x01\
-\0\0\0\x06\0\0\x6a\x1d\0\0\x0d\0\0\x84\x08\0\0\0\x76\x1d\0\0\x5e\0\0\0\0\0\0\0\
-\x7d\x1d\0\0\x5e\0\0\0\x10\0\0\0\x83\x1d\0\0\x5e\0\0\0\x20\0\0\x08\x19\0\0\0\
-\x5e\0\0\0\x28\0\0\x04\x0a\x14\0\0\x5e\0\0\0\x2c\0\0\x01\x89\x1d\0\0\x5e\0\0\0\
-\x2d\0\0\x02\x8d\x1d\0\0\x5e\0\0\0\x2f\0\0\x01\x8f\x1d\0\0\x5e\0\0\0\x30\0\0\
-\x04\x96\x1d\0\0\x5e\0\0\0\x34\0\0\x01\x9a\x1d\0\0\x5e\0\0\0\x35\0\0\x01\x9c\
-\x1d\0\0\x5e\0\0\0\x36\0\0\x01\x9e\x1d\0\0\x5e\0\0\0\x37\0\0\x01\xa0\x1d\0\0\
-\x5e\0\0\0\x38\0\0\x08\0\0\0\0\0\0\0\x03\0\0\0\0\x35\x01\0\0\x04\0\0\0\x03\0\0\
-\0\0\0\0\0\0\0\0\x02\x38\x01\0\0\xa6\x1d\0\0\x4b\0\0\x04\x08\x07\0\0\xb1\x1d\0\
-\0\x66\0\0\0\0\0\0\0\xbd\x1d\0\0\x66\0\0\0\x80\0\0\0\xca\x1d\0\0\x66\0\0\0\0\
-\x01\0\0\x0c\x0f\0\0\x64\0\0\0\x80\x01\0\0\xd6\x1d\0\0\x68\0\0\0\x40\x02\0\0\
-\xe2\x1d\0\0\x66\0\0\0\x80\x02\0\0\xf0\x1d\0\0\xa5\0\0\0\0\x03\0\0\xfc\x1d\0\0\
-\x66\0\0\0\x80\x03\0\0\x09\x1e\0\0\x02\0\0\0\0\x04\0\0\x15\x1e\0\0\x02\0\0\0\
-\x20\x04\0\0\x20\x1e\0\0\x02\0\0\0\x40\x04\0\0\xbc\x05\0\0\x37\x01\0\0\x80\x04\
-\0\0\xdc\x1a\0\0\x14\x01\0\0\xc0\x04\0\0\x2b\x1e\0\0\x55\0\0\0\0\x05\0\0\x91\
-\x11\0\0\x39\x01\0\0\x40\x05\0\0\x37\x1e\0\0\x54\0\0\0\x60\x05\0\0\x83\x14\0\0\
-\x3a\x01\0\0\x80\x05\0\0\x44\x1e\0\0\x0f\x01\0\0\xc0\x05\0\0\x50\x1e\0\0\x68\0\
-\0\0\0\x06\0\0\x63\x1e\0\0\x68\0\0\0\x40\x06\0\0\x76\x1e\0\0\x68\0\0\0\x80\x06\
-\0\0\x7d\x1e\0\0\x3c\x01\0\0\xc0\x06\0\0\x82\x1e\0\0\x5e\0\0\0\xc0\x0a\0\0\x8e\
-\x1e\0\0\x5e\0\0\0\xd0\x0a\0\0\x9d\x1e\0\0\x5e\0\0\0\xe0\x0a\0\0\xa7\x1e\0\0\
-\x42\x01\0\0\0\x0b\0\0\x74\x01\0\0\x12\x01\0\0\0\x11\0\0\x8d\x1b\0\0\x0e\x01\0\
-\0\x40\x11\0\0\xaa\x1e\0\0\x0f\x01\0\0\x80\x11\0\0\xc3\x1e\0\0\x0f\x01\0\0\xc0\
-\x11\0\0\xdc\x1e\0\0\x0d\x01\0\0\0\x12\0\0\xe8\x1e\0\0\x66\0\0\0\x80\x16\0\0\
-\xa4\x05\0\0\x37\x01\0\0\0\x17\0\0\xf3\x1e\0\0\x02\0\0\0\x40\x17\0\0\x3d\x0e\0\
-\0\x02\0\0\0\x60\x17\0\0\xf9\x1e\0\0\x66\0\0\0\x80\x17\0\0\xb2\x15\0\0\x61\0\0\
-\0\0\x18\0\0\x05\x1f\0\0\x0d\x01\0\0\x40\x18\0\0\x10\x1f\0\0\x58\0\0\0\xc0\x1c\
-\0\0\x1b\x1f\0\0\x53\x01\0\0\0\x1d\0\0\x1e\x1f\0\0\x66\0\0\0\x40\x1d\0\0\x27\
-\x1f\0\0\x51\0\0\0\xc0\x1d\0\0\x33\x1f\0\0\x02\0\0\0\0\x1e\0\0\x3f\x1f\0\0\x54\
-\x01\0\0\x40\x1e\0\0\x45\x1f\0\0\x56\x01\0\0\xc0\x20\0\0\x4c\x1f\0\0\x54\0\0\0\
-\0\x21\0\0\x5b\x1f\0\0\x54\0\0\0\x20\x21\0\0\x68\x1f\0\0\x54\0\0\0\x40\x21\0\0\
-\x78\x1f\0\0\x54\0\0\0\x60\x21\0\0\x88\x1f\0\0\x51\0\0\0\x80\x21\0\0\x95\x1f\0\
-\0\x57\x01\0\0\xc0\x21\0\0\xa1\x1f\0\0\xc9\0\0\0\xc0\x22\0\0\xae\x1f\0\0\x54\0\
-\0\0\x40\x23\0\0\xbb\x1f\0\0\x58\0\0\0\x60\x23\0\0\xc7\x1f\0\0\x5c\x01\0\0\x80\
-\x23\0\0\xd4\x1f\0\0\x5d\x01\0\0\x40\x26\0\0\xe7\x1f\0\0\x51\0\0\0\x80\x26\0\0\
-\xf8\x1f\0\0\x37\x01\0\0\xc0\x26\0\0\x02\x20\0\0\x5e\x01\0\0\0\x27\0\0\x62\x17\
-\0\0\xc9\0\0\0\x40\x27\0\0\x0a\x20\0\0\x60\x01\0\0\xc0\x27\0\0\x0d\x20\0\0\x68\
-\0\0\0\0\x28\0\0\x10\x20\0\0\x0f\x01\0\0\x40\x28\0\0\x1d\x20\0\0\x61\x01\0\0\
-\x80\x28\0\0\x23\x20\0\0\x63\x01\0\0\xc0\x28\0\0\x34\x20\0\0\x55\0\0\0\0\x29\0\
-\0\x4d\x20\0\0\x63\x01\0\0\x40\x29\0\0\x63\x20\0\0\x73\x01\0\0\x80\x29\0\0\x68\
-\x20\0\0\x68\0\0\0\xc0\x29\0\0\x73\x20\0\0\x74\x01\0\0\0\x2a\0\0\x10\x18\0\0\
-\x75\x01\0\0\x40\x2a\0\0\x7c\x20\0\0\x76\x01\0\0\x80\x2a\0\0\x87\x20\0\0\x85\
-\x01\0\0\x40\x37\0\0\x7e\x0d\0\0\x55\0\0\0\x80\x37\0\0\x8c\x20\0\0\x66\0\0\0\
-\xc0\x37\0\0\x94\x20\0\0\x06\0\0\x06\x04\0\0\0\xa5\x20\0\0\xfc\xff\xff\xff\xbb\
-\x20\0\0\xfd\xff\xff\xff\xd1\x20\0\0\xfe\xff\xff\xff\xe8\x20\0\0\xff\xff\xff\
-\xff\xfd\x20\0\0\0\0\0\0\x17\x21\0\0\x01\0\0\0\x2f\x21\0\0\0\0\0\x08\x3b\x01\0\
-\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\x1a\x1c\0\0\x16\x01\0\0\0\0\0\0\x39\x21\0\0\
-\x3b\0\0\x84\x80\0\0\0\x19\0\0\0\x53\0\0\0\0\0\0\0\x8b\x1c\0\0\x53\0\0\0\x20\0\
-\0\0\x49\x21\0\0\x69\0\0\0\x40\0\0\0\0\0\0\0\x3d\x01\0\0\x80\0\0\0\x50\x21\0\0\
-\x69\0\0\0\xc0\0\0\0\x5c\x21\0\0\x69\0\0\0\0\x01\0\0\x68\x21\0\0\x69\0\0\0\x40\
-\x01\0\x01\x71\x21\0\0\x69\0\0\0\x41\x01\0\x01\x79\x21\0\0\x69\0\0\0\x42\x01\0\
-\x01\x80\x21\0\0\x69\0\0\0\x43\x01\0\x01\x8a\x21\0\0\x69\0\0\0\x44\x01\0\x01\
-\x97\x21\0\0\x69\0\0\0\x45\x01\0\x01\xa6\x21\0\0\x69\0\0\0\x46\x01\0\x01\xb1\
-\x21\0\0\x69\0\0\0\x47\x01\0\x01\xbe\x21\0\0\x69\0\0\0\x48\x01\0\x01\xf0\x06\0\
-\0\x69\0\0\0\x49\x01\0\x01\xc3\x21\0\0\x69\0\0\0\x4a\x01\0\x01\xc8\x21\0\0\x69\
-\0\0\0\x4b\x01\0\x01\xd5\x21\0\0\x69\0\0\0\x4c\x01\0\x01\x96\x1b\0\0\x69\0\0\0\
-\x4d\x01\0\x01\xe4\x21\0\0\x69\0\0\0\x4e\x01\0\x01\xee\x21\0\0\x69\0\0\0\x4f\
-\x01\0\x02\xf9\x21\0\0\x69\0\0\0\x51\x01\0\x01\x03\x22\0\0\x69\0\0\0\x52\x01\0\
-\x01\x11\x22\0\0\x69\0\0\0\x53\x01\0\x01\x1e\x22\0\0\x69\0\0\0\x54\x01\0\x01\
-\x2c\x22\0\0\x69\0\0\0\x55\x01\0\x01\x45\x22\0\0\x69\0\0\0\x56\x01\0\x01\x5c\
-\x22\0\0\x69\0\0\0\x57\x01\0\x01\x62\x22\0\0\x69\0\0\0\x58\x01\0\x01\x6c\x22\0\
-\0\x69\0\0\0\x59\x01\0\x01\x78\x22\0\0\x69\0\0\0\x5a\x01\0\x01\x87\x22\0\0\x69\
-\0\0\0\x5b\x01\0\x01\x96\x22\0\0\x69\0\0\0\x5c\x01\0\x01\xa1\x22\0\0\x69\0\0\0\
-\x5d\x01\0\x01\xa9\x22\0\0\x69\0\0\0\x5e\x01\0\x01\xb3\x22\0\0\x69\0\0\0\x5f\
-\x01\0\x01\xbe\x22\0\0\x69\0\0\0\x60\x01\0\x01\xc5\x22\0\0\x69\0\0\0\x61\x01\0\
-\x01\xcf\x22\0\0\x69\0\0\0\x62\x01\0\x01\xd8\x22\0\0\x69\0\0\0\x63\x01\0\x01\
-\xe7\x22\0\0\x69\0\0\0\x64\x01\0\x01\xf6\x22\0\0\x69\0\0\0\x65\x01\0\x01\xfe\
-\x22\0\0\x69\0\0\0\x66\x01\0\x1a\0\0\0\0\x3e\x01\0\0\x80\x01\0\0\x0b\x23\0\0\
-\x53\0\0\0\xa0\x01\0\0\0\0\0\0\x3f\x01\0\0\xc0\x01\0\0\0\0\0\0\x40\x01\0\0\0\
-\x02\0\0\x13\x23\0\0\x69\0\0\0\x40\x02\0\0\x26\x23\0\0\x69\0\0\0\x80\x02\0\0\
-\x37\x23\0\0\x53\0\0\0\xc0\x02\0\0\xcd\x14\0\0\x41\x01\0\0\xe0\x02\0\0\x49\x23\
-\0\0\x69\0\0\0\0\x03\0\0\x5a\x23\0\0\x53\0\0\0\x40\x03\0\0\x68\x23\0\0\x5f\0\0\
-\0\x60\x03\0\0\x79\x23\0\0\x5f\0\0\0\x70\x03\0\0\x86\x23\0\0\x53\0\0\0\x80\x03\
-\0\0\x96\x23\0\0\x53\0\0\0\xa0\x03\0\0\xa3\x23\0\0\x69\0\0\0\xc0\x03\0\0\0\0\0\
-\0\x02\0\0\x05\x08\0\0\0\xac\x23\0\0\x69\0\0\0\0\0\0\0\xba\x23\0\0\x69\0\0\0\0\
-\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\xc6\x23\0\0\x53\0\0\0\0\0\0\0\xd4\x23\0\0\
-\x53\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x05\x08\0\0\0\xe5\x23\0\0\x69\0\0\0\0\0\0\0\
-\xed\x23\0\0\x69\0\0\0\0\0\0\0\xf9\x23\0\0\x69\0\0\0\0\0\0\0\x05\x24\0\0\x69\0\
-\0\0\0\0\0\0\0\0\0\0\x04\0\0\x05\x08\0\0\0\x0d\x24\0\0\x69\0\0\0\0\0\0\0\x14\
-\x24\0\0\x69\0\0\0\0\0\0\0\x20\x24\0\0\x69\0\0\0\0\0\0\0\x2d\x24\0\0\x69\0\0\0\
-\0\0\0\0\x35\x24\0\0\0\0\0\x08\x02\0\0\0\x3b\x24\0\0\x0c\0\0\x04\xc0\0\0\0\0\0\
-\0\0\x43\x01\0\0\0\0\0\0\x49\x24\0\0\x61\0\0\0\0\x03\0\0\xc7\x1f\0\0\x55\0\0\0\
-\x40\x03\0\0\xe7\x1f\0\0\x51\0\0\0\x80\x03\0\0\x91\x11\0\0\x02\0\0\0\xc0\x03\0\
-\0\x50\x24\0\0\x3a\x01\0\0\0\x04\0\0\xac\x23\0\0\x68\0\0\0\x40\x04\0\0\0\0\0\0\
-\x50\x01\0\0\x80\x04\0\0\x5b\x24\0\0\x68\0\0\0\0\x05\0\0\x6a\x24\0\0\x68\0\0\0\
-\x40\x05\0\0\x75\x24\0\0\x68\0\0\0\x80\x05\0\0\x85\x24\0\0\x68\0\0\0\xc0\x05\0\
-\0\0\0\0\0\x06\0\0\x05\x60\0\0\0\0\0\0\0\x44\x01\0\0\0\0\0\0\0\0\0\0\x46\x01\0\
-\0\0\0\0\0\0\0\0\0\x47\x01\0\0\0\0\0\0\0\0\0\0\x48\x01\0\0\0\0\0\0\0\0\0\0\x49\
-\x01\0\0\0\0\0\0\0\0\0\0\x4f\x01\0\0\0\0\0\0\0\0\0\0\x0a\0\0\x04\x60\0\0\0\x49\
-\x21\0\0\x68\0\0\0\0\0\0\0\x96\x24\0\0\x68\0\0\0\x40\0\0\0\x9f\x24\0\0\x51\0\0\
-\0\x80\0\0\0\xab\x24\0\0\x51\0\0\0\xc0\0\0\0\xb6\x24\0\0\x02\0\0\0\0\x01\0\0\
-\xc7\x24\0\0\x02\0\0\0\x20\x01\0\0\xcb\x24\0\0\x02\0\0\0\x40\x01\0\0\xb8\x01\0\
-\0\x02\0\0\0\x60\x01\0\0\xd4\x24\0\0\x45\x01\0\0\x80\x01\0\0\xde\x24\0\0\x45\
-\x01\0\0\x40\x02\0\0\xe9\x24\0\0\x04\0\0\x04\x18\0\0\0\x49\x21\0\0\x68\0\0\0\0\
-\0\0\0\xfd\x24\0\0\x54\0\0\0\x40\0\0\0\x01\x25\0\0\x02\0\0\0\x60\0\0\0\xc7\x24\
-\0\0\x02\0\0\0\x80\0\0\0\0\0\0\0\x01\0\0\x04\x40\0\0\0\x69\x11\0\0\x74\0\0\0\0\
-\0\0\0\0\0\0\0\x01\0\0\x04\x10\0\0\0\x07\x25\0\0\x66\0\0\0\0\0\0\0\0\0\0\0\x02\
-\0\0\x04\x10\0\0\0\x0f\x25\0\0\x68\0\0\0\0\0\0\0\x17\x25\0\0\x68\0\0\0\x40\0\0\
-\0\0\0\0\0\x02\0\0\x04\x28\0\0\0\x1c\x25\0\0\x4a\x01\0\0\0\0\0\0\x21\x25\0\0\
-\x4b\x01\0\0\xc0\0\0\0\x29\x25\0\0\x04\0\0\x04\x18\0\0\0\x3c\x25\0\0\x51\0\0\0\
-\0\0\0\0\x44\x25\0\0\x51\0\0\0\x40\0\0\0\x3d\x18\0\0\x7c\0\0\0\x80\0\0\0\x19\0\
-\0\0\x7c\0\0\0\x88\0\0\0\x49\x25\0\0\x02\0\0\x04\x10\0\0\0\x55\x25\0\0\x4c\x01\
-\0\0\0\0\0\0\xc3\x0e\0\0\x4e\x01\0\0\x40\0\0\0\x5b\x25\0\0\x01\0\0\x04\x08\0\0\
-\0\xc3\x0e\0\0\x4d\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x4c\x01\0\0\0\0\0\0\0\0\0\
-\x02\x4b\x01\0\0\0\0\0\0\x05\0\0\x04\x18\0\0\0\x66\x25\0\0\x7c\0\0\0\0\0\0\0\
-\x71\x25\0\0\x7c\0\0\0\x08\0\0\0\x7c\x25\0\0\x5e\0\0\0\x10\0\0\0\x84\x25\0\0\
-\x68\0\0\0\x40\0\0\0\x89\x25\0\0\x68\0\0\0\x80\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\
-\0\0\0\0\0\0\x51\x01\0\0\0\0\0\0\0\0\0\0\x52\x01\0\0\0\0\0\0\0\0\0\0\x02\0\0\
-\x04\x10\0\0\0\x8f\x25\0\0\x68\0\0\0\0\0\0\0\x9b\x25\0\0\x3a\x01\0\0\x40\0\0\0\
-\0\0\0\0\x02\0\0\x04\x10\0\0\0\xa7\x25\0\0\x68\0\0\0\0\0\0\0\xb4\x25\0\0\x68\0\
-\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x0b\x02\0\0\xc0\x25\0\0\0\0\0\x08\x55\x01\0\0\
-\xd2\x25\0\0\x02\0\0\x04\x50\0\0\0\x78\x15\0\0\xed\0\0\0\0\0\0\0\xe2\x25\0\0\
-\x66\0\0\0\0\x02\0\0\0\0\0\0\0\0\0\x02\xf1\x01\0\0\xe7\x25\0\0\x03\0\0\x04\x20\
-\0\0\0\x71\x11\0\0\x5a\0\0\0\0\0\0\0\x70\x17\0\0\x58\x01\0\0\x80\0\0\0\xf0\x25\
-\0\0\x5b\x01\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\x59\x01\0\0\0\0\0\0\x01\0\0\x0d\0\
-\0\0\0\0\0\0\0\x5a\x01\0\0\0\0\0\0\0\0\0\x02\x57\x01\0\0\xf8\x25\0\0\x01\0\0\
-\x04\x08\0\0\0\x96\x1b\0\0\x61\0\0\0\0\0\0\0\0\x26\0\0\x03\0\0\x04\x58\0\0\0\
-\xb3\x17\0\0\x66\0\0\0\0\0\0\0\x78\x15\0\0\xac\0\0\0\x80\0\0\0\x17\x26\0\0\x54\
-\0\0\0\x80\x02\0\0\0\0\0\0\0\0\0\x02\x09\x02\0\0\0\0\0\0\0\0\0\x02\x5f\x01\0\0\
-\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x37\x01\0\0\0\0\0\0\0\0\0\x02\x10\x02\0\0\
-\0\0\0\0\0\0\0\x02\x62\x01\0\0\0\0\0\0\x01\0\0\x0d\x68\0\0\0\0\0\0\0\0\0\0\0\
-\x27\x26\0\0\0\0\0\x08\x64\x01\0\0\0\0\0\0\0\0\0\x02\x65\x01\0\0\0\0\0\0\x03\0\
-\0\x0d\0\0\0\0\0\0\0\0\x37\x01\0\0\0\0\0\0\x66\x01\0\0\0\0\0\0\x72\x01\0\0\0\0\
-\0\0\0\0\0\x02\x67\x01\0\0\x3f\x26\0\0\x18\0\0\x04\0\x01\0\0\x50\x26\0\0\x68\0\
-\0\0\0\0\0\0\x5d\x26\0\0\x68\0\0\0\x40\0\0\0\x64\x26\0\0\x68\x01\0\0\x80\0\0\0\
-\x92\x0f\0\0\x69\x01\0\0\xc0\0\0\0\x6d\x26\0\0\x6b\x01\0\0\0\x01\0\0\x76\x26\0\
-\0\x68\0\0\0\x40\x01\0\0\x7a\x26\0\0\x68\0\0\0\x80\x01\0\0\x7f\x26\0\0\x6d\x01\
-\0\0\xc0\x01\0\0\x19\0\0\0\x68\0\0\0\0\x02\0\0\x83\x26\0\0\x68\0\0\0\x40\x02\0\
-\0\x86\x26\0\0\x6e\x01\0\0\x80\x02\0\0\xc1\x14\0\0\x68\0\0\0\xc0\x02\0\0\x0d\
-\x20\0\0\x68\0\0\0\0\x03\0\0\x90\x26\0\0\x68\0\0\0\x40\x03\0\0\x9a\x26\0\0\x6f\
-\x01\0\0\x80\x03\0\0\xa4\x26\0\0\x70\x01\0\0\xc0\x03\0\0\xae\x26\0\0\x68\0\0\0\
-\0\x04\0\0\xb7\x26\0\0\x71\x01\0\0\x40\x04\0\0\xc1\x26\0\0\x71\x01\0\0\xc0\x04\
-\0\0\xcb\x26\0\0\x68\0\0\0\x40\x05\0\0\xdb\x26\0\0\x68\0\0\0\x80\x05\0\0\xbe\
-\x22\0\0\x68\0\0\0\xc0\x05\0\0\xe5\x26\0\0\x68\0\0\0\0\x06\0\0\xf4\x26\0\0\x68\
-\0\0\0\x40\x06\0\0\0\0\0\0\0\0\0\x02\x0a\x02\0\0\x03\x27\0\0\x02\0\0\x05\x08\0\
-\0\0\x16\x27\0\0\x69\0\0\0\0\0\0\0\0\0\0\0\x6a\x01\0\0\0\0\0\0\0\0\0\0\x03\0\0\
-\x04\x08\0\0\0\x1b\x27\0\0\x53\0\0\0\0\0\0\0\x23\x27\0\0\x5f\0\0\0\x20\0\0\0\
-\x2a\x27\0\0\x5f\0\0\0\x30\0\0\0\x31\x27\0\0\x02\0\0\x05\x08\0\0\0\xb6\x14\0\0\
-\x69\0\0\0\0\0\0\0\0\0\0\0\x6c\x01\0\0\0\0\0\0\0\0\0\0\x0b\0\0\x84\x08\0\0\0\
-\x43\x27\0\0\x69\0\0\0\0\0\0\x05\x4a\x27\0\0\x69\0\0\0\x05\0\0\x0e\x52\x27\0\0\
-\x69\0\0\0\x13\0\0\x05\x5c\x27\0\0\x69\0\0\0\x18\0\0\x02\x65\x27\0\0\x69\0\0\0\
-\x1a\0\0\x07\x6e\x27\0\0\x69\0\0\0\x21\0\0\x04\x7a\x27\0\0\x69\0\0\0\x25\0\0\
-\x01\x85\x27\0\0\x69\0\0\0\x26\0\0\x02\x90\x27\0\0\x69\0\0\0\x28\0\0\x03\x98\
-\x27\0\0\x69\0\0\0\x2b\0\0\x03\xa1\x27\0\0\x69\0\0\0\x2e\0\0\x12\0\0\0\0\0\0\0\
-\x02\x0e\x02\0\0\0\0\0\0\x02\0\0\x04\x08\0\0\0\x82\x05\0\0\x52\0\0\0\0\0\0\0\
-\xaa\x27\0\0\x52\0\0\0\x20\0\0\0\0\0\0\0\x02\0\0\x04\x08\0\0\0\x3d\x0e\0\0\x52\
-\0\0\0\0\0\0\0\xae\x27\0\0\x52\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x0c\x02\0\0\
-\xb7\x27\0\0\x02\0\0\x04\x10\0\0\0\xc1\x27\0\0\x69\0\0\0\0\0\0\0\xc5\x27\0\0\
-\x72\x01\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x7d\x01\0\0\0\0\0\0\0\0\0\x02\xe9\x01\
-\0\0\0\0\0\0\0\0\0\x02\x21\x02\0\0\0\0\0\0\0\0\0\x02\xf0\x01\0\0\x7c\x20\0\0\
-\x0c\0\0\x04\x98\x01\0\0\x70\x17\0\0\x77\x01\0\0\0\0\0\0\xc3\x0e\0\0\x7a\x01\0\
-\0\x40\0\0\0\xb8\x01\0\0\x51\0\0\0\x80\0\0\0\xca\x27\0\0\x55\0\0\0\xc0\0\0\0\
-\xd2\x27\0\0\x77\x01\0\0\0\x01\0\0\xdd\x27\0\0\x7e\x01\0\0\x40\x01\0\0\xe8\x27\
-\0\0\x80\x01\0\0\x40\x06\0\0\xf2\x27\0\0\x7e\x01\0\0\x80\x06\0\0\xfb\x27\0\0\
-\x51\0\0\0\x80\x0b\0\0\x06\x28\0\0\x51\0\0\0\xc0\x0b\0\0\xb3\x17\0\0\x66\0\0\0\
-\0\x0c\0\0\x16\x28\0\0\x81\x01\0\0\x80\x0c\0\0\x1f\x28\0\0\0\0\0\x08\x78\x01\0\
-\0\0\0\0\0\0\0\0\x02\x79\x01\0\0\0\0\0\0\x04\0\0\x0d\0\0\0\0\0\0\0\0\x51\0\0\0\
-\0\0\0\0\x51\0\0\0\0\0\0\0\x7a\x01\0\0\0\0\0\0\x7b\x01\0\0\0\0\0\0\0\0\0\x02\
-\x76\x01\0\0\0\0\0\0\0\0\0\x02\x7c\x01\0\0\x2d\x28\0\0\x01\0\0\x04\xa8\0\0\0\
-\xc5\x27\0\0\x7d\x01\0\0\0\0\0\0\x39\x28\0\0\x15\0\0\x04\xa8\0\0\0\x41\x28\0\0\
-\x51\0\0\0\0\0\0\0\x45\x28\0\0\x51\0\0\0\x40\0\0\0\x49\x28\0\0\x51\0\0\0\x80\0\
-\0\0\x4d\x28\0\0\x51\0\0\0\xc0\0\0\0\x51\x28\0\0\x51\0\0\0\0\x01\0\0\x54\x28\0\
-\0\x51\0\0\0\x40\x01\0\0\x57\x28\0\0\x51\0\0\0\x80\x01\0\0\x5b\x28\0\0\x51\0\0\
-\0\xc0\x01\0\0\x5f\x28\0\0\x51\0\0\0\0\x02\0\0\x62\x28\0\0\x51\0\0\0\x40\x02\0\
-\0\x65\x28\0\0\x51\0\0\0\x80\x02\0\0\x68\x28\0\0\x51\0\0\0\xc0\x02\0\0\x6b\x28\
-\0\0\x51\0\0\0\0\x03\0\0\x6e\x28\0\0\x51\0\0\0\x40\x03\0\0\x71\x28\0\0\x51\0\0\
-\0\x80\x03\0\0\x74\x28\0\0\x51\0\0\0\xc0\x03\0\0\x83\x26\0\0\x51\0\0\0\0\x04\0\
-\0\x7c\x28\0\0\x51\0\0\0\x40\x04\0\0\xb8\x01\0\0\x51\0\0\0\x80\x04\0\0\xd0\x1c\
-\0\0\x51\0\0\0\xc0\x04\0\0\x7f\x28\0\0\x51\0\0\0\0\x05\0\0\x82\x28\0\0\x03\0\0\
-\x04\xa0\0\0\0\x92\x28\0\0\x7f\x01\0\0\0\0\0\0\x9f\x28\0\0\x7f\x01\0\0\x40\0\0\
-\0\xab\x28\0\0\x0d\x01\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\xf4\x01\0\0\0\0\0\0\0\0\
-\0\x02\x7e\x01\0\0\xb6\x28\0\0\0\0\0\x08\x82\x01\0\0\0\0\0\0\0\0\0\x02\x83\x01\
-\0\0\0\0\0\0\x02\0\0\x0d\x02\0\0\0\0\0\0\0\x7a\x01\0\0\0\0\0\0\x84\x01\0\0\xc8\
-\x28\0\0\x03\0\0\x06\x04\0\0\0\xd7\x28\0\0\0\0\0\0\x01\x29\0\0\x01\0\0\0\x2b\
-\x29\0\0\x02\0\0\0\0\0\0\0\0\0\0\x02\x0d\x02\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x37\
-\x01\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x02\xf8\x01\0\0\x66\x1d\0\0\x07\0\0\
-\x04\x80\x10\0\0\xcb\x24\0\0\x54\0\0\0\0\0\0\0\x56\x29\0\0\x51\0\0\0\x40\0\0\0\
-\x67\x29\0\0\x89\x01\0\0\x80\0\0\0\x6f\x29\0\0\x89\x01\0\0\xc0\0\0\0\x7e\x29\0\
-\0\x8a\x01\0\0\0\x01\0\0\x83\x29\0\0\x8a\x01\0\0\x80\x01\0\0\x8e\x29\0\0\x8b\
-\x01\0\0\0\x02\0\0\0\0\0\0\0\0\0\x02\x8b\x01\0\0\x98\x29\0\0\x03\0\0\x04\x10\0\
-\0\0\xa7\x29\0\0\x68\0\0\0\0\0\0\0\xb4\x29\0\0\x54\0\0\0\x40\0\0\0\xc1\x29\0\0\
-\x54\0\0\0\x60\0\0\0\x67\x29\0\0\x0a\0\0\x84\x40\x10\0\0\x8b\x1c\0\0\x54\0\0\0\
-\0\0\0\0\xd3\x29\0\0\x54\0\0\0\x20\0\0\0\xdd\x29\0\0\x68\0\0\0\x40\0\0\0\xe7\
-\x29\0\0\x68\0\0\0\x80\0\0\0\xf6\x29\0\0\x68\0\0\0\xc0\0\0\0\xfa\x29\0\0\x54\0\
-\0\0\0\x01\0\x01\x04\x2a\0\0\x54\0\0\0\x01\x01\0\x01\x0d\x2a\0\0\x54\0\0\0\x02\
-\x01\0\x01\x1d\x2a\0\0\x54\0\0\0\x03\x01\0\x01\xc5\x27\0\0\x8c\x01\0\0\0\x02\0\
-\0\x24\x2a\0\0\x05\0\0\x05\0\x10\0\0\x31\x2a\0\0\x8d\x01\0\0\0\0\0\0\x37\x2a\0\
-\0\x8f\x01\0\0\0\0\0\0\x3e\x2a\0\0\x97\x01\0\0\0\0\0\0\x43\x2a\0\0\x99\x01\0\0\
-\0\0\0\0\x72\x18\0\0\x9d\x01\0\0\0\0\0\0\x49\x2a\0\0\x09\0\0\x04\x70\0\0\0\x55\
-\x2a\0\0\x52\0\0\0\0\0\0\0\x59\x2a\0\0\x52\0\0\0\x20\0\0\0\x5d\x2a\0\0\x52\0\0\
-\0\x40\0\0\0\x61\x2a\0\0\x52\0\0\0\x60\0\0\0\x65\x2a\0\0\x52\0\0\0\x80\0\0\0\
-\x69\x2a\0\0\x52\0\0\0\xa0\0\0\0\x6d\x2a\0\0\x52\0\0\0\xc0\0\0\0\x71\x2a\0\0\
-\x8e\x01\0\0\xe0\0\0\0\x36\x0e\0\0\x52\0\0\0\x60\x03\0\0\0\0\0\0\0\0\0\x03\0\0\
-\0\0\x52\0\0\0\x04\0\0\0\x14\0\0\0\x7a\x2a\0\0\x0b\0\0\x04\0\x02\0\0\x55\x2a\0\
-\0\x5e\0\0\0\0\0\0\0\x59\x2a\0\0\x5e\0\0\0\x10\0\0\0\x5d\x2a\0\0\x5e\0\0\0\x20\
-\0\0\0\x87\x2a\0\0\x5e\0\0\0\x30\0\0\0\0\0\0\0\x90\x01\0\0\x40\0\0\0\x8b\x2a\0\
-\0\x52\0\0\0\xc0\0\0\0\x91\x2a\0\0\x52\0\0\0\xe0\0\0\0\x71\x2a\0\0\x93\x01\0\0\
-\0\x01\0\0\x9c\x2a\0\0\x94\x01\0\0\0\x05\0\0\x7c\x25\0\0\x95\x01\0\0\0\x0d\0\0\
-\0\0\0\0\x96\x01\0\0\x80\x0e\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\0\0\0\0\x91\x01\
-\0\0\0\0\0\0\0\0\0\0\x92\x01\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\xa6\x2a\
-\0\0\x68\0\0\0\0\0\0\0\xaa\x2a\0\0\x68\0\0\0\x40\0\0\0\0\0\0\0\x04\0\0\x04\x10\
-\0\0\0\x61\x2a\0\0\x52\0\0\0\0\0\0\0\x65\x2a\0\0\x52\0\0\0\x20\0\0\0\x69\x2a\0\
-\0\x52\0\0\0\x40\0\0\0\x6d\x2a\0\0\x52\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\
-\0\x52\0\0\0\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x52\0\0\0\x04\0\0\0\
-\x40\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x52\0\0\0\x04\0\0\0\x0c\0\0\0\0\0\0\0\x02\
-\0\0\x05\x30\0\0\0\xae\x2a\0\0\x95\x01\0\0\0\0\0\0\xb7\x2a\0\0\x95\x01\0\0\0\0\
-\0\0\xc3\x2a\0\0\x10\0\0\x04\x88\0\0\0\x55\x2a\0\0\x52\0\0\0\0\0\0\0\x59\x2a\0\
-\0\x52\0\0\0\x20\0\0\0\x5d\x2a\0\0\x52\0\0\0\x40\0\0\0\x61\x2a\0\0\x52\0\0\0\
-\x60\0\0\0\x65\x2a\0\0\x52\0\0\0\x80\0\0\0\x69\x2a\0\0\x52\0\0\0\xa0\0\0\0\x6d\
-\x2a\0\0\x52\0\0\0\xc0\0\0\0\x71\x2a\0\0\x8e\x01\0\0\xe0\0\0\0\xd0\x2a\0\0\x7c\
-\0\0\0\x60\x03\0\0\xd5\x2a\0\0\x7c\0\0\0\x68\x03\0\0\xdd\x2a\0\0\x7c\0\0\0\x70\
-\x03\0\0\xe7\x2a\0\0\x7c\0\0\0\x78\x03\0\0\xf1\x2a\0\0\x7c\0\0\0\x80\x03\0\0\
-\xf4\x2a\0\0\x7c\0\0\0\x88\x03\0\0\x1c\x25\0\0\x98\x01\0\0\xc0\x03\0\0\xfb\x2a\
-\0\0\x52\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\x02\xff\x01\0\0\x05\x2b\0\0\x03\0\0\x04\
-\x40\x02\0\0\x11\x2b\0\0\x8f\x01\0\0\0\0\0\0\x16\x2b\0\0\x9a\x01\0\0\0\x10\0\0\
-\x1d\x2b\0\0\x9c\x01\0\0\0\x12\0\0\x31\x2b\0\0\x03\0\0\x04\x40\0\0\0\xdd\x29\0\
-\0\x68\0\0\0\0\0\0\0\x3f\x2b\0\0\x68\0\0\0\x40\0\0\0\xae\x27\0\0\x9b\x01\0\0\
-\x80\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x68\0\0\0\x04\0\0\0\x06\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x7c\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x7c\0\0\0\
-\x04\0\0\0\0\x10\0\0\x48\x2b\0\0\x01\0\0\x0c\x4d\0\0\0\0\0\0\0\0\0\0\x02\xa0\
-\x01\0\0\x60\x2b\0\0\x06\0\0\x04\x30\0\0\0\x83\x2b\0\0\xa1\x01\0\0\0\0\0\0\x87\
-\x2b\0\0\xd0\0\0\0\x40\0\0\0\x93\x2b\0\0\xa2\0\0\0\xc0\0\0\0\x9e\x2b\0\0\xd0\0\
-\0\0\xe0\0\0\0\xa9\x2b\0\0\xa2\0\0\0\x60\x01\0\0\xb3\x2b\0\0\xa2\x01\0\0\x80\
-\x01\0\0\xba\x2b\0\0\x04\0\0\x04\x08\0\0\0\x19\0\0\0\x60\0\0\0\0\0\0\0\xb8\x01\
-\0\0\x7e\0\0\0\x10\0\0\0\xc6\x2b\0\0\x7e\0\0\0\x18\0\0\0\x82\x05\0\0\x02\0\0\0\
-\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xc0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\x01\0\
-\0\x0d\x02\0\0\0\x74\x01\0\0\x9f\x01\0\0\xd4\x2b\0\0\x01\0\0\x0c\xa3\x01\0\0\
-\xe7\x2b\0\0\x01\0\0\x0c\x4d\0\0\0\0\0\0\0\0\0\0\x02\xa7\x01\0\0\xf8\x2b\0\0\
-\x09\0\0\x04\x40\0\0\0\x83\x2b\0\0\xa1\x01\0\0\0\0\0\0\x15\x2c\0\0\xd0\0\0\0\
-\x40\0\0\0\x1f\x2c\0\0\xa2\0\0\0\xc0\0\0\0\x28\x2c\0\0\x02\0\0\0\xe0\0\0\0\x32\
-\x2c\0\0\x94\0\0\0\0\x01\0\0\x3d\x2c\0\0\xd0\0\0\0\x40\x01\0\0\x47\x2c\0\0\xa2\
-\0\0\0\xc0\x01\0\0\x50\x2c\0\0\x02\0\0\0\xe0\x01\0\0\xb3\x2b\0\0\xa2\x01\0\0\0\
-\x02\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x74\x01\0\0\xa6\x01\0\0\x5a\x2c\0\0\x01\
-\0\0\x0c\xa8\x01\0\0\x4f\x0e\0\0\0\0\0\x08\x54\0\0\0\xde\x0f\0\0\0\0\0\x08\x4c\
-\0\0\0\0\0\0\0\x04\0\0\x0d\x02\0\0\0\x86\x05\0\0\xaa\x01\0\0\x6d\x2c\0\0\xab\
-\x01\0\0\x73\x2c\0\0\xeb\0\0\0\x79\x2c\0\0\xab\x01\0\0\x88\x2c\0\0\0\0\0\x0c\
-\xac\x01\0\0\x9f\x2c\0\0\x01\0\0\x0c\xa8\x01\0\0\0\0\0\0\0\0\0\x02\xb0\x01\0\0\
-\xb0\x2c\0\0\x06\0\0\x04\x10\0\0\0\xbe\x2c\0\0\x60\0\0\0\0\0\0\0\xca\x2c\0\0\
-\x7e\0\0\0\x10\0\0\0\xd7\x2c\0\0\x7e\0\0\0\x18\0\0\0\xec\x2c\0\0\x02\0\0\0\x20\
-\0\0\0\x91\x11\0\0\xaa\x01\0\0\x40\0\0\0\xf7\x2c\0\0\xaa\x01\0\0\x60\0\0\0\0\0\
-\0\0\x01\0\0\x0d\x02\0\0\0\x74\x01\0\0\xaf\x01\0\0\xfe\x2c\0\0\x01\0\0\x0c\xb1\
-\x01\0\0\x0e\x2d\0\0\x01\0\0\x0c\x4d\0\0\0\x1e\x2d\0\0\x01\0\0\x0c\x4d\0\0\0\
-\x2d\x2d\0\0\x01\0\0\x0c\x4d\0\0\0\x45\x2d\0\0\x01\0\0\x0c\x4d\0\0\0\x5c\x2d\0\
-\0\x01\0\0\x0c\x4d\0\0\0\x70\x2d\0\0\x01\0\0\x0c\x4d\0\0\0\0\0\0\0\0\0\0\x02\
-\xba\x01\0\0\x83\x2d\0\0\x03\0\0\x04\xb8\0\0\0\xc5\x27\0\0\xbb\x01\0\0\0\0\0\0\
-\xac\x23\0\0\x69\0\0\0\x40\x05\0\0\x7a\x26\0\0\x69\0\0\0\x80\x05\0\0\x97\x2d\0\
-\0\0\0\0\x08\x7d\x01\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x74\x01\0\0\xb9\x01\0\0\
-\xaa\x2d\0\0\x01\0\0\x0c\xbc\x01\0\0\xbb\x2d\0\0\x01\0\0\x0c\xbc\x01\0\0\0\0\0\
-\0\0\0\0\x03\0\0\0\0\xc0\0\0\0\x04\0\0\0\x0d\0\0\0\xd4\x2d\0\0\0\0\0\x0e\xbf\
-\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x0a\xaa\x01\0\0\xdc\x2d\0\0\0\0\0\x0e\xc1\x01\
-\0\0\x01\0\0\0\xe1\x2d\0\0\0\0\0\x0e\xc1\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x03\0\
-\0\0\0\xbf\0\0\0\x04\0\0\0\x22\0\0\0\xe5\x2d\0\0\0\0\0\x0e\xc4\x01\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x03\0\0\0\0\xbf\0\0\0\x04\0\0\0\x1e\0\0\0\xfe\x2d\0\0\0\0\0\x0e\
-\xc6\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x09\xeb\0\0\0\x19\x2e\0\0\0\0\0\x0e\xc8\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xbf\0\0\0\x04\0\0\0\x14\0\0\0\x27\x2e\0\
-\0\0\0\0\x0e\xca\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x09\xaa\x01\0\0\x40\x2e\0\0\0\0\
-\0\x0e\xcc\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xbf\0\0\0\x04\0\0\0\x0e\0\
-\0\0\x48\x2e\0\0\0\0\0\x0e\xce\x01\0\0\0\0\0\0\x63\x2e\0\0\x02\0\0\x04\x08\0\0\
-\0\x6f\x2e\0\0\xd1\x01\0\0\0\0\0\0\x74\x2e\0\0\xaa\x01\0\0\x20\0\0\0\x7f\x2e\0\
-\0\x02\0\0\x06\x04\0\0\0\x89\x2e\0\0\0\0\0\0\x96\x2e\0\0\x01\0\0\0\xa8\x2e\0\0\
-\0\0\0\x0e\xd0\x01\0\0\x01\0\0\0\xba\x2e\0\0\x02\0\0\x04\x0c\0\0\0\xc3\x2e\0\0\
-\xd0\x01\0\0\0\0\0\0\xca\x2e\0\0\xaa\x01\0\0\x40\0\0\0\xd2\x2e\0\0\0\0\0\x0e\
-\xd3\x01\0\0\x01\0\0\0\xde\x2e\0\0\0\0\0\x0e\xd3\x01\0\0\x01\0\0\0\xe8\x2e\0\0\
-\0\0\0\x0e\xd3\x01\0\0\x01\0\0\0\xf5\x2e\0\0\0\0\0\x0e\xd3\x01\0\0\x01\0\0\0\0\
-\0\0\0\0\0\0\x03\0\0\0\0\xbf\0\0\0\x04\0\0\0\x1d\0\0\0\x06\x2f\0\0\0\0\0\x0e\
-\xd8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xbf\0\0\0\x04\0\0\0\x20\0\0\0\
-\x24\x2f\0\0\0\0\0\x0e\xda\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xbf\0\0\0\
-\x04\0\0\0\x1c\0\0\0\x40\x2f\0\0\0\0\0\x0e\xdc\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\xbf\0\0\0\x04\0\0\0\x1b\0\0\0\x61\x2f\0\0\0\0\0\x0e\xde\x01\0\0\0\
-\0\0\0\x82\x2f\0\0\0\0\0\x0e\xdc\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xbf\
-\0\0\0\x04\0\0\0\x21\0\0\0\xa8\x2f\0\0\0\0\0\x0e\xe1\x01\0\0\0\0\0\0\xbd\x2f\0\
-\0\0\0\0\x07\0\0\0\0\xb4\x07\0\0\0\0\0\x07\0\0\0\0\x1f\x09\0\0\0\0\0\x07\0\0\0\
-\0\x03\x09\0\0\0\0\0\x07\0\0\0\0\xcf\x2f\0\0\0\0\0\x07\0\0\0\0\xd8\x2f\0\0\0\0\
-\0\x07\0\0\0\0\xea\x2f\0\0\0\0\0\x07\0\0\0\0\xf3\x2f\0\0\0\0\0\x07\0\0\0\0\x3b\
-\x09\0\0\0\0\0\x07\0\0\0\0\x66\x0f\0\0\0\0\0\x07\0\0\0\0\xff\x2f\0\0\0\0\0\x07\
-\0\0\0\0\xd6\x06\0\0\0\0\0\x07\0\0\0\0\x0a\x30\0\0\0\0\0\x07\0\0\0\0\x12\x30\0\
-\0\0\0\0\x07\0\0\0\0\x1f\x30\0\0\0\0\0\x07\0\0\0\0\x2d\x30\0\0\0\0\0\x07\0\0\0\
-\0\x3a\x30\0\0\0\0\0\x07\0\0\0\0\x44\x30\0\0\0\0\0\x07\0\0\0\0\x50\x30\0\0\0\0\
-\0\x07\0\0\0\0\x61\x30\0\0\0\0\0\x07\0\0\0\0\x70\x30\0\0\0\0\0\x07\0\0\0\0\x30\
-\x1d\0\0\0\0\0\x07\0\0\0\0\x30\x09\0\0\0\0\0\x07\0\0\0\0\x83\x30\0\0\0\0\0\x07\
-\0\0\0\0\x91\x30\0\0\0\0\0\x07\0\0\0\0\x01\x16\0\0\0\0\0\x07\0\0\0\0\xa0\x30\0\
-\0\0\0\0\x07\0\0\0\0\xaf\x30\0\0\0\0\0\x07\0\0\0\0\xc4\x30\0\0\0\0\0\x07\0\0\0\
-\0\xd2\x30\0\0\0\0\0\x07\0\0\0\0\x7d\x0a\0\0\0\0\0\x07\0\0\0\0\xdd\x30\0\0\0\0\
-\0\x07\0\0\0\0\xe7\x30\0\0\0\0\0\x07\0\0\0\0\xf5\x06\0\0\0\0\0\x07\0\0\0\0\x44\
-\x07\0\0\0\0\0\x07\0\0\0\0\x3c\x0b\0\0\0\0\0\x07\0\0\0\0\xf4\x30\0\0\0\0\0\x07\
-\0\0\0\0\x86\x1c\0\0\0\0\0\x07\0\0\0\0\x03\x31\0\0\0\0\0\x07\0\0\0\0\x1a\x31\0\
-\0\0\0\0\x07\0\0\0\0\x2c\x31\0\0\0\0\0\x07\0\0\0\0\x38\x31\0\0\0\0\0\x07\0\0\0\
-\0\x4d\x31\0\0\0\0\0\x07\0\0\0\0\x59\x31\0\0\0\0\0\x07\0\0\0\0\x82\x05\0\0\0\0\
-\0\x07\0\0\0\0\x69\x31\0\0\0\0\0\x07\0\0\0\0\x77\x31\0\0\0\0\0\x07\0\0\0\0\xdc\
-\x1a\0\0\0\0\0\x07\0\0\0\0\x87\x31\0\0\0\0\0\x07\0\0\0\0\x8e\x31\0\0\0\0\0\x07\
-\0\0\0\0\x11\x09\0\0\0\0\0\x07\0\0\0\0\x97\x31\0\0\0\0\0\x07\0\0\0\0\xa5\x31\0\
-\0\0\0\0\x07\0\0\0\0\x8e\x0b\0\0\0\0\0\x07\0\0\0\0\xb6\x31\0\0\0\0\0\x07\0\0\0\
-\0\x53\x02\0\0\0\0\0\x07\0\0\0\0\xc6\x31\0\0\0\0\0\x07\0\0\0\0\xd5\x31\0\0\0\0\
-\0\x07\0\0\0\0\xe3\x31\0\0\0\0\0\x07\0\0\0\0\xf2\x31\0\0\0\0\0\x07\0\0\0\0\0\
-\x32\0\0\0\0\0\x07\0\0\0\0\x10\x32\0\0\0\0\0\x07\0\0\0\0\x1b\x32\0\0\0\0\0\x07\
-\0\0\0\0\x2c\x32\0\0\0\0\0\x07\0\0\0\0\x38\x32\0\0\0\0\0\x07\0\0\0\0\x8a\x71\0\
-\0\x01\0\0\x0f\x0d\0\0\0\xc0\x01\0\0\0\0\0\0\x0d\0\0\0\x92\x71\0\0\x0c\0\0\x0f\
-\x1b\x01\0\0\xc2\x01\0\0\0\0\0\0\x04\0\0\0\xc3\x01\0\0\x04\0\0\0\x04\0\0\0\xc5\
-\x01\0\0\x08\0\0\0\x22\0\0\0\xc7\x01\0\0\x2a\0\0\0\x1e\0\0\0\xcb\x01\0\0\x48\0\
-\0\0\x14\0\0\0\xcf\x01\0\0\x5c\0\0\0\x0e\0\0\0\xd9\x01\0\0\x6a\0\0\0\x1d\0\0\0\
-\xdb\x01\0\0\x87\0\0\0\x20\0\0\0\xdd\x01\0\0\xa7\0\0\0\x1c\0\0\0\xdf\x01\0\0\
-\xc3\0\0\0\x1b\0\0\0\xe0\x01\0\0\xde\0\0\0\x1c\0\0\0\xe2\x01\0\0\xfa\0\0\0\x21\
-\0\0\0\x9a\x71\0\0\x10\0\0\x0f\xb0\x01\0\0\x0c\0\0\0\0\0\0\0\x20\0\0\0\x14\0\0\
-\0\x20\0\0\0\x20\0\0\0\x18\0\0\0\x40\0\0\0\x20\0\0\0\x1c\0\0\0\x60\0\0\0\x20\0\
-\0\0\x20\0\0\0\x80\0\0\0\x20\0\0\0\x26\0\0\0\xa0\0\0\0\x20\0\0\0\x2c\0\0\0\xc0\
-\0\0\0\x20\0\0\0\x30\0\0\0\xe0\0\0\0\x20\0\0\0\x34\0\0\0\0\x01\0\0\x20\0\0\0\
-\x36\0\0\0\x20\x01\0\0\x20\0\0\0\x3a\0\0\0\x40\x01\0\0\x20\0\0\0\x40\0\0\0\x60\
-\x01\0\0\x10\0\0\0\x44\0\0\0\x70\x01\0\0\x10\0\0\0\x45\0\0\0\x80\x01\0\0\x10\0\
-\0\0\x49\0\0\0\x90\x01\0\0\x10\0\0\0\x4a\0\0\0\xa0\x01\0\0\x10\0\0\0\xa0\x71\0\
-\0\x07\0\0\x0f\x40\0\0\0\xc9\x01\0\0\0\0\0\0\x01\0\0\0\xcd\x01\0\0\x04\0\0\0\
-\x04\0\0\0\xd2\x01\0\0\x08\0\0\0\x08\0\0\0\xd4\x01\0\0\x10\0\0\0\x0c\0\0\0\xd5\
-\x01\0\0\x1c\0\0\0\x0c\0\0\0\xd6\x01\0\0\x28\0\0\0\x0c\0\0\0\xd7\x01\0\0\x34\0\
-\0\0\x0c\0\0\0\0\x69\x6e\x74\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\
-\x5f\x54\x59\x50\x45\x5f\x5f\0\x74\x79\x70\x65\0\x6b\x65\x79\x5f\x73\x69\x7a\
-\x65\0\x76\x61\x6c\x75\x65\x5f\x73\x69\x7a\x65\0\x6d\x61\x78\x5f\x65\x6e\x74\
-\x72\x69\x65\x73\0\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\
-\x6d\x61\x70\0\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x5f\
-\x6d\x61\x70\0\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\
-\x74\x5f\x6d\x61\x70\0\x72\x75\x6e\x71\x6c\x61\x74\x5f\x6d\x61\x70\0\x74\x68\
-\x72\x65\x61\x64\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\0\x73\x74\
-\x61\x63\x6b\x5f\x74\x72\x61\x63\x65\x73\x5f\x6d\x61\x70\0\x74\x61\x73\x6b\x5f\
-\x74\x72\x61\x63\x65\x5f\x64\x61\x74\x61\x5f\x6d\x61\x70\0\x63\x70\x75\x5f\x75\
-\x73\x72\x5f\x6d\x61\x70\0\x63\x70\x75\x5f\x65\x6d\x61\x5f\x63\x74\x72\x6c\x5f\
-\x6d\x61\x70\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x61\x70\0\x70\x72\x6f\x63\
-\x65\x73\x73\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\0\x63\x70\x75\
-\x5f\x75\x73\x61\x67\x65\x5f\x62\x75\x66\x66\x65\x72\0\x74\x61\x73\x6b\x5f\x6f\
-\x63\x63\x75\x70\x69\x65\x64\x5f\x62\x75\x66\x66\x65\x72\0\x70\x72\x6f\x63\x65\
-\x73\x73\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x62\x75\x66\x66\x65\x72\0\x72\
-\x75\x6e\x71\x6c\x61\x74\x5f\x62\x75\x66\x66\x65\x72\0\x74\x61\x73\x6b\x5f\x62\
-\x61\x63\x6b\x74\x72\x61\x63\x65\x5f\x62\x75\x66\x66\x65\x72\0\x75\x6e\x73\x69\
-\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x63\x74\x78\0\x68\
-\x61\x6e\x64\x6c\x65\x5f\x73\x63\x68\x65\x64\x5f\x77\x61\x6b\x65\x75\x70\0\x74\
-\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\0\x74\x68\x72\x65\x61\x64\x5f\x69\x6e\
-\x66\x6f\0\x5f\x5f\x73\x74\x61\x74\x65\0\x73\x74\x61\x63\x6b\0\x75\x73\x61\x67\
-\x65\0\x66\x6c\x61\x67\x73\0\x70\x74\x72\x61\x63\x65\0\x6f\x6e\x5f\x63\x70\x75\
-\0\x77\x61\x6b\x65\x5f\x65\x6e\x74\x72\x79\0\x77\x61\x6b\x65\x65\x5f\x66\x6c\
-\x69\x70\x73\0\x77\x61\x6b\x65\x65\x5f\x66\x6c\x69\x70\x5f\x64\x65\x63\x61\x79\
-\x5f\x74\x73\0\x6c\x61\x73\x74\x5f\x77\x61\x6b\x65\x65\0\x72\x65\x63\x65\x6e\
-\x74\x5f\x75\x73\x65\x64\x5f\x63\x70\x75\0\x77\x61\x6b\x65\x5f\x63\x70\x75\0\
-\x6f\x6e\x5f\x72\x71\0\x70\x72\x69\x6f\0\x73\x74\x61\x74\x69\x63\x5f\x70\x72\
-\x69\x6f\0\x6e\x6f\x72\x6d\x61\x6c\x5f\x70\x72\x69\x6f\0\x72\x74\x5f\x70\x72\
-\x69\x6f\x72\x69\x74\x79\0\x73\x65\0\x72\x74\0\x64\x6c\0\x73\x63\x68\x65\x64\
-\x5f\x63\x6c\x61\x73\x73\0\x73\x63\x68\x65\x64\x5f\x74\x61\x73\x6b\x5f\x67\x72\
-\x6f\x75\x70\0\x73\x74\x61\x74\x73\0\x62\x74\x72\x61\x63\x65\x5f\x73\x65\x71\0\
-\x70\x6f\x6c\x69\x63\x79\0\x6e\x72\x5f\x63\x70\x75\x73\x5f\x61\x6c\x6c\x6f\x77\
-\x65\x64\0\x63\x70\x75\x73\x5f\x70\x74\x72\0\x75\x73\x65\x72\x5f\x63\x70\x75\
-\x73\x5f\x70\x74\x72\0\x63\x70\x75\x73\x5f\x6d\x61\x73\x6b\0\x6d\x69\x67\x72\
-\x61\x74\x69\x6f\x6e\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x6d\x69\x67\x72\x61\x74\
-\x69\x6f\x6e\x5f\x64\x69\x73\x61\x62\x6c\x65\x64\0\x6d\x69\x67\x72\x61\x74\x69\
-\x6f\x6e\x5f\x66\x6c\x61\x67\x73\0\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x6c\x6f\
-\x63\x6b\x5f\x6e\x65\x73\x74\x69\x6e\x67\0\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\
-\x75\x6e\x6c\x6f\x63\x6b\x5f\x73\x70\x65\x63\x69\x61\x6c\0\x72\x63\x75\x5f\x6e\
-\x6f\x64\x65\x5f\x65\x6e\x74\x72\x79\0\x72\x63\x75\x5f\x62\x6c\x6f\x63\x6b\x65\
-\x64\x5f\x6e\x6f\x64\x65\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x6e\x76\x63\
-\x73\x77\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x68\x6f\x6c\x64\x6f\x75\x74\
-\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x69\x64\x78\0\x72\x63\x75\x5f\x74\
-\x61\x73\x6b\x73\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\0\x72\x63\x75\x5f\x74\x61\
-\x73\x6b\x73\x5f\x68\x6f\x6c\x64\x6f\x75\x74\x5f\x6c\x69\x73\x74\0\x74\x72\x63\
-\x5f\x72\x65\x61\x64\x65\x72\x5f\x6e\x65\x73\x74\x69\x6e\x67\0\x74\x72\x63\x5f\
-\x69\x70\x69\x5f\x74\x6f\x5f\x63\x70\x75\0\x74\x72\x63\x5f\x72\x65\x61\x64\x65\
-\x72\x5f\x73\x70\x65\x63\x69\x61\x6c\0\x74\x72\x63\x5f\x68\x6f\x6c\x64\x6f\x75\
-\x74\x5f\x6c\x69\x73\x74\0\x74\x72\x63\x5f\x62\x6c\x6b\x64\x5f\x6e\x6f\x64\x65\
-\0\x74\x72\x63\x5f\x62\x6c\x6b\x64\x5f\x63\x70\x75\0\x73\x63\x68\x65\x64\x5f\
-\x69\x6e\x66\x6f\0\x74\x61\x73\x6b\x73\0\x70\x75\x73\x68\x61\x62\x6c\x65\x5f\
-\x74\x61\x73\x6b\x73\0\x70\x75\x73\x68\x61\x62\x6c\x65\x5f\x64\x6c\x5f\x74\x61\
-\x73\x6b\x73\0\x6d\x6d\0\x61\x63\x74\x69\x76\x65\x5f\x6d\x6d\0\x72\x73\x73\x5f\
-\x73\x74\x61\x74\0\x65\x78\x69\x74\x5f\x73\x74\x61\x74\x65\0\x65\x78\x69\x74\
-\x5f\x63\x6f\x64\x65\0\x65\x78\x69\x74\x5f\x73\x69\x67\x6e\x61\x6c\0\x70\x64\
-\x65\x61\x74\x68\x5f\x73\x69\x67\x6e\x61\x6c\0\x6a\x6f\x62\x63\x74\x6c\0\x70\
-\x65\x72\x73\x6f\x6e\x61\x6c\x69\x74\x79\0\x73\x63\x68\x65\x64\x5f\x72\x65\x73\
-\x65\x74\x5f\x6f\x6e\x5f\x66\x6f\x72\x6b\0\x73\x63\x68\x65\x64\x5f\x63\x6f\x6e\
-\x74\x72\x69\x62\x75\x74\x65\x73\x5f\x74\x6f\x5f\x6c\x6f\x61\x64\0\x73\x63\x68\
-\x65\x64\x5f\x6d\x69\x67\x72\x61\x74\x65\x64\0\x73\x63\x68\x65\x64\x5f\x72\x65\
-\x6d\x6f\x74\x65\x5f\x77\x61\x6b\x65\x75\x70\0\x69\x6e\x5f\x65\x78\x65\x63\x76\
-\x65\0\x69\x6e\x5f\x69\x6f\x77\x61\x69\x74\0\x72\x65\x73\x74\x6f\x72\x65\x5f\
-\x73\x69\x67\x6d\x61\x73\x6b\0\x69\x6e\x5f\x75\x73\x65\x72\x5f\x66\x61\x75\x6c\
-\x74\0\x62\x72\x6b\x5f\x72\x61\x6e\x64\x6f\x6d\x69\x7a\x65\x64\0\x6e\x6f\x5f\
-\x63\x67\x72\x6f\x75\x70\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\0\x66\x72\x6f\
-\x7a\x65\x6e\0\x75\x73\x65\x5f\x6d\x65\x6d\x64\x65\x6c\x61\x79\0\x69\x6e\x5f\
-\x65\x76\x65\x6e\x74\x66\x64\0\x72\x65\x70\x6f\x72\x74\x65\x64\x5f\x73\x70\x6c\
-\x69\x74\x5f\x6c\x6f\x63\x6b\0\x69\x6e\x5f\x74\x68\x72\x61\x73\x68\x69\x6e\x67\
-\0\x61\x74\x6f\x6d\x69\x63\x5f\x66\x6c\x61\x67\x73\0\x72\x65\x73\x74\x61\x72\
-\x74\x5f\x62\x6c\x6f\x63\x6b\0\x70\x69\x64\0\x74\x67\x69\x64\0\x73\x74\x61\x63\
-\x6b\x5f\x63\x61\x6e\x61\x72\x79\0\x72\x65\x61\x6c\x5f\x70\x61\x72\x65\x6e\x74\
-\0\x70\x61\x72\x65\x6e\x74\0\x63\x68\x69\x6c\x64\x72\x65\x6e\0\x73\x69\x62\x6c\
-\x69\x6e\x67\0\x67\x72\x6f\x75\x70\x5f\x6c\x65\x61\x64\x65\x72\0\x70\x74\x72\
-\x61\x63\x65\x64\0\x70\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\x72\x79\0\x74\x68\
-\x72\x65\x61\x64\x5f\x70\x69\x64\0\x70\x69\x64\x5f\x6c\x69\x6e\x6b\x73\0\x74\
-\x68\x72\x65\x61\x64\x5f\x67\x72\x6f\x75\x70\0\x74\x68\x72\x65\x61\x64\x5f\x6e\
-\x6f\x64\x65\0\x76\x66\x6f\x72\x6b\x5f\x64\x6f\x6e\x65\0\x73\x65\x74\x5f\x63\
-\x68\x69\x6c\x64\x5f\x74\x69\x64\0\x63\x6c\x65\x61\x72\x5f\x63\x68\x69\x6c\x64\
-\x5f\x74\x69\x64\0\x77\x6f\x72\x6b\x65\x72\x5f\x70\x72\x69\x76\x61\x74\x65\0\
-\x75\x74\x69\x6d\x65\0\x73\x74\x69\x6d\x65\0\x67\x74\x69\x6d\x65\0\x70\x72\x65\
-\x76\x5f\x63\x70\x75\x74\x69\x6d\x65\0\x6e\x76\x63\x73\x77\0\x6e\x69\x76\x63\
-\x73\x77\0\x73\x74\x61\x72\x74\x5f\x74\x69\x6d\x65\0\x73\x74\x61\x72\x74\x5f\
-\x62\x6f\x6f\x74\x74\x69\x6d\x65\0\x6d\x69\x6e\x5f\x66\x6c\x74\0\x6d\x61\x6a\
-\x5f\x66\x6c\x74\0\x70\x6f\x73\x69\x78\x5f\x63\x70\x75\x74\x69\x6d\x65\x72\x73\
-\0\x70\x6f\x73\x69\x78\x5f\x63\x70\x75\x74\x69\x6d\x65\x72\x73\x5f\x77\x6f\x72\
-\x6b\0\x70\x74\x72\x61\x63\x65\x72\x5f\x63\x72\x65\x64\0\x72\x65\x61\x6c\x5f\
-\x63\x72\x65\x64\0\x63\x72\x65\x64\0\x63\x61\x63\x68\x65\x64\x5f\x72\x65\x71\
-\x75\x65\x73\x74\x65\x64\x5f\x6b\x65\x79\0\x63\x6f\x6d\x6d\0\x6e\x61\x6d\x65\
-\x69\x64\x61\x74\x61\0\x73\x79\x73\x76\x73\x65\x6d\0\x73\x79\x73\x76\x73\x68\
-\x6d\0\x6c\x61\x73\x74\x5f\x73\x77\x69\x74\x63\x68\x5f\x63\x6f\x75\x6e\x74\0\
-\x6c\x61\x73\x74\x5f\x73\x77\x69\x74\x63\x68\x5f\x74\x69\x6d\x65\0\x66\x73\0\
-\x66\x69\x6c\x65\x73\0\x69\x6f\x5f\x75\x72\x69\x6e\x67\0\x6e\x73\x70\x72\x6f\
-\x78\x79\0\x73\x69\x67\x6e\x61\x6c\0\x73\x69\x67\x68\x61\x6e\x64\0\x62\x6c\x6f\
-\x63\x6b\x65\x64\0\x72\x65\x61\x6c\x5f\x62\x6c\x6f\x63\x6b\x65\x64\0\x73\x61\
-\x76\x65\x64\x5f\x73\x69\x67\x6d\x61\x73\x6b\0\x70\x65\x6e\x64\x69\x6e\x67\0\
-\x73\x61\x73\x5f\x73\x73\x5f\x73\x70\0\x73\x61\x73\x5f\x73\x73\x5f\x73\x69\x7a\
-\x65\0\x73\x61\x73\x5f\x73\x73\x5f\x66\x6c\x61\x67\x73\0\x74\x61\x73\x6b\x5f\
-\x77\x6f\x72\x6b\x73\0\x61\x75\x64\x69\x74\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\
-\x6c\x6f\x67\x69\x6e\x75\x69\x64\0\x73\x65\x73\x73\x69\x6f\x6e\x69\x64\0\x73\
-\x65\x63\x63\x6f\x6d\x70\0\x73\x79\x73\x63\x61\x6c\x6c\x5f\x64\x69\x73\x70\x61\
-\x74\x63\x68\0\x70\x61\x72\x65\x6e\x74\x5f\x65\x78\x65\x63\x5f\x69\x64\0\x73\
-\x65\x6c\x66\x5f\x65\x78\x65\x63\x5f\x69\x64\0\x61\x6c\x6c\x6f\x63\x5f\x6c\x6f\
-\x63\x6b\0\x70\x69\x5f\x6c\x6f\x63\x6b\0\x77\x61\x6b\x65\x5f\x71\0\x70\x69\x5f\
-\x77\x61\x69\x74\x65\x72\x73\0\x70\x69\x5f\x74\x6f\x70\x5f\x74\x61\x73\x6b\0\
-\x70\x69\x5f\x62\x6c\x6f\x63\x6b\x65\x64\x5f\x6f\x6e\0\x62\x6c\x6f\x63\x6b\x65\
-\x64\x5f\x6f\x6e\0\x6e\x6f\x6e\x5f\x62\x6c\x6f\x63\x6b\x5f\x63\x6f\x75\x6e\x74\
-\0\x69\x72\x71\x74\x72\x61\x63\x65\0\x68\x61\x72\x64\x69\x72\x71\x5f\x74\x68\
-\x72\x65\x61\x64\x65\x64\0\x68\x61\x72\x64\x69\x72\x71\x5f\x63\x68\x61\x69\x6e\
-\x5f\x6b\x65\x79\0\x73\x6f\x66\x74\x69\x72\x71\x73\x5f\x65\x6e\x61\x62\x6c\x65\
-\x64\0\x73\x6f\x66\x74\x69\x72\x71\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x69\x72\
-\x71\x5f\x63\x6f\x6e\x66\x69\x67\0\x63\x75\x72\x72\x5f\x63\x68\x61\x69\x6e\x5f\
-\x6b\x65\x79\0\x6c\x6f\x63\x6b\x64\x65\x70\x5f\x64\x65\x70\x74\x68\0\x6c\x6f\
-\x63\x6b\x64\x65\x70\x5f\x72\x65\x63\x75\x72\x73\x69\x6f\x6e\0\x68\x65\x6c\x64\
-\x5f\x6c\x6f\x63\x6b\x73\0\x6a\x6f\x75\x72\x6e\x61\x6c\x5f\x69\x6e\x66\x6f\0\
-\x62\x69\x6f\x5f\x6c\x69\x73\x74\0\x70\x6c\x75\x67\0\x72\x65\x63\x6c\x61\x69\
-\x6d\x5f\x73\x74\x61\x74\x65\0\x62\x61\x63\x6b\x69\x6e\x67\x5f\x64\x65\x76\x5f\
-\x69\x6e\x66\x6f\0\x69\x6f\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x63\x61\x70\x74\
-\x75\x72\x65\x5f\x63\x6f\x6e\x74\x72\x6f\x6c\0\x70\x74\x72\x61\x63\x65\x5f\x6d\
-\x65\x73\x73\x61\x67\x65\0\x6c\x61\x73\x74\x5f\x73\x69\x67\x69\x6e\x66\x6f\0\
-\x69\x6f\x61\x63\0\x61\x63\x63\x74\x5f\x72\x73\x73\x5f\x6d\x65\x6d\x31\0\x61\
-\x63\x63\x74\x5f\x76\x6d\x5f\x6d\x65\x6d\x31\0\x61\x63\x63\x74\x5f\x74\x69\x6d\
-\x65\x78\x70\x64\0\x6d\x65\x6d\x73\x5f\x61\x6c\x6c\x6f\x77\x65\x64\0\x6d\x65\
-\x6d\x73\x5f\x61\x6c\x6c\x6f\x77\x65\x64\x5f\x73\x65\x71\0\x63\x70\x75\x73\x65\
-\x74\x5f\x6d\x65\x6d\x5f\x73\x70\x72\x65\x61\x64\x5f\x72\x6f\x74\x6f\x72\0\x63\
-\x70\x75\x73\x65\x74\x5f\x73\x6c\x61\x62\x5f\x73\x70\x72\x65\x61\x64\x5f\x72\
-\x6f\x74\x6f\x72\0\x63\x67\x72\x6f\x75\x70\x73\0\x63\x67\x5f\x6c\x69\x73\x74\0\
-\x72\x6f\x62\x75\x73\x74\x5f\x6c\x69\x73\x74\0\x70\x69\x5f\x73\x74\x61\x74\x65\
-\x5f\x6c\x69\x73\x74\0\x70\x69\x5f\x73\x74\x61\x74\x65\x5f\x63\x61\x63\x68\x65\
-\0\x66\x75\x74\x65\x78\x5f\x65\x78\x69\x74\x5f\x6d\x75\x74\x65\x78\0\x66\x75\
-\x74\x65\x78\x5f\x73\x74\x61\x74\x65\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\
-\x5f\x63\x74\x78\x70\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x6d\x75\x74\
-\x65\x78\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x6c\x69\x73\x74\0\x70\
-\x72\x65\x65\x6d\x70\x74\x5f\x64\x69\x73\x61\x62\x6c\x65\x5f\x69\x70\0\x6d\x65\
-\x6d\x70\x6f\x6c\x69\x63\x79\0\x69\x6c\x5f\x70\x72\x65\x76\0\x70\x72\x65\x66\
-\x5f\x6e\x6f\x64\x65\x5f\x66\x6f\x72\x6b\0\x6e\x75\x6d\x61\x5f\x73\x63\x61\x6e\
-\x5f\x73\x65\x71\0\x6e\x75\x6d\x61\x5f\x73\x63\x61\x6e\x5f\x70\x65\x72\x69\x6f\
-\x64\0\x6e\x75\x6d\x61\x5f\x73\x63\x61\x6e\x5f\x70\x65\x72\x69\x6f\x64\x5f\x6d\
-\x61\x78\0\x6e\x75\x6d\x61\x5f\x70\x72\x65\x66\x65\x72\x72\x65\x64\x5f\x6e\x69\
-\x64\0\x6e\x75\x6d\x61\x5f\x6d\x69\x67\x72\x61\x74\x65\x5f\x72\x65\x74\x72\x79\
-\0\x6e\x6f\x64\x65\x5f\x73\x74\x61\x6d\x70\0\x6c\x61\x73\x74\x5f\x74\x61\x73\
-\x6b\x5f\x6e\x75\x6d\x61\x5f\x70\x6c\x61\x63\x65\x6d\x65\x6e\x74\0\x6c\x61\x73\
-\x74\x5f\x73\x75\x6d\x5f\x65\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x6e\
-\x75\x6d\x61\x5f\x77\x6f\x72\x6b\0\x6e\x75\x6d\x61\x5f\x67\x72\x6f\x75\x70\0\
-\x6e\x75\x6d\x61\x5f\x66\x61\x75\x6c\x74\x73\0\x74\x6f\x74\x61\x6c\x5f\x6e\x75\
-\x6d\x61\x5f\x66\x61\x75\x6c\x74\x73\0\x6e\x75\x6d\x61\x5f\x66\x61\x75\x6c\x74\
-\x73\x5f\x6c\x6f\x63\x61\x6c\x69\x74\x79\0\x6e\x75\x6d\x61\x5f\x70\x61\x67\x65\
-\x73\x5f\x6d\x69\x67\x72\x61\x74\x65\x64\0\x72\x73\x65\x71\0\x72\x73\x65\x71\
-\x5f\x73\x69\x67\0\x72\x73\x65\x71\x5f\x65\x76\x65\x6e\x74\x5f\x6d\x61\x73\x6b\
-\0\x74\x6c\x62\x5f\x75\x62\x63\0\x73\x70\x6c\x69\x63\x65\x5f\x70\x69\x70\x65\0\
-\x74\x61\x73\x6b\x5f\x66\x72\x61\x67\0\x64\x65\x6c\x61\x79\x73\0\x6d\x61\x6b\
-\x65\x5f\x69\x74\x5f\x66\x61\x69\x6c\0\x66\x61\x69\x6c\x5f\x6e\x74\x68\0\x6e\
-\x72\x5f\x64\x69\x72\x74\x69\x65\x64\0\x6e\x72\x5f\x64\x69\x72\x74\x69\x65\x64\
-\x5f\x70\x61\x75\x73\x65\0\x64\x69\x72\x74\x79\x5f\x70\x61\x75\x73\x65\x64\x5f\
-\x77\x68\x65\x6e\0\x74\x69\x6d\x65\x72\x5f\x73\x6c\x61\x63\x6b\x5f\x6e\x73\0\
-\x64\x65\x66\x61\x75\x6c\x74\x5f\x74\x69\x6d\x65\x72\x5f\x73\x6c\x61\x63\x6b\
-\x5f\x6e\x73\0\x63\x75\x72\x72\x5f\x72\x65\x74\x5f\x73\x74\x61\x63\x6b\0\x63\
-\x75\x72\x72\x5f\x72\x65\x74\x5f\x64\x65\x70\x74\x68\0\x72\x65\x74\x5f\x73\x74\
-\x61\x63\x6b\0\x66\x74\x72\x61\x63\x65\x5f\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\
-\0\x74\x72\x61\x63\x65\x5f\x6f\x76\x65\x72\x72\x75\x6e\0\x74\x72\x61\x63\x69\
-\x6e\x67\x5f\x67\x72\x61\x70\x68\x5f\x70\x61\x75\x73\x65\0\x74\x72\x61\x63\x65\
-\x5f\x72\x65\x63\x75\x72\x73\x69\x6f\x6e\0\x6d\x65\x6d\x63\x67\x5f\x69\x6e\x5f\
-\x6f\x6f\x6d\0\x6d\x65\x6d\x63\x67\x5f\x6f\x6f\x6d\x5f\x67\x66\x70\x5f\x6d\x61\
-\x73\x6b\0\x6d\x65\x6d\x63\x67\x5f\x6f\x6f\x6d\x5f\x6f\x72\x64\x65\x72\0\x6d\
-\x65\x6d\x63\x67\x5f\x6e\x72\x5f\x70\x61\x67\x65\x73\x5f\x6f\x76\x65\x72\x5f\
-\x68\x69\x67\x68\0\x61\x63\x74\x69\x76\x65\x5f\x6d\x65\x6d\x63\x67\0\x74\x68\
-\x72\x6f\x74\x74\x6c\x65\x5f\x71\x75\x65\x75\x65\0\x75\x74\x61\x73\x6b\0\x6b\
-\x6d\x61\x70\x5f\x63\x74\x72\x6c\0\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x65\x5f\
-\x63\x68\x61\x6e\x67\x65\0\x70\x61\x67\x65\x66\x61\x75\x6c\x74\x5f\x64\x69\x73\
-\x61\x62\x6c\x65\x64\0\x6f\x6f\x6d\x5f\x72\x65\x61\x70\x65\x72\x5f\x6c\x69\x73\
-\x74\0\x6f\x6f\x6d\x5f\x72\x65\x61\x70\x65\x72\x5f\x74\x69\x6d\x65\x72\0\x73\
-\x74\x61\x63\x6b\x5f\x76\x6d\x5f\x61\x72\x65\x61\0\x73\x74\x61\x63\x6b\x5f\x72\
-\x65\x66\x63\x6f\x75\x6e\x74\0\x73\x65\x63\x75\x72\x69\x74\x79\0\x62\x70\x66\
-\x5f\x73\x74\x6f\x72\x61\x67\x65\0\x62\x70\x66\x5f\x63\x74\x78\0\x6d\x63\x65\
-\x5f\x76\x61\x64\x64\x72\0\x6d\x63\x65\x5f\x6b\x66\x6c\x61\x67\x73\0\x6d\x63\
-\x65\x5f\x61\x64\x64\x72\0\x6d\x63\x65\x5f\x72\x69\x70\x76\0\x6d\x63\x65\x5f\
-\x77\x68\x6f\x6c\x65\x5f\x70\x61\x67\x65\0\x5f\x5f\x6d\x63\x65\x5f\x72\x65\x73\
-\x65\x72\x76\x65\x64\0\x6d\x63\x65\x5f\x6b\x69\x6c\x6c\x5f\x6d\x65\0\x6d\x63\
-\x65\x5f\x63\x6f\x75\x6e\x74\0\x6b\x72\x65\x74\x70\x72\x6f\x62\x65\x5f\x69\x6e\
-\x73\x74\x61\x6e\x63\x65\x73\0\x72\x65\x74\x68\x6f\x6f\x6b\x73\0\x6c\x31\x64\
-\x5f\x66\x6c\x75\x73\x68\x5f\x6b\x69\x6c\x6c\0\x74\x68\x72\x65\x61\x64\0\x73\
-\x79\x73\x63\x61\x6c\x6c\x5f\x77\x6f\x72\x6b\0\x73\x74\x61\x74\x75\x73\0\x63\
-\x70\x75\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\0\x75\x33\x32\0\
-\x5f\x5f\x75\x33\x32\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x72\
-\x65\x66\x63\x6f\x75\x6e\x74\x5f\x74\0\x72\x65\x66\x63\x6f\x75\x6e\x74\x5f\x73\
-\x74\x72\x75\x63\x74\0\x72\x65\x66\x73\0\x61\x74\x6f\x6d\x69\x63\x5f\x74\0\x63\
-\x6f\x75\x6e\x74\x65\x72\0\x5f\x5f\x63\x61\x6c\x6c\x5f\x73\x69\x6e\x67\x6c\x65\
-\x5f\x6e\x6f\x64\x65\0\x6c\x6c\x69\x73\x74\0\x73\x72\x63\0\x64\x73\x74\0\x6c\
-\x6c\x69\x73\x74\x5f\x6e\x6f\x64\x65\0\x6e\x65\x78\x74\0\x75\x5f\x66\x6c\x61\
-\x67\x73\0\x61\x5f\x66\x6c\x61\x67\x73\0\x75\x31\x36\0\x5f\x5f\x75\x31\x36\0\
-\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\x68\x6f\x72\x74\0\x73\x63\x68\x65\x64\
-\x5f\x65\x6e\x74\x69\x74\x79\0\x6c\x6f\x61\x64\0\x72\x75\x6e\x5f\x6e\x6f\x64\
-\x65\0\x67\x72\x6f\x75\x70\x5f\x6e\x6f\x64\x65\0\x65\x78\x65\x63\x5f\x73\x74\
-\x61\x72\x74\0\x73\x75\x6d\x5f\x65\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\
-\0\x76\x72\x75\x6e\x74\x69\x6d\x65\0\x70\x72\x65\x76\x5f\x73\x75\x6d\x5f\x65\
-\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x6e\x72\x5f\x6d\x69\x67\x72\x61\
-\x74\x69\x6f\x6e\x73\0\x64\x65\x70\x74\x68\0\x63\x66\x73\x5f\x72\x71\0\x6d\x79\
-\x5f\x71\0\x72\x75\x6e\x6e\x61\x62\x6c\x65\x5f\x77\x65\x69\x67\x68\x74\0\x61\
-\x76\x67\0\x6c\x6f\x61\x64\x5f\x77\x65\x69\x67\x68\x74\0\x77\x65\x69\x67\x68\
-\x74\0\x69\x6e\x76\x5f\x77\x65\x69\x67\x68\x74\0\x72\x62\x5f\x6e\x6f\x64\x65\0\
-\x5f\x5f\x72\x62\x5f\x70\x61\x72\x65\x6e\x74\x5f\x63\x6f\x6c\x6f\x72\0\x72\x62\
-\x5f\x72\x69\x67\x68\x74\0\x72\x62\x5f\x6c\x65\x66\x74\0\x6c\x69\x73\x74\x5f\
-\x68\x65\x61\x64\0\x70\x72\x65\x76\0\x75\x36\x34\0\x5f\x5f\x75\x36\x34\0\x73\
-\x63\x68\x65\x64\x5f\x61\x76\x67\0\x6c\x61\x73\x74\x5f\x75\x70\x64\x61\x74\x65\
-\x5f\x74\x69\x6d\x65\0\x6c\x6f\x61\x64\x5f\x73\x75\x6d\0\x72\x75\x6e\x6e\x61\
-\x62\x6c\x65\x5f\x73\x75\x6d\0\x75\x74\x69\x6c\x5f\x73\x75\x6d\0\x70\x65\x72\
-\x69\x6f\x64\x5f\x63\x6f\x6e\x74\x72\x69\x62\0\x6c\x6f\x61\x64\x5f\x61\x76\x67\
-\0\x72\x75\x6e\x6e\x61\x62\x6c\x65\x5f\x61\x76\x67\0\x75\x74\x69\x6c\x5f\x61\
-\x76\x67\0\x75\x74\x69\x6c\x5f\x65\x73\x74\0\x65\x6e\x71\x75\x65\x75\x65\x64\0\
-\x65\x77\x6d\x61\0\x73\x63\x68\x65\x64\x5f\x72\x74\x5f\x65\x6e\x74\x69\x74\x79\
-\0\x72\x75\x6e\x5f\x6c\x69\x73\x74\0\x74\x69\x6d\x65\x6f\x75\x74\0\x77\x61\x74\
-\x63\x68\x64\x6f\x67\x5f\x73\x74\x61\x6d\x70\0\x74\x69\x6d\x65\x5f\x73\x6c\x69\
-\x63\x65\0\x6f\x6e\x5f\x6c\x69\x73\x74\0\x62\x61\x63\x6b\0\x73\x63\x68\x65\x64\
-\x5f\x64\x6c\x5f\x65\x6e\x74\x69\x74\x79\0\x64\x6c\x5f\x72\x75\x6e\x74\x69\x6d\
-\x65\0\x64\x6c\x5f\x64\x65\x61\x64\x6c\x69\x6e\x65\0\x64\x6c\x5f\x70\x65\x72\
-\x69\x6f\x64\0\x64\x6c\x5f\x62\x77\0\x64\x6c\x5f\x64\x65\x6e\x73\x69\x74\x79\0\
-\x72\x75\x6e\x74\x69\x6d\x65\0\x64\x65\x61\x64\x6c\x69\x6e\x65\0\x64\x6c\x5f\
-\x74\x68\x72\x6f\x74\x74\x6c\x65\x64\0\x64\x6c\x5f\x79\x69\x65\x6c\x64\x65\x64\
-\0\x64\x6c\x5f\x6e\x6f\x6e\x5f\x63\x6f\x6e\x74\x65\x6e\x64\x69\x6e\x67\0\x64\
-\x6c\x5f\x6f\x76\x65\x72\x72\x75\x6e\0\x64\x6c\x5f\x74\x69\x6d\x65\x72\0\x69\
-\x6e\x61\x63\x74\x69\x76\x65\x5f\x74\x69\x6d\x65\x72\0\x70\x69\x5f\x73\x65\0\
-\x73\x36\x34\0\x5f\x5f\x73\x36\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x68\
-\x72\x74\x69\x6d\x65\x72\0\x6e\x6f\x64\x65\0\x5f\x73\x6f\x66\x74\x65\x78\x70\
-\x69\x72\x65\x73\0\x66\x75\x6e\x63\x74\x69\x6f\x6e\0\x62\x61\x73\x65\0\x73\x74\
-\x61\x74\x65\0\x69\x73\x5f\x72\x65\x6c\0\x69\x73\x5f\x73\x6f\x66\x74\0\x69\x73\
-\x5f\x68\x61\x72\x64\0\x74\x69\x6d\x65\x72\x71\x75\x65\x75\x65\x5f\x6e\x6f\x64\
-\x65\0\x65\x78\x70\x69\x72\x65\x73\0\x6b\x74\x69\x6d\x65\x5f\x74\0\x68\x72\x74\
-\x69\x6d\x65\x72\x5f\x72\x65\x73\x74\x61\x72\x74\0\x48\x52\x54\x49\x4d\x45\x52\
-\x5f\x4e\x4f\x52\x45\x53\x54\x41\x52\x54\0\x48\x52\x54\x49\x4d\x45\x52\x5f\x52\
-\x45\x53\x54\x41\x52\x54\0\x75\x38\0\x5f\x5f\x75\x38\0\x75\x6e\x73\x69\x67\x6e\
-\x65\x64\x20\x63\x68\x61\x72\0\x73\x63\x68\x65\x64\x5f\x73\x74\x61\x74\x69\x73\
-\x74\x69\x63\x73\0\x77\x61\x69\x74\x5f\x73\x74\x61\x72\x74\0\x77\x61\x69\x74\
-\x5f\x6d\x61\x78\0\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\0\x77\x61\x69\x74\
-\x5f\x73\x75\x6d\0\x69\x6f\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\0\x69\x6f\
-\x77\x61\x69\x74\x5f\x73\x75\x6d\0\x73\x6c\x65\x65\x70\x5f\x73\x74\x61\x72\x74\
-\0\x73\x6c\x65\x65\x70\x5f\x6d\x61\x78\0\x73\x75\x6d\x5f\x73\x6c\x65\x65\x70\
-\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x62\x6c\x6f\x63\x6b\x5f\x73\x74\x61\x72\x74\
-\0\x62\x6c\x6f\x63\x6b\x5f\x6d\x61\x78\0\x73\x75\x6d\x5f\x62\x6c\x6f\x63\x6b\
-\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x65\x78\x65\x63\x5f\x6d\x61\x78\0\x73\x6c\
-\x69\x63\x65\x5f\x6d\x61\x78\0\x6e\x72\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\
-\x73\x5f\x63\x6f\x6c\x64\0\x6e\x72\x5f\x66\x61\x69\x6c\x65\x64\x5f\x6d\x69\x67\
-\x72\x61\x74\x69\x6f\x6e\x73\x5f\x61\x66\x66\x69\x6e\x65\0\x6e\x72\x5f\x66\x61\
-\x69\x6c\x65\x64\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\x5f\x72\x75\x6e\
-\x6e\x69\x6e\x67\0\x6e\x72\x5f\x66\x61\x69\x6c\x65\x64\x5f\x6d\x69\x67\x72\x61\
-\x74\x69\x6f\x6e\x73\x5f\x68\x6f\x74\0\x6e\x72\x5f\x66\x6f\x72\x63\x65\x64\x5f\
-\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\
-\x73\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x73\x79\x6e\x63\0\x6e\x72\
-\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x6d\x69\x67\x72\x61\x74\x65\0\x6e\x72\x5f\
-\x77\x61\x6b\x65\x75\x70\x73\x5f\x6c\x6f\x63\x61\x6c\0\x6e\x72\x5f\x77\x61\x6b\
-\x65\x75\x70\x73\x5f\x72\x65\x6d\x6f\x74\x65\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\
-\x70\x73\x5f\x61\x66\x66\x69\x6e\x65\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\
-\x5f\x61\x66\x66\x69\x6e\x65\x5f\x61\x74\x74\x65\x6d\x70\x74\x73\0\x6e\x72\x5f\
-\x77\x61\x6b\x65\x75\x70\x73\x5f\x70\x61\x73\x73\x69\x76\x65\0\x6e\x72\x5f\x77\
-\x61\x6b\x65\x75\x70\x73\x5f\x69\x64\x6c\x65\0\x63\x70\x75\x6d\x61\x73\x6b\x5f\
-\x74\0\x63\x70\x75\x6d\x61\x73\x6b\0\x62\x69\x74\x73\0\x72\x63\x75\x5f\x73\x70\
-\x65\x63\x69\x61\x6c\0\x62\0\x73\0\x6e\x65\x65\x64\x5f\x71\x73\0\x65\x78\x70\
-\x5f\x68\x69\x6e\x74\0\x6e\x65\x65\x64\x5f\x6d\x62\0\x70\x63\x6f\x75\x6e\x74\0\
-\x72\x75\x6e\x5f\x64\x65\x6c\x61\x79\0\x6c\x61\x73\x74\x5f\x61\x72\x72\x69\x76\
-\x61\x6c\0\x6c\x61\x73\x74\x5f\x71\x75\x65\x75\x65\x64\0\x70\x6c\x69\x73\x74\
-\x5f\x6e\x6f\x64\x65\0\x70\x72\x69\x6f\x5f\x6c\x69\x73\x74\0\x6e\x6f\x64\x65\
-\x5f\x6c\x69\x73\x74\0\x74\x61\x73\x6b\x5f\x72\x73\x73\x5f\x73\x74\x61\x74\0\
-\x65\x76\x65\x6e\x74\x73\0\x63\x6f\x75\x6e\x74\0\x61\x72\x63\x68\x5f\x64\x61\
-\x74\x61\0\x66\x6e\0\x6c\x6f\x6e\x67\0\x66\x75\x74\x65\x78\0\x6e\x61\x6e\x6f\
-\x73\x6c\x65\x65\x70\0\x70\x6f\x6c\x6c\0\x75\x61\x64\x64\x72\0\x76\x61\x6c\0\
-\x62\x69\x74\x73\x65\x74\0\x74\x69\x6d\x65\0\x75\x61\x64\x64\x72\x32\0\x63\x6c\
-\x6f\x63\x6b\x69\x64\0\x63\x6c\x6f\x63\x6b\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\
-\x72\x6e\x65\x6c\x5f\x63\x6c\x6f\x63\x6b\x69\x64\x5f\x74\0\x74\x69\x6d\x65\x73\
-\x70\x65\x63\x5f\x74\x79\x70\x65\0\x54\x54\x5f\x4e\x4f\x4e\x45\0\x54\x54\x5f\
-\x4e\x41\x54\x49\x56\x45\0\x54\x54\x5f\x43\x4f\x4d\x50\x41\x54\0\x72\x6d\x74\
-\x70\0\x63\x6f\x6d\x70\x61\x74\x5f\x72\x6d\x74\x70\0\x75\x66\x64\x73\0\x6e\x66\
-\x64\x73\0\x68\x61\x73\x5f\x74\x69\x6d\x65\x6f\x75\x74\0\x74\x76\x5f\x73\x65\
-\x63\0\x74\x76\x5f\x6e\x73\x65\x63\0\x70\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\x72\
-\x6e\x65\x6c\x5f\x70\x69\x64\x5f\x74\0\x68\x6c\x69\x73\x74\x5f\x6e\x6f\x64\x65\
-\0\x70\x70\x72\x65\x76\0\x6c\x6f\x63\x6b\0\x72\x61\x77\x5f\x73\x70\x69\x6e\x6c\
-\x6f\x63\x6b\x5f\x74\0\x72\x61\x77\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x72\
-\x61\x77\x5f\x6c\x6f\x63\x6b\0\x6d\x61\x67\x69\x63\0\x6f\x77\x6e\x65\x72\x5f\
-\x63\x70\x75\0\x6f\x77\x6e\x65\x72\0\x64\x65\x70\x5f\x6d\x61\x70\0\x61\x72\x63\
-\x68\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\0\x71\x73\x70\x69\x6e\x6c\x6f\
-\x63\x6b\0\x6c\x6f\x63\x6b\x65\x64\0\x6c\x6f\x63\x6b\x65\x64\x5f\x70\x65\x6e\
-\x64\x69\x6e\x67\0\x74\x61\x69\x6c\0\x6c\x6f\x63\x6b\x64\x65\x70\x5f\x6d\x61\
-\x70\0\x6b\x65\x79\0\x63\x6c\x61\x73\x73\x5f\x63\x61\x63\x68\x65\0\x6e\x61\x6d\
-\x65\0\x77\x61\x69\x74\x5f\x74\x79\x70\x65\x5f\x6f\x75\x74\x65\x72\0\x77\x61\
-\x69\x74\x5f\x74\x79\x70\x65\x5f\x69\x6e\x6e\x65\x72\0\x6c\x6f\x63\x6b\x5f\x74\
-\x79\x70\x65\0\x6c\x6f\x63\x6b\x5f\x63\x6c\x61\x73\x73\0\x68\x61\x73\x68\x5f\
-\x65\x6e\x74\x72\x79\0\x6c\x6f\x63\x6b\x5f\x65\x6e\x74\x72\x79\0\x6c\x6f\x63\
-\x6b\x73\x5f\x61\x66\x74\x65\x72\0\x6c\x6f\x63\x6b\x73\x5f\x62\x65\x66\x6f\x72\
-\x65\0\x73\x75\x62\x63\x6c\x61\x73\x73\0\x64\x65\x70\x5f\x67\x65\x6e\x5f\x69\
-\x64\0\x75\x73\x61\x67\x65\x5f\x6d\x61\x73\x6b\0\x75\x73\x61\x67\x65\x5f\x74\
-\x72\x61\x63\x65\x73\0\x6e\x61\x6d\x65\x5f\x76\x65\x72\x73\x69\x6f\x6e\0\x6c\
-\x6f\x63\x6b\x5f\x74\x72\x61\x63\x65\0\x68\x61\x73\x68\0\x6e\x72\x5f\x65\x6e\
-\x74\x72\x69\x65\x73\0\x65\x6e\x74\x72\x69\x65\x73\0\x63\x68\x61\x72\0\x62\x61\
-\x73\x65\x73\0\x74\x69\x6d\x65\x72\x73\x5f\x61\x63\x74\x69\x76\x65\0\x65\x78\
-\x70\x69\x72\x79\x5f\x61\x63\x74\x69\x76\x65\0\x70\x6f\x73\x69\x78\x5f\x63\x70\
-\x75\x74\x69\x6d\x65\x72\x5f\x62\x61\x73\x65\0\x6e\x65\x78\x74\x65\x76\x74\0\
-\x74\x71\x68\x65\x61\x64\0\x74\x69\x6d\x65\x72\x71\x75\x65\x75\x65\x5f\x68\x65\
-\x61\x64\0\x72\x62\x5f\x72\x6f\x6f\x74\0\x72\x62\x5f\x72\x6f\x6f\x74\x5f\x63\
-\x61\x63\x68\x65\x64\0\x72\x62\x5f\x6c\x65\x66\x74\x6d\x6f\x73\x74\0\x77\x6f\
-\x72\x6b\0\x73\x63\x68\x65\x64\x75\x6c\x65\x64\0\x63\x61\x6c\x6c\x62\x61\x63\
-\x6b\x5f\x68\x65\x61\x64\0\x66\x75\x6e\x63\0\x73\x79\x73\x76\x5f\x73\x65\x6d\0\
-\x75\x6e\x64\x6f\x5f\x6c\x69\x73\x74\0\x73\x79\x73\x76\x5f\x73\x68\x6d\0\x73\
-\x68\x6d\x5f\x63\x6c\x69\x73\x74\0\x73\x69\x67\x73\x65\x74\x5f\x74\0\x73\x69\
-\x67\0\x73\x69\x67\x70\x65\x6e\x64\x69\x6e\x67\0\x6c\x69\x73\x74\0\x73\x69\x7a\
-\x65\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x69\x7a\x65\x5f\x74\0\
-\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x75\x6c\x6f\x6e\x67\x5f\x74\0\x6b\x75\x69\
-\x64\x5f\x74\0\x75\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x75\
-\x69\x64\x33\x32\x5f\x74\0\x6d\x6f\x64\x65\0\x66\x69\x6c\x74\x65\x72\x5f\x63\
-\x6f\x75\x6e\x74\0\x66\x69\x6c\x74\x65\x72\0\x73\x79\x73\x63\x61\x6c\x6c\x5f\
-\x75\x73\x65\x72\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\x73\x65\x6c\x65\x63\x74\
-\x6f\x72\0\x6f\x66\x66\x73\x65\x74\0\x6c\x65\x6e\0\x6f\x6e\x5f\x64\x69\x73\x70\
-\x61\x74\x63\x68\0\x62\x6f\x6f\x6c\0\x5f\x42\x6f\x6f\x6c\0\x73\x70\x69\x6e\x6c\
-\x6f\x63\x6b\x5f\x74\0\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x72\x6c\x6f\x63\x6b\0\
-\x5f\x5f\x70\x61\x64\x64\x69\x6e\x67\0\x77\x61\x6b\x65\x5f\x71\x5f\x6e\x6f\x64\
-\x65\0\x69\x72\x71\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x73\0\x69\x72\
-\x71\x5f\x65\x76\x65\x6e\x74\x73\0\x68\x61\x72\x64\x69\x72\x71\x5f\x65\x6e\x61\
-\x62\x6c\x65\x5f\x69\x70\0\x68\x61\x72\x64\x69\x72\x71\x5f\x64\x69\x73\x61\x62\
-\x6c\x65\x5f\x69\x70\0\x68\x61\x72\x64\x69\x72\x71\x5f\x65\x6e\x61\x62\x6c\x65\
-\x5f\x65\x76\x65\x6e\x74\0\x68\x61\x72\x64\x69\x72\x71\x5f\x64\x69\x73\x61\x62\
-\x6c\x65\x5f\x65\x76\x65\x6e\x74\0\x73\x6f\x66\x74\x69\x72\x71\x5f\x64\x69\x73\
-\x61\x62\x6c\x65\x5f\x69\x70\0\x73\x6f\x66\x74\x69\x72\x71\x5f\x65\x6e\x61\x62\
-\x6c\x65\x5f\x69\x70\0\x73\x6f\x66\x74\x69\x72\x71\x5f\x64\x69\x73\x61\x62\x6c\
-\x65\x5f\x65\x76\x65\x6e\x74\0\x73\x6f\x66\x74\x69\x72\x71\x5f\x65\x6e\x61\x62\
-\x6c\x65\x5f\x65\x76\x65\x6e\x74\0\x68\x65\x6c\x64\x5f\x6c\x6f\x63\x6b\0\x70\
-\x72\x65\x76\x5f\x63\x68\x61\x69\x6e\x5f\x6b\x65\x79\0\x61\x63\x71\x75\x69\x72\
-\x65\x5f\x69\x70\0\x69\x6e\x73\x74\x61\x6e\x63\x65\0\x6e\x65\x73\x74\x5f\x6c\
-\x6f\x63\x6b\0\x63\x6c\x61\x73\x73\x5f\x69\x64\x78\0\x69\x72\x71\x5f\x63\x6f\
-\x6e\x74\x65\x78\x74\0\x74\x72\x79\x6c\x6f\x63\x6b\0\x72\x65\x61\x64\0\x63\x68\
-\x65\x63\x6b\0\x68\x61\x72\x64\x69\x72\x71\x73\x5f\x6f\x66\x66\0\x72\x65\x66\
-\x65\x72\x65\x6e\x63\x65\x73\0\x70\x69\x6e\x5f\x63\x6f\x75\x6e\x74\0\x6b\x65\
-\x72\x6e\x65\x6c\x5f\x73\x69\x67\x69\x6e\x66\x6f\x5f\x74\0\x74\x61\x73\x6b\x5f\
-\x69\x6f\x5f\x61\x63\x63\x6f\x75\x6e\x74\x69\x6e\x67\0\x72\x63\x68\x61\x72\0\
-\x77\x63\x68\x61\x72\0\x73\x79\x73\x63\x72\0\x73\x79\x73\x63\x77\0\x72\x65\x61\
-\x64\x5f\x62\x79\x74\x65\x73\0\x77\x72\x69\x74\x65\x5f\x62\x79\x74\x65\x73\0\
-\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x5f\x77\x72\x69\x74\x65\x5f\x62\x79\x74\
-\x65\x73\0\x6e\x6f\x64\x65\x6d\x61\x73\x6b\x5f\x74\0\x73\x65\x71\x63\x6f\x75\
-\x6e\x74\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\0\x73\x65\x71\x63\x6f\x75\
-\x6e\x74\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x73\x65\x71\x63\x6f\x75\x6e\x74\
-\0\x73\x65\x71\x63\x6f\x75\x6e\x74\x5f\x74\0\x73\x65\x71\x75\x65\x6e\x63\x65\0\
-\x6d\x75\x74\x65\x78\0\x77\x61\x69\x74\x5f\x6c\x6f\x63\x6b\0\x6f\x73\x71\0\x77\
-\x61\x69\x74\x5f\x6c\x69\x73\x74\0\x61\x74\x6f\x6d\x69\x63\x5f\x6c\x6f\x6e\x67\
-\x5f\x74\0\x61\x74\x6f\x6d\x69\x63\x36\x34\x5f\x74\0\x6f\x70\x74\x69\x6d\x69\
-\x73\x74\x69\x63\x5f\x73\x70\x69\x6e\x5f\x71\x75\x65\x75\x65\0\x70\x65\x72\x66\
-\x5f\x65\x76\x65\x6e\x74\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x70\x6d\x75\0\x61\
-\x63\x74\x69\x76\x65\x5f\x63\x74\x78\x5f\x6c\x69\x73\x74\0\x70\x69\x6e\x6e\x65\
-\x64\x5f\x67\x72\x6f\x75\x70\x73\0\x66\x6c\x65\x78\x69\x62\x6c\x65\x5f\x67\x72\
-\x6f\x75\x70\x73\0\x65\x76\x65\x6e\x74\x5f\x6c\x69\x73\x74\0\x70\x69\x6e\x6e\
-\x65\x64\x5f\x61\x63\x74\x69\x76\x65\0\x66\x6c\x65\x78\x69\x62\x6c\x65\x5f\x61\
-\x63\x74\x69\x76\x65\0\x6e\x72\x5f\x65\x76\x65\x6e\x74\x73\0\x6e\x72\x5f\x61\
-\x63\x74\x69\x76\x65\0\x6e\x72\x5f\x75\x73\x65\x72\0\x69\x73\x5f\x61\x63\x74\
-\x69\x76\x65\0\x6e\x72\x5f\x73\x74\x61\x74\0\x6e\x72\x5f\x66\x72\x65\x71\0\x72\
-\x6f\x74\x61\x74\x65\x5f\x64\x69\x73\x61\x62\x6c\x65\0\x72\x6f\x74\x61\x74\x65\
-\x5f\x6e\x65\x63\x65\x73\x73\x61\x72\x79\0\x72\x65\x66\x63\x6f\x75\x6e\x74\0\
-\x74\x61\x73\x6b\0\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\0\x74\x69\x6d\x65\x6f\
-\x66\x66\x73\x65\x74\0\x70\x61\x72\x65\x6e\x74\x5f\x63\x74\x78\0\x70\x61\x72\
-\x65\x6e\x74\x5f\x67\x65\x6e\0\x67\x65\x6e\x65\x72\x61\x74\x69\x6f\x6e\0\x6e\
-\x72\x5f\x63\x67\x72\x6f\x75\x70\x73\0\x74\x61\x73\x6b\x5f\x63\x74\x78\x5f\x64\
-\x61\x74\x61\0\x6e\x72\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x70\x65\x72\x66\x5f\
-\x65\x76\x65\x6e\x74\x5f\x67\x72\x6f\x75\x70\x73\0\x74\x72\x65\x65\0\x69\x6e\
-\x64\x65\x78\0\x6c\x6f\x63\x61\x6c\x5f\x74\0\x61\0\x73\x68\x6f\x72\x74\0\x74\
-\x6c\x62\x66\x6c\x75\x73\x68\x5f\x75\x6e\x6d\x61\x70\x5f\x62\x61\x74\x63\x68\0\
-\x61\x72\x63\x68\0\x66\x6c\x75\x73\x68\x5f\x72\x65\x71\x75\x69\x72\x65\x64\0\
-\x77\x72\x69\x74\x61\x62\x6c\x65\0\x61\x72\x63\x68\x5f\x74\x6c\x62\x66\x6c\x75\
-\x73\x68\x5f\x75\x6e\x6d\x61\x70\x5f\x62\x61\x74\x63\x68\0\x72\x63\x75\x5f\x75\
-\x73\x65\x72\x73\0\x72\x63\x75\0\x70\x61\x67\x65\x5f\x66\x72\x61\x67\0\x70\x61\
-\x67\x65\0\x73\x69\x7a\x65\0\x67\x66\x70\x5f\x74\0\x74\x69\x6d\x65\x72\x5f\x6c\
-\x69\x73\x74\0\x65\x6e\x74\x72\x79\0\x6c\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\
-\x66\x69\x72\x73\x74\0\x74\x68\x72\x65\x61\x64\x5f\x73\x74\x72\x75\x63\x74\0\
-\x74\x6c\x73\x5f\x61\x72\x72\x61\x79\0\x73\x70\0\x65\x73\0\x64\x73\0\x66\x73\
-\x69\x6e\x64\x65\x78\0\x67\x73\x69\x6e\x64\x65\x78\0\x66\x73\x62\x61\x73\x65\0\
-\x67\x73\x62\x61\x73\x65\0\x70\x74\x72\x61\x63\x65\x5f\x62\x70\x73\0\x76\x69\
-\x72\x74\x75\x61\x6c\x5f\x64\x72\x36\0\x70\x74\x72\x61\x63\x65\x5f\x64\x72\x37\
-\0\x63\x72\x32\0\x74\x72\x61\x70\x5f\x6e\x72\0\x65\x72\x72\x6f\x72\x5f\x63\x6f\
-\x64\x65\0\x69\x6f\x5f\x62\x69\x74\x6d\x61\x70\0\x69\x6f\x70\x6c\x5f\x65\x6d\
-\x75\x6c\0\x69\x6f\x70\x6c\x5f\x77\x61\x72\x6e\0\x73\x69\x67\x5f\x6f\x6e\x5f\
-\x75\x61\x63\x63\x65\x73\x73\x5f\x65\x72\x72\0\x70\x6b\x72\x75\0\x66\x70\x75\0\
-\x64\x65\x73\x63\x5f\x73\x74\x72\x75\x63\x74\0\x6c\x69\x6d\x69\x74\x30\0\x62\
-\x61\x73\x65\x30\0\x62\x61\x73\x65\x31\0\x64\x70\x6c\0\x70\0\x6c\x69\x6d\x69\
-\x74\x31\0\x61\x76\x6c\0\x6c\0\x64\0\x67\0\x62\x61\x73\x65\x32\0\x70\x65\x72\
-\x66\x5f\x65\x76\x65\x6e\x74\0\x65\x76\x65\x6e\x74\x5f\x65\x6e\x74\x72\x79\0\
-\x73\x69\x62\x6c\x69\x6e\x67\x5f\x6c\x69\x73\x74\0\x61\x63\x74\x69\x76\x65\x5f\
-\x6c\x69\x73\x74\0\x67\x72\x6f\x75\x70\x5f\x69\x6e\x64\x65\x78\0\x6d\x69\x67\
-\x72\x61\x74\x65\x5f\x65\x6e\x74\x72\x79\0\x68\x6c\x69\x73\x74\x5f\x65\x6e\x74\
-\x72\x79\0\x61\x63\x74\x69\x76\x65\x5f\x65\x6e\x74\x72\x79\0\x6e\x72\x5f\x73\
-\x69\x62\x6c\x69\x6e\x67\x73\0\x65\x76\x65\x6e\x74\x5f\x63\x61\x70\x73\0\x67\
-\x72\x6f\x75\x70\x5f\x63\x61\x70\x73\0\x70\x6d\x75\x5f\x70\x72\x69\x76\x61\x74\
-\x65\0\x61\x74\x74\x61\x63\x68\x5f\x73\x74\x61\x74\x65\0\x63\x68\x69\x6c\x64\
-\x5f\x63\x6f\x75\x6e\x74\0\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x65\x6e\
-\x61\x62\x6c\x65\x64\0\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x72\x75\x6e\
-\x6e\x69\x6e\x67\0\x74\x73\x74\x61\x6d\x70\0\x61\x74\x74\x72\0\x68\x65\x61\x64\
-\x65\x72\x5f\x73\x69\x7a\x65\0\x69\x64\x5f\x68\x65\x61\x64\x65\x72\x5f\x73\x69\
-\x7a\x65\0\x72\x65\x61\x64\x5f\x73\x69\x7a\x65\0\x68\x77\0\x63\x68\x69\x6c\x64\
-\x5f\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x65\x6e\x61\x62\x6c\x65\x64\0\
-\x63\x68\x69\x6c\x64\x5f\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x72\x75\
-\x6e\x6e\x69\x6e\x67\0\x63\x68\x69\x6c\x64\x5f\x6d\x75\x74\x65\x78\0\x63\x68\
-\x69\x6c\x64\x5f\x6c\x69\x73\x74\0\x6f\x6e\x63\x70\x75\0\x6f\x77\x6e\x65\x72\
-\x5f\x65\x6e\x74\x72\x79\0\x6d\x6d\x61\x70\x5f\x6d\x75\x74\x65\x78\0\x6d\x6d\
-\x61\x70\x5f\x63\x6f\x75\x6e\x74\0\x72\x62\0\x72\x62\x5f\x65\x6e\x74\x72\x79\0\
-\x72\x63\x75\x5f\x62\x61\x74\x63\x68\x65\x73\0\x72\x63\x75\x5f\x70\x65\x6e\x64\
-\x69\x6e\x67\0\x77\x61\x69\x74\x71\0\x66\x61\x73\x79\x6e\x63\0\x70\x65\x6e\x64\
-\x69\x6e\x67\x5f\x77\x61\x6b\x65\x75\x70\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x6b\
-\x69\x6c\x6c\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x64\x69\x73\x61\x62\x6c\x65\0\
-\x70\x65\x6e\x64\x69\x6e\x67\x5f\x73\x69\x67\x74\x72\x61\x70\0\x70\x65\x6e\x64\
-\x69\x6e\x67\x5f\x61\x64\x64\x72\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x69\x72\x71\
-\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x74\x61\x73\x6b\0\x70\x65\x6e\x64\x69\x6e\
-\x67\x5f\x77\x6f\x72\x6b\0\x65\x76\x65\x6e\x74\x5f\x6c\x69\x6d\x69\x74\0\x61\
-\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x73\0\x61\x64\x64\x72\x5f\x66\x69\x6c\
-\x74\x65\x72\x5f\x72\x61\x6e\x67\x65\x73\0\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\
-\x65\x72\x73\x5f\x67\x65\x6e\0\x61\x75\x78\x5f\x65\x76\x65\x6e\x74\0\x64\x65\
-\x73\x74\x72\x6f\x79\0\x6e\x73\0\x69\x64\0\x6c\x6f\x73\x74\x5f\x73\x61\x6d\x70\
-\x6c\x65\x73\0\x63\x6c\x6f\x63\x6b\0\x6f\x76\x65\x72\x66\x6c\x6f\x77\x5f\x68\
-\x61\x6e\x64\x6c\x65\x72\0\x6f\x76\x65\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\x64\
-\x6c\x65\x72\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x6f\x72\x69\x67\x5f\x6f\x76\x65\
-\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\x64\x6c\x65\x72\0\x70\x72\x6f\x67\0\x62\
-\x70\x66\x5f\x63\x6f\x6f\x6b\x69\x65\0\x74\x70\x5f\x65\x76\x65\x6e\x74\0\x66\
-\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\0\x63\x67\x72\x70\0\x73\x62\x5f\x6c\x69\
-\x73\x74\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x73\x74\x61\x74\x65\0\
-\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x44\x45\
-\x41\x44\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\
-\x45\x58\x49\x54\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\
-\x45\x5f\x45\x52\x52\x4f\x52\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\
-\x54\x41\x54\x45\x5f\x4f\x46\x46\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\
-\x53\x54\x41\x54\x45\x5f\x49\x4e\x41\x43\x54\x49\x56\x45\0\x50\x45\x52\x46\x5f\
-\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x41\x43\x54\x49\x56\x45\0\x6c\
-\x6f\x63\x61\x6c\x36\x34\x5f\x74\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\
-\x61\x74\x74\x72\0\x63\x6f\x6e\x66\x69\x67\0\x73\x61\x6d\x70\x6c\x65\x5f\x74\
-\x79\x70\x65\0\x72\x65\x61\x64\x5f\x66\x6f\x72\x6d\x61\x74\0\x64\x69\x73\x61\
-\x62\x6c\x65\x64\0\x69\x6e\x68\x65\x72\x69\x74\0\x70\x69\x6e\x6e\x65\x64\0\x65\
-\x78\x63\x6c\x75\x73\x69\x76\x65\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x75\x73\x65\
-\x72\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x6b\x65\x72\x6e\x65\x6c\0\x65\x78\x63\
-\x6c\x75\x64\x65\x5f\x68\x76\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x69\x64\x6c\x65\
-\0\x6d\x6d\x61\x70\0\x66\x72\x65\x71\0\x69\x6e\x68\x65\x72\x69\x74\x5f\x73\x74\
-\x61\x74\0\x65\x6e\x61\x62\x6c\x65\x5f\x6f\x6e\x5f\x65\x78\x65\x63\0\x77\x61\
-\x74\x65\x72\x6d\x61\x72\x6b\0\x70\x72\x65\x63\x69\x73\x65\x5f\x69\x70\0\x6d\
-\x6d\x61\x70\x5f\x64\x61\x74\x61\0\x73\x61\x6d\x70\x6c\x65\x5f\x69\x64\x5f\x61\
-\x6c\x6c\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x68\x6f\x73\x74\0\x65\x78\x63\x6c\
-\x75\x64\x65\x5f\x67\x75\x65\x73\x74\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x63\x61\
-\x6c\x6c\x63\x68\x61\x69\x6e\x5f\x6b\x65\x72\x6e\x65\x6c\0\x65\x78\x63\x6c\x75\
-\x64\x65\x5f\x63\x61\x6c\x6c\x63\x68\x61\x69\x6e\x5f\x75\x73\x65\x72\0\x6d\x6d\
-\x61\x70\x32\0\x63\x6f\x6d\x6d\x5f\x65\x78\x65\x63\0\x75\x73\x65\x5f\x63\x6c\
-\x6f\x63\x6b\x69\x64\0\x63\x6f\x6e\x74\x65\x78\x74\x5f\x73\x77\x69\x74\x63\x68\
-\0\x77\x72\x69\x74\x65\x5f\x62\x61\x63\x6b\x77\x61\x72\x64\0\x6e\x61\x6d\x65\
-\x73\x70\x61\x63\x65\x73\0\x6b\x73\x79\x6d\x62\x6f\x6c\0\x62\x70\x66\x5f\x65\
-\x76\x65\x6e\x74\0\x61\x75\x78\x5f\x6f\x75\x74\x70\x75\x74\0\x63\x67\x72\x6f\
-\x75\x70\0\x74\x65\x78\x74\x5f\x70\x6f\x6b\x65\0\x62\x75\x69\x6c\x64\x5f\x69\
-\x64\0\x69\x6e\x68\x65\x72\x69\x74\x5f\x74\x68\x72\x65\x61\x64\0\x72\x65\x6d\
-\x6f\x76\x65\x5f\x6f\x6e\x5f\x65\x78\x65\x63\0\x73\x69\x67\x74\x72\x61\x70\0\
-\x5f\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x5f\x31\0\x62\x70\x5f\x74\x79\x70\x65\
-\0\x62\x72\x61\x6e\x63\x68\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x74\x79\x70\x65\0\
-\x73\x61\x6d\x70\x6c\x65\x5f\x72\x65\x67\x73\x5f\x75\x73\x65\x72\0\x73\x61\x6d\
-\x70\x6c\x65\x5f\x73\x74\x61\x63\x6b\x5f\x75\x73\x65\x72\0\x73\x61\x6d\x70\x6c\
-\x65\x5f\x72\x65\x67\x73\x5f\x69\x6e\x74\x72\0\x61\x75\x78\x5f\x77\x61\x74\x65\
-\x72\x6d\x61\x72\x6b\0\x73\x61\x6d\x70\x6c\x65\x5f\x6d\x61\x78\x5f\x73\x74\x61\
-\x63\x6b\0\x5f\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x5f\x32\0\x61\x75\x78\x5f\
-\x73\x61\x6d\x70\x6c\x65\x5f\x73\x69\x7a\x65\0\x5f\x5f\x72\x65\x73\x65\x72\x76\
-\x65\x64\x5f\x33\0\x73\x69\x67\x5f\x64\x61\x74\x61\0\x73\x61\x6d\x70\x6c\x65\
-\x5f\x70\x65\x72\x69\x6f\x64\0\x73\x61\x6d\x70\x6c\x65\x5f\x66\x72\x65\x71\0\
-\x77\x61\x6b\x65\x75\x70\x5f\x65\x76\x65\x6e\x74\x73\0\x77\x61\x6b\x65\x75\x70\
-\x5f\x77\x61\x74\x65\x72\x6d\x61\x72\x6b\0\x62\x70\x5f\x61\x64\x64\x72\0\x6b\
-\x70\x72\x6f\x62\x65\x5f\x66\x75\x6e\x63\0\x75\x70\x72\x6f\x62\x65\x5f\x70\x61\
-\x74\x68\0\x63\x6f\x6e\x66\x69\x67\x31\0\x62\x70\x5f\x6c\x65\x6e\0\x6b\x70\x72\
-\x6f\x62\x65\x5f\x61\x64\x64\x72\0\x70\x72\x6f\x62\x65\x5f\x6f\x66\x66\x73\x65\
-\x74\0\x63\x6f\x6e\x66\x69\x67\x32\0\x5f\x5f\x73\x33\x32\0\x68\x77\x5f\x70\x65\
-\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x74\x61\x72\x67\x65\x74\0\x70\x72\x65\x76\
-\x5f\x63\x6f\x75\x6e\x74\0\x69\x6e\x74\x65\x72\x72\x75\x70\x74\x73\x5f\x73\x65\
-\x71\0\x69\x6e\x74\x65\x72\x72\x75\x70\x74\x73\0\x66\x72\x65\x71\x5f\x74\x69\
-\x6d\x65\x5f\x73\x74\x61\x6d\x70\0\x66\x72\x65\x71\x5f\x63\x6f\x75\x6e\x74\x5f\
-\x73\x74\x61\x6d\x70\0\x6c\x61\x73\x74\x5f\x74\x61\x67\0\x63\x6f\x6e\x66\x69\
-\x67\x5f\x62\x61\x73\x65\0\x65\x76\x65\x6e\x74\x5f\x62\x61\x73\x65\0\x65\x76\
-\x65\x6e\x74\x5f\x62\x61\x73\x65\x5f\x72\x64\x70\x6d\x63\0\x69\x64\x78\0\x6c\
-\x61\x73\x74\x5f\x63\x70\x75\0\x65\x78\x74\x72\x61\x5f\x72\x65\x67\0\x62\x72\
-\x61\x6e\x63\x68\x5f\x72\x65\x67\0\x68\x77\x5f\x70\x65\x72\x66\x5f\x65\x76\x65\
-\x6e\x74\x5f\x65\x78\x74\x72\x61\0\x72\x65\x67\0\x61\x6c\x6c\x6f\x63\0\x74\x70\
-\x5f\x6c\x69\x73\x74\0\x70\x77\x72\x5f\x61\x63\x63\0\x70\x74\x73\x63\0\x69\x6e\
-\x66\x6f\0\x62\x70\x5f\x6c\x69\x73\x74\0\x61\x72\x63\x68\x5f\x68\x77\x5f\x62\
-\x72\x65\x61\x6b\x70\x6f\x69\x6e\x74\0\x61\x64\x64\x72\x65\x73\x73\0\x6d\x61\
-\x73\x6b\0\x72\x68\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\x72\x68\x65\x61\x64\0\
-\x72\x68\x61\x73\x68\x5f\x68\x65\x61\x64\0\x69\x6f\x6d\x6d\x75\x5f\x62\x61\x6e\
-\x6b\0\x69\x6f\x6d\x6d\x75\x5f\x63\x6e\x74\x72\0\x70\x61\x64\x64\x69\x6e\x67\0\
-\x63\x6f\x6e\x66\0\x63\x6f\x6e\x66\x31\0\x6c\x61\x73\x74\x5f\x70\x65\x72\x69\
-\x6f\x64\0\x70\x65\x72\x69\x6f\x64\x5f\x6c\x65\x66\x74\0\x73\x61\x76\x65\x64\
-\x5f\x6d\x65\x74\x72\x69\x63\0\x73\x61\x76\x65\x64\x5f\x73\x6c\x6f\x74\x73\0\
-\x77\x61\x69\x74\x5f\x71\x75\x65\x75\x65\x5f\x68\x65\x61\x64\x5f\x74\0\x77\x61\
-\x69\x74\x5f\x71\x75\x65\x75\x65\x5f\x68\x65\x61\x64\0\x68\x65\x61\x64\0\x69\
-\x72\x71\x5f\x77\x6f\x72\x6b\0\x69\x72\x71\x77\x61\x69\x74\0\x72\x63\x75\x77\
-\x61\x69\x74\0\x70\x65\x72\x66\x5f\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\
-\x73\x5f\x68\x65\x61\x64\0\x6e\x72\x5f\x66\x69\x6c\x65\x5f\x66\x69\x6c\x74\x65\
-\x72\x73\0\x70\x65\x72\x66\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\
-\x64\x6c\x65\x72\x5f\x74\0\x70\x65\x72\x66\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x64\
-\x61\x74\x61\0\x73\x61\x6d\x70\x6c\x65\x5f\x66\x6c\x61\x67\x73\0\x70\x65\x72\
-\x69\x6f\x64\0\x62\x72\x5f\x73\x74\x61\x63\x6b\0\x64\x61\x74\x61\x5f\x73\x72\
-\x63\0\x74\x78\x6e\0\x61\x64\x64\x72\0\x72\x61\x77\0\x69\x70\0\x74\x69\x64\x5f\
-\x65\x6e\x74\x72\x79\0\x73\x74\x72\x65\x61\x6d\x5f\x69\x64\0\x63\x70\x75\x5f\
-\x65\x6e\x74\x72\x79\0\x63\x61\x6c\x6c\x63\x68\x61\x69\x6e\0\x61\x75\x78\x5f\
-\x73\x69\x7a\x65\0\x72\x65\x67\x73\x5f\x75\x73\x65\x72\0\x72\x65\x67\x73\x5f\
-\x69\x6e\x74\x72\0\x73\x74\x61\x63\x6b\x5f\x75\x73\x65\x72\x5f\x73\x69\x7a\x65\
-\0\x70\x68\x79\x73\x5f\x61\x64\x64\x72\0\x64\x61\x74\x61\x5f\x70\x61\x67\x65\
-\x5f\x73\x69\x7a\x65\0\x63\x6f\x64\x65\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\
-\0\x70\x65\x72\x66\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x77\x65\x69\x67\x68\x74\0\
-\x66\x75\x6c\x6c\0\x76\x61\x72\x31\x5f\x64\x77\0\x76\x61\x72\x32\x5f\x77\0\x76\
-\x61\x72\x33\x5f\x77\0\x70\x65\x72\x66\x5f\x6d\x65\x6d\x5f\x64\x61\x74\x61\x5f\
-\x73\x72\x63\0\x6d\x65\x6d\x5f\x6f\x70\0\x6d\x65\x6d\x5f\x6c\x76\x6c\0\x6d\x65\
-\x6d\x5f\x73\x6e\x6f\x6f\x70\0\x6d\x65\x6d\x5f\x6c\x6f\x63\x6b\0\x6d\x65\x6d\
-\x5f\x64\x74\x6c\x62\0\x6d\x65\x6d\x5f\x6c\x76\x6c\x5f\x6e\x75\x6d\0\x6d\x65\
-\x6d\x5f\x72\x65\x6d\x6f\x74\x65\0\x6d\x65\x6d\x5f\x73\x6e\x6f\x6f\x70\x78\0\
-\x6d\x65\x6d\x5f\x62\x6c\x6b\0\x6d\x65\x6d\x5f\x68\x6f\x70\x73\0\x6d\x65\x6d\
-\x5f\x72\x73\x76\x64\0\x74\x69\x64\0\x72\x65\x73\x65\x72\x76\x65\x64\0\x70\x65\
-\x72\x66\x5f\x72\x65\x67\x73\0\x61\x62\x69\0\x72\x65\x67\x73\0\x70\x72\x69\x76\
-\x61\x74\x65\0\x73\x61\x76\x65\x64\x5f\x66\x75\x6e\x63\0\x6c\x6f\x63\x61\x6c\
-\x5f\x68\x61\x73\x68\0\x66\x75\x6e\x63\x5f\x68\x61\x73\x68\0\x6f\x6c\x64\x5f\
-\x68\x61\x73\x68\0\x74\x72\x61\x6d\x70\x6f\x6c\x69\x6e\x65\0\x74\x72\x61\x6d\
-\x70\x6f\x6c\x69\x6e\x65\x5f\x73\x69\x7a\x65\0\x6f\x70\x73\x5f\x66\x75\x6e\x63\
-\0\x66\x74\x72\x61\x63\x65\x5f\x66\x75\x6e\x63\x5f\x74\0\x66\x74\x72\x61\x63\
-\x65\x5f\x72\x65\x67\x73\0\x70\x74\x5f\x72\x65\x67\x73\0\x72\x31\x35\0\x72\x31\
-\x34\0\x72\x31\x33\0\x72\x31\x32\0\x62\x70\0\x62\x78\0\x72\x31\x31\0\x72\x31\
-\x30\0\x72\x39\0\x72\x38\0\x61\x78\0\x63\x78\0\x64\x78\0\x73\x69\0\x64\x69\0\
-\x6f\x72\x69\x67\x5f\x61\x78\0\x63\x73\0\x73\x73\0\x66\x74\x72\x61\x63\x65\x5f\
-\x6f\x70\x73\x5f\x68\x61\x73\x68\0\x6e\x6f\x74\x72\x61\x63\x65\x5f\x68\x61\x73\
-\x68\0\x66\x69\x6c\x74\x65\x72\x5f\x68\x61\x73\x68\0\x72\x65\x67\x65\x78\x5f\
-\x6c\x6f\x63\x6b\0\x66\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\x5f\x66\x75\x6e\x63\
-\x5f\x74\0\x66\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\x5f\x63\x6d\x64\0\x46\x54\
-\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\x44\x5f\x45\x4e\x41\x42\x4c\x45\
-\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\x4f\x44\x49\x46\x59\x5f\x53\x45\x4c\
-\x46\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\x44\x5f\x45\x4e\x41\
-\x42\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\x4f\x44\x49\x46\x59\x5f\
-\x50\x45\x45\x52\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\x44\x5f\
-\x44\x49\x53\x41\x42\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\x4f\x44\
-\x49\x46\x59\x5f\x50\x45\x45\x52\0\x61\x76\x78\x35\x31\x32\x5f\x74\x69\x6d\x65\
-\x73\x74\x61\x6d\x70\0\x66\x70\x73\x74\x61\x74\x65\0\x5f\x5f\x74\x61\x73\x6b\
-\x5f\x66\x70\x73\x74\x61\x74\x65\0\x70\x65\x72\x6d\0\x67\x75\x65\x73\x74\x5f\
-\x70\x65\x72\x6d\0\x5f\x5f\x66\x70\x73\x74\x61\x74\x65\0\x66\x70\x75\x5f\x73\
-\x74\x61\x74\x65\x5f\x70\x65\x72\x6d\0\x5f\x5f\x73\x74\x61\x74\x65\x5f\x70\x65\
-\x72\x6d\0\x5f\x5f\x73\x74\x61\x74\x65\x5f\x73\x69\x7a\x65\0\x5f\x5f\x75\x73\
-\x65\x72\x5f\x73\x74\x61\x74\x65\x5f\x73\x69\x7a\x65\0\x75\x73\x65\x72\x5f\x73\
-\x69\x7a\x65\0\x78\x66\x65\x61\x74\x75\x72\x65\x73\0\x75\x73\x65\x72\x5f\x78\
-\x66\x65\x61\x74\x75\x72\x65\x73\0\x78\x66\x64\0\x69\x73\x5f\x76\x61\x6c\x6c\
-\x6f\x63\0\x69\x73\x5f\x67\x75\x65\x73\x74\0\x69\x73\x5f\x63\x6f\x6e\x66\x69\
-\x64\x65\x6e\x74\x69\x61\x6c\0\x69\x6e\x5f\x75\x73\x65\0\x66\x70\x72\x65\x67\
-\x73\x5f\x73\x74\x61\x74\x65\0\x66\x73\x61\x76\x65\0\x66\x78\x73\x61\x76\x65\0\
-\x73\x6f\x66\x74\0\x78\x73\x61\x76\x65\0\x66\x72\x65\x67\x73\x5f\x73\x74\x61\
-\x74\x65\0\x63\x77\x64\0\x73\x77\x64\0\x74\x77\x64\0\x66\x69\x70\0\x66\x63\x73\
-\0\x66\x6f\x6f\0\x66\x6f\x73\0\x73\x74\x5f\x73\x70\x61\x63\x65\0\x66\x78\x72\
-\x65\x67\x73\x5f\x73\x74\x61\x74\x65\0\x66\x6f\x70\0\x6d\x78\x63\x73\x72\0\x6d\
-\x78\x63\x73\x72\x5f\x6d\x61\x73\x6b\0\x78\x6d\x6d\x5f\x73\x70\x61\x63\x65\0\
-\x72\x69\x70\0\x72\x64\x70\0\x70\x61\x64\x64\x69\x6e\x67\x31\0\x73\x77\x5f\x72\
-\x65\x73\x65\x72\x76\x65\x64\0\x73\x77\x72\x65\x67\x73\x5f\x73\x74\x61\x74\x65\
-\0\x66\x74\x6f\x70\0\x63\x68\x61\x6e\x67\x65\x64\0\x6c\x6f\x6f\x6b\x61\x68\x65\
-\x61\x64\0\x6e\x6f\x5f\x75\x70\x64\x61\x74\x65\0\x72\x6d\0\x61\x6c\x69\x6d\x69\
-\x74\0\x65\x6e\x74\x72\x79\x5f\x65\x69\x70\0\x78\x72\x65\x67\x73\x5f\x73\x74\
-\x61\x74\x65\0\x69\x33\x38\x37\0\x68\x65\x61\x64\x65\x72\0\x65\x78\x74\x65\x6e\
-\x64\x65\x64\x5f\x73\x74\x61\x74\x65\x5f\x61\x72\x65\x61\0\x78\x73\x74\x61\x74\
-\x65\x5f\x68\x65\x61\x64\x65\x72\0\x78\x63\x6f\x6d\x70\x5f\x62\x76\0\x68\x61\
-\x6e\x64\x6c\x65\x5f\x73\x63\x68\x65\x64\x5f\x77\x61\x6b\x65\x75\x70\x5f\x6e\
-\x65\x77\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x73\
-\x63\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x66\x6f\x72\x6b\0\x65\x6e\
-\x74\0\x70\x61\x72\x65\x6e\x74\x5f\x63\x6f\x6d\x6d\0\x70\x61\x72\x65\x6e\x74\
-\x5f\x70\x69\x64\0\x63\x68\x69\x6c\x64\x5f\x63\x6f\x6d\x6d\0\x63\x68\x69\x6c\
-\x64\x5f\x70\x69\x64\0\x5f\x5f\x64\x61\x74\x61\0\x74\x72\x61\x63\x65\x5f\x65\
-\x6e\x74\x72\x79\0\x70\x72\x65\x65\x6d\x70\x74\x5f\x63\x6f\x75\x6e\x74\0\x68\
-\x61\x6e\x64\x6c\x65\x5f\x74\x61\x73\x6b\x5f\x63\x72\x65\x61\x74\x65\0\x68\x61\
-\x6e\x64\x6c\x65\x5f\x74\x61\x73\x6b\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\
-\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x73\x63\x68\x65\x64\x5f\x73\x77\
-\x69\x74\x63\x68\0\x70\x72\x65\x76\x5f\x63\x6f\x6d\x6d\0\x70\x72\x65\x76\x5f\
-\x70\x69\x64\0\x70\x72\x65\x76\x5f\x70\x72\x69\x6f\0\x70\x72\x65\x76\x5f\x73\
-\x74\x61\x74\x65\0\x6e\x65\x78\x74\x5f\x63\x6f\x6d\x6d\0\x6e\x65\x78\x74\x5f\
-\x70\x69\x64\0\x6e\x65\x78\x74\x5f\x70\x72\x69\x6f\0\x72\x65\x63\x6f\x72\x64\
-\x5f\x74\x61\x73\x6b\x5f\x73\x77\x69\x74\x63\x68\0\x64\x65\x6c\x74\x61\0\x72\
-\x65\x73\x65\x74\0\x6c\x61\x73\x74\x5f\x63\x70\x75\x5f\x63\x6c\x65\x61\x72\0\
-\x70\x72\x6f\x63\x65\x73\x73\x5f\x75\x70\x64\x61\x74\x65\x5f\x72\x75\x6e\x74\
-\x69\x6d\x65\0\x72\x65\x63\x6f\x72\x64\x5f\x62\x61\x63\x6b\x74\x72\x61\x63\x65\
-\0\x63\x70\x75\x5f\x69\x64\x6c\x65\x5f\x61\x72\x67\x73\0\x63\x6f\x6d\x6d\x6f\
-\x6e\x5f\x74\x79\x70\x65\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\x66\x6c\x61\x67\x73\0\
-\x63\x6f\x6d\x6d\x6f\x6e\x5f\x70\x72\x65\x65\x6d\x70\x74\x5f\x63\x6f\x75\x6e\
-\x74\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\x70\x69\x64\0\x63\x70\x75\x5f\x69\x64\0\x72\
-\x65\x63\x6f\x72\x64\x5f\x63\x70\x75\x5f\x69\x64\x6c\x65\0\x74\x72\x61\x63\x65\
-\x5f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\0\x74\x72\x61\x63\x65\x5f\x73\x79\x73\
-\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x5f\x63\x70\x75\x5f\x73\x6f\x66\x74\
-\x69\x72\x71\x5f\x65\x6e\x74\x72\x79\0\x74\x72\x61\x63\x65\x5f\x63\x70\x75\x5f\
-\x73\x6f\x66\x74\x69\x72\x71\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x5f\x63\
-\x70\x75\x5f\x69\x72\x71\x5f\x65\x6e\x74\x72\x79\0\x74\x72\x61\x63\x65\x5f\x63\
-\x70\x75\x5f\x69\x72\x71\x5f\x65\x78\x69\x74\0\x62\x70\x66\x5f\x70\x65\x72\x66\
-\x5f\x65\x76\x65\x6e\x74\x5f\x64\x61\x74\x61\0\x62\x70\x66\x5f\x75\x73\x65\x72\
-\x5f\x70\x74\x5f\x72\x65\x67\x73\x5f\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\
-\x75\x5f\x65\x76\x65\x6e\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x73\x79\x73\x5f\x6c\
-\x61\x74\x65\x6e\x63\x79\x5f\x65\x76\x65\x6e\x74\0\x4c\x49\x43\x45\x4e\x53\x45\
-\0\x7a\x65\x72\x6f\0\x6f\x6e\x65\0\x72\x65\x63\x6f\x72\x64\x5f\x62\x61\x63\x6b\
-\x74\x72\x61\x63\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x72\x65\x63\x6f\x72\x64\
-\x5f\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\
-\x31\0\x69\x6e\x69\x74\x5f\x63\x70\x75\x73\x5f\x6e\x75\x6d\0\x68\x61\x6e\x64\
-\x6c\x65\x5f\x63\x70\x75\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\
-\x74\0\x6e\x72\x5f\x63\x70\x75\x73\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\x75\
-\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\x74\x69\x6d\
-\x65\x5f\x77\x69\x6e\x64\x6f\x77\0\x75\x6e\x69\x74\0\x6d\x75\x6c\x74\x69\x70\
-\x6c\x69\x65\x72\0\x74\x69\x6d\x65\x5f\x75\x6e\x69\x74\0\x4d\x49\x43\x52\x4f\
-\x53\x45\x43\x4f\x4e\x44\x53\0\x55\x4e\x49\x54\x5f\x4d\x49\x4c\x4c\x49\x53\x45\
-\x43\x4f\x4e\x44\x53\0\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x6b\x5f\x77\x69\x6e\
-\x64\x6f\x77\0\x65\x6d\x61\x5f\x70\x61\x72\x61\0\x77\x69\x6e\x64\x6f\x77\0\x70\
-\x65\x72\x63\x65\x6e\x74\0\x6c\x61\x74\x65\x6e\x63\x79\x5f\x65\x6d\x61\0\x75\
-\x73\x61\x67\x65\x5f\x65\x6d\x61\0\x74\x61\x73\x6b\x5f\x63\x73\x77\x5f\x65\x6d\
-\x61\0\x74\x61\x73\x6b\x5f\x70\x72\x65\x65\x6d\x70\x74\x5f\x65\x6d\x61\0\x74\
-\x61\x73\x6b\x5f\x63\x6f\x6e\x63\x65\x72\x6e\x65\x64\x5f\x75\x70\x64\x61\x74\
-\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x70\x65\x72\x66\x5f\x74\x61\x73\x6b\x5f\
-\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x70\x72\
-\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6e\x63\x65\x72\x6e\x65\x64\x5f\x75\x70\x64\
-\x61\x74\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x75\x70\x64\x61\x74\x65\x5f\x63\
-\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x2e\x5f\x5f\
-\x5f\x5f\x66\x6d\x74\0\x5f\x5f\x75\x70\x64\x61\x74\x65\x5f\x70\x65\x72\x63\x70\
-\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\0\x70\x65\x72\x66\x5f\x72\x75\x6e\x71\x6c\x61\x74\x2e\x5f\x5f\
-\x5f\x5f\x66\x6d\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x74\x69\x6d\x65\x73\
-\x70\x65\x63\0\x62\x6c\x6b\x5f\x70\x6c\x75\x67\0\x62\x70\x66\x5f\x6c\x6f\x63\
-\x61\x6c\x5f\x73\x74\x6f\x72\x61\x67\x65\0\x62\x70\x66\x5f\x70\x72\x6f\x67\0\
-\x62\x70\x66\x5f\x72\x75\x6e\x5f\x63\x74\x78\0\x63\x6f\x6d\x70\x6c\x65\x74\x69\
-\x6f\x6e\0\x63\x73\x73\x5f\x73\x65\x74\0\x65\x76\x65\x6e\x74\x5f\x66\x69\x6c\
-\x74\x65\x72\0\x66\x61\x73\x79\x6e\x63\x5f\x73\x74\x72\x75\x63\x74\0\x66\x69\
-\x6c\x65\x73\x5f\x73\x74\x72\x75\x63\x74\0\x66\x73\x5f\x73\x74\x72\x75\x63\x74\
-\0\x66\x74\x72\x61\x63\x65\x5f\x68\x61\x73\x68\0\x66\x74\x72\x61\x63\x65\x5f\
-\x72\x65\x74\x5f\x73\x74\x61\x63\x6b\0\x66\x75\x74\x65\x78\x5f\x70\x69\x5f\x73\
-\x74\x61\x74\x65\0\x68\x72\x74\x69\x6d\x65\x72\x5f\x63\x6c\x6f\x63\x6b\x5f\x62\
-\x61\x73\x65\0\x69\x6f\x5f\x75\x72\x69\x6e\x67\x5f\x74\x61\x73\x6b\0\x6b\x65\
-\x72\x6e\x65\x6c\x5f\x73\x69\x67\x69\x6e\x66\x6f\0\x6c\x6f\x63\x6b\x5f\x63\x6c\
-\x61\x73\x73\x5f\x6b\x65\x79\0\x6c\x6f\x63\x6b\x64\x65\x70\x5f\x73\x75\x62\x63\
-\x6c\x61\x73\x73\x5f\x6b\x65\x79\0\x6d\x61\x74\x68\x5f\x65\x6d\x75\x5f\x69\x6e\
-\x66\x6f\0\x6d\x65\x6d\x5f\x63\x67\x72\x6f\x75\x70\0\x6d\x6d\x5f\x73\x74\x72\
-\x75\x63\x74\0\x6d\x75\x74\x65\x78\x5f\x77\x61\x69\x74\x65\x72\0\x6f\x6c\x64\
-\x5f\x74\x69\x6d\x65\x73\x70\x65\x63\x33\x32\0\x70\x65\x72\x66\x5f\x61\x64\x64\
-\x72\x5f\x66\x69\x6c\x74\x65\x72\x5f\x72\x61\x6e\x67\x65\0\x70\x65\x72\x66\x5f\
-\x62\x72\x61\x6e\x63\x68\x5f\x73\x74\x61\x63\x6b\0\x70\x65\x72\x66\x5f\x62\x75\
-\x66\x66\x65\x72\0\x70\x65\x72\x66\x5f\x63\x61\x6c\x6c\x63\x68\x61\x69\x6e\x5f\
-\x65\x6e\x74\x72\x79\0\x70\x65\x72\x66\x5f\x63\x67\x72\x6f\x75\x70\0\x70\x65\
-\x72\x66\x5f\x72\x61\x77\x5f\x72\x65\x63\x6f\x72\x64\0\x70\x69\x64\x5f\x6e\x61\
-\x6d\x65\x73\x70\x61\x63\x65\0\x70\x69\x70\x65\x5f\x69\x6e\x6f\x64\x65\x5f\x69\
-\x6e\x66\x6f\0\x70\x6f\x6c\x6c\x66\x64\0\x72\x63\x75\x5f\x6e\x6f\x64\x65\0\x72\
-\x65\x71\x75\x65\x73\x74\x5f\x71\x75\x65\x75\x65\0\x72\x6f\x62\x75\x73\x74\x5f\
-\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\x72\x74\x5f\x6d\x75\x74\x65\x78\x5f\x77\
-\x61\x69\x74\x65\x72\0\x73\x65\x63\x63\x6f\x6d\x70\x5f\x66\x69\x6c\x74\x65\x72\
-\0\x73\x65\x6d\x5f\x75\x6e\x64\x6f\x5f\x6c\x69\x73\x74\0\x73\x69\x67\x68\x61\
-\x6e\x64\x5f\x73\x74\x72\x75\x63\x74\0\x73\x69\x67\x6e\x61\x6c\x5f\x73\x74\x72\
-\x75\x63\x74\0\x74\x61\x73\x6b\x5f\x64\x65\x6c\x61\x79\x5f\x69\x6e\x66\x6f\0\
-\x74\x61\x73\x6b\x5f\x67\x72\x6f\x75\x70\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\
-\x6e\x74\x5f\x63\x61\x6c\x6c\0\x75\x70\x72\x6f\x62\x65\x5f\x74\x61\x73\x6b\0\
-\x76\x6d\x5f\x73\x74\x72\x75\x63\x74\0\x2f\x68\x6f\x6d\x65\x2f\x6e\x65\x30\x2f\
-\x73\x79\x73\x5f\x63\x6f\x6d\x70\x65\x74\x69\x74\x69\x6f\x6e\x2f\x73\x74\x61\
-\x72\x74\x2f\x63\x70\x75\x5f\x77\x61\x74\x63\x68\x65\x72\x2f\x62\x70\x66\x2f\
-\x63\x70\x75\x5f\x73\x74\x61\x74\x73\x2e\x62\x70\x66\x2e\x63\0\x69\x6e\x74\x20\
-\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x68\x61\x6e\x64\x6c\x65\x5f\x73\x63\x68\
-\x65\x64\x5f\x77\x61\x6b\x65\x75\x70\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x74\
-\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\x20\x2a\x70\x29\0\x20\x20\x20\x20\x75\
-\x33\x32\x20\x70\x69\x64\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\
-\x45\x41\x44\x28\x70\x2c\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\
-\x69\x64\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\x20\x75\x33\x32\x20\x74\x67\x69\
-\x64\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\x70\
-\x2c\x74\x67\x69\x64\x29\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x63\x70\x75\x5f\
-\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x73\x6d\x70\x5f\x70\x72\
-\x6f\x63\x65\x73\x73\x6f\x72\x5f\x69\x64\x28\x29\x3b\0\x20\x20\x20\x20\x73\x74\
-\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\
-\x20\x2a\x74\x61\x73\x6b\x5f\x75\x73\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\
-\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\
-\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\
-\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\x61\x73\x6b\x5f\x75\x73\x65\x29\
-\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x70\x69\x64\x20\x3d\x20\x42\x50\x46\
-\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\x70\x2c\x70\x69\x64\x29\x2c\x20\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x74\x67\x69\x64\x20\x3d\x20\x42\x50\x46\
-\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\x70\x2c\x74\x67\x69\x64\x29\x2c\0\
-\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x69\x6e\x66\
-\x6f\x5f\x73\x69\x6d\x70\x6c\x65\x20\x69\x6e\x66\x6f\x20\x3d\x20\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x2e\x63\x6f\x6d\x6d\x20\x3d\x20\x7b\x7d\x2c\0\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\
-\x72\x6e\x65\x6c\x5f\x73\x74\x72\x28\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x2c\
-\x20\x73\x69\x7a\x65\x6f\x66\x28\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x2c\
-\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\x70\x2c\x20\x63\
-\x6f\x6d\x6d\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\
-\x74\x61\x73\x6b\x2e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x20\x3d\x20\x69\x6e\
-\x66\x6f\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\
-\x6b\x2e\x6c\x61\x73\x74\x5f\x65\x6e\x71\x65\x75\x65\x5f\x74\x69\x6d\x65\x20\
-\x3d\x20\x62\x70\x66\x5f\x6b\x74\x69\x6d\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\
-\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\
-\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\x26\x70\x69\x64\x2c\x20\
-\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2c\x20\x42\x50\x46\x5f\x41\x4e\x59\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x73\x65\x72\x74\x5f\x70\x69\
-\x64\x5f\x74\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x28\x74\x67\x69\x64\x2c\x70\
-\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x74\x67\x69\x64\x20\x3d\x3d\x20\
-\x30\x29\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x73\x74\x72\x75\x63\x74\x20\x2a\x70\x73\x20\x3d\x20\x62\x70\x66\x5f\
-\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\
-\x6f\x63\x65\x73\x73\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x29\x3b\0\x20\x20\
-\x20\x20\x69\x66\x28\x21\x70\x73\x29\x7b\0\x20\x20\x20\x20\x69\x66\x28\x74\x67\
-\x69\x64\x20\x21\x3d\x20\x70\x69\x64\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x6e\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\x28\x74\x67\x69\x64\x2c\x70\x69\
-\x64\x29\x3b\0\x20\x20\x20\x20\x70\x73\x2e\x74\x67\x69\x64\x20\x3d\x20\x74\x67\
-\x69\x64\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\
-\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x61\
-\x70\x2c\x26\x74\x67\x69\x64\x2c\x26\x70\x73\x2c\x42\x50\x46\x5f\x41\x4e\x59\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x5f\x75\x73\x65\x2d\
-\x3e\x6c\x61\x73\x74\x5f\x65\x6e\x71\x65\x75\x65\x5f\x74\x69\x6d\x65\x20\x3d\
-\x20\x62\x70\x66\x5f\x6b\x74\x69\x6d\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\
-\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\
-\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x2c\x74\x61\x73\
-\x6b\x5f\x75\x73\x65\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x70\x73\x2d\x3e\x6b\x69\x64\x73\x5f\x6c\x65\x6e\x67\x74\x68\
-\x20\x2b\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\
-\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\
-\x63\x65\x73\x73\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x2c\x70\x73\x2c\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x69\x6e\x69\
-\x74\x5f\x63\x70\x75\x73\x5f\x6e\x75\x6d\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x6e\x72\x5f\x63\x70\x75\x73\x5f\x70\x74\x72\x20\x3d\x20\x62\x70\x66\x5f\
-\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x63\x70\
-\x75\x5f\x75\x73\x72\x5f\x6d\x61\x70\x2c\x26\x7a\x65\x72\x6f\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x6e\x72\x5f\x63\x70\x75\x73\x5f\x70\
-\x74\x72\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x72\x5f\x63\x70\x75\x73\
-\x20\x3d\x20\x2a\x6e\x72\x5f\x63\x70\x75\x73\x5f\x70\x74\x72\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x63\x70\x75\x73\x5f\x6e\x75\x6d\x20\
-\x3d\x20\x74\x72\x75\x65\x3b\0\x20\x20\x20\x20\x75\x36\x34\x20\x6e\x6f\x77\x20\
-\x3d\x20\x62\x70\x66\x5f\x6b\x74\x69\x6d\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\
-\x72\x69\x6e\x74\x6b\x28\x22\x67\x65\x74\x20\x63\x70\x75\x20\x6e\x75\x6d\x73\
-\x20\x65\x72\x72\x6f\x72\x5c\x6e\x22\x29\x3b\0\x7d\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x75\x73\x65\x72\x5f\x70\x65\x72\x63\x65\
-\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\x3e\x75\x73\x65\x72\x5f\x70\x65\
-\x72\x63\x65\x6e\x74\x20\x2a\x20\x36\x30\x2f\x31\x30\x30\x20\x2b\x20\x64\x61\
-\x74\x61\x2d\x3e\x75\x73\x72\x5f\x74\x69\x6d\x65\x73\x20\x2a\x20\x34\x30\x20\
-\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x6b\x65\x72\x6e\x65\x6c\x5f\x70\x65\
-\x72\x63\x65\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\x3e\x6b\x65\x72\x6e\
-\x65\x6c\x5f\x70\x65\x72\x63\x65\x6e\x74\x2a\x36\x30\x2f\x31\x30\x30\x20\x2b\
-\x20\x64\x61\x74\x61\x2d\x3e\x6b\x65\x72\x6e\x65\x6c\x5f\x74\x69\x6d\x65\x73\
-\x20\x2a\x34\x30\x2f\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x69\x64\x6c\x65\x5f\x70\
-\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\x3e\x69\x64\x6c\
-\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x2a\x36\x30\x2f\x31\x30\x30\x20\x2b\x20\
-\x64\x61\x74\x61\x2d\x3e\x69\x64\x6c\x65\x5f\x74\x69\x6d\x65\x73\x2a\x34\x30\
-\x2f\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x73\x6f\x66\x74\x69\x72\x71\x5f\x70\x65\
-\x72\x63\x65\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\x3e\x73\x6f\x66\x74\
-\x69\x72\x71\x5f\x70\x65\x72\x63\x65\x6e\x74\x2a\x36\x30\x2f\x31\x30\x30\x20\
-\x2b\x20\x64\x61\x74\x61\x2d\x3e\x73\x6f\x66\x74\x69\x72\x71\x5f\x74\x69\x6d\
-\x65\x73\x2a\x34\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x69\x72\x71\
-\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\x3e\x69\
-\x64\x6c\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x2a\x36\x30\x2f\x31\x30\x30\x20\
-\x2b\x20\x64\x61\x74\x61\x2d\x3e\x69\x72\x71\x5f\x74\x69\x6d\x65\x73\x2a\x34\
-\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\
-\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\
-\x74\x5f\x6d\x61\x70\x2c\x26\x63\x70\x75\x5f\x69\x64\x2c\x73\x74\x61\x74\x73\
-\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x64\x61\x74\x61\x2d\
-\x3e\x73\x6f\x66\x74\x69\x72\x71\x5f\x74\x69\x6d\x65\x73\x20\x3d\x20\x30\x3b\0\
-\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x3e\x6b\x65\x72\x6e\x65\x6c\x5f\x74\x69\
-\x6d\x65\x73\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\
-\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\
-\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x5f\x6d\x61\x70\x2c\x26\x63\x70\x75\
-\x5f\x69\x64\x2c\x64\x61\x74\x61\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\
-\x20\x20\x20\x72\x69\x6e\x67\x62\x75\x66\x5f\x64\x61\x74\x61\x20\x3d\x20\x62\
-\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\
-\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x62\x75\x66\x66\x65\x72\x2c\x20\
-\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x63\x70\x75\x5f\x75\
-\x73\x61\x67\x65\x5f\x73\x74\x61\x74\x73\x29\x2c\x20\x30\x29\x3b\0\x20\x20\x20\
-\x20\x69\x66\x20\x28\x21\x72\x69\x6e\x67\x62\x75\x66\x5f\x64\x61\x74\x61\x29\
-\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\
-\x6b\x28\x22\x52\x69\x6e\x67\x20\x62\x75\x66\x66\x65\x72\x20\x72\x65\x73\x65\
-\x72\x76\x65\x20\x66\x61\x69\x6c\x65\x64\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x72\x69\x6e\x67\x62\x75\x66\x5f\
-\x64\x61\x74\x61\x2c\x20\x30\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\
-\x75\x63\x74\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x73\x74\x61\x74\x73\
-\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x72\x69\x6e\x67\x62\x75\x66\x5f\
-\x64\x61\x74\x61\x2d\x3e\x63\x70\x75\x5f\x69\x64\x20\x3d\x20\x73\x74\x61\x74\
-\x73\x2d\x3e\x63\x70\x75\x5f\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x72\
-\x69\x6e\x67\x62\x75\x66\x5f\x64\x61\x74\x61\x2d\x3e\x69\x64\x6c\x65\x5f\x70\
-\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\x3e\x69\x64\x6c\
-\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x72\
-\x69\x6e\x67\x62\x75\x66\x5f\x64\x61\x74\x61\x2d\x3e\x6b\x65\x72\x6e\x65\x6c\
-\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\x3e\x6b\
-\x65\x72\x6e\x65\x6c\x5f\x70\x65\x72\x63\x65\x6e\x74\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x72\x69\x6e\x67\x62\x75\x66\x5f\x64\x61\x74\x61\x2d\x3e\x75\x73\
-\x65\x72\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x73\x74\x61\x74\x73\x2d\
-\x3e\x75\x73\x65\x72\x5f\x70\x65\x72\x63\x65\x6e\x74\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\
-\x69\x74\x28\x72\x69\x6e\x67\x62\x75\x66\x5f\x64\x61\x74\x61\x2c\x20\x30\x29\
-\x3b\0\x20\x20\x20\x20\x66\x6f\x72\x28\x63\x70\x75\x5f\x69\x64\x20\x3d\x20\x30\
-\x3b\x63\x70\x75\x5f\x69\x64\x20\x3c\x20\x31\x32\x38\x20\x26\x26\x20\x63\x70\
-\x75\x5f\x69\x64\x20\x3c\x20\x6e\x72\x5f\x63\x70\x75\x73\x3b\x63\x70\x75\x5f\
-\x69\x64\x2b\x2b\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x63\x75\x72\x5f\x69\
-\x64\x20\x3d\x20\x63\x70\x75\x5f\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x64\x61\x74\x61\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\
-\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\
-\x74\x69\x6d\x65\x73\x5f\x6d\x61\x70\x2c\x26\x63\x75\x72\x5f\x69\x64\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x64\x61\x74\x61\x20\x21\x3d\x20\
-\x4e\x55\x4c\x4c\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\
-\x74\x61\x74\x73\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\
-\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\
-\x70\x65\x72\x63\x65\x6e\x74\x5f\x6d\x61\x70\x2c\x26\x63\x75\x72\x5f\x69\x64\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x73\
-\x74\x61\x74\x73\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\
-\x5f\x73\x74\x61\x74\x73\x20\x69\x6e\x69\x74\x5f\x73\x74\x61\x74\x73\x20\x3d\
-\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x2e\x63\x70\x75\x5f\x69\x64\x20\x3d\x20\x63\x75\x72\x5f\x69\x64\
-\x2c\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\
-\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x5f\x6d\
-\x61\x70\x2c\x26\x63\x75\x72\x5f\x69\x64\x2c\x26\x69\x6e\x69\x74\x5f\x73\x74\
-\x61\x74\x73\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x61\x74\x73\x20\x3d\x20\x62\
-\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\
-\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\x5f\
-\x6d\x61\x70\x2c\x26\x63\x75\x72\x5f\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x64\x61\x74\x61\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\
-\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x73\x20\x3d\x20\x5f\x5f\x75\x70\x64\
-\x61\x74\x65\x5f\x70\x65\x72\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\
-\x72\x63\x65\x6e\x74\x28\x63\x75\x72\x5f\x69\x64\x2c\x64\x61\x74\x61\x2c\x73\
-\x74\x61\x74\x73\x29\x3b\0\x20\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x63\x70\
-\x75\x5f\x69\x64\x20\x3d\x20\x63\x70\x75\x5f\x69\x64\x3b\0\x20\x20\x20\x20\x69\
-\x66\x28\x73\x74\x61\x74\x73\x2d\x3e\x69\x64\x6c\x65\x5f\x70\x65\x72\x63\x65\
-\x6e\x74\x20\x3d\x3d\x20\x30\x20\x26\x26\x20\x73\x74\x61\x74\x73\x2d\x3e\x6b\
-\x65\x72\x6e\x65\x6c\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x3d\x20\x30\x20\
-\x26\x26\x20\x73\x74\x61\x74\x73\x2d\x3e\x75\x73\x65\x72\x5f\x70\x65\x72\x63\
-\x65\x6e\x74\x20\x3d\x3d\x20\x30\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\
-\x74\x61\x74\x73\x2d\x3e\x75\x73\x65\x72\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\
-\x3d\x20\x64\x61\x74\x61\x2d\x3e\x75\x73\x72\x5f\x74\x69\x6d\x65\x73\x20\x2a\
-\x20\x31\x30\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x6b\x65\x72\x6e\
-\x65\x6c\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x64\x61\x74\x61\x2d\x3e\
-\x6b\x65\x72\x6e\x65\x6c\x5f\x74\x69\x6d\x65\x73\x20\x2a\x20\x31\x30\x30\x20\
-\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x69\x64\x6c\x65\x5f\x70\x65\x72\x63\
-\x65\x6e\x74\x20\x3d\x20\x64\x61\x74\x61\x2d\x3e\x69\x64\x6c\x65\x5f\x74\x69\
-\x6d\x65\x73\x20\x2a\x31\x30\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\
-\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\
-\x73\x6f\x66\x74\x69\x72\x71\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x64\
-\x61\x74\x61\x2d\x3e\x73\x6f\x66\x74\x69\x72\x71\x5f\x74\x69\x6d\x65\x73\x2a\
-\x31\x30\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x61\x74\x73\x2d\x3e\x69\x72\x71\x5f\x70\
-\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x64\x61\x74\x61\x2d\x3e\x69\x72\x71\x5f\
-\x74\x69\x6d\x65\x73\x2a\x31\x30\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\
-\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x64\x61\x74\x61\x20\x6e\x6f\x74\x20\
-\x66\x6f\x75\x6e\x64\x20\x66\x6f\x72\x20\x63\x70\x75\x20\x25\x75\x5c\x6e\x22\
-\x2c\x20\x63\x75\x72\x5f\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\
-\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x75\x70\x64\x61\x74\x65\x20\x65\
-\x72\x72\x6f\x72\x5c\x6e\x22\x29\x3b\0\x69\x6e\x74\x20\x68\x61\x6e\x64\x6c\x65\
-\x5f\x73\x79\x73\x5f\x6c\x61\x74\x65\x6e\x63\x79\x5f\x65\x76\x65\x6e\x74\x28\
-\x73\x74\x72\x75\x63\x74\x20\x62\x70\x66\x5f\x70\x65\x72\x66\x5f\x65\x76\x65\
-\x6e\x74\x5f\x64\x61\x74\x61\x20\x2a\x63\x74\x78\x29\x7b\0\x20\x20\x20\x20\x73\
-\x74\x72\x75\x63\x74\x20\x72\x75\x6e\x71\x6c\x61\x74\x5f\x70\x65\x72\x66\x5f\
-\x64\x61\x74\x61\x20\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\
-\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x72\x75\x6e\x71\
-\x6c\x61\x74\x5f\x62\x75\x66\x66\x65\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\
-\x74\x72\x75\x63\x74\x20\x72\x75\x6e\x71\x6c\x61\x74\x5f\x70\x65\x72\x66\x5f\
-\x64\x61\x74\x61\x29\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x62\x75\
-\x66\x66\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\
-\x74\x6b\x28\x22\x72\x75\x6e\x71\x6c\x61\x74\x20\x72\x69\x6e\x67\x62\x75\x66\
-\x66\x20\x72\x65\x73\x65\x72\x76\x65\x20\x66\x61\x69\x6c\x65\x64\x5c\x6e\x22\
-\x29\x3b\0\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\x30\
-\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x72\x75\x6e\x71\
-\x6c\x61\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x29\x29\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x75\x33\x32\x20\x69\x20\x3d\x20\x69\x6e\x64\x65\x78\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x75\x33\x32\x20\x2a\x73\x69\x7a\x65\x20\x3d\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\
-\x6d\x28\x26\x72\x75\x6e\x71\x6c\x61\x74\x5f\x6d\x61\x70\x2c\x26\x69\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x73\x69\x7a\x65\x29\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x64\x61\x74\
-\x61\x5b\x69\x6e\x64\x65\x78\x5d\x20\x3d\x20\x2a\x73\x69\x7a\x65\x3b\0\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\x69\
-\x74\x28\x62\x75\x66\x66\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x72\x65\x74\x75\x72\
-\x6e\x20\x30\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x68\x61\
-\x6e\x64\x6c\x65\x5f\x73\x63\x68\x65\x64\x5f\x77\x61\x6b\x65\x75\x70\x5f\x6e\
-\x65\x77\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x73\x74\x72\
-\x75\x63\x74\x20\x2a\x70\x29\x7b\0\x69\x6e\x74\x20\x68\x61\x6e\x64\x6c\x65\x5f\
-\x74\x61\x73\x6b\x5f\x63\x72\x65\x61\x74\x65\x28\x73\x74\x72\x75\x63\x74\x20\
-\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x73\x63\x68\
-\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x66\x6f\x72\x6b\x20\x2a\x63\x74\
-\x78\x29\x7b\0\x20\x20\x20\x20\x75\x33\x32\x20\x70\x69\x64\x5f\x6e\x65\x77\x20\
-\x3d\x20\x63\x74\x78\x2d\x3e\x63\x68\x69\x6c\x64\x5f\x70\x69\x64\x3b\0\x20\x20\
-\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\
-\x73\x61\x67\x65\x20\x2a\x74\x6b\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\
-\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\
-\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x5f\x6e\
-\x65\x77\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\x6b\x29\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x26\x69\x6e\x69\x74\x5f\
-\x74\x61\x73\x6b\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\
-\x74\x20\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x29\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\
-\x5f\x69\x6e\x66\x6f\x5f\x73\x69\x6d\x70\x6c\x65\x20\x69\x6e\x66\x6f\x20\x3d\
-\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2e\
-\x70\x69\x64\x20\x3d\x20\x70\x69\x64\x5f\x6e\x65\x77\x2c\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\
-\x65\x72\x6e\x65\x6c\x5f\x73\x74\x72\x28\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\
-\x2c\x73\x69\x7a\x65\x6f\x66\x28\x63\x74\x78\x2d\x3e\x63\x68\x69\x6c\x64\x5f\
-\x63\x6f\x6d\x6d\x29\x2c\x63\x74\x78\x2d\x3e\x63\x68\x69\x6c\x64\x5f\x63\x6f\
-\x6d\x6d\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\
-\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\
-\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x5f\
-\x6e\x65\x77\x2c\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2c\x42\x50\x46\x5f\
-\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x75\x36\x34\x20\x70\x69\x64\x5f\x74\x67\
-\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\
-\x74\x5f\x70\x69\x64\x5f\x74\x67\x69\x64\x28\x29\x3b\0\x20\x20\x20\x20\x75\x33\
-\x32\x20\x70\x69\x64\x20\x3d\x20\x70\x69\x64\x5f\x74\x67\x69\x64\x20\x26\x20\
-\x30\x78\x46\x46\x46\x46\x46\x46\x46\x46\x3b\x20\x20\0\x20\x20\x20\x20\x75\x33\
-\x32\x20\x74\x67\x69\x64\x20\x3d\x20\x70\x69\x64\x5f\x74\x67\x69\x64\x20\x3e\
-\x3e\x20\x33\x32\x3b\x20\x20\0\x20\x20\x20\x20\x69\x66\x28\x70\x69\x64\x20\x3d\
-\x3d\x20\x30\x20\x7c\x7c\x20\x74\x67\x69\x64\x20\x3d\x3d\x20\x30\x29\0\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\x65\x5f\x65\x6c\
-\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\
-\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\x73\
-\x20\x21\x3d\x20\x4e\x55\x4c\x4c\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x66\x28\x70\x73\x2d\x3e\x6b\x69\x64\x73\x5f\x6c\x65\x6e\x67\x74\x68\x20\x3e\
-\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x73\x2d\x3e\
-\x6b\x69\x64\x73\x5f\x6c\x65\x6e\x67\x74\x68\x20\x2d\x3d\x20\x31\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x75\x33\x32\x20\x2a\x69\x6e\x20\x3d\x20\x62\x70\x66\
-\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\
-\x68\x72\x65\x61\x64\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\x2c\
-\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x69\x6e\
-\x20\x21\x3d\x20\x4e\x55\x4c\x4c\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x74\x68\x72\x65\x61\x64\x5f\x6f\x63\x63\x75\x70\x69\x65\
-\x64\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\x65\x5f\x65\x6c\x65\
-\x6d\x28\x26\x74\x61\x73\x6b\x5f\x74\x72\x61\x63\x65\x5f\x64\x61\x74\x61\x5f\
-\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x66\x28\x70\x73\x21\x3d\x4e\x55\x4c\x4c\x20\x26\x26\x20\x70\x73\x2d\x3e\x6b\
-\x69\x64\x73\x5f\x6c\x65\x6e\x67\x74\x68\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\
-\x6c\x65\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\
-\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x69\x6e\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\
-\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\
-\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x69\x6e\x20\
-\x21\x3d\x20\x4e\x55\x4c\x4c\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\
-\x65\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\x6f\x63\x63\
-\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x29\x3b\0\x69\x6e\
-\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x68\x61\x6e\x64\x6c\x65\x5f\x74\
-\x61\x73\x6b\x5f\x65\x78\x69\x74\x29\x7b\0\x69\x6e\x74\x20\x72\x65\x63\x6f\x72\
-\x64\x5f\x74\x61\x73\x6b\x5f\x73\x77\x69\x74\x63\x68\x28\x73\x74\x72\x75\x63\
-\x74\x20\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x73\
-\x63\x68\x65\x64\x5f\x73\x77\x69\x74\x63\x68\x20\x2a\x63\x74\x78\x29\0\x20\x20\
-\x20\x20\x75\x33\x32\x20\x70\x72\x65\x76\x5f\x70\x69\x64\x20\x3d\x20\x63\x74\
-\x78\x2d\x3e\x70\x72\x65\x76\x5f\x70\x69\x64\x3b\0\x20\x20\x20\x20\x75\x33\x32\
-\x20\x6e\x65\x78\x74\x5f\x70\x69\x64\x20\x3d\x20\x63\x74\x78\x2d\x3e\x6e\x65\
-\x78\x74\x5f\x70\x69\x64\x3b\0\x20\x20\x20\x20\x63\x70\x75\x5f\x75\x73\x61\x67\
-\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\
-\x65\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\
-\x65\x73\x5f\x6d\x61\x70\x2c\x20\x26\x63\x70\x75\x5f\x69\x64\x29\x3b\0\x20\x20\
-\x20\x20\x69\x66\x20\x28\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x3d\x3d\x20\
-\x4e\x55\x4c\x4c\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\
-\x63\x74\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x20\
-\x69\x6e\x69\x74\x5f\x63\x70\x75\x20\x3d\x20\x7b\x7d\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\
-\x73\x5f\x6d\x61\x70\x2c\x20\x26\x63\x70\x75\x5f\x69\x64\x2c\x20\x26\x69\x6e\
-\x69\x74\x5f\x63\x70\x75\x2c\x20\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x63\x70\x75\x5f\x75\x73\
-\x61\x67\x65\x5f\x73\x74\x61\x74\x73\x20\x69\x6e\x69\x74\x5f\x73\x74\x61\x74\
-\x73\x20\x3d\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x63\
-\x70\x75\x5f\x69\x64\x20\x3d\x20\x63\x70\x75\x5f\x69\x64\x2c\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\
-\x65\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\
-\x63\x65\x6e\x74\x5f\x6d\x61\x70\x2c\x20\x26\x63\x70\x75\x5f\x69\x64\x2c\x20\
-\x26\x69\x6e\x69\x74\x5f\x73\x74\x61\x74\x73\x2c\x20\x42\x50\x46\x5f\x41\x4e\
-\x59\x29\x3b\0\x20\x20\x20\x20\x69\x66\x20\x28\x63\x70\x75\x5f\x75\x73\x61\x67\
-\x65\x20\x3d\x3d\x20\x4e\x55\x4c\x4c\x29\x20\x72\x65\x74\x75\x72\x6e\x20\x2d\
-\x31\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\x72\x65\x76\x5f\x70\x69\x64\x20\x21\
-\x3d\x20\x30\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\
-\x20\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x2a\x70\x72\
-\x65\x5f\x75\x73\x61\x67\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\
-\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\
-\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\x26\x70\x72\x65\x76\x5f\
-\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x70\
-\x72\x65\x5f\x75\x73\x61\x67\x65\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x26\x69\x6e\x69\x74\x5f\x74\x61\
-\x73\x6b\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\
-\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x29\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x70\x69\x64\x20\
-\x3d\x20\x70\x72\x65\x76\x5f\x70\x69\x64\x2c\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x69\x6e\x66\
-\x6f\x5f\x73\x69\x6d\x70\x6c\x65\x20\x69\x6e\x66\x6f\x20\x3d\x20\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x63\x70\x75\x5f\
-\x69\x64\x20\x3d\x20\x63\x70\x75\x5f\x69\x64\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\
-\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x74\x72\x28\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\
-\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x63\x74\x78\x2d\x3e\x70\x72\x65\x76\x5f\
-\x63\x6f\x6d\x6d\x29\x2c\x63\x74\x78\x2d\x3e\x70\x72\x65\x76\x5f\x63\x6f\x6d\
-\x6d\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\
-\x5f\x74\x61\x73\x6b\x2e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\
-\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x6c\x61\x73\x74\x5f\x72\x75\
-\x6e\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x74\x61\x73\
-\x6b\x5f\x69\x6e\x66\x6f\x20\x3d\x20\x69\x6e\x66\x6f\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\
-\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\
-\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\x26\x70\x72\x65\x76\x5f\x70\x69\x64\
-\x2c\x20\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2c\x20\x42\x50\x46\x5f\x41\
-\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x65\
-\x5f\x75\x73\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\x70\
-\x69\x64\x20\x3d\x20\x70\x72\x65\x76\x5f\x70\x69\x64\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x70\x72\x65\x5f\x75\x73\x61\x67\
-\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x72\x75\x6e\x5f\x74\x69\x6d\x65\x20\x21\x3d\
-\x20\x30\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x69\x66\x20\x28\x70\x72\x65\x5f\x75\x73\x61\x67\x65\x2d\x3e\x69\x6e\
-\x5f\x6b\x65\x72\x6e\x65\x6c\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x75\x36\x34\x20\x64\x65\x6c\x74\x61\x20\x3d\x20\
-\x6e\x6f\x77\x20\x2d\x20\x70\x72\x65\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\
-\x73\x74\x5f\x72\x75\x6e\x5f\x74\x69\x6d\x65\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x65\x5f\x75\x73\x61\x67\x65\x2d\
-\x3e\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x6e\x73\x20\x2b\x3d\x20\x64\
-\x65\x6c\x74\x61\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x70\x69\x64\x20\x3d\x20\
-\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\
-\x66\x6f\x2e\x70\x69\x64\x3b\0\x20\x20\x20\x20\x69\x66\x28\x74\x61\x73\x6b\x5f\
-\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\
-\x69\x6d\x65\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\
-\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\
-\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x69\x66\
-\x28\x21\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x61\x6c\x72\x65\x61\
-\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\x26\x26\x20\x76\x61\x6c\x75\x65\x20\
-\x3e\x3d\x20\x74\x68\x72\x65\x73\x68\x6f\x6c\x64\x20\x26\x26\x20\x6e\x6f\x77\
-\x20\x2d\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\
-\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x3c\x20\x48\x41\x4c\x46\x5f\
-\x53\x45\x43\x4f\x4e\x44\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\
-\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x68\
-\x72\x65\x61\x64\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\x2c\x26\
-\x70\x69\x64\x2c\x26\x70\x69\x64\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\
-\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\
-\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\
-\x26\x74\x61\x73\x6b\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x62\x75\x66\x66\
-\x65\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\
-\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x29\x2c\x30\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x62\x75\x66\x66\x29\x7b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\
-\x28\x22\x74\x68\x65\x20\x74\x61\x73\x6b\x5f\x63\x70\x75\x20\x62\x75\x66\x66\
-\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x69\x66\x28\x6e\x6f\x77\x20\x2d\x20\x74\x61\x73\x6b\x5f\x75\
-\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\
-\x6d\x65\x20\x3e\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x29\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x74\x61\x73\x6b\x5f\x75\
-\x73\x61\x67\x65\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\
-\x74\x20\x3d\x3d\x20\x66\x61\x6c\x73\x65\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\
-\x65\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x68\x72\x65\x61\x64\x5f\x6f\x63\
-\x63\x75\x70\x69\x65\x64\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\
-\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\
-\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x74\
-\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x75\x73\x65\x72\x5f\x74\x69\x6d\
-\x65\x5f\x6e\x73\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x61\x6c\x72\x65\x61\
-\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\x3d\x20\x66\x61\x6c\x73\x65\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\
-\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\
-\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x29\x29\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x20\
-\x3d\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\
-\x69\x6e\x66\x6f\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x75\x36\x34\x20\x64\x65\
-\x6c\x74\x61\x20\x3d\x20\x28\x6e\x6f\x77\x20\x2d\x20\x74\x61\x73\x6b\x5f\x75\
-\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\
-\x6d\x65\x29\x2a\x31\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\
-\x44\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x74\x6f\x74\
-\x61\x6c\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x74\x61\x73\x6b\x5f\x75\
-\x73\x61\x67\x65\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x6e\x73\
-\x20\x2a\x20\x31\x30\x30\x20\x2a\x20\x64\x65\x6c\x74\x61\x2f\x20\x48\x41\x4c\
-\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\
-\x66\x66\x2d\x3e\x6b\x65\x72\x6e\x65\x6c\x5f\x70\x65\x72\x63\x65\x6e\x74\x20\
-\x3d\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6b\x65\x72\x6e\x65\
-\x6c\x5f\x74\x69\x6d\x65\x5f\x6e\x73\x20\x2f\x20\x74\x61\x73\x6b\x5f\x75\x73\
-\x61\x67\x65\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x6e\x73\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x75\x73\x65\x72\x5f\
-\x70\x65\x72\x63\x65\x6e\x74\x20\x3d\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\
-\x65\x2d\x3e\x75\x73\x65\x72\x5f\x74\x69\x6d\x65\x5f\x6e\x73\x20\x2f\x20\x74\
-\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x74\x69\
-\x6d\x65\x5f\x6e\x73\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x72\
-\x69\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\x62\x75\x66\x66\x2c\
-\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\
-\x67\x65\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\
-\x3d\x20\x74\x72\x75\x65\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x74\
-\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x74\x72\x61\
-\x63\x65\x5f\x74\x69\x6d\x65\x20\x3d\x3d\x20\x30\x20\x7c\x7c\x20\x6e\x6f\x77\
-\x20\x2d\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\
-\x5f\x74\x72\x61\x63\x65\x5f\x74\x69\x6d\x65\x20\x3e\x20\x31\x30\x20\x2a\x20\
-\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x29\x2f\x2f\x20\xe9\x97\xb4\xe9\
-\x9a\x94\xe8\x87\xb3\xe5\xb0\x91\x35\x73\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x70\x65\x72\x66\x5f\x74\x61\x73\x6b\x5f\x62\x61\x63\x6b\x74\x72\
-\x61\x63\x65\x28\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x74\x61\x73\x6b\x20\x3d\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\
-\x6d\x28\x26\x74\x61\x73\x6b\x5f\x74\x72\x61\x63\x65\x5f\x64\x61\x74\x61\x5f\
-\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\
-\x61\x73\x6b\x29\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\
-\x5f\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x20\x2a\x62\x75\x66\x66\x20\
-\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\
-\x76\x65\x28\x26\x74\x61\x73\x6b\x5f\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x5f\
-\x62\x75\x66\x66\x65\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\
-\x74\x20\x74\x61\x73\x6b\x5f\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x29\
-\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x62\x75\x66\x66\x29\x7b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\
-\x22\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x20\x62\x75\x66\x66\x20\x61\x6c\x6c\
-\x6f\x63\x61\x74\x65\x20\x66\x61\x69\x6c\x65\x64\x5c\x6e\x22\x29\x3b\0\x20\x20\
-\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\
-\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x74\x72\x61\
-\x63\x65\x5f\x65\x76\x65\x6e\x74\x29\x29\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\
-\x2d\x3e\x70\x69\x64\x20\x3d\x20\x70\x69\x64\x3b\0\x20\x20\x20\x20\x62\x70\x66\
-\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x73\x74\x72\x28\x62\x75\x66\
-\x66\x2d\x3e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x74\x61\x73\x6b\
-\x2d\x3e\x63\x6f\x6d\x6d\x29\x2c\x74\x61\x73\x6b\x2d\x3e\x63\x6f\x6d\x6d\x29\
-\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x6b\x73\x74\x61\x63\x6b\x5f\x73\
-\x7a\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x6b\x73\x74\x61\x63\x6b\x5f\x73\x7a\
-\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x75\x73\x74\x61\x63\x6b\x5f\x73\
-\x7a\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x75\x73\x74\x61\x63\x6b\x5f\x73\x7a\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x6a\x20\x3e\
-\x20\x74\x61\x73\x6b\x2d\x3e\x6b\x73\x74\x61\x63\x6b\x5f\x73\x7a\x29\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x6b\x5f\x73\
-\x74\x61\x63\x6b\x5b\x6a\x5d\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x6b\x5f\x73\
-\x74\x61\x63\x6b\x5b\x6a\x5d\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x69\x66\x28\x6a\x20\x3e\x20\x74\x61\x73\x6b\x2d\x3e\x75\x73\x74\x61\x63\
-\x6b\x5f\x73\x7a\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\
-\x66\x66\x2d\x3e\x75\x5f\x73\x74\x61\x63\x6b\x5b\x6a\x5d\x20\x3d\x20\x74\x61\
-\x73\x6b\x2d\x3e\x75\x5f\x73\x74\x61\x63\x6b\x5b\x6a\x5d\x3b\0\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\
-\x62\x75\x66\x66\x2c\x20\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x74\x61\x73\x6b\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\
-\x74\x72\x61\x63\x65\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x70\x72\
-\x65\x5f\x75\x73\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\
-\x74\x67\x69\x64\x20\x21\x3d\x20\x30\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\
-\x5f\x75\x70\x64\x61\x74\x65\x5f\x72\x75\x6e\x74\x69\x6d\x65\x28\x74\x67\x69\
-\x64\x2c\x64\x65\x6c\x74\x61\x2c\x66\x61\x6c\x73\x65\x2c\x63\x70\x75\x5f\x75\
-\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\
-\x6d\x65\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x65\
-\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x72\x75\x6e\x5f\x74\x69\
-\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\
-\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\
-\x6d\x61\x70\x2c\x20\x26\x70\x72\x65\x76\x5f\x70\x69\x64\x2c\x20\x70\x72\x65\
-\x5f\x75\x73\x61\x67\x65\x2c\x20\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\
-\x20\x20\x69\x66\x28\x6e\x65\x78\x74\x5f\x70\x69\x64\x20\x21\x3d\x20\x30\x29\
-\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\
-\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x2a\x6e\x65\x78\x74\x5f\x75\
-\x73\x61\x67\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\
-\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\
-\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\x26\x6e\x65\x78\x74\x5f\x70\x69\x64\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x20\x28\x21\x6e\x65\x78\x74\
-\x5f\x75\x73\x61\x67\x65\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x2e\x70\x69\x64\x20\x3d\x20\x6e\x65\x78\x74\x5f\x70\
-\x69\x64\x2c\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\
-\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x73\
-\x74\x72\x28\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\
-\x28\x63\x74\x78\x2d\x3e\x6e\x65\x78\x74\x5f\x63\x6f\x6d\x6d\x29\x2c\x63\x74\
-\x78\x2d\x3e\x6e\x65\x78\x74\x5f\x63\x6f\x6d\x6d\x29\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\
-\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\
-\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\x26\x6e\x65\x78\x74\x5f\x70\x69\x64\
-\x2c\x20\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2c\x20\x42\x50\x46\x5f\x41\
-\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x65\x78\
-\x74\x5f\x75\x73\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\
-\x70\x69\x64\x20\x3d\x20\x6e\x65\x78\x74\x5f\x70\x69\x64\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x75\x36\x34\x20\x6c\x61\x74\x65\x6e\x63\x79\
-\x5f\x62\x75\x63\x6b\x65\x74\x20\x3d\x20\x6e\x6f\x77\x20\x2d\x20\x6e\x65\x78\
-\x74\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x65\x6e\x71\x65\x75\
-\x65\x5f\x74\x69\x6d\x65\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x6e\x65\x78\x74\x5f\x75\x73\x61\x67\x65\x2d\x3e\x77\x61\x69\x74\x5f\x74\x69\
-\x6d\x65\x20\x3d\x20\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x6c\x61\x74\
-\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\x3d\x3d\x20\x30\x29\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x6c\
-\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\x35\x29\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\
-\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\x31\x37\
-\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\
-\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\
-\x36\x35\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x65\x6c\x73\x65\
-\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\
-\x3c\x20\x32\x35\x37\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x65\
-\x6c\x73\x65\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\
-\x65\x74\x20\x3c\x20\x31\x30\x30\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\x5f\
-\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\x34\x30\x30\x30\x29\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x75\x33\x32\x20\x2a\x6c\x61\x74\x65\x6e\x63\x79\
-\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\
-\x6c\x65\x6d\x28\x26\x72\x75\x6e\x71\x6c\x61\x74\x5f\x6d\x61\x70\x2c\x26\x62\
-\x75\x63\x6b\x65\x74\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x69\x66\x28\x21\x6c\x61\x74\x65\x6e\x63\x79\x29\x7b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\
-\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x72\x75\x6e\x71\x6c\x61\x74\
-\x5f\x6d\x61\x70\x2c\x26\x62\x75\x63\x6b\x65\x74\x2c\x26\x6f\x6e\x65\x2c\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x2a\x6c\x61\x74\x65\x6e\x63\x79\x20\x3d\x20\x2a\x6c\x61\
-\x74\x65\x6e\x63\x79\x20\x2b\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\
-\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x72\x75\x6e\x71\x6c\x61\x74\x5f\x6d\x61\
-\x70\x2c\x26\x62\x75\x63\x6b\x65\x74\x2c\x6c\x61\x74\x65\x6e\x63\x79\x2c\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x69\x66\x28\x6e\x65\x78\x74\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\
-\x74\x5f\x72\x75\x6e\x5f\x74\x69\x6d\x65\x20\x3c\x20\x63\x70\x75\x5f\x75\x73\
-\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\
-\x65\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x6e\x65\x78\x74\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6b\x65\x72\x6e\x65\x6c\x5f\
-\x74\x69\x6d\x65\x5f\x6e\x73\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x6e\x65\x78\x74\x5f\x75\x73\
-\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\x74\x67\x69\x64\
-\x20\x21\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x5f\x75\x70\x64\x61\
-\x74\x65\x5f\x72\x75\x6e\x74\x69\x6d\x65\x28\x6e\x65\x78\x74\x5f\x75\x73\x61\
-\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\x74\x67\x69\x64\x2c\
-\x30\x2c\x74\x72\x75\x65\x2c\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\
-\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x29\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x6e\x65\x78\x74\x5f\x75\x73\x61\x67\x65\
-\x2d\x3e\x6c\x61\x73\x74\x5f\x72\x75\x6e\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\
-\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\
-\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\
-\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\x26\
-\x6e\x65\x78\x74\x5f\x70\x69\x64\x2c\x20\x6e\x65\x78\x74\x5f\x75\x73\x61\x67\
-\x65\x2c\x20\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x62\x70\x66\
-\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x63\
-\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x5f\x6d\x61\x70\x2c\
-\x26\x63\x70\x75\x5f\x69\x64\x2c\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x2c\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x69\x6e\x74\x20\x72\x65\x63\x6f\x72\x64\x5f\
-\x62\x61\x63\x6b\x74\x72\x61\x63\x65\x28\x73\x74\x72\x75\x63\x74\x20\x74\x72\
-\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x73\x63\x68\x65\x64\
-\x5f\x73\x77\x69\x74\x63\x68\x20\x2a\x63\x74\x78\x29\0\x20\x20\x20\x20\x75\x33\
-\x32\x20\x70\x69\x64\x20\x3d\x20\x63\x74\x78\x2d\x3e\x70\x72\x65\x76\x5f\x70\
-\x69\x64\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\x69\x64\x20\x3d\x3d\x20\x30\x20\
-\x7c\x7c\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\
-\x6c\x65\x6d\x28\x26\x74\x68\x72\x65\x61\x64\x5f\x6f\x63\x63\x75\x70\x69\x65\
-\x64\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x20\x3d\x3d\x20\x4e\x55\x4c\x4c\
-\x29\0\x20\x20\x20\x20\x69\x6e\x74\x20\x73\x74\x61\x63\x6b\x5f\x69\x64\x20\x3d\
-\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x73\x74\x61\x63\x6b\x69\x64\x28\x63\x74\
-\x78\x2c\x26\x73\x74\x61\x63\x6b\x5f\x74\x72\x61\x63\x65\x73\x5f\x6d\x61\x70\
-\x2c\x42\x50\x46\x5f\x46\x5f\x52\x45\x55\x53\x45\x5f\x53\x54\x41\x43\x4b\x49\
-\x44\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x73\x74\x61\x63\x6b\x5f\x69\x64\x20\
-\x3c\x20\x30\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\
-\x69\x6e\x74\x6b\x28\x22\x67\x65\x74\x20\x73\x74\x61\x63\x6b\x20\x65\x72\x72\
-\x6f\x72\x2c\x20\x65\x72\x72\x6f\x72\x20\x63\x6f\x64\x65\x20\x69\x73\x20\x25\
-\x69\x22\x2c\x73\x74\x61\x63\x6b\x5f\x69\x64\x29\x3b\0\x20\x20\x20\x20\x73\x74\
-\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x74\x72\x61\x63\x65\x5f\x65\x76\x65\
-\x6e\x74\x20\x2a\x74\x72\x61\x63\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\
-\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\
-\x74\x72\x61\x63\x65\x5f\x64\x61\x74\x61\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\
-\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\x72\x61\x63\x65\x29\x7b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x2e\x70\x69\x64\x20\x3d\x20\x70\
-\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\
-\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x2a\x74\x61\x73\x6b\
-\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\
-\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\
-\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x69\x66\x28\x74\x61\x73\x6b\x20\x21\x3d\x20\x4e\x55\x4c\x4c\x29\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\
-\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x74\x72\x28\x69\x6e\
-\x69\x74\x2e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x74\x61\x73\x6b\
-\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x2c\x74\
-\x61\x73\x6b\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x2e\x75\x73\x74\x61\
-\x63\x6b\x5f\x73\x7a\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x6e\x69\x74\x2e\x6b\x73\x74\x61\x63\x6b\x5f\x73\x7a\x20\x3d\x20\x30\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\
-\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x74\x72\x61\x63\x65\
-\x5f\x64\x61\x74\x61\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x2c\x26\x69\x6e\x69\
-\x74\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\
-\x67\x65\x20\x2a\x75\x73\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\
-\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\
-\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\
-\x20\x20\x20\x74\x72\x61\x63\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\
-\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x74\
-\x72\x61\x63\x65\x5f\x64\x61\x74\x61\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\
-\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\x72\x61\x63\x65\x29\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x62\x61\
-\x63\x6b\x74\x72\x61\x63\x65\x20\x73\x74\x72\x75\x63\x74\x20\x69\x6e\x69\x74\
-\x20\x66\x61\x69\x6c\x65\x64\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x74\x72\x61\
-\x63\x65\x2d\x3e\x6b\x73\x74\x61\x63\x6b\x5f\x73\x7a\x20\x3d\x20\x73\x74\x61\
-\x63\x6b\x5f\x69\x64\x3b\0\x20\x20\x20\x20\x75\x36\x34\x20\x2a\x6b\x5f\x73\x74\
-\x61\x63\x6b\x5f\x64\x61\x74\x61\x20\x3d\x20\x28\x75\x36\x34\x20\x2a\x29\x28\
-\x73\x74\x61\x63\x6b\x5f\x69\x64\x20\x2a\x20\x73\x69\x7a\x65\x6f\x66\x28\x75\
-\x36\x34\x29\x29\x3b\0\x20\x20\x20\x20\x69\x66\x20\x28\x6b\x5f\x73\x74\x61\x63\
-\x6b\x5f\x64\x61\x74\x61\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\
-\x28\x26\x74\x72\x61\x63\x65\x2d\x3e\x6b\x5f\x73\x74\x61\x63\x6b\x2c\x20\x73\
-\x69\x7a\x65\x6f\x66\x28\x74\x72\x61\x63\x65\x2d\x3e\x6b\x5f\x73\x74\x61\x63\
-\x6b\x29\x2c\x20\x6b\x5f\x73\x74\x61\x63\x6b\x5f\x64\x61\x74\x61\x29\x3b\0\x20\
-\x20\x20\x20\x69\x6e\x74\x20\x75\x5f\x73\x74\x61\x63\x6b\x5f\x69\x64\x20\x3d\
-\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x73\x74\x61\x63\x6b\x69\x64\x28\x63\x74\
-\x78\x2c\x20\x26\x73\x74\x61\x63\x6b\x5f\x74\x72\x61\x63\x65\x73\x5f\x6d\x61\
-\x70\x2c\x20\x42\x50\x46\x5f\x46\x5f\x55\x53\x45\x52\x5f\x53\x54\x41\x43\x4b\
-\x20\x7c\x20\x42\x50\x46\x5f\x46\x5f\x52\x45\x55\x53\x45\x5f\x53\x54\x41\x43\
-\x4b\x49\x44\x29\x3b\0\x20\x20\x20\x20\x69\x66\x20\x28\x75\x5f\x73\x74\x61\x63\
-\x6b\x5f\x69\x64\x20\x3e\x3d\x20\x30\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x74\x72\x61\x63\x65\x2d\x3e\x75\x73\x74\x61\x63\x6b\x5f\x73\x7a\x20\x3d\
-\x20\x75\x5f\x73\x74\x61\x63\x6b\x5f\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x69\x66\x20\x28\x75\x5f\x73\x74\x61\x63\x6b\x5f\x64\x61\x74\x61\x29\x20\
-\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\
-\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x28\x26\x74\x72\
-\x61\x63\x65\x2d\x3e\x75\x5f\x73\x74\x61\x63\x6b\x2c\x20\x73\x69\x7a\x65\x6f\
-\x66\x28\x74\x72\x61\x63\x65\x2d\x3e\x75\x5f\x73\x74\x61\x63\x6b\x29\x2c\x20\
-\x75\x5f\x73\x74\x61\x63\x6b\x5f\x64\x61\x74\x61\x29\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x75\x36\x34\x20\x2a\x75\x5f\x73\x74\x61\x63\x6b\x5f\x64\x61\x74\
-\x61\x20\x3d\x20\x28\x75\x36\x34\x20\x2a\x29\x28\x75\x5f\x73\x74\x61\x63\x6b\
-\x5f\x69\x64\x20\x2a\x20\x73\x69\x7a\x65\x6f\x66\x28\x75\x36\x34\x29\x29\x3b\0\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\
-\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x74\x72\x61\x63\x65\x5f\x64\x61\
-\x74\x61\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x2c\x74\x72\x61\x63\x65\x2c\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x73\x74\x61\x74\x69\x63\x20\x69\x6e\x74\x20\
-\x70\x72\x6f\x63\x65\x73\x73\x5f\x75\x70\x64\x61\x74\x65\x5f\x72\x75\x6e\x74\
-\x69\x6d\x65\x28\x75\x33\x32\x20\x74\x67\x69\x64\x2c\x75\x36\x34\x20\x64\x65\
-\x6c\x74\x61\x2c\x62\x6f\x6f\x6c\x20\x72\x65\x73\x65\x74\x2c\x20\x75\x36\x34\
-\x20\x6c\x61\x73\x74\x5f\x63\x70\x75\x5f\x63\x6c\x65\x61\x72\x29\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\x28\
-\x74\x67\x69\x64\x2c\x74\x67\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x70\x73\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\
-\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x61\x70\x2c\
-\x26\x74\x67\x69\x64\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\
-\x70\x73\x29\0\x20\x20\x20\x20\x70\x73\x2d\x3e\x74\x67\x69\x64\x20\x3d\x20\x74\
-\x67\x69\x64\x3b\0\x20\x20\x20\x20\x69\x66\x28\x72\x65\x73\x65\x74\x20\x3d\x3d\
-\x20\x74\x72\x75\x65\x20\x26\x26\x20\x70\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x74\
-\x6f\x74\x61\x6c\x5f\x63\x6c\x65\x61\x72\x20\x3c\x20\x6c\x61\x73\x74\x5f\x63\
-\x70\x75\x5f\x63\x6c\x65\x61\x72\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x70\x73\
-\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x75\x73\x65\x5f\x74\x69\x6d\x65\x20\x3d\x20\
-\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x70\x73\x2d\x3e\x6c\x61\x73\x74\x5f\
-\x74\x6f\x74\x61\x6c\x5f\x63\x6c\x65\x61\x72\x20\x3d\x20\x62\x70\x66\x5f\x6b\
-\x74\x69\x6d\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\x3b\0\x20\x20\x20\x20\x70\
-\x73\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x75\x73\x65\x5f\x74\x69\x6d\x65\x20\x2b\
-\x3d\x20\x64\x65\x6c\x74\x61\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\
-\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\
-\x73\x73\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x2c\x70\x73\x2c\x42\x50\x46\
-\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x76\x61\x6c\x75\x65\
-\x20\x3d\x20\x70\x73\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x75\x73\x65\x5f\x74\x69\
-\x6d\x65\x20\x2a\x20\x31\x30\x30\x20\x2f\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\
-\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x74\x67\x69\x64\x20\x3d\x20\
-\x70\x73\x2d\x3e\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\x73\x2d\
-\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x3d\x3d\
-\x20\x30\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x70\x73\x2d\x3e\x6c\x61\x73\
-\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\
-\x20\x20\x20\x20\x69\x66\x28\x21\x70\x73\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\
-\x5f\x6f\x75\x74\x70\x75\x74\x20\x26\x26\x20\x76\x61\x6c\x75\x65\x20\x3e\x3d\
-\x20\x74\x68\x72\x65\x73\x68\x6f\x6c\x64\x20\x26\x26\x20\x6e\x6f\x77\x20\x2d\
-\x20\x70\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\
-\x65\x20\x3c\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x29\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\
-\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\x6f\x63\x63\x75\
-\x70\x69\x65\x64\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x2c\x26\x74\x67\x69\
-\x64\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x73\x74\x72\x75\x63\x74\x20\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x72\x75\
-\x63\x74\x20\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\
-\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x62\x75\x66\x66\x65\x72\x2c\x73\
-\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x73\x74\x72\x75\x63\x74\x29\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x70\
-\x72\x6f\x63\x65\x73\x73\x5f\x63\x70\x75\x20\x62\x75\x66\x66\x65\x72\x20\x69\
-\x73\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x69\x66\x28\x6e\x6f\x77\x20\x2d\x20\x70\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x63\
-\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x3e\x20\x48\x41\x4c\x46\x5f\x53\x45\
-\x43\x4f\x4e\x44\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\
-\x28\x70\x73\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\
-\x20\x3d\x3d\x20\x66\x61\x6c\x73\x65\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x70\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\
-\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x70\x73\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x75\x73\x65\x5f\x74\x69\
-\x6d\x65\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\
-\x65\x74\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\
-\x72\x75\x63\x74\x20\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x72\x75\x63\x74\
-\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x75\x36\x34\x20\x64\x65\x6c\x74\
-\x61\x20\x3d\x20\x28\x6e\x6f\x77\x20\x2d\x20\x70\x73\x2d\x3e\x6c\x61\x73\x74\
-\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x29\x20\x2a\x20\x31\x30\x20\x2f\
-\x20\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x62\x75\x66\x66\x2d\x3e\x74\x67\x69\x64\x20\x3d\x20\x74\x67\x69\x64\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x6b\x69\x64\x73\
-\x5f\x6c\x65\x6e\x67\x74\x68\x20\x3d\x20\x70\x73\x2d\x3e\x6b\x69\x64\x73\x5f\
-\x6c\x65\x6e\x67\x74\x68\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\
-\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x75\x73\x65\x5f\x70\x65\x72\x63\x65\x6e\x74\
-\x20\x3d\x20\x70\x73\x2d\x3e\x74\x6f\x74\x61\x6c\x5f\x75\x73\x65\x5f\x74\x69\
-\x6d\x65\x20\x2a\x20\x31\x30\x30\x20\x2a\x20\x64\x65\x6c\x74\x61\x20\x2f\x20\
-\x48\x41\x4c\x46\x5f\x53\x45\x43\x4f\x4e\x44\x3b\0\x20\x20\x20\x20\x75\x33\x32\
-\x20\x63\x70\x75\x5f\x69\x64\x20\x3d\x20\x63\x74\x78\x2d\x3e\x63\x70\x75\x5f\
-\x69\x64\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x73\x74\x61\x74\x65\x20\x3d\x20\
-\x63\x74\x78\x2d\x3e\x73\x74\x61\x74\x65\x3b\0\x20\x20\x20\x20\x69\x66\x28\x73\
-\x74\x61\x74\x65\x20\x3d\x3d\x20\x28\x75\x33\x32\x29\x28\x2d\x31\x29\x29\x7b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x63\x70\x75\x5f\x75\x73\x61\x67\
-\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x69\x64\x6c\x65\x5f\x74\x69\x6d\x65\x20\x3d\
-\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x63\x70\x75\x5f\x75\x73\x61\
-\x67\x65\x2d\x3e\x69\x64\x6c\x65\x5f\x74\x69\x6d\x65\x73\x20\x2b\x3d\x20\x6e\
-\x6f\x77\x20\x2d\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\
-\x74\x5f\x69\x64\x6c\x65\x5f\x74\x69\x6d\x65\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x69\x64\
-\x6c\x65\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x62\
-\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\
-\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x5f\x6d\x61\
-\x70\x2c\x20\x26\x63\x70\x75\x5f\x69\x64\x2c\x20\x63\x70\x75\x5f\x75\x73\x61\
-\x67\x65\x2c\x20\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x73\x74\
-\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\x20\x2a\x74\
-\x61\x73\x6b\x20\x3d\x20\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\
-\x73\x74\x72\x75\x63\x74\x20\x2a\x29\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\
-\x72\x72\x65\x6e\x74\x5f\x74\x61\x73\x6b\x28\x29\x3b\0\x20\x20\x20\x20\x75\x33\
-\x32\x20\x70\x69\x64\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\
-\x41\x44\x28\x74\x61\x73\x6b\x2c\x20\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x75\
-\x33\x32\x20\x74\x67\x69\x64\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\
-\x52\x45\x41\x44\x28\x74\x61\x73\x6b\x2c\x74\x67\x69\x64\x29\x3b\0\x20\x20\x20\
-\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\
-\x61\x67\x65\x20\x2a\x75\x73\x61\x67\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\
-\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\
-\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\x26\x70\x69\
-\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x75\x73\x61\x67\x65\x29\x7b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x75\x33\x32\x20\x63\x70\x75\x5f\x69\x64\x20\
-\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x73\x6d\x70\x5f\x70\x72\x6f\x63\x65\
-\x73\x73\x6f\x72\x5f\x69\x64\x28\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x2e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x20\x3d\x20\x69\x6e\x66\
-\x6f\x2c\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\
-\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x69\x6e\x69\x74\x5f\x75\
-\x73\x61\x67\x65\x20\x3d\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\
-\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\
-\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\x61\x70\x2c\x20\
-\x26\x70\x69\x64\x2c\x20\x26\x69\x6e\x69\x74\x5f\x75\x73\x61\x67\x65\x2c\x20\
-\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\
-\x28\x75\x73\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\x74\
-\x67\x69\x64\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x75\x73\x61\x67\x65\x2d\x3e\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x2e\
-\x74\x67\x69\x64\x20\x3d\x20\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x69\x6e\x73\x65\x72\x74\x5f\x70\x69\x64\x5f\x74\x6f\x5f\
-\x70\x72\x6f\x63\x65\x73\x73\x28\x74\x67\x69\x64\x2c\x70\x69\x64\x29\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x75\x73\x61\x67\x65\x2d\x3e\x69\x6e\x5f\x6b\x65\
-\x72\x6e\x65\x6c\x20\x3d\x20\x74\x72\x75\x65\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\
-\x6d\x28\x26\x74\x61\x73\x6b\x5f\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x6d\
-\x61\x70\x2c\x20\x26\x70\x69\x64\x2c\x20\x75\x73\x61\x67\x65\x2c\x20\x42\x50\
-\x46\x5f\x41\x4e\x59\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\
-\x28\x74\x72\x61\x63\x65\x5f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\x29\x7b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x75\x73\x61\x67\x65\x2d\x3e\x69\x6e\x5f\x6b\x65\
-\x72\x6e\x65\x6c\x20\x3d\x20\x66\x61\x6c\x73\x65\x3b\0\x69\x6e\x74\x20\x42\x50\
-\x46\x5f\x50\x52\x4f\x47\x28\x74\x72\x61\x63\x65\x5f\x73\x79\x73\x5f\x65\x78\
-\x69\x74\x29\x7b\x20\0\x20\x20\x20\x20\x20\x20\x20\x20\x63\x70\x75\x5f\x69\x6e\
-\x69\x74\x28\x63\x70\x75\x5f\x69\x64\x29\x3b\0\x20\x20\x20\x20\x73\x74\x72\x75\
-\x63\x74\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x2a\
-\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\
-\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\
-\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x5f\x6d\x61\x70\x2c\x20\x26\x63\
-\x70\x75\x5f\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x63\x70\x75\x5f\
-\x75\x73\x61\x67\x65\x29\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x63\x70\
-\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x20\x69\x6e\x69\x74\x5f\
-\x63\x70\x75\x20\x3d\x20\x7b\x7d\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\
-\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x63\x70\x75\x5f\
-\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\x5f\x6d\x61\x70\x2c\x20\x26\x63\
-\x70\x75\x5f\x69\x64\x2c\x20\x26\x69\x6e\x69\x74\x5f\x63\x70\x75\x2c\x20\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\
-\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x73\x74\x61\x74\x73\x20\x69\x6e\x69\
-\x74\x5f\x73\x74\x61\x74\x73\x20\x3d\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x2e\x63\x70\x75\x5f\x69\x64\x20\x3d\x20\x63\x70\x75\x5f\x69\x64\x2c\0\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\
-\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x70\x65\x72\x63\x65\
-\x6e\x74\x5f\x6d\x61\x70\x2c\x20\x26\x63\x70\x75\x5f\x69\x64\x2c\x20\x26\x69\
-\x6e\x69\x74\x5f\x73\x74\x61\x74\x73\x2c\x20\x42\x50\x46\x5f\x41\x4e\x59\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\
-\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\
-\x65\x6d\x28\x26\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x5f\x74\x69\x6d\x65\x73\
-\x5f\x6d\x61\x70\x2c\x20\x26\x63\x70\x75\x5f\x69\x64\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x69\x66\x28\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x20\x3d\x3d\
-\x20\x4e\x55\x4c\x4c\x29\x20\x72\x65\x74\x75\x72\x6e\x20\x30\x3b\0\x20\x20\x20\
-\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x73\x6f\
-\x66\x74\x69\x72\x71\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x69\x6e\
-\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x74\x72\x61\x63\x65\x5f\x63\x70\
-\x75\x5f\x73\x6f\x66\x74\x69\x72\x71\x5f\x65\x6e\x74\x72\x79\x29\x7b\0\x20\x20\
-\x20\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x2d\x3e\x73\x6f\x66\x74\x69\x72\
-\x71\x5f\x74\x69\x6d\x65\x73\x20\x2b\x3d\x20\x6e\x6f\x77\x20\x2d\x20\x63\x70\
-\x75\x5f\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x73\x6f\x66\x74\x69\
-\x72\x71\x5f\x74\x69\x6d\x65\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\
-\x47\x28\x74\x72\x61\x63\x65\x5f\x63\x70\x75\x5f\x73\x6f\x66\x74\x69\x72\x71\
-\x5f\x65\x78\x69\x74\x29\x7b\0\x20\x20\x20\x20\x63\x70\x75\x5f\x75\x73\x61\x67\
-\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x69\x72\x71\x5f\x74\x69\x6d\x65\x20\x3d\x20\
-\x6e\x6f\x77\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x74\x72\
-\x61\x63\x65\x5f\x63\x70\x75\x5f\x69\x72\x71\x5f\x65\x6e\x74\x72\x79\x29\x7b\0\
-\x20\x20\x20\x20\x63\x70\x75\x5f\x75\x73\x61\x67\x65\x2d\x3e\x69\x72\x71\x5f\
-\x74\x69\x6d\x65\x73\x20\x2b\x3d\x20\x6e\x6f\x77\x20\x2d\x20\x63\x70\x75\x5f\
-\x75\x73\x61\x67\x65\x2d\x3e\x6c\x61\x73\x74\x5f\x69\x72\x71\x5f\x74\x69\x6d\
-\x65\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x74\x72\x61\x63\
-\x65\x5f\x63\x70\x75\x5f\x69\x72\x71\x5f\x65\x78\x69\x74\x29\x7b\0\x30\x3a\x37\
-\x38\0\x30\x3a\x37\x39\0\x30\x3a\x31\x31\x32\0\x30\x3a\x34\0\x30\x3a\x33\0\x30\
-\x3a\x32\0\x30\x3a\x36\0\x30\x3a\x31\0\x30\x3a\x35\0\x6c\x69\x63\x65\x6e\x73\
-\x65\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x6d\x61\x70\x73\0\x2e\x62\x73\x73\0\
-\x2e\x74\x65\x78\x74\0\x72\x61\x77\x5f\x74\x70\x2f\x73\x63\x68\x65\x64\x5f\x77\
-\x61\x6b\x65\x75\x70\0\x72\x61\x77\x5f\x74\x70\x2f\x73\x63\x68\x65\x64\x5f\x77\
-\x61\x6b\x65\x75\x70\x5f\x6e\x65\x77\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\
-\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x66\x6f\x72\x6b\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\
-\x68\x65\x64\x2f\x73\x63\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x65\
-\x78\x69\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\
-\x2f\x73\x63\x68\x65\x64\x5f\x73\x77\x69\x74\x63\x68\0\x74\x72\x61\x63\x65\x70\
-\x6f\x69\x6e\x74\x2f\x70\x6f\x77\x65\x72\x2f\x63\x70\x75\x5f\x69\x64\x6c\x65\0\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x72\x61\x77\x5f\x73\x79\x73\x63\
-\x61\x6c\x6c\x73\x2f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\0\x74\x72\x61\x63\x65\
-\x70\x6f\x69\x6e\x74\x2f\x72\x61\x77\x5f\x73\x79\x73\x63\x61\x6c\x6c\x73\x2f\
-\x73\x79\x73\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\
-\x69\x72\x71\x2f\x73\x6f\x66\x74\x69\x72\x71\x5f\x65\x6e\x74\x72\x79\0\x74\x72\
-\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\x71\x2f\x73\x6f\x66\x74\x69\x72\
-\x71\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\
-\x71\x2f\x69\x72\x71\x5f\x68\x61\x6e\x64\x6c\x65\x72\x5f\x65\x6e\x74\x72\x79\0\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x69\x72\x71\x2f\x69\x72\x71\x5f\
-\x68\x61\x6e\x64\x6c\x65\x72\x5f\x65\x78\x69\x74\0\x9f\xeb\x01\0\x20\0\0\0\0\0\
-\0\0\xf4\0\0\0\xf4\0\0\0\xd4\x3c\0\0\xc8\x3d\0\0\xc4\x01\0\0\x08\0\0\0\xa5\x71\
-\0\0\x01\0\0\0\0\0\0\0\xad\x01\0\0\xab\x71\0\0\x01\0\0\0\0\0\0\0\x4e\0\0\0\xbf\
-\x71\0\0\x01\0\0\0\0\0\0\0\x9e\x01\0\0\xd7\x71\0\0\x01\0\0\0\0\0\0\0\xa4\x01\0\
-\0\xfb\x71\0\0\x01\0\0\0\0\0\0\0\xa5\x01\0\0\x1f\x72\0\0\x02\0\0\0\0\0\0\0\xa9\
-\x01\0\0\xb0\x14\0\0\xae\x01\0\0\x3d\x72\0\0\x01\0\0\0\0\0\0\0\xb2\x01\0\0\x57\
-\x72\0\0\x01\0\0\0\0\0\0\0\xb3\x01\0\0\x79\x72\0\0\x01\0\0\0\0\0\0\0\xb4\x01\0\
-\0\x9a\x72\0\0\x01\0\0\0\0\0\0\0\xb5\x01\0\0\xb7\x72\0\0\x01\0\0\0\0\0\0\0\xb6\
-\x01\0\0\xd3\x72\0\0\x01\0\0\0\0\0\0\0\xb7\x01\0\0\xf4\x72\0\0\x01\0\0\0\0\0\0\
-\0\xb8\x01\0\0\xa6\x1d\0\0\x02\0\0\0\0\0\0\0\xbd\x01\0\0\x10\x07\0\0\xbe\x01\0\
-\0\x10\0\0\0\xa5\x71\0\0\x3c\0\0\0\0\0\0\0\x42\x32\0\0\x52\x64\0\0\0\x08\x08\0\
-\x28\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x30\0\0\0\x42\x32\0\0\x6b\x35\0\0\x21\
-\x14\x08\0\x50\0\0\0\x42\x32\0\0\xb4\x35\0\0\x08\x18\x08\0\x58\0\0\0\x42\x32\0\
-\0\xa8\x64\0\0\x16\x1c\x08\0\x70\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x78\0\0\0\
-\x42\x32\0\0\xf5\x35\0\0\x0d\x24\x04\0\x88\0\0\0\x42\x32\0\0\xa8\x64\0\0\x16\
-\x1c\x08\0\xa0\0\0\0\x42\x32\0\0\x09\x36\0\0\x05\x48\x04\0\xc8\0\0\0\x42\x32\0\
-\0\xa8\x64\0\0\x16\x1c\x08\0\xd0\0\0\0\x42\x32\0\0\xc9\x64\0\0\x0e\x20\x08\0\
-\xf0\0\0\0\x42\x32\0\0\xff\x64\0\0\x0c\x24\x08\0\xf8\0\0\0\x42\x32\0\0\x0f\x65\
-\0\0\x10\x34\x08\0\0\x01\0\0\x42\x32\0\0\x0f\x65\0\0\x0e\x34\x08\0\x08\x01\0\0\
-\x42\x32\0\0\x24\x65\0\0\x16\x38\x08\0\x10\x01\0\0\x42\x32\0\0\x24\x65\0\0\x1d\
-\x38\x08\0\x18\x01\0\0\x42\x32\0\0\x24\x65\0\0\x08\x38\x08\0\x28\x01\0\0\x42\
-\x32\0\0\x63\x65\0\0\x1c\x40\x08\0\x30\x01\0\0\x42\x32\0\0\x83\x65\0\0\x20\x44\
-\x08\0\x38\x01\0\0\x42\x32\0\0\x83\x65\0\0\x1e\x44\x08\0\x40\x01\0\0\x42\x32\0\
-\0\xb6\x65\0\0\x18\x4c\x08\0\x68\x01\0\0\x42\x32\0\0\xd7\x65\0\0\x05\x54\x08\0\
-\x90\x01\0\0\x42\x32\0\0\x0f\x66\0\0\x15\x64\x07\0\x98\x01\0\0\x42\x32\0\0\xcc\
-\x37\0\0\x0f\x68\x07\0\xa8\x01\0\0\x42\x32\0\0\x47\x66\0\0\x14\x6c\x07\0\xb0\
-\x01\0\0\x42\x32\0\0\x47\x66\0\0\x09\x6c\x07\0\xb8\x01\0\0\x42\x32\0\0\x60\x66\
-\0\0\x0c\x70\x07\0\xc0\x01\0\0\x42\x32\0\0\x60\x66\0\0\x08\x70\x07\0\xc8\x01\0\
-\0\x42\x32\0\0\x82\x66\0\0\x1d\x74\x07\0\xe8\x01\0\0\x42\x32\0\0\xa5\x66\0\0\
-\x0d\x84\x07\0\xf0\x01\0\0\x42\x32\0\0\xa5\x66\0\0\x1c\x84\x07\0\x38\x02\0\0\
-\x42\x32\0\0\0\0\0\0\0\0\0\0\x48\x02\0\0\x42\x32\0\0\x02\x67\0\0\x09\x8c\x07\0\
-\x70\x02\0\0\x42\x32\0\0\x4a\x67\0\0\x27\x94\x07\0\x98\x02\0\0\x42\x32\0\0\xce\
-\x4f\0\0\x0c\x98\x07\0\xa0\x02\0\0\x42\x32\0\0\xbf\x67\0\0\x0d\x9c\x07\0\xd0\
-\x02\0\0\x42\x32\0\0\xf7\x67\0\0\x0c\xd4\x07\0\xd8\x02\0\0\x42\x32\0\0\x2b\x68\
-\0\0\x10\xdc\x07\0\xe8\x02\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xf0\x02\0\0\x42\x32\
-\0\0\x36\x48\0\0\x11\xe0\x07\0\x08\x03\0\0\x42\x32\0\0\x57\x68\0\0\x21\xe4\x07\
-\0\x18\x03\0\0\x42\x32\0\0\x7e\x68\0\0\x20\xe8\x07\0\x28\x03\0\0\x42\x32\0\0\
-\xa2\x68\0\0\x09\xa8\x07\0\x68\x03\0\0\x42\x32\0\0\xd8\x68\0\0\x20\xac\x07\0\
-\x70\x03\0\0\x42\x32\0\0\x1c\x69\0\0\x16\xb0\x07\0\x78\x03\0\0\x42\x32\0\0\x1c\
-\x69\0\0\x14\xb0\x07\0\x80\x03\0\0\x42\x32\0\0\x37\x69\0\0\x21\xb4\x07\0\x88\
-\x03\0\0\x42\x32\0\0\x37\x69\0\0\x1b\xb4\x07\0\x90\x03\0\0\x42\x32\0\0\xd8\x68\
-\0\0\x1a\xac\x07\0\x98\x03\0\0\x42\x32\0\0\xd8\x68\0\0\x31\xac\x07\0\xa0\x03\0\
-\0\x42\x32\0\0\xd8\x68\0\0\x36\xac\x07\0\xa8\x03\0\0\x42\x32\0\0\x64\x69\0\0\
-\x27\xb8\x07\0\xb0\x03\0\0\x42\x32\0\0\x64\x69\0\0\x36\xb8\x07\0\xb8\x03\0\0\
-\x42\x32\0\0\x64\x69\0\0\x3c\xb8\x07\0\xc0\x03\0\0\x42\x32\0\0\x64\x69\0\0\x44\
-\xb8\x07\0\xc8\x03\0\0\x42\x32\0\0\x64\x69\0\0\x21\xb8\x07\0\xd0\x03\0\0\x42\
-\x32\0\0\x02\x53\0\0\x09\xbc\x07\0\xf0\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\0\
-\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x30\x04\0\0\x42\x32\0\0\x1e\x38\0\0\x01\
-\x64\x08\0\xab\x71\0\0\x34\0\0\0\0\0\0\0\x42\x32\0\0\x82\x32\0\0\0\x94\x04\0\
-\x08\0\0\0\x42\x32\0\0\x82\x32\0\0\x05\x94\x04\0\x28\0\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\x30\0\0\0\x42\x32\0\0\xbb\x32\0\0\x0f\x9c\x04\0\x40\0\0\0\x42\x32\0\0\
-\xbb\x32\0\0\x0f\x9c\x04\0\x48\0\0\0\x42\x32\0\0\xbb\x32\0\0\x09\x9c\x04\0\x50\
-\0\0\0\x42\x32\0\0\xdf\x32\0\0\x08\xa0\x04\0\x78\0\0\0\x42\x32\0\0\0\0\0\0\0\0\
-\0\0\x80\0\0\0\x42\x32\0\0\xf0\x32\0\0\x10\xa8\x04\0\x98\0\0\0\x42\x32\0\0\xf0\
-\x32\0\0\x10\xa8\x04\0\xa0\0\0\0\x42\x32\0\0\x16\x33\0\0\x12\xac\x04\0\xc0\0\0\
-\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xc8\0\0\0\x42\x32\0\0\x43\x33\0\0\x27\xb0\x04\0\
-\xe8\0\0\0\x42\x32\0\0\x98\x33\0\0\x08\xb4\x04\0\x10\x01\0\0\x42\x32\0\0\0\0\0\
-\0\0\0\0\0\x18\x01\0\0\x42\x32\0\0\xab\x33\0\0\x10\xf8\x01\0\x30\x01\0\0\x42\
-\x32\0\0\0\0\0\0\0\0\0\0\x38\x01\0\0\x42\x32\0\0\xd1\x33\0\0\x11\xfc\x01\0\x50\
-\x01\0\0\x42\x32\0\0\xf8\x33\0\0\x24\xf0\x01\0\x58\x01\0\0\x42\x32\0\0\xd1\x33\
-\0\0\x11\xfc\x01\0\x60\x01\0\0\x42\x32\0\0\xf8\x33\0\0\x24\xf0\x01\0\x80\x01\0\
-\0\x42\x32\0\0\x1d\x34\0\0\x11\xf4\x01\0\xa8\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\
-\0\xb0\x01\0\0\x42\x32\0\0\x31\x34\0\0\x3d\x08\x02\0\xd0\x01\0\0\x42\x32\0\0\
-\x1d\x34\0\0\x11\xf4\x01\0\xe0\x01\0\0\x42\x32\0\0\x31\x34\0\0\x05\x08\x02\0\
-\xf8\x01\0\0\x42\x32\0\0\x86\x34\0\0\x1f\xc4\x04\0\xe0\x02\0\0\x42\x32\0\0\xaa\
-\x34\0\0\x26\xc8\x04\0\xe8\x02\0\0\x42\x32\0\0\xaa\x34\0\0\x24\xc8\x04\0\xf8\
-\x02\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x10\x03\0\0\x42\x32\0\0\xe3\x34\0\0\x09\
-\xcc\x04\0\x30\x03\0\0\x42\x32\0\0\x30\x35\0\0\x24\xd0\x04\0\x48\x03\0\0\x42\
-\x32\0\0\x59\x35\0\0\x08\x60\x04\0\x58\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x60\
-\x03\0\0\x42\x32\0\0\x6b\x35\0\0\x21\x68\x04\0\x78\x03\0\0\x42\x32\0\0\xb4\x35\
-\0\0\x08\x6c\x04\0\x80\x03\0\0\x42\x32\0\0\xc1\x35\0\0\x0d\x30\x04\0\x90\x03\0\
-\0\x42\x32\0\0\xd5\x35\0\0\x16\x70\x04\0\x98\x03\0\0\x42\x32\0\0\xc1\x35\0\0\
-\x08\x30\x04\0\xb0\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xb8\x03\0\0\x42\x32\0\0\
-\xf5\x35\0\0\x0d\x24\x04\0\xc8\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xe0\x03\0\0\
-\x42\x32\0\0\x09\x36\0\0\x05\x48\x04\0\xf8\x03\0\0\x42\x32\0\0\x42\x36\0\0\x26\
-\xdc\x04\0\0\x04\0\0\x42\x32\0\0\x42\x36\0\0\x24\xdc\x04\0\x10\x04\0\0\x42\x32\
-\0\0\0\0\0\0\0\0\0\0\x18\x04\0\0\x42\x32\0\0\x7b\x36\0\0\x09\xe0\x04\0\x30\x04\
-\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x40\x04\0\0\x42\x32\0\0\x82\x32\0\0\x05\x94\
-\x04\0\x50\x04\0\0\x42\x32\0\0\xc3\x36\0\0\x19\x7c\x04\0\x70\x04\0\0\x42\x32\0\
-\0\0\0\0\0\0\0\0\0\x78\x04\0\0\x42\x32\0\0\xe1\x36\0\0\x09\x80\x04\0\xbf\x71\0\
-\0\x34\0\0\0\0\0\0\0\x42\x32\0\0\x58\x43\0\0\0\xfc\x04\0\x08\0\0\0\x42\x32\0\0\
-\x58\x43\0\0\x05\xfc\x04\0\x28\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x30\0\0\0\x42\
-\x32\0\0\xbb\x32\0\0\x0f\0\x05\0\x40\0\0\0\x42\x32\0\0\xbb\x32\0\0\x0f\0\x05\0\
-\x48\0\0\0\x42\x32\0\0\xbb\x32\0\0\x09\0\x05\0\x50\0\0\0\x42\x32\0\0\xdf\x32\0\
-\0\x08\x04\x05\0\x78\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\x42\x32\0\0\
-\xf0\x32\0\0\x10\x0c\x05\0\x98\0\0\0\x42\x32\0\0\xf0\x32\0\0\x10\x0c\x05\0\xa0\
-\0\0\0\x42\x32\0\0\x16\x33\0\0\x12\x10\x05\0\xc0\0\0\0\x42\x32\0\0\0\0\0\0\0\0\
-\0\0\xc8\0\0\0\x42\x32\0\0\x43\x33\0\0\x27\x14\x05\0\xe8\0\0\0\x42\x32\0\0\x98\
-\x33\0\0\x08\x18\x05\0\x10\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x18\x01\0\0\x42\
-\x32\0\0\xab\x33\0\0\x10\xf8\x01\0\x30\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x38\
-\x01\0\0\x42\x32\0\0\xd1\x33\0\0\x11\xfc\x01\0\x50\x01\0\0\x42\x32\0\0\xf8\x33\
-\0\0\x24\xf0\x01\0\x58\x01\0\0\x42\x32\0\0\xd1\x33\0\0\x11\xfc\x01\0\x60\x01\0\
-\0\x42\x32\0\0\xf8\x33\0\0\x24\xf0\x01\0\x80\x01\0\0\x42\x32\0\0\x1d\x34\0\0\
-\x11\xf4\x01\0\xa8\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xb0\x01\0\0\x42\x32\0\0\
-\x31\x34\0\0\x3d\x08\x02\0\xd0\x01\0\0\x42\x32\0\0\x1d\x34\0\0\x11\xf4\x01\0\
-\xe0\x01\0\0\x42\x32\0\0\x31\x34\0\0\x05\x08\x02\0\xf8\x01\0\0\x42\x32\0\0\x86\
-\x34\0\0\x1f\x28\x05\0\xe0\x02\0\0\x42\x32\0\0\xaa\x34\0\0\x26\x2c\x05\0\xe8\
-\x02\0\0\x42\x32\0\0\xaa\x34\0\0\x24\x2c\x05\0\xf8\x02\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\x10\x03\0\0\x42\x32\0\0\xe3\x34\0\0\x09\x30\x05\0\x30\x03\0\0\x42\x32\
-\0\0\x30\x35\0\0\x24\x38\x05\0\x48\x03\0\0\x42\x32\0\0\x59\x35\0\0\x08\x60\x04\
-\0\x58\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x60\x03\0\0\x42\x32\0\0\x6b\x35\0\0\
-\x21\x68\x04\0\x78\x03\0\0\x42\x32\0\0\xb4\x35\0\0\x08\x6c\x04\0\x80\x03\0\0\
-\x42\x32\0\0\xc1\x35\0\0\x0d\x30\x04\0\x90\x03\0\0\x42\x32\0\0\xd5\x35\0\0\x16\
-\x70\x04\0\x98\x03\0\0\x42\x32\0\0\xc1\x35\0\0\x08\x30\x04\0\xb0\x03\0\0\x42\
-\x32\0\0\0\0\0\0\0\0\0\0\xb8\x03\0\0\x42\x32\0\0\xf5\x35\0\0\x0d\x24\x04\0\xc8\
-\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xe0\x03\0\0\x42\x32\0\0\x09\x36\0\0\x05\
-\x48\x04\0\xf8\x03\0\0\x42\x32\0\0\x42\x36\0\0\x26\x44\x05\0\0\x04\0\0\x42\x32\
-\0\0\x42\x36\0\0\x24\x44\x05\0\x10\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x18\x04\
-\0\0\x42\x32\0\0\x7b\x36\0\0\x09\x48\x05\0\x30\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\
-\0\0\x40\x04\0\0\x42\x32\0\0\x58\x43\0\0\x05\xfc\x04\0\x50\x04\0\0\x42\x32\0\0\
-\xc3\x36\0\0\x19\x7c\x04\0\x70\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x78\x04\0\0\
-\x42\x32\0\0\xe1\x36\0\0\x09\x80\x04\0\xd7\x71\0\0\x10\0\0\0\0\0\0\0\x42\x32\0\
-\0\x96\x43\0\0\0\x64\x05\0\x08\0\0\0\x42\x32\0\0\xde\x43\0\0\x18\x68\x05\0\x10\
-\0\0\0\x42\x32\0\0\xde\x43\0\0\x09\x68\x05\0\x18\0\0\0\x42\x32\0\0\x16\x33\0\0\
-\x12\x6c\x05\0\x30\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x38\0\0\0\x42\x32\0\0\0\
-\x44\0\0\x21\x70\x05\0\x50\0\0\0\x42\x32\0\0\x53\x44\0\0\x08\x74\x05\0\x60\0\0\
-\0\x42\x32\0\0\x60\x44\0\0\x09\x7c\x05\0\xb8\0\0\0\x42\x32\0\0\x9c\x44\0\0\x28\
-\x80\x05\0\xc0\0\0\0\x42\x32\0\0\xc5\x44\0\0\x18\x84\x05\0\xc8\0\0\0\x42\x32\0\
-\0\x9c\x44\0\0\x28\x80\x05\0\x18\x01\0\0\x42\x32\0\0\xe5\x44\0\0\x09\x90\x05\0\
-\x30\x01\0\0\x42\x32\0\0\x86\x34\0\0\x1f\x94\x05\0\x78\x01\0\0\x42\x32\0\0\x60\
-\x44\0\0\x09\x7c\x05\0\x90\x01\0\0\x42\x32\0\0\x3b\x45\0\0\x09\x98\x05\0\xb0\
-\x01\0\0\x42\x32\0\0\x4a\x43\0\0\x05\xa0\x05\0\xfb\x71\0\0\x1e\0\0\0\0\0\0\0\
-\x42\x32\0\0\x89\x45\0\0\x14\xb4\x05\0\x08\0\0\0\x42\x32\0\0\xb8\x45\0\0\x09\
-\xb8\x05\0\x10\0\0\0\x42\x32\0\0\xdf\x45\0\0\x19\xbc\x05\0\x20\0\0\0\x42\x32\0\
-\0\xdf\x45\0\0\x09\xbc\x05\0\x28\0\0\0\x42\x32\0\0\xb8\x45\0\0\x0f\xb8\x05\0\
-\x38\0\0\0\x42\x32\0\0\0\x46\0\0\x11\xc0\x05\0\x50\0\0\0\x42\x32\0\0\0\0\0\0\0\
-\0\0\0\x58\0\0\0\x42\x32\0\0\x1e\x46\0\0\x05\xcc\x05\0\x78\0\0\0\x42\x32\0\0\0\
-\0\0\0\0\0\0\0\x80\0\0\0\x42\x32\0\0\x6b\x35\0\0\x21\xd0\x05\0\xa0\0\0\0\x42\
-\x32\0\0\x51\x46\0\0\x08\xd4\x05\0\xa8\0\0\0\x42\x32\0\0\x65\x46\0\0\x10\xd8\
-\x05\0\xb0\0\0\0\x42\x32\0\0\x65\x46\0\0\x0c\xd8\x05\0\xb8\0\0\0\x42\x32\0\0\
-\x85\x46\0\0\x1d\xdc\x05\0\xd0\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xd8\0\0\0\x42\
-\x32\0\0\xa7\x46\0\0\x13\xe4\x05\0\xf0\0\0\0\x42\x32\0\0\xe9\x46\0\0\x0c\xe8\
-\x05\0\0\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x08\x01\0\0\x42\x32\0\0\x01\x47\0\
-\0\x0d\xec\x05\0\x28\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x30\x01\0\0\x42\x32\0\
-\0\x3d\x47\0\0\x09\xfc\x05\0\x48\x01\0\0\x42\x32\0\0\x75\x47\0\0\x1c\x04\x06\0\
-\x50\x01\0\0\x42\x32\0\0\x75\x47\0\0\x0c\x04\x06\0\x60\x01\0\0\x42\x32\0\0\0\0\
-\0\0\0\0\0\0\x68\x01\0\0\x42\x32\0\0\xa2\x47\0\0\x0d\x0c\x06\0\x88\x01\0\0\x42\
-\x32\0\0\xd7\x47\0\0\x12\x50\x06\0\xa8\x01\0\0\x42\x32\0\0\x1a\x48\0\0\x10\x54\
-\x06\0\xb8\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xc0\x01\0\0\x42\x32\0\0\x36\x48\
-\0\0\x11\x58\x06\0\xd8\x01\0\0\x42\x32\0\0\x78\x48\0\0\x05\xb0\x05\0\x1f\x72\0\
-\0\x67\x01\0\0\0\0\0\0\x42\x32\0\0\x98\x48\0\0\0\x70\x08\0\x08\0\0\0\x42\x32\0\
-\0\xd9\x48\0\0\x19\x7c\x08\0\x10\0\0\0\x42\x32\0\0\xd9\x48\0\0\x09\x7c\x08\0\
-\x18\0\0\0\x42\x32\0\0\xfb\x48\0\0\x19\x80\x08\0\x20\0\0\0\x42\x32\0\0\xfb\x48\
-\0\0\x09\x80\x08\0\x28\0\0\0\x42\x32\0\0\x16\x33\0\0\x12\x84\x08\0\x30\0\0\0\
-\x42\x32\0\0\x16\x33\0\0\x09\x84\x08\0\x38\0\0\0\x42\x32\0\0\xcc\x37\0\0\x0f\
-\x88\x08\0\x50\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x58\0\0\0\x42\x32\0\0\x1d\x49\
-\0\0\x11\x94\x08\0\x70\0\0\0\x42\x32\0\0\x61\x49\0\0\x09\x98\x08\0\x80\0\0\0\
-\x42\x32\0\0\x7e\x49\0\0\x20\x9c\x08\0\xf0\0\0\0\x42\x32\0\0\xac\x49\0\0\x09\
-\xa0\x08\0\x20\x01\0\0\x42\x32\0\0\xfc\x49\0\0\x2d\xa8\x08\0\x28\x01\0\0\x42\
-\x32\0\0\xfc\x49\0\0\x20\xa8\x08\0\x30\x01\0\0\x42\x32\0\0\x2a\x4a\0\0\x17\xac\
-\x08\0\x38\x01\0\0\x42\x32\0\0\xfc\x49\0\0\x2d\xa8\x08\0\x40\x01\0\0\x42\x32\0\
-\0\xfc\x49\0\0\x20\xa8\x08\0\x68\x01\0\0\x42\x32\0\0\x7e\x49\0\0\x20\x9c\x08\0\
-\x70\x01\0\0\x42\x32\0\0\x48\x4a\0\0\x09\xb8\x08\0\xa0\x01\0\0\x42\x32\0\0\0\0\
-\0\0\0\0\0\0\xa8\x01\0\0\x42\x32\0\0\x1d\x49\0\0\x11\xc0\x08\0\xd8\x01\0\0\x42\
-\x32\0\0\x9c\x4a\0\0\x09\xc4\x08\0\xe0\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xe8\
-\x01\0\0\x42\x32\0\0\xc2\x4a\0\0\x08\xe0\x08\0\xf0\x01\0\0\x42\x32\0\0\xc2\x4a\
-\0\0\x08\xe0\x08\0\0\x02\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x08\x02\0\0\x42\x32\0\
-\0\xd9\x4a\0\0\x2c\xe4\x08\0\x20\x02\0\0\x42\x32\0\0\x39\x4b\0\0\x0d\xe8\x08\0\
-\x30\x02\0\0\x42\x32\0\0\x53\x4b\0\0\x0d\xf0\x08\0\x88\x02\0\0\x42\x32\0\0\x93\
-\x4b\0\0\x18\xf8\x08\0\x90\x02\0\0\x42\x32\0\0\xb4\x4b\0\0\x2c\xf4\x08\0\x98\
-\x02\0\0\x42\x32\0\0\xe1\x4b\0\0\x1b\xfc\x08\0\xa0\x02\0\0\x42\x32\0\0\xb4\x4b\
-\0\0\x2c\xf4\x08\0\xf8\x02\0\0\x42\x32\0\0\x02\x4c\0\0\x0d\x04\x09\0\x10\x03\0\
-\0\x42\x32\0\0\x5a\x4c\0\0\x27\x0c\x09\0\x18\x03\0\0\x42\x32\0\0\x87\x4c\0\0\
-\x25\x10\x09\0\x20\x03\0\0\x42\x32\0\0\xb2\x4c\0\0\x23\x08\x09\0\x68\x03\0\0\
-\x42\x32\0\0\x53\x4b\0\0\x0d\xf0\x08\0\x80\x03\0\0\x42\x32\0\0\xda\x4c\0\0\x0d\
-\x14\x09\0\xa8\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xb0\x03\0\0\x42\x32\0\0\x30\
-\x4d\0\0\x28\x1c\x09\0\xb8\x03\0\0\x42\x32\0\0\x30\x4d\0\0\x26\x1c\x09\0\xc0\
-\x03\0\0\x42\x32\0\0\x61\x4d\0\0\x1c\x20\x09\0\xc8\x03\0\0\x42\x32\0\0\x61\x4d\
-\0\0\x11\x20\x09\0\xd0\x03\0\0\x42\x32\0\0\x92\x4d\0\0\x20\x28\x09\0\xf0\x03\0\
-\0\x42\x32\0\0\xbe\x4d\0\0\x21\x24\x09\0\0\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\
-\x48\x04\0\0\x42\x32\0\0\xfa\x4d\0\0\x2a\x44\x09\0\x60\x04\0\0\x42\x32\0\0\x2d\
-\x4e\0\0\x09\x90\x06\0\x68\x04\0\0\x42\x32\0\0\xcc\x37\0\0\x0f\x94\x06\0\x70\
-\x04\0\0\x42\x32\0\0\x56\x4e\0\0\x14\x98\x06\0\x78\x04\0\0\x42\x32\0\0\x56\x4e\
-\0\0\x08\x98\x06\0\x80\x04\0\0\x42\x32\0\0\x7f\x4e\0\0\x25\xa0\x06\0\xa0\x04\0\
-\0\x42\x32\0\0\xaa\x4e\0\0\x15\xb0\x06\0\xa8\x04\0\0\x42\x32\0\0\xaa\x4e\0\0\
-\x24\xb0\x06\0\xf8\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x08\x05\0\0\x42\x32\0\0\
-\x17\x4f\0\0\x09\xb8\x06\0\x30\x05\0\0\x42\x32\0\0\x5c\x4f\0\0\x27\xc0\x06\0\
-\x58\x05\0\0\x42\x32\0\0\xce\x4f\0\0\x0c\xc4\x06\0\x60\x05\0\0\x42\x32\0\0\xe1\
-\x4f\0\0\x0d\xc8\x06\0\x90\x05\0\0\x42\x32\0\0\x1a\x50\0\0\x0c\x20\x07\0\x98\
-\x05\0\0\x42\x32\0\0\x56\x50\0\0\x10\x28\x07\0\xa8\x05\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\xb0\x05\0\0\x42\x32\0\0\x8a\x50\0\0\x11\x2c\x07\0\xd8\x05\0\0\x42\x32\
-\0\0\xca\x50\0\0\x29\x30\x07\0\xe8\x05\0\0\x42\x32\0\0\xf9\x50\0\0\x26\x38\x07\
-\0\xf0\x05\0\0\x42\x32\0\0\x23\x51\0\0\x28\x40\x07\0\xf8\x05\0\0\x42\x32\0\0\
-\xf9\x50\0\0\x26\x38\x07\0\x10\x06\0\0\x42\x32\0\0\x53\x51\0\0\x09\xd4\x06\0\
-\x80\x06\0\0\x42\x32\0\0\x89\x51\0\0\x27\xd8\x06\0\xc0\x06\0\0\x42\x32\0\0\xba\
-\x51\0\0\x28\xdc\x06\0\xd0\x06\0\0\x42\x32\0\0\xba\x51\0\0\x1a\xdc\x06\0\xe0\
-\x06\0\0\x42\x32\0\0\xba\x51\0\0\x38\xdc\x06\0\xe8\x06\0\0\x42\x32\0\0\xba\x51\
-\0\0\x3c\xdc\x06\0\xf0\x06\0\0\x42\x32\0\0\x04\x52\0\0\x2b\xe0\x06\0\xf8\x06\0\
-\0\x42\x32\0\0\x04\x52\0\0\x39\xe0\x06\0\x08\x07\0\0\x42\x32\0\0\x04\x52\0\0\
-\x3f\xe0\x06\0\x10\x07\0\0\x42\x32\0\0\x04\x52\0\0\x46\xe0\x06\0\x18\x07\0\0\
-\x42\x32\0\0\x04\x52\0\0\x1d\xe0\x06\0\x20\x07\0\0\x42\x32\0\0\x58\x52\0\0\x2c\
-\xe4\x06\0\x28\x07\0\0\x42\x32\0\0\x58\x52\0\0\x3b\xe4\x06\0\x30\x07\0\0\x42\
-\x32\0\0\x58\x52\0\0\x1e\xe4\x06\0\x38\x07\0\0\x42\x32\0\0\xaf\x52\0\0\x2a\xe8\
-\x06\0\x40\x07\0\0\x42\x32\0\0\xaf\x52\0\0\x37\xe8\x06\0\x48\x07\0\0\x42\x32\0\
-\0\xaf\x52\0\0\x1c\xe8\x06\0\x50\x07\0\0\x42\x32\0\0\x02\x53\0\0\x09\xec\x06\0\
-\x70\x07\0\0\x42\x32\0\0\x26\x53\0\0\x24\xf4\x06\0\x78\x07\0\0\x42\x32\0\0\x51\
-\x53\0\0\x18\0\x07\0\x80\x07\0\0\x42\x32\0\0\x51\x53\0\0\x2d\0\x07\0\xa8\x07\0\
-\0\x42\x32\0\0\xc7\x53\0\0\x21\x08\x07\0\xb8\x07\0\0\x42\x32\0\0\xcc\x37\0\0\
-\x0f\x20\x02\0\xc0\x07\0\0\x42\x32\0\0\xdf\x32\0\0\x08\x28\x02\0\xd0\x07\0\0\
-\x42\x32\0\0\0\0\0\0\0\0\0\0\xd8\x07\0\0\x42\x32\0\0\xed\x53\0\0\x0c\x30\x02\0\
-\xf0\x07\0\0\x42\x32\0\0\x28\x54\0\0\x08\x34\x02\0\x08\x08\0\0\x42\x32\0\0\x36\
-\x54\0\0\x25\x40\x02\0\x30\x08\0\0\x42\x32\0\0\xa9\x54\0\0\x08\x44\x02\0\x38\
-\x08\0\0\x42\x32\0\0\xb8\x54\0\0\x09\x48\x02\0\x60\x08\0\0\x42\x32\0\0\xf0\x54\
-\0\0\x05\x54\x02\0\xc0\x09\0\0\x42\x32\0\0\x24\x55\0\0\x11\x58\x02\0\xc8\x09\0\
-\0\x42\x32\0\0\x24\x55\0\0\x0f\x58\x02\0\xd0\x09\0\0\x42\x32\0\0\x39\x55\0\0\
-\x1e\x5c\x02\0\xe8\x09\0\0\x42\x32\0\0\x39\x55\0\0\x3c\x5c\x02\0\xf0\x09\0\0\
-\x42\x32\0\0\x39\x55\0\0\x05\x5c\x02\0\x18\x0a\0\0\x42\x32\0\0\x7b\x55\0\0\x1d\
-\x60\x02\0\x20\x0a\0\0\x42\x32\0\0\x7b\x55\0\0\x15\x60\x02\0\x28\x0a\0\0\x42\
-\x32\0\0\xa2\x55\0\0\x1d\x64\x02\0\x30\x0a\0\0\x42\x32\0\0\xa2\x55\0\0\x15\x64\
-\x02\0\x60\x0a\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\x68\x0a\0\0\x42\x32\0\
-\0\xed\x55\0\0\x20\x74\x02\0\x70\x0a\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\
-\x78\x0a\0\0\x42\x32\0\0\xc9\x55\0\0\x12\x6c\x02\0\x80\x0a\0\0\x42\x32\0\0\xc9\
-\x55\0\0\x10\x6c\x02\0\x88\x0a\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\x90\
-\x0a\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\x98\x0a\0\0\x42\x32\0\0\xc9\x55\
-\0\0\x12\x6c\x02\0\xa0\x0a\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\xa8\x0a\0\
-\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\xb0\x0a\0\0\x42\x32\0\0\xed\x55\0\0\
-\x1e\x74\x02\0\xb8\x0a\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\xc0\x0a\0\0\
-\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\xc8\x0a\0\0\x42\x32\0\0\xed\x55\0\0\x1e\
-\x74\x02\0\xd0\x0a\0\0\x42\x32\0\0\xc9\x55\0\0\x12\x6c\x02\0\xe0\x0a\0\0\x42\
-\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\xe8\x0a\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\
-\x02\0\xf0\x0a\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\xf8\x0a\0\0\x42\x32\0\
-\0\xc9\x55\0\0\x10\x6c\x02\0\0\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\
-\x08\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\x10\x0b\0\0\x42\x32\0\0\xc9\
-\x55\0\0\x12\x6c\x02\0\x20\x0b\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\x28\
-\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\x30\x0b\0\0\x42\x32\0\0\xed\x55\
-\0\0\x1e\x74\x02\0\x38\x0b\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\x40\x0b\0\
-\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\x48\x0b\0\0\x42\x32\0\0\xed\x55\0\0\
-\x1e\x74\x02\0\x50\x0b\0\0\x42\x32\0\0\xc9\x55\0\0\x12\x6c\x02\0\x60\x0b\0\0\
-\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\x68\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x20\
-\x74\x02\0\x70\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\x78\x0b\0\0\x42\
-\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\x80\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\
-\x02\0\x88\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\x90\x0b\0\0\x42\x32\0\
-\0\xc9\x55\0\0\x12\x6c\x02\0\xa0\x0b\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\
-\xa8\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\xb0\x0b\0\0\x42\x32\0\0\xed\
-\x55\0\0\x1e\x74\x02\0\xb8\x0b\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\xc0\
-\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\xc8\x0b\0\0\x42\x32\0\0\xed\x55\
-\0\0\x1e\x74\x02\0\xd0\x0b\0\0\x42\x32\0\0\xc9\x55\0\0\x12\x6c\x02\0\xe0\x0b\0\
-\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\xe8\x0b\0\0\x42\x32\0\0\xed\x55\0\0\
-\x20\x74\x02\0\xf0\x0b\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\xf8\x0b\0\0\
-\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\0\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x20\
-\x74\x02\0\x08\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\x10\x0c\0\0\x42\
-\x32\0\0\xc9\x55\0\0\x12\x6c\x02\0\x20\x0c\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\
-\x02\0\x28\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\x30\x0c\0\0\x42\x32\0\
-\0\xed\x55\0\0\x1e\x74\x02\0\x38\x0c\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\
-\x40\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\x48\x0c\0\0\x42\x32\0\0\xed\
-\x55\0\0\x1e\x74\x02\0\x50\x0c\0\0\x42\x32\0\0\xc9\x55\0\0\x12\x6c\x02\0\x60\
-\x0c\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\x68\x0c\0\0\x42\x32\0\0\xed\x55\
-\0\0\x20\x74\x02\0\x70\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\x78\x0c\0\
-\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\x02\0\x80\x0c\0\0\x42\x32\0\0\xed\x55\0\0\
-\x20\x74\x02\0\x88\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\x90\x0c\0\0\
-\x42\x32\0\0\xc9\x55\0\0\x12\x6c\x02\0\xa0\x0c\0\0\x42\x32\0\0\xc9\x55\0\0\x10\
-\x6c\x02\0\xa8\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\xb0\x0c\0\0\x42\
-\x32\0\0\xed\x55\0\0\x1e\x74\x02\0\xb8\x0c\0\0\x42\x32\0\0\xc9\x55\0\0\x10\x6c\
-\x02\0\xc0\x0c\0\0\x42\x32\0\0\xed\x55\0\0\x20\x74\x02\0\xc8\x0c\0\0\x42\x32\0\
-\0\xed\x55\0\0\x1e\x74\x02\0\0\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\
-\x08\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x10\x0d\0\0\x42\x32\0\0\x42\
-\x56\0\0\x1e\x88\x02\0\x18\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x12\x80\x02\0\x20\
-\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\x28\x0d\0\0\x42\x32\0\0\x42\x56\
-\0\0\x20\x88\x02\0\x30\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\x38\x0d\0\
-\0\x42\x32\0\0\x1e\x56\0\0\x12\x80\x02\0\x40\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\
-\x10\x80\x02\0\x48\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x50\x0d\0\0\
-\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\x58\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x10\
-\x80\x02\0\x60\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x68\x0d\0\0\x42\
-\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\x70\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x12\x80\
-\x02\0\x80\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\x88\x0d\0\0\x42\x32\0\
-\0\x42\x56\0\0\x20\x88\x02\0\x90\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\
-\x98\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\xa0\x0d\0\0\x42\x32\0\0\x42\
-\x56\0\0\x20\x88\x02\0\xa8\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\xb0\
-\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x12\x80\x02\0\xc0\x0d\0\0\x42\x32\0\0\x1e\x56\
-\0\0\x10\x80\x02\0\xc8\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\xd0\x0d\0\
-\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\xd8\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\
-\x10\x80\x02\0\xe0\x0d\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\xe8\x0d\0\0\
-\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\xf0\x0d\0\0\x42\x32\0\0\x1e\x56\0\0\x12\
-\x80\x02\0\0\x0e\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\x08\x0e\0\0\x42\x32\
-\0\0\x42\x56\0\0\x20\x88\x02\0\x10\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\
-\0\x18\x0e\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\x20\x0e\0\0\x42\x32\0\0\
-\x42\x56\0\0\x20\x88\x02\0\x28\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\
-\x30\x0e\0\0\x42\x32\0\0\x1e\x56\0\0\x12\x80\x02\0\x40\x0e\0\0\x42\x32\0\0\x1e\
-\x56\0\0\x10\x80\x02\0\x48\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x50\
-\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\x58\x0e\0\0\x42\x32\0\0\x1e\x56\
-\0\0\x10\x80\x02\0\x60\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x68\x0e\0\
-\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\x70\x0e\0\0\x42\x32\0\0\x1e\x56\0\0\
-\x12\x80\x02\0\x80\x0e\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\x88\x0e\0\0\
-\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x90\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x1e\
-\x88\x02\0\x98\x0e\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\xa0\x0e\0\0\x42\
-\x32\0\0\x42\x56\0\0\x20\x88\x02\0\xa8\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\
-\x02\0\xb0\x0e\0\0\x42\x32\0\0\x1e\x56\0\0\x12\x80\x02\0\xc0\x0e\0\0\x42\x32\0\
-\0\x1e\x56\0\0\x10\x80\x02\0\xc8\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\
-\xd0\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\xd8\x0e\0\0\x42\x32\0\0\x1e\
-\x56\0\0\x10\x80\x02\0\xe0\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\xe8\
-\x0e\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\xf0\x0e\0\0\x42\x32\0\0\x1e\x56\
-\0\0\x12\x80\x02\0\0\x0f\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\x08\x0f\0\0\
-\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x10\x0f\0\0\x42\x32\0\0\x42\x56\0\0\x1e\
-\x88\x02\0\x18\x0f\0\0\x42\x32\0\0\x1e\x56\0\0\x10\x80\x02\0\x20\x0f\0\0\x42\
-\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x28\x0f\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\
-\x02\0\x30\x0f\0\0\x42\x32\0\0\x1e\x56\0\0\x12\x80\x02\0\x40\x0f\0\0\x42\x32\0\
-\0\x1e\x56\0\0\x10\x80\x02\0\x48\x0f\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\
-\x50\x0f\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\x58\x0f\0\0\x42\x32\0\0\x1e\
-\x56\0\0\x10\x80\x02\0\x60\x0f\0\0\x42\x32\0\0\x42\x56\0\0\x20\x88\x02\0\x68\
-\x0f\0\0\x42\x32\0\0\x42\x56\0\0\x1e\x88\x02\0\x70\x0f\0\0\x42\x32\0\0\x73\x56\
-\0\0\x05\x90\x02\0\x80\x0f\0\0\x42\x32\0\0\x94\x56\0\0\x29\x0c\x07\0\x98\x0f\0\
-\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xc8\x0f\0\0\x42\x32\0\0\xc3\x56\0\0\x29\x50\x09\
-\0\xd0\x0f\0\0\x42\x32\0\0\xc3\x56\0\0\x14\x50\x09\0\xd8\x0f\0\0\x42\x32\0\0\
-\xf7\x56\0\0\x48\x58\x09\0\xe8\x0f\0\0\x42\x32\0\0\xf7\x56\0\0\x15\x58\x09\0\0\
-\x10\0\0\x42\x32\0\0\x50\x57\0\0\x26\x64\x09\0\x20\x10\0\0\x42\x32\0\0\x7c\x57\
-\0\0\x0d\x68\x09\0\x48\x10\0\0\x42\x32\0\0\xd1\x57\0\0\x08\x8c\x09\0\x50\x10\0\
-\0\x42\x32\0\0\xd1\x57\0\0\x11\x8c\x09\0\x68\x10\0\0\x42\x32\0\0\xd1\x57\0\0\
-\x08\x8c\x09\0\x78\x10\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x80\x10\0\0\x42\x32\0\0\
-\xe8\x57\0\0\x2d\x90\x09\0\xa0\x10\0\0\x42\x32\0\0\x49\x58\0\0\x0d\x94\x09\0\
-\xb0\x10\0\0\x42\x32\0\0\x53\x4b\0\0\x0d\x9c\x09\0\x08\x11\0\0\x42\x32\0\0\x64\
-\x58\0\0\x18\xa4\x09\0\x10\x11\0\0\x42\x32\0\0\xb4\x4b\0\0\x2c\xa0\x09\0\x18\
-\x11\0\0\x42\x32\0\0\xe1\x4b\0\0\x1b\xa8\x09\0\x20\x11\0\0\x42\x32\0\0\xb4\x4b\
-\0\0\x2c\xa0\x09\0\x70\x11\0\0\x42\x32\0\0\x85\x58\0\0\x0d\xb0\x09\0\x90\x11\0\
-\0\x42\x32\0\0\x5a\x4c\0\0\x27\xb8\x09\0\x98\x11\0\0\x42\x32\0\0\x87\x4c\0\0\
-\x25\xbc\x09\0\xa0\x11\0\0\x42\x32\0\0\xb2\x4c\0\0\x23\xb4\x09\0\xe8\x11\0\0\
-\x42\x32\0\0\x53\x4b\0\0\x0d\x9c\x09\0\0\x12\0\0\x42\x32\0\0\xdd\x58\0\0\x0d\
-\xc0\x09\0\x18\x12\0\0\x42\x32\0\0\x33\x59\0\0\x29\xc8\x09\0\x20\x12\0\0\x42\
-\x32\0\0\x33\x59\0\0\x27\xc8\x09\0\x28\x12\0\0\x42\x32\0\0\x65\x59\0\0\x34\xd0\
-\x09\0\x30\x12\0\0\x42\x32\0\0\x65\x59\0\0\x26\xd0\x09\0\x40\x12\0\0\x42\x32\0\
-\0\xaa\x59\0\0\x23\xd4\x09\0\x48\x12\0\0\x42\x32\0\0\xde\x59\0\0\x10\xe4\x09\0\
-\x60\x12\0\0\x42\x32\0\0\x02\x5a\0\0\x15\xec\x09\0\x78\x12\0\0\x42\x32\0\0\x2a\
-\x5a\0\0\x15\xf4\x09\0\x90\x12\0\0\x42\x32\0\0\x53\x5a\0\0\x15\xfc\x09\0\xa8\
-\x12\0\0\x42\x32\0\0\x7c\x5a\0\0\x15\x04\x0a\0\xc0\x12\0\0\x42\x32\0\0\xa6\x5a\
-\0\0\x15\x0c\x0a\0\xd8\x12\0\0\x42\x32\0\0\xd1\x5a\0\0\x15\x14\x0a\0\xf8\x12\0\
-\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x08\x13\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x10\x13\
-\0\0\x42\x32\0\0\xfc\x5a\0\0\x1c\x24\x0a\0\x28\x13\0\0\x42\x32\0\0\x42\x5b\0\0\
-\x10\x28\x0a\0\x38\x13\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x40\x13\0\0\x42\x32\0\0\
-\x5c\x5b\0\0\x11\x2c\x0a\0\x68\x13\0\0\x42\x32\0\0\xa4\x5b\0\0\x1c\x34\x0a\0\
-\x70\x13\0\0\x42\x32\0\0\xa4\x5b\0\0\x25\x34\x0a\0\x78\x13\0\0\x42\x32\0\0\xa4\
-\x5b\0\0\x1a\x34\x0a\0\x88\x13\0\0\x42\x32\0\0\xa4\x5b\0\0\x1c\x34\x0a\0\x90\
-\x13\0\0\x42\x32\0\0\xcd\x5b\0\0\x11\x38\x0a\0\xa8\x13\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\xb8\x13\0\0\x42\x32\0\0\x18\x5c\0\0\x37\x44\x0a\0\xc0\x13\0\0\x42\x32\
-\0\0\x18\x5c\0\0\x1c\x44\x0a\0\xc8\x13\0\0\x42\x32\0\0\x18\x5c\0\0\x10\x44\x0a\
-\0\xd8\x13\0\0\x42\x32\0\0\x60\x5c\0\0\x2c\x50\x0a\0\xf0\x13\0\0\x42\x32\0\0\
-\x90\x5c\0\0\x2a\x58\x0a\0\xf8\x13\0\0\x42\x32\0\0\x90\x5c\0\0\x14\x58\x0a\0\0\
-\x14\0\0\x42\x32\0\0\xc4\x5c\0\0\x15\x5c\x0a\0\x18\x14\0\0\x42\x32\0\0\x2e\x5d\
-\0\0\x27\x68\x0a\0\x38\x14\0\0\x42\x32\0\0\x5b\x5d\0\0\x0d\x6c\x0a\0\x50\x14\0\
-\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x68\x14\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x78\x14\
-\0\0\x42\x32\0\0\xb1\x5d\0\0\x05\x7c\x0a\0\xa0\x14\0\0\x42\x32\0\0\x1e\x38\0\0\
-\x01\x84\x0a\0\xb0\x14\0\0\x42\x32\0\0\xfa\x5d\0\0\0\x90\x0a\0\xb8\x14\0\0\x42\
-\x32\0\0\x39\x5e\0\0\x14\x98\x0a\0\xc0\x14\0\0\x42\x32\0\0\x39\x5e\0\0\x09\x98\
-\x0a\0\xc8\x14\0\0\x42\x32\0\0\x56\x5e\0\0\x11\xa0\x0a\0\xd8\x14\0\0\x42\x32\0\
-\0\0\0\0\0\0\0\0\0\xe0\x14\0\0\x42\x32\0\0\x56\x5e\0\0\x14\xa0\x0a\0\xf8\x14\0\
-\0\x42\x32\0\0\x56\x5e\0\0\x08\xa0\x0a\0\0\x15\0\0\x42\x32\0\0\xa1\x5e\0\0\x14\
-\xac\x0a\0\x48\x15\0\0\x42\x32\0\0\xf0\x5e\0\0\x08\xb0\x0a\0\x50\x15\0\0\x42\
-\x32\0\0\x06\x5f\0\0\x09\xb4\x0a\0\x88\x15\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x90\
-\x15\0\0\x42\x32\0\0\x48\x5f\0\0\x26\xc4\x0a\0\xa8\x15\0\0\x42\x32\0\0\x9d\x5f\
-\0\0\x08\xc8\x0a\0\xb0\x15\0\0\x42\x32\0\0\xad\x5f\0\0\x14\xd0\x0a\0\xb8\x15\0\
-\0\x42\x32\0\0\xad\x5f\0\0\x12\xd0\x0a\0\xc8\x15\0\0\x42\x32\0\0\xad\x5f\0\0\
-\x14\xd0\x0a\0\xd0\x15\0\0\x42\x32\0\0\xc5\x5f\0\0\x27\xd4\x0a\0\xe8\x15\0\0\
-\x42\x32\0\0\x1a\x60\0\0\x0c\xd8\x0a\0\xf0\x15\0\0\x42\x32\0\0\x34\x60\0\0\x5e\
-\xdc\x0a\0\xf8\x15\0\0\x42\x32\0\0\x34\x60\0\0\x27\xdc\x0a\0\x08\x16\0\0\x42\
-\x32\0\0\x34\x60\0\0\x0d\xdc\x0a\0\x28\x16\0\0\x42\x32\0\0\x98\x60\0\0\x18\xe8\
-\x0a\0\x30\x16\0\0\x42\x32\0\0\xb4\x60\0\0\x18\xe4\x0a\0\x40\x16\0\0\x42\x32\0\
-\0\x98\x60\0\0\x18\xe8\x0a\0\x58\x16\0\0\x42\x32\0\0\xd0\x60\0\0\x09\xec\x0a\0\
-\x88\x16\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x90\x16\0\0\x42\x32\0\0\x16\x61\0\0\
-\x26\xf8\x0a\0\xb0\x16\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xb8\x16\0\0\x42\x32\0\0\
-\x6a\x61\0\0\x0d\x08\x0b\0\xd8\x16\0\0\x42\x32\0\0\xa6\x61\0\0\x08\x0c\x0b\0\
-\xe0\x16\0\0\x42\x32\0\0\xb5\x61\0\0\x09\x14\x0b\0\x08\x17\0\0\x42\x32\0\0\xeb\
-\x61\0\0\x16\x44\x0b\0\x10\x17\0\0\x42\x32\0\0\x0c\x62\0\0\x21\x48\x0b\0\x18\
-\x17\0\0\x42\x32\0\0\x45\x62\0\0\x09\x4c\x0b\0\x20\x17\0\0\x42\x32\0\0\x5d\x62\
-\0\0\x27\x54\x0b\0\x30\x17\0\0\x42\x32\0\0\x0c\x62\0\0\x2a\x48\x0b\0\x38\x17\0\
-\0\x42\x32\0\0\x5d\x62\0\0\x09\x54\x0b\0\x50\x17\0\0\x42\x32\0\0\xb3\x62\0\0\
-\x16\x80\x0b\0\xa0\x17\0\0\x42\x32\0\0\x19\x63\0\0\x09\x84\x0b\0\xa8\x17\0\0\
-\x42\x32\0\0\x34\x63\0\0\x1a\x88\x0b\0\xb0\x17\0\0\x42\x32\0\0\x5b\x63\0\0\x0d\
-\x90\x0b\0\xb8\x17\0\0\x42\x32\0\0\x77\x63\0\0\x2b\x98\x0b\0\xc8\x17\0\0\x42\
-\x32\0\0\xd1\x63\0\0\x30\x8c\x0b\0\xd0\x17\0\0\x42\x32\0\0\x77\x63\0\0\x0d\x98\
-\x0b\0\xe8\x17\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xf0\x17\0\0\x42\x32\0\0\x10\x64\
-\0\0\x05\xa8\x0b\0\x18\x18\0\0\x42\x32\0\0\x1e\x38\0\0\x01\xb4\x0b\0\x3d\x72\0\
-\0\x1b\0\0\0\0\0\0\0\x42\x32\0\0\xb6\x69\0\0\x17\x04\x0c\0\x08\0\0\0\x42\x32\0\
-\0\xb6\x69\0\0\x09\x04\x0c\0\x10\0\0\0\x42\x32\0\0\xd4\x69\0\0\x16\x08\x0c\0\
-\x18\0\0\0\x42\x32\0\0\xcc\x37\0\0\x0f\x10\x0c\0\x30\0\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\x38\0\0\0\x42\x32\0\0\x1d\x49\0\0\x11\x1c\x0c\0\x50\0\0\0\x42\x32\0\0\
-\x61\x49\0\0\x09\x20\x0c\0\x60\0\0\0\x42\x32\0\0\x7e\x49\0\0\x20\x24\x0c\0\xd0\
-\0\0\0\x42\x32\0\0\xac\x49\0\0\x09\x28\x0c\0\0\x01\0\0\x42\x32\0\0\xfc\x49\0\0\
-\x2d\x30\x0c\0\x08\x01\0\0\x42\x32\0\0\xfc\x49\0\0\x20\x30\x0c\0\x10\x01\0\0\
-\x42\x32\0\0\x2a\x4a\0\0\x17\x34\x0c\0\x18\x01\0\0\x42\x32\0\0\xfc\x49\0\0\x2d\
-\x30\x0c\0\x20\x01\0\0\x42\x32\0\0\xfc\x49\0\0\x20\x30\x0c\0\x48\x01\0\0\x42\
-\x32\0\0\x7e\x49\0\0\x20\x24\x0c\0\x50\x01\0\0\x42\x32\0\0\x48\x4a\0\0\x09\x40\
-\x0c\0\x70\x01\0\0\x42\x32\0\0\xf0\x69\0\0\x0e\x60\x0c\0\x88\x01\0\0\x42\x32\0\
-\0\xf0\x69\0\0\x08\x60\x0c\0\x90\x01\0\0\x42\x32\0\0\x0c\x6a\0\0\x17\x64\x0c\0\
-\x98\x01\0\0\x42\x32\0\0\x0c\x6a\0\0\x0c\x64\x0c\0\xa0\x01\0\0\x42\x32\0\0\x37\
-\x6a\0\0\x26\x6c\x0c\0\xa8\x01\0\0\x42\x32\0\0\x37\x6a\0\0\x1f\x6c\x0c\0\xc8\
-\x01\0\0\x42\x32\0\0\x79\x6a\0\0\x23\x74\x0c\0\xd8\x01\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\xe0\x01\0\0\x42\x32\0\0\xa2\x6a\0\0\x05\x7c\x0c\0\xf8\x01\0\0\x42\x32\
-\0\0\0\0\0\0\0\0\0\0\x08\x02\0\0\x42\x32\0\0\x1e\x38\0\0\x01\x80\x0c\0\x57\x72\
-\0\0\x33\0\0\0\0\0\0\0\x42\x32\0\0\xee\x6a\0\0\x36\x98\x0c\0\x30\0\0\0\x42\x32\
-\0\0\0\0\0\0\0\0\0\0\x38\0\0\0\x42\x32\0\0\x3b\x6b\0\0\x0f\x9c\x0c\0\x48\0\0\0\
-\x42\x32\0\0\x3b\x6b\0\0\x0f\x9c\x0c\0\x50\0\0\0\x42\x32\0\0\x3b\x6b\0\0\x09\
-\x9c\x0c\0\x78\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\x42\x32\0\0\x63\x6b\
-\0\0\x10\xa0\x0c\0\x90\0\0\0\x42\x32\0\0\xdf\x32\0\0\x08\xa4\x0c\0\x98\0\0\0\
-\x42\x32\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\x42\x32\0\0\x8c\x6b\0\0\x24\xb0\x0c\0\
-\xd0\0\0\0\x42\x32\0\0\xdf\x6b\0\0\x08\xb4\x0c\0\xd8\0\0\0\x42\x32\0\0\xef\x6b\
-\0\0\x16\xb8\x0c\0\x10\x01\0\0\x42\x32\0\0\xab\x33\0\0\x10\xf8\x01\0\x40\x01\0\
-\0\x42\x32\0\0\xef\x6b\0\0\x16\xb8\x0c\0\x48\x01\0\0\x42\x32\0\0\xd1\x33\0\0\
-\x11\xfc\x01\0\x58\x01\0\0\x42\x32\0\0\xf8\x33\0\0\x24\xf0\x01\0\x60\x01\0\0\
-\x42\x32\0\0\xd1\x33\0\0\x11\xfc\x01\0\x68\x01\0\0\x42\x32\0\0\xf8\x33\0\0\x24\
-\xf0\x01\0\x88\x01\0\0\x42\x32\0\0\x1d\x34\0\0\x11\xf4\x01\0\xb0\x01\0\0\x42\
-\x32\0\0\xef\x6b\0\0\x16\xb8\x0c\0\xb8\x01\0\0\x42\x32\0\0\x31\x34\0\0\x3d\x08\
-\x02\0\xd8\x01\0\0\x42\x32\0\0\x1d\x34\0\0\x11\xf4\x01\0\xe8\x01\0\0\x42\x32\0\
-\0\x31\x34\0\0\x05\x08\x02\0\0\x02\0\0\x42\x32\0\0\x20\x6c\0\0\x1a\xcc\x0c\0\
-\x48\x02\0\0\x42\x32\0\0\x3f\x6c\0\0\x2c\xc8\x0c\0\xb0\x02\0\0\x42\x32\0\0\xef\
-\x6b\0\0\x16\xb8\x0c\0\xc8\x02\0\0\x42\x32\0\0\x6c\x6c\0\0\x09\xdc\x0c\0\xe0\
-\x02\0\0\x42\x32\0\0\xba\x6c\0\0\x1d\xe8\x0c\0\xe8\x02\0\0\x42\x32\0\0\xba\x6c\
-\0\0\x0c\xe8\x0c\0\xf0\x02\0\0\x42\x32\0\0\xe1\x6c\0\0\x23\xf0\x0c\0\xf8\x02\0\
-\0\x42\x32\0\0\x0b\x6d\0\0\x28\xf4\x0c\0\x08\x03\0\0\x42\x32\0\0\xe1\x6c\0\0\
-\x23\xf0\x0c\0\x10\x03\0\0\x42\x32\0\0\x59\x35\0\0\x08\x60\x04\0\x20\x03\0\0\
-\x42\x32\0\0\0\0\0\0\0\0\0\0\x28\x03\0\0\x42\x32\0\0\x6b\x35\0\0\x21\x68\x04\0\
-\x40\x03\0\0\x42\x32\0\0\xb4\x35\0\0\x08\x6c\x04\0\x48\x03\0\0\x42\x32\0\0\xc1\
-\x35\0\0\x0d\x30\x04\0\x58\x03\0\0\x42\x32\0\0\xd5\x35\0\0\x16\x70\x04\0\x60\
-\x03\0\0\x42\x32\0\0\xc1\x35\0\0\x08\x30\x04\0\x78\x03\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\x80\x03\0\0\x42\x32\0\0\xf5\x35\0\0\x0d\x24\x04\0\x90\x03\0\0\x42\x32\
-\0\0\0\0\0\0\0\0\0\0\xa8\x03\0\0\x42\x32\0\0\x09\x36\0\0\x05\x48\x04\0\xc0\x03\
-\0\0\x42\x32\0\0\xc3\x36\0\0\x19\x7c\x04\0\xe0\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\
-\0\0\xe8\x03\0\0\x42\x32\0\0\xe1\x36\0\0\x09\x80\x04\0\0\x04\0\0\x42\x32\0\0\0\
-\0\0\0\0\0\0\0\x18\x04\0\0\x42\x32\0\0\x38\x6d\0\0\x1a\xfc\x0c\0\x30\x04\0\0\
-\x42\x32\0\0\x59\x6d\0\0\x09\0\x0d\0\x48\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\
-\x58\x04\0\0\x42\x32\0\0\xa1\x6d\0\0\x05\x94\x0c\0\x79\x72\0\0\x33\0\0\0\0\0\0\
-\0\x42\x32\0\0\xee\x6a\0\0\x36\x20\x0d\0\x30\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\
-\x38\0\0\0\x42\x32\0\0\x3b\x6b\0\0\x0f\x24\x0d\0\x48\0\0\0\x42\x32\0\0\x3b\x6b\
-\0\0\x0f\x24\x0d\0\x50\0\0\0\x42\x32\0\0\x3b\x6b\0\0\x09\x24\x0d\0\x78\0\0\0\
-\x42\x32\0\0\0\0\0\0\0\0\0\0\x80\0\0\0\x42\x32\0\0\x63\x6b\0\0\x10\x28\x0d\0\
-\x90\0\0\0\x42\x32\0\0\xdf\x32\0\0\x08\x2c\x0d\0\x98\0\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\xb0\0\0\0\x42\x32\0\0\x8c\x6b\0\0\x24\x38\x0d\0\xd0\0\0\0\x42\x32\0\0\
-\xdf\x6b\0\0\x08\x3c\x0d\0\xd8\0\0\0\x42\x32\0\0\xef\x6b\0\0\x16\x40\x0d\0\x10\
-\x01\0\0\x42\x32\0\0\xab\x33\0\0\x10\xf8\x01\0\x40\x01\0\0\x42\x32\0\0\xef\x6b\
-\0\0\x16\x40\x0d\0\x48\x01\0\0\x42\x32\0\0\xd1\x33\0\0\x11\xfc\x01\0\x58\x01\0\
-\0\x42\x32\0\0\xf8\x33\0\0\x24\xf0\x01\0\x60\x01\0\0\x42\x32\0\0\xd1\x33\0\0\
-\x11\xfc\x01\0\x68\x01\0\0\x42\x32\0\0\xf8\x33\0\0\x24\xf0\x01\0\x88\x01\0\0\
-\x42\x32\0\0\x1d\x34\0\0\x11\xf4\x01\0\xb0\x01\0\0\x42\x32\0\0\xef\x6b\0\0\x16\
-\x40\x0d\0\xb8\x01\0\0\x42\x32\0\0\x31\x34\0\0\x3d\x08\x02\0\xd8\x01\0\0\x42\
-\x32\0\0\x1d\x34\0\0\x11\xf4\x01\0\xe8\x01\0\0\x42\x32\0\0\x31\x34\0\0\x05\x08\
-\x02\0\0\x02\0\0\x42\x32\0\0\x20\x6c\0\0\x1a\x54\x0d\0\x40\x02\0\0\x42\x32\0\0\
-\x3f\x6c\0\0\x2c\x50\x0d\0\xa8\x02\0\0\x42\x32\0\0\xef\x6b\0\0\x16\x40\x0d\0\
-\xc0\x02\0\0\x42\x32\0\0\x6c\x6c\0\0\x09\x64\x0d\0\xd8\x02\0\0\x42\x32\0\0\xba\
-\x6c\0\0\x1d\x70\x0d\0\xe0\x02\0\0\x42\x32\0\0\xba\x6c\0\0\x0c\x70\x0d\0\xe8\
-\x02\0\0\x42\x32\0\0\xe1\x6c\0\0\x23\x78\x0d\0\xf0\x02\0\0\x42\x32\0\0\x0b\x6d\
-\0\0\x28\x7c\x0d\0\0\x03\0\0\x42\x32\0\0\xe1\x6c\0\0\x23\x78\x0d\0\x08\x03\0\0\
-\x42\x32\0\0\x59\x35\0\0\x08\x60\x04\0\x18\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\
-\x20\x03\0\0\x42\x32\0\0\x6b\x35\0\0\x21\x68\x04\0\x38\x03\0\0\x42\x32\0\0\xb4\
-\x35\0\0\x08\x6c\x04\0\x40\x03\0\0\x42\x32\0\0\xc1\x35\0\0\x0d\x30\x04\0\x50\
-\x03\0\0\x42\x32\0\0\xd5\x35\0\0\x16\x70\x04\0\x58\x03\0\0\x42\x32\0\0\xc1\x35\
-\0\0\x08\x30\x04\0\x70\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x78\x03\0\0\x42\x32\
-\0\0\xf5\x35\0\0\x0d\x24\x04\0\x88\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xa0\x03\
-\0\0\x42\x32\0\0\x09\x36\0\0\x05\x48\x04\0\xb8\x03\0\0\x42\x32\0\0\xc3\x36\0\0\
-\x19\x7c\x04\0\xd8\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xe0\x03\0\0\x42\x32\0\0\
-\xe1\x36\0\0\x09\x80\x04\0\xf8\x03\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x10\x04\0\0\
-\x42\x32\0\0\xc0\x6d\0\0\x1a\x84\x0d\0\x28\x04\0\0\x42\x32\0\0\x59\x6d\0\0\x09\
-\x88\x0d\0\x40\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x50\x04\0\0\x42\x32\0\0\xe2\
-\x6d\0\0\x05\x1c\x0d\0\x9a\x72\0\0\x19\0\0\0\0\0\0\0\x42\x32\0\0\x16\x33\0\0\
-\x12\xa8\x0d\0\x08\0\0\0\x42\x32\0\0\x16\x33\0\0\x09\xa8\x0d\0\x18\0\0\0\x42\
-\x32\0\0\0\0\0\0\0\0\0\0\x20\0\0\0\x42\x32\0\0\x1d\x49\0\0\x11\xb4\x0d\0\x40\0\
-\0\0\x42\x32\0\0\x61\x49\0\0\x09\xb8\x0d\0\x48\0\0\0\x42\x32\0\0\x01\x6e\0\0\
-\x12\xbc\x0d\0\x68\0\0\0\x42\x32\0\0\x1b\x6e\0\0\x29\xc0\x0b\0\x80\0\0\0\x42\
-\x32\0\0\x77\x6e\0\0\x08\xc4\x0b\0\x90\0\0\0\x42\x32\0\0\x8a\x6e\0\0\x1c\xcc\
-\x0b\0\0\x01\0\0\x42\x32\0\0\xb4\x6e\0\0\x05\xd0\x0b\0\x30\x01\0\0\x42\x32\0\0\
-\0\x6f\0\0\x29\xd8\x0b\0\x38\x01\0\0\x42\x32\0\0\0\x6f\0\0\x1c\xd8\x0b\0\x40\
-\x01\0\0\x42\x32\0\0\x2a\x6f\0\0\x13\xdc\x0b\0\x48\x01\0\0\x42\x32\0\0\0\x6f\0\
-\0\x29\xd8\x0b\0\x50\x01\0\0\x42\x32\0\0\0\x6f\0\0\x1c\xd8\x0b\0\x78\x01\0\0\
-\x42\x32\0\0\x8a\x6e\0\0\x1c\xcc\x0b\0\x80\x01\0\0\x42\x32\0\0\x44\x6f\0\0\x05\
-\xe8\x0b\0\xb0\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xb8\x01\0\0\x42\x32\0\0\x94\
-\x6f\0\0\x15\xc0\x0d\0\xd8\x01\0\0\x42\x32\0\0\xdc\x6f\0\0\x0c\xc4\x0d\0\xe0\
-\x01\0\0\x42\x32\0\0\xcc\x37\0\0\x0f\xd0\x0d\0\xe8\x01\0\0\x42\x32\0\0\x04\x70\
-\0\0\x22\xd4\x0d\0\xf8\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x42\x32\0\
-\0\xb1\x5d\0\0\x05\xd8\x0d\0\x28\x02\0\0\x42\x32\0\0\x2c\x70\0\0\x05\xa4\x0d\0\
-\xb7\x72\0\0\x19\0\0\0\0\0\0\0\x42\x32\0\0\x16\x33\0\0\x12\xf0\x0d\0\x08\0\0\0\
-\x42\x32\0\0\x16\x33\0\0\x09\xf0\x0d\0\x18\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\
-\x20\0\0\0\x42\x32\0\0\x1d\x49\0\0\x11\xfc\x0d\0\x40\0\0\0\x42\x32\0\0\x61\x49\
-\0\0\x09\0\x0e\0\x48\0\0\0\x42\x32\0\0\x01\x6e\0\0\x12\x04\x0e\0\x68\0\0\0\x42\
-\x32\0\0\x1b\x6e\0\0\x29\xc0\x0b\0\x80\0\0\0\x42\x32\0\0\x77\x6e\0\0\x08\xc4\
-\x0b\0\x90\0\0\0\x42\x32\0\0\x8a\x6e\0\0\x1c\xcc\x0b\0\0\x01\0\0\x42\x32\0\0\
-\xb4\x6e\0\0\x05\xd0\x0b\0\x30\x01\0\0\x42\x32\0\0\0\x6f\0\0\x29\xd8\x0b\0\x38\
-\x01\0\0\x42\x32\0\0\0\x6f\0\0\x1c\xd8\x0b\0\x40\x01\0\0\x42\x32\0\0\x2a\x6f\0\
-\0\x13\xdc\x0b\0\x48\x01\0\0\x42\x32\0\0\0\x6f\0\0\x29\xd8\x0b\0\x50\x01\0\0\
-\x42\x32\0\0\0\x6f\0\0\x1c\xd8\x0b\0\x78\x01\0\0\x42\x32\0\0\x8a\x6e\0\0\x1c\
-\xcc\x0b\0\x80\x01\0\0\x42\x32\0\0\x44\x6f\0\0\x05\xe8\x0b\0\xa0\x01\0\0\x42\
-\x32\0\0\xcc\x37\0\0\x0f\x14\x0e\0\xa8\x01\0\0\x42\x32\0\0\x53\x70\0\0\x32\x18\
-\x0e\0\xb0\x01\0\0\x42\x32\0\0\x53\x70\0\0\x25\x18\x0e\0\xb8\x01\0\0\x42\x32\0\
-\0\x53\x70\0\0\x1e\x18\x0e\0\xd8\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xe0\x01\0\
-\0\x42\x32\0\0\xb1\x5d\0\0\x05\x1c\x0e\0\xf8\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\
-\0\x08\x02\0\0\x42\x32\0\0\x97\x70\0\0\x05\xec\x0d\0\xd3\x72\0\0\x19\0\0\0\0\0\
-\0\0\x42\x32\0\0\x16\x33\0\0\x12\x38\x0e\0\x08\0\0\0\x42\x32\0\0\x16\x33\0\0\
-\x09\x38\x0e\0\x18\0\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x20\0\0\0\x42\x32\0\0\x1d\
-\x49\0\0\x11\x44\x0e\0\x40\0\0\0\x42\x32\0\0\x61\x49\0\0\x09\x48\x0e\0\x48\0\0\
-\0\x42\x32\0\0\x01\x6e\0\0\x12\x4c\x0e\0\x68\0\0\0\x42\x32\0\0\x1b\x6e\0\0\x29\
-\xc0\x0b\0\x80\0\0\0\x42\x32\0\0\x77\x6e\0\0\x08\xc4\x0b\0\x90\0\0\0\x42\x32\0\
-\0\x8a\x6e\0\0\x1c\xcc\x0b\0\0\x01\0\0\x42\x32\0\0\xb4\x6e\0\0\x05\xd0\x0b\0\
-\x30\x01\0\0\x42\x32\0\0\0\x6f\0\0\x29\xd8\x0b\0\x38\x01\0\0\x42\x32\0\0\0\x6f\
-\0\0\x1c\xd8\x0b\0\x40\x01\0\0\x42\x32\0\0\x2a\x6f\0\0\x13\xdc\x0b\0\x48\x01\0\
-\0\x42\x32\0\0\0\x6f\0\0\x29\xd8\x0b\0\x50\x01\0\0\x42\x32\0\0\0\x6f\0\0\x1c\
-\xd8\x0b\0\x78\x01\0\0\x42\x32\0\0\x8a\x6e\0\0\x1c\xcc\x0b\0\x80\x01\0\0\x42\
-\x32\0\0\x44\x6f\0\0\x05\xe8\x0b\0\xb0\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xb8\
-\x01\0\0\x42\x32\0\0\x94\x6f\0\0\x15\x50\x0e\0\xd8\x01\0\0\x42\x32\0\0\xdc\x6f\
-\0\0\x0c\x54\x0e\0\xe0\x01\0\0\x42\x32\0\0\xcc\x37\0\0\x0f\x60\x0e\0\xe8\x01\0\
-\0\x42\x32\0\0\xbd\x70\0\0\x1e\x64\x0e\0\xf8\x01\0\0\x42\x32\0\0\0\0\0\0\0\0\0\
-\0\0\x02\0\0\x42\x32\0\0\xb1\x5d\0\0\x05\x68\x0e\0\x28\x02\0\0\x42\x32\0\0\xe1\
-\x70\0\0\x05\x34\x0e\0\xf4\x72\0\0\x19\0\0\0\0\0\0\0\x42\x32\0\0\x16\x33\0\0\
-\x12\x80\x0e\0\x08\0\0\0\x42\x32\0\0\x16\x33\0\0\x09\x80\x0e\0\x18\0\0\0\x42\
-\x32\0\0\0\0\0\0\0\0\0\0\x20\0\0\0\x42\x32\0\0\x1d\x49\0\0\x11\x8c\x0e\0\x40\0\
-\0\0\x42\x32\0\0\x61\x49\0\0\x09\x90\x0e\0\x48\0\0\0\x42\x32\0\0\x01\x6e\0\0\
-\x12\x94\x0e\0\x68\0\0\0\x42\x32\0\0\x1b\x6e\0\0\x29\xc0\x0b\0\x80\0\0\0\x42\
-\x32\0\0\x77\x6e\0\0\x08\xc4\x0b\0\x90\0\0\0\x42\x32\0\0\x8a\x6e\0\0\x1c\xcc\
-\x0b\0\0\x01\0\0\x42\x32\0\0\xb4\x6e\0\0\x05\xd0\x0b\0\x30\x01\0\0\x42\x32\0\0\
-\0\x6f\0\0\x29\xd8\x0b\0\x38\x01\0\0\x42\x32\0\0\0\x6f\0\0\x1c\xd8\x0b\0\x40\
-\x01\0\0\x42\x32\0\0\x2a\x6f\0\0\x13\xdc\x0b\0\x48\x01\0\0\x42\x32\0\0\0\x6f\0\
-\0\x29\xd8\x0b\0\x50\x01\0\0\x42\x32\0\0\0\x6f\0\0\x1c\xd8\x0b\0\x78\x01\0\0\
-\x42\x32\0\0\x8a\x6e\0\0\x1c\xcc\x0b\0\x80\x01\0\0\x42\x32\0\0\x44\x6f\0\0\x05\
-\xe8\x0b\0\xa0\x01\0\0\x42\x32\0\0\xcc\x37\0\0\x0f\xa4\x0e\0\xa8\x01\0\0\x42\
-\x32\0\0\x04\x71\0\0\x2e\xa8\x0e\0\xb0\x01\0\0\x42\x32\0\0\x04\x71\0\0\x21\xa8\
-\x0e\0\xb8\x01\0\0\x42\x32\0\0\x04\x71\0\0\x1a\xa8\x0e\0\xd8\x01\0\0\x42\x32\0\
-\0\0\0\0\0\0\0\0\0\xe0\x01\0\0\x42\x32\0\0\xb1\x5d\0\0\x05\xac\x0e\0\xf8\x01\0\
-\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x08\x02\0\0\x42\x32\0\0\x40\x71\0\0\x05\x7c\x0e\
-\0\xa6\x1d\0\0\xa8\0\0\0\0\0\0\0\x42\x32\0\0\x1d\x37\0\0\x09\xac\x12\0\x18\0\0\
-\0\x42\x32\0\0\x1d\x37\0\0\x08\xac\x12\0\x20\0\0\0\x42\x32\0\0\x35\x37\0\0\x17\
-\xb4\x12\0\x48\0\0\0\x42\x32\0\0\x74\x37\0\0\x0c\xb8\x12\0\x50\0\0\0\x42\x32\0\
-\0\x8e\x37\0\0\x13\xc8\x12\0\x58\0\0\0\x42\x32\0\0\x8e\x37\0\0\x11\xc8\x12\0\
-\x70\0\0\0\x42\x32\0\0\xae\x37\0\0\x17\xcc\x12\0\x98\0\0\0\x42\x32\0\0\xcc\x37\
-\0\0\x0f\xb4\x0f\0\xb8\0\0\0\x42\x32\0\0\xee\x37\0\0\x0d\xbc\x12\0\xe8\0\0\0\
-\x42\x32\0\0\x1e\x38\0\0\x01\xe4\x12\0\xf0\0\0\0\x42\x32\0\0\x20\x38\0\0\x44\
-\xf4\x0e\0\xf8\0\0\0\x42\x32\0\0\x20\x38\0\0\x4e\xf4\x0e\0\0\x01\0\0\x42\x32\0\
-\0\x20\x38\0\0\x53\xf4\x0e\0\x08\x01\0\0\x42\x32\0\0\x20\x38\0\0\x33\xf4\x0e\0\
-\x20\x01\0\0\x42\x32\0\0\x20\x38\0\0\x37\xf4\x0e\0\x28\x01\0\0\x42\x32\0\0\x20\
-\x38\0\0\x1f\xf4\x0e\0\x30\x01\0\0\x42\x32\0\0\x20\x38\0\0\x1d\xf4\x0e\0\x38\
-\x01\0\0\x42\x32\0\0\x81\x38\0\0\x36\xf8\x0e\0\x50\x01\0\0\x42\x32\0\0\x81\x38\
-\0\0\x39\xf8\x0e\0\x58\x01\0\0\x42\x32\0\0\x81\x38\0\0\x46\xf8\x0e\0\x60\x01\0\
-\0\x42\x32\0\0\x81\x38\0\0\x53\xf8\x0e\0\x68\x01\0\0\x42\x32\0\0\x81\x38\0\0\
-\x56\xf8\x0e\0\x70\x01\0\0\x42\x32\0\0\x81\x38\0\0\x21\xf8\x0e\0\x78\x01\0\0\
-\x42\x32\0\0\x81\x38\0\0\x1f\xf8\x0e\0\x80\x01\0\0\x42\x32\0\0\xe4\x38\0\0\x32\
-\xfc\x0e\0\x98\x01\0\0\x42\x32\0\0\xe4\x38\0\0\x35\xfc\x0e\0\xa0\x01\0\0\x42\
-\x32\0\0\xe4\x38\0\0\x42\xfc\x0e\0\xa8\x01\0\0\x42\x32\0\0\xe4\x38\0\0\x4c\xfc\
-\x0e\0\xb0\x01\0\0\x42\x32\0\0\xe4\x38\0\0\x4f\xfc\x0e\0\xb8\x01\0\0\x42\x32\0\
-\0\xe4\x38\0\0\x1f\xfc\x0e\0\xc0\x01\0\0\x42\x32\0\0\x40\x39\0\0\x29\x04\x0f\0\
-\xc8\x01\0\0\x42\x32\0\0\x40\x39\0\0\x38\x04\x0f\0\xe0\x01\0\0\x42\x32\0\0\x40\
-\x39\0\0\x3b\x04\x0f\0\xe8\x01\0\0\x42\x32\0\0\xe4\x38\0\0\x1d\xfc\x0e\0\xf0\
-\x01\0\0\x42\x32\0\0\x40\x39\0\0\x48\x04\x0f\0\xf8\x01\0\0\x42\x32\0\0\x40\x39\
-\0\0\x55\x04\x0f\0\0\x02\0\0\x42\x32\0\0\x40\x39\0\0\x59\x04\x0f\0\x08\x02\0\0\
-\x42\x32\0\0\x40\x39\0\0\x22\x04\x0f\0\x10\x02\0\0\x42\x32\0\0\x40\x39\0\0\x20\
-\x04\x0f\0\x18\x02\0\0\x42\x32\0\0\xa7\x39\0\0\x31\x08\x0f\0\x30\x02\0\0\x42\
-\x32\0\0\xa7\x39\0\0\x34\x08\x0f\0\x38\x02\0\0\x42\x32\0\0\xa7\x39\0\0\x41\x08\
-\x0f\0\x40\x02\0\0\x42\x32\0\0\xa7\x39\0\0\x4a\x08\x0f\0\x48\x02\0\0\x42\x32\0\
-\0\xa7\x39\0\0\x4e\x08\x0f\0\x50\x02\0\0\x42\x32\0\0\xa7\x39\0\0\x1e\x08\x0f\0\
-\x58\x02\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x70\x02\0\0\x42\x32\0\0\x03\x3a\0\0\
-\x05\x10\x0f\0\xa8\x02\0\0\x42\x32\0\0\x4a\x3a\0\0\x19\x2c\x0f\0\xb0\x02\0\0\
-\x42\x32\0\0\x67\x3a\0\0\x18\x20\x0f\0\xc8\x02\0\0\x42\x32\0\0\x83\x3a\0\0\x05\
-\x34\x0f\0\xf8\x02\0\0\x42\x32\0\0\xc7\x3a\0\0\x14\x44\x0f\0\x20\x03\0\0\x42\
-\x32\0\0\x25\x3b\0\0\x09\x48\x0f\0\x28\x03\0\0\x42\x32\0\0\x3e\x3b\0\0\x09\x50\
-\x0f\0\x50\x03\0\0\x42\x32\0\0\x72\x3b\0\0\x09\x60\x0f\0\x80\x03\0\0\x42\x32\0\
-\0\xb3\x3b\0\0\x27\x64\x0f\0\x88\x03\0\0\x42\x32\0\0\xb3\x3b\0\0\x1e\x64\x0f\0\
-\x90\x03\0\0\x42\x32\0\0\xe1\x3b\0\0\x2d\x68\x0f\0\x98\x03\0\0\x42\x32\0\0\xe1\
-\x3b\0\0\x24\x68\x0f\0\xa0\x03\0\0\x42\x32\0\0\x1b\x3c\0\0\x2f\x6c\x0f\0\xa8\
-\x03\0\0\x42\x32\0\0\x1b\x3c\0\0\x26\x6c\x0f\0\xb0\x03\0\0\x42\x32\0\0\x59\x3c\
-\0\0\x2d\x70\x0f\0\xb8\x03\0\0\x42\x32\0\0\x59\x3c\0\0\x24\x70\x0f\0\xc0\x03\0\
-\0\x42\x32\0\0\x93\x3c\0\0\x09\x74\x0f\0\xe8\x03\0\0\x42\x32\0\0\xc0\x3c\0\0\
-\x3b\xbc\x0f\0\x08\x04\0\0\x42\x32\0\0\xc0\x3c\0\0\x21\xbc\x0f\0\x20\x04\0\0\
-\x42\x32\0\0\xc0\x3c\0\0\x2d\xbc\x0f\0\x38\x04\0\0\x42\x32\0\0\xc0\x3c\0\0\x2b\
-\xbc\x0f\0\x50\x04\0\0\x42\x32\0\0\xc0\x3c\0\0\x05\xbc\x0f\0\x58\x04\0\0\x42\
-\x32\0\0\xff\x3c\0\0\x10\xc0\x0f\0\x68\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x70\
-\x04\0\0\x42\x32\0\0\x18\x3d\0\0\x10\xc4\x0f\0\x90\x04\0\0\x42\x32\0\0\x5a\x3d\
-\0\0\x0c\xc8\x0f\0\xa0\x04\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xa8\x04\0\0\x42\x32\
-\0\0\x74\x3d\0\0\x15\xd4\x0f\0\xc8\x04\0\0\x42\x32\0\0\xbd\x3d\0\0\x10\xd8\x0f\
-\0\xd0\x04\0\0\x42\x32\0\0\xd5\x3d\0\0\x35\xdc\x0f\0\xe0\x04\0\0\x42\x32\0\0\
-\xd5\x3d\0\0\x28\xdc\x0f\0\xe8\x04\0\0\x42\x32\0\0\x0b\x3e\0\0\x1f\xe0\x0f\0\
-\xf0\x04\0\0\x42\x32\0\0\xd5\x3d\0\0\x35\xdc\x0f\0\xf8\x04\0\0\x42\x32\0\0\xd5\
-\x3d\0\0\x28\xdc\x0f\0\x20\x05\0\0\x42\x32\0\0\xd5\x3d\0\0\x35\xdc\x0f\0\x38\
-\x05\0\0\x42\x32\0\0\x31\x3e\0\0\x11\xec\x0f\0\x60\x05\0\0\x42\x32\0\0\x8a\x3e\
-\0\0\x19\xf0\x0f\0\x90\x05\0\0\x42\x32\0\0\xd7\x3e\0\0\x23\xfc\x0f\0\xa0\x05\0\
-\0\x42\x32\0\0\0\x3f\0\0\x31\0\x10\0\xb0\x05\0\0\x42\x32\0\0\x44\x3f\0\0\x13\
-\xcc\x0e\0\xb8\x05\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xc8\x05\0\0\x42\x32\0\0\x60\
-\x3f\0\0\x0f\xd4\x0e\0\xd0\x05\0\0\x42\x32\0\0\x60\x3f\0\0\x1c\xd4\x0e\0\xf0\
-\x05\0\0\x42\x32\0\0\x60\x3f\0\0\x21\xd4\x0e\0\x08\x06\0\0\x42\x32\0\0\x60\x3f\
-\0\0\x56\xd4\x0e\0\x10\x06\0\0\x42\x32\0\0\x60\x3f\0\0\x08\xd4\x0e\0\x18\x06\0\
-\0\x42\x32\0\0\xbc\x3f\0\0\x25\xd8\x0e\0\x20\x06\0\0\x42\x32\0\0\xbc\x3f\0\0\
-\x2f\xd8\x0e\0\x28\x06\0\0\x42\x32\0\0\xbc\x3f\0\0\x35\xd8\x0e\0\x30\x06\0\0\
-\x42\x32\0\0\xbc\x3f\0\0\x1d\xd8\x0e\0\x38\x06\0\0\x42\x32\0\0\xff\x3f\0\0\x27\
-\xdc\x0e\0\x40\x06\0\0\x42\x32\0\0\xff\x3f\0\0\x34\xdc\x0e\0\x48\x06\0\0\x42\
-\x32\0\0\xff\x3f\0\0\x3a\xdc\x0e\0\x50\x06\0\0\x42\x32\0\0\xff\x3f\0\0\x1f\xdc\
-\x0e\0\x58\x06\0\0\x42\x32\0\0\x47\x40\0\0\x25\xe0\x0e\0\x60\x06\0\0\x42\x32\0\
-\0\x47\x40\0\0\x30\xe0\x0e\0\x68\x06\0\0\x42\x32\0\0\x47\x40\0\0\x35\xe0\x0e\0\
-\x70\x06\0\0\x42\x32\0\0\x47\x40\0\0\x1d\xe0\x0e\0\x78\x06\0\0\x42\x32\0\0\x8a\
-\x40\0\0\x28\xe4\x0e\0\x80\x06\0\0\x42\x32\0\0\x8a\x40\0\0\x35\xe4\x0e\0\x88\
-\x06\0\0\x42\x32\0\0\x8a\x40\0\0\x3a\xe4\x0e\0\x90\x06\0\0\x42\x32\0\0\x8a\x40\
-\0\0\x20\xe4\x0e\0\x98\x06\0\0\x42\x32\0\0\xd2\x40\0\0\x24\xe8\x0e\0\xa0\x06\0\
-\0\x42\x32\0\0\xd2\x40\0\0\x2d\xe8\x0e\0\xa8\x06\0\0\x42\x32\0\0\xd2\x40\0\0\
-\x32\xe8\x0e\0\xb8\x06\0\0\x42\x32\0\0\x12\x41\0\0\x0d\x24\x10\0\xe8\x06\0\0\
-\x42\x32\0\0\x51\x41\0\0\x09\xdc\x12\0\x10\x07\0\0\x42\x32\0\0\x77\x41\0\0\0\
-\x48\x13\0\x18\x07\0\0\x42\x32\0\0\xb6\x41\0\0\x26\x54\x12\0\x48\x07\0\0\x42\
-\x32\0\0\x24\x42\0\0\x08\x58\x12\0\x50\x07\0\0\x42\x32\0\0\x32\x42\0\0\x09\x60\
-\x12\0\x78\x07\0\0\x42\x32\0\0\x6b\x42\0\0\x05\x6c\x12\0\xb8\x07\0\0\x42\x32\0\
-\0\xa0\x42\0\0\x0d\x74\x12\0\xc8\x07\0\0\x42\x32\0\0\x6b\x42\0\0\x05\x6c\x12\0\
-\xd0\x07\0\0\x42\x32\0\0\xb7\x42\0\0\x15\x78\x12\0\xe8\x07\0\0\x42\x32\0\0\xf1\
-\x42\0\0\x0c\x7c\x12\0\xf0\x07\0\0\x42\x32\0\0\x03\x43\0\0\x21\x88\x12\0\xf8\
-\x07\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x08\x08\0\0\x42\x32\0\0\xa0\x42\0\0\x0d\
-\x74\x12\0\x18\x08\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x20\x08\0\0\x42\x32\0\0\xb7\
-\x42\0\0\x15\x78\x12\0\x48\x08\0\0\x42\x32\0\0\xf1\x42\0\0\x0c\x7c\x12\0\x50\
-\x08\0\0\x42\x32\0\0\x03\x43\0\0\x21\x88\x12\0\x58\x08\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\x68\x08\0\0\x42\x32\0\0\xa0\x42\0\0\x0d\x74\x12\0\x78\x08\0\0\x42\x32\
-\0\0\0\0\0\0\0\0\0\0\x80\x08\0\0\x42\x32\0\0\xb7\x42\0\0\x15\x78\x12\0\x98\x08\
-\0\0\x42\x32\0\0\xf1\x42\0\0\x0c\x7c\x12\0\xa0\x08\0\0\x42\x32\0\0\x03\x43\0\0\
-\x21\x88\x12\0\xa8\x08\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xb8\x08\0\0\x42\x32\0\0\
-\xa0\x42\0\0\x0d\x74\x12\0\xc8\x08\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xd0\x08\0\0\
-\x42\x32\0\0\xb7\x42\0\0\x15\x78\x12\0\xf8\x08\0\0\x42\x32\0\0\xf1\x42\0\0\x0c\
-\x7c\x12\0\0\x09\0\0\x42\x32\0\0\x03\x43\0\0\x21\x88\x12\0\x08\x09\0\0\x42\x32\
-\0\0\0\0\0\0\0\0\0\0\x18\x09\0\0\x42\x32\0\0\xa0\x42\0\0\x0d\x74\x12\0\x28\x09\
-\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x30\x09\0\0\x42\x32\0\0\xb7\x42\0\0\x15\x78\
-\x12\0\x48\x09\0\0\x42\x32\0\0\xf1\x42\0\0\x0c\x7c\x12\0\x50\x09\0\0\x42\x32\0\
-\0\x03\x43\0\0\x21\x88\x12\0\x58\x09\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x68\x09\0\
-\0\x42\x32\0\0\xa0\x42\0\0\x0d\x74\x12\0\x78\x09\0\0\x42\x32\0\0\0\0\0\0\0\0\0\
-\0\x80\x09\0\0\x42\x32\0\0\xb7\x42\0\0\x15\x78\x12\0\xa8\x09\0\0\x42\x32\0\0\
-\xf1\x42\0\0\x0c\x7c\x12\0\xb0\x09\0\0\x42\x32\0\0\x03\x43\0\0\x21\x88\x12\0\
-\xb8\x09\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xc8\x09\0\0\x42\x32\0\0\xa0\x42\0\0\
-\x0d\x74\x12\0\xd8\x09\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\xe0\x09\0\0\x42\x32\0\0\
-\xb7\x42\0\0\x15\x78\x12\0\xf8\x09\0\0\x42\x32\0\0\xf1\x42\0\0\x0c\x7c\x12\0\0\
-\x0a\0\0\x42\x32\0\0\x03\x43\0\0\x21\x88\x12\0\x08\x0a\0\0\x42\x32\0\0\0\0\0\0\
-\0\0\0\0\x18\x0a\0\0\x42\x32\0\0\xa0\x42\0\0\x0d\x74\x12\0\x28\x0a\0\0\x42\x32\
-\0\0\0\0\0\0\0\0\0\0\x30\x0a\0\0\x42\x32\0\0\xb7\x42\0\0\x15\x78\x12\0\x50\x0a\
-\0\0\x42\x32\0\0\xf1\x42\0\0\x0c\x7c\x12\0\x58\x0a\0\0\x42\x32\0\0\x03\x43\0\0\
-\x21\x88\x12\0\x60\x0a\0\0\x42\x32\0\0\0\0\0\0\0\0\0\0\x68\x0a\0\0\x42\x32\0\0\
-\x2a\x43\0\0\x05\x90\x12\0\x80\x0a\0\0\x42\x32\0\0\x4a\x43\0\0\x05\x50\x13\0\
-\x10\0\0\0\xab\x71\0\0\x04\0\0\0\0\0\0\0\x4f\0\0\0\x62\x71\0\0\0\0\0\0\x58\0\0\
-\0\x4f\0\0\0\x67\x71\0\0\0\0\0\0\xf0\0\0\0\x4f\0\0\0\x62\x71\0\0\0\0\0\0\x68\
-\x01\0\0\x4f\0\0\0\x6c\x71\0\0\0\0\0\0\xbf\x71\0\0\x04\0\0\0\0\0\0\0\x4f\0\0\0\
-\x62\x71\0\0\0\0\0\0\x58\0\0\0\x4f\0\0\0\x67\x71\0\0\0\0\0\0\xf0\0\0\0\x4f\0\0\
-\0\x62\x71\0\0\0\0\0\0\x68\x01\0\0\x4f\0\0\0\x6c\x71\0\0\0\0\0\0\xd7\x71\0\0\
-\x02\0\0\0\x08\0\0\0\xa0\x01\0\0\x72\x71\0\0\0\0\0\0\xf8\0\0\0\xa0\x01\0\0\x76\
-\x71\0\0\0\0\0\0\x1f\x72\0\0\x05\0\0\0\x08\0\0\0\xa7\x01\0\0\x7a\x71\0\0\0\0\0\
-\0\x18\0\0\0\xa7\x01\0\0\x7e\x71\0\0\0\0\0\0\xd0\x02\0\0\xa7\x01\0\0\x82\x71\0\
-\0\0\0\0\0\x50\x11\0\0\xa7\x01\0\0\x86\x71\0\0\0\0\0\0\xb8\x14\0\0\xa7\x01\0\0\
-\x7a\x71\0\0\0\0\0\0\x57\x72\0\0\x05\0\0\0\x10\0\0\0\x4f\0\0\0\x62\x71\0\0\0\0\
-\0\0\x58\0\0\0\x4f\0\0\0\x67\x71\0\0\0\0\0\0\xe8\0\0\0\x4f\0\0\0\x62\x71\0\0\0\
-\0\0\0\x20\x01\0\0\x4f\0\0\0\x67\x71\0\0\0\0\0\0\x70\x01\0\0\x4f\0\0\0\x6c\x71\
-\0\0\0\0\0\0\x79\x72\0\0\x05\0\0\0\x10\0\0\0\x4f\0\0\0\x62\x71\0\0\0\0\0\0\x58\
-\0\0\0\x4f\0\0\0\x67\x71\0\0\0\0\0\0\xe8\0\0\0\x4f\0\0\0\x62\x71\0\0\0\0\0\0\
-\x20\x01\0\0\x4f\0\0\0\x67\x71\0\0\0\0\0\0\x70\x01\0\0\x4f\0\0\0\x6c\x71\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x03\
-\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\xe8\x0a\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x09\0\0\0\x02\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x28\x0b\0\0\0\0\0\0\x58\x11\0\0\0\0\0\0\x01\0\0\0\0\0\
-\0\0\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x11\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x80\x1c\0\0\0\0\0\0\x38\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\xb8\x20\0\0\0\0\0\0\x98\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x2b\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x50\x25\
-\0\0\0\0\0\0\x98\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x43\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x29\0\0\0\0\0\0\
-\xc0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x67\0\0\
-\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa8\x2b\0\0\0\0\0\0\xe8\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8b\0\0\0\x01\0\0\0\
-\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x2d\0\0\0\0\0\0\x28\x18\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa9\0\0\0\x01\0\0\0\x06\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xb8\x45\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc3\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\xd0\x47\0\0\0\0\0\0\x68\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xe5\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x38\x4c\0\0\0\0\0\0\x60\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x06\x01\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\x50\0\
-\0\0\0\0\0\x38\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x23\x01\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x52\0\0\0\0\0\0\
-\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3f\x01\
-\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x54\0\0\0\0\0\0\x38\x02\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x60\x01\0\0\x01\0\
-\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x20\x57\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x01\0\0\x01\0\0\0\x06\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\x59\0\0\0\0\0\0\x90\x0a\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8b\x01\0\0\x01\0\0\0\x03\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xc8\x63\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x93\x01\0\0\x01\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xd8\x63\0\0\0\0\0\0\x1b\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x9b\x01\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf8\
-\x64\0\0\0\0\0\0\xb0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xa1\x01\0\0\x08\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa8\x66\0\0\0\
-\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x28\
-\x09\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa8\x66\0\0\0\0\0\0\x90\0\
-\0\0\0\0\0\0\x02\0\0\0\x03\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x32\x09\0\
-\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\x67\0\0\0\0\0\0\x60\0\0\0\0\
-\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x4a\x09\0\0\x09\
-\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\x67\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\
-\x02\0\0\0\x05\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x66\x09\0\0\x09\0\0\0\
-\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf8\x67\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x02\0\
-\0\0\x06\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x8e\x09\0\0\x09\0\0\0\x40\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x68\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\x02\0\0\0\
-\x07\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xb6\x09\0\0\x09\0\0\0\x40\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x98\x68\0\0\0\0\0\0\x40\x02\0\0\0\0\0\0\x02\0\0\0\x08\
-\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xd8\x09\0\0\x09\0\0\0\x40\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\xd8\x6a\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x02\0\0\0\x09\0\0\0\
-\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xf6\x09\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x18\x6b\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x02\0\0\0\x0a\0\0\0\x08\0\
-\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x1c\x0a\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x78\x6b\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x02\0\0\0\x0b\0\0\0\x08\0\0\0\0\
-\0\0\0\x10\0\0\0\0\0\0\0\x41\x0a\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xd8\x6b\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x02\0\0\0\x0c\0\0\0\x08\0\0\0\0\0\0\0\
-\x10\0\0\0\0\0\0\0\x62\x0a\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\
-\x6c\0\0\0\0\0\0\x50\0\0\0\0\0\0\0\x02\0\0\0\x0d\0\0\0\x08\0\0\0\0\0\0\0\x10\0\
-\0\0\0\0\0\0\x82\x0a\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x88\x6c\0\
-\0\0\0\0\0\x60\0\0\0\0\0\0\0\x02\0\0\0\x0e\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\
-\0\0\0\xa7\x0a\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x6c\0\0\0\0\
-\0\0\x50\0\0\0\0\0\0\0\x02\0\0\0\x0f\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\
-\xcb\x0a\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\x6d\0\0\0\0\0\0\
-\xb0\x01\0\0\0\0\0\0\x02\0\0\0\x10\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\
-\xda\x0a\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x6e\0\0\0\0\0\0\x78\
-\xc4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xdf\x0a\0\0\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x60\x33\x01\0\0\0\0\0\xac\x3f\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
-
- *sz = sizeof(data) - 1;
- return (const void *)data;
-}
-
-#ifdef __cplusplus
-struct cpu_stats_bpf *cpu_stats_bpf::open(const struct bpf_object_open_opts *opts) { return cpu_stats_bpf__open_opts(opts); }
-struct cpu_stats_bpf *cpu_stats_bpf::open_and_load() { return cpu_stats_bpf__open_and_load(); }
-int cpu_stats_bpf::load(struct cpu_stats_bpf *skel) { return cpu_stats_bpf__load(skel); }
-int cpu_stats_bpf::attach(struct cpu_stats_bpf *skel) { return cpu_stats_bpf__attach(skel); }
-void cpu_stats_bpf::detach(struct cpu_stats_bpf *skel) { cpu_stats_bpf__detach(skel); }
-void cpu_stats_bpf::destroy(struct cpu_stats_bpf *skel) { cpu_stats_bpf__destroy(skel); }
-const void *cpu_stats_bpf::elf_bytes(size_t *sz) { return cpu_stats_bpf__elf_bytes(sz); }
-#endif /* __cplusplus */
-
-__attribute__((unused)) static void
-cpu_stats_bpf__assert(struct cpu_stats_bpf *s __attribute__((unused)))
-{
-#ifdef __cplusplus
-#define _Static_assert static_assert
-#endif
- _Static_assert(sizeof(s->rodata->zero) == 4, "unexpected size of 'zero'");
- _Static_assert(sizeof(s->rodata->one) == 4, "unexpected size of 'one'");
- _Static_assert(sizeof(s->bss->latency_bk_window) == 8, "unexpected size of 'latency_bk_window'");
- _Static_assert(sizeof(s->bss->latency_ema) == 12, "unexpected size of 'latency_ema'");
- _Static_assert(sizeof(s->bss->usage_ema) == 12, "unexpected size of 'usage_ema'");
- _Static_assert(sizeof(s->bss->task_csw_ema) == 12, "unexpected size of 'task_csw_ema'");
- _Static_assert(sizeof(s->bss->task_preempt_ema) == 12, "unexpected size of 'task_preempt_ema'");
-#ifdef __cplusplus
-#undef _Static_assert
-#endif
-}
-
-#endif /* __CPU_STATS_BPF_SKEL_H__ */
diff --git a/.output/cpu_stats.tmp.bpf.o b/.output/cpu_stats.tmp.bpf.o
deleted file mode 100644
index 035d5b8..0000000
Binary files a/.output/cpu_stats.tmp.bpf.o and /dev/null differ
diff --git a/.output/io_stats.bpf.o b/.output/io_stats.bpf.o
deleted file mode 100644
index daa933c..0000000
Binary files a/.output/io_stats.bpf.o and /dev/null differ
diff --git a/.output/io_stats.skel.h b/.output/io_stats.skel.h
deleted file mode 100644
index e7a2490..0000000
--- a/.output/io_stats.skel.h
+++ /dev/null
@@ -1,1279 +0,0 @@
-/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
-
-/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
-#ifndef __IO_STATS_BPF_SKEL_H__
-#define __IO_STATS_BPF_SKEL_H__
-
-#include
-#include
-#include
-
-#define BPF_SKEL_SUPPORTS_MAP_AUTO_ATTACH 1
-
-struct io_stats_bpf {
- struct bpf_object_skeleton *skeleton;
- struct bpf_object *obj;
- struct {
- struct bpf_map *io_wait_map;
- struct bpf_map *io_wait_buffer;
- struct bpf_map *io_wait_count_map;
- struct bpf_map *io_task_stats_map;
- struct bpf_map *io_process_stats_map;
- struct bpf_map *io_threhold_map;
- struct bpf_map *io_task_stats_buffer;
- struct bpf_map *io_process_stats_buffer;
- struct bpf_map *rodata;
- } maps;
- struct {
- struct bpf_program *io_trace_rq_issue;
- struct bpf_program *io_trace_rq_complete;
- struct bpf_program *handle_io_wait_event;
- struct bpf_program *io_trace_enter_read;
- struct bpf_program *io_trace_enter_write;
- struct bpf_program *handle_io_task_exit;
- } progs;
- struct {
- struct bpf_link *io_trace_rq_issue;
- struct bpf_link *io_trace_rq_complete;
- struct bpf_link *handle_io_wait_event;
- struct bpf_link *io_trace_enter_read;
- struct bpf_link *io_trace_enter_write;
- struct bpf_link *handle_io_task_exit;
- } links;
-
-#ifdef __cplusplus
- static inline struct io_stats_bpf *open(const struct bpf_object_open_opts *opts = nullptr);
- static inline struct io_stats_bpf *open_and_load();
- static inline int load(struct io_stats_bpf *skel);
- static inline int attach(struct io_stats_bpf *skel);
- static inline void detach(struct io_stats_bpf *skel);
- static inline void destroy(struct io_stats_bpf *skel);
- static inline const void *elf_bytes(size_t *sz);
-#endif /* __cplusplus */
-};
-
-static void
-io_stats_bpf__destroy(struct io_stats_bpf *obj)
-{
- if (!obj)
- return;
- if (obj->skeleton)
- bpf_object__destroy_skeleton(obj->skeleton);
- free(obj);
-}
-
-static inline int
-io_stats_bpf__create_skeleton(struct io_stats_bpf *obj);
-
-static inline struct io_stats_bpf *
-io_stats_bpf__open_opts(const struct bpf_object_open_opts *opts)
-{
- struct io_stats_bpf *obj;
- int err;
-
- obj = (struct io_stats_bpf *)calloc(1, sizeof(*obj));
- if (!obj) {
- errno = ENOMEM;
- return NULL;
- }
-
- err = io_stats_bpf__create_skeleton(obj);
- if (err)
- goto err_out;
-
- err = bpf_object__open_skeleton(obj->skeleton, opts);
- if (err)
- goto err_out;
-
- return obj;
-err_out:
- io_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
-}
-
-static inline struct io_stats_bpf *
-io_stats_bpf__open(void)
-{
- return io_stats_bpf__open_opts(NULL);
-}
-
-static inline int
-io_stats_bpf__load(struct io_stats_bpf *obj)
-{
- return bpf_object__load_skeleton(obj->skeleton);
-}
-
-static inline struct io_stats_bpf *
-io_stats_bpf__open_and_load(void)
-{
- struct io_stats_bpf *obj;
- int err;
-
- obj = io_stats_bpf__open();
- if (!obj)
- return NULL;
- err = io_stats_bpf__load(obj);
- if (err) {
- io_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
- }
- return obj;
-}
-
-static inline int
-io_stats_bpf__attach(struct io_stats_bpf *obj)
-{
- return bpf_object__attach_skeleton(obj->skeleton);
-}
-
-static inline void
-io_stats_bpf__detach(struct io_stats_bpf *obj)
-{
- bpf_object__detach_skeleton(obj->skeleton);
-}
-
-static inline const void *io_stats_bpf__elf_bytes(size_t *sz);
-
-static inline int
-io_stats_bpf__create_skeleton(struct io_stats_bpf *obj)
-{
- struct bpf_object_skeleton *s;
- struct bpf_map_skeleton *map __attribute__((unused));
- int err;
-
- s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));
- if (!s) {
- err = -ENOMEM;
- goto err;
- }
-
- s->sz = sizeof(*s);
- s->name = "io_stats_bpf";
- s->obj = &obj->obj;
-
- /* maps */
- s->map_cnt = 9;
- s->map_skel_sz = 24;
- s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt,
- sizeof(*s->maps) > 24 ? sizeof(*s->maps) : 24);
- if (!s->maps) {
- err = -ENOMEM;
- goto err;
- }
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 0 * s->map_skel_sz);
- map->name = "io_wait_map";
- map->map = &obj->maps.io_wait_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 1 * s->map_skel_sz);
- map->name = "io_wait_buffer";
- map->map = &obj->maps.io_wait_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 2 * s->map_skel_sz);
- map->name = "io_wait_count_map";
- map->map = &obj->maps.io_wait_count_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 3 * s->map_skel_sz);
- map->name = "io_task_stats_map";
- map->map = &obj->maps.io_task_stats_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 4 * s->map_skel_sz);
- map->name = "io_process_stats_map";
- map->map = &obj->maps.io_process_stats_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 5 * s->map_skel_sz);
- map->name = "io_threhold_map";
- map->map = &obj->maps.io_threhold_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 6 * s->map_skel_sz);
- map->name = "io_task_stats_buffer";
- map->map = &obj->maps.io_task_stats_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 7 * s->map_skel_sz);
- map->name = "io_process_stats_buffer";
- map->map = &obj->maps.io_process_stats_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 8 * s->map_skel_sz);
- map->name = "io_stats.rodata";
- map->map = &obj->maps.rodata;
-
- /* programs */
- s->prog_cnt = 6;
- s->prog_skel_sz = sizeof(*s->progs);
- s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);
- if (!s->progs) {
- err = -ENOMEM;
- goto err;
- }
-
- s->progs[0].name = "io_trace_rq_issue";
- s->progs[0].prog = &obj->progs.io_trace_rq_issue;
- s->progs[0].link = &obj->links.io_trace_rq_issue;
-
- s->progs[1].name = "io_trace_rq_complete";
- s->progs[1].prog = &obj->progs.io_trace_rq_complete;
- s->progs[1].link = &obj->links.io_trace_rq_complete;
-
- s->progs[2].name = "handle_io_wait_event";
- s->progs[2].prog = &obj->progs.handle_io_wait_event;
- s->progs[2].link = &obj->links.handle_io_wait_event;
-
- s->progs[3].name = "io_trace_enter_read";
- s->progs[3].prog = &obj->progs.io_trace_enter_read;
- s->progs[3].link = &obj->links.io_trace_enter_read;
-
- s->progs[4].name = "io_trace_enter_write";
- s->progs[4].prog = &obj->progs.io_trace_enter_write;
- s->progs[4].link = &obj->links.io_trace_enter_write;
-
- s->progs[5].name = "handle_io_task_exit";
- s->progs[5].prog = &obj->progs.handle_io_task_exit;
- s->progs[5].link = &obj->links.handle_io_task_exit;
-
- s->data = io_stats_bpf__elf_bytes(&s->data_sz);
-
- obj->skeleton = s;
- return 0;
-err:
- bpf_object__destroy_skeleton(s);
- return err;
-}
-
-static inline const void *io_stats_bpf__elf_bytes(size_t *sz)
-{
- static const char data[] __attribute__((__aligned__(8))) = "\
-\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x30\x5d\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x16\0\
-\x01\0\0\x2e\x73\x74\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x74\
-\x65\x78\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x62\x6c\x6f\x63\x6b\
-\x2f\x62\x6c\x6f\x63\x6b\x5f\x72\x71\x5f\x69\x73\x73\x75\x65\0\x74\x72\x61\x63\
-\x65\x70\x6f\x69\x6e\x74\x2f\x62\x6c\x6f\x63\x6b\x2f\x62\x6c\x6f\x63\x6b\x5f\
-\x72\x71\x5f\x63\x6f\x6d\x70\x6c\x65\x74\x65\0\x70\x65\x72\x66\x5f\x65\x76\x65\
-\x6e\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x79\x73\x63\x61\x6c\
-\x6c\x73\x2f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\x5f\x72\x65\x61\x64\0\x74\x72\
-\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x79\x73\x63\x61\x6c\x6c\x73\x2f\x73\
-\x79\x73\x5f\x65\x6e\x74\x65\x72\x5f\x77\x72\x69\x74\x65\0\x74\x72\x61\x63\x65\
-\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\x68\x65\x64\x5f\x70\
-\x72\x6f\x63\x65\x73\x73\x5f\x65\x78\x69\x74\0\x6c\x69\x63\x65\x6e\x73\x65\0\
-\x2e\x6d\x61\x70\x73\0\x2e\x72\x6f\x64\x61\x74\x61\0\x69\x6f\x5f\x73\x74\x61\
-\x74\x73\x2e\x62\x70\x66\x2e\x63\0\x4c\x42\x42\x31\x5f\x32\x30\0\x4c\x42\x42\
-\x31\x5f\x33\0\x4c\x42\x42\x31\x5f\x31\x36\0\x4c\x42\x42\x31\x5f\x35\0\x4c\x42\
-\x42\x31\x5f\x37\0\x4c\x42\x42\x31\x5f\x39\0\x4c\x42\x42\x31\x5f\x31\x31\0\x4c\
-\x42\x42\x31\x5f\x31\x33\0\x4c\x42\x42\x31\x5f\x31\x35\0\x4c\x42\x42\x31\x5f\
-\x31\x38\0\x6f\x6e\x65\0\x4c\x42\x42\x31\x5f\x31\x39\0\x4c\x42\x42\x32\x5f\x32\
-\0\x68\x61\x6e\x64\x6c\x65\x5f\x69\x6f\x5f\x77\x61\x69\x74\x5f\x65\x76\x65\x6e\
-\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x32\x5f\x31\x39\0\x4c\x42\
-\x42\x32\x5f\x34\0\x4c\x42\x42\x32\x5f\x36\0\x4c\x42\x42\x32\x5f\x38\0\x4c\x42\
-\x42\x32\x5f\x31\x30\0\x4c\x42\x42\x32\x5f\x31\x32\0\x4c\x42\x42\x32\x5f\x31\
-\x34\0\x4c\x42\x42\x32\x5f\x31\x36\0\x4c\x42\x42\x32\x5f\x31\x38\0\x4c\x42\x42\
-\x33\x5f\x39\0\x4c\x42\x42\x33\x5f\x33\0\x4c\x42\x42\x33\x5f\x36\0\x4c\x42\x42\
-\x33\x5f\x35\0\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\
-\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\0\x4c\x42\x42\x33\x5f\x38\0\x69\x6f\
-\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\
-\x64\x5f\x63\x6f\x6d\x6d\x69\x74\0\x7a\x65\x72\x6f\0\x4c\x42\x42\x34\x5f\x32\0\
-\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\
-\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x34\
-\x5f\x31\x33\0\x4c\x42\x42\x34\x5f\x34\0\x4c\x42\x42\x34\x5f\x31\x32\0\x4c\x42\
-\x42\x34\x5f\x36\0\x4c\x42\x42\x34\x5f\x39\0\x69\x6f\x5f\x74\x61\x73\x6b\x5f\
-\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\
-\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\x4c\x42\x42\x34\x5f\x31\x31\0\x4c\x42\
-\x42\x35\x5f\x32\0\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\
-\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\
-\x66\x6d\x74\0\x4c\x42\x42\x35\x5f\x31\x31\0\x4c\x42\x42\x35\x5f\x34\0\x4c\x42\
-\x42\x35\x5f\x31\x30\0\x4c\x42\x42\x35\x5f\x36\0\x4c\x42\x42\x35\x5f\x39\0\x69\
-\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\
-\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\
-\x4c\x42\x42\x36\x5f\x39\0\x4c\x42\x42\x36\x5f\x33\0\x4c\x42\x42\x36\x5f\x36\0\
-\x4c\x42\x42\x36\x5f\x35\0\x4c\x42\x42\x36\x5f\x38\0\x4c\x42\x42\x37\x5f\x34\0\
-\x69\x6f\x5f\x74\x72\x61\x63\x65\x5f\x72\x71\x5f\x69\x73\x73\x75\x65\0\x69\x6f\
-\x5f\x77\x61\x69\x74\x5f\x6d\x61\x70\0\x69\x6f\x5f\x74\x72\x61\x63\x65\x5f\x72\
-\x71\x5f\x63\x6f\x6d\x70\x6c\x65\x74\x65\0\x69\x6f\x5f\x77\x61\x69\x74\x5f\x63\
-\x6f\x75\x6e\x74\x5f\x6d\x61\x70\0\x68\x61\x6e\x64\x6c\x65\x5f\x69\x6f\x5f\x77\
-\x61\x69\x74\x5f\x65\x76\x65\x6e\x74\0\x69\x6f\x5f\x77\x61\x69\x74\x5f\x62\x75\
-\x66\x66\x65\x72\0\x69\x6f\x5f\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\x65\x72\x5f\
-\x72\x65\x61\x64\0\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x5f\x6d\
-\x61\x70\0\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x5f\
-\x6d\x61\x70\0\x69\x6f\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x5f\x6d\x61\x70\0\
-\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\
-\x72\0\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x5f\x62\
-\x75\x66\x66\x65\x72\0\x69\x6f\x5f\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\x65\x72\
-\x5f\x77\x72\x69\x74\x65\0\x68\x61\x6e\x64\x6c\x65\x5f\x69\x6f\x5f\x74\x61\x73\
-\x6b\x5f\x65\x78\x69\x74\0\x4c\x49\x43\x45\x4e\x53\x45\0\x2e\x72\x65\x6c\x2e\
-\x74\x65\x78\x74\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\
-\x62\x6c\x6f\x63\x6b\x2f\x62\x6c\x6f\x63\x6b\x5f\x72\x71\x5f\x69\x73\x73\x75\
-\x65\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x62\x6c\x6f\
-\x63\x6b\x2f\x62\x6c\x6f\x63\x6b\x5f\x72\x71\x5f\x63\x6f\x6d\x70\x6c\x65\x74\
-\x65\0\x2e\x72\x65\x6c\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x2e\x72\x65\
-\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x79\x73\x63\x61\x6c\x6c\
-\x73\x2f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\x5f\x72\x65\x61\x64\0\x2e\x72\x65\
-\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x79\x73\x63\x61\x6c\x6c\
-\x73\x2f\x73\x79\x73\x5f\x65\x6e\x74\x65\x72\x5f\x77\x72\x69\x74\x65\0\x2e\x72\
-\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\
-\x73\x63\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x65\x78\x69\x74\0\x2e\
-\x42\x54\x46\0\x2e\x42\x54\x46\x2e\x65\x78\x74\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe6\0\0\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xf5\0\0\0\0\0\x05\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xfd\0\0\0\0\0\
-\x05\0\x78\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\x01\0\0\0\0\x05\0\x10\x01\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x0c\x01\0\0\0\0\x05\0\x90\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x13\x01\0\0\0\0\x05\0\xa8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1a\x01\0\0\0\0\x05\0\
-\xc0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x21\x01\0\0\0\0\x05\0\xd8\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x29\x01\0\0\0\0\x05\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x31\x01\0\
-\0\0\0\x05\0\x08\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x39\x01\0\0\0\0\x05\0\x80\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x41\x01\0\0\x01\0\x0c\0\x20\0\0\0\0\0\0\0\x04\0\0\
-\0\0\0\0\0\x45\x01\0\0\0\0\x05\0\xc0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4d\x01\0\0\0\0\x06\0\x68\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x54\x01\0\0\x01\0\x0c\0\0\0\0\0\0\0\0\0\x1e\0\0\0\0\0\0\
-\0\x71\x01\0\0\0\0\x06\0\x70\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x01\0\0\0\0\
-\x06\0\xe8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x01\0\0\0\0\x06\0\x48\x01\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x87\x01\0\0\0\0\x06\0\x98\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x8e\x01\0\0\0\0\x06\0\xf8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x96\x01\0\0\0\0\x06\
-\0\x48\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9e\x01\0\0\0\0\x06\0\xa8\x02\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xa6\x01\0\0\0\0\x06\0\xf8\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xae\x01\0\0\0\0\x06\0\x50\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x07\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb6\x01\0\0\0\0\x07\0\x20\x03\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xbd\x01\0\0\0\0\x07\0\x70\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc4\x01\
-\0\0\0\0\x07\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xcb\x01\0\0\0\0\x07\0\xb8\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd2\x01\0\0\x02\0\x03\0\0\0\0\0\0\0\0\0\xf8\x02\0\
-\0\0\0\0\0\xed\x01\0\0\0\0\x07\0\xc0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf4\x01\0\
-\0\x02\0\x03\0\xf8\x02\0\0\0\0\0\0\x10\x02\0\0\0\0\0\0\x12\x02\0\0\x01\0\x0c\0\
-\x24\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\x17\x02\0\0\0\0\x03\0\x68\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x1e\x02\0\0\x01\0\x0c\0\x28\0\0\0\0\0\0\0\x1d\0\0\0\0\0\0\0\x41\
-\x02\0\0\0\0\x03\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x49\x02\0\0\0\0\x03\0\xf8\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x50\x02\0\0\0\0\x03\0\xc0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x58\x02\0\0\0\0\x03\0\x28\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5f\x02\0\0\
-\0\0\x03\0\x98\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x66\x02\0\0\x01\0\x0c\0\x45\0\0\
-\0\0\0\0\0\x1c\0\0\0\0\0\0\0\x8b\x02\0\0\0\0\x03\0\xc8\x02\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x93\x02\0\0\0\0\x03\0\x60\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9a\x02\0\0\
-\x01\0\x0c\0\x61\0\0\0\0\0\0\0\x1d\0\0\0\0\0\0\0\xc0\x02\0\0\0\0\x03\0\xe0\x03\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x02\0\0\0\0\x03\0\xe8\x03\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xcf\x02\0\0\0\0\x03\0\xb0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd7\x02\0\0\
-\0\0\x03\0\x18\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xde\x02\0\0\0\0\x03\0\x88\x04\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xe5\x02\0\0\x01\0\x0c\0\x7e\0\0\0\0\0\0\0\x1f\0\0\0\
-\0\0\0\0\0\0\0\0\x03\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0d\x03\0\0\0\0\
-\x08\0\x28\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14\x03\0\0\0\0\x08\0\x70\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x1b\x03\0\0\0\0\x08\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x22\x03\0\0\0\0\x08\0\xb8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x29\x03\0\0\0\0\x08\
-\0\xc8\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x09\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x30\x03\0\0\0\0\x09\0\x98\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x37\x03\0\0\x12\0\x04\0\0\0\0\0\0\
-\0\0\0\x70\0\0\0\0\0\0\0\x49\x03\0\0\x11\0\x0b\0\0\0\0\0\0\0\0\0\x20\0\0\0\0\0\
-\0\0\x55\x03\0\0\x12\0\x05\0\0\0\0\0\0\0\0\0\x08\x02\0\0\0\0\0\0\x6a\x03\0\0\
-\x11\0\x0b\0\x30\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x7c\x03\0\0\x12\0\x06\0\0\0\0\
-\0\0\0\0\0\x80\x03\0\0\0\0\0\0\x91\x03\0\0\x11\0\x0b\0\x20\0\0\0\0\0\0\0\x10\0\
-\0\0\0\0\0\0\xa0\x03\0\0\x12\0\x07\0\0\0\0\0\0\0\0\0\x30\x03\0\0\0\0\0\0\xb4\
-\x03\0\0\x11\0\x0b\0\x50\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xc6\x03\0\0\x11\0\x0b\
-\0\x70\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xdb\x03\0\0\x11\0\x0b\0\x90\0\0\0\0\0\0\
-\0\x20\0\0\0\0\0\0\0\xeb\x03\0\0\x11\0\x0b\0\xb0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\
-\0\0\x04\0\0\x11\0\x0b\0\xc0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x18\x04\0\0\x12\0\
-\x08\0\0\0\0\0\0\0\0\0\x38\x03\0\0\0\0\0\0\x2d\x04\0\0\x12\0\x09\0\0\0\0\0\0\0\
-\0\0\xa8\0\0\0\0\0\0\0\x41\x04\0\0\x11\0\x0a\0\0\0\0\0\0\0\0\0\x0d\0\0\0\0\0\0\
-\0\xbf\x16\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02\0\0\x24\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x05\0\0\0\0\
-\0\x18\x01\0\0\x28\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1d\0\0\0\x85\0\0\0\x06\0\
-\0\0\x05\0\x11\0\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x08\0\0\0\0\0\0\x79\x61\x28\0\
-\0\0\0\0\x79\x72\x08\0\0\0\0\0\x0f\x12\0\0\0\0\0\0\x3d\x82\x0c\0\0\0\0\0\x7b\
-\x86\x28\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x16\x30\0\0\0\0\0\x63\x16\x20\0\0\0\
-\0\0\x63\x16\x1c\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\
-\0\0\xbf\x63\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x95\0\0\0\0\0\
-\0\0\x61\x71\0\0\0\0\0\0\x61\x62\x1c\0\0\0\0\0\x3d\x12\x03\0\0\0\0\0\x61\x61\
-\x20\0\0\0\0\0\x61\x72\x04\0\0\0\0\0\x2d\x12\xf9\xff\0\0\0\0\x61\x61\x30\0\0\0\
-\0\0\x55\x01\xf7\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\
-\x38\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x09\0\0\0\0\0\0\x55\x09\
-\x05\0\0\0\0\0\x18\x01\0\0\x45\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1c\0\0\0\x85\
-\0\0\0\x06\0\0\0\x05\0\xeb\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x19\x30\0\0\0\0\
-\0\x7b\x19\x28\0\0\0\0\0\x7b\x19\x20\0\0\0\0\0\x7b\x19\x18\0\0\0\0\0\x7b\x19\
-\x10\0\0\0\0\0\x7b\x19\x08\0\0\0\0\0\x7b\x19\0\0\0\0\0\0\x61\x61\0\0\0\0\0\0\
-\x63\x19\0\0\0\0\0\0\x61\x61\x04\0\0\0\0\0\x63\x19\x04\0\0\0\0\0\xbf\x91\0\0\0\
-\0\0\0\x07\x01\0\0\x0c\0\0\0\xbf\x63\0\0\0\0\0\0\x07\x03\0\0\x0c\0\0\0\xb7\x02\
-\0\0\x10\0\0\0\x85\0\0\0\x2d\0\0\0\x61\x62\x1c\0\0\0\0\0\x63\x29\x1c\0\0\0\0\0\
-\x61\x61\x20\0\0\0\0\0\x63\x19\x20\0\0\0\0\0\x79\x63\x28\0\0\0\0\0\x1f\x83\0\0\
-\0\0\0\0\x79\x74\x08\0\0\0\0\0\x0f\x43\0\0\0\0\0\0\x27\x03\0\0\x64\0\0\0\x3f\
-\x43\0\0\0\0\0\0\x67\x03\0\0\x20\0\0\0\x77\x03\0\0\x20\0\0\0\xb7\x04\0\0\x0b\0\
-\0\0\x2d\x34\x06\0\0\0\0\0\x37\x03\0\0\x0a\0\0\0\xbf\x34\0\0\0\0\0\0\x2f\x24\0\
-\0\0\0\0\0\x63\x49\x1c\0\0\0\0\0\x2f\x13\0\0\0\0\0\0\x63\x39\x20\0\0\0\0\0\xbf\
-\x91\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\xb7\x01\0\0\x01\0\0\0\
-\x63\x16\x30\0\0\0\0\0\x05\0\xb9\xff\0\0\0\0\xbf\x16\0\0\0\0\0\0\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x18\x02\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
-\0\xbf\x07\0\0\0\0\0\0\x55\x07\x05\0\0\0\0\0\x18\x01\0\0\x61\0\0\0\0\0\0\0\0\0\
-\0\0\xb7\x02\0\0\x1d\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x10\0\0\0\0\0\x85\0\0\0\
-\x05\0\0\0\x79\x61\x10\0\0\0\0\0\x79\x72\x08\0\0\0\0\0\x0f\x12\0\0\0\0\0\0\x3d\
-\x02\x0c\0\0\0\0\0\x7b\x06\x10\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x16\x18\0\0\0\
-\0\0\x63\x16\x08\0\0\0\0\0\x63\x16\x04\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xbf\x62\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\x95\0\0\0\0\0\0\0\x61\x71\0\0\0\0\0\0\x61\x62\x04\0\0\0\0\0\x3d\x12\
-\x03\0\0\0\0\0\x61\x61\x08\0\0\0\0\0\x61\x72\x04\0\0\0\0\0\x2d\x12\xf9\xff\0\0\
-\0\0\x61\x61\x18\0\0\0\0\0\x55\x01\xf7\xff\0\0\0\0\xb7\x07\0\0\0\0\0\0\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x20\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\
-\0\x83\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\x7e\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\
-\0\0\x1f\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\xeb\xff\0\0\0\0\x7b\x70\x18\0\0\0\0\0\
-\x7b\x70\x10\0\0\0\0\0\x7b\x70\x08\0\0\0\0\0\x7b\x70\0\0\0\0\0\0\x61\x61\0\0\0\
-\0\0\0\x63\x10\0\0\0\0\0\0\x61\x61\x04\0\0\0\0\0\x63\x10\x04\0\0\0\0\0\x61\x61\
-\x08\0\0\0\0\0\x63\x10\x08\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\
-\x85\0\0\0\x84\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\x16\x18\0\0\0\0\0\x05\0\xd5\xff\
-\0\0\0\0\x61\x11\x08\0\0\0\0\0\x63\x1a\xfc\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\
-\x0a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\
-\0\0\0\0\0\x07\x03\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\
-\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x61\
-\x11\x08\0\0\0\0\0\x63\x1a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\
-\0\0\0\0\0\x15\x06\x36\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\0\0\0\0\0\0\x1f\
-\x10\0\0\0\0\0\0\x25\0\x02\0\xe7\x03\0\0\xb7\x01\0\0\0\0\0\0\x05\0\x13\0\0\0\0\
-\0\x25\0\x02\0\x87\x13\0\0\xb7\x01\0\0\x01\0\0\0\x05\0\x10\0\0\0\0\0\x25\0\x02\
-\0\x67\x42\0\0\xb7\x01\0\0\x02\0\0\0\x05\0\x0d\0\0\0\0\0\x25\0\x02\0\xe7\xfd\0\
-\0\xb7\x01\0\0\x03\0\0\0\x05\0\x0a\0\0\0\0\0\x25\0\x02\0\xe7\xeb\x03\0\xb7\x01\
-\0\0\x04\0\0\0\x05\0\x07\0\0\0\0\0\x25\0\x02\0\x3f\x42\x0f\0\xb7\x01\0\0\x05\0\
-\0\0\x05\0\x04\0\0\0\0\0\x25\0\x02\0\xff\x08\x3d\0\xb7\x01\0\0\x06\0\0\0\x05\0\
-\x01\0\0\0\0\0\xb7\x01\0\0\x07\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\
-\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
-\x01\0\0\0\x55\0\x07\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\
-\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x03\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x05\
-\0\x08\0\0\0\0\0\x61\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x10\0\0\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xbf\x03\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\
-\0\0\x03\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xb7\x07\0\0\0\0\0\0\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x20\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\
-\0\x83\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x05\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xb7\x02\0\0\x1e\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x61\0\0\0\0\0\x63\
-\x76\x1c\0\0\0\0\0\x63\x76\x18\0\0\0\0\0\x63\x76\x14\0\0\0\0\0\x63\x76\x10\0\0\
-\0\0\0\x63\x76\x0c\0\0\0\0\0\x63\x76\x08\0\0\0\0\0\x63\x76\x04\0\0\0\0\0\x63\
-\x76\0\0\0\0\0\0\x63\x7a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\
-\0\0\0\0\0\x61\x07\0\0\0\0\0\0\x63\x76\0\0\0\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\
-\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xb7\x07\0\0\0\0\0\0\xb7\x01\0\0\
-\0\0\0\0\x15\0\x01\0\0\0\0\0\x61\x01\0\0\0\0\0\0\x63\x16\x04\0\0\0\0\0\xb7\x01\
-\0\0\x02\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\0\0\
-\0\0\0\x61\x07\0\0\0\0\0\0\x63\x76\x08\0\0\0\0\0\xb7\x01\0\0\x03\0\0\0\x63\x1a\
-\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xb7\x07\0\0\0\0\0\0\xb7\x01\0\0\0\0\
-\0\0\x15\0\x01\0\0\0\0\0\x61\x01\0\0\0\0\0\0\x63\x16\x0c\0\0\0\0\0\xb7\x01\0\0\
-\x04\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\0\0\0\0\
-\0\x61\x07\0\0\0\0\0\0\x63\x76\x10\0\0\0\0\0\xb7\x01\0\0\x05\0\0\0\x63\x1a\xfc\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xb7\x07\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\
-\x15\0\x01\0\0\0\0\0\x61\x01\0\0\0\0\0\0\x63\x16\x14\0\0\0\0\0\xb7\x01\0\0\x06\
-\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\
-\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x01\0\0\0\0\0\
-\x61\x07\0\0\0\0\0\0\x63\x76\x18\0\0\0\0\0\xb7\x01\0\0\x07\0\0\0\x63\x1a\xfc\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xb7\x01\0\0\0\0\0\0\x15\0\x01\0\0\0\0\0\
-\x61\x01\0\0\0\0\0\0\x63\x16\x1c\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\0\0\
-\0\0\x85\0\0\0\x84\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\
-\0\xbf\x07\0\0\0\0\0\0\xbf\x78\0\0\0\0\0\0\x77\x08\0\0\x20\0\0\0\x63\x8a\xfc\
-\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x06\0\0\0\0\0\0\
-\x67\x07\0\0\x20\0\0\0\x77\x07\0\0\x20\0\0\0\x15\x07\x59\0\0\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\
-\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x1c\0\0\0\0\0\xb7\x07\0\0\0\0\0\0\
-\x7b\x7a\xf0\xff\0\0\0\0\x7b\x7a\xe8\xff\0\0\0\0\x7b\x7a\xe0\xff\0\0\0\0\x7b\
-\x7a\xd8\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\0\0\0\x7b\x7a\
-\xc0\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\
-\x10\0\0\0\x85\0\0\0\x10\0\0\0\x7b\x6a\xe8\xff\0\0\0\0\x63\x8a\xc4\xff\0\0\0\0\
-\xb7\x01\0\0\x01\0\0\0\x63\x1a\xdc\xff\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x1a\
-\xc0\xff\0\0\0\0\x63\x7a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\
-\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x12\0\0\0\0\0\
-\x61\x71\x1c\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x1c\0\0\0\0\0\x61\x71\0\0\
-\0\0\0\0\x55\x01\x04\0\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x17\0\0\0\0\0\0\x61\
-\xa1\xfc\xff\0\0\0\0\x63\x17\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\
-\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x11\0\0\0\0\0\x7b\x6a\
-\xd0\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\
-\x01\0\0\0\x63\x1a\xc4\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xd8\xff\0\0\0\0\
-\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x04\0\0\
-\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\
-\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\x5e\0\
-\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\x07\0\0\0\0\0\
-\0\xbf\x78\0\0\0\0\0\0\x77\x08\0\0\x20\0\0\0\x63\x8a\xfc\xff\0\0\0\0\x63\x7a\
-\xf8\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x06\0\0\0\0\0\0\x67\x07\0\0\x20\0\0\0\
-\x77\x07\0\0\x20\0\0\0\x15\x07\x5a\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\
-\x07\0\0\0\0\0\0\x55\x07\x1c\0\0\0\0\0\xb7\x07\0\0\0\0\0\0\x7b\x7a\xf0\xff\0\0\
-\0\0\x7b\x7a\xe8\xff\0\0\0\0\x7b\x7a\xe0\xff\0\0\0\0\x7b\x7a\xd8\xff\0\0\0\0\
-\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\0\0\0\x7b\x7a\xc0\xff\0\0\0\0\xbf\
-\xa1\0\0\0\0\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\
-\x10\0\0\0\x7b\x6a\xe8\xff\0\0\0\0\x63\x8a\xc4\xff\0\0\0\0\xb7\x01\0\0\x01\0\0\
-\0\x63\x1a\xe0\xff\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\x63\
-\x7a\xdc\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\
-\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\
-\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x12\0\0\0\0\0\x61\x71\x20\0\0\0\0\0\
-\x07\x01\0\0\x01\0\0\0\x63\x17\x20\0\0\0\0\0\x61\x71\0\0\0\0\0\0\x55\x01\x04\0\
-\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x17\0\0\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\
-\x63\x17\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbf\xa2\0\0\0\0\0\0\
-\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\
-\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x12\0\0\0\0\0\x7b\x6a\xd0\xff\0\0\0\0\x61\
-\xa1\xfc\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xc8\
-\xff\0\0\0\0\xb7\x02\0\0\x01\0\0\0\x63\x2a\xc8\xff\0\0\0\0\x7b\x1a\xd8\xff\0\0\
-\0\0\x63\x1a\xc4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\
-\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x08\
-\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x08\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\x5e\
-\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x63\x0a\xfc\xff\
-\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x2d\x01\x0e\0\0\0\0\0\x67\0\0\0\
-\x20\0\0\0\x77\0\0\0\x20\0\0\0\x15\0\x0b\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\
-\x15\0\x05\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\
-\0\0\x44\x75\x61\x6c\x20\x42\x53\x44\x2f\x47\x50\x4c\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x69\x6f\x5f\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\x20\x62\x75\x66\
-\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\0\0\x01\0\0\0\0\0\0\0\x69\
-\x6f\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x6d\x61\x70\x20\x69\x73\x20\x6e\
-\x6f\x74\x20\x69\x6e\x69\x74\x0a\0\x74\x61\x73\x6b\x5f\x69\x6f\x5f\x73\x74\x61\
-\x74\x73\x5f\x62\x75\x66\x66\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\x69\x6f\x5f\
-\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x6d\x61\x70\x20\x69\x73\x20\x6e\x6f\x74\
-\x20\x69\x6e\x69\x74\x0a\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x69\x6f\x5f\x73\x74\
-\x61\x74\x73\x5f\x62\x75\x66\x66\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\0\0\0\
-\x08\0\0\0\0\0\0\0\x01\0\0\0\x49\0\0\0\x18\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\
-\x40\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xc0\0\0\0\0\0\0\0\x01\0\0\0\x47\0\0\0\
-\x38\x01\0\0\0\0\0\0\x01\0\0\0\x4a\0\0\0\x70\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\
-\0\0\x03\0\0\0\0\0\0\x01\0\0\0\x49\0\0\0\x10\x03\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\
-\0\x38\x03\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xb0\x03\0\0\0\0\0\0\x01\0\0\0\x48\0\
-\0\0\x30\x04\0\0\0\0\0\0\x01\0\0\0\x4b\0\0\0\x60\x04\0\0\0\0\0\0\x01\0\0\0\x3f\
-\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x20\0\0\0\0\0\0\0\x01\0\0\0\x41\0\
-\0\0\x28\x01\0\0\0\0\0\0\x01\0\0\0\x43\0\0\0\x58\x01\0\0\0\0\0\0\x01\0\0\0\x43\
-\0\0\0\x68\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xa8\x01\0\0\0\0\0\0\x01\0\0\0\
-\x43\0\0\0\xe0\x01\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x08\0\0\0\0\0\0\0\x01\0\0\0\
-\x45\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xc0\0\0\0\0\0\0\0\x01\0\0\0\
-\x43\0\0\0\x10\x01\0\0\0\0\0\0\x01\0\0\0\x43\0\0\0\x70\x01\0\0\0\0\0\0\x01\0\0\
-\0\x43\0\0\0\xc0\x01\0\0\0\0\0\0\x01\0\0\0\x43\0\0\0\x20\x02\0\0\0\0\0\0\x01\0\
-\0\0\x43\0\0\0\x70\x02\0\0\0\0\0\0\x01\0\0\0\x43\0\0\0\xd0\x02\0\0\0\0\0\0\x01\
-\0\0\0\x43\0\0\0\x20\x03\0\0\0\0\0\0\x01\0\0\0\x43\0\0\0\x68\0\0\0\0\0\0\0\x01\
-\0\0\0\x47\0\0\0\x48\x01\0\0\0\0\0\0\x01\0\0\0\x47\0\0\0\xc8\x01\0\0\0\0\0\0\
-\x01\0\0\0\x47\0\0\0\xf8\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x10\x02\0\0\0\0\0\
-\0\x01\0\0\0\x48\0\0\0\x98\x02\0\0\0\0\0\0\x01\0\0\0\x48\0\0\0\xe8\x02\0\0\0\0\
-\0\0\x01\0\0\0\x48\0\0\0\x18\x03\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x68\0\0\0\0\0\
-\0\0\x01\0\0\0\x47\0\0\0\x48\x01\0\0\0\0\0\0\x01\0\0\0\x47\0\0\0\xc8\x01\0\0\0\
-\0\0\0\x01\0\0\0\x47\0\0\0\xf8\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x10\x02\0\0\
-\0\0\0\0\x01\0\0\0\x48\0\0\0\xa0\x02\0\0\0\0\0\0\x01\0\0\0\x48\0\0\0\xf0\x02\0\
-\0\0\0\0\0\x01\0\0\0\x48\0\0\0\x20\x03\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x50\0\0\
-\0\0\0\0\0\x01\0\0\0\x47\0\0\0\x80\0\0\0\0\0\0\0\x01\0\0\0\x47\0\0\0\x9f\xeb\
-\x01\0\x18\0\0\0\0\0\0\0\xc4\x0b\0\0\xc4\x0b\0\0\x67\x1b\0\0\0\0\0\0\0\0\0\x02\
-\x03\0\0\0\x01\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\
-\x02\0\0\0\x04\0\0\0\x01\0\0\0\x05\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\
-\0\0\0\x02\x06\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x04\0\0\0\0\
-\0\0\0\0\0\0\x02\x08\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\
-\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\
-\0\x90\x01\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\
-\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x07\0\0\0\x80\0\0\0\x32\0\0\0\x09\0\0\0\xc0\0\
-\0\0\x3e\0\0\0\0\0\0\x0e\x0b\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x0e\0\0\0\0\0\0\
-\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x1b\0\0\0\0\0\0\0\0\0\0\x02\x10\0\0\0\
-\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\x02\0\0\0\0\0\x02\0\0\x04\
-\x10\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\x32\0\0\0\x0f\0\0\0\x40\0\0\0\x4a\0\0\0\
-\0\0\0\x0e\x11\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x14\0\0\0\0\0\0\0\0\0\0\x03\0\
-\0\0\0\x02\0\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\
-\x13\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x05\0\0\0\x80\0\0\0\
-\x32\0\0\0\x07\0\0\0\xc0\0\0\0\x59\0\0\0\0\0\0\x0e\x15\0\0\0\x01\0\0\0\0\0\0\0\
-\0\0\0\x02\x18\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x38\0\0\0\0\
-\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\
-\x40\0\0\0\x27\0\0\0\x17\0\0\0\x80\0\0\0\x32\0\0\0\x09\0\0\0\xc0\0\0\0\x6b\0\0\
-\0\0\0\0\x0e\x19\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x1c\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x02\0\0\0\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x1e\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x10\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\
-\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x1b\0\0\0\x80\
-\0\0\0\x32\0\0\0\x1d\0\0\0\xc0\0\0\0\x7d\0\0\0\0\0\0\x0e\x1f\0\0\0\x01\0\0\0\0\
-\0\0\0\0\0\0\x02\x22\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x10\0\
-\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x13\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\
-\0\0\x40\0\0\0\x27\0\0\0\x21\0\0\0\x80\0\0\0\x32\0\0\0\x13\0\0\0\xc0\0\0\0\x92\
-\0\0\0\0\0\0\x0e\x23\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x26\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\x08\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\
-\0\0\x0d\0\0\0\0\0\0\0\x32\0\0\0\x25\0\0\0\x40\0\0\0\xa2\0\0\0\0\0\0\x0e\x27\0\
-\0\0\x01\0\0\0\xb7\0\0\0\0\0\0\x0e\x27\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x2b\0\
-\0\0\xcf\0\0\0\x0c\0\0\x04\x40\0\0\0\xee\0\0\0\x2c\0\0\0\0\0\0\0\xfa\0\0\0\x2d\
-\0\0\0\x10\0\0\0\x07\x01\0\0\x2d\0\0\0\x18\0\0\0\x1c\x01\0\0\x02\0\0\0\x20\0\0\
-\0\x27\x01\0\0\x2e\0\0\0\x40\0\0\0\x2b\x01\0\0\x33\0\0\0\x60\0\0\0\x35\x01\0\0\
-\x34\0\0\0\x80\0\0\0\x3c\x01\0\0\x32\0\0\0\xc0\0\0\0\x46\x01\0\0\x32\0\0\0\xe0\
-\0\0\0\x4c\x01\0\0\x39\0\0\0\0\x01\0\0\x51\x01\0\0\x3a\0\0\0\x40\x01\0\0\x56\
-\x01\0\0\x02\0\0\0\xc0\x01\0\0\x65\x01\0\0\0\0\0\x01\x02\0\0\0\x10\0\0\0\x74\
-\x01\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\0\x82\x01\0\0\0\0\0\x08\x2f\0\0\0\x88\x01\
-\0\0\0\0\0\x08\x30\0\0\0\x97\x01\0\0\0\0\0\x08\x31\0\0\0\x9b\x01\0\0\0\0\0\x08\
-\x32\0\0\0\xa1\x01\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\x97\x01\0\0\0\0\0\x08\x32\
-\0\0\0\xae\x01\0\0\0\0\0\x08\x35\0\0\0\xb7\x01\0\0\0\0\0\x08\x36\0\0\0\xbb\x01\
-\0\0\0\0\0\x08\x37\0\0\0\xc1\x01\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\xd4\x01\0\0\
-\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\
-\x08\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x10\0\0\0\0\0\0\0\x01\
-\0\0\x0d\x02\0\0\0\xd9\x01\0\0\x2a\0\0\0\xdd\x01\0\0\x01\0\0\x0c\x3b\0\0\0\0\0\
-\0\0\0\0\0\x02\x3e\0\0\0\xef\x01\0\0\x08\0\0\x04\x30\0\0\0\x13\x02\0\0\x3f\0\0\
-\0\0\0\0\0\x27\x01\0\0\x2e\0\0\0\x40\0\0\0\x35\x01\0\0\x34\0\0\0\x80\0\0\0\x3c\
-\x01\0\0\x32\0\0\0\xc0\0\0\0\x17\x02\0\0\x02\0\0\0\xe0\0\0\0\x4c\x01\0\0\x39\0\
-\0\0\0\x01\0\0\x56\x01\0\0\x30\0\0\0\x40\x01\0\0\x1d\x02\0\0\x40\0\0\0\x60\x01\
-\0\0\x24\x02\0\0\x04\0\0\x04\x08\0\0\0\x19\0\0\0\x2c\0\0\0\0\0\0\0\x30\x02\0\0\
-\x2d\0\0\0\x10\0\0\0\x36\x02\0\0\x2d\0\0\0\x18\0\0\0\x44\x02\0\0\x02\0\0\0\x20\
-\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\
-\x0d\x02\0\0\0\xd9\x01\0\0\x3d\0\0\0\x48\x02\0\0\x01\0\0\x0c\x41\0\0\0\0\0\0\0\
-\0\0\0\x02\x44\0\0\0\x5d\x02\0\0\x03\0\0\x04\xb8\0\0\0\x71\x02\0\0\x45\0\0\0\0\
-\0\0\0\x76\x02\0\0\x36\0\0\0\x40\x05\0\0\x84\x02\0\0\x36\0\0\0\x80\x05\0\0\x89\
-\x02\0\0\0\0\0\x08\x46\0\0\0\x9c\x02\0\0\x15\0\0\x04\xa8\0\0\0\xa4\x02\0\0\x47\
-\0\0\0\0\0\0\0\xa8\x02\0\0\x47\0\0\0\x40\0\0\0\xac\x02\0\0\x47\0\0\0\x80\0\0\0\
-\xb0\x02\0\0\x47\0\0\0\xc0\0\0\0\xb4\x02\0\0\x47\0\0\0\0\x01\0\0\xb7\x02\0\0\
-\x47\0\0\0\x40\x01\0\0\xba\x02\0\0\x47\0\0\0\x80\x01\0\0\xbe\x02\0\0\x47\0\0\0\
-\xc0\x01\0\0\xc2\x02\0\0\x47\0\0\0\0\x02\0\0\xc5\x02\0\0\x47\0\0\0\x40\x02\0\0\
-\xc8\x02\0\0\x47\0\0\0\x80\x02\0\0\xcb\x02\0\0\x47\0\0\0\xc0\x02\0\0\xce\x02\0\
-\0\x47\0\0\0\0\x03\0\0\xd1\x02\0\0\x47\0\0\0\x40\x03\0\0\xd4\x02\0\0\x47\0\0\0\
-\x80\x03\0\0\xd7\x02\0\0\x47\0\0\0\xc0\x03\0\0\xdf\x02\0\0\x47\0\0\0\0\x04\0\0\
-\xe2\x02\0\0\x47\0\0\0\x40\x04\0\0\x30\x02\0\0\x47\0\0\0\x80\x04\0\0\xe5\x02\0\
-\0\x47\0\0\0\xc0\x04\0\0\xe8\x02\0\0\x47\0\0\0\0\x05\0\0\xeb\x02\0\0\0\0\0\x01\
-\x08\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xd9\x01\0\0\x43\0\0\0\xf9\
-\x02\0\0\x01\0\0\x0c\x48\0\0\0\0\0\0\0\0\0\0\x02\x4b\0\0\0\x0e\x03\0\0\x04\0\0\
-\x04\x40\0\0\0\x13\x02\0\0\x3f\0\0\0\0\0\0\0\x28\x03\0\0\x4c\0\0\0\x40\0\0\0\
-\x2b\x03\0\0\x4d\0\0\0\x80\0\0\0\x1d\x02\0\0\x40\0\0\0\0\x02\0\0\x30\x03\0\0\0\
-\0\0\x01\x08\0\0\0\x40\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x47\0\0\0\x04\0\0\0\
-\x06\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xd9\x01\0\0\x4a\0\0\0\x35\x03\0\0\x01\
-\0\0\x0c\x4e\0\0\0\0\0\0\0\0\0\0\x02\x51\0\0\0\x49\x03\0\0\x05\0\0\x04\x38\0\0\
-\0\x57\x03\0\0\x52\0\0\0\0\0\0\0\x5c\x03\0\0\x33\0\0\0\xe0\0\0\0\x67\x03\0\0\
-\x33\0\0\0\0\x01\0\0\x73\x03\0\0\x53\0\0\0\x40\x01\0\0\x83\x03\0\0\x33\0\0\0\
-\x80\x01\0\0\x92\x03\0\0\x04\0\0\x04\x1c\0\0\0\x44\x02\0\0\x33\0\0\0\0\0\0\0\
-\xa3\x03\0\0\x33\0\0\0\x20\0\0\0\xa8\x03\0\0\x33\0\0\0\x40\0\0\0\x51\x01\0\0\
-\x3a\0\0\0\x60\0\0\0\xb7\x01\0\0\0\0\0\x08\x37\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\
-\0\0\xaf\x03\0\0\x50\0\0\0\xb4\x03\0\0\0\0\0\x0c\x54\0\0\0\0\0\0\0\0\0\0\x02\
-\x57\0\0\0\xcf\x03\0\0\x05\0\0\x04\x20\0\0\0\xa3\x03\0\0\x33\0\0\0\0\0\0\0\x5c\
-\x03\0\0\x33\0\0\0\x20\0\0\0\x67\x03\0\0\x33\0\0\0\x40\0\0\0\x73\x03\0\0\x53\0\
-\0\0\x80\0\0\0\x83\x03\0\0\x33\0\0\0\xc0\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\
-\xe0\x03\0\0\x56\0\0\0\xe8\x03\0\0\0\0\0\x0c\x58\0\0\0\x06\x04\0\0\x01\0\0\x0c\
-\x4e\0\0\0\0\0\0\0\0\0\0\x02\x37\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xd9\x01\0\
-\0\x5b\0\0\0\x1b\x04\0\0\x01\0\0\x0c\x5c\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\
-\0\0\x04\0\0\0\x0d\0\0\0\x2f\x04\0\0\0\0\0\x0e\x5e\0\0\0\x01\0\0\0\0\0\0\0\0\0\
-\0\x0a\x38\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x60\0\0\0\x04\0\0\0\x1e\0\0\0\x37\
-\x04\0\0\0\0\0\x0e\x61\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0a\x33\0\0\0\x54\x04\0\0\0\
-\0\0\x0e\x63\0\0\0\0\0\0\0\x58\x04\0\0\0\0\0\x0e\x63\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x60\0\0\0\x04\0\0\0\x1d\0\0\0\x5d\x04\0\0\0\0\0\x0e\x66\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x60\0\0\0\x04\0\0\0\x1c\0\0\0\x80\x04\0\0\0\0\
-\0\x0e\x68\0\0\0\0\0\0\0\xa5\x04\0\0\0\0\0\x0e\x66\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\x60\0\0\0\x04\0\0\0\x1f\0\0\0\xcb\x04\0\0\0\0\0\x0e\x6b\0\0\0\0\0\
-\0\0\x92\x1a\0\0\x01\0\0\x0f\x0d\0\0\0\x5f\0\0\0\0\0\0\0\x0d\0\0\0\x9a\x1a\0\0\
-\x08\0\0\x0f\xd0\0\0\0\x0c\0\0\0\0\0\0\0\x20\0\0\0\x12\0\0\0\x20\0\0\0\x10\0\0\
-\0\x16\0\0\0\x30\0\0\0\x20\0\0\0\x1a\0\0\0\x50\0\0\0\x20\0\0\0\x20\0\0\0\x70\0\
-\0\0\x20\0\0\0\x24\0\0\0\x90\0\0\0\x20\0\0\0\x28\0\0\0\xb0\0\0\0\x10\0\0\0\x29\
-\0\0\0\xc0\0\0\0\x10\0\0\0\xa0\x1a\0\0\x07\0\0\x0f\x9d\0\0\0\x62\0\0\0\0\0\0\0\
-\x1e\0\0\0\x64\0\0\0\x20\0\0\0\x04\0\0\0\x65\0\0\0\x24\0\0\0\x04\0\0\0\x67\0\0\
-\0\x28\0\0\0\x1d\0\0\0\x69\0\0\0\x45\0\0\0\x1c\0\0\0\x6a\0\0\0\x61\0\0\0\x1d\0\
-\0\0\x6c\0\0\0\x7e\0\0\0\x1f\0\0\0\0\x69\x6e\x74\0\x5f\x5f\x41\x52\x52\x41\x59\
-\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\0\x74\x79\x70\x65\0\x6b\x65\
-\x79\x5f\x73\x69\x7a\x65\0\x76\x61\x6c\x75\x65\x5f\x73\x69\x7a\x65\0\x6d\x61\
-\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x69\x6f\x5f\x77\x61\x69\x74\x5f\x6d\x61\
-\x70\0\x69\x6f\x5f\x77\x61\x69\x74\x5f\x62\x75\x66\x66\x65\x72\0\x69\x6f\x5f\
-\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\x5f\x6d\x61\x70\0\x69\x6f\x5f\x74\x61\
-\x73\x6b\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\0\x69\x6f\x5f\x70\x72\x6f\x63\
-\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\0\x69\x6f\x5f\x74\x68\x72\
-\x65\x68\x6f\x6c\x64\x5f\x6d\x61\x70\0\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\
-\x61\x74\x73\x5f\x62\x75\x66\x66\x65\x72\0\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\x72\0\x74\x72\x61\x63\x65\
-\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x62\x6c\x6f\x63\x6b\x5f\x72\x71\
-\x5f\x69\x73\x73\x75\x65\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\x74\x79\x70\x65\0\x63\
-\x6f\x6d\x6d\x6f\x6e\x5f\x66\x6c\x61\x67\x73\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\x70\
-\x72\x65\x65\x6d\x70\x74\x5f\x63\x6f\x75\x6e\x74\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\
-\x70\x69\x64\0\x64\x65\x76\0\x5f\x5f\x70\x61\x64\x64\x69\x6e\x67\0\x73\x65\x63\
-\x74\x6f\x72\0\x6e\x72\x5f\x73\x65\x63\x74\x6f\x72\0\x62\x79\x74\x65\x73\0\x72\
-\x77\x62\x73\0\x63\x6f\x6d\x6d\0\x5f\x5f\x64\x61\x74\x61\x5f\x6c\x6f\x63\x5f\
-\x63\x6d\x64\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\x68\x6f\x72\x74\0\x75\
-\x6e\x73\x69\x67\x6e\x65\x64\x20\x63\x68\x61\x72\0\x64\x65\x76\x5f\x74\0\x5f\
-\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x64\x65\x76\x5f\x74\0\x75\x33\x32\0\x5f\x5f\
-\x75\x33\x32\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x73\x65\x63\
-\x74\x6f\x72\x5f\x74\0\x75\x36\x34\0\x5f\x5f\x75\x36\x34\0\x75\x6e\x73\x69\x67\
-\x6e\x65\x64\x20\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x63\x68\x61\x72\0\x63\
-\x74\x78\0\x69\x6f\x5f\x74\x72\x61\x63\x65\x5f\x72\x71\x5f\x69\x73\x73\x75\x65\
-\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x62\x6c\x6f\
-\x63\x6b\x5f\x72\x71\x5f\x63\x6f\x6d\x70\x6c\x65\x74\x69\x6f\x6e\0\x65\x6e\x74\
-\0\x65\x72\x72\x6f\x72\0\x5f\x5f\x64\x61\x74\x61\0\x74\x72\x61\x63\x65\x5f\x65\
-\x6e\x74\x72\x79\0\x66\x6c\x61\x67\x73\0\x70\x72\x65\x65\x6d\x70\x74\x5f\x63\
-\x6f\x75\x6e\x74\0\x70\x69\x64\0\x69\x6f\x5f\x74\x72\x61\x63\x65\x5f\x72\x71\
-\x5f\x63\x6f\x6d\x70\x6c\x65\x74\x65\0\x62\x70\x66\x5f\x70\x65\x72\x66\x5f\x65\
-\x76\x65\x6e\x74\x5f\x64\x61\x74\x61\0\x72\x65\x67\x73\0\x73\x61\x6d\x70\x6c\
-\x65\x5f\x70\x65\x72\x69\x6f\x64\0\x61\x64\x64\x72\0\x62\x70\x66\x5f\x75\x73\
-\x65\x72\x5f\x70\x74\x5f\x72\x65\x67\x73\x5f\x74\0\x70\x74\x5f\x72\x65\x67\x73\
-\0\x72\x31\x35\0\x72\x31\x34\0\x72\x31\x33\0\x72\x31\x32\0\x62\x70\0\x62\x78\0\
-\x72\x31\x31\0\x72\x31\x30\0\x72\x39\0\x72\x38\0\x61\x78\0\x63\x78\0\x64\x78\0\
-\x73\x69\0\x64\x69\0\x6f\x72\x69\x67\x5f\x61\x78\0\x69\x70\0\x63\x73\0\x73\x70\
-\0\x73\x73\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\0\x68\x61\x6e\
-\x64\x6c\x65\x5f\x69\x6f\x5f\x77\x61\x69\x74\x5f\x65\x76\x65\x6e\x74\0\x74\x72\
-\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x73\x79\x73\x5f\x65\
-\x6e\x74\x65\x72\0\x69\x64\0\x61\x72\x67\x73\0\x6c\x6f\x6e\x67\0\x69\x6f\x5f\
-\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\x65\x72\x5f\x72\x65\x61\x64\0\x69\x6f\x5f\
-\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\0\x69\x6e\x66\x6f\0\x72\x65\x61\x64\
-\x5f\x63\x6f\x75\x6e\x74\0\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\0\x6c\
-\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\0\x61\x6c\x72\x65\x61\
-\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\0\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x5f\
-\x73\x69\x6d\x70\x6c\x65\0\x74\x67\x69\x64\0\x63\x70\x75\x5f\x69\x64\0\x74\x61\
-\x73\x6b\0\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\
-\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\0\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\
-\x5f\x73\x74\x61\x74\x73\0\x70\x72\x6f\x63\x65\x73\x73\0\x69\x6f\x5f\x70\x72\
-\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\
-\x6f\x6d\x6d\x69\x74\0\x69\x6f\x5f\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\x65\x72\
-\x5f\x77\x72\x69\x74\x65\0\x68\x61\x6e\x64\x6c\x65\x5f\x69\x6f\x5f\x74\x61\x73\
-\x6b\x5f\x65\x78\x69\x74\0\x4c\x49\x43\x45\x4e\x53\x45\0\x68\x61\x6e\x64\x6c\
-\x65\x5f\x69\x6f\x5f\x77\x61\x69\x74\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\0\x6f\x6e\x65\0\x7a\x65\x72\x6f\0\x69\x6f\x5f\x74\x61\x73\x6b\
-\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\
-\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x63\x6f\x6d\
-\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\x2e\x31\0\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\
-\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\
-\x5f\x5f\x66\x6d\x74\0\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\
-\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\x2e\x32\0\x2f\x68\x6f\x6d\x65\x2f\x6e\x65\x30\x2f\x73\x79\x73\
-\x5f\x63\x6f\x6d\x70\x65\x74\x69\x74\x69\x6f\x6e\x2f\x73\x74\x61\x72\x74\x2f\
-\x63\x70\x75\x5f\x77\x61\x74\x63\x68\x65\x72\x2f\x62\x70\x66\x2f\x69\x6f\x5f\
-\x73\x74\x61\x74\x73\x2e\x62\x70\x66\x2e\x63\0\x20\x20\x20\x20\x75\x33\x32\x20\
-\x64\x65\x76\x20\x3d\x20\x63\x74\x78\x2d\x3e\x64\x65\x76\x3b\0\x20\x20\x20\x20\
-\x75\x36\x34\x20\x6e\x6f\x77\x20\x3d\x20\x62\x70\x66\x5f\x6b\x74\x69\x6d\x65\
-\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\x3b\x20\0\x20\x20\x20\x20\x62\x70\x66\x5f\
-\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\
-\x5f\x77\x61\x69\x74\x5f\x6d\x61\x70\x2c\x26\x64\x65\x76\x2c\x26\x6e\x6f\x77\
-\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x72\x65\x74\x75\x72\
-\x6e\x20\x30\x3b\0\x20\x20\x20\x20\x75\x36\x34\x20\x2a\x74\x69\x6d\x65\x20\x3d\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\
-\x6d\x28\x26\x69\x6f\x5f\x77\x61\x69\x74\x5f\x6d\x61\x70\x2c\x26\x64\x65\x76\
-\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\x69\x6d\x65\x29\0\x20\x20\x20\
-\x20\x75\x36\x34\x20\x77\x61\x69\x74\x20\x3d\x20\x6e\x6f\x77\x20\x2d\x20\x2a\
-\x74\x69\x6d\x65\x3b\0\x20\x20\x20\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\
-\x5f\x62\x75\x63\x6b\x65\x74\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\x20\x65\x6c\
-\x73\x65\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\
-\x74\x20\x3c\x20\x35\x29\0\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x6c\
-\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\x31\x37\x29\0\
-\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\
-\x5f\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\x36\x35\x29\0\x20\x20\x20\x20\x65\x6c\
-\x73\x65\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\
-\x74\x20\x3c\x20\x32\x35\x37\x29\0\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\
-\x28\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\x31\
-\x30\x30\x30\x29\0\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x6c\x61\x74\
-\x65\x6e\x63\x79\x5f\x62\x75\x63\x6b\x65\x74\x20\x3c\x20\x34\x30\x30\x30\x29\0\
-\x20\x20\x20\x20\x75\x33\x32\x20\x2a\x63\x6f\x75\x6e\x74\x20\x3d\x20\x62\x70\
-\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\
-\x69\x6f\x5f\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\x5f\x6d\x61\x70\x2c\x26\
-\x62\x75\x63\x6b\x65\x74\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x63\x6f\x75\
-\x6e\x74\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\
-\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x77\x61\
-\x69\x74\x5f\x63\x6f\x75\x6e\x74\x5f\x6d\x61\x70\x2c\x26\x62\x75\x63\x6b\x65\
-\x74\x2c\x26\x6f\x6e\x65\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x2a\x63\x6f\x75\x6e\x74\x20\x3d\x20\x2a\x63\x6f\x75\x6e\
-\x74\x20\x2b\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\
-\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\
-\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\x5f\x6d\x61\x70\x2c\x26\x62\x75\x63\
-\x6b\x65\x74\x2c\x63\x6f\x75\x6e\x74\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\x65\x5f\
-\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x77\x61\x69\x74\x5f\x6d\x61\x70\x2c\x26\
-\x64\x65\x76\x29\x3b\0\x7d\0\x69\x6e\x74\x20\x68\x61\x6e\x64\x6c\x65\x5f\x69\
-\x6f\x5f\x77\x61\x69\x74\x5f\x65\x76\x65\x6e\x74\x28\x73\x74\x72\x75\x63\x74\
-\x20\x62\x70\x66\x5f\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x64\x61\x74\
-\x61\x20\x2a\x63\x74\x78\x29\x20\x7b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\
-\x20\x69\x6f\x5f\x77\x61\x69\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x20\
-\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\
-\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x69\x6f\x5f\x77\x61\x69\x74\x5f\x62\
-\x75\x66\x66\x65\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\
-\x20\x69\x6f\x5f\x77\x61\x69\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x29\
-\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x62\x75\x66\x66\x29\x7b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\
-\x22\x69\x6f\x5f\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\x20\x62\x75\x66\x66\
-\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\
-\x6d\x65\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\x65\x6f\
-\x66\x28\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x77\x61\x69\x74\x5f\x70\x65\
-\x72\x66\x5f\x64\x61\x74\x61\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x75\
-\x33\x32\x20\x69\x6e\x64\x65\x78\x20\x3d\x20\x69\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x75\x33\x32\x20\x2a\x64\x61\x74\x61\x20\x3d\x20\x62\x70\x66\x5f\x6d\
-\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\
-\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\x5f\x6d\x61\x70\x2c\x26\x69\x6e\x64\
-\x65\x78\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x64\x61\x74\
-\x61\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\
-\x2d\x3e\x63\x6f\x75\x6e\x74\x5f\x6c\x69\x73\x74\x5b\x69\x5d\x20\x3d\x20\x2a\
-\x64\x61\x74\x61\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\
-\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\x62\x75\x66\x66\x2c\x20\x30\x29\x3b\0\x20\
-\x20\x20\x20\x75\x36\x34\x20\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\
-\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\x5f\x74\x67\x69\x64\x28\x29\
-\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x74\x67\x69\x64\x20\x3d\x20\x69\x64\x20\
-\x3e\x3e\x20\x33\x32\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x70\x69\x64\x20\x3d\
-\x20\x69\x64\x20\x26\x20\x30\x78\x46\x46\x46\x46\x46\x46\x46\x46\x3b\x20\0\x20\
-\x20\x20\x20\x75\x36\x34\x20\x6e\x6f\x77\x20\x3d\x20\x62\x70\x66\x5f\x6b\x74\
-\x69\x6d\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\x3b\0\x20\x20\x20\x20\x69\x66\
-\x28\x70\x69\x64\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\
-\x74\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x20\x2a\x74\x61\
-\x73\x6b\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\
-\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\
-\x73\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\
-\x21\x74\x61\x73\x6b\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\
-\x65\x74\x28\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2c\x30\x2c\x73\x69\x7a\
-\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\
-\x73\x74\x61\x74\x73\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\
-\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x63\x6f\x6d\x6d\x28\x69\
-\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x2c\
-\x73\x69\x7a\x65\x6f\x66\x28\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x69\x6e\
-\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\
-\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x69\x6e\x66\x6f\x2e\x74\x67\x69\
-\x64\x20\x3d\x20\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\
-\x69\x74\x5f\x74\x61\x73\x6b\x2e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\x20\
-\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\
-\x73\x6b\x2e\x69\x6e\x66\x6f\x2e\x70\x69\x64\x20\x3d\x20\x70\x69\x64\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x77\x72\
-\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x5f\
-\x6d\x61\x70\x2c\x26\x70\x69\x64\x2c\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\
-\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\
-\x61\x73\x6b\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\
-\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x74\x61\x73\x6b\x2d\x3e\
-\x69\x6e\x66\x6f\x2e\x70\x69\x64\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x2d\x3e\x69\x6e\x66\x6f\x2e\x70\
-\x69\x64\x20\x3d\x20\x70\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x74\x61\x73\x6b\x2d\x3e\x69\x6e\x66\x6f\x2e\x74\x67\x69\x64\x20\x3d\
-\x20\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\
-\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\
-\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\
-\x2c\x74\x61\x73\x6b\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\
-\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x28\x74\x61\x73\x6b\x29\x3b\0\x20\
-\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x73\x74\x61\x74\x73\x20\x2a\x70\x72\x6f\x63\x65\x73\x73\x20\x3d\x20\
-\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\
-\x28\x26\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x5f\
-\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\
-\x70\x72\x6f\x63\x65\x73\x73\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\
-\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\x2e\x6c\x61\x73\x74\x5f\x63\x6c\x65\
-\x61\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x69\x6e\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\x2e\x74\x67\x69\
-\x64\x20\x3d\x20\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\
-\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\x2e\x72\x65\x61\x64\x5f\x63\x6f\x75\
-\x6e\x74\x20\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\
-\x65\x74\x28\x26\x69\x6e\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\x2c\x30\x2c\
-\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x70\x72\
-\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x29\x29\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\
-\x74\x73\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x2c\x26\x69\x6e\x69\x74\x5f\
-\x70\x72\x6f\x63\x65\x73\x73\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x72\x65\x61\x64\
-\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\
-\x6d\x28\x26\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\
-\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x2c\x70\x72\x6f\x63\x65\x73\x73\x2c\
-\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6f\
-\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\
-\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x28\x70\x72\x6f\x63\x65\x73\x73\x29\x3b\0\x73\
-\x74\x61\x74\x69\x63\x20\x69\x6e\x74\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x63\
-\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x28\x73\
-\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\
-\x20\x2a\x74\x61\x73\x6b\x29\x20\x7b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\
-\x20\x69\x6f\x5f\x73\x74\x61\x74\x73\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\
-\x2a\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\
-\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x74\x68\
-\x72\x65\x68\x6f\x6c\x64\x5f\x6d\x61\x70\x2c\x26\x7a\x65\x72\x6f\x29\x3b\0\x20\
-\x20\x20\x20\x69\x66\x28\x21\x74\x68\x72\x65\x68\x6f\x6c\x64\x29\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x69\
-\x6f\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x6d\x61\x70\x20\x69\x73\x20\x6e\
-\x6f\x74\x20\x69\x6e\x69\x74\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\
-\x74\x61\x73\x6b\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\
-\x6d\x65\x20\x2b\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x74\x69\x6d\x65\
-\x5f\x77\x69\x6e\x64\x6f\x77\x20\x3c\x20\x6e\x6f\x77\x29\x7b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x74\x61\x73\x6b\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\
-\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x74\x61\x73\x6b\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\
-\x70\x75\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\
-\x6b\x2d\x3e\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x30\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x2d\x3e\x72\x65\x61\x64\x5f\
-\x63\x6f\x75\x6e\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x69\x66\x28\x74\x61\
-\x73\x6b\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\x20\x3e\x3d\x20\x74\
-\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\
-\x20\x7c\x7c\x20\x74\x61\x73\x6b\x2d\x3e\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\
-\x6e\x74\x20\x3e\x3d\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x77\x72\x69\
-\x74\x65\x5f\x63\x6f\x75\x6e\x74\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\
-\x66\x28\x74\x61\x73\x6b\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\
-\x70\x75\x74\x20\x21\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\
-\x72\x75\x63\x74\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x20\
-\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\
-\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\
-\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\x72\x2c\x20\x73\x69\x7a\x65\x6f\x66\
-\x28\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\
-\x74\x73\x29\x2c\x20\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\
-\x21\x62\x75\x66\x66\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x74\x61\x73\x6b\x5f\x69\x6f\
-\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x20\x69\x73\x20\x66\x75\x6c\x6c\
-\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\
-\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\
-\x63\x74\x20\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x29\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x69\x6e\x66\x6f\x2e\
-\x70\x69\x64\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x69\x6e\x66\x6f\x2e\x70\x69\
-\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x69\x6e\x66\
-\x6f\x2e\x74\x67\x69\x64\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x69\x6e\x66\x6f\
-\x2e\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\
-\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x73\x74\x72\x28\x62\x75\x66\x66\x2d\
-\x3e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x74\
-\x61\x73\x6b\x2d\x3e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x2c\x74\x61\x73\
-\x6b\x2d\x3e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x3b\x20\x20\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\
-\x6e\x74\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\
-\x6e\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x77\x72\
-\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x77\
-\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x75\x36\x34\x20\x74\x69\x6d\x65\x5f\x73\x70\x61\x72\x65\x20\x3d\x20\x74\x61\
-\x73\x6b\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\
-\x20\x2b\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x74\x69\x6d\x65\x5f\x77\
-\x69\x6e\x64\x6f\x77\x20\x2d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x74\x69\x6d\x65\x5f\x73\x70\x61\x72\x65\x20\x3d\x20\x74\x69\x6d\x65\x5f\
-\x73\x70\x61\x72\x65\x20\x2a\x20\x31\x30\x30\x20\x2f\x20\x74\x68\x72\x65\x68\
-\x6f\x6c\x64\x2d\x3e\x74\x69\x6d\x65\x5f\x77\x69\x6e\x64\x6f\x77\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x74\x69\x6d\x65\x5f\x73\x70\x61\x72\x65\x20\x3d\x20\
-\x28\x75\x33\x32\x29\x74\x69\x6d\x65\x5f\x73\x70\x61\x72\x65\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x69\x66\x28\x74\x69\x6d\x65\x5f\x73\x70\x61\x72\x65\x20\
-\x3e\x20\x31\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\
-\x66\x66\x2d\x3e\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x20\x2a\x3d\x20\
-\x28\x74\x69\x6d\x65\x5f\x73\x70\x61\x72\x65\x20\x2f\x20\x31\x30\x29\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x72\x65\
-\x61\x64\x5f\x63\x6f\x75\x6e\x74\x20\x2a\x3d\x20\x28\x74\x69\x6d\x65\x5f\x73\
-\x70\x61\x72\x65\x20\x2f\x20\x31\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\
-\x62\x75\x66\x66\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\
-\x6b\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\x3d\
-\x20\x31\x3b\0\x73\x74\x61\x74\x69\x63\x20\x69\x6e\x74\x20\x69\x6f\x5f\x70\x72\
-\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\
-\x6f\x6d\x6d\x69\x74\x28\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x70\x72\x6f\
-\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x20\x2a\x70\x72\x6f\x63\x65\x73\x73\
-\x29\x20\x7b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x73\x74\
-\x61\x74\x73\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x2a\x74\x68\x72\x65\x68\
-\x6f\x6c\x64\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\
-\x70\x5f\x65\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\
-\x5f\x6d\x61\x70\x2c\x26\x6f\x6e\x65\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\
-\x72\x6f\x63\x65\x73\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\
-\x74\x69\x6d\x65\x20\x2b\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x74\x69\
-\x6d\x65\x5f\x77\x69\x6e\x64\x6f\x77\x20\x3c\x20\x6e\x6f\x77\x29\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x6c\x61\x73\x74\
-\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x61\x6c\x72\
-\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x77\x72\x69\x74\x65\
-\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\
-\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\x72\x6f\x63\x65\x73\x73\
-\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\x20\x3e\x3d\x20\x74\x68\x72\
-\x65\x68\x6f\x6c\x64\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\x20\x7c\
-\x7c\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x77\x72\x69\x74\x65\x5f\x63\x6f\
-\x75\x6e\x74\x20\x3e\x3d\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x77\x72\
-\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x69\x66\x28\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\
-\x5f\x6f\x75\x74\x70\x75\x74\x20\x21\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x73\x74\x72\x75\x63\x74\x20\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\
-\x5f\x73\x74\x61\x74\x73\x20\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\
-\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x69\x6f\
-\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\
-\x65\x72\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x69\
-\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x29\x2c\x20\x30\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\
-\x72\x69\x6e\x74\x6b\x28\x22\x70\x72\x6f\x63\x65\x73\x73\x5f\x69\x6f\x5f\x73\
-\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x20\x69\x73\x20\x66\x75\x6c\x6c\x5c\x6e\
-\x22\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x62\
-\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\
-\x20\x69\x6f\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x73\x74\x61\x74\x73\x29\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x74\x67\x69\x64\
-\x20\x3d\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x74\x67\x69\x64\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x72\x65\x61\x64\x5f\x63\x6f\
-\x75\x6e\x74\x20\x3d\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x72\x65\x61\x64\
-\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\
-\x2d\x3e\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x70\x72\x6f\
-\x63\x65\x73\x73\x2d\x3e\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x61\x6c\x72\
-\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\x3d\x20\x31\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x77\x72\x69\x74\
-\x65\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x72\x65\x61\x64\x5f\x63\x6f\x75\
-\x6e\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\
-\x2d\x3e\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\
-\x73\x2e\x77\x72\x69\x74\x65\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x31\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\
-\x2e\x72\x65\x61\x64\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x77\x72\x69\x74\x65\
-\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x75\x36\x34\
-\x20\x70\x69\x64\x5f\x74\x67\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\
-\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\x5f\x74\x67\x69\x64\x28\x29\
-\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x70\x69\x64\x20\x3d\x20\x70\x69\x64\x5f\
-\x74\x67\x69\x64\x20\x26\x20\x30\x78\x46\x46\x46\x46\x46\x46\x46\x46\x3b\x20\
-\x20\0\x20\x20\x20\x20\x69\x66\x28\x70\x69\x64\x20\x3d\x3d\x20\x30\x20\x7c\x7c\
-\x20\x74\x67\x69\x64\x20\x3d\x3d\x20\x30\x29\0\x20\x20\x20\x20\x69\x66\x28\x62\
-\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\
-\x26\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\x2c\
-\x26\x70\x69\x64\x29\x20\x21\x3d\x20\x4e\x55\x4c\x4c\x29\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x69\x6f\x5f\x74\x61\x73\x6b\x5f\x73\x74\x61\x74\x73\x5f\
-\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\
-\x52\x4f\x47\x28\x68\x61\x6e\x64\x6c\x65\x5f\x69\x6f\x5f\x74\x61\x73\x6b\x5f\
-\x65\x78\x69\x74\x29\x7b\0\x30\x3a\x31\0\x6c\x69\x63\x65\x6e\x73\x65\0\x2e\x6d\
-\x61\x70\x73\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x74\x65\x78\x74\0\x74\x72\x61\
-\x63\x65\x70\x6f\x69\x6e\x74\x2f\x62\x6c\x6f\x63\x6b\x2f\x62\x6c\x6f\x63\x6b\
-\x5f\x72\x71\x5f\x69\x73\x73\x75\x65\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\
-\x2f\x62\x6c\x6f\x63\x6b\x2f\x62\x6c\x6f\x63\x6b\x5f\x72\x71\x5f\x63\x6f\x6d\
-\x70\x6c\x65\x74\x65\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x74\x72\x61\
-\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x79\x73\x63\x61\x6c\x6c\x73\x2f\x73\x79\
-\x73\x5f\x65\x6e\x74\x65\x72\x5f\x72\x65\x61\x64\0\x74\x72\x61\x63\x65\x70\x6f\
-\x69\x6e\x74\x2f\x73\x79\x73\x63\x61\x6c\x6c\x73\x2f\x73\x79\x73\x5f\x65\x6e\
-\x74\x65\x72\x5f\x77\x72\x69\x74\x65\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\
-\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\
-\x73\x5f\x65\x78\x69\x74\0\0\0\0\0\0\x9f\xeb\x01\0\x20\0\0\0\0\0\0\0\x7c\0\0\0\
-\x7c\0\0\0\xcc\x11\0\0\x48\x12\0\0\x1c\0\0\0\x08\0\0\0\xa8\x1a\0\0\x02\0\0\0\0\
-\0\0\0\x55\0\0\0\xf8\x02\0\0\x59\0\0\0\xae\x1a\0\0\x01\0\0\0\0\0\0\0\x3c\0\0\0\
-\xce\x1a\0\0\x01\0\0\0\0\0\0\0\x42\0\0\0\xf1\x1a\0\0\x01\0\0\0\0\0\0\0\x49\0\0\
-\0\xfc\x1a\0\0\x01\0\0\0\0\0\0\0\x4f\0\0\0\x1f\x1b\0\0\x01\0\0\0\0\0\0\0\x5a\0\
-\0\0\x43\x1b\0\0\x01\0\0\0\0\0\0\0\x5d\0\0\0\x10\0\0\0\xa8\x1a\0\0\x56\0\0\0\0\
-\0\0\0\xf3\x04\0\0\x79\x0f\0\0\0\x1c\x02\0\x08\0\0\0\xf3\x04\0\0\xbd\x0f\0\0\
-\x2a\x20\x02\0\x38\0\0\0\xf3\x04\0\0\x13\x10\0\0\x08\x24\x02\0\x40\0\0\0\xf3\
-\x04\0\0\x26\x10\0\0\x09\x28\x02\0\x68\0\0\0\xf3\x04\0\0\x64\x0a\0\0\x0f\x38\
-\x02\0\x78\0\0\0\xf3\x04\0\0\x5b\x10\0\0\x0e\x3c\x02\0\x80\0\0\0\xf3\x04\0\0\
-\x5b\x10\0\0\x2a\x3c\x02\0\x88\0\0\0\xf3\x04\0\0\x5b\x10\0\0\x1e\x3c\x02\0\x90\
-\0\0\0\xf3\x04\0\0\x5b\x10\0\0\x08\x3c\x02\0\x98\0\0\0\xf3\x04\0\0\x98\x10\0\0\
-\x1f\x48\x02\0\xa8\0\0\0\xf3\x04\0\0\xbd\x10\0\0\x1e\x4c\x02\0\xb0\0\0\0\xf3\
-\x04\0\0\xdf\x10\0\0\x1b\x44\x02\0\xb8\0\0\0\xf3\x04\0\0\xfe\x10\0\0\x1a\x40\
-\x02\0\xc0\0\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xf0\0\0\0\xf3\x04\0\0\x24\x08\0\0\
-\x01\xe8\x02\0\xf8\0\0\0\xf3\x04\0\0\x1c\x11\0\0\x26\x64\x02\0\0\x01\0\0\xf3\
-\x04\0\0\x1c\x11\0\0\x0e\x64\x02\0\x08\x01\0\0\xf3\x04\0\0\x1c\x11\0\0\x31\x64\
-\x02\0\x10\x01\0\0\xf3\x04\0\0\x1c\x11\0\0\x3a\x64\x02\0\x18\x01\0\0\xf3\x04\0\
-\0\x1c\x11\0\0\x53\x64\x02\0\x20\x01\0\0\xf3\x04\0\0\x1c\x11\0\0\x08\x64\x02\0\
-\x28\x01\0\0\xf3\x04\0\0\x7c\x11\0\0\x12\x68\x02\0\x30\x01\0\0\xf3\x04\0\0\x7c\
-\x11\0\0\x0c\x68\x02\0\x38\x01\0\0\xf3\x04\0\0\xa2\x11\0\0\x26\x7c\x02\0\x68\
-\x01\0\0\xf3\x04\0\0\x14\x12\0\0\x0c\x80\x02\0\x70\x01\0\0\xf3\x04\0\0\x27\x12\
-\0\0\x0d\x84\x02\0\xa0\x01\0\0\xf3\x04\0\0\x5f\x12\0\0\x09\x90\x02\0\xd8\x01\0\
-\0\xf3\x04\0\0\x94\x12\0\0\x25\x94\x02\0\xe0\x01\0\0\xf3\x04\0\0\x94\x12\0\0\
-\x18\x94\x02\0\xe8\x01\0\0\xf3\x04\0\0\xbd\x12\0\0\x26\x98\x02\0\xf0\x01\0\0\
-\xf3\x04\0\0\xbd\x12\0\0\x19\x98\x02\0\xf8\x01\0\0\xf3\x04\0\0\xe8\x12\0\0\x27\
-\x9c\x02\0\x08\x02\0\0\xf3\x04\0\0\xe8\x12\0\0\x44\x9c\x02\0\x18\x02\0\0\xf3\
-\x04\0\0\xe8\x12\0\0\x09\x9c\x02\0\x28\x02\0\0\xf3\x04\0\0\x3f\x13\0\0\x22\xa0\
-\x02\0\x30\x02\0\0\xf3\x04\0\0\x3f\x13\0\0\x1a\xa0\x02\0\x38\x02\0\0\xf3\x04\0\
-\0\x6c\x13\0\0\x23\xa4\x02\0\x40\x02\0\0\xf3\x04\0\0\x6c\x13\0\0\x1b\xa4\x02\0\
-\x48\x02\0\0\xf3\x04\0\0\x9b\x13\0\0\x20\xb0\x02\0\x50\x02\0\0\xf3\x04\0\0\x9b\
-\x13\0\0\x30\xb0\x02\0\x58\x02\0\0\xf3\x04\0\0\x9b\x13\0\0\x3c\xb0\x02\0\x60\
-\x02\0\0\xf3\x04\0\0\x9b\x13\0\0\x48\xb0\x02\0\x68\x02\0\0\xf3\x04\0\0\xe9\x13\
-\0\0\x21\xb4\x02\0\x70\x02\0\0\xf3\x04\0\0\xe9\x13\0\0\x27\xb4\x02\0\x78\x02\0\
-\0\xf3\x04\0\0\x28\x14\0\0\x16\xb8\x02\0\x90\x02\0\0\xf3\x04\0\0\x4e\x14\0\0\
-\x0c\xbc\x02\0\x98\x02\0\0\xf3\x04\0\0\x6a\x14\0\0\x2e\xc4\x02\0\xa0\x02\0\0\
-\xf3\x04\0\0\x9e\x14\0\0\x1e\xc8\x02\0\xb8\x02\0\0\xf3\x04\0\0\x6a\x14\0\0\x1f\
-\xc4\x02\0\xc8\x02\0\0\xf3\x04\0\0\xd1\x14\0\0\x09\xd0\x02\0\xe8\x02\0\0\xf3\
-\x04\0\0\xf5\x14\0\0\x1e\xd8\x02\0\xf8\x02\0\0\xf3\x04\0\0\x17\x15\0\0\0\xf4\
-\x02\0\0\x03\0\0\xf3\x04\0\0\x64\x15\0\0\x2a\xf8\x02\0\x30\x03\0\0\xf3\x04\0\0\
-\x13\x10\0\0\x08\xfc\x02\0\x38\x03\0\0\xf3\x04\0\0\x26\x10\0\0\x09\0\x03\0\x60\
-\x03\0\0\xf3\x04\0\0\x64\x0a\0\0\x0f\x10\x03\0\x68\x03\0\0\xf3\x04\0\0\xb9\x15\
-\0\0\x11\x14\x03\0\x70\x03\0\0\xf3\x04\0\0\xb9\x15\0\0\x2d\x14\x03\0\x78\x03\0\
-\0\xf3\x04\0\0\xb9\x15\0\0\x21\x14\x03\0\x80\x03\0\0\xf3\x04\0\0\xb9\x15\0\0\
-\x08\x14\x03\0\x88\x03\0\0\xf3\x04\0\0\xf9\x15\0\0\x22\x20\x03\0\x98\x03\0\0\
-\xf3\x04\0\0\x21\x16\0\0\x21\x24\x03\0\xa0\x03\0\0\xf3\x04\0\0\x46\x16\0\0\x1e\
-\x1c\x03\0\xa8\x03\0\0\xf3\x04\0\0\x68\x16\0\0\x1d\x18\x03\0\xb0\x03\0\0\xf3\
-\x04\0\0\0\0\0\0\0\0\0\0\xe0\x03\0\0\xf3\x04\0\0\x24\x08\0\0\x01\x7c\x03\0\xe8\
-\x03\0\0\xf3\x04\0\0\x89\x16\0\0\x29\x38\x03\0\xf0\x03\0\0\xf3\x04\0\0\x89\x16\
-\0\0\x11\x38\x03\0\xf8\x03\0\0\xf3\x04\0\0\x89\x16\0\0\x34\x38\x03\0\0\x04\0\0\
-\xf3\x04\0\0\x89\x16\0\0\x40\x38\x03\0\x08\x04\0\0\xf3\x04\0\0\x89\x16\0\0\x59\
-\x38\x03\0\x10\x04\0\0\xf3\x04\0\0\x89\x16\0\0\x08\x38\x03\0\x18\x04\0\0\xf3\
-\x04\0\0\xef\x16\0\0\x15\x3c\x03\0\x20\x04\0\0\xf3\x04\0\0\xef\x16\0\0\x0c\x3c\
-\x03\0\x30\x04\0\0\xf3\x04\0\0\x18\x17\0\0\x29\x44\x03\0\x58\x04\0\0\xf3\x04\0\
-\0\x14\x12\0\0\x0c\x48\x03\0\x60\x04\0\0\xf3\x04\0\0\x93\x17\0\0\x0d\x4c\x03\0\
-\x88\x04\0\0\xf3\x04\0\0\xce\x17\0\0\x09\x58\x03\0\xa8\x04\0\0\xf3\x04\0\0\x06\
-\x18\0\0\x1f\x5c\x03\0\xb0\x04\0\0\xf3\x04\0\0\x06\x18\0\0\x14\x5c\x03\0\xb8\
-\x04\0\0\xf3\x04\0\0\x2a\x18\0\0\x25\x60\x03\0\xc0\x04\0\0\xf3\x04\0\0\x2a\x18\
-\0\0\x1a\x60\x03\0\xc8\x04\0\0\xf3\x04\0\0\x5a\x18\0\0\x26\x64\x03\0\xd0\x04\0\
-\0\xf3\x04\0\0\x5a\x18\0\0\x1b\x64\x03\0\xd8\x04\0\0\xf3\x04\0\0\xd1\x14\0\0\
-\x09\x68\x03\0\xf8\x04\0\0\xf3\x04\0\0\x8c\x18\0\0\x21\x6c\x03\0\xae\x1a\0\0\
-\x07\0\0\0\0\0\0\0\xf3\x04\0\0\x32\x05\0\0\x14\x64\x01\0\x08\0\0\0\xf3\x04\0\0\
-\x32\x05\0\0\x09\x64\x01\0\x10\0\0\0\xf3\x04\0\0\x4a\x05\0\0\x0f\x68\x01\0\x18\
-\0\0\0\xf3\x04\0\0\x4a\x05\0\0\x09\x68\x01\0\x28\0\0\0\xf3\x04\0\0\0\0\0\0\0\0\
-\0\0\x40\0\0\0\xf3\x04\0\0\x6d\x05\0\0\x05\x70\x01\0\x60\0\0\0\xf3\x04\0\0\xa6\
-\x05\0\0\x05\x74\x01\0\xce\x1a\0\0\x1e\0\0\0\0\0\0\0\xf3\x04\0\0\x32\x05\0\0\
-\x14\x8c\x01\0\x08\0\0\0\xf3\x04\0\0\x32\x05\0\0\x09\x8c\x01\0\x18\0\0\0\xf3\
-\x04\0\0\0\0\0\0\0\0\0\0\x20\0\0\0\xf3\x04\0\0\xb4\x05\0\0\x11\x90\x01\0\x40\0\
-\0\0\xf3\x04\0\0\xec\x05\0\0\x08\x94\x01\0\x48\0\0\0\xf3\x04\0\0\x4a\x05\0\0\
-\x0f\x9c\x01\0\x50\0\0\0\xf3\x04\0\0\xfa\x05\0\0\x16\xa0\x01\0\x58\0\0\0\xf3\
-\x04\0\0\xfa\x05\0\0\x14\xa0\x01\0\x60\0\0\0\xf3\x04\0\0\x16\x06\0\0\x08\xe8\0\
-\0\x78\0\0\0\xf3\x04\0\0\x32\x06\0\0\x0d\xf0\0\0\x90\0\0\0\xf3\x04\0\0\x52\x06\
-\0\0\x0d\xf8\0\0\xa8\0\0\0\xf3\x04\0\0\x73\x06\0\0\x0d\0\x01\0\xc0\0\0\0\xf3\
-\x04\0\0\x94\x06\0\0\x0d\x08\x01\0\xd8\0\0\0\xf3\x04\0\0\xb6\x06\0\0\x0d\x10\
-\x01\0\xf0\0\0\0\xf3\x04\0\0\xd9\x06\0\0\x0d\x18\x01\0\x10\x01\0\0\xf3\x04\0\0\
-\0\0\0\0\0\0\0\0\x20\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x28\x01\0\0\xf3\x04\0\
-\0\xfc\x06\0\0\x12\x2c\x01\0\x40\x01\0\0\xf3\x04\0\0\x3e\x07\0\0\x08\x30\x01\0\
-\x50\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x58\x01\0\0\xf3\x04\0\0\x4e\x07\0\0\
-\x09\x34\x01\0\x80\x01\0\0\xf3\x04\0\0\x94\x07\0\0\x12\x40\x01\0\x88\x01\0\0\
-\xf3\x04\0\0\x94\x07\0\0\x19\x40\x01\0\x90\x01\0\0\xf3\x04\0\0\x94\x07\0\0\x10\
-\x40\x01\0\xa0\x01\0\0\xf3\x04\0\0\x94\x07\0\0\x12\x40\x01\0\xa8\x01\0\0\xf3\
-\x04\0\0\xb1\x07\0\0\x09\x44\x01\0\xc0\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xd8\
-\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xe0\x01\0\0\xf3\x04\0\0\xf8\x07\0\0\x05\
-\xac\x01\0\xf8\x01\0\0\xf3\x04\0\0\x24\x08\0\0\x01\xb4\x01\0\xf1\x1a\0\0\x37\0\
-\0\0\0\0\0\0\xf3\x04\0\0\x26\x08\0\0\0\xc0\x01\0\x08\0\0\0\xf3\x04\0\0\x62\x08\
-\0\0\x26\xc4\x01\0\x38\0\0\0\xf3\x04\0\0\xd0\x08\0\0\x08\xc8\x01\0\x40\0\0\0\
-\xf3\x04\0\0\xdf\x08\0\0\x09\xcc\x01\0\x68\0\0\0\xf3\x04\0\0\x15\x09\0\0\x05\
-\xd8\x01\0\xa8\0\0\0\xf3\x04\0\0\x4a\x09\0\0\x0d\xe4\x01\0\xb8\0\0\0\xf3\x04\0\
-\0\x15\x09\0\0\x05\xd8\x01\0\xc0\0\0\0\xf3\x04\0\0\x61\x09\0\0\x15\xe8\x01\0\
-\xd8\0\0\0\xf3\x04\0\0\xa5\x09\0\0\x0c\xec\x01\0\xe0\0\0\0\xf3\x04\0\0\xb8\x09\
-\0\0\x23\xfc\x01\0\xe8\0\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xf8\0\0\0\xf3\x04\0\0\
-\x4a\x09\0\0\x0d\xe4\x01\0\x08\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x10\x01\0\0\
-\xf3\x04\0\0\x61\x09\0\0\x15\xe8\x01\0\x38\x01\0\0\xf3\x04\0\0\xa5\x09\0\0\x0c\
-\xec\x01\0\x40\x01\0\0\xf3\x04\0\0\xb8\x09\0\0\x23\xfc\x01\0\x48\x01\0\0\xf3\
-\x04\0\0\0\0\0\0\0\0\0\0\x58\x01\0\0\xf3\x04\0\0\x4a\x09\0\0\x0d\xe4\x01\0\x68\
-\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x70\x01\0\0\xf3\x04\0\0\x61\x09\0\0\x15\
-\xe8\x01\0\x88\x01\0\0\xf3\x04\0\0\xa5\x09\0\0\x0c\xec\x01\0\x90\x01\0\0\xf3\
-\x04\0\0\xb8\x09\0\0\x23\xfc\x01\0\x98\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xa8\
-\x01\0\0\xf3\x04\0\0\x4a\x09\0\0\x0d\xe4\x01\0\xb8\x01\0\0\xf3\x04\0\0\0\0\0\0\
-\0\0\0\0\xc0\x01\0\0\xf3\x04\0\0\x61\x09\0\0\x15\xe8\x01\0\xe8\x01\0\0\xf3\x04\
-\0\0\xa5\x09\0\0\x0c\xec\x01\0\xf0\x01\0\0\xf3\x04\0\0\xb8\x09\0\0\x23\xfc\x01\
-\0\xf8\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x08\x02\0\0\xf3\x04\0\0\x4a\x09\0\0\
-\x0d\xe4\x01\0\x18\x02\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x20\x02\0\0\xf3\x04\0\0\
-\x61\x09\0\0\x15\xe8\x01\0\x38\x02\0\0\xf3\x04\0\0\xa5\x09\0\0\x0c\xec\x01\0\
-\x40\x02\0\0\xf3\x04\0\0\xb8\x09\0\0\x23\xfc\x01\0\x48\x02\0\0\xf3\x04\0\0\0\0\
-\0\0\0\0\0\0\x58\x02\0\0\xf3\x04\0\0\x4a\x09\0\0\x0d\xe4\x01\0\x68\x02\0\0\xf3\
-\x04\0\0\0\0\0\0\0\0\0\0\x70\x02\0\0\xf3\x04\0\0\x61\x09\0\0\x15\xe8\x01\0\x98\
-\x02\0\0\xf3\x04\0\0\xa5\x09\0\0\x0c\xec\x01\0\xa0\x02\0\0\xf3\x04\0\0\xb8\x09\
-\0\0\x23\xfc\x01\0\xa8\x02\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xb8\x02\0\0\xf3\x04\
-\0\0\x4a\x09\0\0\x0d\xe4\x01\0\xc8\x02\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xd0\x02\
-\0\0\xf3\x04\0\0\x61\x09\0\0\x15\xe8\x01\0\xe8\x02\0\0\xf3\x04\0\0\xa5\x09\0\0\
-\x0c\xec\x01\0\xf0\x02\0\0\xf3\x04\0\0\xb8\x09\0\0\x23\xfc\x01\0\xf8\x02\0\0\
-\xf3\x04\0\0\0\0\0\0\0\0\0\0\x08\x03\0\0\xf3\x04\0\0\x4a\x09\0\0\x0d\xe4\x01\0\
-\x18\x03\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x20\x03\0\0\xf3\x04\0\0\x61\x09\0\0\
-\x15\xe8\x01\0\x40\x03\0\0\xf3\x04\0\0\xa5\x09\0\0\x0c\xec\x01\0\x48\x03\0\0\
-\xf3\x04\0\0\xb8\x09\0\0\x23\xfc\x01\0\x50\x03\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\
-\x58\x03\0\0\xf3\x04\0\0\xe1\x09\0\0\x05\x08\x02\0\x70\x03\0\0\xf3\x04\0\0\x24\
-\x08\0\0\x01\x14\x02\0\xfc\x1a\0\0\x2e\0\0\0\0\0\0\0\xf3\x04\0\0\x02\x0a\0\0\
-\x0e\x8c\x03\0\x10\0\0\0\xf3\x04\0\0\x2b\x0a\0\0\x13\x90\x03\0\x20\0\0\0\xf3\
-\x04\0\0\x2b\x0a\0\0\x09\x90\x03\0\x28\0\0\0\xf3\x04\0\0\x44\x0a\0\0\x09\x94\
-\x03\0\x30\0\0\0\xf3\x04\0\0\x64\x0a\0\0\x0f\x98\x03\0\x40\0\0\0\xf3\x04\0\0\
-\x44\x0a\0\0\x0f\x94\x03\0\x50\0\0\0\xf3\x04\0\0\x86\x0a\0\0\x08\xa0\x03\0\x60\
-\0\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x68\0\0\0\xf3\x04\0\0\x97\x0a\0\0\x22\xac\
-\x03\0\x88\0\0\0\xf3\x04\0\0\xe6\x0a\0\0\x08\xb0\x03\0\x98\0\0\0\xf3\x04\0\0\
-\xf5\x0a\0\0\x09\xb8\x03\0\xd0\0\0\0\xf3\x04\0\0\x30\x0b\0\0\x1e\xcc\x03\0\xe0\
-\0\0\0\xf3\x04\0\0\x30\x0b\0\0\x09\xcc\x03\0\xf0\0\0\0\xf3\x04\0\0\x7f\x0b\0\0\
-\x23\xdc\x03\0\xf8\0\0\0\xf3\x04\0\0\xa8\x0b\0\0\x1d\xd8\x03\0\x08\x01\0\0\xf3\
-\x04\0\0\xcc\x0b\0\0\x1e\xe0\x03\0\x10\x01\0\0\xf3\x04\0\0\xee\x0b\0\0\x1e\xd4\
-\x03\0\x18\x01\0\0\xf3\x04\0\0\xee\x0b\0\0\x1c\xd4\x03\0\x20\x01\0\0\xf3\x04\0\
-\0\x10\x0c\0\0\x1f\xe4\x03\0\x30\x01\0\0\xf3\x04\0\0\xf5\x0a\0\0\x09\xb8\x03\0\
-\x48\x01\0\0\xf3\x04\0\0\x33\x0c\0\0\x09\xe8\x03\0\x70\x01\0\0\xf3\x04\0\0\x7c\
-\x0c\0\0\x1a\xf4\x03\0\x88\x01\0\0\xf3\x04\0\0\x9b\x0c\0\0\x17\xf8\x03\0\x90\
-\x01\0\0\xf3\x04\0\0\x9b\x0c\0\0\x0c\xf8\x03\0\x98\x01\0\0\xf3\x04\0\0\xbb\x0c\
-\0\0\x1e\0\x04\0\xa0\x01\0\0\xf3\x04\0\0\xbb\x0c\0\0\x1c\0\x04\0\xa8\x01\0\0\
-\xf3\x04\0\0\xdd\x0c\0\0\x1f\x04\x04\0\xb0\x01\0\0\xf3\x04\0\0\xdd\x0c\0\0\x1d\
-\x04\x04\0\xc0\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xc8\x01\0\0\xf3\x04\0\0\x01\
-\x0d\0\0\x09\x0c\x04\0\xf0\x01\0\0\xf3\x04\0\0\x44\x0d\0\0\x09\x10\x04\0\x08\
-\x02\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x10\x02\0\0\xf3\x04\0\0\x6e\x0d\0\0\x28\
-\x1c\x04\0\x30\x02\0\0\xf3\x04\0\0\xc7\x0d\0\0\x08\x20\x04\0\x38\x02\0\0\xf3\
-\x04\0\0\xd9\x0d\0\0\x26\x30\x04\0\x40\x02\0\0\xf3\x04\0\0\x05\x0e\0\0\x1d\x2c\
-\x04\0\x48\x02\0\0\xf3\x04\0\0\x05\x0e\0\0\x1b\x2c\x04\0\x58\x02\0\0\xf3\x04\0\
-\0\x27\x0e\0\0\x21\x34\x04\0\x68\x02\0\0\xf3\x04\0\0\x4c\x0e\0\0\x09\x28\x04\0\
-\x80\x02\0\0\xf3\x04\0\0\xd9\x0d\0\0\x26\x30\x04\0\x98\x02\0\0\xf3\x04\0\0\x8d\
-\x0e\0\0\x09\x3c\x04\0\xc0\x02\0\0\xf3\x04\0\0\xdd\x0e\0\0\x1d\x48\x04\0\xe0\
-\x02\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xe8\x02\0\0\xf3\x04\0\0\xff\x0e\0\0\x09\
-\x4c\x04\0\x10\x03\0\0\xf3\x04\0\0\x49\x0f\0\0\x09\x50\x04\0\x20\x03\0\0\xf3\
-\x04\0\0\x24\x08\0\0\x01\x60\x04\0\x1f\x1b\0\0\x30\0\0\0\0\0\0\0\xf3\x04\0\0\
-\x02\x0a\0\0\x0e\x70\x04\0\x10\0\0\0\xf3\x04\0\0\x2b\x0a\0\0\x13\x74\x04\0\x20\
-\0\0\0\xf3\x04\0\0\x2b\x0a\0\0\x09\x74\x04\0\x28\0\0\0\xf3\x04\0\0\x44\x0a\0\0\
-\x09\x78\x04\0\x30\0\0\0\xf3\x04\0\0\x64\x0a\0\0\x0f\x7c\x04\0\x40\0\0\0\xf3\
-\x04\0\0\x44\x0a\0\0\x0f\x78\x04\0\x50\0\0\0\xf3\x04\0\0\x86\x0a\0\0\x08\x84\
-\x04\0\x60\0\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x68\0\0\0\xf3\x04\0\0\x97\x0a\0\0\
-\x22\x90\x04\0\x88\0\0\0\xf3\x04\0\0\xe6\x0a\0\0\x08\x94\x04\0\x98\0\0\0\xf3\
-\x04\0\0\xf5\x0a\0\0\x09\x9c\x04\0\xd0\0\0\0\xf3\x04\0\0\x30\x0b\0\0\x1e\xb0\
-\x04\0\xe0\0\0\0\xf3\x04\0\0\x30\x0b\0\0\x09\xb0\x04\0\xf0\0\0\0\xf3\x04\0\0\
-\x7f\x0b\0\0\x23\xc0\x04\0\xf8\0\0\0\xf3\x04\0\0\xa8\x0b\0\0\x1d\xbc\x04\0\x08\
-\x01\0\0\xf3\x04\0\0\xb1\x18\0\0\x1f\xc4\x04\0\x10\x01\0\0\xf3\x04\0\0\xee\x0b\
-\0\0\x1e\xb8\x04\0\x18\x01\0\0\xf3\x04\0\0\xee\x0b\0\0\x1c\xb8\x04\0\x20\x01\0\
-\0\xf3\x04\0\0\xd4\x18\0\0\x1e\xc8\x04\0\x30\x01\0\0\xf3\x04\0\0\xf5\x0a\0\0\
-\x09\x9c\x04\0\x48\x01\0\0\xf3\x04\0\0\x33\x0c\0\0\x09\xcc\x04\0\x70\x01\0\0\
-\xf3\x04\0\0\xf6\x18\0\0\x1b\xd8\x04\0\x88\x01\0\0\xf3\x04\0\0\x9b\x0c\0\0\x17\
-\xdc\x04\0\x90\x01\0\0\xf3\x04\0\0\x9b\x0c\0\0\x0c\xdc\x04\0\x98\x01\0\0\xf3\
-\x04\0\0\xbb\x0c\0\0\x1e\xe4\x04\0\xa0\x01\0\0\xf3\x04\0\0\xbb\x0c\0\0\x1c\xe4\
-\x04\0\xa8\x01\0\0\xf3\x04\0\0\xdd\x0c\0\0\x1f\xe8\x04\0\xb0\x01\0\0\xf3\x04\0\
-\0\xdd\x0c\0\0\x1d\xe8\x04\0\xc0\x01\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xc8\x01\0\
-\0\xf3\x04\0\0\x01\x0d\0\0\x09\xf0\x04\0\xf0\x01\0\0\xf3\x04\0\0\x44\x0d\0\0\
-\x09\xf4\x04\0\x08\x02\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x10\x02\0\0\xf3\x04\0\0\
-\x6e\x0d\0\0\x28\0\x05\0\x30\x02\0\0\xf3\x04\0\0\xc7\x0d\0\0\x08\x04\x05\0\x38\
-\x02\0\0\xf3\x04\0\0\xd9\x0d\0\0\x26\x14\x05\0\x40\x02\0\0\xf3\x04\0\0\x05\x0e\
-\0\0\x1d\x10\x05\0\x48\x02\0\0\xf3\x04\0\0\x05\x0e\0\0\x1b\x10\x05\0\x58\x02\0\
-\0\xf3\x04\0\0\x4c\x0e\0\0\x09\x0c\x05\0\x68\x02\0\0\xf3\x04\0\0\x16\x19\0\0\
-\x22\x18\x05\0\x70\x02\0\0\xf3\x04\0\0\x4c\x0e\0\0\x09\x0c\x05\0\x78\x02\0\0\
-\xf3\x04\0\0\x3c\x19\0\0\x21\x1c\x05\0\x88\x02\0\0\xf3\x04\0\0\xd9\x0d\0\0\x26\
-\x14\x05\0\xa0\x02\0\0\xf3\x04\0\0\x8d\x0e\0\0\x09\x20\x05\0\xc8\x02\0\0\xf3\
-\x04\0\0\x61\x19\0\0\x1e\x2c\x05\0\xe8\x02\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\xf0\
-\x02\0\0\xf3\x04\0\0\xff\x0e\0\0\x09\x30\x05\0\x18\x03\0\0\xf3\x04\0\0\x49\x0f\
-\0\0\x09\x34\x05\0\x28\x03\0\0\xf3\x04\0\0\x24\x08\0\0\x01\x44\x05\0\x43\x1b\0\
-\0\x09\0\0\0\0\0\0\0\xf3\x04\0\0\x84\x19\0\0\x14\x58\x05\0\x08\0\0\0\xf3\x04\0\
-\0\xb3\x19\0\0\x09\x5c\x05\0\x20\0\0\0\xf3\x04\0\0\xda\x19\0\0\x11\x64\x05\0\
-\x48\0\0\0\xf3\x04\0\0\0\0\0\0\0\0\0\0\x50\0\0\0\xf3\x04\0\0\xf8\x19\0\0\x08\
-\x70\x05\0\x68\0\0\0\xf3\x04\0\0\xf8\x19\0\0\x08\x70\x05\0\x78\0\0\0\xf3\x04\0\
-\0\0\0\0\0\0\0\0\0\x80\0\0\0\xf3\x04\0\0\x35\x1a\0\0\x09\x74\x05\0\x98\0\0\0\
-\xf3\x04\0\0\x6b\x1a\0\0\x05\x54\x05\0\x10\0\0\0\xce\x1a\0\0\x01\0\0\0\0\0\0\0\
-\x3e\0\0\0\x8e\x1a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\
-\0\0\x32\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x09\
-\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x78\x05\0\0\0\0\0\0\x68\x07\0\
-\0\0\0\0\0\x01\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x11\0\0\0\x01\
-\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x0c\0\0\0\0\0\0\x08\x05\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\0\0\0\x01\0\0\0\x06\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x11\0\0\0\0\0\0\x70\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x37\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x58\x12\0\0\0\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x5a\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x60\x14\0\0\0\0\0\0\x80\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x65\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x17\0\
-\0\0\0\0\0\x30\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x88\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x1b\0\0\0\0\0\0\
-\x38\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xac\0\0\
-\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x48\x1e\0\0\0\0\0\0\xa8\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\0\0\0\x01\0\0\0\
-\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf0\x1e\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd8\0\0\0\x01\0\0\0\x03\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x1f\0\0\0\0\0\0\xd0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xde\0\0\0\x01\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\xd0\x1f\0\0\0\0\0\0\x9d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x49\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x70\x20\
-\0\0\0\0\0\0\xc0\0\0\0\0\0\0\0\x02\0\0\0\x03\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\
-\0\0\0\0\x53\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x30\x21\0\0\0\
-\0\0\0\x10\0\0\0\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\
-\0\x77\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x21\0\0\0\0\0\0\
-\x60\0\0\0\0\0\0\0\x02\0\0\0\x05\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x9e\
-\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa0\x21\0\0\0\0\0\0\xa0\0\
-\0\0\0\0\0\0\x02\0\0\0\x06\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xad\x04\0\
-\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x22\0\0\0\0\0\0\x80\0\0\0\0\
-\0\0\0\x02\0\0\0\x07\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xd4\x04\0\0\x09\
-\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc0\x22\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\
-\x02\0\0\0\x08\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xfc\x04\0\0\x09\0\0\0\
-\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x23\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x02\0\
-\0\0\x09\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x24\x05\0\0\x01\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x60\x23\0\0\0\0\0\0\x43\x27\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x29\x05\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\xa8\x4a\0\0\0\0\0\0\x84\x12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0";
-
- *sz = sizeof(data) - 1;
- return (const void *)data;
-}
-
-#ifdef __cplusplus
-struct io_stats_bpf *io_stats_bpf::open(const struct bpf_object_open_opts *opts) { return io_stats_bpf__open_opts(opts); }
-struct io_stats_bpf *io_stats_bpf::open_and_load() { return io_stats_bpf__open_and_load(); }
-int io_stats_bpf::load(struct io_stats_bpf *skel) { return io_stats_bpf__load(skel); }
-int io_stats_bpf::attach(struct io_stats_bpf *skel) { return io_stats_bpf__attach(skel); }
-void io_stats_bpf::detach(struct io_stats_bpf *skel) { io_stats_bpf__detach(skel); }
-void io_stats_bpf::destroy(struct io_stats_bpf *skel) { io_stats_bpf__destroy(skel); }
-const void *io_stats_bpf::elf_bytes(size_t *sz) { return io_stats_bpf__elf_bytes(sz); }
-#endif /* __cplusplus */
-
-__attribute__((unused)) static void
-io_stats_bpf__assert(struct io_stats_bpf *s __attribute__((unused)))
-{
-#ifdef __cplusplus
-#define _Static_assert static_assert
-#endif
-#ifdef __cplusplus
-#undef _Static_assert
-#endif
-}
-
-#endif /* __IO_STATS_BPF_SKEL_H__ */
diff --git a/.output/io_stats.tmp.bpf.o b/.output/io_stats.tmp.bpf.o
deleted file mode 100644
index b04f746..0000000
Binary files a/.output/io_stats.tmp.bpf.o and /dev/null differ
diff --git a/.output/libblazesym_c.a b/.output/libblazesym_c.a
index a7f5012..4ab3f4c 100644
Binary files a/.output/libblazesym_c.a and b/.output/libblazesym_c.a differ
diff --git a/.output/libbpf.a b/.output/libbpf.a
index 95b29fa..f1f74a1 100644
Binary files a/.output/libbpf.a and b/.output/libbpf.a differ
diff --git a/.output/libbpf/libbpf.a b/.output/libbpf/libbpf.a
index 95b29fa..f1f74a1 100644
Binary files a/.output/libbpf/libbpf.a and b/.output/libbpf/libbpf.a differ
diff --git a/.output/libbpf/libbpf.pc b/.output/libbpf/libbpf.pc
index 1164a97..c0977ec 100644
--- a/.output/libbpf/libbpf.pc
+++ b/.output/libbpf/libbpf.pc
@@ -6,7 +6,7 @@ includedir=${prefix}/include
Name: libbpf
Description: BPF library
-Version: 1.5.0
+Version: 1.6.0
Libs: -L${libdir} -lbpf
Requires.private: libelf zlib
Cflags: -I${includedir}
diff --git a/.output/libbpf/staticobjs/bpf.o b/.output/libbpf/staticobjs/bpf.o
index 012d27d..11c44e4 100644
Binary files a/.output/libbpf/staticobjs/bpf.o and b/.output/libbpf/staticobjs/bpf.o differ
diff --git a/.output/libbpf/staticobjs/bpf_prog_linfo.o b/.output/libbpf/staticobjs/bpf_prog_linfo.o
index 5ecefbe..a2bdd7d 100644
Binary files a/.output/libbpf/staticobjs/bpf_prog_linfo.o and b/.output/libbpf/staticobjs/bpf_prog_linfo.o differ
diff --git a/.output/libbpf/staticobjs/btf.o b/.output/libbpf/staticobjs/btf.o
index 8bc9d32..98afa98 100644
Binary files a/.output/libbpf/staticobjs/btf.o and b/.output/libbpf/staticobjs/btf.o differ
diff --git a/.output/libbpf/staticobjs/btf_dump.o b/.output/libbpf/staticobjs/btf_dump.o
index 7b33cab..c03a496 100644
Binary files a/.output/libbpf/staticobjs/btf_dump.o and b/.output/libbpf/staticobjs/btf_dump.o differ
diff --git a/.output/libbpf/staticobjs/btf_iter.o b/.output/libbpf/staticobjs/btf_iter.o
index 398a257..90669a6 100644
Binary files a/.output/libbpf/staticobjs/btf_iter.o and b/.output/libbpf/staticobjs/btf_iter.o differ
diff --git a/.output/libbpf/staticobjs/btf_relocate.o b/.output/libbpf/staticobjs/btf_relocate.o
index 82e388b..b2dafcc 100644
Binary files a/.output/libbpf/staticobjs/btf_relocate.o and b/.output/libbpf/staticobjs/btf_relocate.o differ
diff --git a/.output/libbpf/staticobjs/elf.o b/.output/libbpf/staticobjs/elf.o
index 8bb0ddd..3fd488f 100644
Binary files a/.output/libbpf/staticobjs/elf.o and b/.output/libbpf/staticobjs/elf.o differ
diff --git a/.output/libbpf/staticobjs/features.o b/.output/libbpf/staticobjs/features.o
index 449e132..92eee85 100644
Binary files a/.output/libbpf/staticobjs/features.o and b/.output/libbpf/staticobjs/features.o differ
diff --git a/.output/libbpf/staticobjs/gen_loader.o b/.output/libbpf/staticobjs/gen_loader.o
index 51eda88..48f487b 100644
Binary files a/.output/libbpf/staticobjs/gen_loader.o and b/.output/libbpf/staticobjs/gen_loader.o differ
diff --git a/.output/libbpf/staticobjs/hashmap.o b/.output/libbpf/staticobjs/hashmap.o
index d51d700..63a5b94 100644
Binary files a/.output/libbpf/staticobjs/hashmap.o and b/.output/libbpf/staticobjs/hashmap.o differ
diff --git a/.output/libbpf/staticobjs/libbpf.o b/.output/libbpf/staticobjs/libbpf.o
index 46c6a1a..db99c19 100644
Binary files a/.output/libbpf/staticobjs/libbpf.o and b/.output/libbpf/staticobjs/libbpf.o differ
diff --git a/.output/libbpf/staticobjs/libbpf_errno.o b/.output/libbpf/staticobjs/libbpf_errno.o
index ae1997d..954cbef 100644
Binary files a/.output/libbpf/staticobjs/libbpf_errno.o and b/.output/libbpf/staticobjs/libbpf_errno.o differ
diff --git a/.output/libbpf/staticobjs/libbpf_probes.o b/.output/libbpf/staticobjs/libbpf_probes.o
index c37f288..9fe63cb 100644
Binary files a/.output/libbpf/staticobjs/libbpf_probes.o and b/.output/libbpf/staticobjs/libbpf_probes.o differ
diff --git a/.output/libbpf/staticobjs/linker.o b/.output/libbpf/staticobjs/linker.o
index ffca2eb..580bbe7 100644
Binary files a/.output/libbpf/staticobjs/linker.o and b/.output/libbpf/staticobjs/linker.o differ
diff --git a/.output/libbpf/staticobjs/netlink.o b/.output/libbpf/staticobjs/netlink.o
index 7227ecb..14e6b62 100644
Binary files a/.output/libbpf/staticobjs/netlink.o and b/.output/libbpf/staticobjs/netlink.o differ
diff --git a/.output/libbpf/staticobjs/nlattr.o b/.output/libbpf/staticobjs/nlattr.o
index 9f4911c..4b61522 100644
Binary files a/.output/libbpf/staticobjs/nlattr.o and b/.output/libbpf/staticobjs/nlattr.o differ
diff --git a/.output/libbpf/staticobjs/relo_core.o b/.output/libbpf/staticobjs/relo_core.o
index 24434c5..3d96918 100644
Binary files a/.output/libbpf/staticobjs/relo_core.o and b/.output/libbpf/staticobjs/relo_core.o differ
diff --git a/.output/libbpf/staticobjs/ringbuf.o b/.output/libbpf/staticobjs/ringbuf.o
index eacf1c6..814a6e5 100644
Binary files a/.output/libbpf/staticobjs/ringbuf.o and b/.output/libbpf/staticobjs/ringbuf.o differ
diff --git a/.output/libbpf/staticobjs/str_error.o b/.output/libbpf/staticobjs/str_error.o
index 452df18..64aab70 100644
Binary files a/.output/libbpf/staticobjs/str_error.o and b/.output/libbpf/staticobjs/str_error.o differ
diff --git a/.output/libbpf/staticobjs/strset.o b/.output/libbpf/staticobjs/strset.o
index e2b6372..b755eb4 100644
Binary files a/.output/libbpf/staticobjs/strset.o and b/.output/libbpf/staticobjs/strset.o differ
diff --git a/.output/libbpf/staticobjs/usdt.o b/.output/libbpf/staticobjs/usdt.o
index d280fc1..573ef1c 100644
Binary files a/.output/libbpf/staticobjs/usdt.o and b/.output/libbpf/staticobjs/usdt.o differ
diff --git a/.output/libbpf/staticobjs/zip.o b/.output/libbpf/staticobjs/zip.o
index 1fc9adc..37b62e2 100644
Binary files a/.output/libbpf/staticobjs/zip.o and b/.output/libbpf/staticobjs/zip.o differ
diff --git a/.output/mm_leak.bpf.o b/.output/mm_leak.bpf.o
deleted file mode 100644
index 5420dd8..0000000
Binary files a/.output/mm_leak.bpf.o and /dev/null differ
diff --git a/.output/mm_leak.skel.h b/.output/mm_leak.skel.h
deleted file mode 100644
index 12e28c8..0000000
--- a/.output/mm_leak.skel.h
+++ /dev/null
@@ -1,1569 +0,0 @@
-/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
-
-/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
-#ifndef __MM_LEAK_BPF_SKEL_H__
-#define __MM_LEAK_BPF_SKEL_H__
-
-#include
-#include
-#include
-
-#define BPF_SKEL_SUPPORTS_MAP_AUTO_ATTACH 1
-
-struct mm_leak_bpf {
- struct bpf_object_skeleton *skeleton;
- struct bpf_object *obj;
- struct {
- struct bpf_map *sizes;
- struct bpf_map *allocs;
- struct bpf_map *combined_allocs;
- struct bpf_map *memptrs;
- struct bpf_map *stack_traces;
- struct bpf_map *rodata;
- struct bpf_map *bss;
- } maps;
- struct {
- struct bpf_program *malloc_enter;
- struct bpf_program *free_enter;
- struct bpf_program *calloc_enter;
- struct bpf_program *realloc_enter;
- struct bpf_program *mmap_enter;
- struct bpf_program *munmap_enter;
- struct bpf_program *posix_memalign_enter;
- struct bpf_program *aligned_alloc_enter;
- struct bpf_program *valloc_enter;
- struct bpf_program *memalign_enter;
- struct bpf_program *pvalloc_enter;
- struct bpf_program *malloc_exit;
- struct bpf_program *calloc_exit;
- struct bpf_program *realloc_exit;
- struct bpf_program *mmap_exit;
- struct bpf_program *posix_memalign_exit;
- struct bpf_program *aligned_alloc_exit;
- struct bpf_program *valloc_exit;
- struct bpf_program *memalign_exit;
- struct bpf_program *pvalloc_exit;
- struct bpf_program *memleak__kmalloc;
- struct bpf_program *memleak__kfree;
- struct bpf_program *memleak__kmem_cache_alloc_node;
- struct bpf_program *memleak__kmem_cache_free;
- struct bpf_program *memleak__mm_page_alloc;
- struct bpf_program *memleak__mm_page_free;
- struct bpf_program *memleak__percpu_alloc_percpu;
- struct bpf_program *memleak__percpu_free_percpu;
- } progs;
- struct {
- struct bpf_link *malloc_enter;
- struct bpf_link *free_enter;
- struct bpf_link *calloc_enter;
- struct bpf_link *realloc_enter;
- struct bpf_link *mmap_enter;
- struct bpf_link *munmap_enter;
- struct bpf_link *posix_memalign_enter;
- struct bpf_link *aligned_alloc_enter;
- struct bpf_link *valloc_enter;
- struct bpf_link *memalign_enter;
- struct bpf_link *pvalloc_enter;
- struct bpf_link *malloc_exit;
- struct bpf_link *calloc_exit;
- struct bpf_link *realloc_exit;
- struct bpf_link *mmap_exit;
- struct bpf_link *posix_memalign_exit;
- struct bpf_link *aligned_alloc_exit;
- struct bpf_link *valloc_exit;
- struct bpf_link *memalign_exit;
- struct bpf_link *pvalloc_exit;
- struct bpf_link *memleak__kmalloc;
- struct bpf_link *memleak__kfree;
- struct bpf_link *memleak__kmem_cache_alloc_node;
- struct bpf_link *memleak__kmem_cache_free;
- struct bpf_link *memleak__mm_page_alloc;
- struct bpf_link *memleak__mm_page_free;
- struct bpf_link *memleak__percpu_alloc_percpu;
- struct bpf_link *memleak__percpu_free_percpu;
- } links;
- struct mm_leak_bpf__rodata {
- u64 sample_rate;
- size_t page_size;
- u64 stack_flags;
- } *rodata;
-
-#ifdef __cplusplus
- static inline struct mm_leak_bpf *open(const struct bpf_object_open_opts *opts = nullptr);
- static inline struct mm_leak_bpf *open_and_load();
- static inline int load(struct mm_leak_bpf *skel);
- static inline int attach(struct mm_leak_bpf *skel);
- static inline void detach(struct mm_leak_bpf *skel);
- static inline void destroy(struct mm_leak_bpf *skel);
- static inline const void *elf_bytes(size_t *sz);
-#endif /* __cplusplus */
-};
-
-static void
-mm_leak_bpf__destroy(struct mm_leak_bpf *obj)
-{
- if (!obj)
- return;
- if (obj->skeleton)
- bpf_object__destroy_skeleton(obj->skeleton);
- free(obj);
-}
-
-static inline int
-mm_leak_bpf__create_skeleton(struct mm_leak_bpf *obj);
-
-static inline struct mm_leak_bpf *
-mm_leak_bpf__open_opts(const struct bpf_object_open_opts *opts)
-{
- struct mm_leak_bpf *obj;
- int err;
-
- obj = (struct mm_leak_bpf *)calloc(1, sizeof(*obj));
- if (!obj) {
- errno = ENOMEM;
- return NULL;
- }
-
- err = mm_leak_bpf__create_skeleton(obj);
- if (err)
- goto err_out;
-
- err = bpf_object__open_skeleton(obj->skeleton, opts);
- if (err)
- goto err_out;
-
- return obj;
-err_out:
- mm_leak_bpf__destroy(obj);
- errno = -err;
- return NULL;
-}
-
-static inline struct mm_leak_bpf *
-mm_leak_bpf__open(void)
-{
- return mm_leak_bpf__open_opts(NULL);
-}
-
-static inline int
-mm_leak_bpf__load(struct mm_leak_bpf *obj)
-{
- return bpf_object__load_skeleton(obj->skeleton);
-}
-
-static inline struct mm_leak_bpf *
-mm_leak_bpf__open_and_load(void)
-{
- struct mm_leak_bpf *obj;
- int err;
-
- obj = mm_leak_bpf__open();
- if (!obj)
- return NULL;
- err = mm_leak_bpf__load(obj);
- if (err) {
- mm_leak_bpf__destroy(obj);
- errno = -err;
- return NULL;
- }
- return obj;
-}
-
-static inline int
-mm_leak_bpf__attach(struct mm_leak_bpf *obj)
-{
- return bpf_object__attach_skeleton(obj->skeleton);
-}
-
-static inline void
-mm_leak_bpf__detach(struct mm_leak_bpf *obj)
-{
- bpf_object__detach_skeleton(obj->skeleton);
-}
-
-static inline const void *mm_leak_bpf__elf_bytes(size_t *sz);
-
-static inline int
-mm_leak_bpf__create_skeleton(struct mm_leak_bpf *obj)
-{
- struct bpf_object_skeleton *s;
- struct bpf_map_skeleton *map __attribute__((unused));
- int err;
-
- s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));
- if (!s) {
- err = -ENOMEM;
- goto err;
- }
-
- s->sz = sizeof(*s);
- s->name = "mm_leak_bpf";
- s->obj = &obj->obj;
-
- /* maps */
- s->map_cnt = 7;
- s->map_skel_sz = 24;
- s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt,
- sizeof(*s->maps) > 24 ? sizeof(*s->maps) : 24);
- if (!s->maps) {
- err = -ENOMEM;
- goto err;
- }
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 0 * s->map_skel_sz);
- map->name = "sizes";
- map->map = &obj->maps.sizes;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 1 * s->map_skel_sz);
- map->name = "allocs";
- map->map = &obj->maps.allocs;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 2 * s->map_skel_sz);
- map->name = "combined_allocs";
- map->map = &obj->maps.combined_allocs;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 3 * s->map_skel_sz);
- map->name = "memptrs";
- map->map = &obj->maps.memptrs;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 4 * s->map_skel_sz);
- map->name = "stack_traces";
- map->map = &obj->maps.stack_traces;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 5 * s->map_skel_sz);
- map->name = "mm_leak_.rodata";
- map->map = &obj->maps.rodata;
- map->mmaped = (void **)&obj->rodata;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 6 * s->map_skel_sz);
- map->name = "mm_leak_.bss";
- map->map = &obj->maps.bss;
-
- /* programs */
- s->prog_cnt = 28;
- s->prog_skel_sz = sizeof(*s->progs);
- s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);
- if (!s->progs) {
- err = -ENOMEM;
- goto err;
- }
-
- s->progs[0].name = "malloc_enter";
- s->progs[0].prog = &obj->progs.malloc_enter;
- s->progs[0].link = &obj->links.malloc_enter;
-
- s->progs[1].name = "free_enter";
- s->progs[1].prog = &obj->progs.free_enter;
- s->progs[1].link = &obj->links.free_enter;
-
- s->progs[2].name = "calloc_enter";
- s->progs[2].prog = &obj->progs.calloc_enter;
- s->progs[2].link = &obj->links.calloc_enter;
-
- s->progs[3].name = "realloc_enter";
- s->progs[3].prog = &obj->progs.realloc_enter;
- s->progs[3].link = &obj->links.realloc_enter;
-
- s->progs[4].name = "mmap_enter";
- s->progs[4].prog = &obj->progs.mmap_enter;
- s->progs[4].link = &obj->links.mmap_enter;
-
- s->progs[5].name = "munmap_enter";
- s->progs[5].prog = &obj->progs.munmap_enter;
- s->progs[5].link = &obj->links.munmap_enter;
-
- s->progs[6].name = "posix_memalign_enter";
- s->progs[6].prog = &obj->progs.posix_memalign_enter;
- s->progs[6].link = &obj->links.posix_memalign_enter;
-
- s->progs[7].name = "aligned_alloc_enter";
- s->progs[7].prog = &obj->progs.aligned_alloc_enter;
- s->progs[7].link = &obj->links.aligned_alloc_enter;
-
- s->progs[8].name = "valloc_enter";
- s->progs[8].prog = &obj->progs.valloc_enter;
- s->progs[8].link = &obj->links.valloc_enter;
-
- s->progs[9].name = "memalign_enter";
- s->progs[9].prog = &obj->progs.memalign_enter;
- s->progs[9].link = &obj->links.memalign_enter;
-
- s->progs[10].name = "pvalloc_enter";
- s->progs[10].prog = &obj->progs.pvalloc_enter;
- s->progs[10].link = &obj->links.pvalloc_enter;
-
- s->progs[11].name = "malloc_exit";
- s->progs[11].prog = &obj->progs.malloc_exit;
- s->progs[11].link = &obj->links.malloc_exit;
-
- s->progs[12].name = "calloc_exit";
- s->progs[12].prog = &obj->progs.calloc_exit;
- s->progs[12].link = &obj->links.calloc_exit;
-
- s->progs[13].name = "realloc_exit";
- s->progs[13].prog = &obj->progs.realloc_exit;
- s->progs[13].link = &obj->links.realloc_exit;
-
- s->progs[14].name = "mmap_exit";
- s->progs[14].prog = &obj->progs.mmap_exit;
- s->progs[14].link = &obj->links.mmap_exit;
-
- s->progs[15].name = "posix_memalign_exit";
- s->progs[15].prog = &obj->progs.posix_memalign_exit;
- s->progs[15].link = &obj->links.posix_memalign_exit;
-
- s->progs[16].name = "aligned_alloc_exit";
- s->progs[16].prog = &obj->progs.aligned_alloc_exit;
- s->progs[16].link = &obj->links.aligned_alloc_exit;
-
- s->progs[17].name = "valloc_exit";
- s->progs[17].prog = &obj->progs.valloc_exit;
- s->progs[17].link = &obj->links.valloc_exit;
-
- s->progs[18].name = "memalign_exit";
- s->progs[18].prog = &obj->progs.memalign_exit;
- s->progs[18].link = &obj->links.memalign_exit;
-
- s->progs[19].name = "pvalloc_exit";
- s->progs[19].prog = &obj->progs.pvalloc_exit;
- s->progs[19].link = &obj->links.pvalloc_exit;
-
- s->progs[20].name = "memleak__kmalloc";
- s->progs[20].prog = &obj->progs.memleak__kmalloc;
- s->progs[20].link = &obj->links.memleak__kmalloc;
-
- s->progs[21].name = "memleak__kfree";
- s->progs[21].prog = &obj->progs.memleak__kfree;
- s->progs[21].link = &obj->links.memleak__kfree;
-
- s->progs[22].name = "memleak__kmem_cache_alloc_node";
- s->progs[22].prog = &obj->progs.memleak__kmem_cache_alloc_node;
- s->progs[22].link = &obj->links.memleak__kmem_cache_alloc_node;
-
- s->progs[23].name = "memleak__kmem_cache_free";
- s->progs[23].prog = &obj->progs.memleak__kmem_cache_free;
- s->progs[23].link = &obj->links.memleak__kmem_cache_free;
-
- s->progs[24].name = "memleak__mm_page_alloc";
- s->progs[24].prog = &obj->progs.memleak__mm_page_alloc;
- s->progs[24].link = &obj->links.memleak__mm_page_alloc;
-
- s->progs[25].name = "memleak__mm_page_free";
- s->progs[25].prog = &obj->progs.memleak__mm_page_free;
- s->progs[25].link = &obj->links.memleak__mm_page_free;
-
- s->progs[26].name = "memleak__percpu_alloc_percpu";
- s->progs[26].prog = &obj->progs.memleak__percpu_alloc_percpu;
- s->progs[26].link = &obj->links.memleak__percpu_alloc_percpu;
-
- s->progs[27].name = "memleak__percpu_free_percpu";
- s->progs[27].prog = &obj->progs.memleak__percpu_free_percpu;
- s->progs[27].link = &obj->links.memleak__percpu_free_percpu;
-
- s->data = mm_leak_bpf__elf_bytes(&s->data_sz);
-
- obj->skeleton = s;
- return 0;
-err:
- bpf_object__destroy_skeleton(s);
- return err;
-}
-
-static inline const void *mm_leak_bpf__elf_bytes(size_t *sz)
-{
- static const char data[] __attribute__((__aligned__(8))) = "\
-\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x60\x6f\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x1f\0\
-\x01\0\0\x2e\x73\x74\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x74\
-\x65\x78\x74\0\x75\x70\x72\x6f\x62\x65\0\x75\x72\x65\x74\x70\x72\x6f\x62\x65\0\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x61\
-\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\
-\x2f\x6b\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\
-\x65\x6d\x2f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x61\x6c\x6c\x6f\x63\0\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\
-\x6d\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\x6f\
-\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\
-\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\
-\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\x6f\
-\x69\x6e\x74\x2f\x70\x65\x72\x63\x70\x75\x2f\x70\x65\x72\x63\x70\x75\x5f\x61\
-\x6c\x6c\x6f\x63\x5f\x70\x65\x72\x63\x70\x75\0\x74\x72\x61\x63\x65\x70\x6f\x69\
-\x6e\x74\x2f\x70\x65\x72\x63\x70\x75\x2f\x70\x65\x72\x63\x70\x75\x5f\x66\x72\
-\x65\x65\x5f\x70\x65\x72\x63\x70\x75\0\x2e\x72\x6f\x64\x61\x74\x61\0\x6c\x69\
-\x63\x65\x6e\x73\x65\0\x2e\x6d\x61\x70\x73\0\x2e\x62\x73\x73\0\x6d\x6d\x5f\x6c\
-\x65\x61\x6b\x2e\x62\x70\x66\x2e\x63\0\x4c\x42\x42\x30\x5f\x32\0\x4c\x42\x42\
-\x30\x5f\x33\0\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x32\0\
-\x4c\x42\x42\x32\x5f\x34\0\x4c\x42\x42\x32\x5f\x33\0\x75\x70\x64\x61\x74\x65\
-\x5f\x73\x74\x61\x74\x69\x73\x74\x69\x63\x73\x5f\x64\x65\x6c\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\0\x4c\x42\x42\x33\x5f\x32\0\x4c\x42\x42\x33\x5f\x33\0\x4c\x42\
-\x42\x35\x5f\x34\0\x4c\x42\x42\x35\x5f\x33\0\x4c\x42\x42\x35\x5f\x36\0\x4c\x42\
-\x42\x35\x5f\x37\0\x4c\x42\x42\x37\x5f\x32\0\x4c\x42\x42\x37\x5f\x33\0\x4c\x42\
-\x42\x39\x5f\x34\0\x4c\x42\x42\x39\x5f\x33\0\x4c\x42\x42\x31\x30\x5f\x32\0\x4c\
-\x42\x42\x31\x30\x5f\x33\0\x4c\x42\x42\x31\x31\x5f\x33\0\x4c\x42\x42\x31\x32\
-\x5f\x32\0\x4c\x42\x42\x31\x32\x5f\x33\0\x4c\x42\x42\x31\x34\x5f\x32\0\x4c\x42\
-\x42\x31\x34\x5f\x33\0\x4c\x42\x42\x31\x36\x5f\x32\0\x4c\x42\x42\x31\x36\x5f\
-\x33\0\x4c\x42\x42\x31\x38\x5f\x32\0\x4c\x42\x42\x31\x38\x5f\x33\0\x4c\x42\x42\
-\x32\x30\x5f\x32\0\x4c\x42\x42\x32\x30\x5f\x33\0\x4c\x42\x42\x32\x31\x5f\x38\0\
-\x4c\x42\x42\x32\x31\x5f\x34\0\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\
-\x69\x74\x32\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x32\x31\x5f\x37\0\
-\x69\x6e\x69\x74\x69\x61\x6c\x5f\x63\x69\x6e\x66\x6f\0\x4c\x42\x42\x32\x32\x5f\
-\x34\0\x4c\x42\x42\x32\x32\x5f\x33\0\x4c\x42\x42\x32\x33\x5f\x32\0\x4c\x42\x42\
-\x32\x33\x5f\x33\0\x4c\x42\x42\x32\x34\x5f\x34\0\x4c\x42\x42\x32\x34\x5f\x33\0\
-\x4c\x42\x42\x32\x35\x5f\x32\0\x4c\x42\x42\x32\x35\x5f\x33\0\x4c\x42\x42\x32\
-\x36\x5f\x34\0\x4c\x42\x42\x32\x36\x5f\x33\0\x4c\x42\x42\x32\x37\x5f\x32\0\x4c\
-\x42\x42\x32\x37\x5f\x33\0\x4c\x42\x42\x32\x38\x5f\x34\0\x4c\x42\x42\x32\x38\
-\x5f\x33\0\x6d\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x73\x61\x6d\x70\
-\x6c\x65\x5f\x72\x61\x74\x65\0\x73\x69\x7a\x65\x73\0\x6d\x61\x6c\x6c\x6f\x63\
-\x5f\x65\x78\x69\x74\0\x66\x72\x65\x65\x5f\x65\x6e\x74\x65\x72\0\x61\x6c\x6c\
-\x6f\x63\x73\0\x63\x6f\x6d\x62\x69\x6e\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x73\0\
-\x63\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x63\x61\x6c\x6c\x6f\x63\x5f\
-\x65\x78\x69\x74\0\x72\x65\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x72\
-\x65\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\0\x6d\x6d\x61\x70\x5f\x65\x6e\x74\
-\x65\x72\0\x6d\x6d\x61\x70\x5f\x65\x78\x69\x74\0\x6d\x75\x6e\x6d\x61\x70\x5f\
-\x65\x6e\x74\x65\x72\0\x70\x6f\x73\x69\x78\x5f\x6d\x65\x6d\x61\x6c\x69\x67\x6e\
-\x5f\x65\x6e\x74\x65\x72\0\x6d\x65\x6d\x70\x74\x72\x73\0\x70\x6f\x73\x69\x78\
-\x5f\x6d\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\x78\x69\x74\0\x61\x6c\x69\x67\x6e\
-\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x61\x6c\x69\x67\x6e\
-\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\0\x76\x61\x6c\x6c\x6f\x63\
-\x5f\x65\x6e\x74\x65\x72\0\x76\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\0\x6d\
-\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\x6e\x74\x65\x72\0\x6d\x65\x6d\x61\x6c\x69\
-\x67\x6e\x5f\x65\x78\x69\x74\0\x70\x76\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\
-\x72\0\x70\x76\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\0\x6d\x65\x6d\x6c\x65\
-\x61\x6b\x5f\x5f\x6b\x6d\x61\x6c\x6c\x6f\x63\0\x73\x74\x61\x63\x6b\x5f\x74\x72\
-\x61\x63\x65\x73\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6b\x66\x72\x65\x65\0\
-\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\
-\x5f\x61\x6c\x6c\x6f\x63\x5f\x6e\x6f\x64\x65\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\
-\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\x6d\x65\x6d\
-\x6c\x65\x61\x6b\x5f\x5f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\x63\0\
-\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6d\
-\x6d\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\x65\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\
-\x5f\x70\x65\x72\x63\x70\x75\x5f\x61\x6c\x6c\x6f\x63\x5f\x70\x65\x72\x63\x70\
-\x75\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x70\x65\x72\x63\x70\x75\x5f\x66\x72\
-\x65\x65\x5f\x70\x65\x72\x63\x70\x75\0\x73\x74\x61\x63\x6b\x5f\x66\x6c\x61\x67\
-\x73\0\x4c\x49\x43\x45\x4e\x53\x45\0\x2e\x72\x65\x6c\x2e\x74\x65\x78\x74\0\x2e\
-\x72\x65\x6c\x75\x70\x72\x6f\x62\x65\0\x2e\x72\x65\x6c\x75\x72\x65\x74\x70\x72\
-\x6f\x62\x65\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\
-\x6d\x65\x6d\x2f\x6b\x6d\x61\x6c\x6c\x6f\x63\0\x2e\x72\x65\x6c\x74\x72\x61\x63\
-\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x66\x72\x65\x65\0\x2e\x72\
-\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\
-\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x61\x6c\x6c\x6f\x63\0\x2e\x72\x65\x6c\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\
-\x6d\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\x2e\x72\x65\x6c\x74\x72\x61\
-\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\
-\x65\x5f\x61\x6c\x6c\x6f\x63\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\
-\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\
-\x65\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x70\x65\x72\
-\x63\x70\x75\x2f\x70\x65\x72\x63\x70\x75\x5f\x61\x6c\x6c\x6f\x63\x5f\x70\x65\
-\x72\x63\x70\x75\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\
-\x70\x65\x72\x63\x70\x75\x2f\x70\x65\x72\x63\x70\x75\x5f\x66\x72\x65\x65\x5f\
-\x70\x65\x72\x63\x70\x75\0\x2e\x42\x54\x46\0\x2e\x42\x54\x46\x2e\x65\x78\x74\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\x01\0\0\x04\0\xf1\xff\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x03\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x46\x01\0\0\0\0\x04\0\
-\x70\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4d\x01\0\0\0\0\x04\0\xc8\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x03\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x54\x01\0\0\
-\x02\0\x03\0\0\0\0\0\0\0\0\0\x90\x02\0\0\0\0\0\0\x64\x01\0\0\0\0\x04\0\x08\x02\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x6b\x01\0\0\0\0\x04\0\xc8\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x72\x01\0\0\x01\0\x0e\0\x40\0\0\0\0\0\0\0\x22\0\0\0\0\0\0\0\x90\x01\0\
-\0\0\0\x04\0\x98\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x97\x01\0\0\0\0\x04\0\xf0\x02\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9e\x01\0\0\0\0\x04\0\x38\x04\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xa5\x01\0\0\0\0\x04\0\xf8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xac\x01\0\0\
-\0\0\x04\0\xa0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb3\x01\0\0\0\0\x04\0\xf8\x04\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xba\x01\0\0\0\0\x04\0\x78\x05\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xc1\x01\0\0\0\0\x04\0\xd0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x01\0\0\0\
-\0\x04\0\x10\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xcf\x01\0\0\0\0\x04\0\xd0\x06\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xd6\x01\0\0\0\0\x04\0\xf8\x07\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\xde\x01\0\0\0\0\x04\0\x50\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe6\x01\0\0\0\0\
-\x05\0\x48\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xee\x01\0\0\0\0\x04\0\xd0\x08\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xf6\x01\0\0\0\0\x04\0\x28\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xfe\x01\0\0\0\0\x04\0\xa8\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x06\x02\0\0\0\0\
-\x04\0\0\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0e\x02\0\0\0\0\x04\0\x80\x0a\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x16\x02\0\0\0\0\x04\0\xd8\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x1e\x02\0\0\0\0\x04\0\x58\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x26\x02\0\0\0\0\x04\
-\0\xb0\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x06\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x2e\x02\0\0\0\0\x06\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x36\x02\0\
-\0\0\0\x06\0\x48\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3e\x02\0\0\0\0\x03\0\x88\x02\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x46\x02\0\0\0\0\x03\0\x78\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x4e\x02\0\0\x01\0\x0e\0\x18\0\0\0\0\0\0\0\x28\0\0\0\0\0\0\0\x66\x02\0\
-\0\0\0\x03\0\x50\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x6e\x02\0\0\x01\0\x11\0\0\0\0\
-\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\x03\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x7c\x02\0\0\0\0\x07\0\x68\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x84\x02\0\0\0\0\
-\x07\0\x28\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x08\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x8c\x02\0\0\0\0\x08\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x94\
-\x02\0\0\0\0\x08\0\x48\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x09\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9c\x02\0\0\0\0\x09\0\x68\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xa4\x02\0\0\0\0\x09\0\x28\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\
-\0\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xac\x02\0\0\0\0\x0a\0\x98\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xb4\x02\0\0\0\0\x0a\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x03\0\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbc\x02\0\0\0\0\x0b\0\x30\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc4\x02\0\0\0\0\x0b\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x03\0\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xcc\x02\0\0\0\0\x0c\
-\0\x78\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd4\x02\0\0\0\0\x0c\0\xd0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xdc\x02\0\0\
-\0\0\x0d\0\x30\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe4\x02\0\0\0\0\x0d\0\xf0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x03\0\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xec\x02\0\0\x12\0\x04\0\0\0\
-\0\0\0\0\0\0\xd8\0\0\0\0\0\0\0\xf9\x02\0\0\x11\0\x0e\0\0\0\0\0\0\0\0\0\x08\0\0\
-\0\0\0\0\0\x05\x03\0\0\x11\0\x10\0\0\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x0b\x03\0\
-\0\x12\0\x05\0\0\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x17\x03\0\0\x12\0\x04\0\xd8\0\
-\0\0\0\0\0\0\x40\x01\0\0\0\0\0\0\x22\x03\0\0\x11\0\x10\0\x20\0\0\0\0\0\0\0\x20\
-\0\0\0\0\0\0\0\x29\x03\0\0\x11\0\x10\0\x40\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x39\
-\x03\0\0\x12\0\x04\0\x18\x02\0\0\0\0\0\0\xe8\0\0\0\0\0\0\0\x46\x03\0\0\x12\0\
-\x05\0\x20\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x52\x03\0\0\x12\0\x04\0\0\x03\0\0\0\
-\0\0\0\x08\x02\0\0\0\0\0\0\x60\x03\0\0\x12\0\x05\0\x40\0\0\0\0\0\0\0\x20\0\0\0\
-\0\0\0\0\x6d\x03\0\0\x12\0\x04\0\x08\x05\0\0\0\0\0\0\xd8\0\0\0\0\0\0\0\x78\x03\
-\0\0\x12\0\x05\0\x60\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x82\x03\0\0\x12\0\x04\0\
-\xe0\x05\0\0\0\0\0\0\x40\x01\0\0\0\0\0\0\x8f\x03\0\0\x12\0\x04\0\x20\x07\0\0\0\
-\0\0\0\x40\x01\0\0\0\0\0\0\xa4\x03\0\0\x11\0\x10\0\x60\0\0\0\0\0\0\0\x20\0\0\0\
-\0\0\0\0\xac\x03\0\0\x12\0\x05\0\x80\0\0\0\0\0\0\0\xd8\0\0\0\0\0\0\0\xc0\x03\0\
-\0\x12\0\x04\0\x60\x08\0\0\0\0\0\0\xd8\0\0\0\0\0\0\0\xd4\x03\0\0\x12\0\x05\0\
-\x58\x01\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xe7\x03\0\0\x12\0\x04\0\x38\x09\0\0\0\0\
-\0\0\xd8\0\0\0\0\0\0\0\xf4\x03\0\0\x12\0\x05\0\x78\x01\0\0\0\0\0\0\x20\0\0\0\0\
-\0\0\0\0\x04\0\0\x12\0\x04\0\x10\x0a\0\0\0\0\0\0\xd8\0\0\0\0\0\0\0\x0f\x04\0\0\
-\x12\0\x05\0\x98\x01\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x1d\x04\0\0\x12\0\x04\0\xe8\
-\x0a\0\0\0\0\0\0\xd8\0\0\0\0\0\0\0\x2b\x04\0\0\x12\0\x05\0\xb8\x01\0\0\0\0\0\0\
-\x20\0\0\0\0\0\0\0\x38\x04\0\0\x12\0\x06\0\0\0\0\0\0\0\0\0\x70\x01\0\0\0\0\0\0\
-\x49\x04\0\0\x11\0\x10\0\x80\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x56\x04\0\0\x12\0\
-\x07\0\0\0\0\0\0\0\0\0\x78\x01\0\0\0\0\0\0\x65\x04\0\0\x12\0\x08\0\0\0\0\0\0\0\
-\0\0\x70\x01\0\0\0\0\0\0\x84\x04\0\0\x12\0\x09\0\0\0\0\0\0\0\0\0\x78\x01\0\0\0\
-\0\0\0\x9d\x04\0\0\x12\0\x0a\0\0\0\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\xb4\x04\0\0\
-\x11\0\x0e\0\x08\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\xbe\x04\0\0\x12\0\x0b\0\0\0\0\
-\0\0\0\0\0\x40\x01\0\0\0\0\0\0\xd4\x04\0\0\x12\0\x0c\0\0\0\0\0\0\0\0\0\xf8\0\0\
-\0\0\0\0\0\xf1\x04\0\0\x12\0\x0d\0\0\0\0\0\0\0\0\0\x40\x01\0\0\0\0\0\0\x0d\x05\
-\0\0\x11\0\x0e\0\x10\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\x19\x05\0\0\x11\0\x0f\0\0\
-\0\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\xbf\x27\0\0\0\0\0\0\xbf\x16\0\0\0\0\0\0\x7b\
-\x7a\xf0\xff\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xec\xff\0\
-\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xec\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x45\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\
-\x1a\xe0\xff\0\0\0\0\x79\x01\0\0\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\xbf\xa2\0\0\0\
-\0\0\0\x07\x02\0\0\xec\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\
-\0\x03\0\0\0\x15\x07\x3b\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\x0a\xd8\xff\0\0\0\0\
-\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x03\0\0\0\x02\0\0\
-\x85\0\0\0\x1b\0\0\0\x63\x0a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xf0\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xd0\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x01\0\0\0\0\
-\0\0\x67\x01\0\0\x20\0\0\0\x77\x01\0\0\x20\0\0\0\x15\x01\x05\0\0\0\0\0\x18\x01\
-\0\0\x18\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x28\0\0\0\xbf\x03\0\0\0\0\0\0\x85\0\
-\0\0\x06\0\0\0\x79\xa6\xd0\xff\0\0\0\0\x61\xa1\xe0\xff\0\0\0\0\x67\x01\0\0\x20\
-\0\0\0\xc7\x01\0\0\x20\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
-\0\x55\0\x10\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\
-\x01\0\0\0\x85\0\0\0\x02\0\0\0\xb7\x01\0\0\0\0\0\0\x6d\x01\x0d\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x85\0\0\0\x01\0\0\0\x15\0\x07\0\0\0\0\0\x18\x01\0\0\xff\xff\xff\xff\0\0\0\0\
-\xff\0\0\0\x5f\x16\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\x4f\x16\0\
-\0\0\0\0\0\xdb\x60\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x70\0\0\0\0\0\x7b\x1a\
-\xf8\xff\0\0\0\0\x18\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x61\0\0\0\0\0\0\xb7\
-\x02\0\0\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\0\0\0\0\0\
-\0\xbf\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\
-\0\0\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\
-\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\
-\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x70\0\
-\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\
-\0\x15\x06\x1d\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\x79\x67\0\0\0\0\0\0\x61\
-\x61\x10\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\xc7\x01\0\0\x20\0\0\0\x7b\x1a\xf8\xff\
-\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\x40\0\0\0\0\
-\0\0\0\0\0\0\0\xb7\x02\0\0\x22\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x08\0\0\0\0\0\
-\x18\x01\0\0\xff\xff\xff\xff\0\0\0\0\xff\0\0\0\x5f\x17\0\0\0\0\0\0\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\0\x01\0\0\x4f\x17\0\0\0\0\0\0\x87\x07\0\0\0\0\0\0\xdb\x70\0\0\
-\0\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\x70\0\0\0\0\0\x79\x11\x68\
-\0\0\0\0\0\x2f\x21\0\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\x06\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x79\x61\0\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\
-\x85\0\0\0\x05\0\0\0\x79\x61\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\
-\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\
-\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
-\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\
-\0\0\x95\0\0\0\0\0\0\0\x79\x17\x68\0\0\0\0\0\x79\x11\x70\0\0\0\0\0\x7b\x1a\xf0\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\x1d\0\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x85\0\0\0\x03\0\0\0\x79\x68\0\0\0\0\0\0\x61\x61\x10\0\0\0\0\0\x67\x01\
-\0\0\x20\0\0\0\xc7\x01\0\0\x20\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\
-\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
-\x01\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\
-\0\x22\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x08\0\0\0\0\0\x18\x01\0\0\xff\xff\xff\
-\xff\0\0\0\0\xff\0\0\0\x5f\x18\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\x01\0\
-\0\x4f\x18\0\0\0\0\0\0\x87\x08\0\0\0\0\0\0\xdb\x80\0\0\0\0\0\0\x7b\x7a\xf8\xff\
-\0\0\0\0\x18\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x61\0\0\0\0\0\0\xb7\x02\0\0\
-\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\0\0\0\0\0\0\xbf\
-\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\
-\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf0\xff\0\
-\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\
-\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\
-\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x68\0\0\0\0\
-\0\x7b\x1a\xf8\xff\0\0\0\0\x18\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x61\0\0\0\0\
-\0\0\xb7\x02\0\0\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\0\
-\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\
-\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\
-\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\
-\0\0\0\0\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\
-\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\
-\x11\x70\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\
-\0\0\0\0\0\x15\x06\x1d\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\x79\x67\0\0\0\0\0\
-\0\x61\x61\x10\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\xc7\x01\0\0\x20\0\0\0\x7b\x1a\
-\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\x40\
-\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x22\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x08\0\0\
-\0\0\0\x18\x01\0\0\xff\xff\xff\xff\0\0\0\0\xff\0\0\0\x5f\x17\0\0\0\0\0\0\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\x4f\x17\0\0\0\0\0\0\x87\x07\0\0\0\0\0\0\xdb\
-\x70\0\0\0\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x16\x60\0\0\0\0\0\x79\
-\x11\x70\0\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\
-\0\0\x7b\x0a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xe0\xff\xff\xff\
-\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xe8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x7b\x6a\xf8\xff\0\0\0\0\x18\x06\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x61\0\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x2d\x12\
-\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x3f\
-\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\0\
-\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\
-\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\
-\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x68\0\0\0\0\0\x7b\x1a\xf8\xff\0\
-\0\0\0\x18\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x61\0\0\0\0\0\0\xb7\x02\0\0\x02\
-\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\0\0\0\0\0\0\xbf\x02\0\
-\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\
-\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\
-\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\
-\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x70\0\0\0\0\0\x7b\
-\x1a\xf8\xff\0\0\0\0\x18\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x61\0\0\0\0\0\0\
-\xb7\x02\0\0\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x61\0\0\0\
-\0\0\0\xbf\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\
-\0\0\0\0\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\
-\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\
-\0\0\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\
-\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\
-\x68\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\
-\x61\0\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\
-\0\x79\x61\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\
-\0\0\x1f\x20\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\
-\0\0\0\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\
-\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\
-\0\0\x79\x11\x70\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\x06\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x79\x61\0\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\
-\0\0\x05\0\0\0\x79\x61\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\
-\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\
-\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\
-\0\x95\0\0\0\0\0\0\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\0\0\
-\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\
-\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\xff\xff\
-\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\
-\xff\xff\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xbf\x16\0\0\0\0\0\0\x85\0\
-\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x7b\x0a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\
-\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\
-\0\0\0\xbf\x07\0\0\0\0\0\0\x15\x07\x0e\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
-\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\x79\
-\x73\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf0\xff\xff\xff\xb7\x02\0\0\
-\x08\0\0\0\x85\0\0\0\x70\0\0\0\x55\0\x03\0\0\0\0\0\x79\xa2\xf0\xff\0\0\0\0\xbf\
-\x61\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\
-\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\
-\0\0\0\0\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\0\0\0\0\0\0\0\
-\x95\0\0\0\0\0\0\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\0\0\0\
-\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\x50\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\
-\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xbf\x16\0\0\0\0\0\0\xb7\x01\0\0\x10\0\0\0\
-\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\
-\xff\xff\xff\xb7\x02\0\0\x08\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x20\0\0\0\
-\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\x79\xa7\xf8\xff\0\0\0\0\xbf\xa1\0\0\0\
-\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\0\x08\0\0\0\x85\0\0\0\x71\0\0\0\
-\x79\xa1\xf8\xff\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\x08\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x79\x81\0\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\
-\0\x05\0\0\0\x79\x81\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\
-\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\
-\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x61\0\0\0\0\
-\0\0\xbf\x72\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\
-\0\0\0\0\0\xbf\x13\0\0\0\0\0\0\xb7\x01\0\0\x10\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\
-\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\0\x08\0\0\0\x85\0\0\0\
-\x71\0\0\0\x79\xa1\xf8\xff\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\
-\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\
-\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\x1d\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
-\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\0\x79\
-\x67\0\0\0\0\0\0\x61\x61\x10\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\xc7\x01\0\0\x20\0\
-\0\0\x7b\x1a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\
-\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\x05\0\0\0\0\0\
-\x18\x01\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x22\0\0\0\x85\0\0\0\x06\0\0\
-\0\x05\0\x08\0\0\0\0\0\x18\x01\0\0\xff\xff\xff\xff\0\0\0\0\xff\0\0\0\x5f\x17\0\
-\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\x4f\x17\0\0\0\0\0\0\x87\x07\0\
-\0\0\0\0\0\xdb\x70\0\0\0\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xbf\x16\0\0\
-\0\0\0\0\xb7\x01\0\0\x10\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\
-\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\0\x08\0\0\0\x85\0\0\0\x71\0\
-\0\0\xb7\x01\0\0\x20\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\x79\xa7\xf8\
-\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\0\x08\0\
-\0\0\x85\0\0\0\x71\0\0\0\x79\xa1\xf8\xff\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\
-\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x81\0\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x2d\
-\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x81\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\
-\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\
-\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\xbf\x61\0\0\0\0\0\0\xbf\x72\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\
-\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xbf\x13\0\0\0\0\0\0\xb7\x01\0\0\x10\0\0\0\x0f\
-\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\0\
-\x08\0\0\0\x85\0\0\0\x71\0\0\0\x79\xa1\xf8\xff\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\x1d\0\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x03\0\0\0\x79\x67\0\0\0\0\0\0\x61\x61\x10\0\0\0\0\0\x67\x01\0\0\x20\0\0\
-\0\xc7\x01\0\0\x20\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
-\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\
-\0\x05\0\0\0\0\0\x18\x01\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x22\0\0\0\
-\x85\0\0\0\x06\0\0\0\x05\0\x08\0\0\0\0\0\x18\x01\0\0\xff\xff\xff\xff\0\0\0\0\
-\xff\0\0\0\x5f\x17\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\x4f\x17\0\
-\0\0\0\0\0\x87\x07\0\0\0\0\0\0\xdb\x70\0\0\0\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\
-\0\0\0\0\xbf\x16\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\
-\0\0\0\x61\x62\x10\0\0\0\0\0\x6f\x21\0\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x18\
-\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x71\0\0\0\0\0\0\xb7\x02\0\0\x02\0\0\0\x2d\
-\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x71\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\
-\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\x0b\0\0\0\0\
-\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\x79\x62\x08\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\
-\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x08\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\
-\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\x1d\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x85\0\0\0\x03\0\0\0\x79\x67\0\0\0\0\0\0\x61\x61\x10\0\0\0\0\0\x67\x01\0\0\
-\x20\0\0\0\xc7\x01\0\0\x20\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\
-\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\
-\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\
-\x22\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x08\0\0\0\0\0\x18\x01\0\0\xff\xff\xff\xff\
-\0\0\0\0\xff\0\0\0\x5f\x17\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\
-\x4f\x17\0\0\0\0\0\0\x87\x07\0\0\0\0\0\0\xdb\x70\0\0\0\0\0\0\xb7\0\0\0\0\0\0\0\
-\x95\0\0\0\0\0\0\0\xbf\x16\0\0\0\0\0\0\x79\x61\x40\0\0\0\0\0\x7b\x1a\xf8\xff\0\
-\0\0\0\x18\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x71\0\0\0\0\0\0\xb7\x02\0\0\x02\
-\0\0\0\x2d\x12\x07\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\x71\0\0\0\0\0\0\xbf\x02\0\
-\0\0\0\0\0\x3f\x12\0\0\0\0\0\0\x2f\x12\0\0\0\0\0\0\x1f\x20\0\0\0\0\0\0\x55\0\
-\x0b\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x77\0\0\0\x20\0\0\0\x63\x0a\xf4\xff\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\
-\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\
-\0\0\0\x02\0\0\0\x79\x62\x38\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x85\x10\0\0\xff\xff\
-\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x18\0\0\0\0\0\x7b\x1a\xf0\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\x1d\0\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x85\0\0\0\x03\0\0\0\x79\x67\0\0\0\0\0\0\x61\x61\x10\0\0\0\0\0\x67\x01\
-\0\0\x20\0\0\0\xc7\x01\0\0\x20\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\
-\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
-\x01\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\
-\0\x22\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x08\0\0\0\0\0\x18\x01\0\0\xff\xff\xff\
-\xff\0\0\0\0\xff\0\0\0\x5f\x17\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\x01\0\
-\0\x4f\x17\0\0\0\0\0\0\x87\x07\0\0\0\0\0\0\xdb\x70\0\0\0\0\0\0\xb7\0\0\0\0\0\0\
-\0\x95\0\0\0\0\0\0\0\x02\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\
-\x6c\x6c\x6f\x63\x73\x20\x75\x70\x64\x61\x74\x65\x20\x66\x61\x69\x6c\x65\x64\
-\x2c\x20\x65\x72\x72\x6f\x72\x20\x63\x6f\x64\x65\x20\x69\x73\x20\x25\x69\x0a\0\
-\x66\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x63\x6f\
-\x6d\x62\x69\x6e\x65\x64\x20\x61\x6c\x6c\x6f\x63\x73\x0a\0\x44\x75\x61\x6c\x20\
-\x42\x53\x44\x2f\x47\x50\x4c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\
-\x90\0\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\xc8\0\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\
-\x10\x01\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\x50\x01\0\0\0\0\0\0\x01\0\0\0\x3d\0\0\
-\0\xb0\x01\0\0\0\0\0\0\x01\0\0\0\x45\0\0\0\xe0\x01\0\0\0\0\0\0\x01\0\0\0\x45\0\
-\0\0\xf0\x01\0\0\0\0\0\0\x01\0\0\0\x3e\0\0\0\x30\x02\0\0\0\0\0\0\x01\0\0\0\x45\
-\0\0\0\x10\0\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xa8\0\0\0\0\0\0\0\x01\0\0\0\x41\0\
-\0\0\xf8\0\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\x30\x01\0\0\0\0\0\0\x01\0\0\0\x44\0\
-\0\0\x80\x01\0\0\0\0\0\0\x01\0\0\0\x45\0\0\0\xa0\x01\0\0\0\0\0\0\x01\0\0\0\x3d\
-\0\0\0\x38\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xd0\x02\0\0\0\0\0\0\x01\0\0\0\
-\x41\0\0\0\x28\x03\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\x60\x03\0\0\0\0\0\0\x01\0\0\
-\0\x44\0\0\0\xb0\x03\0\0\0\0\0\0\x01\0\0\0\x45\0\0\0\xd0\x03\0\0\0\0\0\0\x01\0\
-\0\0\x3d\0\0\0\x40\x04\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xd8\x04\0\0\0\0\0\0\x01\
-\0\0\0\x41\0\0\0\x18\x05\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xb0\x05\0\0\0\0\0\0\
-\x01\0\0\0\x41\0\0\0\0\x06\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\x38\x06\0\0\0\0\0\0\
-\x01\0\0\0\x44\0\0\0\x88\x06\0\0\0\0\0\0\x01\0\0\0\x45\0\0\0\xa8\x06\0\0\0\0\0\
-\0\x01\0\0\0\x3d\0\0\0\x70\x07\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x98\x07\0\0\0\0\
-\0\0\x01\0\0\0\x40\0\0\0\x30\x08\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x70\x08\0\0\0\
-\0\0\0\x01\0\0\0\x40\0\0\0\x08\x09\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x48\x09\0\0\
-\0\0\0\0\x01\0\0\0\x40\0\0\0\xe0\x09\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x20\x0a\0\
-\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xb8\x0a\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\xf8\x0a\
-\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\x90\x0b\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x08\0\
-\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x28\0\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x48\0\0\
-\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x68\0\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\xb0\0\0\0\
-\0\0\0\0\x01\0\0\0\x4e\0\0\0\xe8\0\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x40\x01\0\0\
-\0\0\0\0\x0a\0\0\0\x02\0\0\0\x60\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x80\x01\0\
-\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\xa0\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\xc0\x01\
-\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x90\0\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\x28\x01\
-\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x58\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x58\0\
-\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\x90\0\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\xe0\0\0\
-\0\0\0\0\0\x01\0\0\0\x45\0\0\0\0\x01\0\0\0\0\0\0\x01\0\0\0\x3d\0\0\0\x90\0\0\0\
-\0\0\0\0\x01\0\0\0\x40\0\0\0\x28\x01\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\x58\x01\0\
-\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x58\0\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\x90\0\0\0\
-\0\0\0\0\x01\0\0\0\x44\0\0\0\xe0\0\0\0\0\0\0\0\x01\0\0\0\x45\0\0\0\0\x01\0\0\0\
-\0\0\0\x01\0\0\0\x3d\0\0\0\x08\0\0\0\0\0\0\0\x01\0\0\0\x5e\0\0\0\x38\0\0\0\0\0\
-\0\0\x01\0\0\0\x40\0\0\0\xd0\0\0\0\0\0\0\0\x01\0\0\0\x41\0\0\0\0\x01\0\0\0\0\0\
-\0\x0a\0\0\0\x02\0\0\0\x20\0\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\x58\0\0\0\0\0\0\0\
-\x01\0\0\0\x44\0\0\0\xa8\0\0\0\0\0\0\0\x01\0\0\0\x45\0\0\0\xc8\0\0\0\0\0\0\0\
-\x01\0\0\0\x3d\0\0\0\x18\0\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xb0\0\0\0\0\0\0\0\
-\x01\0\0\0\x41\0\0\0\xe0\0\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x20\0\0\0\0\0\0\0\
-\x01\0\0\0\x44\0\0\0\x58\0\0\0\0\0\0\0\x01\0\0\0\x44\0\0\0\xa8\0\0\0\0\0\0\0\
-\x01\0\0\0\x45\0\0\0\xc8\0\0\0\0\0\0\0\x01\0\0\0\x3d\0\0\0\x9f\xeb\x01\0\x18\0\
-\0\0\0\0\0\0\x34\x0c\0\0\x34\x0c\0\0\x0c\x16\0\0\0\0\0\0\0\0\0\x02\x03\0\0\0\
-\x01\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\
-\x04\0\0\0\x01\0\0\0\x05\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\
-\x06\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\
-\0\x02\x08\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\
-\0\0\0\0\x02\x0a\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x28\0\0\
-\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\
-\x40\0\0\0\x27\0\0\0\x07\0\0\0\x80\0\0\0\x32\0\0\0\x09\0\0\0\xc0\0\0\0\x3e\0\0\
-\0\0\0\0\x0e\x0b\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x0e\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x02\0\0\0\x04\0\0\0\x18\0\0\0\0\0\0\0\0\0\0\x02\x10\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\xa0\x86\x01\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\
-\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x07\0\0\0\x40\0\0\0\x27\0\0\0\x0d\0\0\0\
-\x80\0\0\0\x32\0\0\0\x0f\0\0\0\xc0\0\0\0\x44\0\0\0\0\0\0\x0e\x11\0\0\0\x01\0\0\
-\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x07\0\0\
-\0\x40\0\0\0\x27\0\0\0\x07\0\0\0\x80\0\0\0\x32\0\0\0\x09\0\0\0\xc0\0\0\0\x4b\0\
-\0\0\0\0\0\x0e\x13\0\0\0\x01\0\0\0\x5b\0\0\0\0\0\0\x0e\x13\0\0\0\x01\0\0\0\0\0\
-\0\0\0\0\0\x02\x17\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x07\0\0\
-\0\0\0\0\0\0\0\0\x02\x19\0\0\0\x63\0\0\0\0\0\0\x08\x1a\0\0\0\x67\0\0\0\0\0\0\
-\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x1c\0\0\0\x74\0\0\0\0\0\0\x01\x08\0\
-\0\0\x40\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x16\0\0\0\0\0\0\0\x82\0\
-\0\0\x18\0\0\0\x40\0\0\0\x86\0\0\0\x1b\0\0\0\x80\0\0\0\x32\0\0\0\x09\0\0\0\xc0\
-\0\0\0\x8c\0\0\0\0\0\0\x0e\x1d\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x20\0\0\0\x99\
-\0\0\0\x15\0\0\x04\xa8\0\0\0\xa1\0\0\0\x1c\0\0\0\0\0\0\0\xa5\0\0\0\x1c\0\0\0\
-\x40\0\0\0\xa9\0\0\0\x1c\0\0\0\x80\0\0\0\xad\0\0\0\x1c\0\0\0\xc0\0\0\0\xb1\0\0\
-\0\x1c\0\0\0\0\x01\0\0\xb4\0\0\0\x1c\0\0\0\x40\x01\0\0\xb7\0\0\0\x1c\0\0\0\x80\
-\x01\0\0\xbb\0\0\0\x1c\0\0\0\xc0\x01\0\0\xbf\0\0\0\x1c\0\0\0\0\x02\0\0\xc2\0\0\
-\0\x1c\0\0\0\x40\x02\0\0\xc5\0\0\0\x1c\0\0\0\x80\x02\0\0\xc8\0\0\0\x1c\0\0\0\
-\xc0\x02\0\0\xcb\0\0\0\x1c\0\0\0\0\x03\0\0\xce\0\0\0\x1c\0\0\0\x40\x03\0\0\xd1\
-\0\0\0\x1c\0\0\0\x80\x03\0\0\xd4\0\0\0\x1c\0\0\0\xc0\x03\0\0\xdc\0\0\0\x1c\0\0\
-\0\0\x04\0\0\xdf\0\0\0\x1c\0\0\0\x40\x04\0\0\xe2\0\0\0\x1c\0\0\0\x80\x04\0\0\
-\xe8\0\0\0\x1c\0\0\0\xc0\x04\0\0\xeb\0\0\0\x1c\0\0\0\0\x05\0\0\0\0\0\0\x01\0\0\
-\x0d\x02\0\0\0\xee\0\0\0\x1f\0\0\0\xf2\0\0\0\x01\0\0\x0c\x21\0\0\0\xff\0\0\0\
-\x01\0\0\x0c\x21\0\0\0\x0b\x01\0\0\x01\0\0\x0c\x21\0\0\0\x16\x01\0\0\x01\0\0\
-\x0c\x21\0\0\0\x23\x01\0\0\x01\0\0\x0c\x21\0\0\0\x2f\x01\0\0\x01\0\0\x0c\x21\0\
-\0\0\x3d\x01\0\0\x01\0\0\x0c\x21\0\0\0\x4a\x01\0\0\x01\0\0\x0c\x21\0\0\0\x55\
-\x01\0\0\x01\0\0\x0c\x21\0\0\0\x5f\x01\0\0\x01\0\0\x0c\x21\0\0\0\x6c\x01\0\0\
-\x01\0\0\x0c\x21\0\0\0\x81\x01\0\0\x01\0\0\x0c\x21\0\0\0\x95\x01\0\0\x01\0\0\
-\x0c\x21\0\0\0\xa9\x01\0\0\x01\0\0\x0c\x21\0\0\0\xbc\x01\0\0\x01\0\0\x0c\x21\0\
-\0\0\xc9\x01\0\0\x01\0\0\x0c\x21\0\0\0\xd5\x01\0\0\x01\0\0\x0c\x21\0\0\0\xe4\
-\x01\0\0\x01\0\0\x0c\x21\0\0\0\xf2\x01\0\0\x01\0\0\x0c\x21\0\0\0\0\x02\0\0\x01\
-\0\0\x0c\x21\0\0\0\0\0\0\0\0\0\0\x02\x37\0\0\0\x0d\x02\0\0\x08\0\0\x04\x38\0\0\
-\0\x25\x02\0\0\x38\0\0\0\0\0\0\0\x29\x02\0\0\x1c\0\0\0\x40\0\0\0\x33\x02\0\0\
-\x3b\0\0\0\x80\0\0\0\x37\x02\0\0\x3d\0\0\0\xc0\0\0\0\x41\x02\0\0\x3d\0\0\0\0\
-\x01\0\0\x4d\x02\0\0\x1c\0\0\0\x40\x01\0\0\x57\x02\0\0\x02\0\0\0\x80\x01\0\0\
-\x5c\x02\0\0\x41\0\0\0\xa0\x01\0\0\x63\x02\0\0\x04\0\0\x04\x08\0\0\0\x19\0\0\0\
-\x39\0\0\0\0\0\0\0\xe2\0\0\0\x3a\0\0\0\x10\0\0\0\x6f\x02\0\0\x3a\0\0\0\x18\0\0\
-\0\x7d\x02\0\0\x02\0\0\0\x20\0\0\0\x81\x02\0\0\0\0\0\x01\x02\0\0\0\x10\0\0\0\
-\x90\x02\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\x02\x3c\0\0\0\0\0\0\0\
-\0\0\0\x0a\0\0\0\0\x9e\x02\0\0\0\0\0\x08\x3e\0\0\0\xa5\x02\0\0\0\0\0\x08\x3f\0\
-\0\0\xb5\x02\0\0\0\0\0\x08\x1c\0\0\0\xc6\x02\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\
-\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x40\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\x0d\
-\x02\0\0\0\xee\0\0\0\x36\0\0\0\xcb\x02\0\0\x01\0\0\x0c\x42\0\0\0\0\0\0\0\0\0\0\
-\x02\0\0\0\0\xdc\x02\0\0\0\0\0\x08\x46\0\0\0\xe0\x02\0\0\0\0\0\x01\x08\0\0\0\
-\x40\0\0\0\0\0\0\0\x02\0\0\x0d\x02\0\0\0\xee\0\0\0\x44\0\0\0\xf3\x02\0\0\x45\0\
-\0\0\xfb\x02\0\0\0\0\0\x0c\x47\0\0\0\0\0\0\0\0\0\0\x02\x4a\0\0\0\x0b\x03\0\0\
-\x04\0\0\x04\x18\0\0\0\x25\x02\0\0\x38\0\0\0\0\0\0\0\x29\x02\0\0\x1c\0\0\0\x40\
-\0\0\0\x33\x02\0\0\x3b\0\0\0\x80\0\0\0\x5c\x02\0\0\x41\0\0\0\xc0\0\0\0\0\0\0\0\
-\x01\0\0\x0d\x02\0\0\0\xee\0\0\0\x49\0\0\0\x21\x03\0\0\x01\0\0\x0c\x4b\0\0\0\0\
-\0\0\0\0\0\0\x02\x4e\0\0\0\x30\x03\0\0\x09\0\0\x04\x38\0\0\0\x25\x02\0\0\x38\0\
-\0\0\0\0\0\0\x29\x02\0\0\x1c\0\0\0\x40\0\0\0\x33\x02\0\0\x3b\0\0\0\x80\0\0\0\
-\x37\x02\0\0\x3d\0\0\0\xc0\0\0\0\x41\x02\0\0\x3d\0\0\0\0\x01\0\0\x4d\x02\0\0\
-\x1c\0\0\0\x40\x01\0\0\x57\x02\0\0\x02\0\0\0\x80\x01\0\0\x51\x03\0\0\x4f\0\0\0\
-\xa0\x01\0\0\x5c\x02\0\0\x41\0\0\0\xa8\x01\0\0\x5b\x03\0\0\0\0\0\x08\x50\0\0\0\
-\x60\x03\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x04\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xee\
-\0\0\0\x4d\0\0\0\x66\x03\0\0\x01\0\0\x0c\x51\0\0\0\0\0\0\0\0\0\0\x02\x54\0\0\0\
-\x85\x03\0\0\x05\0\0\x04\x20\0\0\0\x25\x02\0\0\x38\0\0\0\0\0\0\0\x29\x02\0\0\
-\x1c\0\0\0\x40\0\0\0\x33\x02\0\0\x3b\0\0\0\x80\0\0\0\xa5\x03\0\0\x55\0\0\0\xc0\
-\0\0\0\x5c\x02\0\0\x41\0\0\0\xe0\0\0\0\x63\0\0\0\0\0\0\x08\x56\0\0\0\xb5\x03\0\
-\0\0\0\0\x08\x1a\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xee\0\0\0\x53\0\0\0\xbb\
-\x03\0\0\x01\0\0\x0c\x57\0\0\0\0\0\0\0\0\0\0\x02\x5a\0\0\0\xd4\x03\0\0\x06\0\0\
-\x04\x28\0\0\0\x25\x02\0\0\x38\0\0\0\0\0\0\0\xf2\x03\0\0\x1c\0\0\0\x40\0\0\0\
-\xf6\x03\0\0\x1a\0\0\0\x80\0\0\0\x4d\x02\0\0\x1c\0\0\0\xc0\0\0\0\xfc\x03\0\0\
-\x02\0\0\0\0\x01\0\0\x5c\x02\0\0\x41\0\0\0\x20\x01\0\0\0\0\0\0\x01\0\0\x0d\x02\
-\0\0\0\xee\0\0\0\x59\0\0\0\x08\x04\0\0\x01\0\0\x0c\x5b\0\0\0\0\0\0\0\0\0\0\x02\
-\x5e\0\0\0\x1f\x04\0\0\x04\0\0\x04\x18\0\0\0\x25\x02\0\0\x38\0\0\0\0\0\0\0\xf2\
-\x03\0\0\x1c\0\0\0\x40\0\0\0\xf6\x03\0\0\x1a\0\0\0\x80\0\0\0\x5c\x02\0\0\x41\0\
-\0\0\xa0\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xee\0\0\0\x5d\0\0\0\x3c\x04\0\0\
-\x01\0\0\x0c\x5f\0\0\0\0\0\0\0\0\0\0\x02\x62\0\0\0\x52\x04\0\0\x0c\0\0\x04\x50\
-\0\0\0\x25\x02\0\0\x38\0\0\0\0\0\0\0\x29\x02\0\0\x1c\0\0\0\x40\0\0\0\x76\x04\0\
-\0\x4f\0\0\0\x80\0\0\0\x7f\x04\0\0\x4f\0\0\0\x88\0\0\0\x89\x04\0\0\x3d\0\0\0\
-\xc0\0\0\0\x8e\x04\0\0\x3d\0\0\0\0\x01\0\0\x94\x04\0\0\x44\0\0\0\x40\x01\0\0\
-\x9e\x04\0\0\x02\0\0\0\x80\x01\0\0\x33\x02\0\0\x44\0\0\0\xc0\x01\0\0\x41\x02\0\
-\0\x3d\0\0\0\0\x02\0\0\x4d\x02\0\0\x1c\0\0\0\x40\x02\0\0\x5c\x02\0\0\x41\0\0\0\
-\x80\x02\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xee\0\0\0\x61\0\0\0\xa2\x04\0\0\x01\
-\0\0\x0c\x63\0\0\0\0\0\0\0\0\0\0\x02\x66\0\0\0\xbf\x04\0\0\x05\0\0\x04\x20\0\0\
-\0\x25\x02\0\0\x38\0\0\0\0\0\0\0\x94\x04\0\0\x44\0\0\0\x40\0\0\0\x9e\x04\0\0\
-\x02\0\0\0\x80\0\0\0\x33\x02\0\0\x44\0\0\0\xc0\0\0\0\x5c\x02\0\0\x41\0\0\0\0\
-\x01\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xee\0\0\0\x65\0\0\0\xe2\x04\0\0\x01\0\0\
-\x0c\x67\0\0\0\0\0\0\0\0\0\0\x0a\x6a\0\0\0\0\0\0\0\0\0\0\x09\x45\0\0\0\xfe\x04\
-\0\0\0\0\0\x0e\x69\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x0a\x6d\0\0\0\0\0\0\0\0\0\0\
-\x09\x3d\0\0\0\x0a\x05\0\0\0\0\0\x0e\x6c\0\0\0\x01\0\0\0\x14\x05\0\0\0\0\0\x0e\
-\x69\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x40\0\0\0\x04\0\0\0\x0d\0\0\0\
-\x20\x05\0\0\0\0\0\x0e\x70\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x0a\x40\0\0\0\0\0\0\0\
-\0\0\0\x03\0\0\0\0\x72\0\0\0\x04\0\0\0\x28\0\0\0\x28\x05\0\0\0\0\0\x0e\x73\0\0\
-\0\0\0\0\0\x40\x05\0\0\x02\0\0\x05\x08\0\0\0\0\0\0\0\x76\0\0\0\0\0\0\0\x54\x05\
-\0\0\x45\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x84\x08\0\0\0\x59\x05\0\0\x45\0\0\0\0\0\
-\0\x28\x64\x05\0\0\x45\0\0\0\x28\0\0\x18\x75\x05\0\0\0\0\0\x0e\x75\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x03\0\0\0\0\x72\0\0\0\x04\0\0\0\x22\0\0\0\x83\x05\0\0\0\0\0\
-\x0e\x78\0\0\0\0\0\0\0\xe5\x14\0\0\x05\0\0\x0f\x62\0\0\0\x6b\0\0\0\0\0\0\0\x08\
-\0\0\0\x6e\0\0\0\x08\0\0\0\x08\0\0\0\x6f\0\0\0\x10\0\0\0\x08\0\0\0\x74\0\0\0\
-\x18\0\0\0\x28\0\0\0\x79\0\0\0\x40\0\0\0\x22\0\0\0\xed\x14\0\0\x01\0\0\x0f\x0d\
-\0\0\0\x71\0\0\0\0\0\0\0\x0d\0\0\0\xf5\x14\0\0\x05\0\0\x0f\xa0\0\0\0\x0c\0\0\0\
-\0\0\0\0\x20\0\0\0\x12\0\0\0\x20\0\0\0\x20\0\0\0\x14\0\0\0\x40\0\0\0\x20\0\0\0\
-\x15\0\0\0\x60\0\0\0\x20\0\0\0\x1e\0\0\0\x80\0\0\0\x20\0\0\0\xfb\x14\0\0\x01\0\
-\0\x0f\x08\0\0\0\x77\0\0\0\0\0\0\0\x08\0\0\0\0\x69\x6e\x74\0\x5f\x5f\x41\x52\
-\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\0\x74\x79\x70\x65\
-\0\x6b\x65\x79\x5f\x73\x69\x7a\x65\0\x76\x61\x6c\x75\x65\x5f\x73\x69\x7a\x65\0\
-\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x73\x69\x7a\x65\x73\0\x61\x6c\
-\x6c\x6f\x63\x73\0\x63\x6f\x6d\x62\x69\x6e\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x73\
-\0\x6d\x65\x6d\x70\x74\x72\x73\0\x75\x33\x32\0\x75\x6e\x73\x69\x67\x6e\x65\x64\
-\x20\x69\x6e\x74\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\0\x6b\
-\x65\x79\0\x76\x61\x6c\x75\x65\0\x73\x74\x61\x63\x6b\x5f\x74\x72\x61\x63\x65\
-\x73\0\x70\x74\x5f\x72\x65\x67\x73\0\x72\x31\x35\0\x72\x31\x34\0\x72\x31\x33\0\
-\x72\x31\x32\0\x62\x70\0\x62\x78\0\x72\x31\x31\0\x72\x31\x30\0\x72\x39\0\x72\
-\x38\0\x61\x78\0\x63\x78\0\x64\x78\0\x73\x69\0\x64\x69\0\x6f\x72\x69\x67\x5f\
-\x61\x78\0\x69\x70\0\x63\x73\0\x66\x6c\x61\x67\x73\0\x73\x70\0\x73\x73\0\x63\
-\x74\x78\0\x6d\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x6d\x61\x6c\x6c\
-\x6f\x63\x5f\x65\x78\x69\x74\0\x66\x72\x65\x65\x5f\x65\x6e\x74\x65\x72\0\x63\
-\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x63\x61\x6c\x6c\x6f\x63\x5f\x65\
-\x78\x69\x74\0\x72\x65\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x72\x65\
-\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\0\x6d\x6d\x61\x70\x5f\x65\x6e\x74\x65\
-\x72\0\x6d\x6d\x61\x70\x5f\x65\x78\x69\x74\0\x6d\x75\x6e\x6d\x61\x70\x5f\x65\
-\x6e\x74\x65\x72\0\x70\x6f\x73\x69\x78\x5f\x6d\x65\x6d\x61\x6c\x69\x67\x6e\x5f\
-\x65\x6e\x74\x65\x72\0\x70\x6f\x73\x69\x78\x5f\x6d\x65\x6d\x61\x6c\x69\x67\x6e\
-\x5f\x65\x78\x69\x74\0\x61\x6c\x69\x67\x6e\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x5f\
-\x65\x6e\x74\x65\x72\0\x61\x6c\x69\x67\x6e\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x5f\
-\x65\x78\x69\x74\0\x76\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x76\x61\
-\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\0\x6d\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\
-\x6e\x74\x65\x72\0\x6d\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\x78\x69\x74\0\x70\
-\x76\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\0\x70\x76\x61\x6c\x6c\x6f\x63\
-\x5f\x65\x78\x69\x74\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\
-\x77\x5f\x6b\x6d\x61\x6c\x6c\x6f\x63\0\x65\x6e\x74\0\x63\x61\x6c\x6c\x5f\x73\
-\x69\x74\x65\0\x70\x74\x72\0\x62\x79\x74\x65\x73\x5f\x72\x65\x71\0\x62\x79\x74\
-\x65\x73\x5f\x61\x6c\x6c\x6f\x63\0\x67\x66\x70\x5f\x66\x6c\x61\x67\x73\0\x6e\
-\x6f\x64\x65\0\x5f\x5f\x64\x61\x74\x61\0\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\
-\x72\x79\0\x70\x72\x65\x65\x6d\x70\x74\x5f\x63\x6f\x75\x6e\x74\0\x70\x69\x64\0\
-\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\x68\x6f\x72\x74\0\x75\x6e\x73\x69\x67\
-\x6e\x65\x64\x20\x63\x68\x61\x72\0\x73\x69\x7a\x65\x5f\x74\0\x5f\x5f\x6b\x65\
-\x72\x6e\x65\x6c\x5f\x73\x69\x7a\x65\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\
-\x5f\x75\x6c\x6f\x6e\x67\x5f\x74\0\x63\x68\x61\x72\0\x6d\x65\x6d\x6c\x65\x61\
-\x6b\x5f\x5f\x6b\x6d\x61\x6c\x6c\x6f\x63\0\x75\x36\x34\0\x75\x6e\x73\x69\x67\
-\x6e\x65\x64\x20\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x61\x64\x64\x72\x65\x73\
-\x73\0\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x32\0\x74\x72\
-\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6b\x66\x72\x65\x65\0\
-\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6b\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\
-\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\
-\x68\x65\x5f\x61\x6c\x6c\x6f\x63\0\x61\x63\x63\x6f\x75\x6e\x74\x65\x64\0\x62\
-\x6f\x6f\x6c\0\x5f\x42\x6f\x6f\x6c\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6b\
-\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x61\x6c\x6c\x6f\x63\x5f\x6e\x6f\x64\
-\x65\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6b\x6d\
-\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\x5f\x5f\x64\x61\x74\x61\
-\x5f\x6c\x6f\x63\x5f\x6e\x61\x6d\x65\0\x5f\x5f\x75\x33\x32\0\x6d\x65\x6d\x6c\
-\x65\x61\x6b\x5f\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\
-\x65\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6d\x6d\
-\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\x63\0\x70\x66\x6e\0\x6f\x72\x64\x65\
-\x72\0\x6d\x69\x67\x72\x61\x74\x65\x74\x79\x70\x65\0\x6d\x65\x6d\x6c\x65\x61\
-\x6b\x5f\x5f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\
-\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6d\x6d\x5f\x70\x61\x67\
-\x65\x5f\x66\x72\x65\x65\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6d\x6d\x5f\x70\
-\x61\x67\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\
-\x5f\x72\x61\x77\x5f\x70\x65\x72\x63\x70\x75\x5f\x61\x6c\x6c\x6f\x63\x5f\x70\
-\x65\x72\x63\x70\x75\0\x72\x65\x73\x65\x72\x76\x65\x64\0\x69\x73\x5f\x61\x74\
-\x6f\x6d\x69\x63\0\x73\x69\x7a\x65\0\x61\x6c\x69\x67\x6e\0\x62\x61\x73\x65\x5f\
-\x61\x64\x64\x72\0\x6f\x66\x66\0\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x70\x65\
-\x72\x63\x70\x75\x5f\x61\x6c\x6c\x6f\x63\x5f\x70\x65\x72\x63\x70\x75\0\x74\x72\
-\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x70\x65\x72\x63\x70\
-\x75\x5f\x66\x72\x65\x65\x5f\x70\x65\x72\x63\x70\x75\0\x6d\x65\x6d\x6c\x65\x61\
-\x6b\x5f\x5f\x70\x65\x72\x63\x70\x75\x5f\x66\x72\x65\x65\x5f\x70\x65\x72\x63\
-\x70\x75\0\x73\x61\x6d\x70\x6c\x65\x5f\x72\x61\x74\x65\0\x70\x61\x67\x65\x5f\
-\x73\x69\x7a\x65\0\x73\x74\x61\x63\x6b\x5f\x66\x6c\x61\x67\x73\0\x4c\x49\x43\
-\x45\x4e\x53\x45\0\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x32\
-\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x63\x6f\x6d\x62\x69\x6e\x65\x64\x5f\x61\x6c\
-\x6c\x6f\x63\x5f\x69\x6e\x66\x6f\0\x62\x69\x74\x73\0\x74\x6f\x74\x61\x6c\x5f\
-\x73\x69\x7a\x65\0\x6e\x75\x6d\x62\x65\x72\x5f\x6f\x66\x5f\x61\x6c\x6c\x6f\x63\
-\x73\0\x69\x6e\x69\x74\x69\x61\x6c\x5f\x63\x69\x6e\x66\x6f\0\x75\x70\x64\x61\
-\x74\x65\x5f\x73\x74\x61\x74\x69\x73\x74\x69\x63\x73\x5f\x64\x65\x6c\x2e\x5f\
-\x5f\x5f\x5f\x66\x6d\x74\0\x2f\x68\x6f\x6d\x65\x2f\x6e\x65\x30\x2f\x73\x79\x73\
-\x5f\x63\x6f\x6d\x70\x65\x74\x69\x74\x69\x6f\x6e\x2f\x73\x74\x61\x72\x74\x2f\
-\x63\x70\x75\x5f\x77\x61\x74\x63\x68\x65\x72\x2f\x62\x70\x66\x2f\x6d\x6d\x5f\
-\x6c\x65\x61\x6b\x2e\x62\x70\x66\x2e\x63\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\
-\x50\x52\x4f\x42\x45\x28\x6d\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\x2c\
-\x20\x75\x36\x34\x20\x73\x69\x7a\x65\x29\0\x20\x20\x20\x20\x69\x66\x20\x28\x73\
-\x61\x6d\x70\x6c\x65\x5f\x72\x61\x74\x65\x20\x3e\x20\x31\x29\x20\x7b\0\x09\x09\
-\x69\x66\x20\x28\x62\x70\x66\x5f\x6b\x74\x69\x6d\x65\x5f\x67\x65\x74\x5f\x6e\
-\x73\x28\x29\x20\x25\x20\x73\x61\x6d\x70\x6c\x65\x5f\x72\x61\x74\x65\x20\x21\
-\x3d\x20\x30\x29\0\x20\x20\x20\x20\x75\x33\x32\x20\x70\x69\x64\x20\x3d\x20\x62\
-\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\x5f\
-\x74\x67\x69\x64\x28\x29\x20\x3e\x3e\x20\x33\x32\x3b\0\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\
-\x73\x69\x7a\x65\x73\x2c\x26\x70\x69\x64\x2c\x26\x73\x69\x7a\x65\x2c\x42\x50\
-\x46\x5f\x41\x4e\x59\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\
-\x42\x45\x28\x66\x72\x65\x65\x5f\x65\x6e\x74\x65\x72\x2c\x20\x76\x6f\x69\x64\
-\x20\x2a\x61\x64\x64\x72\x65\x73\x73\x29\0\x09\x63\x6f\x6e\x73\x74\x20\x75\x36\
-\x34\x20\x61\x64\x64\x72\x20\x3d\x20\x28\x75\x36\x34\x29\x61\x64\x64\x72\x65\
-\x73\x73\x3b\0\x09\x63\x6f\x6e\x73\x74\x20\x73\x74\x72\x75\x63\x74\x20\x61\x6c\
-\x6c\x6f\x63\x5f\x69\x6e\x66\x6f\x20\x2a\x69\x6e\x66\x6f\x20\x3d\x20\x62\x70\
-\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\
-\x61\x6c\x6c\x6f\x63\x73\x2c\x20\x26\x61\x64\x64\x72\x29\x3b\0\x09\x69\x66\x20\
-\x28\x21\x69\x6e\x66\x6f\x29\0\x09\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\
-\x65\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x61\x6c\x6c\x6f\x63\x73\x2c\x20\x26\
-\x61\x64\x64\x72\x29\x3b\0\x09\x75\x70\x64\x61\x74\x65\x5f\x73\x74\x61\x74\x69\
-\x73\x74\x69\x63\x73\x5f\x64\x65\x6c\x28\x69\x6e\x66\x6f\x2d\x3e\x73\x74\x61\
-\x63\x6b\x5f\x69\x64\x2c\x20\x69\x6e\x66\x6f\x2d\x3e\x73\x69\x7a\x65\x29\x3b\0\
-\x20\x20\x20\x20\x65\x78\x69\x73\x74\x69\x6e\x67\x5f\x63\x69\x6e\x66\x6f\x20\
-\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\
-\x65\x6d\x28\x26\x63\x6f\x6d\x62\x69\x6e\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x73\
-\x2c\x20\x26\x73\x74\x61\x63\x6b\x5f\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\
-\x20\x28\x21\x65\x78\x69\x73\x74\x69\x6e\x67\x5f\x63\x69\x6e\x66\x6f\x29\x20\
-\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\
-\x28\x22\x66\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\
-\x63\x6f\x6d\x62\x69\x6e\x65\x64\x20\x61\x6c\x6c\x6f\x63\x73\x5c\x6e\x22\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x74\x6f\x74\x61\x6c\x5f\x73\x69\x7a\
-\x65\x20\x3d\x20\x73\x7a\x2c\x20\x20\x20\x20\x20\x20\x20\x20\x2f\x2f\x20\xe5\
-\x87\x8f\xe5\xb0\x91\xe5\x86\x85\xe5\xad\x98\xe5\xa4\xa7\xe5\xb0\x8f\0\x20\x20\
-\x20\x20\x5f\x5f\x73\x79\x6e\x63\x5f\x66\x65\x74\x63\x68\x5f\x61\x6e\x64\x5f\
-\x73\x75\x62\x28\x26\x65\x78\x69\x73\x74\x69\x6e\x67\x5f\x63\x69\x6e\x66\x6f\
-\x2d\x3e\x62\x69\x74\x73\x2c\x20\x64\x65\x63\x72\x65\x6d\x65\x6e\x74\x61\x6c\
-\x5f\x63\x69\x6e\x66\x6f\x2e\x62\x69\x74\x73\x29\x3b\0\x69\x6e\x74\x20\x42\x50\
-\x46\x5f\x4b\x50\x52\x4f\x42\x45\x28\x63\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\
-\x65\x72\x2c\x20\x75\x36\x34\x20\x6e\x6d\x65\x6d\x62\x2c\x20\x75\x36\x34\x20\
-\x73\x69\x7a\x65\x29\0\x09\x72\x65\x74\x75\x72\x6e\x20\x67\x65\x6e\x5f\x61\x6c\
-\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\x28\x6e\x6d\x65\x6d\x62\x20\x2a\x20\x73\
-\x69\x7a\x65\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\x42\x45\
-\x28\x72\x65\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\x2c\x20\x76\x6f\x69\
-\x64\x20\x2a\x70\x74\x72\x2c\x20\x75\x36\x34\x20\x73\x69\x7a\x65\x29\0\x69\x6e\
-\x74\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\x42\x45\x28\x6d\x6d\x61\x70\x5f\x65\
-\x6e\x74\x65\x72\x2c\x20\x76\x6f\x69\x64\x20\x2a\x61\x64\x64\x72\x65\x73\x73\
-\x2c\x20\x75\x36\x34\x20\x73\x69\x7a\x65\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\
-\x4b\x50\x52\x4f\x42\x45\x28\x6d\x75\x6e\x6d\x61\x70\x5f\x65\x6e\x74\x65\x72\
-\x2c\x20\x76\x6f\x69\x64\x20\x2a\x61\x64\x64\x72\x65\x73\x73\x29\0\x69\x6e\x74\
-\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\x42\x45\x28\x70\x6f\x73\x69\x78\x5f\x6d\
-\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\x6e\x74\x65\x72\x2c\x20\x76\x6f\x69\x64\
-\x20\x2a\x2a\x6d\x65\x6d\x70\x74\x72\x2c\x20\x73\x69\x7a\x65\x5f\x74\x20\x61\
-\x6c\x69\x67\x6e\x6d\x65\x6e\x74\x2c\x20\x73\x69\x7a\x65\x5f\x74\x20\x73\x69\
-\x7a\x65\x29\0\x09\x63\x6f\x6e\x73\x74\x20\x75\x36\x34\x20\x6d\x65\x6d\x70\x74\
-\x72\x36\x34\x20\x3d\x20\x28\x75\x36\x34\x29\x28\x73\x69\x7a\x65\x5f\x74\x29\
-\x6d\x65\x6d\x70\x74\x72\x3b\0\x09\x63\x6f\x6e\x73\x74\x20\x75\x36\x34\x20\x70\
-\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\
-\x74\x5f\x70\x69\x64\x5f\x74\x67\x69\x64\x28\x29\x20\x3e\x3e\x20\x33\x32\x3b\0\
-\x09\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\
-\x6d\x28\x26\x6d\x65\x6d\x70\x74\x72\x73\x2c\x20\x26\x70\x69\x64\x2c\x20\x26\
-\x6d\x65\x6d\x70\x74\x72\x36\x34\x2c\x20\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\
-\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\x42\x45\x28\x61\x6c\x69\x67\
-\x6e\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\x2c\x20\x73\x69\
-\x7a\x65\x5f\x74\x20\x61\x6c\x69\x67\x6e\x6d\x65\x6e\x74\x2c\x20\x73\x69\x7a\
-\x65\x5f\x74\x20\x73\x69\x7a\x65\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\
-\x52\x4f\x42\x45\x28\x76\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\x72\x2c\x20\
-\x73\x69\x7a\x65\x5f\x74\x20\x73\x69\x7a\x65\x29\0\x69\x6e\x74\x20\x42\x50\x46\
-\x5f\x4b\x50\x52\x4f\x42\x45\x28\x6d\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\x6e\
-\x74\x65\x72\x2c\x20\x73\x69\x7a\x65\x5f\x74\x20\x61\x6c\x69\x67\x6e\x6d\x65\
-\x6e\x74\x2c\x20\x73\x69\x7a\x65\x5f\x74\x20\x73\x69\x7a\x65\x29\0\x69\x6e\x74\
-\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\x42\x45\x28\x70\x76\x61\x6c\x6c\x6f\x63\
-\x5f\x65\x6e\x74\x65\x72\x2c\x20\x73\x69\x7a\x65\x5f\x74\x20\x73\x69\x7a\x65\
-\x29\0\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x67\x65\x6e\x5f\x61\x6c\x6c\
-\x6f\x63\x5f\x65\x78\x69\x74\x32\x28\x63\x74\x78\x2c\x20\x50\x54\x5f\x52\x45\
-\x47\x53\x5f\x52\x43\x28\x63\x74\x78\x29\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\
-\x5f\x4b\x52\x45\x54\x50\x52\x4f\x42\x45\x28\x6d\x61\x6c\x6c\x6f\x63\x5f\x65\
-\x78\x69\x74\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x52\x45\x54\x50\x52\x4f\
-\x42\x45\x28\x63\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x29\0\x69\x6e\x74\x20\
-\x42\x50\x46\x5f\x4b\x52\x45\x54\x50\x52\x4f\x42\x45\x28\x72\x65\x61\x6c\x6c\
-\x6f\x63\x5f\x65\x78\x69\x74\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x52\x45\
-\x54\x50\x52\x4f\x42\x45\x28\x6d\x6d\x61\x70\x5f\x65\x78\x69\x74\x29\0\x69\x6e\
-\x74\x20\x42\x50\x46\x5f\x4b\x52\x45\x54\x50\x52\x4f\x42\x45\x28\x70\x6f\x73\
-\x69\x78\x5f\x6d\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\x78\x69\x74\x29\0\x09\x6d\
-\x65\x6d\x70\x74\x72\x36\x34\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\
-\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x6d\x65\x6d\x70\x74\x72\x73\
-\x2c\x20\x26\x70\x69\x64\x29\x3b\0\x09\x69\x66\x20\x28\x21\x6d\x65\x6d\x70\x74\
-\x72\x36\x34\x29\0\x09\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\x65\
-\x5f\x65\x6c\x65\x6d\x28\x26\x6d\x65\x6d\x70\x74\x72\x73\x2c\x20\x26\x70\x69\
-\x64\x29\x3b\0\x09\x69\x66\x20\x28\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\
-\x65\x61\x64\x5f\x75\x73\x65\x72\x28\x26\x61\x64\x64\x72\x2c\x20\x73\x69\x7a\
-\x65\x6f\x66\x28\x76\x6f\x69\x64\x2a\x29\x2c\x20\x28\x76\x6f\x69\x64\x2a\x29\
-\x28\x73\x69\x7a\x65\x5f\x74\x29\x2a\x6d\x65\x6d\x70\x74\x72\x36\x34\x29\x29\0\
-\x09\x63\x6f\x6e\x73\x74\x20\x75\x36\x34\x20\x61\x64\x64\x72\x36\x34\x20\x3d\
-\x20\x28\x75\x36\x34\x29\x28\x73\x69\x7a\x65\x5f\x74\x29\x61\x64\x64\x72\x3b\0\
-\x09\x72\x65\x74\x75\x72\x6e\x20\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\
-\x78\x69\x74\x32\x28\x63\x74\x78\x2c\x20\x61\x64\x64\x72\x36\x34\x29\x3b\0\x69\
-\x6e\x74\x20\x42\x50\x46\x5f\x4b\x52\x45\x54\x50\x52\x4f\x42\x45\x28\x61\x6c\
-\x69\x67\x6e\x65\x64\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x29\0\x69\x6e\
-\x74\x20\x42\x50\x46\x5f\x4b\x52\x45\x54\x50\x52\x4f\x42\x45\x28\x76\x61\x6c\
-\x6c\x6f\x63\x5f\x65\x78\x69\x74\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x52\
-\x45\x54\x50\x52\x4f\x42\x45\x28\x6d\x65\x6d\x61\x6c\x69\x67\x6e\x5f\x65\x78\
-\x69\x74\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x52\x45\x54\x50\x52\x4f\x42\
-\x45\x28\x70\x76\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x29\0\x69\x6e\x74\x20\
-\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6b\x6d\x61\x6c\x6c\x6f\x63\x28\x73\x74\
-\x72\x75\x63\x74\x20\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\
-\x77\x5f\x6b\x6d\x61\x6c\x6c\x6f\x63\x20\x2a\x63\x74\x78\x29\x7b\0\x20\x20\x20\
-\x20\x63\x6f\x6e\x73\x74\x20\x76\x6f\x69\x64\x20\x2a\x70\x74\x72\x20\x3d\x20\
-\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\x63\x74\x78\x2c\x20\
-\x70\x74\x72\x29\x3b\0\x20\x20\x20\x20\x75\x36\x34\x20\x62\x79\x74\x65\x73\x5f\
-\x61\x6c\x6c\x6f\x63\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\
-\x41\x44\x28\x63\x74\x78\x2c\x20\x62\x79\x74\x65\x73\x5f\x61\x6c\x6c\x6f\x63\
-\x29\x3b\0\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x67\x65\x6e\x5f\x61\x6c\
-\x6c\x6f\x63\x5f\x65\x78\x69\x74\x32\x28\x63\x74\x78\x2c\x20\x28\x75\x36\x34\
-\x29\x70\x74\x72\x29\x3b\0\x73\x74\x61\x74\x69\x63\x20\x69\x6e\x74\x20\x67\x65\
-\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x32\x28\x76\x6f\x69\x64\x20\
-\x2a\x63\x74\x78\x2c\x20\x75\x36\x34\x20\x61\x64\x64\x72\x65\x73\x73\x29\0\x09\
-\x75\x33\x32\x20\x70\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\
-\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\x5f\x74\x67\x69\x64\x28\x29\x20\x3e\
-\x3e\x20\x33\x32\x3b\0\x09\x75\x36\x34\x2a\x20\x73\x69\x7a\x65\x20\x3d\x20\x62\
-\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\
-\x26\x73\x69\x7a\x65\x73\x2c\x20\x26\x70\x69\x64\x29\x3b\0\x09\x69\x66\x20\x28\
-\x21\x73\x69\x7a\x65\x29\0\x09\x5f\x5f\x62\x75\x69\x6c\x74\x69\x6e\x5f\x6d\x65\
-\x6d\x73\x65\x74\x28\x26\x69\x6e\x66\x6f\x2c\x20\x30\x2c\x20\x73\x69\x7a\x65\
-\x6f\x66\x28\x69\x6e\x66\x6f\x29\x29\x3b\0\x09\x69\x6e\x66\x6f\x2e\x73\x69\x7a\
-\x65\x20\x3d\x20\x2a\x73\x69\x7a\x65\x3b\0\x09\x62\x70\x66\x5f\x6d\x61\x70\x5f\
-\x64\x65\x6c\x65\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x73\x69\x7a\x65\x73\x2c\
-\x20\x26\x70\x69\x64\x29\x3b\0\x09\x69\x66\x20\x28\x61\x64\x64\x72\x65\x73\x73\
-\x20\x21\x3d\x20\x30\x29\x20\x7b\0\x09\x09\x69\x6e\x66\x6f\x2e\x74\x69\x6d\x65\
-\x73\x74\x61\x6d\x70\x5f\x6e\x73\x20\x3d\x20\x62\x70\x66\x5f\x6b\x74\x69\x6d\
-\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\x3b\0\x09\x09\x69\x6e\x66\x6f\x2e\x73\
-\x74\x61\x63\x6b\x5f\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x73\
-\x74\x61\x63\x6b\x69\x64\x28\x63\x74\x78\x2c\x20\x26\x73\x74\x61\x63\x6b\x5f\
-\x74\x72\x61\x63\x65\x73\x2c\x20\x30\x20\x7c\x20\x42\x50\x46\x5f\x46\x5f\x46\
-\x41\x53\x54\x5f\x53\x54\x41\x43\x4b\x5f\x43\x4d\x50\x29\x3b\0\x09\x09\x69\x6e\
-\x74\x20\x72\x65\x73\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\
-\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x61\x6c\x6c\x6f\x63\x73\x2c\x20\x26\
-\x61\x64\x64\x72\x65\x73\x73\x2c\x20\x26\x69\x6e\x66\x6f\x2c\x20\x42\x50\x46\
-\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x72\x65\
-\x73\x20\x21\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x61\x6c\x6c\x6f\x63\x73\x20\
-\x75\x70\x64\x61\x74\x65\x20\x66\x61\x69\x6c\x65\x64\x2c\x20\x65\x72\x72\x6f\
-\x72\x20\x63\x6f\x64\x65\x20\x69\x73\x20\x25\x69\x5c\x6e\x22\x2c\x72\x65\x73\
-\x29\x3b\0\x09\x09\x75\x70\x64\x61\x74\x65\x5f\x73\x74\x61\x74\x69\x73\x74\x69\
-\x63\x73\x5f\x61\x64\x64\x28\x69\x6e\x66\x6f\x2e\x73\x74\x61\x63\x6b\x5f\x69\
-\x64\x2c\x20\x69\x6e\x66\x6f\x2e\x73\x69\x7a\x65\x29\x3b\0\x09\x76\x61\x6c\x20\
-\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\
-\x65\x6d\x28\x6d\x61\x70\x2c\x20\x6b\x65\x79\x29\x3b\0\x09\x69\x66\x20\x28\x76\
-\x61\x6c\x29\0\x09\x65\x72\x72\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\
-\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x6d\x61\x70\x2c\x20\x6b\x65\x79\
-\x2c\x20\x69\x6e\x69\x74\x2c\x20\x42\x50\x46\x5f\x4e\x4f\x45\x58\x49\x53\x54\
-\x29\x3b\0\x09\x69\x66\x20\x28\x65\x72\x72\x20\x26\x26\x20\x65\x72\x72\x20\x3c\
-\x20\x30\x29\0\x09\x72\x65\x74\x75\x72\x6e\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\
-\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x6d\x61\x70\x2c\x20\x6b\x65\
-\x79\x29\x3b\0\x20\x20\x20\x20\x69\x66\x20\x28\x21\x65\x78\x69\x73\x74\x69\x6e\
-\x67\x5f\x63\x69\x6e\x66\x6f\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x2e\x74\x6f\
-\x74\x61\x6c\x5f\x73\x69\x7a\x65\x20\x3d\x20\x73\x7a\x2c\x20\x20\x20\x20\x20\
-\x20\x20\x2f\x2f\x20\xe5\xa2\x9e\xe9\x87\x8f\xe5\x86\x85\xe5\xad\x98\xe5\xa4\
-\xa7\xe5\xb0\x8f\0\x20\x20\x20\x20\x5f\x5f\x73\x79\x6e\x63\x5f\x66\x65\x74\x63\
-\x68\x5f\x61\x6e\x64\x5f\x61\x64\x64\x28\x26\x65\x78\x69\x73\x74\x69\x6e\x67\
-\x5f\x63\x69\x6e\x66\x6f\x2d\x3e\x62\x69\x74\x73\x2c\x20\x69\x6e\x63\x72\x65\
-\x6d\x65\x6e\x74\x61\x6c\x5f\x63\x69\x6e\x66\x6f\x2e\x62\x69\x74\x73\x29\x3b\0\
-\x7d\0\x69\x6e\x74\x20\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6b\x66\x72\x65\x65\
-\x28\x73\x74\x72\x75\x63\x74\x20\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\
-\x5f\x72\x61\x77\x5f\x6b\x66\x72\x65\x65\x20\x2a\x63\x74\x78\x29\x7b\0\x20\x20\
-\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x67\x65\x6e\x5f\x66\x72\x65\x65\x5f\x65\
-\x6e\x74\x65\x72\x28\x70\x74\x72\x29\x3b\0\x69\x6e\x74\x20\x6d\x65\x6d\x6c\x65\
-\x61\x6b\x5f\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x61\x6c\x6c\x6f\
-\x63\x5f\x6e\x6f\x64\x65\x28\x73\x74\x72\x75\x63\x74\x20\x74\x72\x61\x63\x65\
-\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\
-\x68\x65\x5f\x61\x6c\x6c\x6f\x63\x20\x2a\x63\x74\x78\x29\x7b\0\x69\x6e\x74\x20\
-\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\
-\x5f\x66\x72\x65\x65\x28\x73\x74\x72\x75\x63\x74\x20\x74\x72\x61\x63\x65\x5f\
-\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\
-\x65\x5f\x66\x72\x65\x65\x20\x2a\x63\x74\x78\x29\x7b\0\x69\x6e\x74\x20\x6d\x65\
-\x6d\x6c\x65\x61\x6b\x5f\x5f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\
-\x63\x28\x73\x74\x72\x75\x63\x74\x20\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\
-\x74\x5f\x72\x61\x77\x5f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\x63\
-\x20\x2a\x63\x74\x78\x29\x7b\0\x20\x20\x20\x20\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\
-\x63\x5f\x65\x6e\x74\x65\x72\x28\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\x20\x3c\
-\x3c\x20\x63\x74\x78\x2d\x3e\x6f\x72\x64\x65\x72\x29\x3b\0\x09\x72\x65\x74\x75\
-\x72\x6e\x20\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x78\x69\x74\x32\x28\
-\x63\x74\x78\x2c\x20\x63\x74\x78\x2d\x3e\x70\x66\x6e\x29\x3b\0\x09\x72\x65\x74\
-\x75\x72\x6e\x20\x67\x65\x6e\x5f\x66\x72\x65\x65\x5f\x65\x6e\x74\x65\x72\x28\
-\x28\x76\x6f\x69\x64\x20\x2a\x29\x63\x74\x78\x2d\x3e\x70\x66\x6e\x29\x3b\0\x69\
-\x6e\x74\x20\x6d\x65\x6d\x6c\x65\x61\x6b\x5f\x5f\x70\x65\x72\x63\x70\x75\x5f\
-\x61\x6c\x6c\x6f\x63\x5f\x70\x65\x72\x63\x70\x75\x28\x73\x74\x72\x75\x63\x74\
-\x20\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x70\x65\
-\x72\x63\x70\x75\x5f\x61\x6c\x6c\x6f\x63\x5f\x70\x65\x72\x63\x70\x75\x20\x2a\
-\x63\x74\x78\x29\0\x09\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\x65\x6e\x74\x65\
-\x72\x28\x63\x74\x78\x2d\x3e\x62\x79\x74\x65\x73\x5f\x61\x6c\x6c\x6f\x63\x29\
-\x3b\0\x09\x72\x65\x74\x75\x72\x6e\x20\x67\x65\x6e\x5f\x61\x6c\x6c\x6f\x63\x5f\
-\x65\x78\x69\x74\x32\x28\x63\x74\x78\x2c\x20\x28\x75\x36\x34\x29\x28\x63\x74\
-\x78\x2d\x3e\x70\x74\x72\x29\x29\x3b\0\x09\x72\x65\x74\x75\x72\x6e\x20\x67\x65\
-\x6e\x5f\x66\x72\x65\x65\x5f\x65\x6e\x74\x65\x72\x28\x63\x74\x78\x2d\x3e\x70\
-\x74\x72\x29\x3b\0\x30\x3a\x31\x34\0\x30\x3a\x31\x33\0\x30\x3a\x31\x32\0\x30\
-\x3a\x31\x30\0\x30\x3a\x32\0\x30\x3a\x34\0\x30\x3a\x31\0\x30\x3a\x39\0\x30\x3a\
-\x38\0\x30\x3a\x33\0\x2e\x72\x6f\x64\x61\x74\x61\0\x6c\x69\x63\x65\x6e\x73\x65\
-\0\x2e\x6d\x61\x70\x73\0\x2e\x62\x73\x73\0\x2e\x74\x65\x78\x74\0\x75\x70\x72\
-\x6f\x62\x65\0\x75\x72\x65\x74\x70\x72\x6f\x62\x65\0\x74\x72\x61\x63\x65\x70\
-\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x61\x6c\x6c\x6f\x63\0\x74\x72\
-\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x66\x72\x65\x65\0\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\
-\x6d\x5f\x63\x61\x63\x68\x65\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\
-\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\
-\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\
-\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\
-\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\
-\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x70\x65\
-\x72\x63\x70\x75\x2f\x70\x65\x72\x63\x70\x75\x5f\x61\x6c\x6c\x6f\x63\x5f\x70\
-\x65\x72\x63\x70\x75\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x70\x65\x72\
-\x63\x70\x75\x2f\x70\x65\x72\x63\x70\x75\x5f\x66\x72\x65\x65\x5f\x70\x65\x72\
-\x63\x70\x75\0\x9f\xeb\x01\0\x20\0\0\0\0\0\0\0\x44\x01\0\0\x44\x01\0\0\x8c\x18\
-\0\0\xd0\x19\0\0\x74\x02\0\0\x08\0\0\0\0\x15\0\0\x01\0\0\0\0\0\0\0\x48\0\0\0\
-\x06\x15\0\0\x0b\0\0\0\0\0\0\0\x22\0\0\0\xd8\0\0\0\x24\0\0\0\x18\x02\0\0\x25\0\
-\0\0\0\x03\0\0\x27\0\0\0\x08\x05\0\0\x29\0\0\0\xe0\x05\0\0\x2b\0\0\0\x20\x07\0\
-\0\x2c\0\0\0\x60\x08\0\0\x2e\0\0\0\x38\x09\0\0\x30\0\0\0\x10\x0a\0\0\x32\0\0\0\
-\xe8\x0a\0\0\x34\0\0\0\x0d\x15\0\0\x09\0\0\0\0\0\0\0\x23\0\0\0\x20\0\0\0\x26\0\
-\0\0\x40\0\0\0\x28\0\0\0\x60\0\0\0\x2a\0\0\0\x80\0\0\0\x2d\0\0\0\x58\x01\0\0\
-\x2f\0\0\0\x78\x01\0\0\x31\0\0\0\x98\x01\0\0\x33\0\0\0\xb8\x01\0\0\x35\0\0\0\
-\x17\x15\0\0\x01\0\0\0\0\0\0\0\x43\0\0\0\x2f\x15\0\0\x01\0\0\0\0\0\0\0\x4c\0\0\
-\0\x45\x15\0\0\x01\0\0\0\0\0\0\0\x52\0\0\0\x66\x15\0\0\x01\0\0\0\0\0\0\0\x58\0\
-\0\0\x86\x15\0\0\x01\0\0\0\0\0\0\0\x5c\0\0\0\xa4\x15\0\0\x01\0\0\0\0\0\0\0\x60\
-\0\0\0\xc1\x15\0\0\x01\0\0\0\0\0\0\0\x64\0\0\0\xe7\x15\0\0\x01\0\0\0\0\0\0\0\
-\x68\0\0\0\x10\0\0\0\0\x15\0\0\x21\0\0\0\0\0\0\0\xa1\x05\0\0\x95\x0e\0\0\0\xe8\
-\x01\0\x18\0\0\0\xa1\x05\0\0\xc8\x0e\0\0\x0c\xf0\x01\0\x20\0\0\0\xa1\x05\0\0\
-\xc8\x0e\0\0\x27\xf0\x01\0\x28\0\0\0\xa1\x05\0\0\xc8\x0e\0\0\x06\xf0\x01\0\x38\
-\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\xa1\x05\0\0\xf5\x0e\0\0\x0e\xfc\
-\x01\0\x58\0\0\0\xa1\x05\0\0\x25\x0f\0\0\x06\0\x02\0\x68\0\0\0\xa1\x05\0\0\x31\
-\x0f\0\0\x02\x0c\x02\0\x70\0\0\0\xa1\x05\0\0\x5c\x0f\0\0\x0e\x14\x02\0\x78\0\0\
-\0\xa1\x05\0\0\x5c\x0f\0\0\x0c\x14\x02\0\x88\0\0\0\xa1\x05\0\0\x31\x0f\0\0\x02\
-\x0c\x02\0\x90\0\0\0\xa1\x05\0\0\x70\x0f\0\0\x02\x18\x02\0\xa8\0\0\0\xa1\x05\0\
-\0\x94\x0f\0\0\x06\x20\x02\0\xb0\0\0\0\xa1\x05\0\0\xa9\x0f\0\0\x17\x24\x02\0\
-\xb8\0\0\0\xa1\x05\0\0\xa9\x0f\0\0\x15\x24\x02\0\xc0\0\0\0\xa1\x05\0\0\xd3\x0f\
-\0\0\x13\x34\x02\0\xe8\0\0\0\xa1\x05\0\0\xd3\x0f\0\0\x11\x34\x02\0\xf8\0\0\0\
-\xa1\x05\0\0\xa9\x0f\0\0\x17\x24\x02\0\x10\x01\0\0\xa1\x05\0\0\x24\x10\0\0\x0d\
-\x3c\x02\0\x48\x01\0\0\xa1\x05\0\0\x68\x10\0\0\x0c\x40\x02\0\x50\x01\0\0\xa1\
-\x05\0\0\x7d\x10\0\0\x0d\x48\x02\0\x78\x01\0\0\xa1\x05\0\0\xc5\x10\0\0\x2d\x54\
-\x02\0\x80\x01\0\0\xa1\x05\0\0\xc5\x10\0\0\x1e\x54\x02\0\xa8\x01\0\0\xa1\x05\0\
-\0\xc5\x10\0\0\x2d\x54\x02\0\xb0\x01\0\0\xa1\x05\0\0\xf8\x10\0\0\x08\xb0\0\0\
-\xc8\x01\0\0\xa1\x05\0\0\x1e\x11\0\0\x06\xb4\0\0\xd8\x01\0\0\xa1\x05\0\0\x28\
-\x11\0\0\x08\xc0\0\0\x18\x02\0\0\xa1\x05\0\0\x61\x11\0\0\x0a\xc4\0\0\x28\x02\0\
-\0\xa1\x05\0\0\x76\x11\0\0\x09\xd0\0\0\x48\x02\0\0\xa1\x05\0\0\x9d\x11\0\0\x09\
-\x08\x01\0\x60\x02\0\0\xa1\x05\0\0\xb6\x11\0\0\x09\x2c\x01\0\x80\x02\0\0\xa1\
-\x05\0\0\xec\x11\0\0\x05\x40\x01\0\x88\x02\0\0\xa1\x05\0\0\x35\x12\0\0\x01\x68\
-\x02\0\x06\x15\0\0\xaa\0\0\0\0\0\0\0\xa1\x05\0\0\xdf\x05\0\0\x05\xc0\x02\0\x10\
-\0\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x30\0\0\0\xa1\x05\0\0\x06\x06\0\0\
-\x09\xb8\x01\0\x38\0\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x40\0\0\0\xa1\
-\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\x48\0\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\
-\x01\0\x68\0\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x70\0\0\0\xa1\x05\0\0\
-\x4e\x06\0\0\x0f\xcc\x01\0\x78\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\x80\
-\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\x90\0\0\0\xa1\x05\0\0\x4e\x06\0\0\
-\x0f\xcc\x01\0\xa8\0\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\xc8\0\0\0\xa1\
-\x05\0\0\xdf\x05\0\0\x05\xc0\x02\0\xd8\0\0\0\xa1\x05\0\0\xb2\x06\0\0\x05\xf0\
-\x02\0\xe0\0\0\0\xa1\x05\0\0\xdc\x06\0\0\x0c\x8c\x02\0\xf0\0\0\0\xa1\x05\0\0\0\
-\0\0\0\0\0\0\0\xf8\0\0\0\xa1\x05\0\0\xfc\x06\0\0\x22\x94\x02\0\x18\x01\0\0\xa1\
-\x05\0\0\x42\x07\0\0\x06\x98\x02\0\x28\x01\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x30\
-\x01\0\0\xa1\x05\0\0\x4e\x07\0\0\x02\xa4\x02\0\x48\x01\0\0\xa1\x05\0\0\x74\x07\
-\0\0\x2e\xa8\x02\0\x50\x01\0\0\xa1\x05\0\0\x74\x07\0\0\x1e\xa8\x02\0\x78\x01\0\
-\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x80\x01\0\0\xa1\x05\0\0\xa8\x07\0\0\x16\x60\x01\
-\0\x98\x01\0\0\xa1\x05\0\0\xef\x07\0\0\x09\x68\x01\0\xa0\x01\0\0\xa1\x05\0\0\
-\x0a\x08\0\0\x09\x6c\x01\0\xd8\x01\0\0\xa1\x05\0\0\x44\x08\0\0\x09\x8c\x01\0\
-\xf8\x01\0\0\xa1\x05\0\0\x7b\x08\0\0\x05\xa0\x01\0\x08\x02\0\0\xa1\x05\0\0\xb2\
-\x06\0\0\x05\xf0\x02\0\x18\x02\0\0\xa1\x05\0\0\xc4\x08\0\0\x05\x08\x03\0\x28\
-\x02\0\0\xa1\x05\0\0\xf6\x08\0\0\x1f\x10\x03\0\x38\x02\0\0\xa1\x05\0\0\x06\x06\
-\0\0\x09\xb8\x01\0\x58\x02\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x60\x02\0\
-\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x68\x02\0\0\xa1\x05\0\0\x21\x06\0\0\
-\x1c\xbc\x01\0\x70\x02\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\x01\0\x90\x02\0\0\
-\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x98\x02\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\
-\xcc\x01\0\xa0\x02\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\xa8\x02\0\0\xa1\
-\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\xb8\x02\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\
-\x01\0\xd0\x02\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\xf0\x02\0\0\xa1\x05\0\
-\0\xc4\x08\0\0\x05\x08\x03\0\0\x03\0\0\xa1\x05\0\0\x1d\x09\0\0\x05\x38\x03\0\
-\x10\x03\0\0\xa1\x05\0\0\xdc\x06\0\0\x0c\x8c\x02\0\x20\x03\0\0\xa1\x05\0\0\0\0\
-\0\0\0\0\0\0\x28\x03\0\0\xa1\x05\0\0\xfc\x06\0\0\x22\x94\x02\0\x48\x03\0\0\xa1\
-\x05\0\0\x42\x07\0\0\x06\x98\x02\0\x58\x03\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x60\
-\x03\0\0\xa1\x05\0\0\x4e\x07\0\0\x02\xa4\x02\0\x78\x03\0\0\xa1\x05\0\0\x74\x07\
-\0\0\x2e\xa8\x02\0\x80\x03\0\0\xa1\x05\0\0\x74\x07\0\0\x1e\xa8\x02\0\xa8\x03\0\
-\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\xb0\x03\0\0\xa1\x05\0\0\xa8\x07\0\0\x16\x60\x01\
-\0\xc8\x03\0\0\xa1\x05\0\0\xef\x07\0\0\x09\x68\x01\0\xd0\x03\0\0\xa1\x05\0\0\
-\x0a\x08\0\0\x09\x6c\x01\0\x08\x04\0\0\xa1\x05\0\0\x44\x08\0\0\x09\x8c\x01\0\
-\x28\x04\0\0\xa1\x05\0\0\x7b\x08\0\0\x05\xa0\x01\0\x40\x04\0\0\xa1\x05\0\0\x06\
-\x06\0\0\x09\xb8\x01\0\x60\x04\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x68\
-\x04\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x70\x04\0\0\xa1\x05\0\0\x21\x06\
-\0\0\x1c\xbc\x01\0\x78\x04\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\x01\0\x98\x04\0\
-\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\xa0\x04\0\0\xa1\x05\0\0\x4e\x06\0\0\
-\x0f\xcc\x01\0\xa8\x04\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\xb0\x04\0\0\
-\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\xc0\x04\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\
-\xcc\x01\0\xd8\x04\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\xf8\x04\0\0\xa1\
-\x05\0\0\x1d\x09\0\0\x05\x38\x03\0\x08\x05\0\0\xa1\x05\0\0\x50\x09\0\0\x05\x70\
-\x03\0\x18\x05\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x38\x05\0\0\xa1\x05\0\
-\0\x06\x06\0\0\x09\xb8\x01\0\x40\x05\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\
-\x48\x05\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\x50\x05\0\0\xa1\x05\0\0\x21\
-\x06\0\0\x1a\xbc\x01\0\x70\x05\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x78\
-\x05\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\x80\x05\0\0\xa1\x05\0\0\x4e\x06\
-\0\0\x2a\xcc\x01\0\x88\x05\0\0\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\x98\x05\0\
-\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xb0\x05\0\0\xa1\x05\0\0\x7e\x06\0\0\
-\x05\xd0\x01\0\xd0\x05\0\0\xa1\x05\0\0\x50\x09\0\0\x05\x70\x03\0\xe0\x05\0\0\
-\xa1\x05\0\0\x84\x09\0\0\x05\xa0\x03\0\xe8\x05\0\0\xa1\x05\0\0\xdc\x06\0\0\x0c\
-\x8c\x02\0\xf8\x05\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\0\x06\0\0\xa1\x05\0\0\xfc\
-\x06\0\0\x22\x94\x02\0\x20\x06\0\0\xa1\x05\0\0\x42\x07\0\0\x06\x98\x02\0\x30\
-\x06\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x38\x06\0\0\xa1\x05\0\0\x4e\x07\0\0\x02\
-\xa4\x02\0\x50\x06\0\0\xa1\x05\0\0\x74\x07\0\0\x2e\xa8\x02\0\x58\x06\0\0\xa1\
-\x05\0\0\x74\x07\0\0\x1e\xa8\x02\0\x80\x06\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x88\
-\x06\0\0\xa1\x05\0\0\xa8\x07\0\0\x16\x60\x01\0\xa0\x06\0\0\xa1\x05\0\0\xef\x07\
-\0\0\x09\x68\x01\0\xa8\x06\0\0\xa1\x05\0\0\x0a\x08\0\0\x09\x6c\x01\0\xe0\x06\0\
-\0\xa1\x05\0\0\x44\x08\0\0\x09\x8c\x01\0\0\x07\0\0\xa1\x05\0\0\x7b\x08\0\0\x05\
-\xa0\x01\0\x10\x07\0\0\xa1\x05\0\0\x84\x09\0\0\x05\xa0\x03\0\x20\x07\0\0\xa1\
-\x05\0\0\xb0\x09\0\0\x05\xbc\x03\0\x30\x07\0\0\xa1\x05\0\0\x03\x0a\0\0\x0c\xc8\
-\x03\0\x38\x07\0\0\xa1\x05\0\0\x2e\x0a\0\0\x12\xcc\x03\0\x40\x07\0\0\xa1\x05\0\
-\0\x2e\x0a\0\0\x2d\xcc\x03\0\x48\x07\0\0\xa1\x05\0\0\x2e\x0a\0\0\x0c\xcc\x03\0\
-\x58\x07\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x70\x07\0\0\xa1\x05\0\0\x61\x0a\0\0\
-\x02\xd0\x03\0\x98\x07\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\xb8\x07\0\0\
-\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\xc0\x07\0\0\xa1\x05\0\0\x21\x06\0\0\x07\
-\xbc\x01\0\xc8\x07\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\xd0\x07\0\0\xa1\
-\x05\0\0\x21\x06\0\0\x1a\xbc\x01\0\xf0\x07\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\
-\x01\0\xf8\x07\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\0\x08\0\0\xa1\x05\0\0\
-\x4e\x06\0\0\x2a\xcc\x01\0\x08\x08\0\0\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\
-\x18\x08\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\x30\x08\0\0\xa1\x05\0\0\x7e\
-\x06\0\0\x05\xd0\x01\0\x50\x08\0\0\xa1\x05\0\0\xb0\x09\0\0\x05\xbc\x03\0\x60\
-\x08\0\0\xa1\x05\0\0\x9b\x0a\0\0\x05\x40\x04\0\x70\x08\0\0\xa1\x05\0\0\x06\x06\
-\0\0\x09\xb8\x01\0\x90\x08\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x98\x08\0\
-\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\xa0\x08\0\0\xa1\x05\0\0\x21\x06\0\0\
-\x1c\xbc\x01\0\xa8\x08\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\x01\0\xc8\x08\0\0\
-\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\xd0\x08\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\
-\xcc\x01\0\xd8\x08\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\xe0\x08\0\0\xa1\
-\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\xf0\x08\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\
-\x01\0\x08\x09\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\x28\x09\0\0\xa1\x05\0\
-\0\x9b\x0a\0\0\x05\x40\x04\0\x38\x09\0\0\xa1\x05\0\0\xde\x0a\0\0\x05\x70\x04\0\
-\x48\x09\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x68\x09\0\0\xa1\x05\0\0\x06\
-\x06\0\0\x09\xb8\x01\0\x70\x09\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x78\
-\x09\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\x80\x09\0\0\xa1\x05\0\0\x21\x06\
-\0\0\x1a\xbc\x01\0\xa0\x09\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\xa8\x09\0\
-\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xb0\x09\0\0\xa1\x05\0\0\x4e\x06\0\0\
-\x2a\xcc\x01\0\xb8\x09\0\0\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\xc8\x09\0\0\
-\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xe0\x09\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\
-\xd0\x01\0\0\x0a\0\0\xa1\x05\0\0\xde\x0a\0\0\x05\x70\x04\0\x10\x0a\0\0\xa1\x05\
-\0\0\x08\x0b\0\0\x05\xa0\x04\0\x20\x0a\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\
-\0\x40\x0a\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x48\x0a\0\0\xa1\x05\0\0\
-\x21\x06\0\0\x07\xbc\x01\0\x50\x0a\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\
-\x58\x0a\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\x01\0\x78\x0a\0\0\xa1\x05\0\0\x21\
-\x06\0\0\x07\xbc\x01\0\x80\x0a\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\x88\
-\x0a\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\x90\x0a\0\0\xa1\x05\0\0\x4e\x06\
-\0\0\x09\xcc\x01\0\xa0\x0a\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xb8\x0a\0\
-\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\xd8\x0a\0\0\xa1\x05\0\0\x08\x0b\0\0\
-\x05\xa0\x04\0\xe8\x0a\0\0\xa1\x05\0\0\x46\x0b\0\0\x05\xd0\x04\0\xf8\x0a\0\0\
-\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x18\x0b\0\0\xa1\x05\0\0\x06\x06\0\0\x09\
-\xb8\x01\0\x20\x0b\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x28\x0b\0\0\xa1\
-\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\x30\x0b\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\
-\x01\0\x50\x0b\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x58\x0b\0\0\xa1\x05\0\
-\0\x4e\x06\0\0\x0f\xcc\x01\0\x60\x0b\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\
-\x68\x0b\0\0\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\x78\x0b\0\0\xa1\x05\0\0\x4e\
-\x06\0\0\x0f\xcc\x01\0\x90\x0b\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\xb0\
-\x0b\0\0\xa1\x05\0\0\x46\x0b\0\0\x05\xd0\x04\0\x0d\x15\0\0\x28\0\0\0\0\0\0\0\
-\xa1\x05\0\0\x71\x0b\0\0\x21\x74\x02\0\x08\0\0\0\xa1\x05\0\0\x71\x0b\0\0\x0c\
-\x74\x02\0\x10\0\0\0\xa1\x05\0\0\xa3\x0b\0\0\x05\xd8\x02\0\x20\0\0\0\xa1\x05\0\
-\0\x71\x0b\0\0\x21\x74\x02\0\x28\0\0\0\xa1\x05\0\0\x71\x0b\0\0\x0c\x74\x02\0\
-\x30\0\0\0\xa1\x05\0\0\xc2\x0b\0\0\x05\x20\x03\0\x40\0\0\0\xa1\x05\0\0\x71\x0b\
-\0\0\x21\x74\x02\0\x48\0\0\0\xa1\x05\0\0\x71\x0b\0\0\x0c\x74\x02\0\x50\0\0\0\
-\xa1\x05\0\0\xe1\x0b\0\0\x05\x58\x03\0\x60\0\0\0\xa1\x05\0\0\x71\x0b\0\0\x21\
-\x74\x02\0\x68\0\0\0\xa1\x05\0\0\x71\x0b\0\0\x0c\x74\x02\0\x70\0\0\0\xa1\x05\0\
-\0\x01\x0c\0\0\x05\x88\x03\0\x80\0\0\0\xa1\x05\0\0\x1e\x0c\0\0\0\xe8\x03\0\x88\
-\0\0\0\xa1\x05\0\0\x2e\x0a\0\0\x12\xf0\x03\0\x90\0\0\0\xa1\x05\0\0\x2e\x0a\0\0\
-\x2d\xf0\x03\0\x98\0\0\0\xa1\x05\0\0\x2e\x0a\0\0\x0c\xf0\x03\0\xa8\0\0\0\xa1\
-\x05\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\xa1\x05\0\0\x45\x0c\0\0\x0d\x04\x04\0\xd0\0\
-\0\0\xa1\x05\0\0\x76\x0c\0\0\x06\x08\x04\0\xe0\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\
-\0\xe8\0\0\0\xa1\x05\0\0\x86\x0c\0\0\x02\x14\x04\0\0\x01\0\0\xa1\x05\0\0\xac\
-\x0c\0\0\x3f\x1c\x04\0\x10\x01\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x18\x01\0\0\xa1\
-\x05\0\0\xac\x0c\0\0\x06\x1c\x04\0\x28\x01\0\0\xa1\x05\0\0\xac\x0c\0\0\x06\x1c\
-\x04\0\x30\x01\0\0\xa1\x05\0\0\xf6\x0c\0\0\x22\x28\x04\0\x38\x01\0\0\xa1\x05\0\
-\0\x1d\x0d\0\0\x09\x30\x04\0\x48\x01\0\0\xa1\x05\0\0\x1e\x0c\0\0\x05\xe8\x03\0\
-\x58\x01\0\0\xa1\x05\0\0\x71\x0b\0\0\x21\x74\x02\0\x60\x01\0\0\xa1\x05\0\0\x71\
-\x0b\0\0\x0c\x74\x02\0\x68\x01\0\0\xa1\x05\0\0\x43\x0d\0\0\x05\x58\x04\0\x78\
-\x01\0\0\xa1\x05\0\0\x71\x0b\0\0\x21\x74\x02\0\x80\x01\0\0\xa1\x05\0\0\x71\x0b\
-\0\0\x0c\x74\x02\0\x88\x01\0\0\xa1\x05\0\0\x69\x0d\0\0\x05\x88\x04\0\x98\x01\0\
-\0\xa1\x05\0\0\x71\x0b\0\0\x21\x74\x02\0\xa0\x01\0\0\xa1\x05\0\0\x71\x0b\0\0\
-\x0c\x74\x02\0\xa8\x01\0\0\xa1\x05\0\0\x88\x0d\0\0\x05\xb8\x04\0\xb8\x01\0\0\
-\xa1\x05\0\0\x71\x0b\0\0\x21\x74\x02\0\xc0\x01\0\0\xa1\x05\0\0\x71\x0b\0\0\x0c\
-\x74\x02\0\xc8\x01\0\0\xa1\x05\0\0\xa9\x0d\0\0\x05\xe8\x04\0\x17\x15\0\0\x14\0\
-\0\0\0\0\0\0\xa1\x05\0\0\xc9\x0d\0\0\0\0\x05\0\x28\0\0\0\xa1\x05\0\0\0\0\0\0\0\
-\0\0\0\x30\0\0\0\xa1\x05\0\0\x04\x0e\0\0\x17\x04\x05\0\x58\0\0\0\xa1\x05\0\0\
-\x04\x0e\0\0\x17\x04\x05\0\x68\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x70\0\0\0\xa1\
-\x05\0\0\x33\x0e\0\0\x17\x08\x05\0\x80\0\0\0\xa1\x05\0\0\x33\x0e\0\0\x17\x08\
-\x05\0\x90\0\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\xb0\0\0\0\xa1\x05\0\0\
-\x06\x06\0\0\x09\xb8\x01\0\xb8\0\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\xc0\
-\0\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\xc8\0\0\0\xa1\x05\0\0\x21\x06\0\0\
-\x1a\xbc\x01\0\xe8\0\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\xf0\0\0\0\xa1\
-\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xf8\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\
-\x01\0\0\x01\0\0\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\x10\x01\0\0\xa1\x05\0\0\
-\x4e\x06\0\0\x0f\xcc\x01\0\x28\x01\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\
-\x48\x01\0\0\xa1\x05\0\0\x6a\x0e\0\0\x0c\x18\x05\0\x60\x01\0\0\xa1\x05\0\0\x6a\
-\x0e\0\0\x05\x18\x05\0\x2f\x15\0\0\x13\0\0\0\0\0\0\0\xa1\x05\0\0\x37\x12\0\0\0\
-\x28\x05\0\x20\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x28\0\0\0\xa1\x05\0\0\x04\x0e\
-\0\0\x17\x2c\x05\0\x38\0\0\0\xa1\x05\0\0\x04\x0e\0\0\x17\x2c\x05\0\x40\0\0\0\
-\xa1\x05\0\0\xdc\x06\0\0\x0c\x8c\x02\0\x50\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\
-\x58\0\0\0\xa1\x05\0\0\xfc\x06\0\0\x22\x94\x02\0\x78\0\0\0\xa1\x05\0\0\x42\x07\
-\0\0\x06\x98\x02\0\x88\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x90\0\0\0\xa1\x05\0\0\
-\x4e\x07\0\0\x02\xa4\x02\0\xa8\0\0\0\xa1\x05\0\0\x74\x07\0\0\x2e\xa8\x02\0\xb0\
-\0\0\0\xa1\x05\0\0\x74\x07\0\0\x1e\xa8\x02\0\xd8\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\
-\0\0\xe0\0\0\0\xa1\x05\0\0\xa8\x07\0\0\x16\x60\x01\0\xf8\0\0\0\xa1\x05\0\0\xef\
-\x07\0\0\x09\x68\x01\0\0\x01\0\0\xa1\x05\0\0\x0a\x08\0\0\x09\x6c\x01\0\x38\x01\
-\0\0\xa1\x05\0\0\x44\x08\0\0\x09\x8c\x01\0\x58\x01\0\0\xa1\x05\0\0\x7b\x08\0\0\
-\x05\xa0\x01\0\x68\x01\0\0\xa1\x05\0\0\x6e\x12\0\0\x05\x34\x05\0\x45\x15\0\0\
-\x14\0\0\0\0\0\0\0\xa1\x05\0\0\x8e\x12\0\0\0\x44\x05\0\x28\0\0\0\xa1\x05\0\0\0\
-\0\0\0\0\0\0\0\x30\0\0\0\xa1\x05\0\0\x04\x0e\0\0\x17\x48\x05\0\x58\0\0\0\xa1\
-\x05\0\0\x04\x0e\0\0\x17\x48\x05\0\x68\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x70\0\
-\0\0\xa1\x05\0\0\x33\x0e\0\0\x17\x4c\x05\0\x80\0\0\0\xa1\x05\0\0\x33\x0e\0\0\
-\x17\x4c\x05\0\x90\0\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\xb0\0\0\0\xa1\
-\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\xb8\0\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\
-\x01\0\xc0\0\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\xbc\x01\0\xc8\0\0\0\xa1\x05\0\0\
-\x21\x06\0\0\x1a\xbc\x01\0\xe8\0\0\0\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\xf0\
-\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xf8\0\0\0\xa1\x05\0\0\x4e\x06\0\0\
-\x2a\xcc\x01\0\0\x01\0\0\xa1\x05\0\0\x4e\x06\0\0\x09\xcc\x01\0\x10\x01\0\0\xa1\
-\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\x28\x01\0\0\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\
-\x01\0\x48\x01\0\0\xa1\x05\0\0\x6a\x0e\0\0\x0c\x5c\x05\0\x60\x01\0\0\xa1\x05\0\
-\0\x6a\x0e\0\0\x05\x5c\x05\0\x66\x15\0\0\x13\0\0\0\0\0\0\0\xa1\x05\0\0\xe0\x12\
-\0\0\0\x6c\x05\0\x20\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x28\0\0\0\xa1\x05\0\0\
-\x04\x0e\0\0\x17\x70\x05\0\x38\0\0\0\xa1\x05\0\0\x04\x0e\0\0\x17\x70\x05\0\x40\
-\0\0\0\xa1\x05\0\0\xdc\x06\0\0\x0c\x8c\x02\0\x50\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\
-\0\0\x58\0\0\0\xa1\x05\0\0\xfc\x06\0\0\x22\x94\x02\0\x78\0\0\0\xa1\x05\0\0\x42\
-\x07\0\0\x06\x98\x02\0\x88\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\x90\0\0\0\xa1\x05\
-\0\0\x4e\x07\0\0\x02\xa4\x02\0\xa8\0\0\0\xa1\x05\0\0\x74\x07\0\0\x2e\xa8\x02\0\
-\xb0\0\0\0\xa1\x05\0\0\x74\x07\0\0\x1e\xa8\x02\0\xd8\0\0\0\xa1\x05\0\0\0\0\0\0\
-\0\0\0\0\xe0\0\0\0\xa1\x05\0\0\xa8\x07\0\0\x16\x60\x01\0\xf8\0\0\0\xa1\x05\0\0\
-\xef\x07\0\0\x09\x68\x01\0\0\x01\0\0\xa1\x05\0\0\x0a\x08\0\0\x09\x6c\x01\0\x38\
-\x01\0\0\xa1\x05\0\0\x44\x08\0\0\x09\x8c\x01\0\x58\x01\0\0\xa1\x05\0\0\x7b\x08\
-\0\0\x05\xa0\x01\0\x68\x01\0\0\xa1\x05\0\0\x6e\x12\0\0\x05\x78\x05\0\x86\x15\0\
-\0\x12\0\0\0\0\0\0\0\xa1\x05\0\0\x2b\x13\0\0\0\x88\x05\0\x08\0\0\0\xa1\x05\0\0\
-\x72\x13\0\0\x15\x8c\x05\0\x20\0\0\0\xa1\x05\0\0\x72\x13\0\0\x27\x8c\x05\0\x28\
-\0\0\0\xa1\x05\0\0\x72\x13\0\0\x1f\x8c\x05\0\x38\0\0\0\xa1\x05\0\0\x06\x06\0\0\
-\x09\xb8\x01\0\x58\0\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x60\0\0\0\xa1\
-\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x68\0\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\xbc\
-\x01\0\x70\0\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\x01\0\x90\0\0\0\xa1\x05\0\0\
-\x21\x06\0\0\x07\xbc\x01\0\x98\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xa0\
-\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\xa8\0\0\0\xa1\x05\0\0\x4e\x06\0\0\
-\x09\xcc\x01\0\xb8\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xd0\0\0\0\xa1\
-\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\xf0\0\0\0\xa1\x05\0\0\xa0\x13\0\0\x23\x94\
-\x05\0\xf8\0\0\0\xa1\x05\0\0\xa0\x13\0\0\x09\x94\x05\0\x08\x01\0\0\xa1\x05\0\0\
-\xa0\x13\0\0\x02\x94\x05\0\xa4\x15\0\0\x10\0\0\0\0\0\0\0\xa1\x05\0\0\xc8\x13\0\
-\0\x25\xac\x05\0\x08\0\0\0\xa1\x05\0\0\xdc\x06\0\0\x0c\x8c\x02\0\x18\0\0\0\xa1\
-\x05\0\0\0\0\0\0\0\0\0\0\x20\0\0\0\xa1\x05\0\0\xfc\x06\0\0\x22\x94\x02\0\x40\0\
-\0\0\xa1\x05\0\0\x42\x07\0\0\x06\x98\x02\0\x50\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\
-\0\x58\0\0\0\xa1\x05\0\0\x4e\x07\0\0\x02\xa4\x02\0\x70\0\0\0\xa1\x05\0\0\x74\
-\x07\0\0\x2e\xa8\x02\0\x78\0\0\0\xa1\x05\0\0\x74\x07\0\0\x1e\xa8\x02\0\xa0\0\0\
-\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\xa8\0\0\0\xa1\x05\0\0\xa8\x07\0\0\x16\x60\x01\0\
-\xc0\0\0\0\xa1\x05\0\0\xef\x07\0\0\x09\x68\x01\0\xc8\0\0\0\xa1\x05\0\0\x0a\x08\
-\0\0\x09\x6c\x01\0\0\x01\0\0\xa1\x05\0\0\x44\x08\0\0\x09\x8c\x01\0\x20\x01\0\0\
-\xa1\x05\0\0\x7b\x08\0\0\x05\xa0\x01\0\x30\x01\0\0\xa1\x05\0\0\xc8\x13\0\0\x02\
-\xac\x05\0\xc1\x15\0\0\x10\0\0\0\0\0\0\0\xa1\x05\0\0\xf2\x13\0\0\0\xbc\x05\0\
-\x08\0\0\0\xa1\x05\0\0\x44\x14\0\0\x17\xc4\x05\0\x18\0\0\0\xa1\x05\0\0\x06\x06\
-\0\0\x09\xb8\x01\0\x38\0\0\0\xa1\x05\0\0\x06\x06\0\0\x09\xb8\x01\0\x40\0\0\0\
-\xa1\x05\0\0\x21\x06\0\0\x07\xbc\x01\0\x48\0\0\0\xa1\x05\0\0\x21\x06\0\0\x1c\
-\xbc\x01\0\x50\0\0\0\xa1\x05\0\0\x21\x06\0\0\x1a\xbc\x01\0\x70\0\0\0\xa1\x05\0\
-\0\x21\x06\0\0\x07\xbc\x01\0\x78\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\
-\x80\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x2a\xcc\x01\0\x88\0\0\0\xa1\x05\0\0\x4e\x06\
-\0\0\x09\xcc\x01\0\x98\0\0\0\xa1\x05\0\0\x4e\x06\0\0\x0f\xcc\x01\0\xb0\0\0\0\
-\xa1\x05\0\0\x7e\x06\0\0\x05\xd0\x01\0\xd0\0\0\0\xa1\x05\0\0\x68\x14\0\0\x29\
-\xcc\x05\0\xd8\0\0\0\xa1\x05\0\0\x68\x14\0\0\x09\xcc\x05\0\xe8\0\0\0\xa1\x05\0\
-\0\x68\x14\0\0\x02\xcc\x05\0\xe7\x15\0\0\x10\0\0\0\0\0\0\0\xa1\x05\0\0\x97\x14\
-\0\0\x1d\xe4\x05\0\x08\0\0\0\xa1\x05\0\0\xdc\x06\0\0\x0c\x8c\x02\0\x18\0\0\0\
-\xa1\x05\0\0\0\0\0\0\0\0\0\0\x20\0\0\0\xa1\x05\0\0\xfc\x06\0\0\x22\x94\x02\0\
-\x40\0\0\0\xa1\x05\0\0\x42\x07\0\0\x06\x98\x02\0\x50\0\0\0\xa1\x05\0\0\0\0\0\0\
-\0\0\0\0\x58\0\0\0\xa1\x05\0\0\x4e\x07\0\0\x02\xa4\x02\0\x70\0\0\0\xa1\x05\0\0\
-\x74\x07\0\0\x2e\xa8\x02\0\x78\0\0\0\xa1\x05\0\0\x74\x07\0\0\x1e\xa8\x02\0\xa0\
-\0\0\0\xa1\x05\0\0\0\0\0\0\0\0\0\0\xa8\0\0\0\xa1\x05\0\0\xa8\x07\0\0\x16\x60\
-\x01\0\xc0\0\0\0\xa1\x05\0\0\xef\x07\0\0\x09\x68\x01\0\xc8\0\0\0\xa1\x05\0\0\
-\x0a\x08\0\0\x09\x6c\x01\0\0\x01\0\0\xa1\x05\0\0\x44\x08\0\0\x09\x8c\x01\0\x20\
-\x01\0\0\xa1\x05\0\0\x7b\x08\0\0\x05\xa0\x01\0\x30\x01\0\0\xa1\x05\0\0\x97\x14\
-\0\0\x02\xe4\x05\0\x10\0\0\0\x06\x15\0\0\x0e\0\0\0\0\0\0\0\x20\0\0\0\xb9\x14\0\
-\0\0\0\0\0\xd8\0\0\0\x20\0\0\0\xb9\x14\0\0\0\0\0\0\x18\x02\0\0\x20\0\0\0\xb9\
-\x14\0\0\0\0\0\0\x20\x02\0\0\x20\0\0\0\xbe\x14\0\0\0\0\0\0\0\x03\0\0\x20\0\0\0\
-\xbe\x14\0\0\0\0\0\0\x08\x03\0\0\x20\0\0\0\xb9\x14\0\0\0\0\0\0\x08\x05\0\0\x20\
-\0\0\0\xbe\x14\0\0\0\0\0\0\xe0\x05\0\0\x20\0\0\0\xb9\x14\0\0\0\0\0\0\x20\x07\0\
-\0\x20\0\0\0\xc3\x14\0\0\0\0\0\0\x28\x07\0\0\x20\0\0\0\xb9\x14\0\0\0\0\0\0\x60\
-\x08\0\0\x20\0\0\0\xbe\x14\0\0\0\0\0\0\x38\x09\0\0\x20\0\0\0\xb9\x14\0\0\0\0\0\
-\0\x10\x0a\0\0\x20\0\0\0\xbe\x14\0\0\0\0\0\0\xe8\x0a\0\0\x20\0\0\0\xb9\x14\0\0\
-\0\0\0\0\x0d\x15\0\0\x08\0\0\0\0\0\0\0\x20\0\0\0\xc8\x14\0\0\0\0\0\0\x20\0\0\0\
-\x20\0\0\0\xc8\x14\0\0\0\0\0\0\x40\0\0\0\x20\0\0\0\xc8\x14\0\0\0\0\0\0\x60\0\0\
-\0\x20\0\0\0\xc8\x14\0\0\0\0\0\0\x58\x01\0\0\x20\0\0\0\xc8\x14\0\0\0\0\0\0\x78\
-\x01\0\0\x20\0\0\0\xc8\x14\0\0\0\0\0\0\x98\x01\0\0\x20\0\0\0\xc8\x14\0\0\0\0\0\
-\0\xb8\x01\0\0\x20\0\0\0\xc8\x14\0\0\0\0\0\0\x17\x15\0\0\x02\0\0\0\x08\0\0\0\
-\x37\0\0\0\xcd\x14\0\0\0\0\0\0\x40\0\0\0\x37\0\0\0\xd1\x14\0\0\0\0\0\0\x2f\x15\
-\0\0\x01\0\0\0\x08\0\0\0\x4a\0\0\0\xcd\x14\0\0\0\0\0\0\x45\x15\0\0\x02\0\0\0\
-\x08\0\0\0\x4e\0\0\0\xcd\x14\0\0\0\0\0\0\x40\0\0\0\x4e\0\0\0\xd1\x14\0\0\0\0\0\
-\0\x66\x15\0\0\x01\0\0\0\x08\0\0\0\x54\0\0\0\xcd\x14\0\0\0\0\0\0\x86\x15\0\0\
-\x02\0\0\0\x20\0\0\0\x5a\0\0\0\xcd\x14\0\0\0\0\0\0\xf0\0\0\0\x5a\0\0\0\xd5\x14\
-\0\0\0\0\0\0\xa4\x15\0\0\x01\0\0\0\0\0\0\0\x5e\0\0\0\xd5\x14\0\0\0\0\0\0\xc1\
-\x15\0\0\x02\0\0\0\x08\0\0\0\x62\0\0\0\xd9\x14\0\0\0\0\0\0\xd0\0\0\0\x62\0\0\0\
-\xdd\x14\0\0\0\0\0\0\xe7\x15\0\0\x01\0\0\0\0\0\0\0\x66\0\0\0\xe1\x14\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\
-\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x67\x06\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x09\0\0\0\x02\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\xa8\x06\0\0\0\0\0\0\x60\x09\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\
-\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x11\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x08\x10\0\0\0\0\0\0\x90\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x17\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x98\x12\0\0\0\0\0\0\xc0\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x1e\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x1e\0\0\
-\0\0\0\0\xd8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x28\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x30\x20\0\0\0\0\0\0\x70\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\
-\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa0\x21\0\0\0\0\0\0\x78\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x56\0\0\0\x01\0\0\0\
-\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x23\0\0\0\0\0\0\x70\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x77\0\0\0\x01\0\0\0\x06\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x88\x24\0\0\0\0\0\0\x78\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x97\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x26\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\xb5\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\
-\x27\0\0\0\0\0\0\x40\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xd2\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x28\0\0\0\0\
-\0\0\xf8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf8\0\
-\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x50\x29\0\0\0\0\0\0\x40\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1d\x01\0\0\x01\0\
-\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x2a\0\0\0\0\0\0\x62\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x25\x01\0\0\x01\0\0\0\x03\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xf2\x2a\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2d\x01\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x2b\0\0\0\0\0\0\xa0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x33\x01\0\0\x08\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xa0\x2b\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x21\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa0\x2b\0\0\
-\0\0\0\0\x90\0\0\0\0\0\0\0\x02\0\0\0\x03\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\
-\0\0\x2b\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x30\x2c\0\0\0\0\0\
-\0\xf0\x01\0\0\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\
-\x36\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x20\x2e\0\0\0\0\0\0\
-\xb0\0\0\0\0\0\0\0\x02\0\0\0\x05\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x44\
-\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x2e\0\0\0\0\0\0\x30\0\
-\0\0\0\0\0\0\x02\0\0\0\x06\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x60\x05\0\
-\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2f\0\0\0\0\0\0\x40\0\0\0\0\0\
-\0\0\x02\0\0\0\x07\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x7a\x05\0\0\x09\0\
-\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x2f\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\
-\x02\0\0\0\x08\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x9f\x05\0\0\x09\0\0\0\
-\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x70\x2f\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x02\0\
-\0\0\x09\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xc3\x05\0\0\x09\0\0\0\x40\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\x2f\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x02\0\0\0\
-\x0a\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xe5\x05\0\0\x09\0\0\0\x40\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xf0\x2f\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x02\0\0\0\x0b\0\
-\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x06\x06\0\0\x09\0\0\0\x40\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x30\x30\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x02\0\0\0\x0c\0\0\0\
-\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x30\x06\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x60\x30\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x02\0\0\0\x0d\0\0\0\x08\0\
-\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x59\x06\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xa0\x30\0\0\0\0\0\0\x58\x22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x5e\x06\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf8\
-\x52\0\0\0\0\0\0\x64\x1c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0";
-
- *sz = sizeof(data) - 1;
- return (const void *)data;
-}
-
-#ifdef __cplusplus
-struct mm_leak_bpf *mm_leak_bpf::open(const struct bpf_object_open_opts *opts) { return mm_leak_bpf__open_opts(opts); }
-struct mm_leak_bpf *mm_leak_bpf::open_and_load() { return mm_leak_bpf__open_and_load(); }
-int mm_leak_bpf::load(struct mm_leak_bpf *skel) { return mm_leak_bpf__load(skel); }
-int mm_leak_bpf::attach(struct mm_leak_bpf *skel) { return mm_leak_bpf__attach(skel); }
-void mm_leak_bpf::detach(struct mm_leak_bpf *skel) { mm_leak_bpf__detach(skel); }
-void mm_leak_bpf::destroy(struct mm_leak_bpf *skel) { mm_leak_bpf__destroy(skel); }
-const void *mm_leak_bpf::elf_bytes(size_t *sz) { return mm_leak_bpf__elf_bytes(sz); }
-#endif /* __cplusplus */
-
-__attribute__((unused)) static void
-mm_leak_bpf__assert(struct mm_leak_bpf *s __attribute__((unused)))
-{
-#ifdef __cplusplus
-#define _Static_assert static_assert
-#endif
- _Static_assert(sizeof(s->rodata->sample_rate) == 8, "unexpected size of 'sample_rate'");
- _Static_assert(sizeof(s->rodata->page_size) == 8, "unexpected size of 'page_size'");
- _Static_assert(sizeof(s->rodata->stack_flags) == 8, "unexpected size of 'stack_flags'");
-#ifdef __cplusplus
-#undef _Static_assert
-#endif
-}
-
-#endif /* __MM_LEAK_BPF_SKEL_H__ */
diff --git a/.output/mm_leak.tmp.bpf.o b/.output/mm_leak.tmp.bpf.o
deleted file mode 100644
index 6effefc..0000000
Binary files a/.output/mm_leak.tmp.bpf.o and /dev/null differ
diff --git a/.output/mm_stats.bpf.o b/.output/mm_stats.bpf.o
deleted file mode 100644
index 40fa299..0000000
Binary files a/.output/mm_stats.bpf.o and /dev/null differ
diff --git a/.output/mm_stats.skel.h b/.output/mm_stats.skel.h
deleted file mode 100644
index 10178a1..0000000
--- a/.output/mm_stats.skel.h
+++ /dev/null
@@ -1,2465 +0,0 @@
-/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
-
-/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
-#ifndef __MM_STATS_BPF_SKEL_H__
-#define __MM_STATS_BPF_SKEL_H__
-
-#include
-#include
-#include
-
-#define BPF_SKEL_SUPPORTS_MAP_AUTO_ATTACH 1
-
-struct mm_stats_bpf {
- struct bpf_object_skeleton *skeleton;
- struct bpf_object *obj;
- struct {
- struct bpf_map *task_mm_stats_map;
- struct bpf_map *process_mm_stats_map;
- struct bpf_map *task_mm_occupied_list;
- struct bpf_map *process_mm_occupied_list;
- struct bpf_map *threhold_map;
- struct bpf_map *task_mm_stats_buffer;
- struct bpf_map *process_mm_stats_buffer;
- struct bpf_map *oom_event_buffer;
- struct bpf_map *rodata;
- } maps;
- struct {
- struct bpf_program *oom_kill_process;
- struct bpf_program *trace_kmalloc;
- struct bpf_program *trace_kfree;
- struct bpf_program *trace_page_alloc;
- struct bpf_program *trace_page_free;
- struct bpf_program *trace_cache_alloc;
- struct bpf_program *trace_cache_free;
- struct bpf_program *handle_mm_task_exit;
- } progs;
- struct {
- struct bpf_link *oom_kill_process;
- struct bpf_link *trace_kmalloc;
- struct bpf_link *trace_kfree;
- struct bpf_link *trace_page_alloc;
- struct bpf_link *trace_page_free;
- struct bpf_link *trace_cache_alloc;
- struct bpf_link *trace_cache_free;
- struct bpf_link *handle_mm_task_exit;
- } links;
-
-#ifdef __cplusplus
- static inline struct mm_stats_bpf *open(const struct bpf_object_open_opts *opts = nullptr);
- static inline struct mm_stats_bpf *open_and_load();
- static inline int load(struct mm_stats_bpf *skel);
- static inline int attach(struct mm_stats_bpf *skel);
- static inline void detach(struct mm_stats_bpf *skel);
- static inline void destroy(struct mm_stats_bpf *skel);
- static inline const void *elf_bytes(size_t *sz);
-#endif /* __cplusplus */
-};
-
-static void
-mm_stats_bpf__destroy(struct mm_stats_bpf *obj)
-{
- if (!obj)
- return;
- if (obj->skeleton)
- bpf_object__destroy_skeleton(obj->skeleton);
- free(obj);
-}
-
-static inline int
-mm_stats_bpf__create_skeleton(struct mm_stats_bpf *obj);
-
-static inline struct mm_stats_bpf *
-mm_stats_bpf__open_opts(const struct bpf_object_open_opts *opts)
-{
- struct mm_stats_bpf *obj;
- int err;
-
- obj = (struct mm_stats_bpf *)calloc(1, sizeof(*obj));
- if (!obj) {
- errno = ENOMEM;
- return NULL;
- }
-
- err = mm_stats_bpf__create_skeleton(obj);
- if (err)
- goto err_out;
-
- err = bpf_object__open_skeleton(obj->skeleton, opts);
- if (err)
- goto err_out;
-
- return obj;
-err_out:
- mm_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
-}
-
-static inline struct mm_stats_bpf *
-mm_stats_bpf__open(void)
-{
- return mm_stats_bpf__open_opts(NULL);
-}
-
-static inline int
-mm_stats_bpf__load(struct mm_stats_bpf *obj)
-{
- return bpf_object__load_skeleton(obj->skeleton);
-}
-
-static inline struct mm_stats_bpf *
-mm_stats_bpf__open_and_load(void)
-{
- struct mm_stats_bpf *obj;
- int err;
-
- obj = mm_stats_bpf__open();
- if (!obj)
- return NULL;
- err = mm_stats_bpf__load(obj);
- if (err) {
- mm_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
- }
- return obj;
-}
-
-static inline int
-mm_stats_bpf__attach(struct mm_stats_bpf *obj)
-{
- return bpf_object__attach_skeleton(obj->skeleton);
-}
-
-static inline void
-mm_stats_bpf__detach(struct mm_stats_bpf *obj)
-{
- bpf_object__detach_skeleton(obj->skeleton);
-}
-
-static inline const void *mm_stats_bpf__elf_bytes(size_t *sz);
-
-static inline int
-mm_stats_bpf__create_skeleton(struct mm_stats_bpf *obj)
-{
- struct bpf_object_skeleton *s;
- struct bpf_map_skeleton *map __attribute__((unused));
- int err;
-
- s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));
- if (!s) {
- err = -ENOMEM;
- goto err;
- }
-
- s->sz = sizeof(*s);
- s->name = "mm_stats_bpf";
- s->obj = &obj->obj;
-
- /* maps */
- s->map_cnt = 9;
- s->map_skel_sz = 24;
- s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt,
- sizeof(*s->maps) > 24 ? sizeof(*s->maps) : 24);
- if (!s->maps) {
- err = -ENOMEM;
- goto err;
- }
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 0 * s->map_skel_sz);
- map->name = "task_mm_stats_map";
- map->map = &obj->maps.task_mm_stats_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 1 * s->map_skel_sz);
- map->name = "process_mm_stats_map";
- map->map = &obj->maps.process_mm_stats_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 2 * s->map_skel_sz);
- map->name = "task_mm_occupied_list";
- map->map = &obj->maps.task_mm_occupied_list;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 3 * s->map_skel_sz);
- map->name = "process_mm_occupied_list";
- map->map = &obj->maps.process_mm_occupied_list;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 4 * s->map_skel_sz);
- map->name = "threhold_map";
- map->map = &obj->maps.threhold_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 5 * s->map_skel_sz);
- map->name = "task_mm_stats_buffer";
- map->map = &obj->maps.task_mm_stats_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 6 * s->map_skel_sz);
- map->name = "process_mm_stats_buffer";
- map->map = &obj->maps.process_mm_stats_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 7 * s->map_skel_sz);
- map->name = "oom_event_buffer";
- map->map = &obj->maps.oom_event_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 8 * s->map_skel_sz);
- map->name = "mm_stats.rodata";
- map->map = &obj->maps.rodata;
-
- /* programs */
- s->prog_cnt = 8;
- s->prog_skel_sz = sizeof(*s->progs);
- s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);
- if (!s->progs) {
- err = -ENOMEM;
- goto err;
- }
-
- s->progs[0].name = "oom_kill_process";
- s->progs[0].prog = &obj->progs.oom_kill_process;
- s->progs[0].link = &obj->links.oom_kill_process;
-
- s->progs[1].name = "trace_kmalloc";
- s->progs[1].prog = &obj->progs.trace_kmalloc;
- s->progs[1].link = &obj->links.trace_kmalloc;
-
- s->progs[2].name = "trace_kfree";
- s->progs[2].prog = &obj->progs.trace_kfree;
- s->progs[2].link = &obj->links.trace_kfree;
-
- s->progs[3].name = "trace_page_alloc";
- s->progs[3].prog = &obj->progs.trace_page_alloc;
- s->progs[3].link = &obj->links.trace_page_alloc;
-
- s->progs[4].name = "trace_page_free";
- s->progs[4].prog = &obj->progs.trace_page_free;
- s->progs[4].link = &obj->links.trace_page_free;
-
- s->progs[5].name = "trace_cache_alloc";
- s->progs[5].prog = &obj->progs.trace_cache_alloc;
- s->progs[5].link = &obj->links.trace_cache_alloc;
-
- s->progs[6].name = "trace_cache_free";
- s->progs[6].prog = &obj->progs.trace_cache_free;
- s->progs[6].link = &obj->links.trace_cache_free;
-
- s->progs[7].name = "handle_mm_task_exit";
- s->progs[7].prog = &obj->progs.handle_mm_task_exit;
- s->progs[7].link = &obj->links.handle_mm_task_exit;
-
- s->data = mm_stats_bpf__elf_bytes(&s->data_sz);
-
- obj->skeleton = s;
- return 0;
-err:
- bpf_object__destroy_skeleton(s);
- return err;
-}
-
-static inline const void *mm_stats_bpf__elf_bytes(size_t *sz)
-{
- static const char data[] __attribute__((__aligned__(8))) = "\
-\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xb8\xce\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x1a\0\
-\x01\0\0\x2e\x73\x74\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x74\
-\x65\x78\x74\0\x6b\x70\x72\x6f\x62\x65\x2f\x6f\x6f\x6d\x5f\x6b\x69\x6c\x6c\x5f\
-\x70\x72\x6f\x63\x65\x73\x73\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\
-\x6d\x65\x6d\x2f\x6b\x6d\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\
-\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\
-\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\
-\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\
-\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\
-\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\
-\x65\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\
-\x6d\x65\x6d\x2f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\
-\x68\x65\x64\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x65\x78\x69\x74\0\x6c\x69\x63\
-\x65\x6e\x73\x65\0\x2e\x6d\x61\x70\x73\0\x2e\x72\x6f\x64\x61\x74\x61\0\x6d\x6d\
-\x5f\x73\x74\x61\x74\x73\x2e\x62\x70\x66\x2e\x63\0\x4c\x42\x42\x30\x5f\x32\0\
-\x5f\x5f\x5f\x5f\x6f\x6f\x6d\x5f\x6b\x69\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x73\
-\x73\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x30\x5f\x33\0\x4c\x42\x42\
-\x31\x5f\x37\0\x4c\x42\x42\x31\x5f\x33\0\x4c\x42\x42\x31\x5f\x34\0\x74\x61\x73\
-\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\
-\x74\0\x4c\x42\x42\x31\x5f\x36\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\
-\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\0\x7a\x65\x72\x6f\
-\0\x4c\x42\x42\x32\x5f\x32\0\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\
-\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\
-\x4c\x42\x42\x32\x5f\x31\x32\0\x4c\x42\x42\x32\x5f\x34\0\x4c\x42\x42\x32\x5f\
-\x31\x31\0\x4c\x42\x42\x32\x5f\x37\0\x4c\x42\x42\x32\x5f\x31\x30\0\x74\x61\x73\
-\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\
-\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\x6f\x6e\x65\0\x4c\x42\x42\x33\
-\x5f\x32\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\
-\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\
-\x42\x33\x5f\x31\x32\0\x4c\x42\x42\x33\x5f\x34\0\x4c\x42\x42\x33\x5f\x31\x31\0\
-\x4c\x42\x42\x33\x5f\x37\0\x4c\x42\x42\x33\x5f\x31\x30\0\x70\x72\x6f\x63\x65\
-\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\
-\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\x4c\x42\x42\x34\x5f\x37\0\
-\x4c\x42\x42\x34\x5f\x33\0\x4c\x42\x42\x34\x5f\x34\0\x4c\x42\x42\x34\x5f\x36\0\
-\x4c\x42\x42\x35\x5f\x37\0\x4c\x42\x42\x35\x5f\x33\0\x4c\x42\x42\x35\x5f\x34\0\
-\x4c\x42\x42\x35\x5f\x36\0\x4c\x42\x42\x36\x5f\x37\0\x4c\x42\x42\x36\x5f\x33\0\
-\x4c\x42\x42\x36\x5f\x34\0\x4c\x42\x42\x36\x5f\x36\0\x4c\x42\x42\x37\x5f\x37\0\
-\x4c\x42\x42\x37\x5f\x33\0\x4c\x42\x42\x37\x5f\x34\0\x4c\x42\x42\x37\x5f\x36\0\
-\x4c\x42\x42\x38\x5f\x37\0\x4c\x42\x42\x38\x5f\x33\0\x4c\x42\x42\x38\x5f\x34\0\
-\x4c\x42\x42\x38\x5f\x36\0\x4c\x42\x42\x39\x5f\x34\0\x6f\x6f\x6d\x5f\x6b\x69\
-\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x6f\x6f\x6d\x5f\x65\x76\x65\x6e\x74\
-\x5f\x62\x75\x66\x66\x65\x72\0\x74\x72\x61\x63\x65\x5f\x6b\x6d\x61\x6c\x6c\x6f\
-\x63\0\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\0\
-\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\
-\x70\0\x74\x68\x72\x65\x68\x6f\x6c\x64\x5f\x6d\x61\x70\0\x74\x61\x73\x6b\x5f\
-\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\x72\0\x70\x72\x6f\x63\
-\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\x72\0\
-\x74\x72\x61\x63\x65\x5f\x6b\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x5f\x70\x61\
-\x67\x65\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x5f\x70\x61\x67\x65\x5f\
-\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x5f\x63\x61\x63\x68\x65\x5f\x61\x6c\x6c\
-\x6f\x63\0\x74\x72\x61\x63\x65\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\
-\x68\x61\x6e\x64\x6c\x65\x5f\x6d\x6d\x5f\x74\x61\x73\x6b\x5f\x65\x78\x69\x74\0\
-\x4c\x49\x43\x45\x4e\x53\x45\0\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x6f\x63\x63\x75\
-\x70\x69\x65\x64\x5f\x6c\x69\x73\x74\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\
-\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6c\x69\x73\x74\0\x2e\x72\x65\x6c\x2e\
-\x74\x65\x78\x74\0\x2e\x72\x65\x6c\x6b\x70\x72\x6f\x62\x65\x2f\x6f\x6f\x6d\x5f\
-\x6b\x69\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x2e\x72\x65\x6c\x74\x72\x61\
-\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x61\x6c\x6c\x6f\
-\x63\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\
-\x6d\x2f\x6b\x66\x72\x65\x65\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\
-\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\
-\x6f\x63\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\
-\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\x65\0\x2e\x72\x65\x6c\
-\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\
-\x6d\x5f\x63\x61\x63\x68\x65\x5f\x61\x6c\x6c\x6f\x63\0\x2e\x72\x65\x6c\x74\x72\
-\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\x6d\x5f\
-\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\
-\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\x68\x65\x64\x5f\x70\
-\x72\x6f\x63\x65\x73\x73\x5f\x65\x78\x69\x74\0\x2e\x42\x54\x46\0\x2e\x42\x54\
-\x46\x2e\x65\x78\x74\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x13\
-\x01\0\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x22\x01\0\0\0\0\x04\0\x68\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x29\x01\0\0\x01\0\
-\x0e\0\0\0\0\0\0\0\0\0\x1c\0\0\0\0\0\0\0\x46\x01\0\0\0\0\x04\0\x48\x01\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4d\
-\x01\0\0\0\0\x05\0\xe0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x54\x01\0\0\0\0\x05\0\
-\x60\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5b\x01\0\0\0\0\x05\0\xc0\x01\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x62\x01\0\0\x02\0\x03\0\0\0\0\0\0\0\0\0\x90\x02\0\0\0\0\0\0\
-\x7a\x01\0\0\0\0\x05\0\x80\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x81\x01\0\0\x02\0\
-\x03\0\x90\x02\0\0\0\0\0\0\x38\x02\0\0\0\0\0\0\x9c\x01\0\0\x01\0\x0e\0\x1c\0\0\
-\0\0\0\0\0\x04\0\0\0\0\0\0\0\xa1\x01\0\0\0\0\x03\0\x68\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xa8\x01\0\0\x01\0\x0e\0\x20\0\0\0\0\0\0\0\x1d\0\0\0\0\0\0\0\xc8\x01\0\0\
-\0\0\x03\0\xe0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x01\0\0\0\0\x03\0\xe8\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xd7\x01\0\0\0\0\x03\0\xb0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xdf\x01\0\0\0\0\x03\0\x30\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe6\x01\0\0\0\0\x03\
-\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xee\x01\0\0\x01\0\x0e\0\x3d\0\0\0\0\0\0\
-\0\x1c\0\0\0\0\0\0\0\x10\x02\0\0\x01\0\x0e\0\x5c\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\
-\0\x14\x02\0\0\0\0\x03\0\xf8\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1b\x02\0\0\x01\0\
-\x0e\0\x60\0\0\0\0\0\0\0\x1d\0\0\0\0\0\0\0\x3e\x02\0\0\0\0\x03\0\x78\x03\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x46\x02\0\0\0\0\x03\0\x80\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x4d\x02\0\0\0\0\x03\0\x48\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x55\x02\0\0\0\0\
-\x03\0\xc8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5c\x02\0\0\0\0\x03\0\x38\x04\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x64\x02\0\0\x01\0\x0e\0\x7d\0\0\0\0\0\0\0\x1f\0\0\0\0\0\
-\0\0\0\0\0\0\x03\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x89\x02\0\0\0\0\x06\0\
-\xe0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x02\0\0\0\0\x06\0\x60\x01\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x97\x02\0\0\0\0\x06\0\xc0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9e\
-\x02\0\0\0\0\x06\0\x80\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x07\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa5\x02\0\0\0\0\x07\0\xe0\x02\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xac\x02\0\0\0\0\x07\0\x60\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb3\x02\0\0\
-\0\0\x07\0\xc0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xba\x02\0\0\0\0\x07\0\x80\x02\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xc1\x02\0\0\0\0\x08\0\xe0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x02\0\0\0\0\x08\
-\0\x60\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xcf\x02\0\0\0\0\x08\0\xc0\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\xd6\x02\0\0\0\0\x08\0\x80\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x03\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xdd\x02\0\0\0\0\x09\0\xe8\
-\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe4\x02\0\0\0\0\x09\0\x60\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xeb\x02\0\0\0\0\x09\0\xc0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf2\x02\
-\0\0\0\0\x09\0\x88\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0a\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xf9\x02\0\0\0\0\x0a\0\xe8\x02\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x03\0\0\0\0\x0a\0\x60\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\x03\0\0\0\0\
-\x0a\0\xc0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0e\x03\0\0\0\0\x0a\0\x88\x02\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x15\
-\x03\0\0\0\0\x0b\0\x98\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0e\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x1c\x03\0\0\x12\0\x04\0\0\0\0\0\0\0\0\0\x58\x01\0\0\
-\0\0\0\0\x2d\x03\0\0\x11\0\x0d\0\xc0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x3e\x03\0\
-\0\x12\0\x05\0\0\0\0\0\0\0\0\0\xf0\x02\0\0\0\0\0\0\x4c\x03\0\0\x11\0\x0d\0\0\0\
-\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x5e\x03\0\0\x11\0\x0d\0\x20\0\0\0\0\0\0\0\x20\0\
-\0\0\0\0\0\0\x73\x03\0\0\x11\0\x0d\0\x80\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x80\
-\x03\0\0\x11\0\x0d\0\xa0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x95\x03\0\0\x11\0\x0d\
-\0\xb0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xad\x03\0\0\x12\0\x06\0\0\0\0\0\0\0\0\0\
-\xf0\x02\0\0\0\0\0\0\xb9\x03\0\0\x12\0\x07\0\0\0\0\0\0\0\0\0\xf0\x02\0\0\0\0\0\
-\0\xca\x03\0\0\x12\0\x08\0\0\0\0\0\0\0\0\0\xf0\x02\0\0\0\0\0\0\xda\x03\0\0\x12\
-\0\x09\0\0\0\0\0\0\0\0\0\xf8\x02\0\0\0\0\0\0\xec\x03\0\0\x12\0\x0a\0\0\0\0\0\0\
-\0\0\0\xf8\x02\0\0\0\0\0\0\xfd\x03\0\0\x12\0\x0b\0\0\0\0\0\0\0\0\0\xa8\0\0\0\0\
-\0\0\0\x11\x04\0\0\x11\0\x0c\0\0\0\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\x19\x04\0\0\
-\x11\0\x0d\0\x40\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x2f\x04\0\0\x11\0\x0d\0\x60\0\
-\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xbf\x16\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x18\x02\0\0\x1c\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\
-\0\0\0\0\x55\x07\x05\0\0\0\0\0\x18\x01\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\
-\0\x1d\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x0f\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\
-\x61\x20\0\0\0\0\0\x79\x72\x10\0\0\0\0\0\x0f\x12\0\0\0\0\0\0\x3d\x02\x0b\0\0\0\
-\0\0\x7b\x06\x20\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x16\x28\0\0\0\0\0\x7b\x16\
-\x30\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\xbf\x63\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x95\0\0\0\0\0\0\0\x61\x71\
-\0\0\0\0\0\0\x61\x62\x28\0\0\0\0\0\x3d\x12\x06\0\0\0\0\0\x61\x71\x08\0\0\0\0\0\
-\x61\x62\x30\0\0\0\0\0\x3d\x12\x03\0\0\0\0\0\x61\x61\x2c\0\0\0\0\0\x61\x72\x04\
-\0\0\0\0\0\x2d\x12\xf6\xff\0\0\0\0\x61\x61\x34\0\0\0\0\0\x55\x01\xf4\xff\0\0\0\
-\0\xb7\x08\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x38\0\0\
-\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x05\0\0\
-\0\0\0\x18\x01\0\0\x3d\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1c\0\0\0\x85\0\0\0\
-\x06\0\0\0\x05\0\xe7\xff\0\0\0\0\x7b\x87\x30\0\0\0\0\0\x7b\x87\x28\0\0\0\0\0\
-\x7b\x87\x20\0\0\0\0\0\x7b\x87\x18\0\0\0\0\0\x7b\x87\x10\0\0\0\0\0\x7b\x87\x08\
-\0\0\0\0\0\x7b\x87\0\0\0\0\0\0\x61\x61\0\0\0\0\0\0\x63\x17\0\0\0\0\0\0\x61\x61\
-\x04\0\0\0\0\0\x63\x17\x04\0\0\0\0\0\xbf\x71\0\0\0\0\0\0\x07\x01\0\0\x0c\0\0\0\
-\xbf\x63\0\0\0\0\0\0\x07\x03\0\0\x0c\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x2d\
-\0\0\0\x61\x61\x28\0\0\0\0\0\x63\x17\x28\0\0\0\0\0\x61\x61\x30\0\0\0\0\0\x63\
-\x17\x30\0\0\0\0\0\x61\x61\x2c\0\0\0\0\0\x63\x17\x2c\0\0\0\0\0\xbf\x71\0\0\0\0\
-\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\x16\x34\
-\0\0\0\0\0\x05\0\xc4\xff\0\0\0\0\xbf\x16\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x18\x02\0\0\x5c\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\
-\0\0\0\0\0\x55\x07\x05\0\0\0\0\0\x18\x01\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\
-\0\0\x1d\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x10\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x79\
-\x61\x10\0\0\0\0\0\x79\x72\x10\0\0\0\0\0\x0f\x12\0\0\0\0\0\0\x3d\x02\x0c\0\0\0\
-\0\0\x7b\x06\x10\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x16\x18\0\0\0\0\0\x7b\x16\
-\x08\0\0\0\0\0\x63\x16\x04\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\
-\x62\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\
-\x95\0\0\0\0\0\0\0\x61\x71\0\0\0\0\0\0\x61\x62\x04\0\0\0\0\0\x3d\x12\x06\0\0\0\
-\0\0\x61\x71\x08\0\0\0\0\0\x61\x62\x0c\0\0\0\0\0\x3d\x12\x03\0\0\0\0\0\x61\x61\
-\x08\0\0\0\0\0\x61\x72\x04\0\0\0\0\0\x2d\x12\xf6\xff\0\0\0\0\x61\x61\x18\0\0\0\
-\0\0\x55\x01\xf4\xff\0\0\0\0\xb7\x07\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb7\x02\0\0\x20\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\x55\0\x05\
-\0\0\0\0\0\x18\x01\0\0\x7d\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1f\0\0\0\x85\0\0\
-\0\x06\0\0\0\x05\0\xe8\xff\0\0\0\0\x7b\x70\x18\0\0\0\0\0\x7b\x70\x10\0\0\0\0\0\
-\x7b\x70\x08\0\0\0\0\0\x7b\x70\0\0\0\0\0\0\x61\x61\0\0\0\0\0\0\x63\x10\0\0\0\0\
-\0\0\x61\x61\x04\0\0\0\0\0\x63\x10\x04\0\0\0\0\0\x61\x61\x0c\0\0\0\0\0\x63\x10\
-\x0c\0\0\0\0\0\x61\x61\x08\0\0\0\0\0\x63\x10\x08\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\
-\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\x16\x18\0\0\
-\0\0\0\x05\0\xd0\xff\0\0\0\0\x79\x17\x70\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xb7\x02\0\0\x20\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x06\
-\0\0\0\0\0\0\x55\x06\x05\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\
-\0\0\x1c\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x1c\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\
-\x06\x18\0\0\0\0\0\xb7\x01\0\0\x28\0\0\0\x0f\x17\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\
-\0\x07\x01\0\0\xf8\xff\xff\xff\xb7\x02\0\0\x08\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\
-\0\0\x04\0\0\0\xb7\x01\0\0\x78\x05\0\0\x79\xa3\xf8\xff\0\0\0\0\x0f\x13\0\0\0\0\
-\0\0\xbf\x61\0\0\0\0\0\0\x07\x01\0\0\x04\0\0\0\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\
-\x04\0\0\0\xb7\x01\0\0\x88\x07\0\0\x79\xa3\xf8\xff\0\0\0\0\x0f\x13\0\0\0\0\0\0\
-\xbf\x61\0\0\0\0\0\0\x07\x01\0\0\x08\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x04\
-\0\0\0\x85\0\0\0\x0e\0\0\0\x63\x06\0\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\
-\0\0\0\0\x85\0\0\0\x84\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\
-\0\0\0\xbf\x07\0\0\0\0\0\0\xbf\x78\0\0\0\0\0\0\x77\x08\0\0\x20\0\0\0\x63\x8a\
-\xfc\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x06\0\0\0\0\0\
-\0\x67\x07\0\0\x20\0\0\0\x77\x07\0\0\x20\0\0\0\x15\x07\x51\0\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
-\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x1a\0\0\0\0\0\x63\x8a\xc4\xff\0\0\
-\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\
-\x1a\xf0\xff\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x7b\x1a\
-\xd8\xff\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa1\0\0\0\
-\0\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\
-\xb7\x01\0\0\x01\0\0\0\x63\x1a\xe8\xff\0\0\0\0\x7b\x6a\xe0\xff\0\0\0\0\xbf\xa2\
-\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x28\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\
-\x17\x28\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
-\0\xbf\x07\0\0\0\0\0\0\x55\x07\x11\0\0\0\0\0\x7b\x6a\xd0\xff\0\0\0\0\xb7\x01\0\
-\0\x01\0\0\0\x63\x1a\xc4\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\xc0\xff\0\
-\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\xd8\xff\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\
-\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\
-\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x04\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\
-\x63\x17\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\x51\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\
-\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\x07\0\0\0\0\0\0\xbf\x78\0\0\0\0\0\0\x77\x08\
-\0\0\x20\0\0\0\x63\x8a\xfc\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\x85\0\0\0\x05\0\
-\0\0\xbf\x06\0\0\0\0\0\0\x67\x07\0\0\x20\0\0\0\x77\x07\0\0\x20\0\0\0\x15\x07\
-\x51\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x1a\0\0\0\
-\0\0\x63\x8a\xc4\xff\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\
-\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\
-\xe0\xff\0\0\0\0\x7b\x1a\xd8\xff\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\x7b\x1a\xc8\
-\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\
-\0\0\x85\0\0\0\x10\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\x1a\xe8\xff\0\0\0\0\x7b\x6a\
-\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\
-\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\
-\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x28\0\0\0\0\0\x07\
-\x01\0\0\x01\0\0\0\x63\x17\x28\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\
-\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x11\0\0\0\0\0\x7b\x6a\
-\xd0\xff\0\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\x1a\xc4\xff\0\0\0\0\x61\xa1\xfc\xff\
-\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\xd8\xff\0\0\0\0\
-\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x04\0\0\
-\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x04\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\
-\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\x51\0\
-\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\x07\0\0\0\0\0\
-\0\xbf\x78\0\0\0\0\0\0\x77\x08\0\0\x20\0\0\0\x63\x8a\xfc\xff\0\0\0\0\x63\x7a\
-\xf8\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x06\0\0\0\0\0\0\x67\x07\0\0\x20\0\0\0\
-\x77\x07\0\0\x20\0\0\0\x15\x07\x51\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\
-\x07\0\0\0\0\0\0\x55\x07\x1a\0\0\0\0\0\x63\x8a\xc4\xff\0\0\0\0\x61\xa1\xf8\xff\
-\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\
-\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x7b\x1a\xd8\xff\0\0\0\0\x7b\
-\x1a\xd0\xff\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\
-\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\xb7\x01\0\0\x01\0\0\
-\0\x63\x1a\xec\xff\0\0\0\0\x7b\x6a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\
-\0\0\0\0\x61\x71\x2c\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x2c\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\
-\0\0\x85\x10\0\0\xff\xff\xff\xff\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\
-\0\x55\x07\x11\0\0\0\0\0\x7b\x6a\xd0\xff\0\0\0\0\xb7\x01\0\0\x01\0\0\0\x7b\x1a\
-\xc8\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\
-\0\0\0\x63\x1a\xd8\xff\0\0\0\0\x63\x1a\xc4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\
-\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\
-\x0c\0\0\0\0\0\x61\x71\x08\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x08\0\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\
-\0\0\0\0\0\x85\x10\0\0\x51\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\
-\x0e\0\0\0\xbf\x07\0\0\0\0\0\0\xbf\x78\0\0\0\0\0\0\x77\x08\0\0\x20\0\0\0\x63\
-\x8a\xfc\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x06\0\0\0\
-\0\0\0\x67\x07\0\0\x20\0\0\0\x77\x07\0\0\x20\0\0\0\x15\x07\x51\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x1a\0\0\0\0\0\x63\x8a\xc4\
-\xff\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\
-\0\x7b\x1a\xf0\xff\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x7b\
-\x1a\xd8\xff\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa1\0\
-\0\0\0\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\
-\0\xb7\x01\0\0\x01\0\0\0\x63\x1a\xec\xff\0\0\0\0\x7b\x6a\xe0\xff\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\
-\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\
-\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x2c\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\
-\x63\x17\x2c\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbf\xa2\0\0\0\0\0\0\
-\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\
-\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x11\0\0\0\0\0\x7b\x6a\xd0\xff\0\0\0\0\xb7\
-\x01\0\0\x01\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\xc0\
-\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\xd8\xff\0\0\0\0\x63\x1a\xc4\xff\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\
-\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\
-\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x08\0\0\0\0\0\x07\x01\0\0\x01\
-\0\0\0\x63\x17\x08\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\
-\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\
-\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\x51\0\0\0\xb7\0\0\0\0\0\0\
-\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\x07\0\0\0\0\0\0\xbf\x78\0\0\0\0\0\
-\0\x77\x08\0\0\x20\0\0\0\x63\x8a\xfc\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\x85\0\
-\0\0\x05\0\0\0\xbf\x06\0\0\0\0\0\0\x67\x07\0\0\x20\0\0\0\x77\x07\0\0\x20\0\0\0\
-\x15\x07\x52\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\
-\x1a\0\0\0\0\0\x63\x8a\xc4\xff\0\0\0\0\x61\xa1\xf8\xff\0\0\0\0\x63\x1a\xc0\xff\
-\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\
-\x7b\x1a\xe0\xff\0\0\0\0\x7b\x1a\xd8\xff\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\x7b\
-\x1a\xc8\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\
-\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\xb7\x01\0\0\x01\0\0\0\x63\x1a\xf0\xff\0\0\0\0\
-\x7b\x6a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x30\0\0\
-\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x30\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\
-\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\xff\
-\xff\xff\xff\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x12\0\0\0\0\
-\0\x7b\x6a\xd0\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x7b\x1a\xc8\
-\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\
-\0\x63\x1a\xd8\xff\0\0\0\0\x63\x1a\xc4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\
-\0\0\0\0\x61\x71\x0c\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\x0c\0\0\0\0\0\xbf\
-\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\
-\0\0\x85\x10\0\0\x51\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\
-\0\0\xbf\x07\0\0\0\0\0\0\xbf\x78\0\0\0\0\0\0\x77\x08\0\0\x20\0\0\0\x63\x8a\xfc\
-\xff\0\0\0\0\x63\x7a\xf8\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x06\0\0\0\0\0\0\
-\x67\x07\0\0\x20\0\0\0\x77\x07\0\0\x20\0\0\0\x15\x07\x52\0\0\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\
-\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x55\x07\x1a\0\0\0\0\0\x63\x8a\xc4\xff\0\0\0\
-\0\x61\xa1\xf8\xff\0\0\0\0\x63\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\
-\xf0\xff\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x7b\x1a\xd8\
-\xff\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\
-\0\x07\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\xb7\
-\x01\0\0\x01\0\0\0\x63\x1a\xf0\xff\0\0\0\0\x7b\x6a\xe0\xff\0\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xc0\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x30\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x63\x17\
-\x30\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\
-\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbf\xa2\0\0\0\0\0\0\x07\x02\
-\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\
-\xbf\x07\0\0\0\0\0\0\x55\x07\x12\0\0\0\0\0\x7b\x6a\xd0\xff\0\0\0\0\x18\x01\0\0\
-\0\0\0\0\0\0\0\0\x01\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x63\
-\x1a\xc0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\xd8\xff\0\0\0\0\x63\x1a\xc4\
-\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\xbf\xa3\0\0\0\0\0\
-\0\x07\x03\0\0\xc0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\
-\0\0\0\0\x85\0\0\0\x02\0\0\0\x05\0\x0c\0\0\0\0\0\x61\x71\x0c\0\0\0\0\0\x07\x01\
-\0\0\x01\0\0\0\x63\x17\x0c\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\
-\0\0\0\x85\0\0\0\x02\0\0\0\xbf\x71\0\0\0\0\0\0\x85\x10\0\0\x51\0\0\0\xb7\0\0\0\
-\0\0\0\0\x95\0\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x63\x0a\xfc\xff\0\0\0\0\x18\x01\
-\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x2d\x01\x0e\0\0\0\0\0\x67\0\0\0\x20\0\0\0\x77\0\
-\0\0\x20\0\0\0\x15\0\x0b\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\
-\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x05\0\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x85\0\0\0\x03\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x44\x75\x61\
-\x6c\x20\x42\x53\x44\x2f\x47\x50\x4c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x74\x68\
-\x65\x20\x6f\x6f\x6d\x5f\x65\x76\x65\x6e\x74\x5f\x62\x75\x66\x66\x20\x69\x73\
-\x20\x66\x75\x6c\x6c\x0a\0\0\0\0\0\x6d\x6d\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\
-\x20\x6d\x61\x70\x20\x69\x73\x20\x6e\x6f\x74\x20\x69\x6e\x69\x74\x0a\0\x74\x61\
-\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x20\x69\x73\
-\x20\x66\x75\x6c\x6c\x0a\0\0\0\0\x01\0\0\0\x6d\x6d\x5f\x74\x68\x72\x65\x68\x6f\
-\x6c\x64\x20\x6d\x61\x70\x20\x69\x73\x20\x6e\x6f\x74\x20\x69\x6e\x69\x74\x0a\0\
-\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\
-\x66\x66\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\0\0\0\0\x08\0\0\0\0\0\0\0\x01\0\
-\0\0\x41\0\0\0\x18\0\0\0\0\0\0\0\x01\0\0\0\x3b\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\
-\0\x3b\0\0\0\xb0\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x48\x01\0\0\0\0\0\0\x01\0\0\
-\0\x42\0\0\0\x80\x01\0\0\0\0\0\0\x01\0\0\0\x3b\0\0\0\x98\x02\0\0\0\0\0\0\x01\0\
-\0\0\x41\0\0\0\xa8\x02\0\0\0\0\0\0\x01\0\0\0\x3b\0\0\0\xd0\x02\0\0\0\0\0\0\x01\
-\0\0\0\x3b\0\0\0\x48\x03\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xe0\x03\0\0\0\0\0\0\
-\x01\0\0\0\x43\0\0\0\x10\x04\0\0\0\0\0\0\x01\0\0\0\x3b\0\0\0\x08\0\0\0\0\0\0\0\
-\x01\0\0\0\x3d\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\0\x3b\0\0\0\x68\0\0\0\0\0\0\0\
-\x01\0\0\0\x3f\0\0\0\x38\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x88\x01\0\0\0\0\0\
-\0\x01\0\0\0\x3f\0\0\0\xb8\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\xd0\x01\0\0\0\0\
-\0\0\x01\0\0\0\x40\0\0\0\x58\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xa8\x02\0\0\0\
-\0\0\0\x01\0\0\0\x40\0\0\0\xd8\x02\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x68\0\0\0\0\
-\0\0\0\x01\0\0\0\x3f\0\0\0\x38\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x88\x01\0\0\
-\0\0\0\0\x01\0\0\0\x3f\0\0\0\xb8\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\xd0\x01\0\
-\0\0\0\0\0\x01\0\0\0\x40\0\0\0\x58\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xa8\x02\
-\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xd8\x02\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x68\0\
-\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x38\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x88\
-\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xb8\x01\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\
-\xd0\x01\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\x58\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\
-\0\xa8\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xd8\x02\0\0\0\0\0\0\x0a\0\0\0\x02\0\
-\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x38\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\
-\0\0\x88\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xb8\x01\0\0\0\0\0\0\x0a\0\0\0\x02\
-\0\0\0\xd0\x01\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\x58\x02\0\0\0\0\0\0\x01\0\0\0\
-\x40\0\0\0\xa8\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xd8\x02\0\0\0\0\0\0\x0a\0\0\
-\0\x02\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x38\x01\0\0\0\0\0\0\x01\0\0\
-\0\x3f\0\0\0\x88\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xb8\x01\0\0\0\0\0\0\x0a\0\
-\0\0\x02\0\0\0\xd0\x01\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\x60\x02\0\0\0\0\0\0\x01\
-\0\0\0\x40\0\0\0\xb0\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xe0\x02\0\0\0\0\0\0\
-\x0a\0\0\0\x02\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x38\x01\0\0\0\0\0\0\
-\x01\0\0\0\x3f\0\0\0\x88\x01\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\xb8\x01\0\0\0\0\0\
-\0\x0a\0\0\0\x02\0\0\0\xd0\x01\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\x60\x02\0\0\0\0\
-\0\0\x01\0\0\0\x40\0\0\0\xb0\x02\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xe0\x02\0\0\0\
-\0\0\0\x0a\0\0\0\x02\0\0\0\x50\0\0\0\0\0\0\0\x01\0\0\0\x3f\0\0\0\x80\0\0\0\0\0\
-\0\0\x01\0\0\0\x3f\0\0\0\x9f\xeb\x01\0\x18\0\0\0\0\0\0\0\xe8\x4a\0\0\xe8\x4a\0\
-\0\x15\x43\0\0\0\0\0\0\0\0\0\x02\x03\0\0\0\x01\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\
-\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x01\0\0\0\x05\0\0\0\0\0\0\
-\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x06\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
-\x02\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x02\x08\0\0\0\0\0\0\0\0\0\0\x03\0\
-\0\0\0\x02\0\0\0\x04\0\0\0\x38\0\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x90\x01\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\
-\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x07\0\0\0\x80\
-\0\0\0\x32\0\0\0\x09\0\0\0\xc0\0\0\0\x3e\0\0\0\0\0\0\x0e\x0b\0\0\0\x01\0\0\0\0\
-\0\0\0\0\0\0\x02\x0e\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x20\0\
-\0\0\0\0\0\0\0\0\0\x02\x10\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\
-\0\x10\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\
-\x05\0\0\0\x40\0\0\0\x27\0\0\0\x0d\0\0\0\x80\0\0\0\x32\0\0\0\x0f\0\0\0\xc0\0\0\
-\0\x50\0\0\0\0\0\0\x0e\x11\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x14\0\0\0\0\0\0\0\
-\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\x02\x16\0\0\0\0\
-\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x14\0\0\0\0\0\0\0\0\0\0\x02\x18\0\
-\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x01\0\0\0\0\0\0\x04\0\0\
-\x04\x20\0\0\0\x19\0\0\0\x13\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\
-\0\0\x15\0\0\0\x80\0\0\0\x32\0\0\0\x17\0\0\0\xc0\0\0\0\x65\0\0\0\0\0\0\x0e\x19\
-\0\0\0\x01\0\0\0\x7b\0\0\0\0\0\0\x0e\x19\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x1d\
-\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x18\0\0\0\0\0\0\0\x04\0\0\
-\x04\x20\0\0\0\x19\0\0\0\x13\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\
-\0\0\x1c\0\0\0\x80\0\0\0\x32\0\0\0\x13\0\0\0\xc0\0\0\0\x94\0\0\0\0\0\0\x0e\x1e\
-\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x21\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\
-\0\x04\0\0\0\x1b\0\0\0\0\0\0\0\0\0\0\x02\x23\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
-\x02\0\0\0\x04\0\0\0\0\0\x04\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x20\0\0\
-\0\0\0\0\0\x32\0\0\0\x22\0\0\0\x40\0\0\0\xa1\0\0\0\0\0\0\x0e\x24\0\0\0\x01\0\0\
-\0\0\0\0\0\0\0\0\x02\x27\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\
-\0\x02\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x20\0\0\0\0\0\0\0\x32\0\0\0\
-\x26\0\0\0\x40\0\0\0\xb6\0\0\0\0\0\0\x0e\x28\0\0\0\x01\0\0\0\xce\0\0\0\0\0\0\
-\x0e\x24\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x2c\0\0\0\xdf\0\0\0\x15\0\0\x04\xa8\
-\0\0\0\xe7\0\0\0\x2d\0\0\0\0\0\0\0\xeb\0\0\0\x2d\0\0\0\x40\0\0\0\xef\0\0\0\x2d\
-\0\0\0\x80\0\0\0\xf3\0\0\0\x2d\0\0\0\xc0\0\0\0\xf7\0\0\0\x2d\0\0\0\0\x01\0\0\
-\xfa\0\0\0\x2d\0\0\0\x40\x01\0\0\xfd\0\0\0\x2d\0\0\0\x80\x01\0\0\x01\x01\0\0\
-\x2d\0\0\0\xc0\x01\0\0\x05\x01\0\0\x2d\0\0\0\0\x02\0\0\x08\x01\0\0\x2d\0\0\0\
-\x40\x02\0\0\x0b\x01\0\0\x2d\0\0\0\x80\x02\0\0\x0e\x01\0\0\x2d\0\0\0\xc0\x02\0\
-\0\x11\x01\0\0\x2d\0\0\0\0\x03\0\0\x14\x01\0\0\x2d\0\0\0\x40\x03\0\0\x17\x01\0\
-\0\x2d\0\0\0\x80\x03\0\0\x1a\x01\0\0\x2d\0\0\0\xc0\x03\0\0\x22\x01\0\0\x2d\0\0\
-\0\0\x04\0\0\x25\x01\0\0\x2d\0\0\0\x40\x04\0\0\x28\x01\0\0\x2d\0\0\0\x80\x04\0\
-\0\x2e\x01\0\0\x2d\0\0\0\xc0\x04\0\0\x31\x01\0\0\x2d\0\0\0\0\x05\0\0\x34\x01\0\
-\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x42\x01\0\0\x2b\
-\0\0\0\x46\x01\0\0\x01\0\0\x0c\x2e\0\0\0\x57\x01\0\0\x09\0\0\x04\x40\0\0\0\x63\
-\x01\0\0\x31\0\0\0\0\0\0\0\x6c\x01\0\0\x32\0\0\0\x40\0\0\0\x75\x01\0\0\x36\0\0\
-\0\x80\0\0\0\x7b\x01\0\0\x37\0\0\0\xc0\0\0\0\x84\x01\0\0\x3a\0\0\0\xe0\0\0\0\
-\x8a\x01\0\0\x2d\0\0\0\0\x01\0\0\x95\x01\0\0\x3b\0\0\0\x40\x01\0\0\x9c\x01\0\0\
-\x3c\0\0\0\x80\x01\0\0\xaa\x01\0\0\x3d\0\0\0\xc0\x01\0\0\0\0\0\0\0\0\0\x02\xeb\
-\x01\0\0\0\0\0\0\0\0\0\x02\x33\0\0\0\xb5\x01\0\0\0\0\0\x08\x34\0\0\0\0\0\0\0\
-\x01\0\0\x04\x08\0\0\0\xc0\x01\0\0\x35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
-\x2d\0\0\0\x04\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\xc7\x01\0\0\0\0\0\0\0\0\0\x0a\
-\x38\0\0\0\xc5\x01\0\0\0\0\0\x08\x39\0\0\0\xcb\x01\0\0\0\0\0\x01\x04\0\0\0\x20\
-\0\0\0\0\0\0\0\0\0\0\x0a\x02\0\0\0\0\0\0\0\0\0\0\x02\x3e\0\0\0\xd8\x01\0\0\0\0\
-\0\x01\x08\0\0\0\x40\0\0\x01\xdd\x01\0\0\x04\0\0\x06\x04\0\0\0\xec\x01\0\0\0\0\
-\0\0\xfc\x01\0\0\x01\0\0\0\x0e\x02\0\0\x02\0\0\0\x27\x02\0\0\x03\0\0\0\x38\x02\
-\0\0\xfd\0\0\x84\x40\x27\0\0\x44\x02\0\0\x3f\0\0\0\0\0\0\0\x50\x02\0\0\x39\0\0\
-\0\xc0\0\0\0\x58\x02\0\0\x42\0\0\0\0\x01\0\0\x5e\x02\0\0\x43\0\0\0\x40\x01\0\0\
-\x28\x01\0\0\x39\0\0\0\x60\x01\0\0\x64\x02\0\0\x39\0\0\0\x80\x01\0\0\x6b\x02\0\
-\0\x02\0\0\0\xa0\x01\0\0\x72\x02\0\0\x47\0\0\0\xc0\x01\0\0\x7d\x02\0\0\x39\0\0\
-\0\x40\x02\0\0\x89\x02\0\0\x2d\0\0\0\x80\x02\0\0\x9d\x02\0\0\x3b\0\0\0\xc0\x02\
-\0\0\xa8\x02\0\0\x02\0\0\0\0\x03\0\0\xb8\x02\0\0\x02\0\0\0\x20\x03\0\0\xc1\x02\
-\0\0\x02\0\0\0\x40\x03\0\0\xc7\x02\0\0\x02\0\0\0\x60\x03\0\0\xcc\x02\0\0\x02\0\
-\0\0\x80\x03\0\0\xd8\x02\0\0\x02\0\0\0\xa0\x03\0\0\xe4\x02\0\0\x39\0\0\0\xc0\
-\x03\0\0\xf0\x02\0\0\x4e\0\0\0\0\x04\0\0\xf3\x02\0\0\x5b\0\0\0\0\x0c\0\0\xf6\
-\x02\0\0\x5d\0\0\0\x80\x0d\0\0\xf9\x02\0\0\x6d\0\0\0\x80\x14\0\0\x05\x03\0\0\
-\x6f\0\0\0\xc0\x14\0\0\x16\x03\0\0\x70\0\0\0\0\x16\0\0\x1c\x03\0\0\x39\0\0\0\0\
-\x1e\0\0\x27\x03\0\0\x39\0\0\0\x20\x1e\0\0\x2e\x03\0\0\x02\0\0\0\x40\x1e\0\0\
-\x3e\x03\0\0\x71\0\0\0\x80\x1e\0\0\x47\x03\0\0\x74\0\0\0\xc0\x1e\0\0\x55\x03\0\
-\0\x73\0\0\0\0\x1f\0\0\x5f\x03\0\0\x42\0\0\0\x80\x1f\0\0\x71\x03\0\0\x4d\0\0\0\
-\xc0\x1f\0\0\x84\x03\0\0\x4d\0\0\0\xd0\x1f\0\0\x94\x03\0\0\x02\0\0\0\xe0\x1f\0\
-\0\xaa\x03\0\0\x77\0\0\0\0\x20\0\0\xc2\x03\0\0\x52\0\0\0\x40\x20\0\0\xd1\x03\0\
-\0\x79\0\0\0\xc0\x20\0\0\xe2\x03\0\0\x2d\0\0\0\0\x21\0\0\xf2\x03\0\0\x69\0\0\0\
-\x40\x21\0\0\x04\x04\0\0\x69\0\0\0\x48\x21\0\0\x12\x04\0\0\x02\0\0\0\x60\x21\0\
-\0\x25\x04\0\0\x52\0\0\0\x80\x21\0\0\x3c\x04\0\0\x02\0\0\0\0\x22\0\0\x4f\x04\0\
-\0\x02\0\0\0\x20\x22\0\0\x5e\x04\0\0\x77\0\0\0\x40\x22\0\0\x71\x04\0\0\x52\0\0\
-\0\x80\x22\0\0\x82\x04\0\0\x52\0\0\0\0\x23\0\0\x90\x04\0\0\x02\0\0\0\x80\x23\0\
-\0\x9d\x04\0\0\x7a\0\0\0\xc0\x23\0\0\xa8\x04\0\0\x52\0\0\0\xc0\x24\0\0\xae\x04\
-\0\0\x7b\0\0\0\x40\x25\0\0\xbd\x04\0\0\x50\0\0\0\x80\x26\0\0\xcf\x04\0\0\x7c\0\
-\0\0\x40\x27\0\0\xd2\x04\0\0\x7c\0\0\0\x80\x27\0\0\xdc\x04\0\0\x7d\0\0\0\xc0\
-\x27\0\0\xe5\x04\0\0\x02\0\0\0\x60\x28\0\0\xf0\x04\0\0\x02\0\0\0\x80\x28\0\0\
-\xfa\x04\0\0\x02\0\0\0\xa0\x28\0\0\x06\x05\0\0\x02\0\0\0\xc0\x28\0\0\x14\x05\0\
-\0\x2d\0\0\0\0\x29\0\0\x1b\x05\0\0\x39\0\0\0\x40\x29\0\0\x27\x05\0\0\x39\0\0\0\
-\x60\x29\0\x01\x3b\x05\0\0\x39\0\0\0\x61\x29\0\x01\x55\x05\0\0\x39\0\0\0\x62\
-\x29\0\x01\x64\x05\0\0\x39\0\0\0\x80\x29\0\x01\x78\x05\0\0\x39\0\0\0\x81\x29\0\
-\x01\x82\x05\0\0\x39\0\0\0\x82\x29\0\x01\x8c\x05\0\0\x39\0\0\0\x83\x29\0\x01\
-\x9c\x05\0\0\x39\0\0\0\x84\x29\0\x01\xaa\x05\0\0\x39\0\0\0\x85\x29\0\x01\xb9\
-\x05\0\0\x39\0\0\0\x86\x29\0\x01\xcd\x05\0\0\x39\0\0\0\x87\x29\0\x01\xd4\x05\0\
-\0\x39\0\0\0\x88\x29\0\x01\xe1\x05\0\0\x39\0\0\0\x89\x29\0\x01\xec\x05\0\0\x39\
-\0\0\0\x8a\x29\0\x01\0\x06\0\0\x39\0\0\0\x8b\x29\0\x01\x0d\x06\0\0\x2d\0\0\0\
-\xc0\x29\0\0\x1a\x06\0\0\x7e\0\0\0\0\x2a\0\0\x28\x06\0\0\x8e\0\0\0\xc0\x2b\0\0\
-\x2c\x06\0\0\x8e\0\0\0\xe0\x2b\0\0\x31\x06\0\0\x2d\0\0\0\0\x2c\0\0\x3e\x06\0\0\
-\x3b\0\0\0\x40\x2c\0\0\x4a\x06\0\0\x3b\0\0\0\x80\x2c\0\0\x51\x06\0\0\x52\0\0\0\
-\xc0\x2c\0\0\x5a\x06\0\0\x52\0\0\0\x40\x2d\0\0\x62\x06\0\0\x3b\0\0\0\xc0\x2d\0\
-\0\x6f\x06\0\0\x52\0\0\0\0\x2e\0\0\x77\x06\0\0\x52\0\0\0\x80\x2e\0\0\x84\x06\0\
-\0\x90\0\0\0\0\x2f\0\0\x8f\x06\0\0\x94\0\0\0\x40\x2f\0\0\x99\x06\0\0\x52\0\0\0\
-\x40\x31\0\0\xa6\x06\0\0\x52\0\0\0\xc0\x31\0\0\xb2\x06\0\0\x95\0\0\0\x40\x32\0\
-\0\xbd\x06\0\0\x96\0\0\0\x80\x32\0\0\xcb\x06\0\0\x96\0\0\0\xc0\x32\0\0\xdb\x06\
-\0\0\x42\0\0\0\0\x33\0\0\xea\x06\0\0\x54\0\0\0\x40\x33\0\0\xf0\x06\0\0\x54\0\0\
-\0\x80\x33\0\0\xf6\x06\0\0\x54\0\0\0\xc0\x33\0\0\xfc\x06\0\0\x97\0\0\0\0\x34\0\
-\0\x09\x07\0\0\x2d\0\0\0\x80\x36\0\0\x0f\x07\0\0\x2d\0\0\0\xc0\x36\0\0\x16\x07\
-\0\0\x54\0\0\0\0\x37\0\0\x21\x07\0\0\x54\0\0\0\x40\x37\0\0\x30\x07\0\0\x2d\0\0\
-\0\x80\x37\0\0\x38\x07\0\0\x2d\0\0\0\xc0\x37\0\0\x40\x07\0\0\xae\0\0\0\0\x38\0\
-\0\x50\x07\0\0\xb4\0\0\0\x80\x3a\0\0\x65\x07\0\0\xb9\0\0\0\x40\x3b\0\0\x72\x07\
-\0\0\xb9\0\0\0\x80\x3b\0\0\x7c\x07\0\0\xb9\0\0\0\xc0\x3b\0\0\x81\x07\0\0\xbb\0\
-\0\0\0\x3c\0\0\x96\x07\0\0\xbc\0\0\0\x40\x3c\0\0\x9b\x07\0\0\xbd\0\0\0\xc0\x3c\
-\0\0\xa5\x07\0\0\xbe\0\0\0\0\x3d\0\0\xad\x07\0\0\xc0\0\0\0\x40\x3d\0\0\xb5\x07\
-\0\0\x2d\0\0\0\xc0\x3d\0\0\xc7\x07\0\0\x2d\0\0\0\0\x3e\0\0\xd8\x07\0\0\xc1\0\0\
-\0\x40\x3e\0\0\xdb\x07\0\0\xc2\0\0\0\x80\x3e\0\0\xe1\x07\0\0\xc3\0\0\0\xc0\x3e\
-\0\0\xea\x07\0\0\xc4\0\0\0\0\x3f\0\0\xf2\x07\0\0\xc5\0\0\0\x40\x3f\0\0\xf9\x07\
-\0\0\xc6\0\0\0\x80\x3f\0\0\x01\x08\0\0\xc7\0\0\0\xc0\x3f\0\0\x09\x08\0\0\xc7\0\
-\0\0\0\x40\0\0\x16\x08\0\0\xc7\0\0\0\x40\x40\0\0\x24\x08\0\0\xc9\0\0\0\x80\x40\
-\0\0\x2c\x08\0\0\x2d\0\0\0\x40\x41\0\0\x36\x08\0\0\xca\0\0\0\x80\x41\0\0\x42\
-\x08\0\0\x39\0\0\0\xc0\x41\0\0\x4f\x08\0\0\xb6\0\0\0\0\x42\0\0\x5a\x08\0\0\xcd\
-\0\0\0\x40\x42\0\0\x68\x08\0\0\xce\0\0\0\x80\x42\0\0\x71\x08\0\0\x39\0\0\0\xa0\
-\x42\0\0\x7b\x08\0\0\xd2\0\0\0\xc0\x42\0\0\x83\x08\0\0\xd4\0\0\0\x40\x43\0\0\
-\x94\x08\0\0\x54\0\0\0\x40\x44\0\0\xa3\x08\0\0\x54\0\0\0\x80\x44\0\0\xb0\x08\0\
-\0\xd8\0\0\0\xc0\x44\0\0\xbb\x08\0\0\x98\0\0\0\xc0\x46\0\0\xc3\x08\0\0\xdd\0\0\
-\0\xc0\x48\0\0\xca\x08\0\0\xb1\0\0\0\0\x49\0\0\xd5\x08\0\0\x3b\0\0\0\x80\x49\0\
-\0\xe1\x08\0\0\xdf\0\0\0\xc0\x49\0\0\xef\x08\0\0\xe0\0\0\0\0\x4a\0\0\xfa\x08\0\
-\0\x02\0\0\0\x40\x4a\0\0\x0a\x09\0\0\xe1\0\0\0\x80\x4a\0\0\x13\x09\0\0\x39\0\0\
-\0\x40\x4c\0\0\x24\x09\0\0\x54\0\0\0\x80\x4c\0\0\x36\x09\0\0\x02\0\0\0\xc0\x4c\
-\0\0\x47\x09\0\0\x02\0\0\0\xe0\x4c\0\0\x57\x09\0\0\x02\0\0\0\0\x4d\0\0\x62\x09\
-\0\0\x54\0\0\0\x40\x4d\0\0\x71\x09\0\0\x02\0\0\0\x80\x4d\0\0\x7f\x09\0\0\x39\0\
-\0\0\xa0\x4d\0\0\x91\x09\0\0\xe4\0\0\0\xc0\x4d\0\0\x9c\x09\0\0\x42\0\0\0\xc0\
-\x89\0\0\xa9\x09\0\0\xe5\0\0\0\0\x8a\0\0\xb2\x09\0\0\xe6\0\0\0\x40\x8a\0\0\xb7\
-\x09\0\0\xe7\0\0\0\x80\x8a\0\0\xc5\x09\0\0\xe8\0\0\0\xc0\x8a\0\0\xd6\x09\0\0\
-\xe9\0\0\0\0\x8b\0\0\xe1\x09\0\0\xea\0\0\0\x40\x8b\0\0\xf1\x09\0\0\x2d\0\0\0\
-\x80\x8b\0\0\0\x0a\0\0\xeb\0\0\0\xc0\x8b\0\0\x0d\x0a\0\0\xed\0\0\0\0\x8c\0\0\
-\x12\x0a\0\0\x54\0\0\0\xc0\x8d\0\0\x20\x0a\0\0\x54\0\0\0\0\x8e\0\0\x2d\x0a\0\0\
-\x54\0\0\0\x40\x8e\0\0\x3a\x0a\0\0\x33\0\0\0\x80\x8e\0\0\x47\x0a\0\0\xee\0\0\0\
-\xc0\x8e\0\0\x58\x0a\0\0\x02\0\0\0\x80\x90\0\0\x70\x0a\0\0\x02\0\0\0\xa0\x90\0\
-\0\x89\x0a\0\0\xf3\0\0\0\xc0\x90\0\0\x91\x0a\0\0\x52\0\0\0\0\x91\0\0\x99\x0a\0\
-\0\xf4\0\0\0\x80\x91\0\0\xa5\x0a\0\0\x52\0\0\0\xc0\x91\0\0\xb3\x0a\0\0\xf5\0\0\
-\0\x40\x92\0\0\xc2\x0a\0\0\xf6\0\0\0\x80\x92\0\0\xd3\x0a\0\0\x39\0\0\0\0\x97\0\
-\0\xdf\x0a\0\0\x01\x01\0\0\x40\x97\0\0\xef\x0a\0\0\xf6\0\0\0\xc0\x97\0\0\0\x0b\
-\0\0\x52\0\0\0\x40\x9c\0\0\x10\x0b\0\0\x2d\0\0\0\xc0\x9c\0\0\x23\x0b\0\0\x02\
-\x01\0\0\0\x9d\0\0\x2d\x0b\0\0\x03\x01\0\0\x40\x9d\0\0\x35\x0b\0\0\x03\x01\0\0\
-\x50\x9d\0\0\x44\x0b\0\0\x02\0\0\0\x60\x9d\0\0\x52\x0b\0\0\x39\0\0\0\x80\x9d\0\
-\0\x63\x0b\0\0\x39\0\0\0\xa0\x9d\0\0\x78\x0b\0\0\x02\0\0\0\xc0\x9d\0\0\x8b\x0b\
-\0\0\x2d\0\0\0\0\x9e\0\0\x9e\x0b\0\0\x54\0\0\0\x40\x9e\0\0\xa9\x0b\0\0\x54\0\0\
-\0\x80\x9e\0\0\xc2\x0b\0\0\x54\0\0\0\xc0\x9e\0\0\xd8\x0b\0\0\xb5\0\0\0\0\x9f\0\
-\0\xe2\x0b\0\0\x04\x01\0\0\x80\x9f\0\0\xed\x0b\0\0\x05\x01\0\0\xc0\x9f\0\0\xf9\
-\x0b\0\0\x2d\0\0\0\0\xa0\0\0\x0b\x0c\0\0\x06\x01\0\0\x40\xa0\0\0\x20\x0c\0\0\
-\x2d\0\0\0\0\xa1\0\0\x34\x0c\0\0\x07\x01\0\0\x40\xa1\0\0\x39\x0c\0\0\x40\0\0\0\
-\x80\xa1\0\0\x42\x0c\0\0\x2d\0\0\0\xc0\xa1\0\0\x52\x0c\0\0\x08\x01\0\0\0\xa2\0\
-\0\0\0\0\0\x0a\x01\0\0\xc0\xa2\0\0\x5a\x0c\0\0\x0b\x01\0\0\x40\xa3\0\0\x66\x0c\
-\0\0\x0c\x01\0\0\x80\xa3\0\0\x70\x0c\0\0\x0e\x01\0\0\0\xa4\0\0\x77\x0c\0\0\x02\
-\0\0\0\x40\xa4\0\0\x84\x0c\0\0\x39\0\0\0\x60\xa4\0\0\x8d\x0c\0\0\x02\0\0\0\x80\
-\xa4\0\0\x98\x0c\0\0\x02\0\0\0\xa0\xa4\0\0\xa9\x0c\0\0\x2d\0\0\0\xc0\xa4\0\0\
-\xbb\x0c\0\0\x54\0\0\0\0\xa5\0\0\xca\x0c\0\0\x54\0\0\0\x40\xa5\0\0\xe1\x0c\0\0\
-\x02\0\0\0\x80\xa5\0\0\xf0\x0c\0\0\x02\0\0\0\xa0\xa5\0\0\xff\x0c\0\0\x0f\x01\0\
-\0\xc0\xa5\0\0\x09\x0d\0\0\x56\0\0\0\0\xa6\0\0\x1a\x0d\0\0\x45\0\0\0\x40\xa6\0\
-\0\x28\x0d\0\0\x45\0\0\0\x60\xa6\0\0\x3c\x0d\0\0\x2d\0\0\0\x80\xa6\0\0\x4c\x0d\
-\0\0\x36\0\0\0\xc0\xa6\0\0\x59\x0d\0\0\x38\0\0\0\0\xa7\0\0\x6c\x0d\0\0\x02\0\0\
-\0\x20\xa7\0\0\x7c\x0d\0\0\x39\0\0\0\x40\xa7\0\0\x95\x0d\0\0\x36\0\0\0\x80\xa7\
-\0\0\xa2\x0d\0\0\x10\x01\0\0\xc0\xa7\0\0\xb1\x0d\0\0\x11\x01\0\0\0\xa8\0\0\xb7\
-\x0d\0\0\x12\x01\0\0\x40\xa8\0\0\xc1\x0d\0\0\x2d\0\0\0\x40\xa8\0\0\xd3\x0d\0\0\
-\x02\0\0\0\x80\xa8\0\0\xe6\x0d\0\0\x3b\0\0\0\xc0\xa8\0\0\xf6\x0d\0\0\x13\x01\0\
-\0\0\xa9\0\0\x07\x0e\0\0\x17\x01\0\0\x80\xab\0\0\x15\x0e\0\0\x43\0\0\0\xc0\xab\
-\0\0\x24\x0e\0\0\x42\0\0\0\0\xac\0\0\x2d\x0e\0\0\x18\x01\0\0\x40\xac\0\0\x39\
-\x0e\0\0\x19\x01\0\0\x80\xac\0\0\x41\x0e\0\0\x42\0\0\0\xc0\xac\0\0\x4b\x0e\0\0\
-\x55\0\0\0\0\xad\0\0\x56\x0e\0\0\x54\0\0\0\x40\xad\0\0\x5f\x0e\0\0\x55\0\0\0\
-\x80\xad\0\x01\x68\x0e\0\0\x55\0\0\0\x81\xad\0\x01\x77\x0e\0\0\x55\0\0\0\x82\
-\xad\0\x3e\x86\x0e\0\0\xb5\0\0\0\xc0\xad\0\0\x92\x0e\0\0\x02\0\0\0\x40\xae\0\0\
-\x9c\x0e\0\0\x1a\x01\0\0\x80\xae\0\0\xb0\x0e\0\0\x1a\x01\0\0\xc0\xae\0\0\xb9\
-\x0e\0\0\xb5\0\0\0\0\xaf\0\0\xc8\x0e\0\0\x1b\x01\0\0\0\xb0\0\0\x44\x02\0\0\x04\
-\0\0\x04\x18\0\0\0\x28\x01\0\0\x2d\0\0\0\0\0\0\0\xcf\x0e\0\0\x2d\0\0\0\x40\0\0\
-\0\xdc\x0e\0\0\x40\0\0\0\x80\0\0\0\xe3\x0e\0\0\x40\0\0\0\xa0\0\0\0\xe7\x0e\0\0\
-\0\0\0\x08\x41\0\0\0\xeb\x0e\0\0\0\0\0\x08\x39\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\0\
-\xf1\x0e\0\0\0\0\0\x08\x44\0\0\0\xfc\x0e\0\0\x01\0\0\x04\x04\0\0\0\x0c\x0f\0\0\
-\x45\0\0\0\0\0\0\0\x11\x0f\0\0\0\0\0\x08\x46\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\
-\0\x1a\x0f\0\0\x02\0\0\0\0\0\0\0\x22\x0f\0\0\x04\0\0\x04\x10\0\0\0\x35\x0f\0\0\
-\x48\0\0\0\0\0\0\0\0\0\0\0\x4a\0\0\0\x40\0\0\0\x3b\x0f\0\0\x4b\0\0\0\x60\0\0\0\
-\x3f\x0f\0\0\x4b\0\0\0\x70\0\0\0\x43\x0f\0\0\x01\0\0\x04\x08\0\0\0\x4e\x0f\0\0\
-\x49\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x48\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\
-\x53\x0f\0\0\x39\0\0\0\0\0\0\0\x5b\x0f\0\0\x45\0\0\0\0\0\0\0\x63\x0f\0\0\0\0\0\
-\x08\x4c\0\0\0\x67\x0f\0\0\0\0\0\x08\x4d\0\0\0\x6d\x0f\0\0\0\0\0\x01\x02\0\0\0\
-\x10\0\0\0\x7c\x0f\0\0\x0f\0\0\x04\0\x01\0\0\x89\x0f\0\0\x4f\0\0\0\0\0\0\0\x8e\
-\x0f\0\0\x50\0\0\0\x80\0\0\0\x97\x0f\0\0\x52\0\0\0\x40\x01\0\0\xc1\x02\0\0\x39\
-\0\0\0\xc0\x01\0\0\xa2\x0f\0\0\x54\0\0\0\0\x02\0\0\xad\x0f\0\0\x54\0\0\0\x40\
-\x02\0\0\xbe\x0f\0\0\x54\0\0\0\x80\x02\0\0\xc7\x0f\0\0\x54\0\0\0\xc0\x02\0\0\
-\xdd\x0f\0\0\x54\0\0\0\0\x03\0\0\xeb\x0f\0\0\x02\0\0\0\x40\x03\0\0\x4a\x06\0\0\
-\x57\0\0\0\x80\x03\0\0\xf1\x0f\0\0\x58\0\0\0\xc0\x03\0\0\xf8\x0f\0\0\x58\0\0\0\
-\0\x04\0\0\xfd\x0f\0\0\x2d\0\0\0\x40\x04\0\0\x0d\x10\0\0\x59\0\0\0\0\x06\0\0\
-\x11\x10\0\0\x02\0\0\x04\x10\0\0\0\x1d\x10\0\0\x2d\0\0\0\0\0\0\0\x24\x10\0\0\
-\x40\0\0\0\x40\0\0\0\x2f\x10\0\0\x03\0\0\x04\x18\0\0\0\x37\x10\0\0\x2d\0\0\0\0\
-\0\0\0\x49\x10\0\0\x51\0\0\0\x40\0\0\0\x52\x10\0\0\x51\0\0\0\x80\0\0\0\0\0\0\0\
-\0\0\0\x02\x50\0\0\0\x5a\x10\0\0\x02\0\0\x04\x10\0\0\0\x4e\x0f\0\0\x53\0\0\0\0\
-\0\0\0\x64\x10\0\0\x53\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x52\0\0\0\x69\x10\0\0\
-\0\0\0\x08\x55\0\0\0\x6d\x10\0\0\0\0\0\x08\x56\0\0\0\x73\x10\0\0\0\0\0\x01\x08\
-\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x4e\0\0\0\0\0\0\0\0\0\0\x02\xb3\x01\0\0\x86\
-\x10\0\0\x09\0\0\x04\x40\0\0\0\x90\x10\0\0\x54\0\0\0\0\0\0\0\xa1\x10\0\0\x54\0\
-\0\0\x40\0\0\0\xaa\x10\0\0\x54\0\0\0\x80\0\0\0\xb7\x10\0\0\x40\0\0\0\xc0\0\0\0\
-\xc0\x10\0\0\x40\0\0\0\xe0\0\0\0\xcf\x10\0\0\x2d\0\0\0\0\x01\0\0\xd8\x10\0\0\
-\x2d\0\0\0\x40\x01\0\0\xe5\x10\0\0\x2d\0\0\0\x80\x01\0\0\xee\x10\0\0\x5a\0\0\0\
-\xc0\x01\0\0\xee\x10\0\0\x02\0\0\x04\x08\0\0\0\xf7\x10\0\0\x39\0\0\0\0\0\0\0\0\
-\x11\0\0\x39\0\0\0\x20\0\0\0\x05\x11\0\0\x07\0\0\x04\x30\0\0\0\x15\x11\0\0\x52\
-\0\0\0\0\0\0\0\x1e\x11\0\0\x2d\0\0\0\x80\0\0\0\x26\x11\0\0\x2d\0\0\0\xc0\0\0\0\
-\x35\x11\0\0\x39\0\0\0\0\x01\0\0\xc1\x02\0\0\x4d\0\0\0\x20\x01\0\0\x40\x11\0\0\
-\x4d\0\0\0\x30\x01\0\0\x48\x11\0\0\x5c\0\0\0\x40\x01\0\0\0\0\0\0\0\0\0\x02\x5b\
-\0\0\0\x4d\x11\0\0\x10\0\0\x84\xe0\0\0\0\x2f\x10\0\0\x50\0\0\0\0\0\0\0\x5d\x11\
-\0\0\x54\0\0\0\xc0\0\0\0\x68\x11\0\0\x54\0\0\0\0\x01\0\0\x74\x11\0\0\x54\0\0\0\
-\x40\x01\0\0\x7e\x11\0\0\x54\0\0\0\x80\x01\0\0\x84\x11\0\0\x54\0\0\0\xc0\x01\0\
-\0\x8f\x11\0\0\x5e\0\0\0\0\x02\0\0\x97\x11\0\0\x54\0\0\0\x40\x02\0\0\x28\x01\0\
-\0\x39\0\0\0\x80\x02\0\0\xa0\x11\0\0\x39\0\0\0\xa0\x02\0\x01\xad\x11\0\0\x39\0\
-\0\0\xa1\x02\0\x01\xb8\x11\0\0\x39\0\0\0\xa2\x02\0\x01\xca\x11\0\0\x39\0\0\0\
-\xa3\x02\0\x01\xd5\x11\0\0\x61\0\0\0\xc0\x02\0\0\xde\x11\0\0\x61\0\0\0\xc0\x04\
-\0\0\xed\x11\0\0\x6c\0\0\0\xc0\x06\0\0\xf3\x11\0\0\0\0\0\x08\x5f\0\0\0\xf7\x11\
-\0\0\0\0\0\x08\x60\0\0\0\xfd\x11\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\x01\x07\x12\0\
-\0\x08\0\0\x04\x40\0\0\0\x0f\x12\0\0\x62\0\0\0\0\0\0\0\x14\x12\0\0\x63\0\0\0\0\
-\x01\0\0\x21\x12\0\0\x64\0\0\0\x40\x01\0\0\x2a\x12\0\0\x68\0\0\0\x80\x01\0\0\
-\x2f\x12\0\0\x69\0\0\0\xc0\x01\0\0\x35\x12\0\0\x69\0\0\0\xc8\x01\0\0\x3c\x12\0\
-\0\x69\0\0\0\xd0\x01\0\0\x44\x12\0\0\x69\0\0\0\xd8\x01\0\0\x4c\x12\0\0\x02\0\0\
-\x04\x20\0\0\0\x0f\x12\0\0\x50\0\0\0\0\0\0\0\x5c\x12\0\0\x63\0\0\0\xc0\0\0\0\
-\x64\x12\0\0\0\0\0\x08\x5e\0\0\0\0\0\0\0\0\0\0\x02\x65\0\0\0\0\0\0\0\x01\0\0\
-\x0d\x66\0\0\0\0\0\0\0\x67\0\0\0\x6c\x12\0\0\x02\0\0\x06\x04\0\0\0\x7c\x12\0\0\
-\0\0\0\0\x8e\x12\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x61\0\0\0\0\0\0\0\0\0\0\x02\
-\xbe\x01\0\0\x9e\x12\0\0\0\0\0\x08\x6a\0\0\0\xa1\x12\0\0\0\0\0\x08\x6b\0\0\0\
-\xa6\x12\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\x02\x5d\0\0\0\0\0\0\0\
-\0\0\0\x02\x6e\0\0\0\0\0\0\0\0\0\0\x0a\xe1\x01\0\0\0\0\0\0\0\0\0\x02\xe7\x01\0\
-\0\xb4\x12\0\0\x1c\0\0\x04\0\x01\0\0\xc5\x12\0\0\x54\0\0\0\0\0\0\0\xd0\x12\0\0\
-\x54\0\0\0\x40\0\0\0\xd9\x12\0\0\x54\0\0\0\x80\0\0\0\xe4\x12\0\0\x54\0\0\0\xc0\
-\0\0\0\xed\x12\0\0\x54\0\0\0\0\x01\0\0\xfa\x12\0\0\x54\0\0\0\x40\x01\0\0\x05\
-\x13\0\0\x54\0\0\0\x80\x01\0\0\x11\x13\0\0\x54\0\0\0\xc0\x01\0\0\x1b\x13\0\0\
-\x5e\0\0\0\0\x02\0\0\x2d\x13\0\0\x54\0\0\0\x40\x02\0\0\x39\x13\0\0\x54\0\0\0\
-\x80\x02\0\0\x43\x13\0\0\x5e\0\0\0\xc0\x02\0\0\x55\x13\0\0\x54\0\0\0\0\x03\0\0\
-\x5e\x13\0\0\x54\0\0\0\x40\x03\0\0\x68\x13\0\0\x54\0\0\0\x80\x03\0\0\x7b\x13\0\
-\0\x54\0\0\0\xc0\x03\0\0\x97\x13\0\0\x54\0\0\0\0\x04\0\0\xb4\x13\0\0\x54\0\0\0\
-\x40\x04\0\0\xcd\x13\0\0\x54\0\0\0\x80\x04\0\0\xe2\x13\0\0\x54\0\0\0\xc0\x04\0\
-\0\xed\x13\0\0\x54\0\0\0\0\x05\0\0\xfd\x13\0\0\x54\0\0\0\x40\x05\0\0\x10\x14\0\
-\0\x54\0\0\0\x80\x05\0\0\x21\x14\0\0\x54\0\0\0\xc0\x05\0\0\x33\x14\0\0\x54\0\0\
-\0\0\x06\0\0\x45\x14\0\0\x54\0\0\0\x40\x06\0\0\x60\x14\0\0\x54\0\0\0\x80\x06\0\
-\0\x73\x14\0\0\x54\0\0\0\xc0\x06\0\0\0\0\0\0\0\0\0\x02\x72\0\0\0\0\0\0\0\0\0\0\
-\x0a\x73\0\0\0\x83\x14\0\0\0\0\0\x08\x75\0\0\0\0\0\0\0\0\0\0\x02\x73\0\0\0\x8d\
-\x14\0\0\x01\0\0\x04\x10\0\0\0\xc0\x01\0\0\x76\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x2d\0\0\0\x04\0\0\0\x02\0\0\0\x95\x14\0\0\x02\0\0\x05\x04\0\0\0\xa1\
-\x14\0\0\x78\0\0\0\0\0\0\0\xa3\x14\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x04\
-\x04\0\0\0\x01\x08\0\0\x69\0\0\0\0\0\0\0\xa5\x14\0\0\x69\0\0\0\x08\0\0\0\xad\
-\x14\0\0\x69\0\0\0\x10\0\0\0\xb6\x14\0\0\x69\0\0\0\x18\0\0\0\0\0\0\0\0\0\0\x02\
-\xdb\x01\0\0\x9d\x04\0\0\x04\0\0\x04\x20\0\0\0\xbe\x14\0\0\x2d\0\0\0\0\0\0\0\
-\xc5\x14\0\0\x56\0\0\0\x40\0\0\0\xcf\x14\0\0\x56\0\0\0\x80\0\0\0\xdc\x14\0\0\
-\x56\0\0\0\xc0\0\0\0\xe8\x14\0\0\x03\0\0\x04\x28\0\0\0\xc7\x02\0\0\x02\0\0\0\0\
-\0\0\0\xf3\x14\0\0\x52\0\0\0\x40\0\0\0\xfd\x14\0\0\x52\0\0\0\xc0\0\0\0\0\0\0\0\
-\0\0\0\x02\xc9\x01\0\0\x07\x15\0\0\x02\0\0\x04\x14\0\0\0\x15\x15\0\0\x02\0\0\0\
-\0\0\0\0\x1c\x15\0\0\x06\0\0\0\x20\0\0\0\x1a\x06\0\0\x03\0\0\x04\x38\0\0\0\x22\
-\x15\0\0\x2d\0\0\0\0\0\0\0\x2c\x15\0\0\x7f\0\0\0\x40\0\0\0\0\0\0\0\x82\0\0\0\
-\x80\0\0\0\0\0\0\0\0\0\0\x02\x80\0\0\0\0\0\0\0\x01\0\0\x0d\x3c\0\0\0\0\0\0\0\
-\x81\0\0\0\0\0\0\0\0\0\0\x02\x7e\0\0\0\0\0\0\0\x03\0\0\x05\x28\0\0\0\x2f\x15\0\
-\0\x83\0\0\0\0\0\0\0\x35\x15\0\0\x85\0\0\0\0\0\0\0\x3f\x15\0\0\x8c\0\0\0\0\0\0\
-\0\0\0\0\0\x06\0\0\x04\x28\0\0\0\x44\x15\0\0\x84\0\0\0\0\0\0\0\x4a\x15\0\0\x40\
-\0\0\0\x40\0\0\0\x28\x01\0\0\x40\0\0\0\x60\0\0\0\x4e\x15\0\0\x40\0\0\0\x80\0\0\
-\0\x55\x15\0\0\x54\0\0\0\xc0\0\0\0\x5a\x15\0\0\x84\0\0\0\0\x01\0\0\0\0\0\0\0\0\
-\0\x02\x40\0\0\0\0\0\0\0\x04\0\0\x04\x18\0\0\0\x61\x15\0\0\x86\0\0\0\0\0\0\0\
-\x19\0\0\0\x88\0\0\0\x20\0\0\0\0\0\0\0\x89\0\0\0\x40\0\0\0\x5c\x12\0\0\x54\0\0\
-\0\x80\0\0\0\x69\x15\0\0\0\0\0\x08\x87\0\0\0\x73\x15\0\0\0\0\0\x08\x02\0\0\0\
-\x86\x15\0\0\x03\0\0\x06\x04\0\0\0\x94\x15\0\0\0\0\0\0\x9c\x15\0\0\x01\0\0\0\
-\xa6\x15\0\0\x02\0\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\xb0\x15\0\0\x8a\0\0\0\0\0\
-\0\0\xb5\x15\0\0\x8b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xaa\x01\0\0\0\0\0\0\0\0\0\
-\x02\xce\x01\0\0\0\0\0\0\x05\0\0\x04\x20\0\0\0\xc1\x15\0\0\x8d\0\0\0\0\0\0\0\
-\xc6\x15\0\0\x02\0\0\0\x40\0\0\0\xcb\x15\0\0\x02\0\0\0\x60\0\0\0\xd7\x15\0\0\
-\x2d\0\0\0\x80\0\0\0\xde\x15\0\0\x2d\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\xda\x01\
-\0\0\xe6\x15\0\0\0\0\0\x08\x8f\0\0\0\xec\x15\0\0\0\0\0\x08\x02\0\0\0\0\0\0\0\0\
-\0\0\x02\xd6\x01\0\0\xfb\x15\0\0\x02\0\0\x04\x10\0\0\0\x4e\x0f\0\0\x92\0\0\0\0\
-\0\0\0\x06\x16\0\0\x93\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x91\0\0\0\0\0\0\0\0\0\
-\0\x02\x92\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x91\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\
-\0\0\0\0\x02\xb4\x01\0\0\0\0\0\0\0\0\0\x02\x02\0\0\0\xfc\x06\0\0\x03\0\0\x04\
-\x50\0\0\0\xea\x06\0\0\x54\0\0\0\0\0\0\0\xf0\x06\0\0\x54\0\0\0\x40\0\0\0\x0c\
-\x16\0\0\x98\0\0\0\x80\0\0\0\x11\x16\0\0\0\0\0\x08\x99\0\0\0\x20\x16\0\0\x05\0\
-\0\x04\x40\0\0\0\x2d\x16\0\0\x9a\0\0\0\0\0\0\0\x36\x16\0\0\x39\0\0\0\x20\0\0\0\
-\x3c\x16\0\0\x39\0\0\0\x40\0\0\0\x46\x16\0\0\x42\0\0\0\x80\0\0\0\x4c\x16\0\0\
-\x9f\0\0\0\xc0\0\0\0\x54\x16\0\0\0\0\0\x08\x9b\0\0\0\x64\x16\0\0\x01\0\0\x04\
-\x04\0\0\0\0\0\0\0\x9c\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\x05\x04\0\0\0\x4a\x15\0\0\
-\x45\0\0\0\0\0\0\0\0\0\0\0\x9d\0\0\0\0\0\0\0\0\0\0\0\x9e\0\0\0\0\0\0\0\0\0\0\0\
-\x02\0\0\x04\x02\0\0\0\x6e\x16\0\0\x69\0\0\0\0\0\0\0\x24\x08\0\0\x69\0\0\0\x08\
-\0\0\0\0\0\0\0\x02\0\0\x04\x04\0\0\0\x75\x16\0\0\x4b\0\0\0\0\0\0\0\x84\x16\0\0\
-\x4b\0\0\0\x10\0\0\0\x89\x16\0\0\x06\0\0\x04\x28\0\0\0\x95\x16\0\0\xa0\0\0\0\0\
-\0\0\0\x99\x16\0\0\xad\0\0\0\x40\0\0\0\xa5\x16\0\0\xaa\0\0\0\xc0\0\0\0\xaa\x16\
-\0\0\x69\0\0\0\0\x01\0\0\xba\x16\0\0\x69\0\0\0\x08\x01\0\0\xca\x16\0\0\x69\0\0\
-\0\x10\x01\0\0\0\0\0\0\0\0\0\x02\xc4\x01\0\0\0\0\0\0\0\0\0\x02\xa2\0\0\0\xd4\
-\x16\0\0\x0e\0\0\x04\xc0\0\0\0\xdf\x16\0\0\x91\0\0\0\0\0\0\0\xea\x16\0\0\x52\0\
-\0\0\x80\0\0\0\xf5\x16\0\0\x52\0\0\0\0\x01\0\0\x01\x17\0\0\x52\0\0\0\x80\x01\0\
-\0\x95\x16\0\0\xa3\0\0\0\0\x02\0\0\x0e\x17\0\0\x39\0\0\0\x40\x02\0\0\x17\x17\0\
-\0\x39\0\0\0\x60\x02\0\0\x22\x17\0\0\x2d\0\0\0\x80\x02\0\0\x2d\x17\0\0\xa9\0\0\
-\0\xc0\x02\0\0\x3a\x17\0\0\x02\0\0\0\x40\x05\0\0\xa5\x16\0\0\xaa\0\0\0\x80\x05\
-\0\0\xba\x16\0\0\x69\0\0\0\xc0\x05\0\0\xaa\x16\0\0\x69\0\0\0\xc8\x05\0\0\xca\
-\x16\0\0\x69\0\0\0\xd0\x05\0\0\0\0\0\0\0\0\0\x02\xa4\0\0\0\0\0\0\0\0\0\0\x0a\
-\xc5\x01\0\0\0\0\0\0\0\0\0\x02\xa6\0\0\0\0\0\0\0\0\0\0\x0a\xa7\0\0\0\x47\x17\0\
-\0\x04\0\0\x04\x18\0\0\0\xdf\x16\0\0\x91\0\0\0\0\0\0\0\x52\x17\0\0\x40\0\0\0\
-\x80\0\0\0\x57\x17\0\0\x40\0\0\0\xa0\0\0\0\x62\x17\0\0\xa8\0\0\0\xc0\0\0\0\0\0\
-\0\0\0\0\0\x03\0\0\0\0\x2d\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
-\xa5\0\0\0\x04\0\0\0\x0a\0\0\0\0\0\0\0\0\0\0\x02\xab\0\0\0\0\0\0\0\0\0\0\x0a\
-\xac\0\0\0\x6a\x17\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\
-\0\xa1\0\0\0\x04\0\0\0\x02\0\0\0\x40\x07\0\0\x03\0\0\x04\x50\0\0\0\x6f\x17\0\0\
-\xb3\0\0\0\0\0\0\0\x75\x17\0\0\x39\0\0\0\x40\x02\0\0\x83\x17\0\0\x39\0\0\0\x60\
-\x02\0\0\x91\x17\0\0\x02\0\0\x04\x18\0\0\0\xa5\x17\0\0\x54\0\0\0\0\0\0\0\xad\
-\x17\0\0\xb0\0\0\0\x40\0\0\0\xb4\x17\0\0\x01\0\0\x04\x10\0\0\0\xc4\x17\0\0\xb1\
-\0\0\0\0\0\0\0\xcc\x17\0\0\x02\0\0\x04\x10\0\0\0\xc4\x17\0\0\xb2\0\0\0\0\0\0\0\
-\xdb\x17\0\0\x51\0\0\0\x40\0\0\0\xc4\x17\0\0\x01\0\0\x04\x08\0\0\0\x2f\x10\0\0\
-\x51\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xaf\0\0\0\x04\0\0\0\x03\0\0\0\x50\
-\x07\0\0\x02\0\0\x04\x18\0\0\0\xe7\x17\0\0\xb5\0\0\0\0\0\0\0\xec\x17\0\0\x39\0\
-\0\0\x80\0\0\0\xf6\x17\0\0\x02\0\0\x04\x10\0\0\0\x4e\x0f\0\0\xb6\0\0\0\0\0\0\0\
-\x04\x18\0\0\xb7\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\xb5\0\0\0\0\0\0\0\0\0\0\x02\
-\xb8\0\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\xb6\0\0\0\0\0\0\0\0\0\0\x02\xba\
-\0\0\0\0\0\0\0\0\0\0\x0a\xb5\x01\0\0\0\0\0\0\0\0\0\x02\xc3\x01\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\xac\0\0\0\x04\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\x02\xcb\x01\0\0\x09\
-\x18\0\0\x01\0\0\x04\x08\0\0\0\x12\x18\0\0\xbf\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\
-\xe3\x01\0\0\x1c\x18\0\0\x01\0\0\x04\x10\0\0\0\x25\x18\0\0\x52\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x02\xba\x01\0\0\0\0\0\0\0\0\0\x02\xb9\x01\0\0\0\0\0\0\0\0\0\x02\
-\xc1\x01\0\0\0\0\0\0\0\0\0\x02\xcc\x01\0\0\0\0\0\0\0\0\0\x02\xe5\x01\0\0\0\0\0\
-\0\0\0\0\x02\xe4\x01\0\0\x2f\x18\0\0\0\0\0\x08\xc8\0\0\0\0\0\0\0\x01\0\0\x04\
-\x08\0\0\0\x38\x18\0\0\x35\0\0\0\0\0\0\0\x3c\x18\0\0\x02\0\0\x04\x18\0\0\0\x47\
-\x18\0\0\x52\0\0\0\0\0\0\0\xf2\x07\0\0\xc7\0\0\0\x80\0\0\0\x4c\x18\0\0\0\0\0\
-\x08\xcb\0\0\0\x53\x18\0\0\0\0\0\x08\xcc\0\0\0\x63\x18\0\0\0\0\0\x08\x2d\0\0\0\
-\0\0\0\0\0\0\0\x02\xab\x01\0\0\x74\x18\0\0\0\0\0\x08\xcf\0\0\0\0\0\0\0\x01\0\0\
-\x04\x04\0\0\0\x4a\x15\0\0\xd0\0\0\0\0\0\0\0\x7b\x18\0\0\0\0\0\x08\xd1\0\0\0\
-\x81\x18\0\0\0\0\0\x08\x39\0\0\0\x7b\x08\0\0\x03\0\0\x04\x10\0\0\0\x92\x18\0\0\
-\x02\0\0\0\0\0\0\0\x97\x18\0\0\x45\0\0\0\x20\0\0\0\xa4\x18\0\0\xd3\0\0\0\x40\0\
-\0\0\0\0\0\0\0\0\0\x02\xe2\x01\0\0\xab\x18\0\0\x04\0\0\x04\x20\0\0\0\xc1\x18\0\
-\0\xd5\0\0\0\0\0\0\0\xca\x18\0\0\x2d\0\0\0\x40\0\0\0\xd1\x18\0\0\x2d\0\0\0\x80\
-\0\0\0\xd5\x18\0\0\xd6\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\xac\0\0\0\xe1\x18\0\0\
-\0\0\0\x08\xd7\0\0\0\xe6\x18\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x04\xec\x18\0\0\0\
-\0\0\x08\xd9\0\0\0\xf7\x18\0\0\x01\0\0\x04\x40\0\0\0\0\0\0\0\xda\0\0\0\0\0\0\0\
-\0\0\0\0\x02\0\0\x05\x40\0\0\0\0\x19\0\0\x99\0\0\0\0\0\0\0\0\0\0\0\xdb\0\0\0\0\
-\0\0\0\0\0\0\0\x02\0\0\x04\x40\0\0\0\x06\x19\0\0\xdc\0\0\0\0\0\0\0\x4c\x16\0\0\
-\x9f\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x69\0\0\0\x04\0\0\0\x18\0\0\0\
-\x10\x19\0\0\x01\0\0\x04\x08\0\0\0\x4e\x0f\0\0\xde\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x02\xdd\0\0\0\0\0\0\0\0\0\0\x02\xe0\x01\0\0\0\0\0\0\0\0\0\x02\xca\x01\0\0\x1c\
-\x19\0\0\x09\0\0\x04\x38\0\0\0\x2c\x19\0\0\x39\0\0\0\0\0\0\0\x37\x19\0\0\x2d\0\
-\0\0\x40\0\0\0\x49\x19\0\0\x2d\0\0\0\x80\0\0\0\x5c\x19\0\0\x39\0\0\0\xc0\0\0\0\
-\x71\x19\0\0\x39\0\0\0\xe0\0\0\0\x87\x19\0\0\x2d\0\0\0\0\x01\0\0\x9a\x19\0\0\
-\x2d\0\0\0\x40\x01\0\0\xac\x19\0\0\x39\0\0\0\x80\x01\0\0\xc2\x19\0\0\x39\0\0\0\
-\xa0\x01\0\0\xd7\x19\0\0\x0c\0\0\x84\x28\0\0\0\xe1\x19\0\0\x54\0\0\0\0\0\0\0\
-\xf0\x19\0\0\x2d\0\0\0\x40\0\0\0\xfb\x19\0\0\xe3\0\0\0\x80\0\0\0\x04\x1a\0\0\
-\xe3\0\0\0\xc0\0\0\0\x0e\x1a\0\0\x39\0\0\0\0\x01\0\x0d\x18\x1a\0\0\x39\0\0\0\
-\x0d\x01\0\x02\x24\x1a\0\0\x39\0\0\0\x0f\x01\0\x01\x2c\x1a\0\0\x39\0\0\0\x10\
-\x01\0\x02\x31\x1a\0\0\x39\0\0\0\x12\x01\0\x01\x37\x1a\0\0\x39\0\0\0\x13\x01\0\
-\x01\x44\x1a\0\0\x39\0\0\0\x14\x01\0\x0c\x4f\x1a\0\0\x39\0\0\0\x20\x01\0\0\0\0\
-\0\0\0\0\0\x02\x9f\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xe2\0\0\0\x04\0\0\0\x30\0\0\
-\0\0\0\0\0\0\0\0\x02\xad\x01\0\0\0\0\0\0\0\0\0\x02\xae\x01\0\0\0\0\0\0\0\0\0\
-\x02\xdc\x01\0\0\0\0\0\0\0\0\0\x02\xac\x01\0\0\0\0\0\0\0\0\0\x02\xc0\x01\0\0\0\
-\0\0\0\0\0\0\x02\xb2\x01\0\0\0\0\0\0\0\0\0\x02\xec\0\0\0\x59\x1a\0\0\0\0\0\x08\
-\xc2\x01\0\0\x6a\x1a\0\0\x07\0\0\x04\x38\0\0\0\x7d\x1a\0\0\x54\0\0\0\0\0\0\0\
-\x83\x1a\0\0\x54\0\0\0\x40\0\0\0\x89\x1a\0\0\x54\0\0\0\x80\0\0\0\x8f\x1a\0\0\
-\x54\0\0\0\xc0\0\0\0\x95\x1a\0\0\x54\0\0\0\0\x01\0\0\xa0\x1a\0\0\x54\0\0\0\x40\
-\x01\0\0\xac\x1a\0\0\x54\0\0\0\x80\x01\0\0\xc2\x1a\0\0\0\0\0\x08\xef\0\0\0\xd6\
-\x1a\0\0\x02\0\0\x04\x38\0\0\0\xe8\x1a\0\0\xf0\0\0\0\0\0\0\0\x0c\x16\0\0\xf2\0\
-\0\0\x80\x01\0\0\xf1\x1a\0\0\0\0\0\x08\xf1\0\0\0\xe8\x1a\0\0\x02\0\0\x04\x30\0\
-\0\0\xfc\x1a\0\0\x39\0\0\0\0\0\0\0\x4c\x16\0\0\x9f\0\0\0\x40\0\0\0\0\0\0\0\0\0\
-\0\x02\xd8\0\0\0\0\0\0\0\0\0\0\x02\xb6\x01\0\0\0\0\0\0\0\0\0\x02\xde\x01\0\0\0\
-\0\0\0\0\0\0\x02\xbd\x01\0\0\x05\x1b\0\0\x06\0\0\x04\x90\0\0\0\x46\x16\0\0\xf7\
-\0\0\0\0\0\0\0\x0b\x1b\0\0\x98\0\0\0\x40\0\0\0\x15\x1b\0\0\xfa\0\0\0\x40\x02\0\
-\0\x19\x1b\0\0\x52\0\0\0\x80\x02\0\0\x36\x16\0\0\x42\0\0\0\0\x03\0\0\x4c\x16\0\
-\0\x9f\0\0\0\x40\x03\0\0\x23\x1b\0\0\0\0\0\x08\xf8\0\0\0\x31\x1b\0\0\0\0\0\x08\
-\xf9\0\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\x1a\x0f\0\0\x5e\0\0\0\0\0\0\0\x3c\x1b\
-\0\0\x01\0\0\x04\x04\0\0\0\x84\x16\0\0\x45\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xfc\
-\0\0\0\x52\x1b\0\0\x1e\0\0\x04\xc0\x01\0\0\x65\x1b\0\0\xfd\0\0\0\0\0\0\0\x0c\
-\x16\0\0\x98\0\0\0\x40\0\0\0\x05\x1b\0\0\xf6\0\0\0\x40\x02\0\0\x69\x1b\0\0\x52\
-\0\0\0\xc0\x06\0\0\x79\x1b\0\0\xfe\0\0\0\x40\x07\0\0\x87\x1b\0\0\xfe\0\0\0\xc0\
-\x07\0\0\x97\x1b\0\0\x52\0\0\0\x40\x08\0\0\xa2\x1b\0\0\x52\0\0\0\xc0\x08\0\0\
-\xb0\x1b\0\0\x52\0\0\0\x40\x09\0\0\xc0\x1b\0\0\x02\0\0\0\xc0\x09\0\0\xca\x1b\0\
-\0\x02\0\0\0\xe0\x09\0\0\xd4\x1b\0\0\x02\0\0\0\0\x0a\0\0\xdc\x1b\0\0\x02\0\0\0\
-\x20\x0a\0\0\xe6\x1b\0\0\x02\0\0\0\x40\x0a\0\0\xee\x1b\0\0\x02\0\0\0\x60\x0a\0\
-\0\xf6\x1b\0\0\x02\0\0\0\x80\x0a\0\0\x05\x1c\0\0\x02\0\0\0\xa0\x0a\0\0\x16\x1c\
-\0\0\x43\0\0\0\xc0\x0a\0\0\x1f\x1c\0\0\x3b\0\0\0\0\x0b\0\0\x55\x15\0\0\x54\0\0\
-\0\x40\x0b\0\0\x24\x1c\0\0\x54\0\0\0\x80\x0b\0\0\x2e\x1c\0\0\x54\0\0\0\xc0\x0b\
-\0\0\x39\x1c\0\0\xfb\0\0\0\0\x0c\0\0\x44\x1c\0\0\x54\0\0\0\x40\x0c\0\0\x4f\x1c\
-\0\0\x54\0\0\0\x80\x0c\0\0\x4f\x1a\0\0\x02\0\0\0\xc0\x0c\0\0\x5a\x1c\0\0\x02\0\
-\0\0\xe0\x0c\0\0\x65\x1c\0\0\x42\0\0\0\0\x0d\0\0\xf6\x17\0\0\xb5\0\0\0\x40\x0d\
-\0\0\x73\x1c\0\0\xff\0\0\0\xc0\x0d\0\0\0\0\0\0\0\0\0\x02\xd9\x01\0\0\x7e\x1c\0\
-\0\x02\0\0\x04\x10\0\0\0\x90\x1c\0\0\xb2\0\0\0\0\0\0\0\x95\x1c\0\0\x54\0\0\0\
-\x40\0\0\0\x9b\x1c\0\0\0\0\0\x08\0\x01\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\xa3\
-\x1c\0\0\xf7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xfb\0\0\0\x04\0\0\0\x02\0\
-\0\0\0\0\0\0\0\0\0\x02\xc8\x01\0\0\xa5\x1c\0\0\0\0\0\x01\x02\0\0\0\x10\0\0\x01\
-\0\0\0\0\0\0\0\x02\xcd\x01\0\0\0\0\0\0\0\0\0\x02\x2d\0\0\0\0\0\0\0\0\0\0\x03\0\
-\0\0\0\x2d\0\0\0\x04\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\x02\xdf\x01\0\0\xab\x1c\0\0\
-\x03\0\0\x04\x18\0\0\0\xc0\x1c\0\0\x09\x01\0\0\0\0\0\0\xc5\x1c\0\0\xd6\0\0\0\
-\x80\0\0\0\xd4\x1c\0\0\xd6\0\0\0\x88\0\0\0\xdd\x1c\0\0\x01\0\0\x04\x10\0\0\0\
-\x8d\x14\0\0\x75\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\xf7\x1c\0\0\x43\0\
-\0\0\0\0\0\0\x01\x1d\0\0\xb5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xd8\x01\0\0\x05\
-\x1d\0\0\x03\0\0\x04\x10\0\0\0\x0f\x1d\0\0\x0d\x01\0\0\0\0\0\0\xca\x18\0\0\x41\
-\0\0\0\x40\0\0\0\x14\x1d\0\0\x41\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x02\xcf\x01\0\0\
-\0\0\0\0\0\0\0\x02\xe6\x01\0\0\0\0\0\0\0\0\0\x02\xbc\x01\0\0\0\0\0\0\0\0\0\x02\
-\xdd\x01\0\0\0\0\0\0\0\0\0\x02\xe9\x01\0\0\xb7\x0d\0\0\0\0\0\x04\0\0\0\0\x19\
-\x1d\0\0\x05\0\0\x04\x50\0\0\0\x24\x1d\0\0\x91\0\0\0\0\0\0\0\x5c\x12\0\0\x2d\0\
-\0\0\x80\0\0\0\x21\x12\0\0\x14\x01\0\0\xc0\0\0\0\x28\x01\0\0\x40\0\0\0\0\x01\0\
-\0\x89\x16\0\0\x9f\0\0\0\x40\x01\0\0\0\0\0\0\0\0\0\x02\x15\x01\0\0\0\0\0\0\x01\
-\0\0\x0d\0\0\0\0\0\0\0\0\x16\x01\0\0\0\0\0\0\0\0\0\x02\x13\x01\0\0\0\0\0\0\0\0\
-\0\x02\xea\x01\0\0\0\0\0\0\0\0\0\x02\xaf\x01\0\0\0\0\0\0\0\0\0\x02\xb1\x01\0\0\
-\x2a\x1d\0\0\x01\0\0\x04\x08\0\0\0\x35\x1d\0\0\x49\0\0\0\0\0\0\0\x3b\x1d\0\0\
-\x14\0\0\x84\x40\x11\0\0\x49\x1d\0\0\x1d\x01\0\0\0\0\0\0\x2e\x01\0\0\x2d\0\0\0\
-\xc0\0\0\0\x53\x1d\0\0\x4d\0\0\0\0\x01\0\0\x56\x1d\0\0\x4d\0\0\0\x10\x01\0\0\
-\x59\x1d\0\0\x4d\0\0\0\x20\x01\0\0\x61\x1d\0\0\x4d\0\0\0\x30\x01\0\0\x69\x1d\0\
-\0\x2d\0\0\0\x40\x01\0\0\x70\x1d\0\0\x2d\0\0\0\x80\x01\0\0\x77\x1d\0\0\x6b\x01\
-\0\0\xc0\x01\0\0\x82\x1d\0\0\x2d\0\0\0\xc0\x02\0\0\x8e\x1d\0\0\x2d\0\0\0\0\x03\
-\0\0\x99\x1d\0\0\x2d\0\0\0\x40\x03\0\0\x9d\x1d\0\0\x2d\0\0\0\x80\x03\0\0\xa5\
-\x1d\0\0\x2d\0\0\0\xc0\x03\0\0\xb0\x1d\0\0\x6c\x01\0\0\0\x04\0\0\xba\x1d\0\0\
-\x2d\0\0\0\x40\x04\0\0\xc4\x1d\0\0\x39\0\0\0\x80\x04\0\x01\xce\x1d\0\0\x39\0\0\
-\0\x81\x04\0\x01\xe1\x1d\0\0\x40\0\0\0\xa0\x04\0\0\xe6\x1d\0\0\x6d\x01\0\0\0\
-\x06\0\0\xea\x1d\0\0\x0d\0\0\x84\x08\0\0\0\xf6\x1d\0\0\x4b\0\0\0\0\0\0\0\xfd\
-\x1d\0\0\x4b\0\0\0\x10\0\0\0\x03\x1e\0\0\x4b\0\0\0\x20\0\0\x08\x19\0\0\0\x4b\0\
-\0\0\x28\0\0\x04\xa3\x14\0\0\x4b\0\0\0\x2c\0\0\x01\x09\x1e\0\0\x4b\0\0\0\x2d\0\
-\0\x02\x0d\x1e\0\0\x4b\0\0\0\x2f\0\0\x01\x0f\x1e\0\0\x4b\0\0\0\x30\0\0\x04\x16\
-\x1e\0\0\x4b\0\0\0\x34\0\0\x01\x1a\x1e\0\0\x4b\0\0\0\x35\0\0\x01\x1c\x1e\0\0\
-\x4b\0\0\0\x36\0\0\x01\x1e\x1e\0\0\x4b\0\0\0\x37\0\0\x01\x20\x1e\0\0\x4b\0\0\0\
-\x38\0\0\x08\0\0\0\0\0\0\0\x03\0\0\0\0\x1c\x01\0\0\x04\0\0\0\x03\0\0\0\0\0\0\0\
-\0\0\0\x02\x1f\x01\0\0\x26\x1e\0\0\x4b\0\0\x04\x08\x07\0\0\x31\x1e\0\0\x52\0\0\
-\0\0\0\0\0\x3d\x1e\0\0\x52\0\0\0\x80\0\0\0\x4a\x1e\0\0\x52\0\0\0\0\x01\0\0\x97\
-\x0f\0\0\x50\0\0\0\x80\x01\0\0\x56\x1e\0\0\x54\0\0\0\x40\x02\0\0\x62\x1e\0\0\
-\x52\0\0\0\x80\x02\0\0\x70\x1e\0\0\x91\0\0\0\0\x03\0\0\x7c\x1e\0\0\x52\0\0\0\
-\x80\x03\0\0\x89\x1e\0\0\x02\0\0\0\0\x04\0\0\x95\x1e\0\0\x02\0\0\0\x20\x04\0\0\
-\xa0\x1e\0\0\x02\0\0\0\x40\x04\0\0\x62\x06\0\0\x1e\x01\0\0\x80\x04\0\0\x65\x1b\
-\0\0\xfd\0\0\0\xc0\x04\0\0\xab\x1e\0\0\x42\0\0\0\0\x05\0\0\x2f\x12\0\0\x20\x01\
-\0\0\x40\x05\0\0\xb7\x1e\0\0\x39\0\0\0\x60\x05\0\0\x1c\x15\0\0\x21\x01\0\0\x80\
-\x05\0\0\xc4\x1e\0\0\xf8\0\0\0\xc0\x05\0\0\xd0\x1e\0\0\x54\0\0\0\0\x06\0\0\xe3\
-\x1e\0\0\x54\0\0\0\x40\x06\0\0\xf6\x1e\0\0\x54\0\0\0\x80\x06\0\0\xfd\x1e\0\0\
-\x23\x01\0\0\xc0\x06\0\0\x02\x1f\0\0\x4b\0\0\0\xc0\x0a\0\0\x0e\x1f\0\0\x4b\0\0\
-\0\xd0\x0a\0\0\x1d\x1f\0\0\x4b\0\0\0\xe0\x0a\0\0\x27\x1f\0\0\x29\x01\0\0\0\x0b\
-\0\0\x42\x01\0\0\xfb\0\0\0\0\x11\0\0\x16\x1c\0\0\xf7\0\0\0\x40\x11\0\0\x2a\x1f\
-\0\0\xf8\0\0\0\x80\x11\0\0\x43\x1f\0\0\xf8\0\0\0\xc0\x11\0\0\x5c\x1f\0\0\xf6\0\
-\0\0\0\x12\0\0\x68\x1f\0\0\x52\0\0\0\x80\x16\0\0\x4a\x06\0\0\x1e\x01\0\0\0\x17\
-\0\0\x73\x1f\0\0\x02\0\0\0\x40\x17\0\0\xe3\x0e\0\0\x02\0\0\0\x60\x17\0\0\x79\
-\x1f\0\0\x52\0\0\0\x80\x17\0\0\x46\x16\0\0\x3b\0\0\0\0\x18\0\0\x85\x1f\0\0\xf6\
-\0\0\0\x40\x18\0\0\x90\x1f\0\0\x45\0\0\0\xc0\x1c\0\0\x9b\x1f\0\0\x3a\x01\0\0\0\
-\x1d\0\0\x9e\x1f\0\0\x52\0\0\0\x40\x1d\0\0\xa7\x1f\0\0\x2d\0\0\0\xc0\x1d\0\0\
-\xb3\x1f\0\0\x02\0\0\0\0\x1e\0\0\xbf\x1f\0\0\x3b\x01\0\0\x40\x1e\0\0\xc5\x1f\0\
-\0\x3d\x01\0\0\xc0\x20\0\0\xcc\x1f\0\0\x39\0\0\0\0\x21\0\0\xdb\x1f\0\0\x39\0\0\
-\0\x20\x21\0\0\xe8\x1f\0\0\x39\0\0\0\x40\x21\0\0\xf8\x1f\0\0\x39\0\0\0\x60\x21\
-\0\0\x08\x20\0\0\x2d\0\0\0\x80\x21\0\0\x15\x20\0\0\x3e\x01\0\0\xc0\x21\0\0\x21\
-\x20\0\0\xb5\0\0\0\xc0\x22\0\0\x2e\x20\0\0\x39\0\0\0\x40\x23\0\0\x3b\x20\0\0\
-\x45\0\0\0\x60\x23\0\0\x47\x20\0\0\x43\x01\0\0\x80\x23\0\0\x54\x20\0\0\x44\x01\
-\0\0\x40\x26\0\0\x67\x20\0\0\x2d\0\0\0\x80\x26\0\0\x78\x20\0\0\x1e\x01\0\0\xc0\
-\x26\0\0\x82\x20\0\0\x45\x01\0\0\0\x27\0\0\xf6\x17\0\0\xb5\0\0\0\x40\x27\0\0\
-\x8a\x20\0\0\x47\x01\0\0\xc0\x27\0\0\x8d\x20\0\0\x54\0\0\0\0\x28\0\0\x90\x20\0\
-\0\xf8\0\0\0\x40\x28\0\0\x9d\x20\0\0\x48\x01\0\0\x80\x28\0\0\xa3\x20\0\0\x4a\
-\x01\0\0\xc0\x28\0\0\xb4\x20\0\0\x42\0\0\0\0\x29\0\0\xcd\x20\0\0\x4a\x01\0\0\
-\x40\x29\0\0\xe3\x20\0\0\x59\x01\0\0\x80\x29\0\0\xe8\x20\0\0\x54\0\0\0\xc0\x29\
-\0\0\xf3\x20\0\0\x5a\x01\0\0\0\x2a\0\0\xa4\x18\0\0\x5b\x01\0\0\x40\x2a\0\0\xfc\
-\x20\0\0\x5c\x01\0\0\x80\x2a\0\0\x07\x21\0\0\x6a\x01\0\0\x40\x37\0\0\x24\x0e\0\
-\0\x42\0\0\0\x80\x37\0\0\x0c\x21\0\0\x52\0\0\0\xc0\x37\0\0\x14\x21\0\0\x06\0\0\
-\x06\x04\0\0\0\x25\x21\0\0\xfc\xff\xff\xff\x3b\x21\0\0\xfd\xff\xff\xff\x51\x21\
-\0\0\xfe\xff\xff\xff\x68\x21\0\0\xff\xff\xff\xff\x7d\x21\0\0\0\0\0\0\x97\x21\0\
-\0\x01\0\0\0\xaf\x21\0\0\0\0\0\x08\x22\x01\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\
-\xa3\x1c\0\0\xff\0\0\0\0\0\0\0\xb9\x21\0\0\x3b\0\0\x84\x80\0\0\0\x19\0\0\0\x41\
-\0\0\0\0\0\0\0\x14\x1d\0\0\x41\0\0\0\x20\0\0\0\xc9\x21\0\0\x55\0\0\0\x40\0\0\0\
-\0\0\0\0\x24\x01\0\0\x80\0\0\0\xd0\x21\0\0\x55\0\0\0\xc0\0\0\0\xdc\x21\0\0\x55\
-\0\0\0\0\x01\0\0\xe8\x21\0\0\x55\0\0\0\x40\x01\0\x01\xf1\x21\0\0\x55\0\0\0\x41\
-\x01\0\x01\xf9\x21\0\0\x55\0\0\0\x42\x01\0\x01\0\x22\0\0\x55\0\0\0\x43\x01\0\
-\x01\x0a\x22\0\0\x55\0\0\0\x44\x01\0\x01\x17\x22\0\0\x55\0\0\0\x45\x01\0\x01\
-\x26\x22\0\0\x55\0\0\0\x46\x01\0\x01\x31\x22\0\0\x55\0\0\0\x47\x01\0\x01\x3e\
-\x22\0\0\x55\0\0\0\x48\x01\0\x01\x96\x07\0\0\x55\0\0\0\x49\x01\0\x01\x43\x22\0\
-\0\x55\0\0\0\x4a\x01\0\x01\x48\x22\0\0\x55\0\0\0\x4b\x01\0\x01\x55\x22\0\0\x55\
-\0\0\0\x4c\x01\0\x01\x1f\x1c\0\0\x55\0\0\0\x4d\x01\0\x01\x64\x22\0\0\x55\0\0\0\
-\x4e\x01\0\x01\x6e\x22\0\0\x55\0\0\0\x4f\x01\0\x02\x79\x22\0\0\x55\0\0\0\x51\
-\x01\0\x01\x83\x22\0\0\x55\0\0\0\x52\x01\0\x01\x91\x22\0\0\x55\0\0\0\x53\x01\0\
-\x01\x9e\x22\0\0\x55\0\0\0\x54\x01\0\x01\xac\x22\0\0\x55\0\0\0\x55\x01\0\x01\
-\xc5\x22\0\0\x55\0\0\0\x56\x01\0\x01\xdc\x22\0\0\x55\0\0\0\x57\x01\0\x01\xe2\
-\x22\0\0\x55\0\0\0\x58\x01\0\x01\xec\x22\0\0\x55\0\0\0\x59\x01\0\x01\xf8\x22\0\
-\0\x55\0\0\0\x5a\x01\0\x01\x07\x23\0\0\x55\0\0\0\x5b\x01\0\x01\x16\x23\0\0\x55\
-\0\0\0\x5c\x01\0\x01\x21\x23\0\0\x55\0\0\0\x5d\x01\0\x01\x29\x23\0\0\x55\0\0\0\
-\x5e\x01\0\x01\x33\x23\0\0\x55\0\0\0\x5f\x01\0\x01\x3e\x23\0\0\x55\0\0\0\x60\
-\x01\0\x01\x45\x23\0\0\x55\0\0\0\x61\x01\0\x01\x4f\x23\0\0\x55\0\0\0\x62\x01\0\
-\x01\x58\x23\0\0\x55\0\0\0\x63\x01\0\x01\x67\x23\0\0\x55\0\0\0\x64\x01\0\x01\
-\x76\x23\0\0\x55\0\0\0\x65\x01\0\x01\x7e\x23\0\0\x55\0\0\0\x66\x01\0\x1a\0\0\0\
-\0\x25\x01\0\0\x80\x01\0\0\x8b\x23\0\0\x41\0\0\0\xa0\x01\0\0\0\0\0\0\x26\x01\0\
-\0\xc0\x01\0\0\0\0\0\0\x27\x01\0\0\0\x02\0\0\x93\x23\0\0\x55\0\0\0\x40\x02\0\0\
-\xa6\x23\0\0\x55\0\0\0\x80\x02\0\0\xb7\x23\0\0\x41\0\0\0\xc0\x02\0\0\x61\x15\0\
-\0\x28\x01\0\0\xe0\x02\0\0\xc9\x23\0\0\x55\0\0\0\0\x03\0\0\xda\x23\0\0\x41\0\0\
-\0\x40\x03\0\0\xe8\x23\0\0\x4c\0\0\0\x60\x03\0\0\xf9\x23\0\0\x4c\0\0\0\x70\x03\
-\0\0\x06\x24\0\0\x41\0\0\0\x80\x03\0\0\x16\x24\0\0\x41\0\0\0\xa0\x03\0\0\x23\
-\x24\0\0\x55\0\0\0\xc0\x03\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\x2c\x24\0\0\x55\0\
-\0\0\0\0\0\0\x3a\x24\0\0\x55\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\x46\
-\x24\0\0\x41\0\0\0\0\0\0\0\x54\x24\0\0\x41\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x05\
-\x08\0\0\0\x65\x24\0\0\x55\0\0\0\0\0\0\0\x6d\x24\0\0\x55\0\0\0\0\0\0\0\x79\x24\
-\0\0\x55\0\0\0\0\0\0\0\x85\x24\0\0\x55\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x05\x08\0\
-\0\0\x8d\x24\0\0\x55\0\0\0\0\0\0\0\x94\x24\0\0\x55\0\0\0\0\0\0\0\xa0\x24\0\0\
-\x55\0\0\0\0\0\0\0\xad\x24\0\0\x55\0\0\0\0\0\0\0\xb5\x24\0\0\0\0\0\x08\x02\0\0\
-\0\xbb\x24\0\0\x0c\0\0\x04\xc0\0\0\0\0\0\0\0\x2a\x01\0\0\0\0\0\0\xc9\x24\0\0\
-\x3b\0\0\0\0\x03\0\0\x47\x20\0\0\x42\0\0\0\x40\x03\0\0\x67\x20\0\0\x2d\0\0\0\
-\x80\x03\0\0\x2f\x12\0\0\x02\0\0\0\xc0\x03\0\0\xd0\x24\0\0\x21\x01\0\0\0\x04\0\
-\0\x2c\x24\0\0\x54\0\0\0\x40\x04\0\0\0\0\0\0\x37\x01\0\0\x80\x04\0\0\xdb\x24\0\
-\0\x54\0\0\0\0\x05\0\0\xea\x24\0\0\x54\0\0\0\x40\x05\0\0\xf5\x24\0\0\x54\0\0\0\
-\x80\x05\0\0\x05\x25\0\0\x54\0\0\0\xc0\x05\0\0\0\0\0\0\x06\0\0\x05\x60\0\0\0\0\
-\0\0\0\x2b\x01\0\0\0\0\0\0\0\0\0\0\x2d\x01\0\0\0\0\0\0\0\0\0\0\x2e\x01\0\0\0\0\
-\0\0\0\0\0\0\x2f\x01\0\0\0\0\0\0\0\0\0\0\x30\x01\0\0\0\0\0\0\0\0\0\0\x36\x01\0\
-\0\0\0\0\0\0\0\0\0\x0a\0\0\x04\x60\0\0\0\xc9\x21\0\0\x54\0\0\0\0\0\0\0\x16\x25\
-\0\0\x54\0\0\0\x40\0\0\0\x1f\x25\0\0\x2d\0\0\0\x80\0\0\0\x2b\x25\0\0\x2d\0\0\0\
-\xc0\0\0\0\x36\x25\0\0\x02\0\0\0\0\x01\0\0\x47\x25\0\0\x02\0\0\0\x20\x01\0\0\
-\x4b\x25\0\0\x02\0\0\0\x40\x01\0\0\x28\x01\0\0\x02\0\0\0\x60\x01\0\0\x54\x25\0\
-\0\x2c\x01\0\0\x80\x01\0\0\x5e\x25\0\0\x2c\x01\0\0\x40\x02\0\0\x69\x25\0\0\x04\
-\0\0\x04\x18\0\0\0\xc9\x21\0\0\x54\0\0\0\0\0\0\0\x7d\x25\0\0\x39\0\0\0\x40\0\0\
-\0\x81\x25\0\0\x02\0\0\0\x60\0\0\0\x47\x25\0\0\x02\0\0\0\x80\0\0\0\0\0\0\0\x01\
-\0\0\x04\x40\0\0\0\x07\x12\0\0\x61\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\x04\x10\0\0\0\
-\x87\x25\0\0\x52\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x8f\x25\0\0\x54\0\
-\0\0\0\0\0\0\x97\x25\0\0\x54\0\0\0\x40\0\0\0\0\0\0\0\x02\0\0\x04\x28\0\0\0\x9c\
-\x25\0\0\x31\x01\0\0\0\0\0\0\xa1\x25\0\0\x32\x01\0\0\xc0\0\0\0\xa9\x25\0\0\x04\
-\0\0\x04\x18\0\0\0\xbc\x25\0\0\x2d\0\0\0\0\0\0\0\xc4\x25\0\0\x2d\0\0\0\x40\0\0\
-\0\xd1\x18\0\0\x69\0\0\0\x80\0\0\0\x19\0\0\0\x69\0\0\0\x88\0\0\0\xc9\x25\0\0\
-\x02\0\0\x04\x10\0\0\0\xd5\x25\0\0\x33\x01\0\0\0\0\0\0\x4e\x0f\0\0\x35\x01\0\0\
-\x40\0\0\0\xdb\x25\0\0\x01\0\0\x04\x08\0\0\0\x4e\x0f\0\0\x34\x01\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x02\x33\x01\0\0\0\0\0\0\0\0\0\x02\x32\x01\0\0\0\0\0\0\x05\0\0\x04\
-\x18\0\0\0\xe6\x25\0\0\x69\0\0\0\0\0\0\0\xf1\x25\0\0\x69\0\0\0\x08\0\0\0\xfc\
-\x25\0\0\x4b\0\0\0\x10\0\0\0\x04\x26\0\0\x54\0\0\0\x40\0\0\0\x09\x26\0\0\x54\0\
-\0\0\x80\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\0\0\0\0\x38\x01\0\0\0\0\0\0\0\0\0\
-\0\x39\x01\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x0f\x26\0\0\x54\0\0\0\0\0\
-\0\0\x1b\x26\0\0\x21\x01\0\0\x40\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x27\x26\0\
-\0\x54\0\0\0\0\0\0\0\x34\x26\0\0\x54\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\xd2\x01\
-\0\0\x40\x26\0\0\0\0\0\x08\x3c\x01\0\0\x52\x26\0\0\x02\0\0\x04\x50\0\0\0\x0c\
-\x16\0\0\xd8\0\0\0\0\0\0\0\x62\x26\0\0\x52\0\0\0\0\x02\0\0\0\0\0\0\0\0\0\x02\
-\xb8\x01\0\0\x67\x26\0\0\x03\0\0\x04\x20\0\0\0\x0f\x12\0\0\x47\0\0\0\0\0\0\0\
-\x04\x18\0\0\x3f\x01\0\0\x80\0\0\0\x70\x26\0\0\x42\x01\0\0\xc0\0\0\0\0\0\0\0\0\
-\0\0\x02\x40\x01\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x41\x01\0\0\0\0\0\0\0\
-\0\0\x02\x3e\x01\0\0\x78\x26\0\0\x01\0\0\x04\x08\0\0\0\x1f\x1c\0\0\x3b\0\0\0\0\
-\0\0\0\x80\x26\0\0\x03\0\0\x04\x58\0\0\0\x47\x18\0\0\x52\0\0\0\0\0\0\0\x0c\x16\
-\0\0\x98\0\0\0\x80\0\0\0\x97\x26\0\0\x39\0\0\0\x80\x02\0\0\0\0\0\0\0\0\0\x02\
-\xd0\x01\0\0\0\0\0\0\0\0\0\x02\x46\x01\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\
-\x1e\x01\0\0\0\0\0\0\0\0\0\x02\xd7\x01\0\0\0\0\0\0\0\0\0\x02\x49\x01\0\0\0\0\0\
-\0\x01\0\0\x0d\x54\0\0\0\0\0\0\0\0\0\0\0\xa7\x26\0\0\0\0\0\x08\x4b\x01\0\0\0\0\
-\0\0\0\0\0\x02\x4c\x01\0\0\0\0\0\0\x03\0\0\x0d\0\0\0\0\0\0\0\0\x1e\x01\0\0\0\0\
-\0\0\x4d\x01\0\0\0\0\0\0\x2b\0\0\0\0\0\0\0\0\0\0\x02\x4e\x01\0\0\xbf\x26\0\0\
-\x18\0\0\x04\0\x01\0\0\xd0\x26\0\0\x54\0\0\0\0\0\0\0\xdd\x26\0\0\x54\0\0\0\x40\
-\0\0\0\xe4\x26\0\0\x4f\x01\0\0\x80\0\0\0\x1d\x10\0\0\x50\x01\0\0\xc0\0\0\0\xed\
-\x26\0\0\x52\x01\0\0\0\x01\0\0\xf6\x26\0\0\x54\0\0\0\x40\x01\0\0\xfa\x26\0\0\
-\x54\0\0\0\x80\x01\0\0\xff\x26\0\0\x54\x01\0\0\xc0\x01\0\0\x19\0\0\0\x54\0\0\0\
-\0\x02\0\0\x22\x01\0\0\x54\0\0\0\x40\x02\0\0\x03\x27\0\0\x55\x01\0\0\x80\x02\0\
-\0\x55\x15\0\0\x54\0\0\0\xc0\x02\0\0\x8d\x20\0\0\x54\0\0\0\0\x03\0\0\x0d\x27\0\
-\0\x54\0\0\0\x40\x03\0\0\x17\x27\0\0\x56\x01\0\0\x80\x03\0\0\x21\x27\0\0\x57\
-\x01\0\0\xc0\x03\0\0\x2b\x27\0\0\x54\0\0\0\0\x04\0\0\x34\x27\0\0\x58\x01\0\0\
-\x40\x04\0\0\x3e\x27\0\0\x58\x01\0\0\xc0\x04\0\0\x48\x27\0\0\x54\0\0\0\x40\x05\
-\0\0\x58\x27\0\0\x54\0\0\0\x80\x05\0\0\x3e\x23\0\0\x54\0\0\0\xc0\x05\0\0\x62\
-\x27\0\0\x54\0\0\0\0\x06\0\0\x71\x27\0\0\x54\0\0\0\x40\x06\0\0\0\0\0\0\0\0\0\
-\x02\xd1\x01\0\0\x80\x27\0\0\x02\0\0\x05\x08\0\0\0\x93\x27\0\0\x55\0\0\0\0\0\0\
-\0\0\0\0\0\x51\x01\0\0\0\0\0\0\0\0\0\0\x03\0\0\x04\x08\0\0\0\x98\x27\0\0\x41\0\
-\0\0\0\0\0\0\xa0\x27\0\0\x4c\0\0\0\x20\0\0\0\xa7\x27\0\0\x4c\0\0\0\x30\0\0\0\
-\xae\x27\0\0\x02\0\0\x05\x08\0\0\0\x4a\x15\0\0\x55\0\0\0\0\0\0\0\0\0\0\0\x53\
-\x01\0\0\0\0\0\0\0\0\0\0\x0b\0\0\x84\x08\0\0\0\xc0\x27\0\0\x55\0\0\0\0\0\0\x05\
-\xc7\x27\0\0\x55\0\0\0\x05\0\0\x0e\xcf\x27\0\0\x55\0\0\0\x13\0\0\x05\xd9\x27\0\
-\0\x55\0\0\0\x18\0\0\x02\xe2\x27\0\0\x55\0\0\0\x1a\0\0\x07\xeb\x27\0\0\x55\0\0\
-\0\x21\0\0\x04\xf7\x27\0\0\x55\0\0\0\x25\0\0\x01\x02\x28\0\0\x55\0\0\0\x26\0\0\
-\x02\x0d\x28\0\0\x55\0\0\0\x28\0\0\x03\x15\x28\0\0\x55\0\0\0\x2b\0\0\x03\x1e\
-\x28\0\0\x55\0\0\0\x2e\0\0\x12\0\0\0\0\0\0\0\x02\xd5\x01\0\0\0\0\0\0\x02\0\0\
-\x04\x08\0\0\0\x28\x06\0\0\x40\0\0\0\0\0\0\0\x27\x28\0\0\x40\0\0\0\x20\0\0\0\0\
-\0\0\0\x02\0\0\x04\x08\0\0\0\xe3\x0e\0\0\x40\0\0\0\0\0\0\0\x2b\x28\0\0\x40\0\0\
-\0\x20\0\0\0\0\0\0\0\0\0\0\x02\xd3\x01\0\0\x34\x28\0\0\x02\0\0\x04\x10\0\0\0\
-\x3e\x28\0\0\x55\0\0\0\0\0\0\0\x42\x28\0\0\x2b\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\
-\x02\xb0\x01\0\0\0\0\0\0\0\0\0\x02\xe8\x01\0\0\0\0\0\0\0\0\0\x02\xb7\x01\0\0\
-\xfc\x20\0\0\x0c\0\0\x04\x98\x01\0\0\x04\x18\0\0\x5d\x01\0\0\0\0\0\0\x4e\x0f\0\
-\0\x60\x01\0\0\x40\0\0\0\x28\x01\0\0\x2d\0\0\0\x80\0\0\0\x47\x28\0\0\x42\0\0\0\
-\xc0\0\0\0\x4f\x28\0\0\x5d\x01\0\0\0\x01\0\0\x5a\x28\0\0\x63\x01\0\0\x40\x01\0\
-\0\x65\x28\0\0\x65\x01\0\0\x40\x06\0\0\x6f\x28\0\0\x63\x01\0\0\x80\x06\0\0\x78\
-\x28\0\0\x2d\0\0\0\x80\x0b\0\0\x83\x28\0\0\x2d\0\0\0\xc0\x0b\0\0\x47\x18\0\0\
-\x52\0\0\0\0\x0c\0\0\x93\x28\0\0\x66\x01\0\0\x80\x0c\0\0\x9c\x28\0\0\0\0\0\x08\
-\x5e\x01\0\0\0\0\0\0\0\0\0\x02\x5f\x01\0\0\0\0\0\0\x04\0\0\x0d\0\0\0\0\0\0\0\0\
-\x2d\0\0\0\0\0\0\0\x2d\0\0\0\0\0\0\0\x60\x01\0\0\0\0\0\0\x61\x01\0\0\0\0\0\0\0\
-\0\0\x02\x5c\x01\0\0\0\0\0\0\0\0\0\x02\x62\x01\0\0\xaa\x28\0\0\x01\0\0\x04\xa8\
-\0\0\0\x42\x28\0\0\x2c\0\0\0\0\0\0\0\xb6\x28\0\0\x03\0\0\x04\xa0\0\0\0\xc6\x28\
-\0\0\x64\x01\0\0\0\0\0\0\xd3\x28\0\0\x64\x01\0\0\x40\0\0\0\xdf\x28\0\0\xf6\0\0\
-\0\x80\0\0\0\0\0\0\0\0\0\0\x02\xbb\x01\0\0\0\0\0\0\0\0\0\x02\x63\x01\0\0\xea\
-\x28\0\0\0\0\0\x08\x67\x01\0\0\0\0\0\0\0\0\0\x02\x68\x01\0\0\0\0\0\0\x02\0\0\
-\x0d\x02\0\0\0\0\0\0\0\x60\x01\0\0\0\0\0\0\x69\x01\0\0\xfc\x28\0\0\x03\0\0\x06\
-\x04\0\0\0\x0b\x29\0\0\0\0\0\0\x35\x29\0\0\x01\0\0\0\x5f\x29\0\0\x02\0\0\0\0\0\
-\0\0\0\0\0\x02\xd4\x01\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x1e\x01\0\0\x04\0\0\0\x04\
-\0\0\0\0\0\0\0\0\0\0\x02\xbf\x01\0\0\xe6\x1d\0\0\x07\0\0\x04\x80\x10\0\0\x4b\
-\x25\0\0\x39\0\0\0\0\0\0\0\x8a\x29\0\0\x2d\0\0\0\x40\0\0\0\x9b\x29\0\0\x6e\x01\
-\0\0\x80\0\0\0\xa3\x29\0\0\x6e\x01\0\0\xc0\0\0\0\xb2\x29\0\0\x6f\x01\0\0\0\x01\
-\0\0\xb7\x29\0\0\x6f\x01\0\0\x80\x01\0\0\xc2\x29\0\0\x70\x01\0\0\0\x02\0\0\0\0\
-\0\0\0\0\0\x02\x70\x01\0\0\xcc\x29\0\0\x03\0\0\x04\x10\0\0\0\xdb\x29\0\0\x54\0\
-\0\0\0\0\0\0\xe8\x29\0\0\x39\0\0\0\x40\0\0\0\xf5\x29\0\0\x39\0\0\0\x60\0\0\0\
-\x9b\x29\0\0\x0a\0\0\x84\x40\x10\0\0\x14\x1d\0\0\x39\0\0\0\0\0\0\0\x07\x2a\0\0\
-\x39\0\0\0\x20\0\0\0\x11\x2a\0\0\x54\0\0\0\x40\0\0\0\x1b\x2a\0\0\x54\0\0\0\x80\
-\0\0\0\x2a\x2a\0\0\x54\0\0\0\xc0\0\0\0\x2e\x2a\0\0\x39\0\0\0\0\x01\0\x01\x38\
-\x2a\0\0\x39\0\0\0\x01\x01\0\x01\x41\x2a\0\0\x39\0\0\0\x02\x01\0\x01\x51\x2a\0\
-\0\x39\0\0\0\x03\x01\0\x01\x42\x28\0\0\x71\x01\0\0\0\x02\0\0\x58\x2a\0\0\x05\0\
-\0\x05\0\x10\0\0\x65\x2a\0\0\x72\x01\0\0\0\0\0\0\x6b\x2a\0\0\x74\x01\0\0\0\0\0\
-\0\x72\x2a\0\0\x7c\x01\0\0\0\0\0\0\x77\x2a\0\0\x7e\x01\0\0\0\0\0\0\x06\x19\0\0\
-\x82\x01\0\0\0\0\0\0\x7d\x2a\0\0\x09\0\0\x04\x70\0\0\0\x89\x2a\0\0\x40\0\0\0\0\
-\0\0\0\x8d\x2a\0\0\x40\0\0\0\x20\0\0\0\x91\x2a\0\0\x40\0\0\0\x40\0\0\0\x95\x2a\
-\0\0\x40\0\0\0\x60\0\0\0\x99\x2a\0\0\x40\0\0\0\x80\0\0\0\x9d\x2a\0\0\x40\0\0\0\
-\xa0\0\0\0\xa1\x2a\0\0\x40\0\0\0\xc0\0\0\0\xa5\x2a\0\0\x73\x01\0\0\xe0\0\0\0\
-\xdc\x0e\0\0\x40\0\0\0\x60\x03\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x40\0\0\0\x04\0\0\
-\0\x14\0\0\0\xae\x2a\0\0\x0b\0\0\x04\0\x02\0\0\x89\x2a\0\0\x4b\0\0\0\0\0\0\0\
-\x8d\x2a\0\0\x4b\0\0\0\x10\0\0\0\x91\x2a\0\0\x4b\0\0\0\x20\0\0\0\xbb\x2a\0\0\
-\x4b\0\0\0\x30\0\0\0\0\0\0\0\x75\x01\0\0\x40\0\0\0\xbf\x2a\0\0\x40\0\0\0\xc0\0\
-\0\0\xc5\x2a\0\0\x40\0\0\0\xe0\0\0\0\xa5\x2a\0\0\x78\x01\0\0\0\x01\0\0\xd0\x2a\
-\0\0\x79\x01\0\0\0\x05\0\0\xfc\x25\0\0\x7a\x01\0\0\0\x0d\0\0\0\0\0\0\x7b\x01\0\
-\0\x80\x0e\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\0\0\0\0\x76\x01\0\0\0\0\0\0\0\0\0\
-\0\x77\x01\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\xda\x2a\0\0\x54\0\0\0\0\0\
-\0\0\xde\x2a\0\0\x54\0\0\0\x40\0\0\0\0\0\0\0\x04\0\0\x04\x10\0\0\0\x95\x2a\0\0\
-\x40\0\0\0\0\0\0\0\x99\x2a\0\0\x40\0\0\0\x20\0\0\0\x9d\x2a\0\0\x40\0\0\0\x40\0\
-\0\0\xa1\x2a\0\0\x40\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x40\0\0\0\x04\0\
-\0\0\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x40\0\0\0\x04\0\0\0\x40\0\0\0\0\0\0\0\
-\0\0\0\x03\0\0\0\0\x40\0\0\0\x04\0\0\0\x0c\0\0\0\0\0\0\0\x02\0\0\x05\x30\0\0\0\
-\xe2\x2a\0\0\x7a\x01\0\0\0\0\0\0\xeb\x2a\0\0\x7a\x01\0\0\0\0\0\0\xf7\x2a\0\0\
-\x10\0\0\x04\x88\0\0\0\x89\x2a\0\0\x40\0\0\0\0\0\0\0\x8d\x2a\0\0\x40\0\0\0\x20\
-\0\0\0\x91\x2a\0\0\x40\0\0\0\x40\0\0\0\x95\x2a\0\0\x40\0\0\0\x60\0\0\0\x99\x2a\
-\0\0\x40\0\0\0\x80\0\0\0\x9d\x2a\0\0\x40\0\0\0\xa0\0\0\0\xa1\x2a\0\0\x40\0\0\0\
-\xc0\0\0\0\xa5\x2a\0\0\x73\x01\0\0\xe0\0\0\0\x04\x2b\0\0\x69\0\0\0\x60\x03\0\0\
-\x09\x2b\0\0\x69\0\0\0\x68\x03\0\0\x11\x2b\0\0\x69\0\0\0\x70\x03\0\0\x1b\x2b\0\
-\0\x69\0\0\0\x78\x03\0\0\x25\x2b\0\0\x69\0\0\0\x80\x03\0\0\x28\x2b\0\0\x69\0\0\
-\0\x88\x03\0\0\x9c\x25\0\0\x7d\x01\0\0\xc0\x03\0\0\x2f\x2b\0\0\x40\0\0\0\0\x04\
-\0\0\0\0\0\0\0\0\0\x02\xc6\x01\0\0\x39\x2b\0\0\x03\0\0\x04\x40\x02\0\0\x45\x2b\
-\0\0\x74\x01\0\0\0\0\0\0\x4a\x2b\0\0\x7f\x01\0\0\0\x10\0\0\x51\x2b\0\0\x81\x01\
-\0\0\0\x12\0\0\x65\x2b\0\0\x03\0\0\x04\x40\0\0\0\x11\x2a\0\0\x54\0\0\0\0\0\0\0\
-\x73\x2b\0\0\x54\0\0\0\x40\0\0\0\x2b\x28\0\0\x80\x01\0\0\x80\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x54\0\0\0\x04\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x69\0\0\
-\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x69\0\0\0\x04\0\0\0\0\x10\0\0\0\
-\0\0\0\0\0\0\x02\x84\x01\0\0\x7c\x2b\0\0\0\0\0\x07\0\0\0\0\0\0\0\0\x01\0\0\x0d\
-\x02\0\0\0\x42\x01\0\0\x83\x01\0\0\x97\x2b\0\0\x01\0\0\x0c\x85\x01\0\0\0\0\0\0\
-\0\0\0\x02\x88\x01\0\0\xa5\x2b\0\0\x06\0\0\x04\x38\0\0\0\x9c\x25\0\0\x89\x01\0\
-\0\0\0\0\0\xb3\x2b\0\0\x8b\x01\0\0\0\x01\0\0\xc3\x2b\0\0\x8a\x01\0\0\x40\x01\0\
-\0\xce\x2b\0\0\x8a\x01\0\0\x60\x01\0\0\xd9\x2b\0\0\x8a\x01\0\0\x80\x01\0\0\xe4\
-\x2b\0\0\x8a\x01\0\0\xa0\x01\0\0\xf3\x2b\0\0\x04\0\0\x04\x1c\0\0\0\x28\x06\0\0\
-\x8a\x01\0\0\0\0\0\0\x2c\x06\0\0\x8a\x01\0\0\x20\0\0\0\x04\x2c\0\0\x8a\x01\0\0\
-\x40\0\0\0\x96\x07\0\0\xbc\0\0\0\x60\0\0\0\xe7\x0e\0\0\0\0\0\x08\x39\0\0\0\x69\
-\x10\0\0\0\0\0\x08\x56\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x1f\x1c\0\0\x87\x01\
-\0\0\x0b\x2c\0\0\0\0\0\x0c\x8c\x01\0\0\0\0\0\0\0\0\0\x02\x8f\x01\0\0\x23\x2c\0\
-\0\x06\0\0\x04\x20\0\0\0\x2c\x06\0\0\x8a\x01\0\0\0\0\0\0\xc3\x2b\0\0\x8a\x01\0\
-\0\x20\0\0\0\xce\x2b\0\0\x8a\x01\0\0\x40\0\0\0\xd9\x2b\0\0\x8a\x01\0\0\x60\0\0\
-\0\xb3\x2b\0\0\x8b\x01\0\0\x80\0\0\0\xe4\x2b\0\0\x8a\x01\0\0\xc0\0\0\0\0\0\0\0\
-\x01\0\0\x0d\x02\0\0\0\x34\x2c\0\0\x8e\x01\0\0\x3c\x2c\0\0\0\0\0\x0c\x90\x01\0\
-\0\0\0\0\0\0\0\0\x02\x93\x01\0\0\x57\x2c\0\0\0\0\0\x07\0\0\0\0\0\0\0\0\x01\0\0\
-\x0d\x02\0\0\0\x42\x01\0\0\x92\x01\0\0\x72\x2c\0\0\x01\0\0\x0c\x94\x01\0\0\0\0\
-\0\0\0\0\0\x02\x56\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x42\x01\0\0\x96\x01\0\0\
-\x7e\x2c\0\0\x01\0\0\x0c\x97\x01\0\0\x8f\x2c\0\0\x01\0\0\x0c\x97\x01\0\0\x9f\
-\x2c\0\0\x01\0\0\x0c\x97\x01\0\0\xb1\x2c\0\0\x01\0\0\x0c\x97\x01\0\0\xc2\x2c\0\
-\0\x01\0\0\x0c\x97\x01\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xac\0\0\0\x04\0\0\0\x0d\0\
-\0\0\xd6\x2c\0\0\0\0\0\x0e\x9d\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xab\
-\0\0\0\x04\0\0\0\x1c\0\0\0\xde\x2c\0\0\0\0\0\x0e\x9f\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x0a\x8a\x01\0\0\xfb\x2c\0\0\0\0\0\x0e\xa1\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\xab\0\0\0\x04\0\0\0\x1d\0\0\0\0\x2d\0\0\0\0\0\x0e\xa3\x01\0\0\0\0\
-\0\0\x20\x2d\0\0\0\0\0\x0e\x9f\x01\0\0\0\0\0\0\x42\x2d\0\0\0\0\0\x0e\xa1\x01\0\
-\0\0\0\0\0\x46\x2d\0\0\0\0\0\x0e\xa3\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
-\xab\0\0\0\x04\0\0\0\x1f\0\0\0\x69\x2d\0\0\0\0\0\x0e\xa8\x01\0\0\0\0\0\0\x8e\
-\x2d\0\0\0\0\0\x07\0\0\0\0\x5a\x08\0\0\0\0\0\x07\0\0\0\0\xc5\x09\0\0\0\0\0\x07\
-\0\0\0\0\xa9\x09\0\0\0\0\0\x07\0\0\0\0\xa0\x2d\0\0\0\0\0\x07\0\0\0\0\xa9\x2d\0\
-\0\0\0\0\x07\0\0\0\0\xbb\x2d\0\0\0\0\0\x07\0\0\0\0\xc4\x2d\0\0\0\0\0\x07\0\0\0\
-\0\xe1\x09\0\0\0\0\0\x07\0\0\0\0\xf1\x0f\0\0\0\0\0\x07\0\0\0\0\xd0\x2d\0\0\0\0\
-\0\x07\0\0\0\0\x7c\x07\0\0\0\0\0\x07\0\0\0\0\xdb\x2d\0\0\0\0\0\x07\0\0\0\0\xe3\
-\x2d\0\0\0\0\0\x07\0\0\0\0\xf0\x2d\0\0\0\0\0\x07\0\0\0\0\xfe\x2d\0\0\0\0\0\x07\
-\0\0\0\0\x0b\x2e\0\0\0\0\0\x07\0\0\0\0\x15\x2e\0\0\0\0\0\x07\0\0\0\0\x21\x2e\0\
-\0\0\0\0\x07\0\0\0\0\x32\x2e\0\0\0\0\0\x07\0\0\0\0\x41\x2e\0\0\0\0\0\x07\0\0\0\
-\0\xb0\x1d\0\0\0\0\0\x07\0\0\0\0\xd6\x09\0\0\0\0\0\x07\0\0\0\0\x54\x2e\0\0\0\0\
-\0\x07\0\0\0\0\x62\x2e\0\0\0\0\0\x07\0\0\0\0\x95\x16\0\0\0\0\0\x07\0\0\0\0\x71\
-\x2e\0\0\0\0\0\x07\0\0\0\0\x80\x2e\0\0\0\0\0\x07\0\0\0\0\x95\x2e\0\0\0\0\0\x07\
-\0\0\0\0\xa3\x2e\0\0\0\0\0\x07\0\0\0\0\x23\x0b\0\0\0\0\0\x07\0\0\0\0\xae\x2e\0\
-\0\0\0\0\x07\0\0\0\0\xb8\x2e\0\0\0\0\0\x07\0\0\0\0\x9b\x07\0\0\0\0\0\x07\0\0\0\
-\0\xea\x07\0\0\0\0\0\x07\0\0\0\0\xe2\x0b\0\0\0\0\0\x07\0\0\0\0\xc5\x2e\0\0\0\0\
-\0\x07\0\0\0\0\x0f\x1d\0\0\0\0\0\x07\0\0\0\0\xd4\x2e\0\0\0\0\0\x07\0\0\0\0\xeb\
-\x2e\0\0\0\0\0\x07\0\0\0\0\xfd\x2e\0\0\0\0\0\x07\0\0\0\0\x09\x2f\0\0\0\0\0\x07\
-\0\0\0\0\x1e\x2f\0\0\0\0\0\x07\0\0\0\0\x2a\x2f\0\0\0\0\0\x07\0\0\0\0\x28\x06\0\
-\0\0\0\0\x07\0\0\0\0\x3a\x2f\0\0\0\0\0\x07\0\0\0\0\x48\x2f\0\0\0\0\0\x07\0\0\0\
-\0\x65\x1b\0\0\0\0\0\x07\0\0\0\0\x58\x2f\0\0\0\0\0\x07\0\0\0\0\x5f\x2f\0\0\0\0\
-\0\x07\0\0\0\0\xb7\x09\0\0\0\0\0\x07\0\0\0\0\x68\x2f\0\0\0\0\0\x07\0\0\0\0\x76\
-\x2f\0\0\0\0\0\x07\0\0\0\0\x34\x0c\0\0\0\0\0\x07\0\0\0\0\x87\x2f\0\0\0\0\0\x07\
-\0\0\0\0\xf9\x02\0\0\0\0\0\x07\0\0\0\0\x97\x2f\0\0\0\0\0\x07\0\0\0\0\xa6\x2f\0\
-\0\0\0\0\x07\0\0\0\0\xb4\x2f\0\0\0\0\0\x07\0\0\0\0\xc3\x2f\0\0\0\0\0\x07\0\0\0\
-\0\xd1\x2f\0\0\0\0\0\x07\0\0\0\0\xe1\x2f\0\0\0\0\0\x07\0\0\0\0\xec\x2f\0\0\0\0\
-\0\x07\0\0\0\0\xfd\x2f\0\0\0\0\0\x07\0\0\0\0\x09\x30\0\0\0\0\0\x07\0\0\0\0\x63\
-\x01\0\0\0\0\0\x07\0\0\0\0\x13\x42\0\0\x01\0\0\x0f\x0d\0\0\0\x9e\x01\0\0\0\0\0\
-\0\x0d\0\0\0\x1b\x42\0\0\x08\0\0\x0f\xd0\0\0\0\x0c\0\0\0\0\0\0\0\x20\0\0\0\x12\
-\0\0\0\x20\0\0\0\x20\0\0\0\x1a\0\0\0\x40\0\0\0\x20\0\0\0\x1b\0\0\0\x60\0\0\0\
-\x20\0\0\0\x1f\0\0\0\x80\0\0\0\x20\0\0\0\x25\0\0\0\xa0\0\0\0\x10\0\0\0\x29\0\0\
-\0\xb0\0\0\0\x10\0\0\0\x2a\0\0\0\xc0\0\0\0\x10\0\0\0\x21\x42\0\0\x07\0\0\x0f\
-\x9c\0\0\0\xa0\x01\0\0\0\0\0\0\x1c\0\0\0\xa2\x01\0\0\x1c\0\0\0\x04\0\0\0\xa4\
-\x01\0\0\x20\0\0\0\x1d\0\0\0\xa5\x01\0\0\x3d\0\0\0\x1c\0\0\0\xa6\x01\0\0\x5c\0\
-\0\0\x04\0\0\0\xa7\x01\0\0\x60\0\0\0\x1d\0\0\0\xa9\x01\0\0\x7d\0\0\0\x1f\0\0\0\
-\0\x69\x6e\x74\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\
-\x50\x45\x5f\x5f\0\x74\x79\x70\x65\0\x6b\x65\x79\x5f\x73\x69\x7a\x65\0\x76\x61\
-\x6c\x75\x65\x5f\x73\x69\x7a\x65\0\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\
-\0\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\0\x70\
-\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\0\
-\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x6f\x63\x63\x75\x70\x69\x65\x64\x5f\x6c\x69\
-\x73\x74\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x6f\x63\x63\x75\x70\x69\
-\x65\x64\x5f\x6c\x69\x73\x74\0\x74\x68\x72\x65\x68\x6f\x6c\x64\x5f\x6d\x61\x70\
-\0\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\
-\x72\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\
-\x75\x66\x66\x65\x72\0\x6f\x6f\x6d\x5f\x65\x76\x65\x6e\x74\x5f\x62\x75\x66\x66\
-\x65\x72\0\x70\x74\x5f\x72\x65\x67\x73\0\x72\x31\x35\0\x72\x31\x34\0\x72\x31\
-\x33\0\x72\x31\x32\0\x62\x70\0\x62\x78\0\x72\x31\x31\0\x72\x31\x30\0\x72\x39\0\
-\x72\x38\0\x61\x78\0\x63\x78\0\x64\x78\0\x73\x69\0\x64\x69\0\x6f\x72\x69\x67\
-\x5f\x61\x78\0\x69\x70\0\x63\x73\0\x66\x6c\x61\x67\x73\0\x73\x70\0\x73\x73\0\
-\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\0\x63\x74\x78\0\x6f\x6f\
-\x6d\x5f\x6b\x69\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x6f\x6f\x6d\x5f\x63\
-\x6f\x6e\x74\x72\x6f\x6c\0\x7a\x6f\x6e\x65\x6c\x69\x73\x74\0\x6e\x6f\x64\x65\
-\x6d\x61\x73\x6b\0\x6d\x65\x6d\x63\x67\0\x67\x66\x70\x5f\x6d\x61\x73\x6b\0\x6f\
-\x72\x64\x65\x72\0\x74\x6f\x74\x61\x6c\x70\x61\x67\x65\x73\0\x63\x68\x6f\x73\
-\x65\x6e\0\x63\x68\x6f\x73\x65\x6e\x5f\x70\x6f\x69\x6e\x74\x73\0\x63\x6f\x6e\
-\x73\x74\x72\x61\x69\x6e\x74\0\x6e\x6f\x64\x65\x6d\x61\x73\x6b\x5f\x74\0\x62\
-\x69\x74\x73\0\x67\x66\x70\x5f\x74\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\
-\x6e\x74\0\x6c\x6f\x6e\x67\0\x6f\x6f\x6d\x5f\x63\x6f\x6e\x73\x74\x72\x61\x69\
-\x6e\x74\0\x43\x4f\x4e\x53\x54\x52\x41\x49\x4e\x54\x5f\x4e\x4f\x4e\x45\0\x43\
-\x4f\x4e\x53\x54\x52\x41\x49\x4e\x54\x5f\x43\x50\x55\x53\x45\x54\0\x43\x4f\x4e\
-\x53\x54\x52\x41\x49\x4e\x54\x5f\x4d\x45\x4d\x4f\x52\x59\x5f\x50\x4f\x4c\x49\
-\x43\x59\0\x43\x4f\x4e\x53\x54\x52\x41\x49\x4e\x54\x5f\x4d\x45\x4d\x43\x47\0\
-\x74\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\0\x74\x68\x72\x65\x61\x64\x5f\x69\
-\x6e\x66\x6f\0\x5f\x5f\x73\x74\x61\x74\x65\0\x73\x74\x61\x63\x6b\0\x75\x73\x61\
-\x67\x65\0\x70\x74\x72\x61\x63\x65\0\x6f\x6e\x5f\x63\x70\x75\0\x77\x61\x6b\x65\
-\x5f\x65\x6e\x74\x72\x79\0\x77\x61\x6b\x65\x65\x5f\x66\x6c\x69\x70\x73\0\x77\
-\x61\x6b\x65\x65\x5f\x66\x6c\x69\x70\x5f\x64\x65\x63\x61\x79\x5f\x74\x73\0\x6c\
-\x61\x73\x74\x5f\x77\x61\x6b\x65\x65\0\x72\x65\x63\x65\x6e\x74\x5f\x75\x73\x65\
-\x64\x5f\x63\x70\x75\0\x77\x61\x6b\x65\x5f\x63\x70\x75\0\x6f\x6e\x5f\x72\x71\0\
-\x70\x72\x69\x6f\0\x73\x74\x61\x74\x69\x63\x5f\x70\x72\x69\x6f\0\x6e\x6f\x72\
-\x6d\x61\x6c\x5f\x70\x72\x69\x6f\0\x72\x74\x5f\x70\x72\x69\x6f\x72\x69\x74\x79\
-\0\x73\x65\0\x72\x74\0\x64\x6c\0\x73\x63\x68\x65\x64\x5f\x63\x6c\x61\x73\x73\0\
-\x73\x63\x68\x65\x64\x5f\x74\x61\x73\x6b\x5f\x67\x72\x6f\x75\x70\0\x73\x74\x61\
-\x74\x73\0\x62\x74\x72\x61\x63\x65\x5f\x73\x65\x71\0\x70\x6f\x6c\x69\x63\x79\0\
-\x6e\x72\x5f\x63\x70\x75\x73\x5f\x61\x6c\x6c\x6f\x77\x65\x64\0\x63\x70\x75\x73\
-\x5f\x70\x74\x72\0\x75\x73\x65\x72\x5f\x63\x70\x75\x73\x5f\x70\x74\x72\0\x63\
-\x70\x75\x73\x5f\x6d\x61\x73\x6b\0\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x5f\x70\
-\x65\x6e\x64\x69\x6e\x67\0\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x5f\x64\x69\x73\
-\x61\x62\x6c\x65\x64\0\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x5f\x66\x6c\x61\x67\
-\x73\0\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x6c\x6f\x63\x6b\x5f\x6e\x65\x73\x74\
-\x69\x6e\x67\0\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x75\x6e\x6c\x6f\x63\x6b\x5f\
-\x73\x70\x65\x63\x69\x61\x6c\0\x72\x63\x75\x5f\x6e\x6f\x64\x65\x5f\x65\x6e\x74\
-\x72\x79\0\x72\x63\x75\x5f\x62\x6c\x6f\x63\x6b\x65\x64\x5f\x6e\x6f\x64\x65\0\
-\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x6e\x76\x63\x73\x77\0\x72\x63\x75\x5f\
-\x74\x61\x73\x6b\x73\x5f\x68\x6f\x6c\x64\x6f\x75\x74\0\x72\x63\x75\x5f\x74\x61\
-\x73\x6b\x73\x5f\x69\x64\x78\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x69\x64\
-\x6c\x65\x5f\x63\x70\x75\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x68\x6f\x6c\
-\x64\x6f\x75\x74\x5f\x6c\x69\x73\x74\0\x74\x72\x63\x5f\x72\x65\x61\x64\x65\x72\
-\x5f\x6e\x65\x73\x74\x69\x6e\x67\0\x74\x72\x63\x5f\x69\x70\x69\x5f\x74\x6f\x5f\
-\x63\x70\x75\0\x74\x72\x63\x5f\x72\x65\x61\x64\x65\x72\x5f\x73\x70\x65\x63\x69\
-\x61\x6c\0\x74\x72\x63\x5f\x68\x6f\x6c\x64\x6f\x75\x74\x5f\x6c\x69\x73\x74\0\
-\x74\x72\x63\x5f\x62\x6c\x6b\x64\x5f\x6e\x6f\x64\x65\0\x74\x72\x63\x5f\x62\x6c\
-\x6b\x64\x5f\x63\x70\x75\0\x73\x63\x68\x65\x64\x5f\x69\x6e\x66\x6f\0\x74\x61\
-\x73\x6b\x73\0\x70\x75\x73\x68\x61\x62\x6c\x65\x5f\x74\x61\x73\x6b\x73\0\x70\
-\x75\x73\x68\x61\x62\x6c\x65\x5f\x64\x6c\x5f\x74\x61\x73\x6b\x73\0\x6d\x6d\0\
-\x61\x63\x74\x69\x76\x65\x5f\x6d\x6d\0\x72\x73\x73\x5f\x73\x74\x61\x74\0\x65\
-\x78\x69\x74\x5f\x73\x74\x61\x74\x65\0\x65\x78\x69\x74\x5f\x63\x6f\x64\x65\0\
-\x65\x78\x69\x74\x5f\x73\x69\x67\x6e\x61\x6c\0\x70\x64\x65\x61\x74\x68\x5f\x73\
-\x69\x67\x6e\x61\x6c\0\x6a\x6f\x62\x63\x74\x6c\0\x70\x65\x72\x73\x6f\x6e\x61\
-\x6c\x69\x74\x79\0\x73\x63\x68\x65\x64\x5f\x72\x65\x73\x65\x74\x5f\x6f\x6e\x5f\
-\x66\x6f\x72\x6b\0\x73\x63\x68\x65\x64\x5f\x63\x6f\x6e\x74\x72\x69\x62\x75\x74\
-\x65\x73\x5f\x74\x6f\x5f\x6c\x6f\x61\x64\0\x73\x63\x68\x65\x64\x5f\x6d\x69\x67\
-\x72\x61\x74\x65\x64\0\x73\x63\x68\x65\x64\x5f\x72\x65\x6d\x6f\x74\x65\x5f\x77\
-\x61\x6b\x65\x75\x70\0\x69\x6e\x5f\x65\x78\x65\x63\x76\x65\0\x69\x6e\x5f\x69\
-\x6f\x77\x61\x69\x74\0\x72\x65\x73\x74\x6f\x72\x65\x5f\x73\x69\x67\x6d\x61\x73\
-\x6b\0\x69\x6e\x5f\x75\x73\x65\x72\x5f\x66\x61\x75\x6c\x74\0\x62\x72\x6b\x5f\
-\x72\x61\x6e\x64\x6f\x6d\x69\x7a\x65\x64\0\x6e\x6f\x5f\x63\x67\x72\x6f\x75\x70\
-\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\0\x66\x72\x6f\x7a\x65\x6e\0\x75\x73\
-\x65\x5f\x6d\x65\x6d\x64\x65\x6c\x61\x79\0\x69\x6e\x5f\x65\x76\x65\x6e\x74\x66\
-\x64\0\x72\x65\x70\x6f\x72\x74\x65\x64\x5f\x73\x70\x6c\x69\x74\x5f\x6c\x6f\x63\
-\x6b\0\x69\x6e\x5f\x74\x68\x72\x61\x73\x68\x69\x6e\x67\0\x61\x74\x6f\x6d\x69\
-\x63\x5f\x66\x6c\x61\x67\x73\0\x72\x65\x73\x74\x61\x72\x74\x5f\x62\x6c\x6f\x63\
-\x6b\0\x70\x69\x64\0\x74\x67\x69\x64\0\x73\x74\x61\x63\x6b\x5f\x63\x61\x6e\x61\
-\x72\x79\0\x72\x65\x61\x6c\x5f\x70\x61\x72\x65\x6e\x74\0\x70\x61\x72\x65\x6e\
-\x74\0\x63\x68\x69\x6c\x64\x72\x65\x6e\0\x73\x69\x62\x6c\x69\x6e\x67\0\x67\x72\
-\x6f\x75\x70\x5f\x6c\x65\x61\x64\x65\x72\0\x70\x74\x72\x61\x63\x65\x64\0\x70\
-\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\x72\x79\0\x74\x68\x72\x65\x61\x64\x5f\x70\
-\x69\x64\0\x70\x69\x64\x5f\x6c\x69\x6e\x6b\x73\0\x74\x68\x72\x65\x61\x64\x5f\
-\x67\x72\x6f\x75\x70\0\x74\x68\x72\x65\x61\x64\x5f\x6e\x6f\x64\x65\0\x76\x66\
-\x6f\x72\x6b\x5f\x64\x6f\x6e\x65\0\x73\x65\x74\x5f\x63\x68\x69\x6c\x64\x5f\x74\
-\x69\x64\0\x63\x6c\x65\x61\x72\x5f\x63\x68\x69\x6c\x64\x5f\x74\x69\x64\0\x77\
-\x6f\x72\x6b\x65\x72\x5f\x70\x72\x69\x76\x61\x74\x65\0\x75\x74\x69\x6d\x65\0\
-\x73\x74\x69\x6d\x65\0\x67\x74\x69\x6d\x65\0\x70\x72\x65\x76\x5f\x63\x70\x75\
-\x74\x69\x6d\x65\0\x6e\x76\x63\x73\x77\0\x6e\x69\x76\x63\x73\x77\0\x73\x74\x61\
-\x72\x74\x5f\x74\x69\x6d\x65\0\x73\x74\x61\x72\x74\x5f\x62\x6f\x6f\x74\x74\x69\
-\x6d\x65\0\x6d\x69\x6e\x5f\x66\x6c\x74\0\x6d\x61\x6a\x5f\x66\x6c\x74\0\x70\x6f\
-\x73\x69\x78\x5f\x63\x70\x75\x74\x69\x6d\x65\x72\x73\0\x70\x6f\x73\x69\x78\x5f\
-\x63\x70\x75\x74\x69\x6d\x65\x72\x73\x5f\x77\x6f\x72\x6b\0\x70\x74\x72\x61\x63\
-\x65\x72\x5f\x63\x72\x65\x64\0\x72\x65\x61\x6c\x5f\x63\x72\x65\x64\0\x63\x72\
-\x65\x64\0\x63\x61\x63\x68\x65\x64\x5f\x72\x65\x71\x75\x65\x73\x74\x65\x64\x5f\
-\x6b\x65\x79\0\x63\x6f\x6d\x6d\0\x6e\x61\x6d\x65\x69\x64\x61\x74\x61\0\x73\x79\
-\x73\x76\x73\x65\x6d\0\x73\x79\x73\x76\x73\x68\x6d\0\x6c\x61\x73\x74\x5f\x73\
-\x77\x69\x74\x63\x68\x5f\x63\x6f\x75\x6e\x74\0\x6c\x61\x73\x74\x5f\x73\x77\x69\
-\x74\x63\x68\x5f\x74\x69\x6d\x65\0\x66\x73\0\x66\x69\x6c\x65\x73\0\x69\x6f\x5f\
-\x75\x72\x69\x6e\x67\0\x6e\x73\x70\x72\x6f\x78\x79\0\x73\x69\x67\x6e\x61\x6c\0\
-\x73\x69\x67\x68\x61\x6e\x64\0\x62\x6c\x6f\x63\x6b\x65\x64\0\x72\x65\x61\x6c\
-\x5f\x62\x6c\x6f\x63\x6b\x65\x64\0\x73\x61\x76\x65\x64\x5f\x73\x69\x67\x6d\x61\
-\x73\x6b\0\x70\x65\x6e\x64\x69\x6e\x67\0\x73\x61\x73\x5f\x73\x73\x5f\x73\x70\0\
-\x73\x61\x73\x5f\x73\x73\x5f\x73\x69\x7a\x65\0\x73\x61\x73\x5f\x73\x73\x5f\x66\
-\x6c\x61\x67\x73\0\x74\x61\x73\x6b\x5f\x77\x6f\x72\x6b\x73\0\x61\x75\x64\x69\
-\x74\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x6c\x6f\x67\x69\x6e\x75\x69\x64\0\x73\
-\x65\x73\x73\x69\x6f\x6e\x69\x64\0\x73\x65\x63\x63\x6f\x6d\x70\0\x73\x79\x73\
-\x63\x61\x6c\x6c\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\x70\x61\x72\x65\x6e\x74\
-\x5f\x65\x78\x65\x63\x5f\x69\x64\0\x73\x65\x6c\x66\x5f\x65\x78\x65\x63\x5f\x69\
-\x64\0\x61\x6c\x6c\x6f\x63\x5f\x6c\x6f\x63\x6b\0\x70\x69\x5f\x6c\x6f\x63\x6b\0\
-\x77\x61\x6b\x65\x5f\x71\0\x70\x69\x5f\x77\x61\x69\x74\x65\x72\x73\0\x70\x69\
-\x5f\x74\x6f\x70\x5f\x74\x61\x73\x6b\0\x70\x69\x5f\x62\x6c\x6f\x63\x6b\x65\x64\
-\x5f\x6f\x6e\0\x62\x6c\x6f\x63\x6b\x65\x64\x5f\x6f\x6e\0\x6e\x6f\x6e\x5f\x62\
-\x6c\x6f\x63\x6b\x5f\x63\x6f\x75\x6e\x74\0\x69\x72\x71\x74\x72\x61\x63\x65\0\
-\x68\x61\x72\x64\x69\x72\x71\x5f\x74\x68\x72\x65\x61\x64\x65\x64\0\x68\x61\x72\
-\x64\x69\x72\x71\x5f\x63\x68\x61\x69\x6e\x5f\x6b\x65\x79\0\x73\x6f\x66\x74\x69\
-\x72\x71\x73\x5f\x65\x6e\x61\x62\x6c\x65\x64\0\x73\x6f\x66\x74\x69\x72\x71\x5f\
-\x63\x6f\x6e\x74\x65\x78\x74\0\x69\x72\x71\x5f\x63\x6f\x6e\x66\x69\x67\0\x63\
-\x75\x72\x72\x5f\x63\x68\x61\x69\x6e\x5f\x6b\x65\x79\0\x6c\x6f\x63\x6b\x64\x65\
-\x70\x5f\x64\x65\x70\x74\x68\0\x6c\x6f\x63\x6b\x64\x65\x70\x5f\x72\x65\x63\x75\
-\x72\x73\x69\x6f\x6e\0\x68\x65\x6c\x64\x5f\x6c\x6f\x63\x6b\x73\0\x6a\x6f\x75\
-\x72\x6e\x61\x6c\x5f\x69\x6e\x66\x6f\0\x62\x69\x6f\x5f\x6c\x69\x73\x74\0\x70\
-\x6c\x75\x67\0\x72\x65\x63\x6c\x61\x69\x6d\x5f\x73\x74\x61\x74\x65\0\x62\x61\
-\x63\x6b\x69\x6e\x67\x5f\x64\x65\x76\x5f\x69\x6e\x66\x6f\0\x69\x6f\x5f\x63\x6f\
-\x6e\x74\x65\x78\x74\0\x63\x61\x70\x74\x75\x72\x65\x5f\x63\x6f\x6e\x74\x72\x6f\
-\x6c\0\x70\x74\x72\x61\x63\x65\x5f\x6d\x65\x73\x73\x61\x67\x65\0\x6c\x61\x73\
-\x74\x5f\x73\x69\x67\x69\x6e\x66\x6f\0\x69\x6f\x61\x63\0\x61\x63\x63\x74\x5f\
-\x72\x73\x73\x5f\x6d\x65\x6d\x31\0\x61\x63\x63\x74\x5f\x76\x6d\x5f\x6d\x65\x6d\
-\x31\0\x61\x63\x63\x74\x5f\x74\x69\x6d\x65\x78\x70\x64\0\x6d\x65\x6d\x73\x5f\
-\x61\x6c\x6c\x6f\x77\x65\x64\0\x6d\x65\x6d\x73\x5f\x61\x6c\x6c\x6f\x77\x65\x64\
-\x5f\x73\x65\x71\0\x63\x70\x75\x73\x65\x74\x5f\x6d\x65\x6d\x5f\x73\x70\x72\x65\
-\x61\x64\x5f\x72\x6f\x74\x6f\x72\0\x63\x70\x75\x73\x65\x74\x5f\x73\x6c\x61\x62\
-\x5f\x73\x70\x72\x65\x61\x64\x5f\x72\x6f\x74\x6f\x72\0\x63\x67\x72\x6f\x75\x70\
-\x73\0\x63\x67\x5f\x6c\x69\x73\x74\0\x72\x6f\x62\x75\x73\x74\x5f\x6c\x69\x73\
-\x74\0\x70\x69\x5f\x73\x74\x61\x74\x65\x5f\x6c\x69\x73\x74\0\x70\x69\x5f\x73\
-\x74\x61\x74\x65\x5f\x63\x61\x63\x68\x65\0\x66\x75\x74\x65\x78\x5f\x65\x78\x69\
-\x74\x5f\x6d\x75\x74\x65\x78\0\x66\x75\x74\x65\x78\x5f\x73\x74\x61\x74\x65\0\
-\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x63\x74\x78\x70\0\x70\x65\x72\x66\
-\x5f\x65\x76\x65\x6e\x74\x5f\x6d\x75\x74\x65\x78\0\x70\x65\x72\x66\x5f\x65\x76\
-\x65\x6e\x74\x5f\x6c\x69\x73\x74\0\x70\x72\x65\x65\x6d\x70\x74\x5f\x64\x69\x73\
-\x61\x62\x6c\x65\x5f\x69\x70\0\x6d\x65\x6d\x70\x6f\x6c\x69\x63\x79\0\x69\x6c\
-\x5f\x70\x72\x65\x76\0\x70\x72\x65\x66\x5f\x6e\x6f\x64\x65\x5f\x66\x6f\x72\x6b\
-\0\x6e\x75\x6d\x61\x5f\x73\x63\x61\x6e\x5f\x73\x65\x71\0\x6e\x75\x6d\x61\x5f\
-\x73\x63\x61\x6e\x5f\x70\x65\x72\x69\x6f\x64\0\x6e\x75\x6d\x61\x5f\x73\x63\x61\
-\x6e\x5f\x70\x65\x72\x69\x6f\x64\x5f\x6d\x61\x78\0\x6e\x75\x6d\x61\x5f\x70\x72\
-\x65\x66\x65\x72\x72\x65\x64\x5f\x6e\x69\x64\0\x6e\x75\x6d\x61\x5f\x6d\x69\x67\
-\x72\x61\x74\x65\x5f\x72\x65\x74\x72\x79\0\x6e\x6f\x64\x65\x5f\x73\x74\x61\x6d\
-\x70\0\x6c\x61\x73\x74\x5f\x74\x61\x73\x6b\x5f\x6e\x75\x6d\x61\x5f\x70\x6c\x61\
-\x63\x65\x6d\x65\x6e\x74\0\x6c\x61\x73\x74\x5f\x73\x75\x6d\x5f\x65\x78\x65\x63\
-\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x6e\x75\x6d\x61\x5f\x77\x6f\x72\x6b\0\x6e\
-\x75\x6d\x61\x5f\x67\x72\x6f\x75\x70\0\x6e\x75\x6d\x61\x5f\x66\x61\x75\x6c\x74\
-\x73\0\x74\x6f\x74\x61\x6c\x5f\x6e\x75\x6d\x61\x5f\x66\x61\x75\x6c\x74\x73\0\
-\x6e\x75\x6d\x61\x5f\x66\x61\x75\x6c\x74\x73\x5f\x6c\x6f\x63\x61\x6c\x69\x74\
-\x79\0\x6e\x75\x6d\x61\x5f\x70\x61\x67\x65\x73\x5f\x6d\x69\x67\x72\x61\x74\x65\
-\x64\0\x72\x73\x65\x71\0\x72\x73\x65\x71\x5f\x73\x69\x67\0\x72\x73\x65\x71\x5f\
-\x65\x76\x65\x6e\x74\x5f\x6d\x61\x73\x6b\0\x74\x6c\x62\x5f\x75\x62\x63\0\x73\
-\x70\x6c\x69\x63\x65\x5f\x70\x69\x70\x65\0\x74\x61\x73\x6b\x5f\x66\x72\x61\x67\
-\0\x64\x65\x6c\x61\x79\x73\0\x6d\x61\x6b\x65\x5f\x69\x74\x5f\x66\x61\x69\x6c\0\
-\x66\x61\x69\x6c\x5f\x6e\x74\x68\0\x6e\x72\x5f\x64\x69\x72\x74\x69\x65\x64\0\
-\x6e\x72\x5f\x64\x69\x72\x74\x69\x65\x64\x5f\x70\x61\x75\x73\x65\0\x64\x69\x72\
-\x74\x79\x5f\x70\x61\x75\x73\x65\x64\x5f\x77\x68\x65\x6e\0\x74\x69\x6d\x65\x72\
-\x5f\x73\x6c\x61\x63\x6b\x5f\x6e\x73\0\x64\x65\x66\x61\x75\x6c\x74\x5f\x74\x69\
-\x6d\x65\x72\x5f\x73\x6c\x61\x63\x6b\x5f\x6e\x73\0\x63\x75\x72\x72\x5f\x72\x65\
-\x74\x5f\x73\x74\x61\x63\x6b\0\x63\x75\x72\x72\x5f\x72\x65\x74\x5f\x64\x65\x70\
-\x74\x68\0\x72\x65\x74\x5f\x73\x74\x61\x63\x6b\0\x66\x74\x72\x61\x63\x65\x5f\
-\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\0\x74\x72\x61\x63\x65\x5f\x6f\x76\x65\x72\
-\x72\x75\x6e\0\x74\x72\x61\x63\x69\x6e\x67\x5f\x67\x72\x61\x70\x68\x5f\x70\x61\
-\x75\x73\x65\0\x74\x72\x61\x63\x65\x5f\x72\x65\x63\x75\x72\x73\x69\x6f\x6e\0\
-\x6d\x65\x6d\x63\x67\x5f\x69\x6e\x5f\x6f\x6f\x6d\0\x6d\x65\x6d\x63\x67\x5f\x6f\
-\x6f\x6d\x5f\x67\x66\x70\x5f\x6d\x61\x73\x6b\0\x6d\x65\x6d\x63\x67\x5f\x6f\x6f\
-\x6d\x5f\x6f\x72\x64\x65\x72\0\x6d\x65\x6d\x63\x67\x5f\x6e\x72\x5f\x70\x61\x67\
-\x65\x73\x5f\x6f\x76\x65\x72\x5f\x68\x69\x67\x68\0\x61\x63\x74\x69\x76\x65\x5f\
-\x6d\x65\x6d\x63\x67\0\x74\x68\x72\x6f\x74\x74\x6c\x65\x5f\x71\x75\x65\x75\x65\
-\0\x75\x74\x61\x73\x6b\0\x6b\x6d\x61\x70\x5f\x63\x74\x72\x6c\0\x74\x61\x73\x6b\
-\x5f\x73\x74\x61\x74\x65\x5f\x63\x68\x61\x6e\x67\x65\0\x70\x61\x67\x65\x66\x61\
-\x75\x6c\x74\x5f\x64\x69\x73\x61\x62\x6c\x65\x64\0\x6f\x6f\x6d\x5f\x72\x65\x61\
-\x70\x65\x72\x5f\x6c\x69\x73\x74\0\x6f\x6f\x6d\x5f\x72\x65\x61\x70\x65\x72\x5f\
-\x74\x69\x6d\x65\x72\0\x73\x74\x61\x63\x6b\x5f\x76\x6d\x5f\x61\x72\x65\x61\0\
-\x73\x74\x61\x63\x6b\x5f\x72\x65\x66\x63\x6f\x75\x6e\x74\0\x73\x65\x63\x75\x72\
-\x69\x74\x79\0\x62\x70\x66\x5f\x73\x74\x6f\x72\x61\x67\x65\0\x62\x70\x66\x5f\
-\x63\x74\x78\0\x6d\x63\x65\x5f\x76\x61\x64\x64\x72\0\x6d\x63\x65\x5f\x6b\x66\
-\x6c\x61\x67\x73\0\x6d\x63\x65\x5f\x61\x64\x64\x72\0\x6d\x63\x65\x5f\x72\x69\
-\x70\x76\0\x6d\x63\x65\x5f\x77\x68\x6f\x6c\x65\x5f\x70\x61\x67\x65\0\x5f\x5f\
-\x6d\x63\x65\x5f\x72\x65\x73\x65\x72\x76\x65\x64\0\x6d\x63\x65\x5f\x6b\x69\x6c\
-\x6c\x5f\x6d\x65\0\x6d\x63\x65\x5f\x63\x6f\x75\x6e\x74\0\x6b\x72\x65\x74\x70\
-\x72\x6f\x62\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\0\x72\x65\x74\x68\x6f\
-\x6f\x6b\x73\0\x6c\x31\x64\x5f\x66\x6c\x75\x73\x68\x5f\x6b\x69\x6c\x6c\0\x74\
-\x68\x72\x65\x61\x64\0\x73\x79\x73\x63\x61\x6c\x6c\x5f\x77\x6f\x72\x6b\0\x73\
-\x74\x61\x74\x75\x73\0\x63\x70\x75\0\x75\x33\x32\0\x5f\x5f\x75\x33\x32\0\x72\
-\x65\x66\x63\x6f\x75\x6e\x74\x5f\x74\0\x72\x65\x66\x63\x6f\x75\x6e\x74\x5f\x73\
-\x74\x72\x75\x63\x74\0\x72\x65\x66\x73\0\x61\x74\x6f\x6d\x69\x63\x5f\x74\0\x63\
-\x6f\x75\x6e\x74\x65\x72\0\x5f\x5f\x63\x61\x6c\x6c\x5f\x73\x69\x6e\x67\x6c\x65\
-\x5f\x6e\x6f\x64\x65\0\x6c\x6c\x69\x73\x74\0\x73\x72\x63\0\x64\x73\x74\0\x6c\
-\x6c\x69\x73\x74\x5f\x6e\x6f\x64\x65\0\x6e\x65\x78\x74\0\x75\x5f\x66\x6c\x61\
-\x67\x73\0\x61\x5f\x66\x6c\x61\x67\x73\0\x75\x31\x36\0\x5f\x5f\x75\x31\x36\0\
-\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\x68\x6f\x72\x74\0\x73\x63\x68\x65\x64\
-\x5f\x65\x6e\x74\x69\x74\x79\0\x6c\x6f\x61\x64\0\x72\x75\x6e\x5f\x6e\x6f\x64\
-\x65\0\x67\x72\x6f\x75\x70\x5f\x6e\x6f\x64\x65\0\x65\x78\x65\x63\x5f\x73\x74\
-\x61\x72\x74\0\x73\x75\x6d\x5f\x65\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\
-\0\x76\x72\x75\x6e\x74\x69\x6d\x65\0\x70\x72\x65\x76\x5f\x73\x75\x6d\x5f\x65\
-\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x6e\x72\x5f\x6d\x69\x67\x72\x61\
-\x74\x69\x6f\x6e\x73\0\x64\x65\x70\x74\x68\0\x63\x66\x73\x5f\x72\x71\0\x6d\x79\
-\x5f\x71\0\x72\x75\x6e\x6e\x61\x62\x6c\x65\x5f\x77\x65\x69\x67\x68\x74\0\x61\
-\x76\x67\0\x6c\x6f\x61\x64\x5f\x77\x65\x69\x67\x68\x74\0\x77\x65\x69\x67\x68\
-\x74\0\x69\x6e\x76\x5f\x77\x65\x69\x67\x68\x74\0\x72\x62\x5f\x6e\x6f\x64\x65\0\
-\x5f\x5f\x72\x62\x5f\x70\x61\x72\x65\x6e\x74\x5f\x63\x6f\x6c\x6f\x72\0\x72\x62\
-\x5f\x72\x69\x67\x68\x74\0\x72\x62\x5f\x6c\x65\x66\x74\0\x6c\x69\x73\x74\x5f\
-\x68\x65\x61\x64\0\x70\x72\x65\x76\0\x75\x36\x34\0\x5f\x5f\x75\x36\x34\0\x75\
-\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x73\x63\
-\x68\x65\x64\x5f\x61\x76\x67\0\x6c\x61\x73\x74\x5f\x75\x70\x64\x61\x74\x65\x5f\
-\x74\x69\x6d\x65\0\x6c\x6f\x61\x64\x5f\x73\x75\x6d\0\x72\x75\x6e\x6e\x61\x62\
-\x6c\x65\x5f\x73\x75\x6d\0\x75\x74\x69\x6c\x5f\x73\x75\x6d\0\x70\x65\x72\x69\
-\x6f\x64\x5f\x63\x6f\x6e\x74\x72\x69\x62\0\x6c\x6f\x61\x64\x5f\x61\x76\x67\0\
-\x72\x75\x6e\x6e\x61\x62\x6c\x65\x5f\x61\x76\x67\0\x75\x74\x69\x6c\x5f\x61\x76\
-\x67\0\x75\x74\x69\x6c\x5f\x65\x73\x74\0\x65\x6e\x71\x75\x65\x75\x65\x64\0\x65\
-\x77\x6d\x61\0\x73\x63\x68\x65\x64\x5f\x72\x74\x5f\x65\x6e\x74\x69\x74\x79\0\
-\x72\x75\x6e\x5f\x6c\x69\x73\x74\0\x74\x69\x6d\x65\x6f\x75\x74\0\x77\x61\x74\
-\x63\x68\x64\x6f\x67\x5f\x73\x74\x61\x6d\x70\0\x74\x69\x6d\x65\x5f\x73\x6c\x69\
-\x63\x65\0\x6f\x6e\x5f\x6c\x69\x73\x74\0\x62\x61\x63\x6b\0\x73\x63\x68\x65\x64\
-\x5f\x64\x6c\x5f\x65\x6e\x74\x69\x74\x79\0\x64\x6c\x5f\x72\x75\x6e\x74\x69\x6d\
-\x65\0\x64\x6c\x5f\x64\x65\x61\x64\x6c\x69\x6e\x65\0\x64\x6c\x5f\x70\x65\x72\
-\x69\x6f\x64\0\x64\x6c\x5f\x62\x77\0\x64\x6c\x5f\x64\x65\x6e\x73\x69\x74\x79\0\
-\x72\x75\x6e\x74\x69\x6d\x65\0\x64\x65\x61\x64\x6c\x69\x6e\x65\0\x64\x6c\x5f\
-\x74\x68\x72\x6f\x74\x74\x6c\x65\x64\0\x64\x6c\x5f\x79\x69\x65\x6c\x64\x65\x64\
-\0\x64\x6c\x5f\x6e\x6f\x6e\x5f\x63\x6f\x6e\x74\x65\x6e\x64\x69\x6e\x67\0\x64\
-\x6c\x5f\x6f\x76\x65\x72\x72\x75\x6e\0\x64\x6c\x5f\x74\x69\x6d\x65\x72\0\x69\
-\x6e\x61\x63\x74\x69\x76\x65\x5f\x74\x69\x6d\x65\x72\0\x70\x69\x5f\x73\x65\0\
-\x73\x36\x34\0\x5f\x5f\x73\x36\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x68\
-\x72\x74\x69\x6d\x65\x72\0\x6e\x6f\x64\x65\0\x5f\x73\x6f\x66\x74\x65\x78\x70\
-\x69\x72\x65\x73\0\x66\x75\x6e\x63\x74\x69\x6f\x6e\0\x62\x61\x73\x65\0\x73\x74\
-\x61\x74\x65\0\x69\x73\x5f\x72\x65\x6c\0\x69\x73\x5f\x73\x6f\x66\x74\0\x69\x73\
-\x5f\x68\x61\x72\x64\0\x74\x69\x6d\x65\x72\x71\x75\x65\x75\x65\x5f\x6e\x6f\x64\
-\x65\0\x65\x78\x70\x69\x72\x65\x73\0\x6b\x74\x69\x6d\x65\x5f\x74\0\x68\x72\x74\
-\x69\x6d\x65\x72\x5f\x72\x65\x73\x74\x61\x72\x74\0\x48\x52\x54\x49\x4d\x45\x52\
-\x5f\x4e\x4f\x52\x45\x53\x54\x41\x52\x54\0\x48\x52\x54\x49\x4d\x45\x52\x5f\x52\
-\x45\x53\x54\x41\x52\x54\0\x75\x38\0\x5f\x5f\x75\x38\0\x75\x6e\x73\x69\x67\x6e\
-\x65\x64\x20\x63\x68\x61\x72\0\x73\x63\x68\x65\x64\x5f\x73\x74\x61\x74\x69\x73\
-\x74\x69\x63\x73\0\x77\x61\x69\x74\x5f\x73\x74\x61\x72\x74\0\x77\x61\x69\x74\
-\x5f\x6d\x61\x78\0\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\0\x77\x61\x69\x74\
-\x5f\x73\x75\x6d\0\x69\x6f\x77\x61\x69\x74\x5f\x63\x6f\x75\x6e\x74\0\x69\x6f\
-\x77\x61\x69\x74\x5f\x73\x75\x6d\0\x73\x6c\x65\x65\x70\x5f\x73\x74\x61\x72\x74\
-\0\x73\x6c\x65\x65\x70\x5f\x6d\x61\x78\0\x73\x75\x6d\x5f\x73\x6c\x65\x65\x70\
-\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x62\x6c\x6f\x63\x6b\x5f\x73\x74\x61\x72\x74\
-\0\x62\x6c\x6f\x63\x6b\x5f\x6d\x61\x78\0\x73\x75\x6d\x5f\x62\x6c\x6f\x63\x6b\
-\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x65\x78\x65\x63\x5f\x6d\x61\x78\0\x73\x6c\
-\x69\x63\x65\x5f\x6d\x61\x78\0\x6e\x72\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\
-\x73\x5f\x63\x6f\x6c\x64\0\x6e\x72\x5f\x66\x61\x69\x6c\x65\x64\x5f\x6d\x69\x67\
-\x72\x61\x74\x69\x6f\x6e\x73\x5f\x61\x66\x66\x69\x6e\x65\0\x6e\x72\x5f\x66\x61\
-\x69\x6c\x65\x64\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\x5f\x72\x75\x6e\
-\x6e\x69\x6e\x67\0\x6e\x72\x5f\x66\x61\x69\x6c\x65\x64\x5f\x6d\x69\x67\x72\x61\
-\x74\x69\x6f\x6e\x73\x5f\x68\x6f\x74\0\x6e\x72\x5f\x66\x6f\x72\x63\x65\x64\x5f\
-\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\
-\x73\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x73\x79\x6e\x63\0\x6e\x72\
-\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x6d\x69\x67\x72\x61\x74\x65\0\x6e\x72\x5f\
-\x77\x61\x6b\x65\x75\x70\x73\x5f\x6c\x6f\x63\x61\x6c\0\x6e\x72\x5f\x77\x61\x6b\
-\x65\x75\x70\x73\x5f\x72\x65\x6d\x6f\x74\x65\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\
-\x70\x73\x5f\x61\x66\x66\x69\x6e\x65\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\
-\x5f\x61\x66\x66\x69\x6e\x65\x5f\x61\x74\x74\x65\x6d\x70\x74\x73\0\x6e\x72\x5f\
-\x77\x61\x6b\x65\x75\x70\x73\x5f\x70\x61\x73\x73\x69\x76\x65\0\x6e\x72\x5f\x77\
-\x61\x6b\x65\x75\x70\x73\x5f\x69\x64\x6c\x65\0\x63\x70\x75\x6d\x61\x73\x6b\x5f\
-\x74\0\x63\x70\x75\x6d\x61\x73\x6b\0\x72\x63\x75\x5f\x73\x70\x65\x63\x69\x61\
-\x6c\0\x62\0\x73\0\x6e\x65\x65\x64\x5f\x71\x73\0\x65\x78\x70\x5f\x68\x69\x6e\
-\x74\0\x6e\x65\x65\x64\x5f\x6d\x62\0\x70\x63\x6f\x75\x6e\x74\0\x72\x75\x6e\x5f\
-\x64\x65\x6c\x61\x79\0\x6c\x61\x73\x74\x5f\x61\x72\x72\x69\x76\x61\x6c\0\x6c\
-\x61\x73\x74\x5f\x71\x75\x65\x75\x65\x64\0\x70\x6c\x69\x73\x74\x5f\x6e\x6f\x64\
-\x65\0\x70\x72\x69\x6f\x5f\x6c\x69\x73\x74\0\x6e\x6f\x64\x65\x5f\x6c\x69\x73\
-\x74\0\x74\x61\x73\x6b\x5f\x72\x73\x73\x5f\x73\x74\x61\x74\0\x65\x76\x65\x6e\
-\x74\x73\0\x63\x6f\x75\x6e\x74\0\x61\x72\x63\x68\x5f\x64\x61\x74\x61\0\x66\x6e\
-\0\x66\x75\x74\x65\x78\0\x6e\x61\x6e\x6f\x73\x6c\x65\x65\x70\0\x70\x6f\x6c\x6c\
-\0\x75\x61\x64\x64\x72\0\x76\x61\x6c\0\x62\x69\x74\x73\x65\x74\0\x74\x69\x6d\
-\x65\0\x75\x61\x64\x64\x72\x32\0\x63\x6c\x6f\x63\x6b\x69\x64\0\x63\x6c\x6f\x63\
-\x6b\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x63\x6c\x6f\x63\x6b\
-\x69\x64\x5f\x74\0\x74\x69\x6d\x65\x73\x70\x65\x63\x5f\x74\x79\x70\x65\0\x54\
-\x54\x5f\x4e\x4f\x4e\x45\0\x54\x54\x5f\x4e\x41\x54\x49\x56\x45\0\x54\x54\x5f\
-\x43\x4f\x4d\x50\x41\x54\0\x72\x6d\x74\x70\0\x63\x6f\x6d\x70\x61\x74\x5f\x72\
-\x6d\x74\x70\0\x75\x66\x64\x73\0\x6e\x66\x64\x73\0\x68\x61\x73\x5f\x74\x69\x6d\
-\x65\x6f\x75\x74\0\x74\x76\x5f\x73\x65\x63\0\x74\x76\x5f\x6e\x73\x65\x63\0\x70\
-\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x70\x69\x64\x5f\x74\0\
-\x68\x6c\x69\x73\x74\x5f\x6e\x6f\x64\x65\0\x70\x70\x72\x65\x76\0\x6c\x6f\x63\
-\x6b\0\x72\x61\x77\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\0\x72\x61\x77\
-\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x72\x61\x77\x5f\x6c\x6f\x63\x6b\0\x6d\
-\x61\x67\x69\x63\0\x6f\x77\x6e\x65\x72\x5f\x63\x70\x75\0\x6f\x77\x6e\x65\x72\0\
-\x64\x65\x70\x5f\x6d\x61\x70\0\x61\x72\x63\x68\x5f\x73\x70\x69\x6e\x6c\x6f\x63\
-\x6b\x5f\x74\0\x71\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x6c\x6f\x63\x6b\x65\x64\0\
-\x6c\x6f\x63\x6b\x65\x64\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x74\x61\x69\x6c\0\
-\x6c\x6f\x63\x6b\x64\x65\x70\x5f\x6d\x61\x70\0\x6b\x65\x79\0\x63\x6c\x61\x73\
-\x73\x5f\x63\x61\x63\x68\x65\0\x6e\x61\x6d\x65\0\x77\x61\x69\x74\x5f\x74\x79\
-\x70\x65\x5f\x6f\x75\x74\x65\x72\0\x77\x61\x69\x74\x5f\x74\x79\x70\x65\x5f\x69\
-\x6e\x6e\x65\x72\0\x6c\x6f\x63\x6b\x5f\x74\x79\x70\x65\0\x6c\x6f\x63\x6b\x5f\
-\x63\x6c\x61\x73\x73\0\x68\x61\x73\x68\x5f\x65\x6e\x74\x72\x79\0\x6c\x6f\x63\
-\x6b\x5f\x65\x6e\x74\x72\x79\0\x6c\x6f\x63\x6b\x73\x5f\x61\x66\x74\x65\x72\0\
-\x6c\x6f\x63\x6b\x73\x5f\x62\x65\x66\x6f\x72\x65\0\x73\x75\x62\x63\x6c\x61\x73\
-\x73\0\x64\x65\x70\x5f\x67\x65\x6e\x5f\x69\x64\0\x75\x73\x61\x67\x65\x5f\x6d\
-\x61\x73\x6b\0\x75\x73\x61\x67\x65\x5f\x74\x72\x61\x63\x65\x73\0\x6e\x61\x6d\
-\x65\x5f\x76\x65\x72\x73\x69\x6f\x6e\0\x6c\x6f\x63\x6b\x5f\x74\x72\x61\x63\x65\
-\0\x68\x61\x73\x68\0\x6e\x72\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x65\x6e\x74\x72\
-\x69\x65\x73\0\x63\x68\x61\x72\0\x62\x61\x73\x65\x73\0\x74\x69\x6d\x65\x72\x73\
-\x5f\x61\x63\x74\x69\x76\x65\0\x65\x78\x70\x69\x72\x79\x5f\x61\x63\x74\x69\x76\
-\x65\0\x70\x6f\x73\x69\x78\x5f\x63\x70\x75\x74\x69\x6d\x65\x72\x5f\x62\x61\x73\
-\x65\0\x6e\x65\x78\x74\x65\x76\x74\0\x74\x71\x68\x65\x61\x64\0\x74\x69\x6d\x65\
-\x72\x71\x75\x65\x75\x65\x5f\x68\x65\x61\x64\0\x72\x62\x5f\x72\x6f\x6f\x74\0\
-\x72\x62\x5f\x72\x6f\x6f\x74\x5f\x63\x61\x63\x68\x65\x64\0\x72\x62\x5f\x6c\x65\
-\x66\x74\x6d\x6f\x73\x74\0\x77\x6f\x72\x6b\0\x73\x63\x68\x65\x64\x75\x6c\x65\
-\x64\0\x63\x61\x6c\x6c\x62\x61\x63\x6b\x5f\x68\x65\x61\x64\0\x66\x75\x6e\x63\0\
-\x73\x79\x73\x76\x5f\x73\x65\x6d\0\x75\x6e\x64\x6f\x5f\x6c\x69\x73\x74\0\x73\
-\x79\x73\x76\x5f\x73\x68\x6d\0\x73\x68\x6d\x5f\x63\x6c\x69\x73\x74\0\x73\x69\
-\x67\x73\x65\x74\x5f\x74\0\x73\x69\x67\0\x73\x69\x67\x70\x65\x6e\x64\x69\x6e\
-\x67\0\x6c\x69\x73\x74\0\x73\x69\x7a\x65\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\
-\x6c\x5f\x73\x69\x7a\x65\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x75\x6c\
-\x6f\x6e\x67\x5f\x74\0\x6b\x75\x69\x64\x5f\x74\0\x75\x69\x64\x5f\x74\0\x5f\x5f\
-\x6b\x65\x72\x6e\x65\x6c\x5f\x75\x69\x64\x33\x32\x5f\x74\0\x6d\x6f\x64\x65\0\
-\x66\x69\x6c\x74\x65\x72\x5f\x63\x6f\x75\x6e\x74\0\x66\x69\x6c\x74\x65\x72\0\
-\x73\x79\x73\x63\x61\x6c\x6c\x5f\x75\x73\x65\x72\x5f\x64\x69\x73\x70\x61\x74\
-\x63\x68\0\x73\x65\x6c\x65\x63\x74\x6f\x72\0\x6f\x66\x66\x73\x65\x74\0\x6c\x65\
-\x6e\0\x6f\x6e\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\x62\x6f\x6f\x6c\0\x5f\x42\
-\x6f\x6f\x6c\0\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\0\x73\x70\x69\x6e\x6c\
-\x6f\x63\x6b\0\x72\x6c\x6f\x63\x6b\0\x5f\x5f\x70\x61\x64\x64\x69\x6e\x67\0\x77\
-\x61\x6b\x65\x5f\x71\x5f\x6e\x6f\x64\x65\0\x69\x72\x71\x74\x72\x61\x63\x65\x5f\
-\x65\x76\x65\x6e\x74\x73\0\x69\x72\x71\x5f\x65\x76\x65\x6e\x74\x73\0\x68\x61\
-\x72\x64\x69\x72\x71\x5f\x65\x6e\x61\x62\x6c\x65\x5f\x69\x70\0\x68\x61\x72\x64\
-\x69\x72\x71\x5f\x64\x69\x73\x61\x62\x6c\x65\x5f\x69\x70\0\x68\x61\x72\x64\x69\
-\x72\x71\x5f\x65\x6e\x61\x62\x6c\x65\x5f\x65\x76\x65\x6e\x74\0\x68\x61\x72\x64\
-\x69\x72\x71\x5f\x64\x69\x73\x61\x62\x6c\x65\x5f\x65\x76\x65\x6e\x74\0\x73\x6f\
-\x66\x74\x69\x72\x71\x5f\x64\x69\x73\x61\x62\x6c\x65\x5f\x69\x70\0\x73\x6f\x66\
-\x74\x69\x72\x71\x5f\x65\x6e\x61\x62\x6c\x65\x5f\x69\x70\0\x73\x6f\x66\x74\x69\
-\x72\x71\x5f\x64\x69\x73\x61\x62\x6c\x65\x5f\x65\x76\x65\x6e\x74\0\x73\x6f\x66\
-\x74\x69\x72\x71\x5f\x65\x6e\x61\x62\x6c\x65\x5f\x65\x76\x65\x6e\x74\0\x68\x65\
-\x6c\x64\x5f\x6c\x6f\x63\x6b\0\x70\x72\x65\x76\x5f\x63\x68\x61\x69\x6e\x5f\x6b\
-\x65\x79\0\x61\x63\x71\x75\x69\x72\x65\x5f\x69\x70\0\x69\x6e\x73\x74\x61\x6e\
-\x63\x65\0\x6e\x65\x73\x74\x5f\x6c\x6f\x63\x6b\0\x63\x6c\x61\x73\x73\x5f\x69\
-\x64\x78\0\x69\x72\x71\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x74\x72\x79\x6c\x6f\
-\x63\x6b\0\x72\x65\x61\x64\0\x63\x68\x65\x63\x6b\0\x68\x61\x72\x64\x69\x72\x71\
-\x73\x5f\x6f\x66\x66\0\x72\x65\x66\x65\x72\x65\x6e\x63\x65\x73\0\x70\x69\x6e\
-\x5f\x63\x6f\x75\x6e\x74\0\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x69\x67\x69\x6e\x66\
-\x6f\x5f\x74\0\x74\x61\x73\x6b\x5f\x69\x6f\x5f\x61\x63\x63\x6f\x75\x6e\x74\x69\
-\x6e\x67\0\x72\x63\x68\x61\x72\0\x77\x63\x68\x61\x72\0\x73\x79\x73\x63\x72\0\
-\x73\x79\x73\x63\x77\0\x72\x65\x61\x64\x5f\x62\x79\x74\x65\x73\0\x77\x72\x69\
-\x74\x65\x5f\x62\x79\x74\x65\x73\0\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x5f\x77\
-\x72\x69\x74\x65\x5f\x62\x79\x74\x65\x73\0\x73\x65\x71\x63\x6f\x75\x6e\x74\x5f\
-\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\0\x73\x65\x71\x63\x6f\x75\x6e\x74\x5f\
-\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x73\x65\x71\x63\x6f\x75\x6e\x74\0\x73\x65\
-\x71\x63\x6f\x75\x6e\x74\x5f\x74\0\x73\x65\x71\x75\x65\x6e\x63\x65\0\x6d\x75\
-\x74\x65\x78\0\x77\x61\x69\x74\x5f\x6c\x6f\x63\x6b\0\x6f\x73\x71\0\x77\x61\x69\
-\x74\x5f\x6c\x69\x73\x74\0\x61\x74\x6f\x6d\x69\x63\x5f\x6c\x6f\x6e\x67\x5f\x74\
-\0\x61\x74\x6f\x6d\x69\x63\x36\x34\x5f\x74\0\x6f\x70\x74\x69\x6d\x69\x73\x74\
-\x69\x63\x5f\x73\x70\x69\x6e\x5f\x71\x75\x65\x75\x65\0\x70\x65\x72\x66\x5f\x65\
-\x76\x65\x6e\x74\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x70\x6d\x75\0\x61\x63\x74\
-\x69\x76\x65\x5f\x63\x74\x78\x5f\x6c\x69\x73\x74\0\x70\x69\x6e\x6e\x65\x64\x5f\
-\x67\x72\x6f\x75\x70\x73\0\x66\x6c\x65\x78\x69\x62\x6c\x65\x5f\x67\x72\x6f\x75\
-\x70\x73\0\x65\x76\x65\x6e\x74\x5f\x6c\x69\x73\x74\0\x70\x69\x6e\x6e\x65\x64\
-\x5f\x61\x63\x74\x69\x76\x65\0\x66\x6c\x65\x78\x69\x62\x6c\x65\x5f\x61\x63\x74\
-\x69\x76\x65\0\x6e\x72\x5f\x65\x76\x65\x6e\x74\x73\0\x6e\x72\x5f\x61\x63\x74\
-\x69\x76\x65\0\x6e\x72\x5f\x75\x73\x65\x72\0\x69\x73\x5f\x61\x63\x74\x69\x76\
-\x65\0\x6e\x72\x5f\x73\x74\x61\x74\0\x6e\x72\x5f\x66\x72\x65\x71\0\x72\x6f\x74\
-\x61\x74\x65\x5f\x64\x69\x73\x61\x62\x6c\x65\0\x72\x6f\x74\x61\x74\x65\x5f\x6e\
-\x65\x63\x65\x73\x73\x61\x72\x79\0\x72\x65\x66\x63\x6f\x75\x6e\x74\0\x74\x61\
-\x73\x6b\0\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\0\x74\x69\x6d\x65\x6f\x66\x66\
-\x73\x65\x74\0\x70\x61\x72\x65\x6e\x74\x5f\x63\x74\x78\0\x70\x61\x72\x65\x6e\
-\x74\x5f\x67\x65\x6e\0\x67\x65\x6e\x65\x72\x61\x74\x69\x6f\x6e\0\x6e\x72\x5f\
-\x63\x67\x72\x6f\x75\x70\x73\0\x74\x61\x73\x6b\x5f\x63\x74\x78\x5f\x64\x61\x74\
-\x61\0\x6e\x72\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x70\x65\x72\x66\x5f\x65\x76\
-\x65\x6e\x74\x5f\x67\x72\x6f\x75\x70\x73\0\x74\x72\x65\x65\0\x69\x6e\x64\x65\
-\x78\0\x6c\x6f\x63\x61\x6c\x5f\x74\0\x61\0\x73\x68\x6f\x72\x74\0\x74\x6c\x62\
-\x66\x6c\x75\x73\x68\x5f\x75\x6e\x6d\x61\x70\x5f\x62\x61\x74\x63\x68\0\x61\x72\
-\x63\x68\0\x66\x6c\x75\x73\x68\x5f\x72\x65\x71\x75\x69\x72\x65\x64\0\x77\x72\
-\x69\x74\x61\x62\x6c\x65\0\x61\x72\x63\x68\x5f\x74\x6c\x62\x66\x6c\x75\x73\x68\
-\x5f\x75\x6e\x6d\x61\x70\x5f\x62\x61\x74\x63\x68\0\x72\x63\x75\x5f\x75\x73\x65\
-\x72\x73\0\x72\x63\x75\0\x70\x61\x67\x65\x5f\x66\x72\x61\x67\0\x70\x61\x67\x65\
-\0\x73\x69\x7a\x65\0\x74\x69\x6d\x65\x72\x5f\x6c\x69\x73\x74\0\x65\x6e\x74\x72\
-\x79\0\x6c\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\x66\x69\x72\x73\x74\0\x74\x68\
-\x72\x65\x61\x64\x5f\x73\x74\x72\x75\x63\x74\0\x74\x6c\x73\x5f\x61\x72\x72\x61\
-\x79\0\x65\x73\0\x64\x73\0\x66\x73\x69\x6e\x64\x65\x78\0\x67\x73\x69\x6e\x64\
-\x65\x78\0\x66\x73\x62\x61\x73\x65\0\x67\x73\x62\x61\x73\x65\0\x70\x74\x72\x61\
-\x63\x65\x5f\x62\x70\x73\0\x76\x69\x72\x74\x75\x61\x6c\x5f\x64\x72\x36\0\x70\
-\x74\x72\x61\x63\x65\x5f\x64\x72\x37\0\x63\x72\x32\0\x74\x72\x61\x70\x5f\x6e\
-\x72\0\x65\x72\x72\x6f\x72\x5f\x63\x6f\x64\x65\0\x69\x6f\x5f\x62\x69\x74\x6d\
-\x61\x70\0\x69\x6f\x70\x6c\x5f\x65\x6d\x75\x6c\0\x69\x6f\x70\x6c\x5f\x77\x61\
-\x72\x6e\0\x73\x69\x67\x5f\x6f\x6e\x5f\x75\x61\x63\x63\x65\x73\x73\x5f\x65\x72\
-\x72\0\x70\x6b\x72\x75\0\x66\x70\x75\0\x64\x65\x73\x63\x5f\x73\x74\x72\x75\x63\
-\x74\0\x6c\x69\x6d\x69\x74\x30\0\x62\x61\x73\x65\x30\0\x62\x61\x73\x65\x31\0\
-\x64\x70\x6c\0\x70\0\x6c\x69\x6d\x69\x74\x31\0\x61\x76\x6c\0\x6c\0\x64\0\x67\0\
-\x62\x61\x73\x65\x32\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x65\x76\x65\
-\x6e\x74\x5f\x65\x6e\x74\x72\x79\0\x73\x69\x62\x6c\x69\x6e\x67\x5f\x6c\x69\x73\
-\x74\0\x61\x63\x74\x69\x76\x65\x5f\x6c\x69\x73\x74\0\x67\x72\x6f\x75\x70\x5f\
-\x69\x6e\x64\x65\x78\0\x6d\x69\x67\x72\x61\x74\x65\x5f\x65\x6e\x74\x72\x79\0\
-\x68\x6c\x69\x73\x74\x5f\x65\x6e\x74\x72\x79\0\x61\x63\x74\x69\x76\x65\x5f\x65\
-\x6e\x74\x72\x79\0\x6e\x72\x5f\x73\x69\x62\x6c\x69\x6e\x67\x73\0\x65\x76\x65\
-\x6e\x74\x5f\x63\x61\x70\x73\0\x67\x72\x6f\x75\x70\x5f\x63\x61\x70\x73\0\x70\
-\x6d\x75\x5f\x70\x72\x69\x76\x61\x74\x65\0\x61\x74\x74\x61\x63\x68\x5f\x73\x74\
-\x61\x74\x65\0\x63\x68\x69\x6c\x64\x5f\x63\x6f\x75\x6e\x74\0\x74\x6f\x74\x61\
-\x6c\x5f\x74\x69\x6d\x65\x5f\x65\x6e\x61\x62\x6c\x65\x64\0\x74\x6f\x74\x61\x6c\
-\x5f\x74\x69\x6d\x65\x5f\x72\x75\x6e\x6e\x69\x6e\x67\0\x74\x73\x74\x61\x6d\x70\
-\0\x61\x74\x74\x72\0\x68\x65\x61\x64\x65\x72\x5f\x73\x69\x7a\x65\0\x69\x64\x5f\
-\x68\x65\x61\x64\x65\x72\x5f\x73\x69\x7a\x65\0\x72\x65\x61\x64\x5f\x73\x69\x7a\
-\x65\0\x68\x77\0\x63\x68\x69\x6c\x64\x5f\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\
-\x65\x5f\x65\x6e\x61\x62\x6c\x65\x64\0\x63\x68\x69\x6c\x64\x5f\x74\x6f\x74\x61\
-\x6c\x5f\x74\x69\x6d\x65\x5f\x72\x75\x6e\x6e\x69\x6e\x67\0\x63\x68\x69\x6c\x64\
-\x5f\x6d\x75\x74\x65\x78\0\x63\x68\x69\x6c\x64\x5f\x6c\x69\x73\x74\0\x6f\x6e\
-\x63\x70\x75\0\x6f\x77\x6e\x65\x72\x5f\x65\x6e\x74\x72\x79\0\x6d\x6d\x61\x70\
-\x5f\x6d\x75\x74\x65\x78\0\x6d\x6d\x61\x70\x5f\x63\x6f\x75\x6e\x74\0\x72\x62\0\
-\x72\x62\x5f\x65\x6e\x74\x72\x79\0\x72\x63\x75\x5f\x62\x61\x74\x63\x68\x65\x73\
-\0\x72\x63\x75\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x77\x61\x69\x74\x71\0\x66\x61\
-\x73\x79\x6e\x63\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x61\x6b\x65\x75\x70\0\
-\x70\x65\x6e\x64\x69\x6e\x67\x5f\x6b\x69\x6c\x6c\0\x70\x65\x6e\x64\x69\x6e\x67\
-\x5f\x64\x69\x73\x61\x62\x6c\x65\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x73\x69\x67\
-\x74\x72\x61\x70\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x61\x64\x64\x72\0\x70\x65\
-\x6e\x64\x69\x6e\x67\x5f\x69\x72\x71\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x74\x61\
-\x73\x6b\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x6f\x72\x6b\0\x65\x76\x65\x6e\
-\x74\x5f\x6c\x69\x6d\x69\x74\0\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x73\
-\0\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x5f\x72\x61\x6e\x67\x65\x73\0\
-\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x73\x5f\x67\x65\x6e\0\x61\x75\x78\
-\x5f\x65\x76\x65\x6e\x74\0\x64\x65\x73\x74\x72\x6f\x79\0\x6e\x73\0\x69\x64\0\
-\x6c\x6f\x73\x74\x5f\x73\x61\x6d\x70\x6c\x65\x73\0\x63\x6c\x6f\x63\x6b\0\x6f\
-\x76\x65\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\x64\x6c\x65\x72\0\x6f\x76\x65\x72\
-\x66\x6c\x6f\x77\x5f\x68\x61\x6e\x64\x6c\x65\x72\x5f\x63\x6f\x6e\x74\x65\x78\
-\x74\0\x6f\x72\x69\x67\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\x64\
-\x6c\x65\x72\0\x70\x72\x6f\x67\0\x62\x70\x66\x5f\x63\x6f\x6f\x6b\x69\x65\0\x74\
-\x70\x5f\x65\x76\x65\x6e\x74\0\x66\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\0\x63\
-\x67\x72\x70\0\x73\x62\x5f\x6c\x69\x73\x74\0\x70\x65\x72\x66\x5f\x65\x76\x65\
-\x6e\x74\x5f\x73\x74\x61\x74\x65\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\
-\x53\x54\x41\x54\x45\x5f\x44\x45\x41\x44\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\
-\x54\x5f\x53\x54\x41\x54\x45\x5f\x45\x58\x49\x54\0\x50\x45\x52\x46\x5f\x45\x56\
-\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x45\x52\x52\x4f\x52\0\x50\x45\x52\x46\
-\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x4f\x46\x46\0\x50\x45\x52\
-\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x49\x4e\x41\x43\x54\
-\x49\x56\x45\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\
-\x5f\x41\x43\x54\x49\x56\x45\0\x6c\x6f\x63\x61\x6c\x36\x34\x5f\x74\0\x70\x65\
-\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x61\x74\x74\x72\0\x63\x6f\x6e\x66\x69\x67\
-\0\x73\x61\x6d\x70\x6c\x65\x5f\x74\x79\x70\x65\0\x72\x65\x61\x64\x5f\x66\x6f\
-\x72\x6d\x61\x74\0\x64\x69\x73\x61\x62\x6c\x65\x64\0\x69\x6e\x68\x65\x72\x69\
-\x74\0\x70\x69\x6e\x6e\x65\x64\0\x65\x78\x63\x6c\x75\x73\x69\x76\x65\0\x65\x78\
-\x63\x6c\x75\x64\x65\x5f\x75\x73\x65\x72\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x6b\
-\x65\x72\x6e\x65\x6c\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x68\x76\0\x65\x78\x63\
-\x6c\x75\x64\x65\x5f\x69\x64\x6c\x65\0\x6d\x6d\x61\x70\0\x66\x72\x65\x71\0\x69\
-\x6e\x68\x65\x72\x69\x74\x5f\x73\x74\x61\x74\0\x65\x6e\x61\x62\x6c\x65\x5f\x6f\
-\x6e\x5f\x65\x78\x65\x63\0\x77\x61\x74\x65\x72\x6d\x61\x72\x6b\0\x70\x72\x65\
-\x63\x69\x73\x65\x5f\x69\x70\0\x6d\x6d\x61\x70\x5f\x64\x61\x74\x61\0\x73\x61\
-\x6d\x70\x6c\x65\x5f\x69\x64\x5f\x61\x6c\x6c\0\x65\x78\x63\x6c\x75\x64\x65\x5f\
-\x68\x6f\x73\x74\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x67\x75\x65\x73\x74\0\x65\
-\x78\x63\x6c\x75\x64\x65\x5f\x63\x61\x6c\x6c\x63\x68\x61\x69\x6e\x5f\x6b\x65\
-\x72\x6e\x65\x6c\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x63\x61\x6c\x6c\x63\x68\x61\
-\x69\x6e\x5f\x75\x73\x65\x72\0\x6d\x6d\x61\x70\x32\0\x63\x6f\x6d\x6d\x5f\x65\
-\x78\x65\x63\0\x75\x73\x65\x5f\x63\x6c\x6f\x63\x6b\x69\x64\0\x63\x6f\x6e\x74\
-\x65\x78\x74\x5f\x73\x77\x69\x74\x63\x68\0\x77\x72\x69\x74\x65\x5f\x62\x61\x63\
-\x6b\x77\x61\x72\x64\0\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\0\x6b\x73\x79\
-\x6d\x62\x6f\x6c\0\x62\x70\x66\x5f\x65\x76\x65\x6e\x74\0\x61\x75\x78\x5f\x6f\
-\x75\x74\x70\x75\x74\0\x63\x67\x72\x6f\x75\x70\0\x74\x65\x78\x74\x5f\x70\x6f\
-\x6b\x65\0\x62\x75\x69\x6c\x64\x5f\x69\x64\0\x69\x6e\x68\x65\x72\x69\x74\x5f\
-\x74\x68\x72\x65\x61\x64\0\x72\x65\x6d\x6f\x76\x65\x5f\x6f\x6e\x5f\x65\x78\x65\
-\x63\0\x73\x69\x67\x74\x72\x61\x70\0\x5f\x5f\x72\x65\x73\x65\x72\x76\x65\x64\
-\x5f\x31\0\x62\x70\x5f\x74\x79\x70\x65\0\x62\x72\x61\x6e\x63\x68\x5f\x73\x61\
-\x6d\x70\x6c\x65\x5f\x74\x79\x70\x65\0\x73\x61\x6d\x70\x6c\x65\x5f\x72\x65\x67\
-\x73\x5f\x75\x73\x65\x72\0\x73\x61\x6d\x70\x6c\x65\x5f\x73\x74\x61\x63\x6b\x5f\
-\x75\x73\x65\x72\0\x73\x61\x6d\x70\x6c\x65\x5f\x72\x65\x67\x73\x5f\x69\x6e\x74\
-\x72\0\x61\x75\x78\x5f\x77\x61\x74\x65\x72\x6d\x61\x72\x6b\0\x73\x61\x6d\x70\
-\x6c\x65\x5f\x6d\x61\x78\x5f\x73\x74\x61\x63\x6b\0\x5f\x5f\x72\x65\x73\x65\x72\
-\x76\x65\x64\x5f\x32\0\x61\x75\x78\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x73\x69\x7a\
-\x65\0\x5f\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x5f\x33\0\x73\x69\x67\x5f\x64\
-\x61\x74\x61\0\x73\x61\x6d\x70\x6c\x65\x5f\x70\x65\x72\x69\x6f\x64\0\x73\x61\
-\x6d\x70\x6c\x65\x5f\x66\x72\x65\x71\0\x77\x61\x6b\x65\x75\x70\x5f\x65\x76\x65\
-\x6e\x74\x73\0\x77\x61\x6b\x65\x75\x70\x5f\x77\x61\x74\x65\x72\x6d\x61\x72\x6b\
-\0\x62\x70\x5f\x61\x64\x64\x72\0\x6b\x70\x72\x6f\x62\x65\x5f\x66\x75\x6e\x63\0\
-\x75\x70\x72\x6f\x62\x65\x5f\x70\x61\x74\x68\0\x63\x6f\x6e\x66\x69\x67\x31\0\
-\x62\x70\x5f\x6c\x65\x6e\0\x6b\x70\x72\x6f\x62\x65\x5f\x61\x64\x64\x72\0\x70\
-\x72\x6f\x62\x65\x5f\x6f\x66\x66\x73\x65\x74\0\x63\x6f\x6e\x66\x69\x67\x32\0\
-\x5f\x5f\x73\x33\x32\0\x68\x77\x5f\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\
-\x74\x61\x72\x67\x65\x74\0\x70\x72\x65\x76\x5f\x63\x6f\x75\x6e\x74\0\x69\x6e\
-\x74\x65\x72\x72\x75\x70\x74\x73\x5f\x73\x65\x71\0\x69\x6e\x74\x65\x72\x72\x75\
-\x70\x74\x73\0\x66\x72\x65\x71\x5f\x74\x69\x6d\x65\x5f\x73\x74\x61\x6d\x70\0\
-\x66\x72\x65\x71\x5f\x63\x6f\x75\x6e\x74\x5f\x73\x74\x61\x6d\x70\0\x6c\x61\x73\
-\x74\x5f\x74\x61\x67\0\x63\x6f\x6e\x66\x69\x67\x5f\x62\x61\x73\x65\0\x65\x76\
-\x65\x6e\x74\x5f\x62\x61\x73\x65\0\x65\x76\x65\x6e\x74\x5f\x62\x61\x73\x65\x5f\
-\x72\x64\x70\x6d\x63\0\x69\x64\x78\0\x6c\x61\x73\x74\x5f\x63\x70\x75\0\x65\x78\
-\x74\x72\x61\x5f\x72\x65\x67\0\x62\x72\x61\x6e\x63\x68\x5f\x72\x65\x67\0\x68\
-\x77\x5f\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x65\x78\x74\x72\x61\0\x72\
-\x65\x67\0\x61\x6c\x6c\x6f\x63\0\x74\x70\x5f\x6c\x69\x73\x74\0\x70\x77\x72\x5f\
-\x61\x63\x63\0\x70\x74\x73\x63\0\x69\x6e\x66\x6f\0\x62\x70\x5f\x6c\x69\x73\x74\
-\0\x61\x72\x63\x68\x5f\x68\x77\x5f\x62\x72\x65\x61\x6b\x70\x6f\x69\x6e\x74\0\
-\x61\x64\x64\x72\x65\x73\x73\0\x6d\x61\x73\x6b\0\x72\x68\x6c\x69\x73\x74\x5f\
-\x68\x65\x61\x64\0\x72\x68\x65\x61\x64\0\x72\x68\x61\x73\x68\x5f\x68\x65\x61\
-\x64\0\x69\x6f\x6d\x6d\x75\x5f\x62\x61\x6e\x6b\0\x69\x6f\x6d\x6d\x75\x5f\x63\
-\x6e\x74\x72\0\x70\x61\x64\x64\x69\x6e\x67\0\x63\x6f\x6e\x66\0\x63\x6f\x6e\x66\
-\x31\0\x6c\x61\x73\x74\x5f\x70\x65\x72\x69\x6f\x64\0\x70\x65\x72\x69\x6f\x64\
-\x5f\x6c\x65\x66\x74\0\x73\x61\x76\x65\x64\x5f\x6d\x65\x74\x72\x69\x63\0\x73\
-\x61\x76\x65\x64\x5f\x73\x6c\x6f\x74\x73\0\x77\x61\x69\x74\x5f\x71\x75\x65\x75\
-\x65\x5f\x68\x65\x61\x64\x5f\x74\0\x77\x61\x69\x74\x5f\x71\x75\x65\x75\x65\x5f\
-\x68\x65\x61\x64\0\x68\x65\x61\x64\0\x69\x72\x71\x5f\x77\x6f\x72\x6b\0\x69\x72\
-\x71\x77\x61\x69\x74\0\x72\x63\x75\x77\x61\x69\x74\0\x70\x65\x72\x66\x5f\x61\
-\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x73\x5f\x68\x65\x61\x64\0\x6e\x72\x5f\
-\x66\x69\x6c\x65\x5f\x66\x69\x6c\x74\x65\x72\x73\0\x70\x65\x72\x66\x5f\x6f\x76\
-\x65\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\x64\x6c\x65\x72\x5f\x74\0\x70\x65\x72\
-\x66\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x64\x61\x74\x61\0\x73\x61\x6d\x70\x6c\x65\
-\x5f\x66\x6c\x61\x67\x73\0\x70\x65\x72\x69\x6f\x64\0\x62\x72\x5f\x73\x74\x61\
-\x63\x6b\0\x64\x61\x74\x61\x5f\x73\x72\x63\0\x74\x78\x6e\0\x61\x64\x64\x72\0\
-\x72\x61\x77\0\x74\x69\x64\x5f\x65\x6e\x74\x72\x79\0\x73\x74\x72\x65\x61\x6d\
-\x5f\x69\x64\0\x63\x70\x75\x5f\x65\x6e\x74\x72\x79\0\x63\x61\x6c\x6c\x63\x68\
-\x61\x69\x6e\0\x61\x75\x78\x5f\x73\x69\x7a\x65\0\x72\x65\x67\x73\x5f\x75\x73\
-\x65\x72\0\x72\x65\x67\x73\x5f\x69\x6e\x74\x72\0\x73\x74\x61\x63\x6b\x5f\x75\
-\x73\x65\x72\x5f\x73\x69\x7a\x65\0\x70\x68\x79\x73\x5f\x61\x64\x64\x72\0\x64\
-\x61\x74\x61\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\0\x63\x6f\x64\x65\x5f\x70\
-\x61\x67\x65\x5f\x73\x69\x7a\x65\0\x70\x65\x72\x66\x5f\x73\x61\x6d\x70\x6c\x65\
-\x5f\x77\x65\x69\x67\x68\x74\0\x66\x75\x6c\x6c\0\x76\x61\x72\x31\x5f\x64\x77\0\
-\x76\x61\x72\x32\x5f\x77\0\x76\x61\x72\x33\x5f\x77\0\x70\x65\x72\x66\x5f\x6d\
-\x65\x6d\x5f\x64\x61\x74\x61\x5f\x73\x72\x63\0\x6d\x65\x6d\x5f\x6f\x70\0\x6d\
-\x65\x6d\x5f\x6c\x76\x6c\0\x6d\x65\x6d\x5f\x73\x6e\x6f\x6f\x70\0\x6d\x65\x6d\
-\x5f\x6c\x6f\x63\x6b\0\x6d\x65\x6d\x5f\x64\x74\x6c\x62\0\x6d\x65\x6d\x5f\x6c\
-\x76\x6c\x5f\x6e\x75\x6d\0\x6d\x65\x6d\x5f\x72\x65\x6d\x6f\x74\x65\0\x6d\x65\
-\x6d\x5f\x73\x6e\x6f\x6f\x70\x78\0\x6d\x65\x6d\x5f\x62\x6c\x6b\0\x6d\x65\x6d\
-\x5f\x68\x6f\x70\x73\0\x6d\x65\x6d\x5f\x72\x73\x76\x64\0\x74\x69\x64\0\x72\x65\
-\x73\x65\x72\x76\x65\x64\0\x70\x65\x72\x66\x5f\x72\x65\x67\x73\0\x61\x62\x69\0\
-\x72\x65\x67\x73\0\x70\x72\x69\x76\x61\x74\x65\0\x73\x61\x76\x65\x64\x5f\x66\
-\x75\x6e\x63\0\x6c\x6f\x63\x61\x6c\x5f\x68\x61\x73\x68\0\x66\x75\x6e\x63\x5f\
-\x68\x61\x73\x68\0\x6f\x6c\x64\x5f\x68\x61\x73\x68\0\x74\x72\x61\x6d\x70\x6f\
-\x6c\x69\x6e\x65\0\x74\x72\x61\x6d\x70\x6f\x6c\x69\x6e\x65\x5f\x73\x69\x7a\x65\
-\0\x6f\x70\x73\x5f\x66\x75\x6e\x63\0\x66\x74\x72\x61\x63\x65\x5f\x66\x75\x6e\
-\x63\x5f\x74\0\x66\x74\x72\x61\x63\x65\x5f\x72\x65\x67\x73\0\x66\x74\x72\x61\
-\x63\x65\x5f\x6f\x70\x73\x5f\x68\x61\x73\x68\0\x6e\x6f\x74\x72\x61\x63\x65\x5f\
-\x68\x61\x73\x68\0\x66\x69\x6c\x74\x65\x72\x5f\x68\x61\x73\x68\0\x72\x65\x67\
-\x65\x78\x5f\x6c\x6f\x63\x6b\0\x66\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\x5f\x66\
-\x75\x6e\x63\x5f\x74\0\x66\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\x5f\x63\x6d\x64\
-\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\x44\x5f\x45\x4e\x41\x42\
-\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\x4f\x44\x49\x46\x59\x5f\x53\
-\x45\x4c\x46\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\x44\x5f\x45\
-\x4e\x41\x42\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\x4f\x44\x49\x46\
-\x59\x5f\x50\x45\x45\x52\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\
-\x44\x5f\x44\x49\x53\x41\x42\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\
-\x4f\x44\x49\x46\x59\x5f\x50\x45\x45\x52\0\x61\x76\x78\x35\x31\x32\x5f\x74\x69\
-\x6d\x65\x73\x74\x61\x6d\x70\0\x66\x70\x73\x74\x61\x74\x65\0\x5f\x5f\x74\x61\
-\x73\x6b\x5f\x66\x70\x73\x74\x61\x74\x65\0\x70\x65\x72\x6d\0\x67\x75\x65\x73\
-\x74\x5f\x70\x65\x72\x6d\0\x5f\x5f\x66\x70\x73\x74\x61\x74\x65\0\x66\x70\x75\
-\x5f\x73\x74\x61\x74\x65\x5f\x70\x65\x72\x6d\0\x5f\x5f\x73\x74\x61\x74\x65\x5f\
-\x70\x65\x72\x6d\0\x5f\x5f\x73\x74\x61\x74\x65\x5f\x73\x69\x7a\x65\0\x5f\x5f\
-\x75\x73\x65\x72\x5f\x73\x74\x61\x74\x65\x5f\x73\x69\x7a\x65\0\x75\x73\x65\x72\
-\x5f\x73\x69\x7a\x65\0\x78\x66\x65\x61\x74\x75\x72\x65\x73\0\x75\x73\x65\x72\
-\x5f\x78\x66\x65\x61\x74\x75\x72\x65\x73\0\x78\x66\x64\0\x69\x73\x5f\x76\x61\
-\x6c\x6c\x6f\x63\0\x69\x73\x5f\x67\x75\x65\x73\x74\0\x69\x73\x5f\x63\x6f\x6e\
-\x66\x69\x64\x65\x6e\x74\x69\x61\x6c\0\x69\x6e\x5f\x75\x73\x65\0\x66\x70\x72\
-\x65\x67\x73\x5f\x73\x74\x61\x74\x65\0\x66\x73\x61\x76\x65\0\x66\x78\x73\x61\
-\x76\x65\0\x73\x6f\x66\x74\0\x78\x73\x61\x76\x65\0\x66\x72\x65\x67\x73\x5f\x73\
-\x74\x61\x74\x65\0\x63\x77\x64\0\x73\x77\x64\0\x74\x77\x64\0\x66\x69\x70\0\x66\
-\x63\x73\0\x66\x6f\x6f\0\x66\x6f\x73\0\x73\x74\x5f\x73\x70\x61\x63\x65\0\x66\
-\x78\x72\x65\x67\x73\x5f\x73\x74\x61\x74\x65\0\x66\x6f\x70\0\x6d\x78\x63\x73\
-\x72\0\x6d\x78\x63\x73\x72\x5f\x6d\x61\x73\x6b\0\x78\x6d\x6d\x5f\x73\x70\x61\
-\x63\x65\0\x72\x69\x70\0\x72\x64\x70\0\x70\x61\x64\x64\x69\x6e\x67\x31\0\x73\
-\x77\x5f\x72\x65\x73\x65\x72\x76\x65\x64\0\x73\x77\x72\x65\x67\x73\x5f\x73\x74\
-\x61\x74\x65\0\x66\x74\x6f\x70\0\x63\x68\x61\x6e\x67\x65\x64\0\x6c\x6f\x6f\x6b\
-\x61\x68\x65\x61\x64\0\x6e\x6f\x5f\x75\x70\x64\x61\x74\x65\0\x72\x6d\0\x61\x6c\
-\x69\x6d\x69\x74\0\x65\x6e\x74\x72\x79\x5f\x65\x69\x70\0\x78\x72\x65\x67\x73\
-\x5f\x73\x74\x61\x74\x65\0\x69\x33\x38\x37\0\x68\x65\x61\x64\x65\x72\0\x65\x78\
-\x74\x65\x6e\x64\x65\x64\x5f\x73\x74\x61\x74\x65\x5f\x61\x72\x65\x61\0\x78\x73\
-\x74\x61\x74\x65\x5f\x68\x65\x61\x64\x65\x72\0\x78\x63\x6f\x6d\x70\x5f\x62\x76\
-\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6b\x6d\x65\
-\x6d\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x5f\x6b\x6d\x61\x6c\x6c\x6f\
-\x63\0\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\0\x6c\x61\x73\x74\
-\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\0\x6b\x6d\x65\x6d\x5f\x63\x6f\x75\
-\x6e\x74\0\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\0\x73\x6c\x61\x62\x5f\x63\
-\x6f\x75\x6e\x74\0\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\0\
-\x74\x61\x73\x6b\x5f\x69\x6e\x66\x6f\x5f\x73\x69\x6d\x70\x6c\x65\0\x63\x70\x75\
-\x5f\x69\x64\0\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\
-\x5f\x63\x6f\x6d\x6d\x69\x74\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\
-\x74\x61\x74\x73\0\x70\x72\x6f\x63\x65\x73\x73\0\x70\x72\x6f\x63\x65\x73\x73\
-\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\0\
-\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x72\x61\x77\x5f\x6b\x6d\x65\
-\x6d\x5f\x6b\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x5f\x6b\x66\x72\x65\x65\0\
-\x74\x72\x61\x63\x65\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\
-\x63\x65\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x5f\x63\
-\x61\x63\x68\x65\x5f\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x5f\x63\x61\x63\
-\x68\x65\x5f\x66\x72\x65\x65\0\x68\x61\x6e\x64\x6c\x65\x5f\x6d\x6d\x5f\x74\x61\
-\x73\x6b\x5f\x65\x78\x69\x74\0\x4c\x49\x43\x45\x4e\x53\x45\0\x5f\x5f\x5f\x5f\
-\x6f\x6f\x6d\x5f\x6b\x69\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x73\x73\x2e\x5f\x5f\
-\x5f\x5f\x66\x6d\x74\0\x7a\x65\x72\x6f\0\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\
-\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\
-\x66\x6d\x74\0\x74\x61\x73\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\
-\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\x6f\x6e\
-\x65\0\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\
-\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x70\x72\x6f\
-\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\
-\x6d\x6d\x69\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\x5f\x5f\x6b\x65\x72\
-\x6e\x65\x6c\x5f\x74\x69\x6d\x65\x73\x70\x65\x63\0\x62\x6c\x6b\x5f\x70\x6c\x75\
-\x67\0\x62\x70\x66\x5f\x6c\x6f\x63\x61\x6c\x5f\x73\x74\x6f\x72\x61\x67\x65\0\
-\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x62\x70\x66\x5f\x72\x75\x6e\x5f\x63\x74\x78\
-\0\x63\x6f\x6d\x70\x6c\x65\x74\x69\x6f\x6e\0\x63\x73\x73\x5f\x73\x65\x74\0\x65\
-\x76\x65\x6e\x74\x5f\x66\x69\x6c\x74\x65\x72\0\x66\x61\x73\x79\x6e\x63\x5f\x73\
-\x74\x72\x75\x63\x74\0\x66\x69\x6c\x65\x73\x5f\x73\x74\x72\x75\x63\x74\0\x66\
-\x73\x5f\x73\x74\x72\x75\x63\x74\0\x66\x74\x72\x61\x63\x65\x5f\x68\x61\x73\x68\
-\0\x66\x74\x72\x61\x63\x65\x5f\x72\x65\x74\x5f\x73\x74\x61\x63\x6b\0\x66\x75\
-\x74\x65\x78\x5f\x70\x69\x5f\x73\x74\x61\x74\x65\0\x68\x72\x74\x69\x6d\x65\x72\
-\x5f\x63\x6c\x6f\x63\x6b\x5f\x62\x61\x73\x65\0\x69\x6f\x5f\x75\x72\x69\x6e\x67\
-\x5f\x74\x61\x73\x6b\0\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x69\x67\x69\x6e\x66\x6f\
-\0\x6c\x6f\x63\x6b\x5f\x63\x6c\x61\x73\x73\x5f\x6b\x65\x79\0\x6c\x6f\x63\x6b\
-\x64\x65\x70\x5f\x73\x75\x62\x63\x6c\x61\x73\x73\x5f\x6b\x65\x79\0\x6d\x61\x74\
-\x68\x5f\x65\x6d\x75\x5f\x69\x6e\x66\x6f\0\x6d\x65\x6d\x5f\x63\x67\x72\x6f\x75\
-\x70\0\x6d\x6d\x5f\x73\x74\x72\x75\x63\x74\0\x6d\x75\x74\x65\x78\x5f\x77\x61\
-\x69\x74\x65\x72\0\x6f\x6c\x64\x5f\x74\x69\x6d\x65\x73\x70\x65\x63\x33\x32\0\
-\x70\x65\x72\x66\x5f\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x5f\x72\x61\
-\x6e\x67\x65\0\x70\x65\x72\x66\x5f\x62\x72\x61\x6e\x63\x68\x5f\x73\x74\x61\x63\
-\x6b\0\x70\x65\x72\x66\x5f\x62\x75\x66\x66\x65\x72\0\x70\x65\x72\x66\x5f\x63\
-\x61\x6c\x6c\x63\x68\x61\x69\x6e\x5f\x65\x6e\x74\x72\x79\0\x70\x65\x72\x66\x5f\
-\x63\x67\x72\x6f\x75\x70\0\x70\x65\x72\x66\x5f\x72\x61\x77\x5f\x72\x65\x63\x6f\
-\x72\x64\0\x70\x69\x64\x5f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\0\x70\x69\x70\
-\x65\x5f\x69\x6e\x6f\x64\x65\x5f\x69\x6e\x66\x6f\0\x70\x6f\x6c\x6c\x66\x64\0\
-\x72\x63\x75\x5f\x6e\x6f\x64\x65\0\x72\x65\x71\x75\x65\x73\x74\x5f\x71\x75\x65\
-\x75\x65\0\x72\x6f\x62\x75\x73\x74\x5f\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\
-\x72\x74\x5f\x6d\x75\x74\x65\x78\x5f\x77\x61\x69\x74\x65\x72\0\x73\x65\x63\x63\
-\x6f\x6d\x70\x5f\x66\x69\x6c\x74\x65\x72\0\x73\x65\x6d\x5f\x75\x6e\x64\x6f\x5f\
-\x6c\x69\x73\x74\0\x73\x69\x67\x68\x61\x6e\x64\x5f\x73\x74\x72\x75\x63\x74\0\
-\x73\x69\x67\x6e\x61\x6c\x5f\x73\x74\x72\x75\x63\x74\0\x74\x61\x73\x6b\x5f\x64\
-\x65\x6c\x61\x79\x5f\x69\x6e\x66\x6f\0\x74\x61\x73\x6b\x5f\x67\x72\x6f\x75\x70\
-\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\x5f\x63\x61\x6c\x6c\0\x75\x70\
-\x72\x6f\x62\x65\x5f\x74\x61\x73\x6b\0\x76\x6d\x5f\x73\x74\x72\x75\x63\x74\0\
-\x2f\x68\x6f\x6d\x65\x2f\x6e\x65\x30\x2f\x73\x79\x73\x5f\x63\x6f\x6d\x70\x65\
-\x74\x69\x74\x69\x6f\x6e\x2f\x73\x74\x61\x72\x74\x2f\x63\x70\x75\x5f\x77\x61\
-\x74\x63\x68\x65\x72\x2f\x62\x70\x66\x2f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x2e\
-\x62\x70\x66\x2e\x63\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\x42\x45\
-\x28\x6f\x6f\x6d\x5f\x6b\x69\x6c\x6c\x5f\x70\x72\x6f\x63\x65\x73\x73\x2c\x20\
-\x73\x74\x72\x75\x63\x74\x20\x6f\x6f\x6d\x5f\x63\x6f\x6e\x74\x72\x6f\x6c\x20\
-\x2a\x6f\x63\x2c\x20\x63\x6f\x6e\x73\x74\x20\x63\x68\x61\x72\x20\x2a\x6d\x65\
-\x73\x73\x61\x67\x65\x29\0\x20\x20\x20\x20\x62\x75\x66\x66\x20\x3d\x20\x62\x70\
-\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\
-\x6f\x6f\x6d\x5f\x65\x76\x65\x6e\x74\x5f\x62\x75\x66\x66\x65\x72\x2c\x20\x73\
-\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x6f\x6f\x6d\x5f\x65\x76\
-\x65\x6e\x74\x29\x2c\x20\x30\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x62\x75\
-\x66\x66\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\
-\x6e\x74\x6b\x28\x22\x74\x68\x65\x20\x6f\x6f\x6d\x5f\x65\x76\x65\x6e\x74\x5f\
-\x62\x75\x66\x66\x20\x69\x73\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\
-\x20\x20\x75\x36\x34\x20\x6e\x6f\x77\x20\x3d\x20\x62\x70\x66\x5f\x6b\x74\x69\
-\x6d\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\x3b\0\x20\x20\x20\x20\x62\x75\x66\
-\x66\x2d\x3e\x6b\x69\x6c\x6c\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x28\
-\x26\x74\x61\x73\x6b\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x74\x61\x73\x6b\x29\
-\x2c\x20\x26\x6f\x63\x2d\x3e\x63\x68\x6f\x73\x65\x6e\x29\x3b\0\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x28\x26\x62\x75\x66\
-\x66\x2d\x3e\x6b\x69\x6c\x6c\x65\x64\x5f\x69\x64\x2c\x20\x73\x69\x7a\x65\x6f\
-\x66\x28\x62\x75\x66\x66\x2d\x3e\x6b\x69\x6c\x6c\x65\x64\x5f\x69\x64\x29\x2c\
-\x20\x26\x74\x61\x73\x6b\x2d\x3e\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x28\x26\x62\x75\x66\x66\x2d\
-\x3e\x63\x6f\x6d\x6d\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x62\x75\x66\x66\x2d\
-\x3e\x63\x6f\x6d\x6d\x29\x2c\x20\x26\x74\x61\x73\x6b\x2d\x3e\x63\x6f\x6d\x6d\
-\x29\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x74\x72\x69\x67\x67\x65\x72\
-\x5f\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\
-\x6e\x74\x5f\x70\x69\x64\x5f\x74\x67\x69\x64\x28\x29\x20\x26\x20\x30\x78\x46\
-\x46\x46\x46\x46\x46\x46\x46\x3b\x20\0\x20\x20\x20\x20\x62\x70\x66\x5f\x72\x69\
-\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\x62\x75\x66\x66\x2c\x20\
-\x30\x29\x3b\0\x20\x20\x20\x20\x75\x36\x34\x20\x69\x64\x20\x3d\x20\x62\x70\x66\
-\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\x5f\x74\x67\
-\x69\x64\x28\x29\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x74\x67\x69\x64\x20\x3d\
-\x20\x69\x64\x20\x3e\x3e\x20\x33\x32\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x70\
-\x69\x64\x20\x3d\x20\x69\x64\x20\x26\x20\x30\x78\x46\x46\x46\x46\x46\x46\x46\
-\x46\x3b\x20\0\x20\x20\x20\x20\x69\x66\x28\x70\x69\x64\x20\x3d\x3d\x20\x30\x29\
-\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\
-\x73\x74\x61\x74\x73\x20\x2a\x74\x61\x73\x6b\x20\x3d\x20\x62\x70\x66\x5f\x6d\
-\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\
-\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\
-\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\x61\x73\x6b\x29\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x69\x6e\x66\
-\x6f\x2e\x74\x67\x69\x64\x20\x3d\x20\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x69\x6e\x66\x6f\x2e\x70\
-\x69\x64\x20\x3d\x20\x70\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6d\x65\
-\x6d\x73\x65\x74\x28\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2c\x20\x30\x2c\
-\x20\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\
-\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x63\x6f\
-\x6d\x6d\x28\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x69\x6e\x66\x6f\x2e\x63\
-\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x69\x6e\x69\x74\x5f\x74\x61\x73\
-\x6b\x2e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x29\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x6b\x6d\x65\x6d\x5f\x63\
-\x6f\x75\x6e\x74\x20\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\
-\x69\x74\x5f\x74\x61\x73\x6b\x2e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\
-\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\
-\x28\x26\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\
-\x2c\x26\x70\x69\x64\x2c\x26\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2c\x42\x50\
-\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\
-\x2d\x3e\x6b\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\
-\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\
-\x61\x74\x73\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x2c\x74\x61\x73\x6b\x2c\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\
-\x6b\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\
-\x74\x28\x74\x61\x73\x6b\x29\x3b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\
-\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x20\x2a\x70\
-\x72\x6f\x63\x65\x73\x73\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\
-\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\
-\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x29\
-\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x70\x72\x6f\x63\x65\x73\x73\x29\x7b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x70\x72\x6f\x63\
-\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x20\x69\x6e\x69\x74\x5f\x70\
-\x72\x6f\x63\x65\x73\x73\x20\x3d\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x2e\x74\x67\x69\x64\x20\x3d\x20\x74\x67\x69\x64\x2c\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\
-\x5f\x65\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\
-\x74\x61\x74\x73\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x2c\x26\x69\x6e\x69\
-\x74\x5f\x70\x72\x6f\x63\x65\x73\x73\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x6b\x6d\
-\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\
-\x74\x73\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x2c\x70\x72\x6f\x63\x65\x73\
-\x73\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\x5f\x61\x6e\x64\
-\x5f\x63\x6f\x6d\x6d\x69\x74\x28\x70\x72\x6f\x63\x65\x73\x73\x29\x3b\0\x7d\0\
-\x73\x74\x61\x74\x69\x63\x20\x69\x6e\x74\x20\x74\x61\x73\x6b\x5f\x63\x6f\x6d\
-\x70\x61\x72\x65\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x28\x73\x74\x72\
-\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x20\x2a\
-\x74\x61\x73\x6b\x29\x7b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x6d\x6d\
-\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x2a\x74\x68\x72\x65\x68\x6f\x6c\x64\
-\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\
-\x6c\x65\x6d\x28\x26\x74\x68\x72\x65\x68\x6f\x6c\x64\x5f\x6d\x61\x70\x2c\x26\
-\x7a\x65\x72\x6f\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x74\x68\x72\x65\x68\
-\x6f\x6c\x64\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\
-\x69\x6e\x74\x6b\x28\x22\x6d\x6d\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x6d\
-\x61\x70\x20\x69\x73\x20\x6e\x6f\x74\x20\x69\x6e\x69\x74\x5c\x6e\x22\x29\x3b\0\
-\x20\x20\x20\x20\x69\x66\x28\x74\x61\x73\x6b\x2d\x3e\x6c\x61\x73\x74\x5f\x63\
-\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x2b\x20\x74\x68\x72\x65\x68\x6f\x6c\
-\x64\x2d\x3e\x74\x69\x6d\x65\x5f\x77\x69\x6e\x64\x6f\x77\x20\x3c\x20\x6e\x6f\
-\x77\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x2d\x3e\x6c\x61\
-\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x2d\x3e\x6b\x6d\x65\x6d\
-\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x74\x61\x73\x6b\x2d\x3e\x73\x6c\x61\x62\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\
-\x30\x3b\0\x20\x20\x20\x20\x69\x66\x28\x74\x61\x73\x6b\x2d\x3e\x6b\x6d\x65\x6d\
-\x5f\x63\x6f\x75\x6e\x74\x20\x3e\x3d\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\
-\x3e\x6b\x6d\x65\x6d\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x7c\x7c\x20\x74\
-\x61\x73\x6b\x2d\x3e\x73\x6c\x61\x62\x5f\x63\x6f\x75\x6e\x74\x20\x3e\x3d\x20\
-\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x73\x6c\x61\x62\x5f\x74\x68\x72\x65\
-\x68\x6f\x6c\x64\x20\x7c\x7c\x20\x74\x61\x73\x6b\x2d\x3e\x76\x6d\x65\x6d\x5f\
-\x63\x6f\x75\x6e\x74\x20\x3e\x3d\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\
-\x76\x6d\x65\x6d\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x29\x7b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x69\x66\x28\x74\x61\x73\x6b\x2d\x3e\x61\x6c\x72\x65\x61\x64\
-\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\x21\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\
-\x74\x61\x74\x73\x20\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\
-\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x74\x61\x73\x6b\
-\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\x72\x2c\x20\x73\
-\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x6d\
-\x6d\x5f\x73\x74\x61\x74\x73\x29\x2c\x20\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x69\x66\x28\x21\x62\x75\x66\x66\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x74\x61\
-\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x20\x69\x73\
-\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6d\
-\x65\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\
-\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\
-\x74\x73\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\
-\x69\x6e\x66\x6f\x2e\x70\x69\x64\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x69\x6e\
-\x66\x6f\x2e\x70\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\
-\x2d\x3e\x69\x6e\x66\x6f\x2e\x74\x67\x69\x64\x20\x3d\x20\x74\x61\x73\x6b\x2d\
-\x3e\x69\x6e\x66\x6f\x2e\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x73\x74\x72\x28\
-\x62\x75\x66\x66\x2d\x3e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\
-\x65\x6f\x66\x28\x74\x61\x73\x6b\x2d\x3e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\
-\x29\x2c\x74\x61\x73\x6b\x2d\x3e\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x3b\
-\x20\x20\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x6b\x6d\x65\
-\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x6b\x6d\x65\
-\x6d\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\
-\x66\x2d\x3e\x73\x6c\x61\x62\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x74\x61\x73\
-\x6b\x2d\x3e\x73\x6c\x61\x62\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\
-\x20\x3d\x20\x74\x61\x73\x6b\x2d\x3e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\
-\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\x62\x75\x66\x66\x2c\x30\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\
-\x5f\x6f\x75\x74\x70\x75\x74\x20\x3d\x20\x31\x3b\0\x73\x74\x61\x74\x69\x63\x20\
-\x69\x6e\x74\x20\x70\x72\x6f\x63\x65\x73\x73\x5f\x63\x6f\x6d\x70\x61\x72\x65\
-\x5f\x61\x6e\x64\x5f\x63\x6f\x6d\x6d\x69\x74\x28\x73\x74\x72\x75\x63\x74\x20\
-\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x20\x2a\x70\
-\x72\x6f\x63\x65\x73\x73\x29\x7b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\
-\x6d\x6d\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x2a\x74\x68\x72\x65\x68\x6f\
-\x6c\x64\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\
-\x5f\x65\x6c\x65\x6d\x28\x26\x74\x68\x72\x65\x68\x6f\x6c\x64\x5f\x6d\x61\x70\
-\x2c\x26\x6f\x6e\x65\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x70\x72\x6f\x63\x65\
-\x73\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\x61\x72\x5f\x74\x69\x6d\x65\
-\x20\x2b\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x74\x69\x6d\x65\x5f\x77\
-\x69\x6e\x64\x6f\x77\x20\x3c\x20\x6e\x6f\x77\x29\x7b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x63\x6c\x65\
-\x61\x72\x5f\x74\x69\x6d\x65\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\
-\x5f\x6f\x75\x74\x70\x75\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\
-\x74\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\
-\x73\x73\x2d\x3e\x6b\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x30\x3b\0\
-\x20\x20\x20\x20\x69\x66\x28\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x6b\x6d\x65\
-\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x3e\x3d\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\
-\x2d\x3e\x6b\x6d\x65\x6d\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x7c\x7c\x20\
-\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x73\x6c\x61\x62\x5f\x63\x6f\x75\x6e\x74\
-\x20\x3e\x3d\x20\x74\x68\x72\x65\x68\x6f\x6c\x64\x2d\x3e\x73\x6c\x61\x62\x5f\
-\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x7c\x7c\x20\x70\x72\x6f\x63\x65\x73\x73\
-\x2d\x3e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x3e\x3d\x20\x74\x68\x72\
-\x65\x68\x6f\x6c\x64\x2d\x3e\x76\x6d\x65\x6d\x5f\x74\x68\x72\x65\x68\x6f\x6c\
-\x64\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x70\x72\x6f\x63\x65\
-\x73\x73\x2d\x3e\x61\x6c\x72\x65\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\
-\x21\x3d\x20\x30\x29\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\
-\x20\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x20\x2a\
-\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\
-\x72\x65\x73\x65\x72\x76\x65\x28\x26\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\
-\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\x66\x65\x72\x2c\x20\x73\x69\x7a\x65\
-\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x70\x72\x6f\x63\x65\x73\x73\x5f\x6d\
-\x6d\x5f\x73\x74\x61\x74\x73\x29\x2c\x20\x30\x29\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x70\
-\x72\x6f\x63\x65\x73\x73\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x5f\x62\x75\x66\
-\x66\x20\x69\x73\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\
-\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x70\x72\x6f\x63\x65\x73\x73\
-\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x62\x75\x66\x66\x2d\x3e\x74\x67\x69\x64\x20\x3d\x20\x70\x72\x6f\x63\x65\
-\x73\x73\x2d\x3e\x74\x67\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\
-\x66\x66\x2d\x3e\x6b\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x70\x72\
-\x6f\x63\x65\x73\x73\x2d\x3e\x6b\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x73\x6c\x61\x62\x5f\x63\
-\x6f\x75\x6e\x74\x20\x3d\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x73\x6c\x61\
-\x62\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\
-\x66\x2d\x3e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\x70\x72\x6f\
-\x63\x65\x73\x73\x2d\x3e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x61\x6c\x72\x65\
-\x61\x64\x79\x5f\x6f\x75\x74\x70\x75\x74\x20\x3d\x20\x31\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x70\x72\x6f\x63\x65\x73\x73\
-\x5f\x6d\x6d\x5f\x73\x74\x61\x74\x73\x20\x69\x6e\x69\x74\x5f\x70\x72\x6f\x63\
-\x65\x73\x73\x20\x3d\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6e\x69\x74\
-\x5f\x74\x61\x73\x6b\x2e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x3d\x20\
-\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\x2d\x3e\x76\x6d\x65\
-\x6d\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x76\x6d\x65\x6d\x5f\x63\x6f\x75\
-\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\
-\x47\x28\x74\x72\x61\x63\x65\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\x63\x29\
-\x7b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x74\x72\x61\x63\x65\
-\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\x65\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\
-\x20\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x2e\x73\x6c\x61\x62\x5f\x63\x6f\x75\
-\x6e\x74\x20\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x74\x61\x73\x6b\
-\x2d\x3e\x73\x6c\x61\x62\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x70\x72\x6f\x63\x65\x73\x73\x2d\x3e\x73\x6c\x61\
-\x62\x5f\x63\x6f\x75\x6e\x74\x20\x2b\x3d\x20\x31\x3b\0\x69\x6e\x74\x20\x42\x50\
-\x46\x5f\x50\x52\x4f\x47\x28\x74\x72\x61\x63\x65\x5f\x63\x61\x63\x68\x65\x5f\
-\x61\x6c\x6c\x6f\x63\x29\x7b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\
-\x28\x74\x72\x61\x63\x65\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\x29\x7b\0\
-\x20\x20\x20\x20\x75\x36\x34\x20\x70\x69\x64\x5f\x74\x67\x69\x64\x20\x3d\x20\
-\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\
-\x5f\x74\x67\x69\x64\x28\x29\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x70\x69\x64\
-\x20\x3d\x20\x70\x69\x64\x5f\x74\x67\x69\x64\x20\x26\x20\x30\x78\x46\x46\x46\
-\x46\x46\x46\x46\x46\x3b\x20\x20\0\x20\x20\x20\x20\x69\x66\x28\x70\x69\x64\x20\
-\x3d\x3d\x20\x30\x20\x7c\x7c\x20\x74\x67\x69\x64\x20\x3d\x3d\x20\x30\x29\0\x20\
-\x20\x20\x20\x69\x66\x28\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\
-\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x6d\x6d\x5f\x73\x74\x61\
-\x74\x73\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x20\x21\x3d\x20\x4e\x55\x4c\
-\x4c\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\
-\x64\x65\x6c\x65\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x61\x73\x6b\x5f\x6d\
-\x6d\x5f\x73\x74\x61\x74\x73\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x69\
-\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x68\x61\x6e\x64\x6c\x65\x5f\
-\x6d\x6d\x5f\x74\x61\x73\x6b\x5f\x65\x78\x69\x74\x29\x7b\0\x30\x3a\x31\x34\0\
-\x30\x3a\x36\0\x30\x3a\x37\x38\0\x30\x3a\x31\x31\x32\0\x6c\x69\x63\x65\x6e\x73\
-\x65\0\x2e\x6d\x61\x70\x73\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x74\x65\x78\x74\
-\0\x6b\x70\x72\x6f\x62\x65\x2f\x6f\x6f\x6d\x5f\x6b\x69\x6c\x6c\x5f\x70\x72\x6f\
-\x63\x65\x73\x73\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\
-\x2f\x6b\x6d\x61\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\
-\x6b\x6d\x65\x6d\x2f\x6b\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\
-\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\x5f\x70\x61\x67\x65\x5f\x61\x6c\x6c\x6f\
-\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\x2f\x6d\x6d\
-\x5f\x70\x61\x67\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\
-\x74\x2f\x6b\x6d\x65\x6d\x2f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x61\
-\x6c\x6c\x6f\x63\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x6b\x6d\x65\x6d\
-\x2f\x6b\x6d\x65\x6d\x5f\x63\x61\x63\x68\x65\x5f\x66\x72\x65\x65\0\x74\x72\x61\
-\x63\x65\x70\x6f\x69\x6e\x74\x2f\x73\x63\x68\x65\x64\x2f\x73\x63\x68\x65\x64\
-\x5f\x70\x72\x6f\x63\x65\x73\x73\x5f\x65\x78\x69\x74\0\0\0\0\x9f\xeb\x01\0\x20\
-\0\0\0\0\0\0\0\x9c\0\0\0\x9c\0\0\0\xbc\x14\0\0\x58\x15\0\0\x4c\0\0\0\x08\0\0\0\
-\x29\x42\0\0\x02\0\0\0\0\0\0\0\x8d\x01\0\0\x90\x02\0\0\x91\x01\0\0\x2f\x42\0\0\
-\x01\0\0\0\0\0\0\0\x2f\0\0\0\x47\x42\0\0\x01\0\0\0\0\0\0\0\x86\x01\0\0\x5f\x42\
-\0\0\x01\0\0\0\0\0\0\0\x95\x01\0\0\x75\x42\0\0\x01\0\0\0\0\0\0\0\x98\x01\0\0\
-\x93\x42\0\0\x01\0\0\0\0\0\0\0\x99\x01\0\0\xb0\x42\0\0\x01\0\0\0\0\0\0\0\x9a\
-\x01\0\0\xd1\x42\0\0\x01\0\0\0\0\0\0\0\x9b\x01\0\0\xf1\x42\0\0\x01\0\0\0\0\0\0\
-\0\x9c\x01\0\0\x10\0\0\0\x29\x42\0\0\x54\0\0\0\0\0\0\0\x13\x30\0\0\xf6\x36\0\0\
-\0\x1c\x01\0\x08\0\0\0\x13\x30\0\0\x36\x37\0\0\x24\x20\x01\0\x38\0\0\0\x13\x30\
-\0\0\x83\x37\0\0\x08\x24\x01\0\x40\0\0\0\x13\x30\0\0\x96\x37\0\0\x09\x28\x01\0\
-\x68\0\0\0\x13\x30\0\0\x33\x31\0\0\x0f\x40\x01\0\x70\0\0\0\x13\x30\0\0\xcb\x37\
-\0\0\x0e\x44\x01\0\x78\0\0\0\x13\x30\0\0\xcb\x37\0\0\x2a\x44\x01\0\x80\0\0\0\
-\x13\x30\0\0\xcb\x37\0\0\x1e\x44\x01\0\x88\0\0\0\x13\x30\0\0\xcb\x37\0\0\x08\
-\x44\x01\0\x90\0\0\0\x13\x30\0\0\x08\x38\0\0\x1f\x54\x01\0\xa0\0\0\0\x13\x30\0\
-\0\x2d\x38\0\0\x1a\x48\x01\0\xa8\0\0\0\x13\x30\0\0\x4b\x38\0\0\x1a\x50\x01\0\
-\xb0\0\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xe0\0\0\0\x13\x30\0\0\xf4\x36\0\0\x01\
-\xc0\x01\0\xe8\0\0\0\x13\x30\0\0\x69\x38\0\0\x26\x6c\x01\0\xf0\0\0\0\x13\x30\0\
-\0\x69\x38\0\0\x0e\x6c\x01\0\xf8\0\0\0\x13\x30\0\0\x69\x38\0\0\x34\x6c\x01\0\0\
-\x01\0\0\x13\x30\0\0\x69\x38\0\0\x55\x6c\x01\0\x08\x01\0\0\x13\x30\0\0\x69\x38\
-\0\0\x3d\x6c\x01\0\x10\x01\0\0\x13\x30\0\0\x69\x38\0\0\x63\x6c\x01\0\x18\x01\0\
-\0\x13\x30\0\0\x69\x38\0\0\x6c\x6c\x01\0\x20\x01\0\0\x13\x30\0\0\x69\x38\0\0\
-\x84\x6c\x01\0\x28\x01\0\0\x13\x30\0\0\x69\x38\0\0\x08\x6c\x01\0\x30\x01\0\0\
-\x13\x30\0\0\xfc\x38\0\0\x12\x70\x01\0\x38\x01\0\0\x13\x30\0\0\xfc\x38\0\0\x0c\
-\x70\x01\0\x48\x01\0\0\x13\x30\0\0\x22\x39\0\0\x26\x78\x01\0\x78\x01\0\0\x13\
-\x30\0\0\x94\x39\0\0\x0c\x7c\x01\0\x80\x01\0\0\x13\x30\0\0\xa7\x39\0\0\x0d\x80\
-\x01\0\xa8\x01\0\0\x13\x30\0\0\xdf\x39\0\0\x09\x8c\x01\0\xe0\x01\0\0\x13\x30\0\
-\0\x14\x3a\0\0\x25\x90\x01\0\xe8\x01\0\0\x13\x30\0\0\x14\x3a\0\0\x18\x90\x01\0\
-\xf0\x01\0\0\x13\x30\0\0\x3d\x3a\0\0\x26\x94\x01\0\xf8\x01\0\0\x13\x30\0\0\x3d\
-\x3a\0\0\x19\x94\x01\0\0\x02\0\0\x13\x30\0\0\x68\x3a\0\0\x27\x98\x01\0\x10\x02\
-\0\0\x13\x30\0\0\x68\x3a\0\0\x44\x98\x01\0\x20\x02\0\0\x13\x30\0\0\x68\x3a\0\0\
-\x09\x98\x01\0\x30\x02\0\0\x13\x30\0\0\xbf\x3a\0\0\x22\x9c\x01\0\x38\x02\0\0\
-\x13\x30\0\0\xbf\x3a\0\0\x1a\x9c\x01\0\x40\x02\0\0\x13\x30\0\0\xec\x3a\0\0\x22\
-\xa0\x01\0\x48\x02\0\0\x13\x30\0\0\xec\x3a\0\0\x1a\xa0\x01\0\x50\x02\0\0\x13\
-\x30\0\0\x19\x3b\0\0\x22\xa4\x01\0\x58\x02\0\0\x13\x30\0\0\x19\x3b\0\0\x1a\xa4\
-\x01\0\x60\x02\0\0\x13\x30\0\0\x46\x3b\0\0\x09\xa8\x01\0\x80\x02\0\0\x13\x30\0\
-\0\x6a\x3b\0\0\x1e\xb0\x01\0\x90\x02\0\0\x13\x30\0\0\x8c\x3b\0\0\0\xc8\x01\0\
-\x98\x02\0\0\x13\x30\0\0\xd5\x3b\0\0\x24\xcc\x01\0\xc8\x02\0\0\x13\x30\0\0\x83\
-\x37\0\0\x08\xd0\x01\0\xd0\x02\0\0\x13\x30\0\0\x96\x37\0\0\x09\xd4\x01\0\xf8\
-\x02\0\0\x13\x30\0\0\x33\x31\0\0\x0f\xe4\x01\0\0\x03\0\0\x13\x30\0\0\x21\x3c\0\
-\0\x11\xe8\x01\0\x08\x03\0\0\x13\x30\0\0\x21\x3c\0\0\x2d\xe8\x01\0\x10\x03\0\0\
-\x13\x30\0\0\x21\x3c\0\0\x21\xe8\x01\0\x18\x03\0\0\x13\x30\0\0\x21\x3c\0\0\x08\
-\xe8\x01\0\x20\x03\0\0\x13\x30\0\0\x61\x3c\0\0\x22\xf8\x01\0\x30\x03\0\0\x13\
-\x30\0\0\x89\x3c\0\0\x21\xfc\x01\0\x38\x03\0\0\x13\x30\0\0\xae\x3c\0\0\x1d\xf0\
-\x01\0\x40\x03\0\0\x13\x30\0\0\xcf\x3c\0\0\x1d\xec\x01\0\x48\x03\0\0\x13\x30\0\
-\0\0\0\0\0\0\0\0\0\x78\x03\0\0\x13\x30\0\0\xf4\x36\0\0\x01\x5c\x02\0\x80\x03\0\
-\0\x13\x30\0\0\xf0\x3c\0\0\x29\x10\x02\0\x88\x03\0\0\x13\x30\0\0\xf0\x3c\0\0\
-\x11\x10\x02\0\x90\x03\0\0\x13\x30\0\0\xf0\x3c\0\0\x37\x10\x02\0\x98\x03\0\0\
-\x13\x30\0\0\xf0\x3c\0\0\x5b\x10\x02\0\xa0\x03\0\0\x13\x30\0\0\xf0\x3c\0\0\x43\
-\x10\x02\0\xa8\x03\0\0\x13\x30\0\0\xf0\x3c\0\0\x69\x10\x02\0\xb0\x03\0\0\x13\
-\x30\0\0\xf0\x3c\0\0\x75\x10\x02\0\xb8\x03\0\0\x13\x30\0\0\xf0\x3c\0\0\x8d\x10\
-\x02\0\xc0\x03\0\0\x13\x30\0\0\xf0\x3c\0\0\x08\x10\x02\0\xc8\x03\0\0\x13\x30\0\
-\0\x8c\x3d\0\0\x15\x14\x02\0\xd0\x03\0\0\x13\x30\0\0\x8c\x3d\0\0\x0c\x14\x02\0\
-\xe0\x03\0\0\x13\x30\0\0\xb5\x3d\0\0\x29\x1c\x02\0\x08\x04\0\0\x13\x30\0\0\x94\
-\x39\0\0\x0c\x20\x02\0\x10\x04\0\0\x13\x30\0\0\x30\x3e\0\0\x0d\x24\x02\0\x38\
-\x04\0\0\x13\x30\0\0\x6b\x3e\0\0\x09\x30\x02\0\x58\x04\0\0\x13\x30\0\0\xa3\x3e\
-\0\0\x1f\x34\x02\0\x60\x04\0\0\x13\x30\0\0\xa3\x3e\0\0\x14\x34\x02\0\x68\x04\0\
-\0\x13\x30\0\0\xc7\x3e\0\0\x25\x38\x02\0\x70\x04\0\0\x13\x30\0\0\xc7\x3e\0\0\
-\x1a\x38\x02\0\x78\x04\0\0\x13\x30\0\0\xf7\x3e\0\0\x25\x3c\x02\0\x80\x04\0\0\
-\x13\x30\0\0\xf7\x3e\0\0\x1a\x3c\x02\0\x88\x04\0\0\x13\x30\0\0\x27\x3f\0\0\x25\
-\x40\x02\0\x90\x04\0\0\x13\x30\0\0\x27\x3f\0\0\x1a\x40\x02\0\x98\x04\0\0\x13\
-\x30\0\0\x46\x3b\0\0\x09\x44\x02\0\xb8\x04\0\0\x13\x30\0\0\x57\x3f\0\0\x21\x4c\
-\x02\0\x2f\x42\0\0\x12\0\0\0\0\0\0\0\x13\x30\0\0\x52\x30\0\0\x05\xa8\0\0\x08\0\
-\0\0\x13\x30\0\0\xa0\x30\0\0\x0c\xb4\0\0\x38\0\0\0\x13\x30\0\0\xf0\x30\0\0\x08\
-\xb8\0\0\x40\0\0\0\x13\x30\0\0\xff\x30\0\0\x09\xbc\0\0\x68\0\0\0\x13\x30\0\0\
-\x33\x31\0\0\x0f\xcc\0\0\x70\0\0\0\x13\x30\0\0\x55\x31\0\0\x15\xd0\0\0\x90\0\0\
-\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x98\0\0\0\x13\x30\0\0\x70\x31\0\0\x05\xdc\0\0\
-\xb8\0\0\0\x13\x30\0\0\xa6\x31\0\0\x40\xe0\0\0\xc8\0\0\0\x13\x30\0\0\xa6\x31\0\
-\0\x1b\xe0\0\0\xd8\0\0\0\x13\x30\0\0\xa6\x31\0\0\x05\xe0\0\0\xf0\0\0\0\x13\x30\
-\0\0\xf1\x31\0\0\x36\xec\0\0\0\x01\0\0\x13\x30\0\0\xf1\x31\0\0\x1b\xec\0\0\x10\
-\x01\0\0\x13\x30\0\0\xf1\x31\0\0\x05\xec\0\0\x20\x01\0\0\x13\x30\0\0\x33\x32\0\
-\0\x18\xf4\0\0\x28\x01\0\0\x13\x30\0\0\x33\x32\0\0\x16\xf4\0\0\x30\x01\0\0\x13\
-\x30\0\0\x74\x32\0\0\x05\xf8\0\0\x48\x01\0\0\x13\x30\0\0\x52\x30\0\0\x05\xa8\0\
-\0\x47\x42\0\0\x24\0\0\0\0\0\0\0\x13\x30\0\0\x95\x32\0\0\x0e\x44\x05\0\x10\0\0\
-\0\x13\x30\0\0\xbe\x32\0\0\x13\x48\x05\0\x20\0\0\0\x13\x30\0\0\xbe\x32\0\0\x09\
-\x48\x05\0\x28\0\0\0\x13\x30\0\0\xd7\x32\0\0\x09\x4c\x05\0\x30\0\0\0\x13\x30\0\
-\0\x33\x31\0\0\x0f\x50\x05\0\x40\0\0\0\x13\x30\0\0\xd7\x32\0\0\x0f\x4c\x05\0\
-\x50\0\0\0\x13\x30\0\0\xf7\x32\0\0\x08\x58\x05\0\x60\0\0\0\x13\x30\0\0\0\0\0\0\
-\0\0\0\0\x68\0\0\0\x13\x30\0\0\x08\x33\0\0\x22\x64\x05\0\x88\0\0\0\x13\x30\0\0\
-\x57\x33\0\0\x08\x68\x05\0\x90\0\0\0\x13\x30\0\0\x66\x33\0\0\x1d\x78\x05\0\x98\
-\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1e\x74\x05\0\xa0\0\0\0\x13\x30\0\0\x8a\x33\0\0\
-\x1c\x74\x05\0\xb0\0\0\0\x13\x30\0\0\xac\x33\0\0\x09\x70\x05\0\xe0\0\0\0\x13\
-\x30\0\0\xe9\x33\0\0\x1e\x7c\x05\0\xf0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x09\x7c\
-\x05\0\x08\x01\0\0\x13\x30\0\0\x38\x34\0\0\x1e\x80\x05\0\x10\x01\0\0\x13\x30\0\
-\0\x5a\x34\0\0\x23\x84\x05\0\x20\x01\0\0\x13\x30\0\0\x66\x33\0\0\x1d\x78\x05\0\
-\x38\x01\0\0\x13\x30\0\0\x83\x34\0\0\x09\x88\x05\0\x60\x01\0\0\x13\x30\0\0\xcc\
-\x34\0\0\x1a\x94\x05\0\x80\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x88\x01\0\0\x13\
-\x30\0\0\xeb\x34\0\0\x09\x98\x05\0\xb0\x01\0\0\x13\x30\0\0\x2e\x35\0\0\x09\x9c\
-\x05\0\xc8\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xd0\x01\0\0\x13\x30\0\0\x55\x35\
-\0\0\x28\xa8\x05\0\xf0\x01\0\0\x13\x30\0\0\xae\x35\0\0\x08\xac\x05\0\xf8\x01\0\
-\0\x13\x30\0\0\xc0\x35\0\0\x30\xb0\x05\0\x10\x02\0\0\x13\x30\0\0\xf1\x35\0\0\
-\x15\xb4\x05\0\x18\x02\0\0\x13\x30\0\0\xc0\x35\0\0\x30\xb0\x05\0\x58\x02\0\0\
-\x13\x30\0\0\x0b\x36\0\0\x09\xd0\x05\0\x80\x02\0\0\x13\x30\0\0\x5b\x36\0\0\x1d\
-\xdc\x05\0\xa0\x02\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xa8\x02\0\0\x13\x30\0\0\x7d\
-\x36\0\0\x09\xe0\x05\0\xd0\x02\0\0\x13\x30\0\0\xc7\x36\0\0\x09\xe4\x05\0\xe0\
-\x02\0\0\x13\x30\0\0\xf4\x36\0\0\x01\xf4\x05\0\x5f\x42\0\0\x24\0\0\0\0\0\0\0\
-\x13\x30\0\0\x95\x32\0\0\x0e\x04\x06\0\x10\0\0\0\x13\x30\0\0\xbe\x32\0\0\x13\
-\x08\x06\0\x20\0\0\0\x13\x30\0\0\xbe\x32\0\0\x09\x08\x06\0\x28\0\0\0\x13\x30\0\
-\0\xd7\x32\0\0\x09\x0c\x06\0\x30\0\0\0\x13\x30\0\0\x33\x31\0\0\x0f\x10\x06\0\
-\x40\0\0\0\x13\x30\0\0\xd7\x32\0\0\x0f\x0c\x06\0\x50\0\0\0\x13\x30\0\0\xf7\x32\
-\0\0\x08\x18\x06\0\x60\0\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x68\0\0\0\x13\x30\0\0\
-\x08\x33\0\0\x22\x24\x06\0\x88\0\0\0\x13\x30\0\0\x57\x33\0\0\x08\x28\x06\0\x90\
-\0\0\0\x13\x30\0\0\x66\x33\0\0\x1d\x38\x06\0\x98\0\0\0\x13\x30\0\0\x8a\x33\0\0\
-\x1e\x34\x06\0\xa0\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1c\x34\x06\0\xb0\0\0\0\x13\
-\x30\0\0\xac\x33\0\0\x09\x30\x06\0\xe0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x1e\x3c\
-\x06\0\xf0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x09\x3c\x06\0\x08\x01\0\0\x13\x30\0\0\
-\x38\x34\0\0\x1e\x40\x06\0\x10\x01\0\0\x13\x30\0\0\x5a\x34\0\0\x23\x44\x06\0\
-\x20\x01\0\0\x13\x30\0\0\x66\x33\0\0\x1d\x38\x06\0\x38\x01\0\0\x13\x30\0\0\x83\
-\x34\0\0\x09\x48\x06\0\x60\x01\0\0\x13\x30\0\0\xcc\x34\0\0\x1a\x54\x06\0\x80\
-\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x88\x01\0\0\x13\x30\0\0\xeb\x34\0\0\x09\
-\x58\x06\0\xb0\x01\0\0\x13\x30\0\0\x2e\x35\0\0\x09\x5c\x06\0\xc8\x01\0\0\x13\
-\x30\0\0\0\0\0\0\0\0\0\0\xd0\x01\0\0\x13\x30\0\0\x55\x35\0\0\x28\x68\x06\0\xf0\
-\x01\0\0\x13\x30\0\0\xae\x35\0\0\x08\x6c\x06\0\xf8\x01\0\0\x13\x30\0\0\x7c\x3f\
-\0\0\x31\x70\x06\0\x10\x02\0\0\x13\x30\0\0\xf1\x35\0\0\x15\x74\x06\0\x18\x02\0\
-\0\x13\x30\0\0\x7c\x3f\0\0\x31\x70\x06\0\x58\x02\0\0\x13\x30\0\0\x0b\x36\0\0\
-\x09\x8c\x06\0\x80\x02\0\0\x13\x30\0\0\x5b\x36\0\0\x1d\x98\x06\0\xa0\x02\0\0\
-\x13\x30\0\0\0\0\0\0\0\0\0\0\xa8\x02\0\0\x13\x30\0\0\x7d\x36\0\0\x09\x9c\x06\0\
-\xd0\x02\0\0\x13\x30\0\0\xc7\x36\0\0\x09\xa0\x06\0\xe0\x02\0\0\x13\x30\0\0\xf4\
-\x36\0\0\x01\xb0\x06\0\x75\x42\0\0\x24\0\0\0\0\0\0\0\x13\x30\0\0\x95\x32\0\0\
-\x0e\xc0\x06\0\x10\0\0\0\x13\x30\0\0\xbe\x32\0\0\x13\xc4\x06\0\x20\0\0\0\x13\
-\x30\0\0\xbe\x32\0\0\x09\xc4\x06\0\x28\0\0\0\x13\x30\0\0\xd7\x32\0\0\x09\xc8\
-\x06\0\x30\0\0\0\x13\x30\0\0\x33\x31\0\0\x0f\xcc\x06\0\x40\0\0\0\x13\x30\0\0\
-\xd7\x32\0\0\x0f\xc8\x06\0\x50\0\0\0\x13\x30\0\0\xf7\x32\0\0\x08\xd4\x06\0\x60\
-\0\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x68\0\0\0\x13\x30\0\0\x08\x33\0\0\x22\xe0\
-\x06\0\x88\0\0\0\x13\x30\0\0\x57\x33\0\0\x08\xe4\x06\0\x90\0\0\0\x13\x30\0\0\
-\x66\x33\0\0\x1d\xf4\x06\0\x98\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1e\xf0\x06\0\xa0\
-\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1c\xf0\x06\0\xb0\0\0\0\x13\x30\0\0\xac\x33\0\0\
-\x09\xec\x06\0\xe0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x1e\xf8\x06\0\xf0\0\0\0\x13\
-\x30\0\0\xe9\x33\0\0\x09\xf8\x06\0\x08\x01\0\0\x13\x30\0\0\xae\x3f\0\0\x1e\xfc\
-\x06\0\x10\x01\0\0\x13\x30\0\0\x5a\x34\0\0\x23\0\x07\0\x20\x01\0\0\x13\x30\0\0\
-\x66\x33\0\0\x1d\xf4\x06\0\x38\x01\0\0\x13\x30\0\0\x83\x34\0\0\x09\x04\x07\0\
-\x60\x01\0\0\x13\x30\0\0\xd0\x3f\0\0\x1a\x10\x07\0\x80\x01\0\0\x13\x30\0\0\0\0\
-\0\0\0\0\0\0\x88\x01\0\0\x13\x30\0\0\xeb\x34\0\0\x09\x14\x07\0\xb0\x01\0\0\x13\
-\x30\0\0\x2e\x35\0\0\x09\x18\x07\0\xc8\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xd0\
-\x01\0\0\x13\x30\0\0\x55\x35\0\0\x28\x24\x07\0\xf0\x01\0\0\x13\x30\0\0\xae\x35\
-\0\0\x08\x28\x07\0\xf8\x01\0\0\x13\x30\0\0\xc0\x35\0\0\x30\x2c\x07\0\x10\x02\0\
-\0\x13\x30\0\0\xf1\x35\0\0\x15\x30\x07\0\x18\x02\0\0\x13\x30\0\0\xc0\x35\0\0\
-\x30\x2c\x07\0\x58\x02\0\0\x13\x30\0\0\x0b\x36\0\0\x09\x48\x07\0\x80\x02\0\0\
-\x13\x30\0\0\xef\x3f\0\0\x1d\x54\x07\0\xa0\x02\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\
-\xa8\x02\0\0\x13\x30\0\0\x7d\x36\0\0\x09\x58\x07\0\xd0\x02\0\0\x13\x30\0\0\xc7\
-\x36\0\0\x09\x5c\x07\0\xe0\x02\0\0\x13\x30\0\0\x11\x40\0\0\x05\xbc\x06\0\x93\
-\x42\0\0\x24\0\0\0\0\0\0\0\x13\x30\0\0\x95\x32\0\0\x0e\x7c\x07\0\x10\0\0\0\x13\
-\x30\0\0\xbe\x32\0\0\x13\x80\x07\0\x20\0\0\0\x13\x30\0\0\xbe\x32\0\0\x09\x80\
-\x07\0\x28\0\0\0\x13\x30\0\0\xd7\x32\0\0\x09\x84\x07\0\x30\0\0\0\x13\x30\0\0\
-\x33\x31\0\0\x0f\x88\x07\0\x40\0\0\0\x13\x30\0\0\xd7\x32\0\0\x0f\x84\x07\0\x50\
-\0\0\0\x13\x30\0\0\xf7\x32\0\0\x08\x90\x07\0\x60\0\0\0\x13\x30\0\0\0\0\0\0\0\0\
-\0\0\x68\0\0\0\x13\x30\0\0\x08\x33\0\0\x22\x9c\x07\0\x88\0\0\0\x13\x30\0\0\x57\
-\x33\0\0\x08\xa0\x07\0\x90\0\0\0\x13\x30\0\0\x66\x33\0\0\x1d\xb0\x07\0\x98\0\0\
-\0\x13\x30\0\0\x8a\x33\0\0\x1e\xac\x07\0\xa0\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1c\
-\xac\x07\0\xb0\0\0\0\x13\x30\0\0\xac\x33\0\0\x09\xa8\x07\0\xe0\0\0\0\x13\x30\0\
-\0\xe9\x33\0\0\x1e\xb4\x07\0\xf0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x09\xb4\x07\0\
-\x08\x01\0\0\x13\x30\0\0\xae\x3f\0\0\x1e\xb8\x07\0\x10\x01\0\0\x13\x30\0\0\x5a\
-\x34\0\0\x23\xbc\x07\0\x20\x01\0\0\x13\x30\0\0\x66\x33\0\0\x1d\xb0\x07\0\x38\
-\x01\0\0\x13\x30\0\0\x83\x34\0\0\x09\xc0\x07\0\x60\x01\0\0\x13\x30\0\0\xd0\x3f\
-\0\0\x1a\xcc\x07\0\x80\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x88\x01\0\0\x13\x30\
-\0\0\xeb\x34\0\0\x09\xd0\x07\0\xb0\x01\0\0\x13\x30\0\0\x2e\x35\0\0\x09\xd4\x07\
-\0\xc8\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xd0\x01\0\0\x13\x30\0\0\x55\x35\0\0\
-\x28\xe0\x07\0\xf0\x01\0\0\x13\x30\0\0\xae\x35\0\0\x08\xe4\x07\0\xf8\x01\0\0\
-\x13\x30\0\0\xc0\x35\0\0\x30\xe8\x07\0\x10\x02\0\0\x13\x30\0\0\xf1\x35\0\0\x15\
-\xec\x07\0\x18\x02\0\0\x13\x30\0\0\xc0\x35\0\0\x30\xe8\x07\0\x58\x02\0\0\x13\
-\x30\0\0\x0b\x36\0\0\x09\x04\x08\0\x80\x02\0\0\x13\x30\0\0\xef\x3f\0\0\x1d\x10\
-\x08\0\xa0\x02\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xa8\x02\0\0\x13\x30\0\0\x7d\x36\
-\0\0\x09\x14\x08\0\xd0\x02\0\0\x13\x30\0\0\xc7\x36\0\0\x09\x18\x08\0\xe0\x02\0\
-\0\x13\x30\0\0\x31\x40\0\0\x05\x78\x07\0\xb0\x42\0\0\x24\0\0\0\0\0\0\0\x13\x30\
-\0\0\x95\x32\0\0\x0e\x38\x08\0\x10\0\0\0\x13\x30\0\0\xbe\x32\0\0\x13\x3c\x08\0\
-\x20\0\0\0\x13\x30\0\0\xbe\x32\0\0\x09\x3c\x08\0\x28\0\0\0\x13\x30\0\0\xd7\x32\
-\0\0\x09\x40\x08\0\x30\0\0\0\x13\x30\0\0\x33\x31\0\0\x0f\x44\x08\0\x40\0\0\0\
-\x13\x30\0\0\xd7\x32\0\0\x0f\x40\x08\0\x50\0\0\0\x13\x30\0\0\xf7\x32\0\0\x08\
-\x4c\x08\0\x60\0\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x68\0\0\0\x13\x30\0\0\x08\x33\
-\0\0\x22\x58\x08\0\x88\0\0\0\x13\x30\0\0\x57\x33\0\0\x08\x5c\x08\0\x90\0\0\0\
-\x13\x30\0\0\x66\x33\0\0\x1d\x6c\x08\0\x98\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1e\
-\x68\x08\0\xa0\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1c\x68\x08\0\xb0\0\0\0\x13\x30\0\
-\0\xac\x33\0\0\x09\x64\x08\0\xe0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x1e\x70\x08\0\
-\xf0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x09\x70\x08\0\x08\x01\0\0\x13\x30\0\0\x50\
-\x40\0\0\x1e\x74\x08\0\x10\x01\0\0\x13\x30\0\0\x5a\x34\0\0\x23\x78\x08\0\x20\
-\x01\0\0\x13\x30\0\0\x66\x33\0\0\x1d\x6c\x08\0\x38\x01\0\0\x13\x30\0\0\x83\x34\
-\0\0\x09\x7c\x08\0\x60\x01\0\0\x13\x30\0\0\x72\x40\0\0\x1a\x88\x08\0\x80\x01\0\
-\0\x13\x30\0\0\0\0\0\0\0\0\0\0\x88\x01\0\0\x13\x30\0\0\xeb\x34\0\0\x09\x8c\x08\
-\0\xb0\x01\0\0\x13\x30\0\0\x2e\x35\0\0\x09\x90\x08\0\xc8\x01\0\0\x13\x30\0\0\0\
-\0\0\0\0\0\0\0\xd0\x01\0\0\x13\x30\0\0\x55\x35\0\0\x28\x9c\x08\0\xf0\x01\0\0\
-\x13\x30\0\0\xae\x35\0\0\x08\xa0\x08\0\xf8\x01\0\0\x13\x30\0\0\xc0\x35\0\0\x30\
-\xa4\x08\0\x18\x02\0\0\x13\x30\0\0\xf1\x35\0\0\x15\xa8\x08\0\x20\x02\0\0\x13\
-\x30\0\0\xc0\x35\0\0\x30\xa4\x08\0\x60\x02\0\0\x13\x30\0\0\x0b\x36\0\0\x09\xc0\
-\x08\0\x88\x02\0\0\x13\x30\0\0\x91\x40\0\0\x1d\xcc\x08\0\xa8\x02\0\0\x13\x30\0\
-\0\0\0\0\0\0\0\0\0\xb0\x02\0\0\x13\x30\0\0\x7d\x36\0\0\x09\xd0\x08\0\xd8\x02\0\
-\0\x13\x30\0\0\xc7\x36\0\0\x09\xd4\x08\0\xe8\x02\0\0\x13\x30\0\0\xb3\x40\0\0\
-\x05\x34\x08\0\xd1\x42\0\0\x24\0\0\0\0\0\0\0\x13\x30\0\0\x95\x32\0\0\x0e\xf8\
-\x08\0\x10\0\0\0\x13\x30\0\0\xbe\x32\0\0\x13\xfc\x08\0\x20\0\0\0\x13\x30\0\0\
-\xbe\x32\0\0\x09\xfc\x08\0\x28\0\0\0\x13\x30\0\0\xd7\x32\0\0\x09\0\x09\0\x30\0\
-\0\0\x13\x30\0\0\x33\x31\0\0\x0f\x04\x09\0\x40\0\0\0\x13\x30\0\0\xd7\x32\0\0\
-\x0f\0\x09\0\x50\0\0\0\x13\x30\0\0\xf7\x32\0\0\x08\x0c\x09\0\x60\0\0\0\x13\x30\
-\0\0\0\0\0\0\0\0\0\0\x68\0\0\0\x13\x30\0\0\x08\x33\0\0\x22\x18\x09\0\x88\0\0\0\
-\x13\x30\0\0\x57\x33\0\0\x08\x1c\x09\0\x90\0\0\0\x13\x30\0\0\x66\x33\0\0\x1d\
-\x2c\x09\0\x98\0\0\0\x13\x30\0\0\x8a\x33\0\0\x1e\x28\x09\0\xa0\0\0\0\x13\x30\0\
-\0\x8a\x33\0\0\x1c\x28\x09\0\xb0\0\0\0\x13\x30\0\0\xac\x33\0\0\x09\x24\x09\0\
-\xe0\0\0\0\x13\x30\0\0\xe9\x33\0\0\x1e\x30\x09\0\xf0\0\0\0\x13\x30\0\0\xe9\x33\
-\0\0\x09\x30\x09\0\x08\x01\0\0\x13\x30\0\0\x50\x40\0\0\x1e\x34\x09\0\x10\x01\0\
-\0\x13\x30\0\0\x5a\x34\0\0\x23\x38\x09\0\x20\x01\0\0\x13\x30\0\0\x66\x33\0\0\
-\x1d\x2c\x09\0\x38\x01\0\0\x13\x30\0\0\x83\x34\0\0\x09\x3c\x09\0\x60\x01\0\0\
-\x13\x30\0\0\x72\x40\0\0\x1a\x48\x09\0\x80\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\
-\x88\x01\0\0\x13\x30\0\0\xeb\x34\0\0\x09\x4c\x09\0\xb0\x01\0\0\x13\x30\0\0\x2e\
-\x35\0\0\x09\x50\x09\0\xc8\x01\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xd0\x01\0\0\x13\
-\x30\0\0\x55\x35\0\0\x28\x5c\x09\0\xf0\x01\0\0\x13\x30\0\0\xae\x35\0\0\x08\x60\
-\x09\0\xf8\x01\0\0\x13\x30\0\0\xc0\x35\0\0\x30\x64\x09\0\x18\x02\0\0\x13\x30\0\
-\0\xf1\x35\0\0\x15\x68\x09\0\x20\x02\0\0\x13\x30\0\0\xc0\x35\0\0\x30\x64\x09\0\
-\x60\x02\0\0\x13\x30\0\0\x0b\x36\0\0\x09\x80\x09\0\x88\x02\0\0\x13\x30\0\0\x91\
-\x40\0\0\x1d\x8c\x09\0\xa8\x02\0\0\x13\x30\0\0\0\0\0\0\0\0\0\0\xb0\x02\0\0\x13\
-\x30\0\0\x7d\x36\0\0\x09\x90\x09\0\xd8\x02\0\0\x13\x30\0\0\xc7\x36\0\0\x09\x94\
-\x09\0\xe8\x02\0\0\x13\x30\0\0\xd4\x40\0\0\x05\xf4\x08\0\xf1\x42\0\0\x09\0\0\0\
-\0\0\0\0\x13\x30\0\0\xf4\x40\0\0\x14\xb4\x09\0\x08\0\0\0\x13\x30\0\0\x23\x41\0\
-\0\x09\xb8\x09\0\x20\0\0\0\x13\x30\0\0\x4a\x41\0\0\x11\xc0\x09\0\x48\0\0\0\x13\
-\x30\0\0\0\0\0\0\0\0\0\0\x50\0\0\0\x13\x30\0\0\x68\x41\0\0\x08\xcc\x09\0\x68\0\
-\0\0\x13\x30\0\0\x68\x41\0\0\x08\xcc\x09\0\x78\0\0\0\x13\x30\0\0\0\0\0\0\0\0\0\
-\0\x80\0\0\0\x13\x30\0\0\xa6\x41\0\0\x09\xd0\x09\0\x98\0\0\0\x13\x30\0\0\xdc\
-\x41\0\0\x05\xb0\x09\0\x10\0\0\0\x2f\x42\0\0\x04\0\0\0\0\0\0\0\x2c\0\0\0\xff\
-\x41\0\0\0\0\0\0\x78\0\0\0\x30\0\0\0\x04\x42\0\0\0\0\0\0\xb0\0\0\0\x3e\0\0\0\
-\x08\x42\0\0\0\0\0\0\xe8\0\0\0\x3e\0\0\0\x0d\x42\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x20\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x66\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x09\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xa8\x05\0\0\0\0\0\0\x38\x07\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\
-\x18\0\0\0\0\0\0\0\x11\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe0\
-\x0c\0\0\0\0\0\0\xc8\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x17\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa8\x11\0\0\0\0\
-\0\0\x58\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2f\
-\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x13\0\0\0\0\0\0\xf0\x02\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x47\0\0\0\x01\0\0\
-\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf0\x15\0\0\0\0\0\0\xf0\x02\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5d\0\0\0\x01\0\0\0\x06\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x18\0\0\0\0\0\0\xf0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xd0\x1b\0\0\0\0\0\0\xf0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x98\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xc0\x1e\0\0\0\0\0\0\xf8\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xb9\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x21\0\0\
-\0\0\0\0\xf8\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xd9\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\x24\0\0\0\0\0\0\xa8\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xfd\0\0\0\x01\
-\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x25\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\x01\0\0\x01\0\0\0\x03\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x68\x25\0\0\0\0\0\0\xd0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\x01\0\0\x01\0\0\0\x02\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x38\x26\0\0\0\0\0\0\x9c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x48\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\xd8\x26\0\0\0\0\0\0\xc0\0\0\0\0\0\0\0\x02\0\0\0\x03\0\0\0\x08\0\0\0\0\0\0\
-\0\x10\0\0\0\0\0\0\0\x52\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x98\x27\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\
-\x10\0\0\0\0\0\0\0\x6e\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\
-\x27\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\x02\0\0\0\x05\0\0\0\x08\0\0\0\0\0\0\0\x10\0\
-\0\0\0\0\0\0\x8a\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\x28\0\
-\0\0\0\0\0\x80\0\0\0\0\0\0\0\x02\0\0\0\x06\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\
-\0\0\0\xa4\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x28\0\0\0\0\
-\0\0\x80\0\0\0\0\0\0\0\x02\0\0\0\x07\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\
-\xc6\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\x29\0\0\0\0\0\0\
-\x80\0\0\0\0\0\0\0\x02\0\0\0\x08\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xe7\
-\x04\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x29\0\0\0\0\0\0\x80\0\
-\0\0\0\0\0\0\x02\0\0\0\x09\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x0c\x05\0\
-\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x38\x2a\0\0\0\0\0\0\x80\0\0\0\0\
-\0\0\0\x02\0\0\0\x0a\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x30\x05\0\0\x09\
-\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x2a\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\
-\x02\0\0\0\x0b\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x58\x05\0\0\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd8\x2a\0\0\0\0\0\0\x15\x8e\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5d\x05\0\0\x01\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\xf0\xb8\0\0\0\0\0\0\xc4\x15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
-
- *sz = sizeof(data) - 1;
- return (const void *)data;
-}
-
-#ifdef __cplusplus
-struct mm_stats_bpf *mm_stats_bpf::open(const struct bpf_object_open_opts *opts) { return mm_stats_bpf__open_opts(opts); }
-struct mm_stats_bpf *mm_stats_bpf::open_and_load() { return mm_stats_bpf__open_and_load(); }
-int mm_stats_bpf::load(struct mm_stats_bpf *skel) { return mm_stats_bpf__load(skel); }
-int mm_stats_bpf::attach(struct mm_stats_bpf *skel) { return mm_stats_bpf__attach(skel); }
-void mm_stats_bpf::detach(struct mm_stats_bpf *skel) { mm_stats_bpf__detach(skel); }
-void mm_stats_bpf::destroy(struct mm_stats_bpf *skel) { mm_stats_bpf__destroy(skel); }
-const void *mm_stats_bpf::elf_bytes(size_t *sz) { return mm_stats_bpf__elf_bytes(sz); }
-#endif /* __cplusplus */
-
-__attribute__((unused)) static void
-mm_stats_bpf__assert(struct mm_stats_bpf *s __attribute__((unused)))
-{
-#ifdef __cplusplus
-#define _Static_assert static_assert
-#endif
-#ifdef __cplusplus
-#undef _Static_assert
-#endif
-}
-
-#endif /* __MM_STATS_BPF_SKEL_H__ */
diff --git a/.output/mm_stats.tmp.bpf.o b/.output/mm_stats.tmp.bpf.o
deleted file mode 100644
index bb3773d..0000000
Binary files a/.output/mm_stats.tmp.bpf.o and /dev/null differ
diff --git a/.output/net_stats.bpf.o b/.output/net_stats.bpf.o
deleted file mode 100644
index a044819..0000000
Binary files a/.output/net_stats.bpf.o and /dev/null differ
diff --git a/.output/net_stats.skel.h b/.output/net_stats.skel.h
deleted file mode 100644
index d238143..0000000
--- a/.output/net_stats.skel.h
+++ /dev/null
@@ -1,2845 +0,0 @@
-/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
-
-/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
-#ifndef __NET_STATS_BPF_SKEL_H__
-#define __NET_STATS_BPF_SKEL_H__
-
-#include
-#include
-#include
-
-#define BPF_SKEL_SUPPORTS_MAP_AUTO_ATTACH 1
-
-struct net_stats_bpf {
- struct bpf_object_skeleton *skeleton;
- struct bpf_object *obj;
- struct {
- struct bpf_map *tcprtt_map;
- struct bpf_map *tcprtt_buffer;
- struct bpf_map *net_latency_start;
- struct bpf_map *ipv4_top_map;
- struct bpf_map *ipv6_top_map;
- struct bpf_map *top_sock_store;
- struct bpf_map *net_latency_buffer;
- struct bpf_map *tcptop_buffer;
- struct bpf_map *tcpretrans_buffer;
- struct bpf_map *rodata;
- } maps;
- struct {
- struct bpf_program *trace_retransmit;
- struct bpf_program *top_tcp_send_entry;
- struct bpf_program *top_tcp_send_ret;
- struct bpf_program *top_tcp_recv_entry;
- struct bpf_program *tcp_v4_connect;
- struct bpf_program *tcp_v6_connect;
- struct bpf_program *tcp_rcv_state_process;
- struct bpf_program *fentry_tcp_v4_connect;
- struct bpf_program *fentry_tcp_v6_connect;
- struct bpf_program *fentry_tcp_rcv_state_process;
- struct bpf_program *tcprtt;
- struct bpf_program *handle_tcprtt_event;
- } progs;
- struct {
- struct bpf_link *trace_retransmit;
- struct bpf_link *top_tcp_send_entry;
- struct bpf_link *top_tcp_send_ret;
- struct bpf_link *top_tcp_recv_entry;
- struct bpf_link *tcp_v4_connect;
- struct bpf_link *tcp_v6_connect;
- struct bpf_link *tcp_rcv_state_process;
- struct bpf_link *fentry_tcp_v4_connect;
- struct bpf_link *fentry_tcp_v6_connect;
- struct bpf_link *fentry_tcp_rcv_state_process;
- struct bpf_link *tcprtt;
- struct bpf_link *handle_tcprtt_event;
- } links;
- struct net_stats_bpf__rodata {
- u32 zero;
- } *rodata;
-
-#ifdef __cplusplus
- static inline struct net_stats_bpf *open(const struct bpf_object_open_opts *opts = nullptr);
- static inline struct net_stats_bpf *open_and_load();
- static inline int load(struct net_stats_bpf *skel);
- static inline int attach(struct net_stats_bpf *skel);
- static inline void detach(struct net_stats_bpf *skel);
- static inline void destroy(struct net_stats_bpf *skel);
- static inline const void *elf_bytes(size_t *sz);
-#endif /* __cplusplus */
-};
-
-static void
-net_stats_bpf__destroy(struct net_stats_bpf *obj)
-{
- if (!obj)
- return;
- if (obj->skeleton)
- bpf_object__destroy_skeleton(obj->skeleton);
- free(obj);
-}
-
-static inline int
-net_stats_bpf__create_skeleton(struct net_stats_bpf *obj);
-
-static inline struct net_stats_bpf *
-net_stats_bpf__open_opts(const struct bpf_object_open_opts *opts)
-{
- struct net_stats_bpf *obj;
- int err;
-
- obj = (struct net_stats_bpf *)calloc(1, sizeof(*obj));
- if (!obj) {
- errno = ENOMEM;
- return NULL;
- }
-
- err = net_stats_bpf__create_skeleton(obj);
- if (err)
- goto err_out;
-
- err = bpf_object__open_skeleton(obj->skeleton, opts);
- if (err)
- goto err_out;
-
- return obj;
-err_out:
- net_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
-}
-
-static inline struct net_stats_bpf *
-net_stats_bpf__open(void)
-{
- return net_stats_bpf__open_opts(NULL);
-}
-
-static inline int
-net_stats_bpf__load(struct net_stats_bpf *obj)
-{
- return bpf_object__load_skeleton(obj->skeleton);
-}
-
-static inline struct net_stats_bpf *
-net_stats_bpf__open_and_load(void)
-{
- struct net_stats_bpf *obj;
- int err;
-
- obj = net_stats_bpf__open();
- if (!obj)
- return NULL;
- err = net_stats_bpf__load(obj);
- if (err) {
- net_stats_bpf__destroy(obj);
- errno = -err;
- return NULL;
- }
- return obj;
-}
-
-static inline int
-net_stats_bpf__attach(struct net_stats_bpf *obj)
-{
- return bpf_object__attach_skeleton(obj->skeleton);
-}
-
-static inline void
-net_stats_bpf__detach(struct net_stats_bpf *obj)
-{
- bpf_object__detach_skeleton(obj->skeleton);
-}
-
-static inline const void *net_stats_bpf__elf_bytes(size_t *sz);
-
-static inline int
-net_stats_bpf__create_skeleton(struct net_stats_bpf *obj)
-{
- struct bpf_object_skeleton *s;
- struct bpf_map_skeleton *map __attribute__((unused));
- int err;
-
- s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));
- if (!s) {
- err = -ENOMEM;
- goto err;
- }
-
- s->sz = sizeof(*s);
- s->name = "net_stats_bpf";
- s->obj = &obj->obj;
-
- /* maps */
- s->map_cnt = 10;
- s->map_skel_sz = 24;
- s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt,
- sizeof(*s->maps) > 24 ? sizeof(*s->maps) : 24);
- if (!s->maps) {
- err = -ENOMEM;
- goto err;
- }
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 0 * s->map_skel_sz);
- map->name = "tcprtt_map";
- map->map = &obj->maps.tcprtt_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 1 * s->map_skel_sz);
- map->name = "tcprtt_buffer";
- map->map = &obj->maps.tcprtt_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 2 * s->map_skel_sz);
- map->name = "net_latency_start";
- map->map = &obj->maps.net_latency_start;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 3 * s->map_skel_sz);
- map->name = "ipv4_top_map";
- map->map = &obj->maps.ipv4_top_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 4 * s->map_skel_sz);
- map->name = "ipv6_top_map";
- map->map = &obj->maps.ipv6_top_map;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 5 * s->map_skel_sz);
- map->name = "top_sock_store";
- map->map = &obj->maps.top_sock_store;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 6 * s->map_skel_sz);
- map->name = "net_latency_buffer";
- map->map = &obj->maps.net_latency_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 7 * s->map_skel_sz);
- map->name = "tcptop_buffer";
- map->map = &obj->maps.tcptop_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 8 * s->map_skel_sz);
- map->name = "tcpretrans_buffer";
- map->map = &obj->maps.tcpretrans_buffer;
-
- map = (struct bpf_map_skeleton *)((char *)s->maps + 9 * s->map_skel_sz);
- map->name = "net_stat.rodata";
- map->map = &obj->maps.rodata;
- map->mmaped = (void **)&obj->rodata;
-
- /* programs */
- s->prog_cnt = 12;
- s->prog_skel_sz = sizeof(*s->progs);
- s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);
- if (!s->progs) {
- err = -ENOMEM;
- goto err;
- }
-
- s->progs[0].name = "trace_retransmit";
- s->progs[0].prog = &obj->progs.trace_retransmit;
- s->progs[0].link = &obj->links.trace_retransmit;
-
- s->progs[1].name = "top_tcp_send_entry";
- s->progs[1].prog = &obj->progs.top_tcp_send_entry;
- s->progs[1].link = &obj->links.top_tcp_send_entry;
-
- s->progs[2].name = "top_tcp_send_ret";
- s->progs[2].prog = &obj->progs.top_tcp_send_ret;
- s->progs[2].link = &obj->links.top_tcp_send_ret;
-
- s->progs[3].name = "top_tcp_recv_entry";
- s->progs[3].prog = &obj->progs.top_tcp_recv_entry;
- s->progs[3].link = &obj->links.top_tcp_recv_entry;
-
- s->progs[4].name = "tcp_v4_connect";
- s->progs[4].prog = &obj->progs.tcp_v4_connect;
- s->progs[4].link = &obj->links.tcp_v4_connect;
-
- s->progs[5].name = "tcp_v6_connect";
- s->progs[5].prog = &obj->progs.tcp_v6_connect;
- s->progs[5].link = &obj->links.tcp_v6_connect;
-
- s->progs[6].name = "tcp_rcv_state_process";
- s->progs[6].prog = &obj->progs.tcp_rcv_state_process;
- s->progs[6].link = &obj->links.tcp_rcv_state_process;
-
- s->progs[7].name = "fentry_tcp_v4_connect";
- s->progs[7].prog = &obj->progs.fentry_tcp_v4_connect;
- s->progs[7].link = &obj->links.fentry_tcp_v4_connect;
-
- s->progs[8].name = "fentry_tcp_v6_connect";
- s->progs[8].prog = &obj->progs.fentry_tcp_v6_connect;
- s->progs[8].link = &obj->links.fentry_tcp_v6_connect;
-
- s->progs[9].name = "fentry_tcp_rcv_state_process";
- s->progs[9].prog = &obj->progs.fentry_tcp_rcv_state_process;
- s->progs[9].link = &obj->links.fentry_tcp_rcv_state_process;
-
- s->progs[10].name = "tcprtt";
- s->progs[10].prog = &obj->progs.tcprtt;
- s->progs[10].link = &obj->links.tcprtt;
-
- s->progs[11].name = "handle_tcprtt_event";
- s->progs[11].prog = &obj->progs.handle_tcprtt_event;
- s->progs[11].link = &obj->links.handle_tcprtt_event;
-
- s->data = net_stats_bpf__elf_bytes(&s->data_sz);
-
- obj->skeleton = s;
- return 0;
-err:
- bpf_object__destroy_skeleton(s);
- return err;
-}
-
-static inline const void *net_stats_bpf__elf_bytes(size_t *sz)
-{
- static const char data[] __attribute__((__aligned__(8))) = "\
-\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xef\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x22\0\x01\
-\0\0\x2e\x73\x74\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x74\x65\
-\x78\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\x2f\x74\x63\x70\x2f\x74\x63\
-\x70\x5f\x72\x65\x74\x72\x61\x6e\x73\x6d\x69\x74\x5f\x73\x6b\x62\0\x6b\x70\x72\
-\x6f\x62\x65\x2f\x74\x63\x70\x5f\x73\x65\x6e\x64\x6d\x73\x67\0\x6b\x72\x65\x74\
-\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x73\x65\x6e\x64\x6d\x73\x67\0\x6b\x70\
-\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x63\x6c\x65\x61\x6e\x75\x70\x5f\x72\x62\
-\x75\x66\0\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x76\x34\x5f\x63\x6f\x6e\
-\x6e\x65\x63\x74\0\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x76\x36\x5f\x63\
-\x6f\x6e\x6e\x65\x63\x74\0\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x72\x63\
-\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x66\x65\x6e\x74\
-\x72\x79\x2f\x74\x63\x70\x5f\x76\x34\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x66\x65\
-\x6e\x74\x72\x79\x2f\x74\x63\x70\x5f\x76\x36\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\
-\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\
-\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\
-\x5f\x72\x63\x76\x5f\x65\x73\x74\x61\x62\x6c\x69\x73\x68\x65\x64\0\x70\x65\x72\
-\x66\x5f\x65\x76\x65\x6e\x74\0\x6c\x69\x63\x65\x6e\x73\x65\0\x2e\x72\x6f\x64\
-\x61\x74\x61\0\x2e\x6d\x61\x70\x73\0\x6e\x65\x74\x5f\x73\x74\x61\x74\x73\x2e\
-\x62\x70\x66\x2e\x63\0\x4c\x42\x42\x30\x5f\x31\x33\0\x4c\x42\x42\x30\x5f\x34\0\
-\x4c\x42\x42\x30\x5f\x37\0\x74\x63\x70\x5f\x6b\x70\x72\x6f\x62\x65\x5f\x72\x65\
-\x74\x72\x61\x6e\x73\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\
-\x4c\x42\x42\x30\x5f\x31\x30\0\x4c\x42\x42\x30\x5f\x31\x32\0\x4c\x42\x42\x30\
-\x5f\x31\x31\0\x4c\x42\x42\x32\x5f\x33\x32\0\x4c\x42\x42\x32\x5f\x33\x31\0\x4c\
-\x42\x42\x32\x5f\x31\x37\0\x4c\x42\x42\x32\x5f\x31\x31\0\x4c\x42\x42\x32\x5f\
-\x38\0\x4c\x42\x42\x32\x5f\x31\x30\0\x4c\x42\x42\x32\x5f\x39\0\x74\x63\x70\x5f\
-\x74\x6f\x70\x5f\x72\x69\x6e\x67\x62\x75\x66\x66\x5f\x73\x65\x6e\x64\x2e\x5f\
-\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x32\x5f\x32\x34\0\x4c\x42\x42\x32\x5f\
-\x32\x31\0\x4c\x42\x42\x32\x5f\x32\x33\0\x4c\x42\x42\x32\x5f\x31\x34\0\x4c\x42\
-\x42\x32\x5f\x31\x36\0\x4c\x42\x42\x32\x5f\x32\x37\0\x4c\x42\x42\x32\x5f\x32\
-\x39\0\x4c\x42\x42\x32\x5f\x33\x30\0\x4c\x42\x42\x33\x5f\x33\x30\0\x4c\x42\x42\
-\x33\x5f\x31\x36\0\x4c\x42\x42\x33\x5f\x31\x30\0\x4c\x42\x42\x33\x5f\x37\0\x4c\
-\x42\x42\x33\x5f\x39\0\x4c\x42\x42\x33\x5f\x38\0\x4c\x42\x42\x33\x5f\x32\x33\0\
-\x4c\x42\x42\x33\x5f\x32\x30\0\x4c\x42\x42\x33\x5f\x32\x32\0\x4c\x42\x42\x33\
-\x5f\x31\x33\0\x4c\x42\x42\x33\x5f\x31\x35\0\x4c\x42\x42\x33\x5f\x32\x36\0\x4c\
-\x42\x42\x33\x5f\x32\x38\0\x4c\x42\x42\x33\x5f\x32\x39\0\x4c\x42\x42\x34\x5f\
-\x32\0\x4c\x42\x42\x35\x5f\x32\0\x68\x61\x6e\x64\x6c\x65\x5f\x74\x63\x70\x5f\
-\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x4c\x42\
-\x42\x37\x5f\x32\0\x4c\x42\x42\x38\x5f\x32\0\x4c\x42\x42\x31\x30\x5f\x32\0\x4c\
-\x42\x42\x31\x30\x5f\x31\x31\0\x4c\x42\x42\x31\x30\x5f\x31\x30\0\x4c\x42\x42\
-\x31\x31\x5f\x32\0\x68\x61\x6e\x64\x6c\x65\x5f\x74\x63\x70\x72\x74\x74\x5f\x65\
-\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x31\x31\x5f\x35\
-\0\x4c\x42\x42\x31\x31\x5f\x34\0\x68\x61\x6e\x64\x6c\x65\x5f\x74\x63\x70\x72\
-\x74\x74\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\x4c\
-\x42\x42\x31\x32\x5f\x38\0\x4c\x42\x42\x31\x32\x5f\x34\0\x68\x61\x6e\x64\x6c\
-\x65\x5f\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\
-\x63\x65\x73\x73\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x4c\x42\x42\x31\x32\x5f\x36\
-\0\x4c\x42\x42\x31\x32\x5f\x37\0\x74\x72\x61\x63\x65\x5f\x72\x65\x74\x72\x61\
-\x6e\x73\x6d\x69\x74\0\x74\x63\x70\x72\x65\x74\x72\x61\x6e\x73\x5f\x62\x75\x66\
-\x66\x65\x72\0\x74\x6f\x70\x5f\x74\x63\x70\x5f\x73\x65\x6e\x64\x5f\x65\x6e\x74\
-\x72\x79\0\x74\x6f\x70\x5f\x73\x6f\x63\x6b\x5f\x73\x74\x6f\x72\x65\0\x74\x6f\
-\x70\x5f\x74\x63\x70\x5f\x73\x65\x6e\x64\x5f\x72\x65\x74\0\x69\x70\x76\x34\x5f\
-\x74\x6f\x70\x5f\x6d\x61\x70\0\x74\x63\x70\x74\x6f\x70\x5f\x62\x75\x66\x66\x65\
-\x72\0\x69\x70\x76\x36\x5f\x74\x6f\x70\x5f\x6d\x61\x70\0\x74\x6f\x70\x5f\x74\
-\x63\x70\x5f\x72\x65\x63\x76\x5f\x65\x6e\x74\x72\x79\0\x74\x63\x70\x5f\x76\x34\
-\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x6e\x65\x74\x5f\x6c\x61\x74\x65\x6e\x63\x79\
-\x5f\x73\x74\x61\x72\x74\0\x74\x63\x70\x5f\x76\x36\x5f\x63\x6f\x6e\x6e\x65\x63\
-\x74\0\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\
-\x65\x73\x73\0\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\x76\x34\x5f\x63\x6f\
-\x6e\x6e\x65\x63\x74\0\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\x76\x36\x5f\
-\x63\x6f\x6e\x6e\x65\x63\x74\0\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\x72\
-\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x74\x63\x70\
-\x72\x74\x74\0\x74\x63\x70\x72\x74\x74\x5f\x6d\x61\x70\0\x7a\x65\x72\x6f\0\x68\
-\x61\x6e\x64\x6c\x65\x5f\x74\x63\x70\x72\x74\x74\x5f\x65\x76\x65\x6e\x74\0\x74\
-\x63\x70\x72\x74\x74\x5f\x62\x75\x66\x66\x65\x72\0\x6e\x65\x74\x5f\x6c\x61\x74\
-\x65\x6e\x63\x79\x5f\x62\x75\x66\x66\x65\x72\0\x4c\x49\x43\x45\x4e\x53\x45\0\
-\x2e\x72\x65\x6c\x2e\x74\x65\x78\x74\0\x2e\x72\x65\x6c\x74\x72\x61\x63\x65\x70\
-\x6f\x69\x6e\x74\x2f\x74\x63\x70\x2f\x74\x63\x70\x5f\x72\x65\x74\x72\x61\x6e\
-\x73\x6d\x69\x74\x5f\x73\x6b\x62\0\x2e\x72\x65\x6c\x6b\x70\x72\x6f\x62\x65\x2f\
-\x74\x63\x70\x5f\x73\x65\x6e\x64\x6d\x73\x67\0\x2e\x72\x65\x6c\x6b\x72\x65\x74\
-\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x73\x65\x6e\x64\x6d\x73\x67\0\x2e\x72\
-\x65\x6c\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x63\x6c\x65\x61\x6e\x75\
-\x70\x5f\x72\x62\x75\x66\0\x2e\x72\x65\x6c\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\
-\x70\x5f\x76\x34\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x2e\x72\x65\x6c\x6b\x70\x72\
-\x6f\x62\x65\x2f\x74\x63\x70\x5f\x76\x36\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x2e\
-\x72\x65\x6c\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\
-\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x2e\x72\x65\x6c\x66\x65\x6e\
-\x74\x72\x79\x2f\x74\x63\x70\x5f\x76\x34\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x2e\
-\x72\x65\x6c\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\x5f\x76\x36\x5f\x63\x6f\
-\x6e\x6e\x65\x63\x74\0\x2e\x72\x65\x6c\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\
-\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x2e\
-\x72\x65\x6c\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\x5f\x72\x63\x76\x5f\x65\
-\x73\x74\x61\x62\x6c\x69\x73\x68\x65\x64\0\x2e\x72\x65\x6c\x70\x65\x72\x66\x5f\
-\x65\x76\x65\x6e\x74\0\x2e\x42\x54\x46\0\x2e\x42\x54\x46\x2e\x65\x78\x74\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x48\x01\0\0\x04\0\
-\xf1\xff\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x01\0\0\
-\0\0\x04\0\x78\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x60\x01\0\0\0\0\x04\0\xb0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x67\x01\0\0\0\0\x04\0\x38\x02\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x6e\x01\0\0\x01\0\x11\0\x3b\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x8f\x01\0\0\0\
-\0\x04\0\xc8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x97\x01\0\0\0\0\x04\0\x60\x04\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x9f\x01\0\0\0\0\x04\0\x40\x04\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x03\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x06\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa7\x01\0\0\0\0\x06\0\x20\x0e\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\xaf\x01\0\0\0\0\x06\0\xf8\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x01\0\
-\0\0\0\x06\0\xf0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x01\0\0\0\0\x06\0\xb8\x06\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc7\x01\0\0\0\0\x06\0\x78\x03\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xce\x01\0\0\0\0\x06\0\x50\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd6\x01\0\0\
-\0\0\x06\0\xc8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xdd\x01\0\0\x01\0\x11\0\x5b\0\0\
-\0\0\0\0\0\x1b\0\0\0\0\0\0\0\xfb\x01\0\0\0\0\x06\0\xb8\x07\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x03\x02\0\0\0\0\x06\0\x60\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0b\x02\0\0\
-\0\0\x06\0\x88\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x13\x02\0\0\0\0\x06\0\x70\x07\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x1b\x02\0\0\0\0\x06\0\xb0\x08\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x23\x02\0\0\0\0\x06\0\x68\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2b\x02\0\0\0\
-\0\x06\0\xe8\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x33\x02\0\0\0\0\x06\0\xe8\x0d\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x3b\x02\0\0\0\0\x07\0\xb0\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x43\x02\0\0\0\0\x07\
-\0\xa8\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4b\x02\0\0\0\0\x07\0\x70\x06\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x53\x02\0\0\0\0\x07\0\x30\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x5a\x02\0\0\0\0\x07\0\x08\x0b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\x02\0\0\0\0\x07\
-\0\x80\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x68\x02\0\0\0\0\x07\0\x70\x07\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x70\x02\0\0\0\0\x07\0\x18\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x78\x02\0\0\0\0\x07\0\x40\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x02\0\0\0\0\x07\
-\0\x28\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x88\x02\0\0\0\0\x07\0\x68\x08\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x90\x02\0\0\0\0\x07\0\x20\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x98\x02\0\0\0\0\x07\0\xa0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa0\x02\0\0\0\0\x07\
-\0\xa0\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x08\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xa8\x02\0\0\0\0\x08\0\xd0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xaf\x02\0\0\0\0\x09\0\xd0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb6\
-\x02\0\0\x02\0\x03\0\0\0\0\0\0\0\0\0\xc0\x03\0\0\0\0\0\0\0\0\0\0\x03\0\x0b\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd3\x02\0\0\0\0\x0b\0\xd0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x03\0\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xda\x02\0\0\0\0\
-\x0c\0\xd0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0d\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe1\x02\0\0\
-\0\0\x0e\0\xe0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe9\x02\0\0\0\0\x0e\0\x38\x02\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xf2\x02\0\0\0\0\x0e\0\xd0\x01\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x03\0\x0f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xfb\x02\0\0\0\0\x0f\0\
-\x60\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\x03\0\0\x01\0\x11\0\x04\0\0\0\0\0\0\0\
-\x1c\0\0\0\0\0\0\0\x1f\x03\0\0\0\0\x0f\0\x98\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x27\x03\0\0\0\0\x0f\0\xc0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2f\x03\0\0\x01\0\x11\
-\0\x20\0\0\0\0\0\0\0\x1b\0\0\0\0\0\0\0\x4d\x03\0\0\0\0\x03\0\xb8\x03\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\x55\x03\0\0\0\0\x03\0\x10\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x5d\x03\0\0\x01\0\x11\0\x76\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x82\x03\0\0\0\0\
-\x03\0\x38\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8a\x03\0\0\0\0\x03\0\xa0\x03\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x92\
-\x03\0\0\x12\0\x04\0\0\0\0\0\0\0\0\0\x88\x04\0\0\0\0\0\0\xa3\x03\0\0\x11\0\x12\
-\0\xd0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xb5\x03\0\0\x12\0\x05\0\0\0\0\0\0\0\0\0\
-\x70\0\0\0\0\0\0\0\xc8\x03\0\0\x11\0\x12\0\x90\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\
-\xd7\x03\0\0\x12\0\x06\0\0\0\0\0\0\0\0\0\x30\x0e\0\0\0\0\0\0\xe8\x03\0\0\x11\0\
-\x12\0\x50\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xf5\x03\0\0\x11\0\x12\0\xc0\0\0\0\0\
-\0\0\0\x10\0\0\0\0\0\0\0\x03\x04\0\0\x11\0\x12\0\x70\0\0\0\0\0\0\0\x20\0\0\0\0\
-\0\0\0\x10\x04\0\0\x12\0\x07\0\0\0\0\0\0\0\0\0\xc0\x0d\0\0\0\0\0\0\x23\x04\0\0\
-\x12\0\x08\0\0\0\0\0\0\0\0\0\xe0\0\0\0\0\0\0\0\x32\x04\0\0\x11\0\x12\0\x30\0\0\
-\0\0\0\0\0\x20\0\0\0\0\0\0\0\x44\x04\0\0\x12\0\x09\0\0\0\0\0\0\0\0\0\xe0\0\0\0\
-\0\0\0\0\x53\x04\0\0\x12\0\x0a\0\0\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x69\x04\0\0\
-\x12\0\x0b\0\0\0\0\0\0\0\0\0\xe0\0\0\0\0\0\0\0\x7f\x04\0\0\x12\0\x0c\0\0\0\0\0\
-\0\0\0\0\xe0\0\0\0\0\0\0\0\x95\x04\0\0\x12\0\x0d\0\0\0\0\0\0\0\0\0\x20\0\0\0\0\
-\0\0\0\xb2\x04\0\0\x12\0\x0e\0\0\0\0\0\0\0\0\0\x48\x02\0\0\0\0\0\0\xb9\x04\0\0\
-\x11\0\x12\0\0\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xc4\x04\0\0\x11\0\x11\0\0\0\0\0\
-\0\0\0\0\x04\0\0\0\0\0\0\0\xc9\x04\0\0\x12\0\x0f\0\0\0\0\0\0\0\0\0\xa8\x01\0\0\
-\0\0\0\0\xdd\x04\0\0\x11\0\x12\0\x20\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xeb\x04\0\
-\0\x11\0\x12\0\xb0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xfe\x04\0\0\x11\0\x10\0\0\0\
-\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\xbf\x13\0\0\0\0\0\0\x7b\x3a\xf8\xff\0\0\0\0\xb7\
-\x01\0\0\x12\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf4\xff\
-\xff\xff\xb7\x02\0\0\x01\0\0\0\x85\0\0\0\x71\0\0\0\x71\xa1\xf4\xff\0\0\0\0\x55\
-\x01\x6d\0\x02\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\x15\x07\x66\
-\0\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x08\0\0\0\0\0\0\x79\x71\x08\0\0\0\0\0\x7b\
-\x1a\xe8\xff\0\0\0\0\xb7\x09\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x06\0\0\0\0\
-\0\0\x55\x06\x05\0\0\0\0\0\x18\x01\0\0\x76\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\
-\x20\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x55\0\0\0\0\0\x7b\x96\x48\0\0\0\0\0\x7b\
-\x96\x40\0\0\0\0\0\x7b\x96\x38\0\0\0\0\0\x7b\x96\x28\0\0\0\0\0\x7b\x96\x20\0\0\
-\0\0\0\x7b\x96\x18\0\0\0\0\0\x7b\x96\x10\0\0\0\0\0\x7b\x96\x08\0\0\0\0\0\x7b\
-\x96\0\0\0\0\0\0\xbf\x81\0\0\0\0\0\0\x79\xa2\xe8\xff\0\0\0\0\x1f\x21\0\0\0\0\0\
-\0\x7b\x16\x30\0\0\0\0\0\x61\x71\0\0\0\0\0\0\x63\x16\x40\0\0\0\0\0\x07\x07\0\0\
-\x10\0\0\0\xbf\x61\0\0\0\0\0\0\x07\x01\0\0\x20\0\0\0\xb7\x02\0\0\x10\0\0\0\xbf\
-\x73\0\0\0\0\0\0\x85\0\0\0\x73\0\0\0\x7b\x86\x38\0\0\0\0\0\xb7\x01\0\0\x0e\0\0\
-\0\x79\xa3\xf8\xff\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\
-\xf4\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xf4\xff\0\0\
-\0\0\x6b\x16\x48\0\0\0\0\0\xb7\x01\0\0\x0c\0\0\0\x79\xa3\xf8\xff\0\0\0\0\x0f\
-\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf4\xff\xff\xff\xb7\x02\0\0\
-\x02\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xf4\xff\0\0\0\0\x6b\x16\x4a\0\0\0\0\0\
-\xb7\x01\0\0\x10\0\0\0\x79\xa3\xf8\xff\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\
-\0\0\0\0\x07\x01\0\0\xf4\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\
-\x69\xa1\xf4\xff\0\0\0\0\x63\x16\x44\0\0\0\0\0\x55\x01\x13\0\x02\0\0\0\xb7\x01\
-\0\0\x04\0\0\0\x79\xa3\xf8\xff\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\
-\x07\x01\0\0\xf4\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x61\xa1\
-\xf4\xff\0\0\0\0\x63\x16\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x79\xa3\xf8\xff\0\0\0\
-\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf4\xff\xff\xff\xb7\x02\
-\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\x61\xa1\xf4\xff\0\0\0\0\x63\x16\x10\0\0\0\0\
-\0\x05\0\x0d\0\0\0\0\0\xb7\x01\0\0\x48\0\0\0\x79\xa3\xf8\xff\0\0\0\0\x0f\x13\0\
-\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x71\0\0\0\xb7\
-\x01\0\0\x38\0\0\0\x79\xa3\xf8\xff\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\x61\0\0\0\0\
-\0\0\x07\x01\0\0\x10\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x71\0\0\0\xbf\x61\0\
-\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x95\0\0\0\0\0\0\0\x79\x16\
-\x10\0\0\0\0\0\x15\x06\x8d\0\0\0\0\0\x79\x19\x08\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\
-\xbf\x07\0\0\0\0\0\0\xbf\x71\0\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\x77\x01\0\0\x20\
-\0\0\0\x15\x01\x86\0\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\x0a\xa8\xff\0\0\0\0\xb7\
-\x08\0\0\0\0\0\0\x15\x09\x09\0\0\0\0\0\xb7\x01\0\0\x28\0\0\0\x0f\x19\0\0\0\0\0\
-\0\xbf\xa8\0\0\0\0\0\0\x07\x08\0\0\xd0\xff\xff\xff\xbf\x81\0\0\0\0\0\0\xb7\x02\
-\0\0\x30\0\0\0\xbf\x93\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x61\x88\0\0\0\0\0\0\xb7\
-\x01\0\0\x10\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\
-\x07\x01\0\0\xce\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\
-\0\0\x0e\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\
-\x01\0\0\xcc\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\
-\x0c\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\
-\0\0\xca\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x12\
-\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\
-\xc9\xff\xff\xff\xb7\x02\0\0\x01\0\0\0\x85\0\0\0\x71\0\0\0\xbf\xa1\0\0\0\0\0\0\
-\x07\x01\0\0\xb9\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\x69\xa1\
-\xce\xff\0\0\0\0\x57\x01\0\0\xf7\xff\0\0\x55\x01\x56\0\x02\0\0\0\x7b\x8a\xa0\
-\xff\0\0\0\0\xb7\x08\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\
-\0\x58\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x09\0\0\0\0\0\0\x55\
-\x09\x05\0\0\0\0\0\x18\x01\0\0\x3b\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x20\0\0\0\
-\x85\0\0\0\x06\0\0\0\x05\0\x48\0\0\0\0\0\x7b\x89\x30\0\0\0\0\0\x7b\x89\x28\0\0\
-\0\0\0\x7b\x89\x20\0\0\0\0\0\x7b\x89\x18\0\0\0\0\0\x7b\x89\x10\0\0\0\0\0\x7b\
-\x89\x08\0\0\0\0\0\x7b\x89\0\0\0\0\0\0\x63\x79\x38\0\0\0\0\0\x69\xa1\xca\xff\0\
-\0\0\0\x6b\x19\x36\0\0\0\0\0\x69\xa1\xcc\xff\0\0\0\0\x79\xa2\xa0\xff\0\0\0\0\
-\x63\x29\x3c\0\0\0\0\0\x6b\x19\x34\0\0\0\0\0\x71\xa1\xc9\xff\0\0\0\0\x79\xa2\
-\xa8\xff\0\0\0\0\x7b\x29\x50\0\0\0\0\0\xb7\x02\0\0\x01\0\0\0\x7b\x29\x48\0\0\0\
-\0\0\x7b\x19\x40\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\x07\x01\0\0\x20\0\0\0\xbf\xa3\0\
-\0\0\0\0\0\x07\x03\0\0\xb9\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x2d\0\0\
-\0\x69\xa1\xce\xff\0\0\0\0\x15\x01\x16\0\x0a\0\0\0\x55\x01\x28\0\x02\0\0\0\xb7\
-\x01\0\0\x02\0\0\0\x63\x19\x30\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\
-\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xb4\xff\xff\xff\xb7\x02\
-\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x04\0\0\0\x0f\x16\0\0\0\0\0\0\
-\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xb0\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\xbf\x63\
-\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x61\xa1\xb0\xff\0\0\0\0\x63\x19\0\0\0\0\0\0\
-\x61\xa1\xb4\xff\0\0\0\0\x63\x19\x10\0\0\0\0\0\x05\0\x0f\0\0\0\0\0\xb7\x01\0\0\
-\x0a\0\0\0\x63\x19\x30\0\0\0\0\0\xb7\x01\0\0\x48\0\0\0\xbf\x63\0\0\0\0\0\0\x0f\
-\x13\0\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x71\0\0\0\
-\xb7\x01\0\0\x38\0\0\0\x0f\x16\0\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\x07\x01\0\0\x10\
-\0\0\0\xb7\x02\0\0\x10\0\0\0\xbf\x63\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\xbf\x91\0\
-\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x05\0\x03\0\0\0\0\0\xbf\x91\
-\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x85\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\
-\0\0\0\0\0\x79\x11\x70\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x85\0\0\0\x0e\0\0\0\
-\x63\x0a\xf4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf4\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xf8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\
-\x79\x18\x50\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\x63\x0a\x9c\xff\0\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\x9c\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\
-\0\0\x01\0\0\0\x15\0\xbb\x01\0\0\0\0\x67\x08\0\0\x20\0\0\0\x77\x08\0\0\x20\0\0\
-\0\xbf\x81\0\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\xc7\x01\0\0\x20\0\0\0\xb7\x02\0\0\
-\x01\0\0\0\x6d\x12\xaf\x01\0\0\0\0\x79\x09\0\0\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\
-\x06\0\0\0\0\0\0\xb7\x07\0\0\0\0\0\0\x6b\x7a\xfe\xff\0\0\0\0\x6b\x7a\xfc\xff\0\
-\0\0\0\x85\0\0\0\x05\0\0\0\x7b\x0a\x90\xff\0\0\0\0\xb7\x01\0\0\x10\0\0\0\xbf\
-\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xfe\xff\
-\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xfe\xff\0\0\0\0\x15\
-\x01\x5d\0\x0a\0\0\0\x55\x01\x9d\x01\x02\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\xb8\
-\xff\0\0\0\0\x63\x1a\xb4\xff\0\0\0\0\x63\x1a\xb0\xff\0\0\0\0\x63\x1a\xac\xff\0\
-\0\0\0\x63\x1a\xa8\xff\0\0\0\0\x63\x1a\xa4\xff\0\0\0\0\x63\x1a\xbc\xff\0\0\0\0\
-\x63\x6a\xa0\xff\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xa4\xff\xff\xff\xbf\
-\x61\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\xb7\x01\0\0\x04\0\0\
-\0\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xb4\
-\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\0\0\0\0\xbf\
-\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xb8\xff\
-\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0e\0\0\0\xbf\
-\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xbc\xff\
-\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0c\0\0\0\x0f\
-\x19\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xfc\xff\xff\xff\xb7\x02\0\0\
-\x02\0\0\0\xbf\x93\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xfc\xff\0\0\0\0\xdc\
-\x01\0\0\x10\0\0\0\x6b\x1a\xbe\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xa0\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\
-\0\0\0\0\0\x55\x07\x81\0\0\0\0\0\x79\xa1\x90\xff\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\
-\0\x7b\x8a\xe8\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\xbf\xa2\
-\0\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xe0\
-\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x07\0\0\0\0\0\0\x79\xa1\xf0\xff\0\0\0\0\xbf\
-\x72\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\xb7\x01\0\0\0\xca\x9a\x3b\x2d\x21\x55\x01\
-\0\0\0\0\x79\xa2\xe0\xff\0\0\0\0\x79\xa9\xe8\xff\0\0\0\0\x25\x09\x02\0\xff\x13\
-\0\0\xb7\x01\0\0\0\x28\0\0\x2d\x21\x50\x01\0\0\0\0\x7b\x2a\x88\xff\0\0\0\0\x7b\
-\x6a\x90\xff\0\0\0\0\xb7\x06\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x08\0\0\0\0\
-\0\0\x55\x08\xf1\0\0\0\0\0\x18\x01\0\0\x5b\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\
-\x1b\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x41\x01\0\0\0\0\x7b\x7a\xc0\xff\0\0\0\0\
-\x7b\x7a\xd8\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\0\0\0\x7b\
-\x7a\xb8\xff\0\0\0\0\x7b\x7a\xb0\xff\0\0\0\0\x7b\x7a\xa8\xff\0\0\0\0\x7b\x7a\
-\xa0\xff\0\0\0\0\x63\x6a\xc0\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xc4\
-\xff\xff\xff\x7b\x1a\x88\xff\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\
-\xb7\x01\0\0\x48\0\0\0\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa6\0\0\0\0\
-\0\0\x07\x06\0\0\xa0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\
-\0\0\0\x71\0\0\0\xb7\x01\0\0\x38\0\0\0\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\
-\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\xb0\xff\xff\xff\xbf\x71\0\0\0\0\0\0\xb7\x02\0\
-\0\x10\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0e\0\0\0\xbf\x93\0\0\0\0\0\0\x0f\
-\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xd4\xff\xff\xff\xb7\x02\0\0\
-\x02\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0c\0\0\0\x0f\x19\0\0\0\0\0\0\xbf\
-\xa1\0\0\0\0\0\0\x07\x01\0\0\xfc\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\xbf\x93\0\0\
-\0\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xfc\xff\0\0\0\0\xdc\x01\0\0\x10\0\0\0\x6b\
-\x1a\xd6\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\
-\x85\0\0\0\x01\0\0\0\xbf\x09\0\0\0\0\0\0\x55\x09\x44\0\0\0\0\0\x79\xa1\x90\xff\
-\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x7b\x8a\xe8\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\
-\x7b\x1a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xe0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x08\0\0\0\0\
-\0\0\x79\xa1\xf0\xff\0\0\0\0\xbf\x82\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\xb7\x01\0\
-\0\0\xca\x9a\x3b\x2d\x21\xf8\0\0\0\0\0\x79\xa2\xe0\xff\0\0\0\0\x79\xa9\xe8\xff\
-\0\0\0\0\x25\x09\x02\0\xff\x13\0\0\xb7\x01\0\0\0\x28\0\0\x2d\x21\xf3\0\0\0\0\0\
-\x7b\x2a\x80\xff\0\0\0\0\x7b\x7a\x90\xff\0\0\0\0\xb7\x07\0\0\0\0\0\0\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\
-\x83\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\xbb\0\0\0\0\0\x05\0\xa2\xff\0\0\0\0\x7b\
-\x6a\x90\xff\0\0\0\0\x79\x71\x08\0\0\0\0\0\x0f\x81\0\0\0\0\0\0\x7b\x17\x08\0\0\
-\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x85\0\
-\0\0\x05\0\0\0\xbf\x08\0\0\0\0\0\0\x79\x71\x10\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\
-\x1f\x12\0\0\0\0\0\0\xb7\x01\0\0\0\xca\x9a\x3b\x2d\x21\xd6\0\0\0\0\0\x79\x72\0\
-\0\0\0\0\0\x79\x76\x08\0\0\0\0\0\x25\x06\x02\0\xff\x13\0\0\xb7\x01\0\0\0\x28\0\
-\0\x2d\x21\xd1\0\0\0\0\0\x7b\x2a\x88\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x09\0\
-\0\0\0\0\0\x55\x09\x20\0\0\0\0\0\x05\0\x82\xff\0\0\0\0\x7b\x7a\x90\xff\0\0\0\0\
-\x79\x91\x08\0\0\0\0\0\x0f\x81\0\0\0\0\0\0\x7b\x19\x08\0\0\0\0\0\xbf\xa2\0\0\0\
-\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x93\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x85\0\0\0\x05\0\0\0\x79\
-\x91\x10\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\xb7\x01\0\0\0\xca\
-\x9a\x3b\x2d\x21\xb7\0\0\0\0\0\x79\x98\0\0\0\0\0\0\x79\x97\x08\0\0\0\0\0\x25\
-\x07\x02\0\xff\x13\0\0\xb7\x01\0\0\0\x28\0\0\x2d\x81\xb2\0\0\0\0\0\x7b\x0a\x80\
-\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x50\0\0\0\xb7\x03\
-\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x28\0\0\0\0\0\x05\
-\0\x63\xff\0\0\0\0\x79\xa1\x88\xff\0\0\0\0\x7b\x19\x38\0\0\0\0\0\x7b\x69\x30\0\
-\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x19\x48\0\0\0\0\0\x7b\x19\x40\0\0\0\0\0\x7b\
-\x19\x28\0\0\0\0\0\x7b\x19\x20\0\0\0\0\0\x7b\x19\x18\0\0\0\0\0\x7b\x19\x10\0\0\
-\0\0\0\x7b\x19\x08\0\0\0\0\0\x7b\x19\0\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\x07\x01\0\
-\0\x20\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x90\xff\0\0\0\0\x85\0\0\0\x2d\0\0\0\
-\xb7\x01\0\0\x02\0\0\0\x63\x19\x44\0\0\0\0\0\x61\xa1\xa0\xff\0\0\0\0\x63\x19\
-\x40\0\0\0\0\0\x69\xa1\xbe\xff\0\0\0\0\x6b\x19\x4a\0\0\0\0\0\x69\xa1\xbc\xff\0\
-\0\0\0\x6b\x19\x48\0\0\0\0\0\x61\xa1\xb8\xff\0\0\0\0\x63\x19\x10\0\0\0\0\0\x61\
-\xa1\xb4\xff\0\0\0\0\x63\x19\0\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\
-\0\x85\0\0\0\x84\0\0\0\x7b\x87\x10\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xa0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\x05\0\
-\x80\0\0\0\0\0\x7b\x86\x38\0\0\0\0\0\x7b\x76\x30\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\
-\x7b\x16\x48\0\0\0\0\0\x7b\x16\x40\0\0\0\0\0\x7b\x16\x28\0\0\0\0\0\x7b\x16\x20\
-\0\0\0\0\0\x7b\x16\x18\0\0\0\0\0\x7b\x16\x10\0\0\0\0\0\x7b\x16\x08\0\0\0\0\0\
-\x7b\x16\0\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x07\x01\0\0\x20\0\0\0\xb7\x02\0\0\x10\
-\0\0\0\x79\xa3\x88\xff\0\0\0\0\x85\0\0\0\x2d\0\0\0\xb7\x01\0\0\x0a\0\0\0\x63\
-\x16\x44\0\0\0\0\0\x61\xa1\xc0\xff\0\0\0\0\x63\x16\x40\0\0\0\0\0\x69\xa1\xd6\
-\xff\0\0\0\0\x6b\x16\x4a\0\0\0\0\0\x69\xa1\xd4\xff\0\0\0\0\x6b\x16\x48\0\0\0\0\
-\0\xbf\x61\0\0\0\0\0\0\x07\x01\0\0\x10\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x90\
-\xff\0\0\0\0\x85\0\0\0\x04\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\xa0\xff\xff\
-\xff\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\
-\x04\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x79\xa1\
-\x80\xff\0\0\0\0\x7b\x19\x10\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\
-\x72\0\0\0\0\0\0\xbf\x93\0\0\0\0\0\0\x05\0\x53\0\0\0\0\0\x79\xa1\x88\xff\0\0\0\
-\0\x7b\x18\x38\0\0\0\0\0\x7b\x98\x30\0\0\0\0\0\x7b\x68\x48\0\0\0\0\0\x7b\x68\
-\x40\0\0\0\0\0\x7b\x68\x28\0\0\0\0\0\x7b\x68\x20\0\0\0\0\0\x7b\x68\x18\0\0\0\0\
-\0\x7b\x68\x10\0\0\0\0\0\x7b\x68\x08\0\0\0\0\0\x7b\x68\0\0\0\0\0\0\xbf\x81\0\0\
-\0\0\0\0\x07\x01\0\0\x20\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x90\xff\0\0\0\0\
-\x85\0\0\0\x2d\0\0\0\xb7\x01\0\0\x02\0\0\0\x63\x18\x44\0\0\0\0\0\x61\xa1\xa0\
-\xff\0\0\0\0\x63\x18\x40\0\0\0\0\0\x69\xa1\xbe\xff\0\0\0\0\x6b\x18\x4a\0\0\0\0\
-\0\x69\xa1\xbc\xff\0\0\0\0\x6b\x18\x48\0\0\0\0\0\x61\xa1\xb8\xff\0\0\0\0\x63\
-\x18\x10\0\0\0\0\0\x61\xa1\xb4\xff\0\0\0\0\x63\x18\0\0\0\0\0\0\xbf\x81\0\0\0\0\
-\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x7b\x7a\xf0\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xe0\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x2c\0\0\0\0\0\x79\xa1\x80\
-\xff\0\0\0\0\x7b\x16\x38\0\0\0\0\0\x7b\x96\x30\0\0\0\0\0\x7b\x76\x48\0\0\0\0\0\
-\x7b\x76\x40\0\0\0\0\0\x7b\x76\x28\0\0\0\0\0\x7b\x76\x20\0\0\0\0\0\x7b\x76\x18\
-\0\0\0\0\0\x7b\x76\x10\0\0\0\0\0\x7b\x76\x08\0\0\0\0\0\x7b\x76\0\0\0\0\0\0\xbf\
-\x61\0\0\0\0\0\0\x07\x01\0\0\x20\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x88\xff\0\
-\0\0\0\x85\0\0\0\x2d\0\0\0\xb7\x01\0\0\x0a\0\0\0\x63\x16\x44\0\0\0\0\0\x61\xa1\
-\xc0\xff\0\0\0\0\x63\x16\x40\0\0\0\0\0\x69\xa1\xd6\xff\0\0\0\0\x6b\x16\x4a\0\0\
-\0\0\0\x69\xa1\xd4\xff\0\0\0\0\x6b\x16\x48\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x07\
-\x01\0\0\x10\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x90\xff\0\0\0\0\x85\0\0\0\x04\
-\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\xa0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\xb7\
-\x02\0\0\x10\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x04\0\0\0\xbf\x61\0\0\0\0\0\0\
-\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x7b\x8a\xf0\xff\0\0\0\0\xbf\xa3\0\0\0\
-\0\0\0\x07\x03\0\0\xe0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x72\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
-\x02\0\0\x9c\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x03\0\0\
-\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x18\x68\0\0\0\0\0\x67\x08\0\0\x20\0\
-\0\0\xbf\x82\0\0\0\0\0\0\xc7\x02\0\0\x20\0\0\0\xb7\x03\0\0\x01\0\0\0\x6d\x23\
-\xb0\x01\0\0\0\0\x77\x08\0\0\x20\0\0\0\x79\x19\x70\0\0\0\0\0\x85\0\0\0\x0e\0\0\
-\0\xbf\x06\0\0\0\0\0\0\xb7\x07\0\0\0\0\0\0\x6b\x7a\xfe\xff\0\0\0\0\x6b\x7a\xfc\
-\xff\0\0\0\0\x85\0\0\0\x05\0\0\0\x7b\x0a\x98\xff\0\0\0\0\xb7\x01\0\0\x10\0\0\0\
-\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xfe\
-\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xfe\xff\0\0\0\0\
-\x15\x01\x5d\0\x0a\0\0\0\x55\x01\x9d\x01\x02\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\
-\xb8\xff\0\0\0\0\x63\x1a\xb4\xff\0\0\0\0\x63\x1a\xb0\xff\0\0\0\0\x63\x1a\xac\
-\xff\0\0\0\0\x63\x1a\xa8\xff\0\0\0\0\x63\x1a\xa4\xff\0\0\0\0\x63\x1a\xbc\xff\0\
-\0\0\0\x63\x6a\xa0\xff\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xa4\xff\xff\xff\
-\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\xb7\x01\0\0\x04\
-\0\0\0\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\
-\xb4\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\0\0\0\0\
-\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xb8\
-\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0e\0\0\0\
-\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xbc\
-\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0c\0\0\0\
-\x0f\x19\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xfc\xff\xff\xff\xb7\x02\0\
-\0\x02\0\0\0\xbf\x93\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xfc\xff\0\0\0\0\
-\xdc\x01\0\0\x10\0\0\0\x6b\x1a\xbe\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xa0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\
-\x07\0\0\0\0\0\0\x55\x07\x81\0\0\0\0\0\x79\xa1\x98\xff\0\0\0\0\x7b\x1a\xf0\xff\
-\0\0\0\0\x7b\x8a\xe0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\
-\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\
-\0\xe0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\
-\0\0\0\x02\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x07\0\0\0\0\0\0\x79\xa1\xf0\xff\0\0\0\
-\0\xbf\x72\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\xb7\x01\0\0\0\xca\x9a\x3b\x2d\x21\
-\x55\x01\0\0\0\0\x79\xa2\xe0\xff\0\0\0\0\x79\xa9\xe8\xff\0\0\0\0\x25\x09\x02\0\
-\xff\x13\0\0\xb7\x01\0\0\0\x28\0\0\x2d\x21\x50\x01\0\0\0\0\x7b\x2a\x90\xff\0\0\
-\0\0\x7b\x6a\x98\xff\0\0\0\0\xb7\x06\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x08\0\
-\0\0\0\0\0\x55\x08\xf1\0\0\0\0\0\x18\x01\0\0\x5b\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\
-\0\0\x1b\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x41\x01\0\0\0\0\x7b\x7a\xc0\xff\0\0\0\
-\0\x7b\x7a\xd8\xff\0\0\0\0\x7b\x7a\xd0\xff\0\0\0\0\x7b\x7a\xc8\xff\0\0\0\0\x7b\
-\x7a\xb8\xff\0\0\0\0\x7b\x7a\xb0\xff\0\0\0\0\x7b\x7a\xa8\xff\0\0\0\0\x7b\x7a\
-\xa0\xff\0\0\0\0\x63\x6a\xc0\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xc4\
-\xff\xff\xff\x7b\x1a\x90\xff\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\
-\xb7\x01\0\0\x48\0\0\0\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa6\0\0\0\0\
-\0\0\x07\x06\0\0\xa0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\
-\0\0\0\x71\0\0\0\xb7\x01\0\0\x38\0\0\0\xbf\x93\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\
-\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\xb0\xff\xff\xff\xbf\x71\0\0\0\0\0\0\xb7\x02\0\
-\0\x10\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0e\0\0\0\xbf\x93\0\0\0\0\0\0\x0f\
-\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xd4\xff\xff\xff\xb7\x02\0\0\
-\x02\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\x0c\0\0\0\x0f\x19\0\0\0\0\0\0\xbf\
-\xa1\0\0\0\0\0\0\x07\x01\0\0\xfc\xff\xff\xff\xb7\x02\0\0\x02\0\0\0\xbf\x93\0\0\
-\0\0\0\0\x85\0\0\0\x71\0\0\0\x69\xa1\xfc\xff\0\0\0\0\xdc\x01\0\0\x10\0\0\0\x6b\
-\x1a\xd6\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\
-\x85\0\0\0\x01\0\0\0\xbf\x09\0\0\0\0\0\0\x55\x09\x44\0\0\0\0\0\x79\xa1\x98\xff\
-\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x7b\x8a\xe0\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\
-\x7b\x1a\xe8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xe0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x08\0\0\0\0\
-\0\0\x79\xa1\xf0\xff\0\0\0\0\xbf\x82\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\xb7\x01\0\
-\0\0\xca\x9a\x3b\x2d\x21\xf8\0\0\0\0\0\x79\xa2\xe0\xff\0\0\0\0\x79\xa9\xe8\xff\
-\0\0\0\0\x25\x09\x02\0\xff\x13\0\0\xb7\x01\0\0\0\x28\0\0\x2d\x21\xf3\0\0\0\0\0\
-\x7b\x2a\x88\xff\0\0\0\0\x7b\x7a\x98\xff\0\0\0\0\xb7\x07\0\0\0\0\0\0\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\
-\x83\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\xbb\0\0\0\0\0\x05\0\xa2\xff\0\0\0\0\x7b\
-\x6a\x98\xff\0\0\0\0\x79\x71\0\0\0\0\0\0\x0f\x81\0\0\0\0\0\0\x7b\x17\0\0\0\0\0\
-\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\xbf\x73\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x85\0\0\0\
-\x05\0\0\0\xbf\x08\0\0\0\0\0\0\x79\x71\x10\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\x1f\
-\x12\0\0\0\0\0\0\xb7\x01\0\0\0\xca\x9a\x3b\x2d\x21\xd6\0\0\0\0\0\x79\x72\0\0\0\
-\0\0\0\x79\x76\x08\0\0\0\0\0\x25\x06\x02\0\xff\x13\0\0\xb7\x01\0\0\0\x28\0\0\
-\x2d\x21\xd1\0\0\0\0\0\x7b\x2a\x90\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x09\0\0\
-\0\0\0\0\x55\x09\x20\0\0\0\0\0\x05\0\x82\xff\0\0\0\0\x7b\x7a\x98\xff\0\0\0\0\
-\x79\x91\0\0\0\0\0\0\x0f\x81\0\0\0\0\0\0\x7b\x19\0\0\0\0\0\0\xbf\xa2\0\0\0\0\0\
-\0\x07\x02\0\0\xa0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x93\0\0\
-\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\x85\0\0\0\x05\0\0\0\x79\x91\
-\x10\0\0\0\0\0\xbf\x02\0\0\0\0\0\0\x1f\x12\0\0\0\0\0\0\xb7\x01\0\0\0\xca\x9a\
-\x3b\x2d\x21\xb7\0\0\0\0\0\x79\x98\0\0\0\0\0\0\x79\x97\x08\0\0\0\0\0\x25\x07\
-\x02\0\xff\x13\0\0\xb7\x01\0\0\0\x28\0\0\x2d\x81\xb2\0\0\0\0\0\x7b\x0a\x88\xff\
-\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x50\0\0\0\xb7\x03\0\0\
-\0\0\0\0\x85\0\0\0\x83\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x28\0\0\0\0\0\x05\0\
-\x63\xff\0\0\0\0\x79\xa1\x90\xff\0\0\0\0\x7b\x19\x38\0\0\0\0\0\x7b\x69\x30\0\0\
-\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x19\x48\0\0\0\0\0\x7b\x19\x40\0\0\0\0\0\x7b\x19\
-\x28\0\0\0\0\0\x7b\x19\x20\0\0\0\0\0\x7b\x19\x18\0\0\0\0\0\x7b\x19\x10\0\0\0\0\
-\0\x7b\x19\x08\0\0\0\0\0\x7b\x19\0\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\x07\x01\0\0\
-\x20\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x98\xff\0\0\0\0\x85\0\0\0\x2d\0\0\0\
-\xb7\x01\0\0\x02\0\0\0\x63\x19\x44\0\0\0\0\0\x61\xa1\xa0\xff\0\0\0\0\x63\x19\
-\x40\0\0\0\0\0\x69\xa1\xbe\xff\0\0\0\0\x6b\x19\x4a\0\0\0\0\0\x69\xa1\xbc\xff\0\
-\0\0\0\x6b\x19\x48\0\0\0\0\0\x61\xa1\xb8\xff\0\0\0\0\x63\x19\x10\0\0\0\0\0\x61\
-\xa1\xb4\xff\0\0\0\0\x63\x19\0\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\
-\0\x85\0\0\0\x84\0\0\0\x7b\x87\x10\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
-\xa0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x73\0\0\0\0\0\0\x05\0\
-\x80\0\0\0\0\0\x7b\x86\x38\0\0\0\0\0\x7b\x76\x30\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\
-\x7b\x16\x48\0\0\0\0\0\x7b\x16\x40\0\0\0\0\0\x7b\x16\x28\0\0\0\0\0\x7b\x16\x20\
-\0\0\0\0\0\x7b\x16\x18\0\0\0\0\0\x7b\x16\x10\0\0\0\0\0\x7b\x16\x08\0\0\0\0\0\
-\x7b\x16\0\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x07\x01\0\0\x20\0\0\0\xb7\x02\0\0\x10\
-\0\0\0\x79\xa3\x90\xff\0\0\0\0\x85\0\0\0\x2d\0\0\0\xb7\x01\0\0\x0a\0\0\0\x63\
-\x16\x44\0\0\0\0\0\x61\xa1\xc0\xff\0\0\0\0\x63\x16\x40\0\0\0\0\0\x69\xa1\xd6\
-\xff\0\0\0\0\x6b\x16\x4a\0\0\0\0\0\x69\xa1\xd4\xff\0\0\0\0\x6b\x16\x48\0\0\0\0\
-\0\xbf\x61\0\0\0\0\0\0\x07\x01\0\0\x10\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x98\
-\xff\0\0\0\0\x85\0\0\0\x04\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\xa0\xff\xff\
-\xff\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\
-\x04\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x79\xa1\
-\x88\xff\0\0\0\0\x7b\x19\x10\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\
-\x72\0\0\0\0\0\0\xbf\x93\0\0\0\0\0\0\x05\0\x53\0\0\0\0\0\x79\xa1\x90\xff\0\0\0\
-\0\x7b\x18\x38\0\0\0\0\0\x7b\x98\x30\0\0\0\0\0\x7b\x68\x48\0\0\0\0\0\x7b\x68\
-\x40\0\0\0\0\0\x7b\x68\x28\0\0\0\0\0\x7b\x68\x20\0\0\0\0\0\x7b\x68\x18\0\0\0\0\
-\0\x7b\x68\x10\0\0\0\0\0\x7b\x68\x08\0\0\0\0\0\x7b\x68\0\0\0\0\0\0\xbf\x81\0\0\
-\0\0\0\0\x07\x01\0\0\x20\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x98\xff\0\0\0\0\
-\x85\0\0\0\x2d\0\0\0\xb7\x01\0\0\x02\0\0\0\x63\x18\x44\0\0\0\0\0\x61\xa1\xa0\
-\xff\0\0\0\0\x63\x18\x40\0\0\0\0\0\x69\xa1\xbe\xff\0\0\0\0\x6b\x18\x4a\0\0\0\0\
-\0\x69\xa1\xbc\xff\0\0\0\0\x6b\x18\x48\0\0\0\0\0\x61\xa1\xb8\xff\0\0\0\0\x63\
-\x18\x10\0\0\0\0\0\x61\xa1\xb4\xff\0\0\0\0\x63\x18\0\0\0\0\0\0\xbf\x81\0\0\0\0\
-\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x7b\x7a\xf0\xff\0\0\0\0\xbf\xa2\0\
-\0\0\0\0\0\x07\x02\0\0\xa0\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xe0\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x2c\0\0\0\0\0\x79\xa1\x88\
-\xff\0\0\0\0\x7b\x16\x38\0\0\0\0\0\x7b\x96\x30\0\0\0\0\0\x7b\x76\x48\0\0\0\0\0\
-\x7b\x76\x40\0\0\0\0\0\x7b\x76\x28\0\0\0\0\0\x7b\x76\x20\0\0\0\0\0\x7b\x76\x18\
-\0\0\0\0\0\x7b\x76\x10\0\0\0\0\0\x7b\x76\x08\0\0\0\0\0\x7b\x76\0\0\0\0\0\0\xbf\
-\x61\0\0\0\0\0\0\x07\x01\0\0\x20\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x90\xff\0\
-\0\0\0\x85\0\0\0\x2d\0\0\0\xb7\x01\0\0\x0a\0\0\0\x63\x16\x44\0\0\0\0\0\x61\xa1\
-\xc0\xff\0\0\0\0\x63\x16\x40\0\0\0\0\0\x69\xa1\xd6\xff\0\0\0\0\x6b\x16\x4a\0\0\
-\0\0\0\x69\xa1\xd4\xff\0\0\0\0\x6b\x16\x48\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x07\
-\x01\0\0\x10\0\0\0\xb7\x02\0\0\x10\0\0\0\x79\xa3\x98\xff\0\0\0\0\x85\0\0\0\x04\
-\0\0\0\xbf\xa7\0\0\0\0\0\0\x07\x07\0\0\xa0\xff\xff\xff\xbf\x61\0\0\0\0\0\0\xb7\
-\x02\0\0\x10\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x04\0\0\0\xbf\x61\0\0\0\0\0\0\
-\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\x7b\x8a\xf0\xff\0\0\0\0\xbf\xa3\0\0\0\
-\0\0\0\x07\x03\0\0\xe0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x72\
-\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\
-\0\0\0\0\0\x79\x11\x70\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x85\0\0\0\x0e\0\0\0\
-\xbf\x06\0\0\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x61\0\0\0\0\0\0\x77\x01\0\0\x20\0\
-\0\0\x15\x01\x12\0\0\0\0\0\x7b\x0a\xe0\xff\0\0\0\0\x63\x1a\xdc\xff\0\0\0\0\x63\
-\x6a\xd8\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xf0\
-\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xe8\xff\xff\xff\xb7\x02\0\0\x10\0\
-\0\0\x85\0\0\0\x10\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\
-\xa3\0\0\0\0\0\0\x07\x03\0\0\xd8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\
-\x79\x11\x70\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\x06\0\0\
-\0\0\0\0\x85\0\0\0\x05\0\0\0\xbf\x61\0\0\0\0\0\0\x77\x01\0\0\x20\0\0\0\x15\x01\
-\x12\0\0\0\0\0\x7b\x0a\xe0\xff\0\0\0\0\x63\x1a\xdc\xff\0\0\0\0\x63\x6a\xd8\xff\
-\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\
-\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xe8\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\
-\0\x10\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\
-\0\x07\x03\0\0\xd8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\
-\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\x70\0\
-\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\
-\x11\0\0\0\0\0\0\x7b\x1a\xf8\xff\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\x06\0\0\0\0\0\
-\0\x85\0\0\0\x05\0\0\0\xbf\x61\0\0\0\0\0\0\x77\x01\0\0\x20\0\0\0\x15\x01\x12\0\
-\0\0\0\0\x7b\x0a\xe0\xff\0\0\0\0\x63\x1a\xdc\xff\0\0\0\0\x63\x6a\xd8\xff\0\0\0\
-\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\xbf\xa1\
-\0\0\0\0\0\0\x07\x01\0\0\xe8\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\
-\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\
-\x03\0\0\xd8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\
-\0\x85\0\0\0\x02\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\
-\x7b\x1a\xf8\xff\0\0\0\0\x85\0\0\0\x0e\0\0\0\xbf\x06\0\0\0\0\0\0\x85\0\0\0\x05\
-\0\0\0\xbf\x61\0\0\0\0\0\0\x77\x01\0\0\x20\0\0\0\x15\x01\x12\0\0\0\0\0\x7b\x0a\
-\xe0\xff\0\0\0\0\x63\x1a\xdc\xff\0\0\0\0\x63\x6a\xd8\xff\0\0\0\0\xb7\x01\0\0\0\
-\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\
-\x01\0\0\xe8\xff\xff\xff\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x10\0\0\0\xbf\xa2\0\0\
-\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xd8\xff\
-\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\
-\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x85\x10\0\0\xff\
-\xff\xff\xff\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x17\0\0\0\0\0\0\x18\x01\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\
-\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x14\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf8\
-\xff\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x7b\x1a\xe8\xff\0\0\0\0\x7b\x1a\xe0\xff\0\
-\0\0\0\xbf\xa3\0\0\0\0\0\0\x07\x03\0\0\xe0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\
-\x02\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\x2b\0\0\0\0\0\xb7\x01\0\0\
-\x10\x09\0\0\x0f\x17\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xe0\xff\xff\
-\xff\xb7\x02\0\0\x04\0\0\0\xbf\x73\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\xb7\x01\0\0\
-\0\0\0\0\x61\xa2\xe0\xff\0\0\0\0\xb7\x03\0\0\x40\x1f\0\0\x2d\x23\x13\0\0\0\0\0\
-\xb7\x01\0\0\x01\0\0\0\xb7\x03\0\0\x40\x9c\0\0\x2d\x23\x10\0\0\0\0\0\xb7\x01\0\
-\0\x02\0\0\0\xb7\x03\0\0\x40\x13\x02\0\x2d\x23\x0d\0\0\0\0\0\xb7\x01\0\0\x03\0\
-\0\0\xb7\x03\0\0\x40\x07\x04\0\x2d\x23\x0a\0\0\0\0\0\xb7\x01\0\0\x04\0\0\0\xb7\
-\x03\0\0\x40\xef\x07\0\x2d\x23\x07\0\0\0\0\0\xb7\x01\0\0\x05\0\0\0\xb7\x03\0\0\
-\x40\xbf\x0f\0\x2d\x23\x04\0\0\0\0\0\xb7\x01\0\0\x06\0\0\0\xb7\x03\0\0\x40\x5f\
-\x1f\0\x2d\x23\x01\0\0\0\0\0\xb7\x01\0\0\x07\0\0\0\x67\x01\0\0\x02\0\0\0\xbf\
-\x62\0\0\0\0\0\0\x0f\x12\0\0\0\0\0\0\x61\x21\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\
-\x63\x12\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x02\0\0\0\xb7\
-\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x02\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x05\
-\0\0\0\0\0\x18\x01\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1c\0\0\0\x85\0\0\
-\0\x06\0\0\0\x05\0\x27\0\0\0\0\0\xb7\x07\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\xb7\x02\0\0\x20\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\x55\0\
-\x05\0\0\0\0\0\x18\x01\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x1b\0\0\0\x85\
-\0\0\0\x06\0\0\0\x05\0\x1b\0\0\0\0\0\x63\x70\x1c\0\0\0\0\0\x63\x70\x18\0\0\0\0\
-\0\x63\x70\x14\0\0\0\0\0\x63\x70\x10\0\0\0\0\0\x63\x70\x0c\0\0\0\0\0\x63\x70\
-\x08\0\0\0\0\0\x63\x70\x04\0\0\0\0\0\x63\x70\0\0\0\0\0\0\x61\x61\0\0\0\0\0\0\
-\x63\x10\0\0\0\0\0\0\x61\x61\x04\0\0\0\0\0\x63\x10\x04\0\0\0\0\0\x61\x61\x08\0\
-\0\0\0\0\x63\x10\x08\0\0\0\0\0\x61\x61\x0c\0\0\0\0\0\x63\x10\x0c\0\0\0\0\0\x61\
-\x61\x10\0\0\0\0\0\x63\x10\x10\0\0\0\0\0\x61\x61\x14\0\0\0\0\0\x63\x10\x14\0\0\
-\0\0\0\x61\x61\x18\0\0\0\0\0\x63\x10\x18\0\0\0\0\0\x61\x61\x1c\0\0\0\0\0\x63\
-\x10\x1c\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\
-\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x44\x75\x61\x6c\x20\x42\x53\x44\x2f\x47\
-\x50\x4c\0\0\0\0\0\0\0\0\x74\x68\x65\x20\x74\x63\x70\x72\x74\x74\x20\x6d\x61\
-\x70\x20\x69\x73\x20\x6e\x6f\x74\x20\x69\x6e\x69\x74\x0a\0\x74\x68\x65\x20\x74\
-\x63\x70\x72\x74\x74\x20\x62\x75\x66\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\
-\x6c\x0a\0\x74\x68\x65\x20\x74\x63\x70\x5f\x72\x65\x74\x72\x61\x6e\x73\x20\x62\
-\x75\x66\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\x74\x68\x65\x20\x74\
-\x63\x70\x74\x6f\x70\x20\x62\x75\x66\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\
-\x6c\x0a\0\x74\x68\x65\x20\x6e\x65\x74\x20\x6c\x61\x74\x65\x6e\x63\x79\x20\x62\
-\x75\x66\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x0a\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x01\0\0\0\x51\0\0\
-\0\xb0\0\0\0\0\0\0\0\x01\0\0\0\x5c\0\0\0\xe8\0\0\0\0\0\0\0\x01\0\0\0\x46\0\0\0\
-\xd8\x01\0\0\0\0\0\0\x01\0\0\0\x48\0\0\0\x10\x02\0\0\0\0\0\0\x01\0\0\0\x46\0\0\
-\0\x40\0\0\0\0\0\0\0\x01\0\0\0\x4a\0\0\0\x28\0\0\0\0\0\0\0\x01\0\0\0\x4a\0\0\0\
-\x88\x02\0\0\0\0\0\0\x01\0\0\0\x4c\0\0\0\xf8\x02\0\0\0\0\0\0\x01\0\0\0\x4c\0\0\
-\0\x90\x03\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\xc8\x03\0\0\0\0\0\0\x01\0\0\0\x46\0\
-\0\0\x68\x05\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\xe0\x05\0\0\0\0\0\0\x01\0\0\0\x4e\
-\0\0\0\x78\x06\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\xe8\x06\0\0\0\0\0\0\x01\0\0\0\
-\x4c\0\0\0\x78\x07\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\xe8\x07\0\0\0\0\0\0\x01\0\0\
-\0\x4e\0\0\0\x70\x08\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\xc8\x09\0\0\0\0\0\0\x01\0\
-\0\0\x4c\0\0\0\x28\x0b\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x70\x0c\0\0\0\0\0\0\x01\
-\0\0\0\x4c\0\0\0\xd0\x0d\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x08\x0e\0\0\0\0\0\0\
-\x01\0\0\0\x4a\0\0\0\x40\x02\0\0\0\0\0\0\x01\0\0\0\x4c\0\0\0\xb0\x02\0\0\0\0\0\
-\0\x01\0\0\0\x4c\0\0\0\x48\x03\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\x80\x03\0\0\0\0\
-\0\0\x01\0\0\0\x46\0\0\0\x20\x05\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x98\x05\0\0\0\
-\0\0\0\x01\0\0\0\x4e\0\0\0\x30\x06\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\xa0\x06\0\0\
-\0\0\0\0\x01\0\0\0\x4c\0\0\0\x30\x07\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\xa0\x07\0\
-\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x28\x08\0\0\0\0\0\0\x01\0\0\0\x4d\0\0\0\x80\x09\
-\0\0\0\0\0\0\x01\0\0\0\x4c\0\0\0\xe0\x0a\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x28\
-\x0c\0\0\0\0\0\0\x01\0\0\0\x4c\0\0\0\x88\x0d\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\
-\xb0\0\0\0\0\0\0\0\x01\0\0\0\x51\0\0\0\xb0\0\0\0\0\0\0\0\x01\0\0\0\x51\0\0\0\
-\x08\0\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\xb0\0\0\0\0\0\0\0\x01\0\0\0\x51\0\0\0\
-\xb0\0\0\0\0\0\0\0\x01\0\0\0\x51\0\0\0\x08\0\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\
-\x08\0\0\0\0\0\0\0\x01\0\0\0\x58\0\0\0\x18\0\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\
-\x78\0\0\0\0\0\0\0\x01\0\0\0\x58\0\0\0\x88\0\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\
-\xa8\0\0\0\0\0\0\0\x01\0\0\0\x58\0\0\0\xb8\0\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\0\
-\x02\0\0\0\0\0\0\x01\0\0\0\x58\0\0\0\x10\x02\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\0\
-\0\0\0\0\0\0\0\x01\0\0\0\x58\0\0\0\x10\0\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\x38\0\
-\0\0\0\0\0\0\x01\0\0\0\x46\0\0\0\x68\0\0\0\0\0\0\0\x01\0\0\0\x5b\0\0\0\x98\0\0\
-\0\0\0\0\0\x01\0\0\0\x46\0\0\0\x9f\xeb\x01\0\x18\0\0\0\0\0\0\0\xac\x3f\0\0\xac\
-\x3f\0\0\xc6\x47\0\0\0\0\0\0\0\0\0\x02\x03\0\0\0\x01\0\0\0\0\0\0\x01\x04\0\0\0\
-\x20\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x02\0\0\0\x05\0\0\0\
-\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x06\0\0\0\0\0\0\0\0\0\0\x03\0\
-\0\0\0\x02\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x02\x08\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\0\0\0\0\
-\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x01\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\
-\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x07\0\0\0\
-\x80\0\0\0\x32\0\0\0\x09\0\0\0\xc0\0\0\0\x3e\0\0\0\0\0\0\x0e\x0b\0\0\0\x01\0\0\
-\0\0\0\0\0\0\0\0\x02\x0e\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\
-\x1b\0\0\0\0\0\0\0\0\0\0\x02\x10\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\
-\0\0\0\0\0\x02\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\x32\
-\0\0\0\x0f\0\0\0\x40\0\0\0\x49\0\0\0\0\0\0\x0e\x11\0\0\0\x01\0\0\0\0\0\0\0\0\0\
-\0\x02\x14\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\
-\0\0\0\0\x02\x16\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x10\0\0\
-\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x09\0\0\0\0\0\0\0\x1e\0\0\0\x13\0\0\0\
-\x40\0\0\0\x27\0\0\0\x07\0\0\0\x80\0\0\0\x32\0\0\0\x15\0\0\0\xc0\0\0\0\x57\0\0\
-\0\0\0\0\x0e\x17\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x1a\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x02\0\0\0\x04\0\0\0\x18\0\0\0\0\0\0\0\0\0\0\x02\x1c\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x04\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\
-\0\0\0\x09\0\0\0\0\0\0\0\x1e\0\0\0\x07\0\0\0\x40\0\0\0\x27\0\0\0\x19\0\0\0\x80\
-\0\0\0\x32\0\0\0\x1b\0\0\0\xc0\0\0\0\x69\0\0\0\0\0\0\x0e\x1d\0\0\0\x01\0\0\0\0\
-\0\0\0\0\0\0\x02\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x40\0\
-\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x09\0\0\0\0\0\0\0\x1e\0\0\0\x1f\0\
-\0\0\x40\0\0\0\x27\0\0\0\x19\0\0\0\x80\0\0\0\x32\0\0\0\x1b\0\0\0\xc0\0\0\0\x76\
-\0\0\0\0\0\0\x0e\x21\0\0\0\x01\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\
-\x09\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x27\0\0\0\x13\0\0\0\x80\0\0\0\
-\x32\0\0\0\x1b\0\0\0\xc0\0\0\0\x83\0\0\0\0\0\0\x0e\x23\0\0\0\x01\0\0\0\0\0\0\0\
-\0\0\0\x02\x26\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\x08\0\0\
-\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\x32\0\0\0\x25\0\0\0\
-\x40\0\0\0\x92\0\0\0\0\0\0\x0e\x27\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x2a\0\0\0\
-\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\x10\0\0\0\0\0\x02\0\0\x04\
-\x10\0\0\0\x19\0\0\0\x0d\0\0\0\0\0\0\0\x32\0\0\0\x29\0\0\0\x40\0\0\0\xa5\0\0\0\
-\0\0\0\x0e\x2b\0\0\0\x01\0\0\0\xb3\0\0\0\0\0\0\x0e\x2b\0\0\0\x01\0\0\0\0\0\0\0\
-\0\0\0\x02\x2f\0\0\0\xc5\0\0\0\x0e\0\0\x04\x50\0\0\0\xde\0\0\0\x30\0\0\0\0\0\0\
-\0\xea\0\0\0\x31\0\0\0\x10\0\0\0\xf7\0\0\0\x31\0\0\0\x18\0\0\0\x0c\x01\0\0\x02\
-\0\0\0\x20\0\0\0\x17\x01\0\0\x32\0\0\0\x40\0\0\0\x1f\x01\0\0\x32\0\0\0\x80\0\0\
-\0\x26\x01\0\0\x02\0\0\0\xc0\0\0\0\x2c\x01\0\0\x34\0\0\0\xe0\0\0\0\x32\x01\0\0\
-\x34\0\0\0\xf0\0\0\0\x38\x01\0\0\x34\0\0\0\0\x01\0\0\x3f\x01\0\0\x36\0\0\0\x10\
-\x01\0\0\x45\x01\0\0\x36\0\0\0\x30\x01\0\0\x4b\x01\0\0\x37\0\0\0\x50\x01\0\0\
-\x54\x01\0\0\x37\0\0\0\xd0\x01\0\0\x5d\x01\0\0\0\0\0\x01\x02\0\0\0\x10\0\0\0\
-\x6c\x01\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\x02\x33\0\0\0\0\0\0\0\
-\0\0\0\x0a\0\0\0\0\x7a\x01\0\0\0\0\0\x08\x30\0\0\0\x80\x01\0\0\0\0\0\x08\x31\0\
-\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x35\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x03\
-\0\0\0\0\x35\0\0\0\x04\0\0\0\x10\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x85\x01\0\
-\0\x2e\0\0\0\x89\x01\0\0\x01\0\0\x0c\x38\0\0\0\x9a\x01\0\0\x1c\0\0\x84\xe8\0\0\
-\0\0\0\0\0\x3b\0\0\0\0\0\0\0\0\0\0\0\x47\0\0\0\xc0\0\0\0\0\0\0\0\x49\0\0\0\0\
-\x01\0\0\xa2\x01\0\0\x52\0\0\0\x40\x01\0\0\0\0\0\0\x53\0\0\0\xc0\x02\0\0\xa5\
-\x01\0\0\x40\0\0\0\x40\x03\0\0\xab\x01\0\0\x57\0\0\0\x80\x03\0\0\xaf\x01\0\0\
-\x57\0\0\0\xa0\x03\0\0\xb8\x01\0\0\x34\0\0\0\xc0\x03\0\0\xc0\x01\0\0\x34\0\0\0\
-\xd0\x03\0\0\xc8\x01\0\0\x34\0\0\0\xe0\x03\0\0\xd6\x01\0\0\x58\0\0\0\xf0\x03\0\
-\0\xe6\x01\0\0\x35\0\0\0\xf0\x03\0\x01\xed\x01\0\0\x35\0\0\0\xf1\x03\0\x01\xf3\
-\x01\0\0\x35\0\0\0\xf2\x03\0\x02\xfa\x01\0\0\x35\0\0\0\xf4\x03\0\x01\x01\x02\0\
-\0\x35\0\0\0\xf5\x03\0\x01\x0b\x02\0\0\x35\0\0\0\xf6\x03\0\x01\x16\x02\0\0\x35\
-\0\0\0\xf7\x03\0\x01\x21\x02\0\0\x35\0\0\0\xf8\x03\0\0\0\0\0\0\x59\0\0\0\0\x04\
-\0\0\x33\x02\0\0\x67\0\0\0\xe0\x05\0\0\x38\x02\0\0\x67\0\0\0\0\x06\0\0\x3c\x02\
-\0\0\x68\0\0\0\x40\x06\0\0\x41\x02\0\0\x68\0\0\0\x80\x06\0\0\x46\x02\0\0\x57\0\
-\0\0\xc0\x06\0\0\x4f\x02\0\0\x69\0\0\0\xe0\x06\0\0\x55\x02\0\0\x6d\0\0\0\0\x07\
-\0\0\0\0\0\0\x04\0\0\x05\x18\0\0\0\0\0\0\0\x3c\0\0\0\0\0\0\0\x60\x02\0\0\x41\0\
-\0\0\0\0\0\0\x67\x02\0\0\x43\0\0\0\0\0\0\0\x6c\x02\0\0\x45\0\0\0\0\0\0\0\0\0\0\
-\0\x03\0\0\x04\x18\0\0\0\x74\x02\0\0\x3d\0\0\0\0\0\0\0\x79\x02\0\0\x3d\0\0\0\
-\x40\0\0\0\0\0\0\0\x3e\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x3a\0\0\0\0\0\0\0\x02\
-\0\0\x05\x08\0\0\0\x7e\x02\0\0\x3f\0\0\0\0\0\0\0\x82\x02\0\0\x40\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x02\x74\x01\0\0\x8e\x02\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\x9c\
-\x02\0\0\x03\0\0\x04\x18\0\0\0\xa4\x02\0\0\x40\0\0\0\0\0\0\0\xb6\x02\0\0\x42\0\
-\0\0\x40\0\0\0\xbf\x02\0\0\x42\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x41\0\0\0\xc7\
-\x02\0\0\x02\0\0\x04\x10\0\0\0\x74\x02\0\0\x44\0\0\0\0\0\0\0\x79\x02\0\0\x44\0\
-\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x43\0\0\0\xd1\x02\0\0\x01\0\0\x04\x08\0\0\0\
-\x74\x02\0\0\x46\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x45\0\0\0\0\0\0\0\x02\0\0\x05\
-\x08\0\0\0\xdc\x02\0\0\x48\0\0\0\0\0\0\0\xdf\x02\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x02\x79\0\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\xf0\x02\0\0\x4a\0\0\0\0\0\0\
-\0\xf7\x02\0\0\x4e\0\0\0\0\0\0\0\x05\x03\0\0\0\0\0\x08\x4b\0\0\0\x0d\x03\0\0\0\
-\0\0\x08\x4c\0\0\0\x11\x03\0\0\0\0\0\x08\x4d\0\0\0\x17\x03\0\0\0\0\0\x01\x08\0\
-\0\0\x40\0\0\x01\x21\x03\0\0\0\0\0\x08\x4f\0\0\0\x25\x03\0\0\0\0\0\x08\x50\0\0\
-\0\x2b\x03\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\x3e\x03\0\0\0\0\0\x01\x01\0\0\0\
-\x08\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x51\0\0\0\x04\0\0\0\x30\0\0\0\0\0\0\0\
-\x03\0\0\x05\x10\0\0\0\0\0\0\0\x54\0\0\0\0\0\0\0\x43\x03\0\0\x43\0\0\0\0\0\0\0\
-\x56\x03\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x60\x03\0\0\x40\0\
-\0\0\0\0\0\0\x6c\x03\0\0\x55\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x56\0\0\0\0\0\0\
-\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x3d\0\0\0\x77\x03\0\0\0\0\0\x01\x04\0\0\0\x20\0\
-\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x35\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\
-\x3c\0\0\0\0\0\0\0\x5a\0\0\0\0\0\0\0\x84\x03\0\0\x5a\0\0\0\0\0\0\0\0\0\0\0\x30\
-\0\0\x84\x3c\0\0\0\x8c\x03\0\0\x58\0\0\0\0\0\0\0\x9e\x03\0\0\x35\0\0\0\0\0\0\
-\x03\xa7\x03\0\0\x35\0\0\0\x03\0\0\x01\xb1\x03\0\0\x35\0\0\0\x04\0\0\x01\xba\
-\x03\0\0\x35\0\0\0\x05\0\0\x02\xc4\x03\0\0\x35\0\0\0\x07\0\0\x01\xcd\x03\0\0\
-\x35\0\0\0\x08\0\0\x01\xd5\x03\0\0\x35\0\0\0\x09\0\0\x01\xdd\x03\0\0\x35\0\0\0\
-\x0a\0\0\x01\xee\x03\0\0\x35\0\0\0\x0b\0\0\x01\xf9\x03\0\0\x35\0\0\0\x0c\0\0\
-\x01\0\x04\0\0\x35\0\0\0\x0d\0\0\x01\x0e\x04\0\0\x35\0\0\0\x0e\0\0\x01\x1d\x04\
-\0\0\x35\0\0\0\x0f\0\0\x01\x28\x04\0\0\x58\0\0\0\x10\0\0\0\x42\x04\0\0\x35\0\0\
-\0\x10\0\0\x01\x52\x04\0\0\x35\0\0\0\x11\0\0\x01\x63\x04\0\0\x35\0\0\0\x12\0\0\
-\x02\x6e\x04\0\0\x35\0\0\0\x14\0\0\x01\x82\x04\0\0\x35\0\0\0\x15\0\0\x01\x95\
-\x04\0\0\x35\0\0\0\x16\0\0\x01\xa6\x04\0\0\x35\0\0\0\x17\0\0\x01\xb4\x04\0\0\
-\x35\0\0\0\x18\0\0\x02\xc3\x04\0\0\x35\0\0\0\x1a\0\0\x01\xd1\x04\0\0\x35\0\0\0\
-\x1b\0\0\x01\xe5\x04\0\0\x35\0\0\0\x1c\0\0\x01\xf0\x04\0\0\x35\0\0\0\x1d\0\0\
-\x01\xff\x04\0\0\x35\0\0\0\x1e\0\0\x01\x08\x05\0\0\x35\0\0\0\x1f\0\0\x01\x16\
-\x05\0\0\x35\0\0\0\x20\0\0\x01\x23\x05\0\0\x34\0\0\0\x30\0\0\0\0\0\0\0\x5b\0\0\
-\0\x40\0\0\0\x2c\x05\0\0\x5d\0\0\0\x60\0\0\0\x35\x05\0\0\x02\0\0\0\x80\0\0\0\
-\x3d\x05\0\0\x5d\0\0\0\xa0\0\0\0\0\0\0\0\x5f\0\0\0\xc0\0\0\0\0\0\0\0\x63\0\0\0\
-\xe0\0\0\0\x42\x05\0\0\x64\0\0\0\0\x01\0\0\x4c\x05\0\0\x5d\0\0\0\x20\x01\0\0\0\
-\0\0\0\x65\0\0\0\x40\x01\0\0\0\0\0\0\x66\0\0\0\x60\x01\0\0\x54\x05\0\0\x34\0\0\
-\0\x70\x01\0\0\x6b\x05\0\0\x34\0\0\0\x80\x01\0\0\x80\x05\0\0\x34\0\0\0\x90\x01\
-\0\0\x91\x05\0\0\x62\0\0\0\xa0\x01\0\0\x9a\x05\0\0\x34\0\0\0\xb0\x01\0\0\xab\
-\x05\0\0\x34\0\0\0\xc0\x01\0\0\xba\x05\0\0\x34\0\0\0\xd0\x01\0\0\0\0\0\0\x02\0\
-\0\x05\x04\0\0\0\xc5\x05\0\0\x5c\0\0\0\0\0\0\0\0\0\0\0\x5e\0\0\0\0\0\0\0\xca\
-\x05\0\0\0\0\0\x08\x5d\0\0\0\xd1\x05\0\0\0\0\0\x08\x57\0\0\0\0\0\0\0\x02\0\0\
-\x04\x04\0\0\0\xd7\x05\0\0\x34\0\0\0\0\0\0\0\xe2\x05\0\0\x34\0\0\0\x10\0\0\0\0\
-\0\0\0\x02\0\0\x05\x04\0\0\0\xee\x05\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\x61\0\0\0\0\
-\0\0\0\xf7\x05\0\0\0\0\0\x08\x5d\0\0\0\0\0\0\0\x02\0\0\x04\x04\0\0\0\xfb\x05\0\
-\0\x62\0\0\0\0\0\0\0\x06\x06\0\0\x34\0\0\0\x10\0\0\0\x0f\x06\0\0\0\0\0\x08\x34\
-\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\x16\x06\0\0\x57\0\0\0\0\0\0\0\x1e\x06\0\0\
-\x57\0\0\0\0\0\0\0\x29\x06\0\0\0\0\0\x08\x34\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\
-\0\x2d\x06\0\0\x5d\0\0\0\0\0\0\0\x32\x06\0\0\x5d\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\
-\x05\x02\0\0\0\x44\x06\0\0\x62\0\0\0\0\0\0\0\x53\x06\0\0\x35\0\0\0\0\0\0\0\x61\
-\x06\0\0\0\0\0\x08\x57\0\0\0\0\0\0\0\0\0\0\x02\x31\0\0\0\x70\x06\0\0\0\0\0\x08\
-\x6a\0\0\0\x7b\x06\0\0\x01\0\0\x04\x04\0\0\0\x8b\x06\0\0\x6b\0\0\0\0\0\0\0\x90\
-\x06\0\0\0\0\0\x08\x6c\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\0\x99\x06\0\0\x02\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x02\x7b\x01\0\0\xa1\x06\0\0\x0c\0\0\x84\x30\0\0\0\xac\
-\x06\0\0\x5d\0\0\0\0\0\0\0\xb0\x06\0\0\x5d\0\0\0\x20\0\0\0\0\0\0\0\x6f\0\0\0\
-\x40\0\0\0\xb8\x06\0\0\x35\0\0\0\x60\0\0\0\xc2\x06\0\0\x35\0\0\0\x68\0\0\0\xc9\
-\x06\0\0\x35\0\0\0\x70\0\0\0\xd4\x06\0\0\x35\0\0\0\x78\0\0\x01\xe0\x06\0\0\x35\
-\0\0\0\x79\0\0\x01\xe4\x06\0\0\x35\0\0\0\x7a\0\0\x01\xf1\x06\0\0\x35\0\0\0\x7b\
-\0\0\x05\xf8\x06\0\0\x5d\0\0\0\x80\0\0\0\0\0\0\0\x71\0\0\0\xc0\0\0\0\0\0\0\0\
-\x02\0\0\x05\x04\0\0\0\0\x07\0\0\x5d\0\0\0\0\0\0\0\0\0\0\0\x70\0\0\0\0\0\0\0\0\
-\0\0\0\x02\0\0\x04\x04\0\0\0\x0b\x07\0\0\x64\0\0\0\0\0\0\0\x18\x07\0\0\x64\0\0\
-\0\x10\0\0\0\0\0\0\0\x02\0\0\x05\x18\0\0\0\x25\x07\0\0\x72\0\0\0\0\0\0\0\x28\
-\x07\0\0\x73\0\0\0\0\0\0\0\0\0\0\0\x06\0\0\x84\x18\0\0\0\x2f\x07\0\0\x5d\0\0\0\
-\0\0\0\x01\x3e\x07\0\0\x5d\0\0\0\x01\0\0\x14\xf1\x06\0\0\x5d\0\0\0\x15\0\0\x0b\
-\x4b\x07\0\0\x5d\0\0\0\x20\0\0\0\x55\x07\0\0\x4e\0\0\0\x40\0\0\0\x65\x07\0\0\
-\x4e\0\0\0\x80\0\0\0\0\0\0\0\x02\0\0\x05\x18\0\0\0\x76\x07\0\0\x74\0\0\0\0\0\0\
-\0\x79\x07\0\0\x78\0\0\0\0\0\0\0\x7c\x07\0\0\x04\0\0\x04\x18\0\0\0\x8a\x07\0\0\
-\x02\0\0\0\0\0\0\0\x8e\x07\0\0\x75\0\0\0\x20\0\0\0\x92\x07\0\0\x64\0\0\0\xa0\0\
-\0\0\x98\x07\0\0\x64\0\0\0\xb0\0\0\0\xa6\x07\0\0\x10\0\0\x84\x10\0\0\0\xb1\x07\
-\0\0\x76\0\0\0\0\0\0\0\xb7\x07\0\0\x76\0\0\0\x20\0\0\0\xbf\x07\0\0\x31\0\0\0\
-\x40\0\0\0\xc6\x07\0\0\x31\0\0\0\x48\0\0\0\xca\x07\0\0\x31\0\0\0\x50\0\0\0\xcd\
-\x07\0\0\x31\0\0\0\x58\0\0\0\xd0\x07\0\0\x31\0\0\0\x60\0\0\x01\xdf\x07\0\0\x31\
-\0\0\0\x61\0\0\x01\xea\x07\0\0\x31\0\0\0\x62\0\0\x01\xf5\x07\0\0\x31\0\0\0\x63\
-\0\0\x01\x01\x08\0\0\x31\0\0\0\x64\0\0\x01\x0d\x08\0\0\x31\0\0\0\x65\0\0\x01\
-\x19\x08\0\0\x31\0\0\0\x68\0\0\0\x26\x08\0\0\x31\0\0\0\x70\0\0\0\x2c\x08\0\0\
-\x31\0\0\0\x78\0\0\0\x33\x08\0\0\x77\0\0\0\x80\0\0\0\x3a\x08\0\0\0\0\0\x08\x5d\
-\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x31\0\0\0\x04\0\0\0\0\0\0\0\x41\x08\0\0\x0b\0\
-\0\x04\x18\0\0\0\x8a\x07\0\0\x02\0\0\0\0\0\0\0\x50\x08\0\0\x62\0\0\0\x20\0\0\0\
-\x53\x08\0\0\x34\0\0\0\x30\0\0\0\x58\x08\0\0\x34\0\0\0\x40\0\0\0\x5e\x08\0\0\
-\x34\0\0\0\x50\0\0\0\x63\x08\0\0\x34\0\0\0\x60\0\0\0\x6b\x08\0\0\x34\0\0\0\x70\
-\0\0\0\x92\x07\0\0\x34\0\0\0\x80\0\0\0\x71\x08\0\0\x34\0\0\0\x90\0\0\0\x98\x07\
-\0\0\x34\0\0\0\xa0\0\0\0\x78\x08\0\0\x34\0\0\0\xb0\0\0\0\x7f\x08\0\0\x5c\0\0\
-\x84\0\x05\0\0\x84\x08\0\0\x7a\0\0\0\0\0\0\0\x90\x08\0\0\x9b\0\0\0\x40\x04\0\0\
-\x9a\x08\0\0\x02\0\0\0\x80\x04\0\0\xac\x08\0\0\x60\0\0\0\xa0\x04\0\0\xbd\x08\0\
-\0\x9c\0\0\0\xc0\x04\0\0\xc5\x08\0\0\x6b\0\0\0\xc0\x0a\0\0\xce\x08\0\0\x02\0\0\
-\0\xe0\x0a\0\0\xda\x08\0\0\xbb\0\0\0\0\x0b\0\0\xe9\x08\0\0\xbb\0\0\0\xc0\x0d\0\
-\0\xfa\x08\0\0\xbf\0\0\0\x80\x10\0\0\x05\x09\0\0\x02\0\0\0\x40\x11\0\0\x16\x09\
-\0\0\x60\0\0\0\x60\x11\0\0\x26\x09\0\0\x57\0\0\0\x80\x11\0\0\x31\x09\0\0\x57\0\
-\0\0\xa0\x11\0\0\x3c\x09\0\0\x02\0\0\0\xc0\x11\0\0\x46\x09\0\0\xc0\0\0\0\0\x12\
-\0\0\0\0\0\0\xc1\0\0\0\x40\x12\0\0\x50\x09\0\0\xe6\0\0\0\x80\x12\0\0\x5a\x09\0\
-\0\x9b\0\0\0\0\x13\0\0\x67\x09\0\0\x6b\0\0\0\x40\x13\0\0\x75\x09\0\0\x02\0\0\0\
-\x60\x13\0\0\x7f\x09\0\0\x02\0\0\0\x80\x13\0\0\x8e\x09\0\0\x69\0\0\0\xa0\x13\0\
-\0\x9c\x09\0\0\x40\0\0\0\xc0\x13\0\0\0\0\0\0\xe7\0\0\0\0\x14\0\0\xa9\x09\0\0\
-\xbb\0\0\0\x40\x14\0\0\xb8\x09\0\0\xe9\0\0\0\0\x17\0\0\xc4\x09\0\0\x02\0\0\0\
-\x20\x17\0\0\xd5\x09\0\0\x5d\0\0\0\x40\x17\0\0\xec\x09\0\0\x60\0\0\0\x60\x17\0\
-\0\xfd\x09\0\0\xea\0\0\0\x80\x17\0\0\x09\x0a\0\0\xcc\0\0\0\xc0\x17\0\0\x12\x0a\
-\0\0\x5d\0\0\0\x40\x1a\0\0\x1e\x0a\0\0\x5d\0\0\0\x60\x1a\0\0\x26\x0a\0\0\x40\0\
-\0\0\x80\x1a\0\0\x35\x0a\0\0\x40\0\0\0\xc0\x1a\0\0\x48\x0a\0\0\xeb\0\0\0\0\x1b\
-\0\0\x50\x0a\0\0\xed\0\0\0\x80\x1b\0\0\x5e\x0a\0\0\x02\0\0\0\xc0\x1b\0\0\x6a\
-\x0a\0\0\x57\0\0\0\xe0\x1b\0\0\x7a\x0a\0\0\xee\0\0\0\0\x1c\0\0\x88\x0a\0\0\x5d\
-\0\0\0\x20\x1c\0\0\x92\x0a\0\0\xa6\0\0\0\x40\x1c\0\x01\xa2\x0a\0\0\xa6\0\0\0\
-\x41\x1c\0\x01\xaf\x0a\0\0\xa6\0\0\0\x42\x1c\0\x01\xbe\x0a\0\0\xa6\0\0\0\x43\
-\x1c\0\x01\xcd\x0a\0\0\xa6\0\0\0\x44\x1c\0\x04\xda\x0a\0\0\xa6\0\0\0\x48\x1c\0\
-\0\xea\x0a\0\0\x64\0\0\0\x50\x1c\0\0\xf2\x0a\0\0\x64\0\0\0\x60\x1c\0\0\xfe\x0a\
-\0\0\x64\0\0\0\x70\x1c\0\0\x0e\x0b\0\0\x40\0\0\0\x80\x1c\0\0\x1c\x0b\0\0\x88\0\
-\0\0\xc0\x1c\0\0\x2c\x0b\0\0\xc5\0\0\0\0\x1d\0\0\x3d\x0b\0\0\x02\0\0\0\0\x1f\0\
-\0\x44\x0b\0\0\x02\0\0\0\x20\x1f\0\0\x50\x0b\0\0\x60\0\0\0\x40\x1f\0\0\x5f\x0b\
-\0\0\x60\0\0\0\x60\x1f\0\0\x72\x0b\0\0\xef\0\0\0\x80\x1f\0\0\x79\x0b\0\0\xa6\0\
-\0\0\xa0\x1f\0\0\x85\x0b\0\0\xa6\0\0\0\xa8\x1f\0\0\x99\x0b\0\0\x64\0\0\0\xb0\
-\x1f\0\0\xad\x0b\0\0\x9e\0\0\0\xc0\x1f\0\0\xba\x0b\0\0\x02\0\0\0\xc0\x21\0\0\
-\xc6\x0b\0\0\xf2\0\0\0\0\x22\0\0\xd2\x0b\0\0\xf3\0\0\0\x40\x22\0\0\xdf\x0b\0\0\
-\xea\0\0\0\x80\x22\0\0\xeb\x0b\0\0\x4a\0\0\0\xc0\x22\0\0\xf4\x0b\0\0\x6b\0\0\0\
-\0\x23\0\0\xfd\x0b\0\0\x6b\0\0\0\x20\x23\0\0\x06\x0c\0\0\x60\0\0\0\x40\x23\0\0\
-\x11\x0c\0\0\xa6\0\0\0\x60\x23\0\0\x1d\x0c\0\0\xa6\0\0\0\x68\x23\0\0\x28\x0c\0\
-\0\xa6\0\0\0\x70\x23\0\x01\x40\x0c\0\0\xa6\0\0\0\x71\x23\0\x01\x58\x0c\0\0\xa6\
-\0\0\0\x72\x23\0\x06\x69\x0c\0\0\xf5\0\0\0\x80\x23\0\0\x73\x0c\0\0\xa8\0\0\0\
-\xc0\x23\0\0\x80\x0c\0\0\xa8\0\0\0\0\x24\0\0\x8c\x0c\0\0\xf6\0\0\0\x40\x24\0\0\
-\x99\x0c\0\0\xf8\0\0\0\xc0\x24\0\0\xa2\x0c\0\0\xf9\0\0\0\0\x25\0\0\xb2\x0c\0\0\
-\xf9\0\0\0\x40\x25\0\0\xc0\x0c\0\0\xf9\0\0\0\x80\x25\0\0\xcf\x0c\0\0\xf9\0\0\0\
-\xc0\x25\0\0\xdf\x0c\0\0\xfb\0\0\0\0\x26\0\0\xee\x0c\0\0\xf9\0\0\0\x40\x26\0\0\
-\xfa\x0c\0\0\xfd\0\0\0\x80\x26\0\0\x0a\x0d\0\0\xfe\0\0\0\xc0\x26\0\0\x19\x0d\0\
-\0\xdf\0\0\0\0\x27\0\0\x20\x0d\0\0\xff\0\0\0\x80\x27\0\0\x2b\x0d\0\0\x85\0\0\0\
-\x80\x27\0\0\x39\x0d\0\0\x19\0\0\x84\x88\0\0\0\0\0\0\0\x7b\0\0\0\0\0\0\0\0\0\0\
-\0\x7e\0\0\0\x40\0\0\0\0\0\0\0\x80\0\0\0\x60\0\0\0\x45\x0d\0\0\x30\0\0\0\x80\0\
-\0\0\x50\x0d\0\0\x83\0\0\0\x90\0\0\0\x5a\x0d\0\0\x31\0\0\0\x98\0\0\x04\x64\x0d\
-\0\0\x31\0\0\0\x9c\0\0\x01\x72\x0d\0\0\x31\0\0\0\x9d\0\0\x01\x7f\x0d\0\0\x31\0\
-\0\0\x9e\0\0\x01\x8e\x0d\0\0\x02\0\0\0\xa0\0\0\0\0\0\0\0\x84\0\0\0\xc0\0\0\0\
-\x9f\x0d\0\0\x88\0\0\0\x40\x01\0\0\xa8\x0d\0\0\x89\0\0\0\x80\x01\0\0\xb0\x0d\0\
-\0\x8c\0\0\0\xc0\x01\0\0\xbd\x0d\0\0\x8c\0\0\0\x40\x02\0\0\xce\x0d\0\0\x90\0\0\
-\0\xc0\x02\0\0\0\0\0\0\x92\0\0\0\0\x03\0\0\xd9\x0d\0\0\x94\0\0\0\x40\x03\0\0\0\
-\0\0\0\x95\0\0\0\x40\x03\0\0\xec\x0d\0\0\x30\0\0\0\xc0\x03\0\0\x01\x0e\0\0\x30\
-\0\0\0\xd0\x03\0\0\0\0\0\0\x99\0\0\0\xe0\x03\0\0\x16\x0e\0\0\x69\0\0\0\0\x04\0\
-\0\x21\x0e\0\0\x94\0\0\0\x20\x04\0\0\0\0\0\0\x9a\0\0\0\x20\x04\0\0\0\0\0\0\x02\
-\0\0\x05\x08\0\0\0\x32\x0e\0\0\x7c\0\0\0\0\0\0\0\0\0\0\0\x7d\0\0\0\0\0\0\0\x3f\
-\x0e\0\0\0\0\0\x08\x4f\0\0\0\0\0\0\0\x02\0\0\x04\x08\0\0\0\x4a\x0e\0\0\x76\0\0\
-\0\0\0\0\0\x54\x0e\0\0\x76\0\0\0\x20\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\x62\
-\x0e\0\0\x57\0\0\0\0\0\0\0\x6b\x0e\0\0\x7f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\
-\0\0\x34\0\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\x79\x0e\0\0\
-\x81\0\0\0\0\0\0\0\0\0\0\0\x82\0\0\0\0\0\0\0\x86\x0e\0\0\0\0\0\x08\x5d\0\0\0\0\
-\0\0\0\x02\0\0\x04\x04\0\0\0\x91\x0e\0\0\x62\0\0\0\0\0\0\0\x9b\x0e\0\0\x34\0\0\
-\0\x10\0\0\0\0\0\0\0\0\0\0\x09\x31\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\xa3\x0e\
-\0\0\x85\0\0\0\0\0\0\0\xb1\x0e\0\0\x85\0\0\0\0\0\0\0\xc3\x0e\0\0\x02\0\0\x04\
-\x10\0\0\0\x74\x02\0\0\x86\0\0\0\0\0\0\0\xce\x0e\0\0\x87\0\0\0\x40\0\0\0\0\0\0\
-\0\0\0\0\x02\x85\0\0\0\0\0\0\0\0\0\0\x02\x86\0\0\0\0\0\0\0\0\0\0\x02\x77\x01\0\
-\0\xd4\x0e\0\0\0\0\0\x08\x8a\0\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\xe3\x0e\0\0\
-\x8b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x73\x01\0\0\xe7\x0e\0\0\x01\0\0\x04\x10\0\
-\0\0\xf0\x0e\0\0\x8d\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\x05\x10\0\0\0\xf6\x0e\0\0\
-\x37\0\0\0\0\0\0\0\xff\x0e\0\0\x8e\0\0\0\0\0\0\0\x09\x0f\0\0\x8f\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x03\0\0\0\0\x62\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\x03\0\0\
-\0\0\x76\0\0\0\x04\0\0\0\x04\0\0\0\x13\x0f\0\0\0\0\0\x08\x91\0\0\0\0\0\0\0\x01\
-\0\0\x04\x08\0\0\0\x99\x06\0\0\x4b\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\x05\x08\0\0\0\
-\x1e\x0f\0\0\x40\0\0\0\0\0\0\0\x28\x0f\0\0\x48\0\0\0\0\0\0\0\x35\x0f\0\0\x93\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x6c\x01\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\
-\x04\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\x3f\x0f\0\0\x85\0\0\0\0\0\0\0\
-\x48\x0f\0\0\x96\0\0\0\0\0\0\0\x57\x0f\0\0\x02\0\0\x04\x10\0\0\0\x74\x02\0\0\
-\x97\0\0\0\0\0\0\0\xce\x0e\0\0\x98\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x96\0\0\0\
-\0\0\0\0\0\0\0\x02\x97\0\0\0\0\0\0\0\x03\0\0\x05\x04\0\0\0\x68\x0f\0\0\x02\0\0\
-\0\0\0\0\0\x79\x0f\0\0\x60\0\0\0\0\0\0\0\x85\x0f\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\x05\x04\0\0\0\x94\x0f\0\0\x60\0\0\0\0\0\0\0\x9f\x0f\0\0\x60\0\0\0\0\0\
-\0\0\xb0\x0f\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x67\x01\0\0\xbf\x0f\0\0\0\
-\0\0\x08\x9d\0\0\0\0\0\0\0\x04\0\0\x04\xc0\0\0\0\xcd\x0f\0\0\x9e\0\0\0\0\0\0\0\
-\xd3\x0f\0\0\x02\0\0\0\0\x02\0\0\xd9\x0f\0\0\xb9\0\0\0\x40\x02\0\0\xdc\x0f\0\0\
-\xa9\0\0\0\xc0\x04\0\0\xe4\x0f\0\0\0\0\0\x08\x9f\0\0\0\xef\x0f\0\0\x01\0\0\x04\
-\x40\0\0\0\0\0\0\0\xa0\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\x40\0\0\0\xf8\x0f\0\0\
-\xa1\0\0\0\0\0\0\0\0\0\0\0\xb7\0\0\0\0\0\0\0\xfe\x0f\0\0\x05\0\0\x04\x40\0\0\0\
-\x0b\x10\0\0\xa2\0\0\0\0\0\0\0\x14\x10\0\0\x57\0\0\0\x20\0\0\0\x1a\x10\0\0\x57\
-\0\0\0\x40\0\0\0\x24\x10\0\0\xa8\0\0\0\x80\0\0\0\xdc\x0f\0\0\xa9\0\0\0\xc0\0\0\
-\0\x2a\x10\0\0\0\0\0\x08\xa3\0\0\0\x3a\x10\0\0\x01\0\0\x04\x04\0\0\0\0\0\0\0\
-\xa4\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\x05\x04\0\0\0\x44\x10\0\0\x6b\0\0\0\0\0\0\0\
-\0\0\0\0\xa5\0\0\0\0\0\0\0\0\0\0\0\xa7\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x02\0\
-\0\0\x48\x10\0\0\xa6\0\0\0\0\0\0\0\x4f\x10\0\0\xa6\0\0\0\x08\0\0\0\x57\x10\0\0\
-\0\0\0\x08\x35\0\0\0\0\0\0\0\x02\0\0\x04\x04\0\0\0\x5a\x10\0\0\x64\0\0\0\0\0\0\
-\0\x33\x02\0\0\x64\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\0\x69\x10\0\0\x06\0\
-\0\x04\x28\0\0\0\x75\x10\0\0\xaa\0\0\0\0\0\0\0\x79\x10\0\0\xb6\0\0\0\x40\0\0\0\
-\x85\x10\0\0\xb4\0\0\0\xc0\0\0\0\x8a\x10\0\0\xa6\0\0\0\0\x01\0\0\x9a\x10\0\0\
-\xa6\0\0\0\x08\x01\0\0\xaa\x10\0\0\xa6\0\0\0\x10\x01\0\0\0\0\0\0\0\0\0\x02\x70\
-\x01\0\0\0\0\0\0\0\0\0\x02\xac\0\0\0\xb4\x10\0\0\x0e\0\0\x04\xc0\0\0\0\xbf\x10\
-\0\0\x85\0\0\0\0\0\0\0\xca\x10\0\0\x43\0\0\0\x80\0\0\0\xd5\x10\0\0\x43\0\0\0\0\
-\x01\0\0\xe1\x10\0\0\x43\0\0\0\x80\x01\0\0\x75\x10\0\0\xad\0\0\0\0\x02\0\0\xee\
-\x10\0\0\x57\0\0\0\x40\x02\0\0\xf7\x10\0\0\x57\0\0\0\x60\x02\0\0\x02\x11\0\0\
-\x40\0\0\0\x80\x02\0\0\x0d\x11\0\0\xb3\0\0\0\xc0\x02\0\0\x1a\x11\0\0\x02\0\0\0\
-\x40\x05\0\0\x85\x10\0\0\xb4\0\0\0\x80\x05\0\0\x9a\x10\0\0\xa6\0\0\0\xc0\x05\0\
-\0\x8a\x10\0\0\xa6\0\0\0\xc8\x05\0\0\xaa\x10\0\0\xa6\0\0\0\xd0\x05\0\0\0\0\0\0\
-\0\0\0\x02\xae\0\0\0\0\0\0\0\0\0\0\x0a\x71\x01\0\0\0\0\0\0\0\0\0\x02\xb0\0\0\0\
-\0\0\0\0\0\0\0\x0a\xb1\0\0\0\x27\x11\0\0\x04\0\0\x04\x18\0\0\0\xbf\x10\0\0\x85\
-\0\0\0\0\0\0\0\x3d\x05\0\0\x60\0\0\0\x80\0\0\0\x32\x11\0\0\x60\0\0\0\xa0\0\0\0\
-\x3d\x11\0\0\xb2\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x40\0\0\0\x04\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xaf\0\0\0\x04\0\0\0\x0a\0\0\0\0\0\0\0\0\0\0\
-\x02\xb5\0\0\0\0\0\0\0\0\0\0\x0a\x51\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xab\0\0\0\
-\x04\0\0\0\x02\0\0\0\0\0\0\0\x02\0\0\x04\x40\0\0\0\x45\x11\0\0\xb8\0\0\0\0\0\0\
-\0\xdc\x0f\0\0\xa9\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xa6\0\0\0\x04\0\0\
-\0\x18\0\0\0\x4f\x11\0\0\0\0\0\x08\xba\0\0\0\x61\x11\0\0\x02\0\0\x04\x50\0\0\0\
-\x71\x11\0\0\x9e\0\0\0\0\0\0\0\x3c\x02\0\0\x43\0\0\0\0\x02\0\0\x76\x11\0\0\x03\
-\0\0\x04\x58\0\0\0\0\0\0\0\xbc\0\0\0\0\0\0\0\x83\x11\0\0\x5d\0\0\0\x80\0\0\0\
-\x71\x11\0\0\x9e\0\0\0\xc0\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\0\0\0\0\xbd\0\0\
-\0\0\0\0\0\x67\x02\0\0\xbe\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x74\x02\
-\0\0\x3d\0\0\0\0\0\0\0\x79\x02\0\0\x3d\0\0\0\x40\0\0\0\x88\x11\0\0\x02\0\0\x04\
-\x10\0\0\0\x74\x02\0\0\x3d\0\0\0\0\0\0\0\x79\x02\0\0\x3d\0\0\0\x40\0\0\0\0\0\0\
-\0\x04\0\0\x04\x18\0\0\0\x95\x11\0\0\x6b\0\0\0\0\0\0\0\xab\x01\0\0\x02\0\0\0\
-\x20\0\0\0\x3c\x02\0\0\x3d\0\0\0\x40\0\0\0\x33\x02\0\0\x3d\0\0\0\x80\0\0\0\0\0\
-\0\0\0\0\0\x02\x7a\x01\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\xa0\x11\0\0\xc2\0\0\0\
-\0\0\0\0\xa6\x11\0\0\xc2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x7e\x01\0\0\0\0\0\0\0\
-\0\0\x02\xc4\0\0\0\xb0\x11\0\0\x1c\0\0\x04\x08\x04\0\0\xbc\x11\0\0\x89\0\0\0\0\
-\0\0\0\xc3\x11\0\0\x85\0\0\0\x40\0\0\0\xc9\x11\0\0\x85\0\0\0\xc0\0\0\0\x71\x11\
-\0\0\xc5\0\0\0\x40\x01\0\0\xcf\x11\0\0\x69\0\0\0\x40\x03\0\0\xd6\x11\0\0\x60\0\
-\0\0\x60\x03\0\0\xda\x11\0\0\xcc\0\0\0\x80\x03\0\0\xe0\x11\0\0\x6b\0\0\0\0\x06\
-\0\0\x2c\x05\0\0\x60\0\0\0\x20\x06\0\0\xe6\x11\0\0\x60\0\0\0\x40\x06\0\0\xec\
-\x11\0\0\x60\0\0\0\x60\x06\0\0\x2d\x06\0\0\xd0\0\0\0\x80\x06\0\0\xf2\x11\0\0\
-\xd1\0\0\0\xc0\x06\0\0\xfb\x11\0\0\xd5\0\0\0\x80\x08\0\0\xff\x11\0\0\xd6\0\0\0\
-\x80\x0a\0\0\x06\x12\0\0\xd7\0\0\0\x80\x0b\0\0\x0b\x12\0\0\xd8\0\0\0\x40\x0c\0\
-\0\x10\x12\0\0\xd9\0\0\0\xc0\x11\0\0\x19\0\0\0\xa6\0\0\0\xc8\x11\0\0\x1f\x12\0\
-\0\xa6\0\0\0\xd0\x11\0\0\x92\x07\0\0\xa6\0\0\0\xd8\x11\0\0\x26\x12\0\0\xa6\0\0\
-\0\xe0\x11\0\0\x38\x01\0\0\x64\0\0\0\xf0\x11\0\0\x2e\x12\0\0\xdb\0\0\0\0\x12\0\
-\0\x37\x12\0\0\xde\0\0\0\x40\x12\0\0\x40\x12\0\0\x85\0\0\0\x40\x1e\0\0\x53\x12\
-\0\0\xdf\0\0\0\xc0\x1e\0\0\x57\x12\0\0\xe3\0\0\0\x40\x1f\0\0\x5b\x12\0\0\0\0\0\
-\x08\xc6\0\0\0\0\0\0\0\x05\0\0\x04\x40\0\0\0\x0b\x10\0\0\xc7\0\0\0\0\0\0\0\x14\
-\x10\0\0\x57\0\0\0\x40\0\0\0\x1a\x10\0\0\x57\0\0\0\x60\0\0\0\x24\x10\0\0\xa8\0\
-\0\0\x80\0\0\0\xdc\x0f\0\0\xa9\0\0\0\xc0\0\0\0\x64\x12\0\0\0\0\0\x08\xc8\0\0\0\
-\x72\x12\0\0\x02\0\0\x04\x08\0\0\0\0\0\0\0\xc9\0\0\0\0\0\0\0\x7a\x12\0\0\xa2\0\
-\0\0\x20\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\x84\x12\0\0\x6b\0\0\0\0\0\0\0\0\0\
-\0\0\xca\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x04\0\0\0\x89\x12\0\0\xa6\0\0\0\0\0\
-\0\0\x91\x12\0\0\xcb\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xa6\0\0\0\x04\0\
-\0\0\x03\0\0\0\x9a\x12\0\0\x05\0\0\x04\x50\0\0\0\xa5\x12\0\0\x85\0\0\0\0\0\0\0\
-\xab\x12\0\0\x40\0\0\0\x80\0\0\0\xb3\x12\0\0\xcd\0\0\0\xc0\0\0\0\x92\x07\0\0\
-\x60\0\0\0\0\x01\0\0\x69\x10\0\0\xa9\0\0\0\x40\x01\0\0\0\0\0\0\0\0\0\x02\xce\0\
-\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\xcf\0\0\0\0\0\0\0\0\0\0\x02\xcc\0\0\0\
-\xbc\x12\0\0\x02\0\0\x04\x08\0\0\0\xc6\x12\0\0\x5d\0\0\0\0\0\0\0\xc8\x12\0\0\
-\x5d\0\0\0\x20\0\0\0\xca\x12\0\0\x0c\0\0\x04\x38\0\0\0\x45\x01\0\0\xd2\0\0\0\0\
-\0\0\0\x3f\x01\0\0\xd2\0\0\0\x80\0\0\0\x32\x01\0\0\x62\0\0\0\0\x01\0\0\xd8\x12\
-\0\0\x62\0\0\0\x10\x01\0\0\x2c\x01\0\0\x62\0\0\0\x20\x01\0\0\xe3\x12\0\0\x62\0\
-\0\0\x30\x01\0\0\x38\x01\0\0\x34\0\0\0\x40\x01\0\0\xee\x12\0\0\x35\0\0\0\x50\
-\x01\0\0\xfa\x12\0\0\x35\0\0\0\x58\x01\0\0\x06\x13\0\0\x35\0\0\0\x60\x01\0\0\
-\x0c\x13\0\0\x02\0\0\0\x80\x01\0\0\x14\x13\0\0\xd4\0\0\0\xa0\x01\0\0\x19\x13\0\
-\0\0\0\0\x08\xd3\0\0\0\0\0\0\0\x03\0\0\x05\x10\0\0\0\x28\x13\0\0\x76\0\0\0\0\0\
-\0\0\x2b\x13\0\0\x8f\0\0\0\0\0\0\0\x2e\x13\0\0\x8c\0\0\0\0\0\0\0\x32\x13\0\0\0\
-\0\0\x08\x57\0\0\0\x43\x13\0\0\x08\0\0\x04\x40\0\0\0\x55\x13\0\0\x4f\0\0\0\0\0\
-\0\0\x65\x13\0\0\x4f\0\0\0\x40\0\0\0\x75\x13\0\0\x4f\0\0\0\x80\0\0\0\x87\x13\0\
-\0\x4f\0\0\0\xc0\0\0\0\x99\x13\0\0\x4f\0\0\0\0\x01\0\0\xb2\x13\0\0\x4f\0\0\0\
-\x40\x01\0\0\xcb\x13\0\0\x4f\0\0\0\x80\x01\0\0\xe4\x13\0\0\x4f\0\0\0\xc0\x01\0\
-\0\xfd\x13\0\0\x04\0\0\x04\x20\0\0\0\x0f\x14\0\0\x4f\0\0\0\0\0\0\0\x15\x14\0\0\
-\x4f\0\0\0\x40\0\0\0\x1d\x14\0\0\x4f\0\0\0\x80\0\0\0\x26\x14\0\0\x4f\0\0\0\xc0\
-\0\0\0\x2f\x14\0\0\x02\0\0\x04\x18\0\0\0\x46\x14\0\0\x43\0\0\0\0\0\0\0\x4a\x14\
-\0\0\xa6\0\0\0\x80\0\0\0\x4f\x14\0\0\x03\0\0\x04\xb0\0\0\0\x61\x14\0\0\xbb\0\0\
-\0\0\0\0\0\x6c\x14\0\0\xcc\0\0\0\xc0\x02\0\0\x77\x14\0\0\x40\0\0\0\x40\x05\0\0\
-\x7f\x14\0\0\0\0\0\x08\xda\0\0\0\x84\x14\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x04\0\
-\0\0\0\0\0\0\x02\x85\x01\0\0\x8a\x14\0\0\x0b\0\0\x04\x40\0\0\0\x94\x14\0\0\xdd\
-\0\0\0\0\0\0\0\x3f\x01\0\0\xd2\0\0\0\xc0\0\0\0\x97\x14\0\0\x30\0\0\0\x40\x01\0\
-\0\xa4\x14\0\0\x60\0\0\0\x60\x01\0\0\xaa\x14\0\0\xa6\0\0\0\x80\x01\0\0\xaf\x14\
-\0\0\xa6\0\0\0\x88\x01\0\0\xb5\x14\0\0\xa6\0\0\0\x90\x01\0\0\xbe\x14\0\0\xa6\0\
-\0\0\x98\x01\0\0\xc6\x14\0\0\x60\0\0\0\xa0\x01\0\0\xcd\x14\0\0\x60\0\0\0\xc0\
-\x01\0\0\xd4\x14\0\0\x60\0\0\0\xe0\x01\0\0\xdb\x14\0\0\x03\0\0\x04\x18\0\0\0\
-\x45\x01\0\0\xd2\0\0\0\0\0\0\0\xe3\x14\0\0\x76\0\0\0\x80\0\0\0\x06\x13\0\0\x35\
-\0\0\0\xa0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xdc\0\0\0\x04\0\0\0\x06\0\0\0\xe7\
-\x14\0\0\x02\0\0\x04\x10\0\0\0\x74\x02\0\0\xe0\0\0\0\0\0\0\0\xf5\x14\0\0\xe1\0\
-\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\xdf\0\0\0\0\0\0\0\0\0\0\x02\xe2\0\0\0\0\0\0\0\
-\x01\0\0\x0d\0\0\0\0\0\0\0\0\xe0\0\0\0\xfa\x14\0\0\x06\0\0\x84\x20\0\0\0\x7e\
-\x02\0\0\x3f\0\0\0\0\0\0\0\x0b\x15\0\0\xe4\0\0\0\x40\0\0\0\x17\x15\0\0\x3f\0\0\
-\0\x40\0\0\0\x20\x15\0\0\x40\0\0\0\x80\0\0\0\x2f\x15\0\0\xa6\0\0\0\xc0\0\0\x02\
-\x19\0\0\0\xa6\0\0\0\xc2\0\0\x02\x33\x15\0\0\0\0\0\x08\xe5\0\0\0\0\0\0\0\0\0\0\
-\x04\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xc3\0\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\
-\x02\0\0\x05\x08\0\0\0\x45\x15\0\0\x3d\0\0\0\0\0\0\0\x52\x15\0\0\xe8\0\0\0\0\0\
-\0\0\x60\x15\0\0\x01\0\0\x04\x08\0\0\0\x9c\x02\0\0\x42\0\0\0\0\0\0\0\x68\x15\0\
-\0\0\0\0\x08\x02\0\0\0\x6e\x15\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\x01\x73\x15\0\0\
-\x03\0\0\x04\x10\0\0\0\x7d\x15\0\0\xec\0\0\0\0\0\0\0\x82\x15\0\0\x5d\0\0\0\x40\
-\0\0\0\x89\x15\0\0\x5d\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x02\x75\x01\0\0\x8e\x15\0\
-\0\0\0\0\x08\x4e\0\0\0\xa0\x15\0\0\0\0\0\x08\x57\0\0\0\xa6\x15\0\0\0\0\0\x08\
-\xf0\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\0\x44\x10\0\0\xf1\0\0\0\0\0\0\0\xad\x15\
-\0\0\0\0\0\x08\xd4\0\0\0\0\0\0\0\0\0\0\x02\x76\x01\0\0\0\0\0\0\0\0\0\x02\xf4\0\
-\0\0\0\0\0\0\0\0\0\x0a\x66\x01\0\0\0\0\0\0\0\0\0\x02\x7d\x01\0\0\xb3\x15\0\0\
-\x02\0\0\x04\x10\0\0\0\xc4\x15\0\0\xf7\0\0\0\0\0\0\0\xcb\x15\0\0\x60\0\0\0\x40\
-\0\0\0\0\0\0\0\0\0\0\x02\x65\x01\0\0\0\0\0\0\0\0\0\x02\x72\x01\0\0\0\0\0\0\0\0\
-\0\x02\xfa\0\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x48\0\0\0\0\0\0\0\0\0\0\
-\x02\xfc\0\0\0\0\0\0\0\x02\0\0\x0d\x02\0\0\0\0\0\0\0\x48\0\0\0\0\0\0\0\x3d\0\0\
-\0\0\0\0\0\0\0\0\x02\x7c\x01\0\0\0\0\0\0\0\0\0\x02\x64\x01\0\0\xd3\x15\0\0\0\0\
-\0\x08\xe5\0\0\0\0\0\0\0\0\0\0\x02\x01\x01\0\0\xe1\x15\0\0\x15\0\0\x04\xa8\0\0\
-\0\xe9\x15\0\0\x40\0\0\0\0\0\0\0\xed\x15\0\0\x40\0\0\0\x40\0\0\0\xf1\x15\0\0\
-\x40\0\0\0\x80\0\0\0\xf5\x15\0\0\x40\0\0\0\xc0\0\0\0\xf9\x15\0\0\x40\0\0\0\0\
-\x01\0\0\xfc\x15\0\0\x40\0\0\0\x40\x01\0\0\xff\x15\0\0\x40\0\0\0\x80\x01\0\0\
-\x03\x16\0\0\x40\0\0\0\xc0\x01\0\0\x07\x16\0\0\x40\0\0\0\0\x02\0\0\x0a\x16\0\0\
-\x40\0\0\0\x40\x02\0\0\x0d\x16\0\0\x40\0\0\0\x80\x02\0\0\x10\x16\0\0\x40\0\0\0\
-\xc0\x02\0\0\x13\x16\0\0\x40\0\0\0\0\x03\0\0\x16\x16\0\0\x40\0\0\0\x40\x03\0\0\
-\x19\x16\0\0\x40\0\0\0\x80\x03\0\0\x1c\x16\0\0\x40\0\0\0\xc0\x03\0\0\x24\x16\0\
-\0\x40\0\0\0\0\x04\0\0\x27\x16\0\0\x40\0\0\0\x40\x04\0\0\x92\x07\0\0\x40\0\0\0\
-\x80\x04\0\0\x2a\x16\0\0\x40\0\0\0\xc0\x04\0\0\x2d\x16\0\0\x40\0\0\0\0\x05\0\0\
-\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x85\x01\0\0\0\x01\0\0\x30\x16\0\0\x01\0\0\x0c\
-\x02\x01\0\0\x43\x16\0\0\x01\0\0\x0c\x02\x01\0\0\x54\x16\0\0\x01\0\0\x0c\x02\
-\x01\0\0\x67\x16\0\0\x01\0\0\x0c\x02\x01\0\0\x76\x16\0\0\x01\0\0\x0c\x02\x01\0\
-\0\x85\x16\0\0\x01\0\0\x0c\x02\x01\0\0\0\0\0\0\0\0\0\x02\x50\0\0\0\0\0\0\0\x01\
-\0\0\x0d\x02\0\0\0\x85\x01\0\0\x09\x01\0\0\x9b\x16\0\0\x01\0\0\x0c\x0a\x01\0\0\
-\xb1\x16\0\0\x01\0\0\x0c\x0a\x01\0\0\xc7\x16\0\0\x01\0\0\x0c\x0a\x01\0\0\xe4\
-\x16\0\0\x01\0\0\x0c\x0a\x01\0\0\xeb\x16\0\0\x8d\0\0\x84\x68\x0b\0\0\xf4\x16\0\
-\0\x10\x01\0\0\0\0\0\0\xfe\x16\0\0\x64\0\0\0\x40\x41\0\0\x0d\x17\0\0\x64\0\0\0\
-\x50\x41\0\0\x16\x17\0\0\x76\0\0\0\x60\x41\0\0\x21\x17\0\0\x4e\0\0\0\x80\x41\0\
-\0\x30\x17\0\0\x60\0\0\0\xc0\x41\0\0\x38\x17\0\0\x60\0\0\0\xe0\x41\0\0\x45\x17\
-\0\0\x60\0\0\0\0\x42\0\0\x4d\x17\0\0\x60\0\0\0\x20\x42\0\0\x58\x17\0\0\x60\0\0\
-\0\x40\x42\0\0\x60\x17\0\0\x60\0\0\0\x60\x42\0\0\x68\x17\0\0\x60\0\0\0\x80\x42\
-\0\0\x71\x17\0\0\x60\0\0\0\xa0\x42\0\0\x7f\x17\0\0\x4e\0\0\0\xc0\x42\0\0\x8a\
-\x17\0\0\x4e\0\0\0\0\x43\0\0\x96\x17\0\0\x60\0\0\0\x40\x43\0\0\xa1\x17\0\0\x60\
-\0\0\0\x60\x43\0\0\xa9\x17\0\0\x60\0\0\0\x80\x43\0\0\xb1\x17\0\0\x60\0\0\0\xa0\
-\x43\0\0\xbc\x17\0\0\x60\0\0\0\xc0\x43\0\0\xc5\x17\0\0\x60\0\0\0\xe0\x43\0\0\
-\xd7\x17\0\0\x60\0\0\0\0\x44\0\0\xee\x17\0\0\x60\0\0\0\x20\x44\0\0\xf7\x17\0\0\
-\x43\0\0\0\x40\x44\0\0\0\x18\0\0\x43\0\0\0\xc0\x44\0\0\x13\x18\0\0\x60\0\0\0\
-\x40\x45\0\0\x1b\x18\0\0\x60\0\0\0\x60\x45\0\0\x23\x18\0\0\x60\0\0\0\x80\x45\0\
-\0\x2e\x18\0\0\x60\0\0\0\xa0\x45\0\0\x38\x18\0\0\x60\0\0\0\xc0\x45\0\0\x45\x18\
-\0\0\x60\0\0\0\xe0\x45\0\0\x52\x18\0\0\x38\x01\0\0\0\x46\0\0\x57\x18\0\0\x64\0\
-\0\0\xc0\x46\0\0\x5e\x18\0\0\xa6\0\0\0\xd0\x46\0\0\x6d\x18\0\0\xa6\0\0\0\xd8\
-\x46\0\x02\x7d\x18\0\0\xa6\0\0\0\xda\x46\0\x01\xf1\x06\0\0\xa6\0\0\0\xdb\x46\0\
-\x05\x89\x18\0\0\x60\0\0\0\xe0\x46\0\0\x96\x18\0\0\x39\x01\0\0\0\x47\0\0\xa2\
-\x18\0\0\xa6\0\0\0\x60\x47\0\x02\xae\x18\0\0\xa6\0\0\0\x62\x47\0\x01\xbf\x18\0\
-\0\xa6\0\0\0\x63\x47\0\x01\xd0\x18\0\0\xa6\0\0\0\x64\x47\0\x01\xe3\x18\0\0\xa6\
-\0\0\0\x65\x47\0\x01\xf1\x18\0\0\xa6\0\0\0\x66\x47\0\x02\x06\x19\0\0\xa6\0\0\0\
-\x68\x47\0\x04\x0e\x19\0\0\xa6\0\0\0\x6c\x47\0\x01\x17\x19\0\0\xa6\0\0\0\x6d\
-\x47\0\x01\x23\x19\0\0\xa6\0\0\0\x6e\x47\0\x01\x2a\x19\0\0\xa6\0\0\0\x6f\x47\0\
-\x01\x2f\x19\0\0\xa6\0\0\0\x70\x47\0\0\x3c\x19\0\0\xa6\0\0\0\x78\x47\0\x02\x45\
-\x19\0\0\xa6\0\0\0\x7a\x47\0\x01\x4e\x19\0\0\xa6\0\0\0\x7b\x47\0\x01\x5b\x19\0\
-\0\xa6\0\0\0\x7c\x47\0\x01\x6c\x19\0\0\xa6\0\0\0\x7d\x47\0\x01\x7c\x19\0\0\xa6\
-\0\0\0\x7e\x47\0\x01\x8b\x19\0\0\xa6\0\0\0\x7f\x47\0\x01\x9b\x19\0\0\x60\0\0\0\
-\x80\x47\0\0\xa8\x19\0\0\x60\0\0\0\xa0\x47\0\0\xb5\x19\0\0\x4e\0\0\0\xc0\x47\0\
-\0\xc3\x19\0\0\x4e\0\0\0\0\x48\0\0\xd3\x19\0\0\x4e\0\0\0\x40\x48\0\0\xde\x19\0\
-\0\x60\0\0\0\x80\x48\0\0\xe6\x19\0\0\x60\0\0\0\xa0\x48\0\0\xee\x19\0\0\x60\0\0\
-\0\xc0\x48\0\0\xfa\x19\0\0\x60\0\0\0\xe0\x48\0\0\x04\x1a\0\0\x60\0\0\0\0\x49\0\
-\0\x0c\x1a\0\0\x3a\x01\0\0\x20\x49\0\0\x14\x1a\0\0\x60\0\0\0\xe0\x49\0\0\x20\
-\x1a\0\0\x60\0\0\0\0\x4a\0\0\x2c\x1a\0\0\x60\0\0\0\x20\x4a\0\0\x3c\x1a\0\0\x60\
-\0\0\0\x40\x4a\0\0\x4b\x1a\0\0\x64\0\0\0\x60\x4a\0\0\x54\x1a\0\0\xa6\0\0\0\x70\
-\x4a\0\0\x5e\x1a\0\0\xa6\0\0\0\x78\x4a\0\0\x6f\x1a\0\0\x60\0\0\0\x80\x4a\0\0\
-\x7a\x1a\0\0\x60\0\0\0\xa0\x4a\0\0\x85\x1a\0\0\x60\0\0\0\xc0\x4a\0\0\x8c\x1a\0\
-\0\x3d\x01\0\0\xe0\x4a\0\0\x93\x1a\0\0\x60\0\0\0\xa0\x4b\0\0\xa0\x1a\0\0\x60\0\
-\0\0\xc0\x4b\0\0\xa9\x1a\0\0\x60\0\0\0\xe0\x4b\0\0\xb6\x1a\0\0\x60\0\0\0\0\x4c\
-\0\0\xc5\x1a\0\0\x60\0\0\0\x20\x4c\0\0\xd3\x1a\0\0\x60\0\0\0\x40\x4c\0\0\xe2\
-\x1a\0\0\x60\0\0\0\x60\x4c\0\0\xed\x1a\0\0\x60\0\0\0\x80\x4c\0\0\xfb\x1a\0\0\
-\x60\0\0\0\xa0\x4c\0\0\x4b\x07\0\0\x60\0\0\0\xc0\x4c\0\0\x3e\x07\0\0\x60\0\0\0\
-\xe0\x4c\0\0\x03\x1b\0\0\x60\0\0\0\0\x4d\0\0\x08\x1b\0\0\x60\0\0\0\x20\x4d\0\0\
-\x55\x07\0\0\x4e\0\0\0\x40\x4d\0\0\x65\x07\0\0\x4e\0\0\0\x80\x4d\0\0\x14\x1b\0\
-\0\x60\0\0\0\xc0\x4d\0\0\x23\x1b\0\0\x60\0\0\0\xe0\x4d\0\0\x34\x1b\0\0\x60\0\0\
-\0\0\x4e\0\0\x3c\x1b\0\0\x60\0\0\0\x20\x4e\0\0\x46\x1b\0\0\x60\0\0\0\x40\x4e\0\
-\0\x54\x1b\0\0\x60\0\0\0\x60\x4e\0\0\x5f\x1b\0\0\x60\0\0\0\x80\x4e\0\0\x68\x1b\
-\0\0\x60\0\0\0\xa0\x4e\0\0\x73\x1b\0\0\x3e\x01\0\0\xc0\x4e\0\0\x80\x1b\0\0\x3e\
-\x01\0\0\xc0\x50\0\0\x95\x1b\0\0\x3d\0\0\0\xc0\x52\0\0\xa3\x1b\0\0\x3d\0\0\0\0\
-\x53\0\0\xb7\x1b\0\0\xe8\0\0\0\x40\x53\0\0\xca\x1b\0\0\x3d\0\0\0\x80\x53\0\0\
-\xd7\x1b\0\0\x46\x01\0\0\xc0\x53\0\0\xe6\x1b\0\0\x47\x01\0\0\0\x54\0\0\xf5\x1b\
-\0\0\x47\x01\0\0\0\x55\0\0\x05\x1c\0\0\x3d\0\0\0\0\x56\0\0\x12\x1c\0\0\x02\0\0\
-\0\x40\x56\0\0\x20\x1c\0\0\x60\0\0\0\x60\x56\0\0\x2f\x1c\0\0\x60\0\0\0\x80\x56\
-\0\0\x38\x1c\0\0\x60\0\0\0\xa0\x56\0\0\x46\x1c\0\0\x60\0\0\0\xc0\x56\0\0\x52\
-\x1c\0\0\x02\0\0\0\xe0\x56\0\0\x5f\x1c\0\0\x4e\0\0\0\0\x57\0\0\x6d\x1c\0\0\x60\
-\0\0\0\x40\x57\0\0\x7b\x1c\0\0\x60\0\0\0\x60\x57\0\0\x83\x1c\0\0\x57\0\0\0\x80\
-\x57\0\0\x92\x1c\0\0\x57\0\0\0\xa0\x57\0\0\xa2\x1c\0\0\x02\0\0\0\xc0\x57\0\0\
-\xaa\x1c\0\0\xa6\0\0\0\xe0\x57\0\0\xc0\x1c\0\0\xa6\0\0\0\xe8\x57\0\x01\xd6\x1c\
-\0\0\x64\0\0\0\xf0\x57\0\0\xe5\x1c\0\0\x60\0\0\0\0\x58\0\0\xf1\x1c\0\0\x60\0\0\
-\0\x20\x58\0\0\x04\x1d\0\0\x48\x01\0\0\x40\x58\0\0\x10\x1d\0\0\x49\x01\0\0\xc0\
-\x58\0\0\x1b\x1d\0\0\x4a\x01\0\0\x40\x59\0\0\x25\x1d\0\0\x60\0\0\0\x80\x59\0\0\
-\x30\x1d\0\0\x60\0\0\0\xa0\x59\0\0\x39\x1d\0\0\xd9\0\0\0\xc0\x59\0\0\x42\x1d\0\
-\0\x4b\x01\0\0\0\x5a\0\0\x4e\x1d\0\0\x4d\x01\0\0\x40\x5a\0\0\x5a\x1d\0\0\x4e\
-\x01\0\0\x80\x5a\0\0\x67\x1d\0\0\x26\x01\0\0\xc0\x5a\0\0\x74\x1d\0\0\x4f\x01\0\
-\0\0\x5b\0\0\x7e\x1d\0\0\x20\0\0\x84\x28\x08\0\0\x93\x1d\0\0\x11\x01\0\0\0\0\0\
-\0\x9d\x1d\0\0\x25\x01\0\0\x80\x2e\0\0\xaf\x1d\0\0\x29\x01\0\0\x80\x34\0\0\xbe\
-\x1d\0\0\x2a\x01\0\0\xc0\x34\0\0\xce\x1d\0\0\x40\0\0\0\0\x35\0\0\xdb\x1d\0\0\
-\xcc\0\0\0\x40\x35\0\0\xf1\x1d\0\0\xcc\0\0\0\xc0\x37\0\0\x03\x1e\0\0\x5d\0\0\0\
-\x40\x3a\0\0\x0c\x1e\0\0\x5d\0\0\0\x60\x3a\0\0\x19\x1e\0\0\x5d\0\0\0\x80\x3a\0\
-\0\x29\x1e\0\0\x5d\0\0\0\xa0\x3a\0\0\x3a\x1e\0\0\x2b\x01\0\0\xc0\x3a\0\0\x46\
-\x1e\0\0\x2d\x01\0\0\0\x3b\0\0\x52\x1e\0\0\x2f\x01\0\0\x40\x3b\0\0\x5f\x1e\0\0\
-\xa8\0\0\0\x80\x3b\0\0\x6d\x1e\0\0\x31\x01\0\0\xc0\x3b\0\0\x7e\x1e\0\0\x33\x01\
-\0\0\0\x3c\0\0\x8c\x1e\0\0\x35\0\0\0\x40\x3c\0\x05\x9a\x1e\0\0\x35\0\0\0\x45\
-\x3c\0\x01\xae\x1e\0\0\x35\0\0\0\x46\x3c\0\x01\xc1\x1e\0\0\x35\0\0\0\x47\x3c\0\
-\x01\xd4\x1e\0\0\x35\0\0\0\x48\x3c\0\0\xe5\x1e\0\0\x35\0\0\0\x50\x3c\0\0\xf2\
-\x1e\0\0\x35\0\0\0\x58\x3c\0\0\xff\x1e\0\0\x35\0\0\0\x60\x3c\0\0\x10\x1f\0\0\
-\x35\0\0\0\x68\x3c\0\0\x20\x1f\0\0\x34\0\0\0\x70\x3c\0\0\x31\x1f\0\0\x35\x01\0\
-\0\x80\x3c\0\0\x3a\x1f\0\0\x36\x01\0\0\x40\x3d\0\0\x44\x1f\0\0\x60\0\0\0\xc0\
-\x3d\0\0\x57\x1f\0\0\x60\0\0\0\xe0\x3d\0\0\x69\x1f\0\0\x37\x01\0\0\0\x3e\0\0\
-\x76\x1f\0\0\x1e\0\0\x84\xd0\x05\0\0\xdc\x02\0\0\x79\0\0\0\0\0\0\0\x80\x1f\0\0\
-\x12\x01\0\0\0\x28\0\0\x87\x1f\0\0\x76\0\0\0\x40\x28\0\0\x92\x1f\0\0\x13\x01\0\
-\0\x60\x28\0\0\x99\x1f\0\0\x34\0\0\0\x70\x28\0\0\xa4\x1f\0\0\x15\x01\0\0\x80\
-\x28\0\0\xad\x1f\0\0\x62\0\0\0\xc0\x28\0\0\xb8\x1f\0\0\x34\0\0\0\xd0\x28\0\0\
-\xc0\x1f\0\0\x35\0\0\0\xe0\x28\0\0\xc4\x1f\0\0\x35\0\0\0\xe8\x28\0\0\xcc\x1f\0\
-\0\x35\0\0\0\xf0\x28\0\0\xd3\x1f\0\0\x35\0\0\0\xf8\x28\0\0\xdc\x1f\0\0\x35\0\0\
-\0\0\x29\0\x01\xe4\x1f\0\0\x35\0\0\0\x01\x29\0\x01\xec\x1f\0\0\x35\0\0\0\x02\
-\x29\0\x01\xf5\x1f\0\0\x35\0\0\0\x03\x29\0\x01\xfd\x1f\0\0\x35\0\0\0\x04\x29\0\
-\x01\x05\x20\0\0\x35\0\0\0\x05\x29\0\x01\x11\x20\0\0\x35\0\0\0\x06\x29\0\x01\
-\x18\x20\0\0\x35\0\0\0\x07\x29\0\x01\x21\x20\0\0\x35\0\0\0\x08\x29\0\x01\x36\
-\x20\0\0\x35\0\0\0\x09\x29\0\x01\x46\x20\0\0\x35\0\0\0\x0a\x29\0\x01\x54\x20\0\
-\0\x35\0\0\0\x10\x29\0\0\x5c\x20\0\0\x35\0\0\0\x18\x29\0\0\x69\x20\0\0\x02\0\0\
-\0\x20\x29\0\0\x72\x20\0\0\x02\0\0\0\x40\x29\0\0\x7b\x20\0\0\x76\0\0\0\x60\x29\
-\0\0\x83\x20\0\0\x16\x01\0\0\x80\x29\0\0\x8b\x20\0\0\x17\x01\0\0\xc0\x29\0\0\0\
-\0\0\0\0\0\0\x02\x6f\x01\0\0\x90\x20\0\0\0\0\0\x08\x14\x01\0\0\x96\x20\0\0\0\0\
-\0\x01\x02\0\0\0\x10\0\0\x01\0\0\0\0\0\0\0\x02\x6e\x01\0\0\0\0\0\0\0\0\0\x02\
-\x6d\x01\0\0\x9c\x20\0\0\x02\0\0\x04\x98\0\0\0\xab\x20\0\0\x18\x01\0\0\0\0\0\0\
-\xb0\x20\0\0\x1a\x01\0\0\xc0\x01\0\0\xb3\x20\0\0\x0d\0\0\x04\x38\0\0\0\x92\x07\
-\0\0\x57\0\0\0\0\0\0\0\xbd\x20\0\0\x76\0\0\0\x20\0\0\0\x8e\x07\0\0\x19\x01\0\0\
-\x40\0\0\0\xc2\x20\0\0\x57\0\0\0\x80\0\0\0\xcb\x20\0\0\x02\0\0\0\xa0\0\0\0\xd2\
-\x20\0\0\x9b\0\0\0\xc0\0\0\0\xd6\x20\0\0\xa6\0\0\0\0\x01\0\0\xdf\x20\0\0\x35\0\
-\0\0\x08\x01\0\0\xc0\x1f\0\0\x13\x01\0\0\x10\x01\0\0\x2c\x05\0\0\x51\0\0\0\x20\
-\x01\0\0\xe3\x20\0\0\x34\0\0\0\x30\x01\0\0\xec\x20\0\0\x4e\0\0\0\x40\x01\0\0\
-\x2d\x06\0\0\x60\0\0\0\x80\x01\0\0\0\0\0\0\0\0\0\x02\x75\0\0\0\xfa\x20\0\0\x01\
-\0\0\x04\x60\0\0\0\0\x21\0\0\x1b\x01\0\0\0\0\0\0\0\0\0\0\x03\0\0\x05\x60\0\0\0\
-\x02\x21\0\0\x1c\x01\0\0\0\0\0\0\x0e\x21\0\0\x1f\x01\0\0\0\0\0\0\x12\x21\0\0\
-\x24\x01\0\0\0\0\0\0\x16\x21\0\0\x0c\0\0\x04\x30\0\0\0\x23\x21\0\0\x02\0\0\0\0\
-\0\0\0\x2e\x21\0\0\x02\0\0\0\x20\0\0\0\x39\x21\0\0\x02\0\0\0\x40\0\0\0\x47\x21\
-\0\0\x5d\0\0\0\x60\0\0\0\x53\x21\0\0\x35\0\0\0\x80\0\0\0\x5e\x21\0\0\x35\0\0\0\
-\x88\0\0\0\x6b\x21\0\0\x35\0\0\0\x90\0\0\0\x78\x21\0\0\x35\0\0\0\x98\0\0\0\x85\
-\x21\0\0\x5d\0\0\0\xa0\0\0\0\x92\x21\0\0\xef\0\0\0\xc0\0\0\0\x9d\x21\0\0\x1d\
-\x01\0\0\0\x01\0\0\xac\x21\0\0\x5d\0\0\0\x40\x01\0\0\xc2\x21\0\0\x01\0\0\x04\
-\x08\0\0\0\xcf\x21\0\0\x1e\x01\0\0\0\0\0\0\xd6\x21\0\0\0\0\0\x08\x4f\0\0\0\xdd\
-\x21\0\0\x04\0\0\x04\x40\0\0\0\x02\x21\0\0\x1c\x01\0\0\0\0\0\0\x3f\x01\0\0\x76\
-\0\0\0\x80\x01\0\0\x45\x01\0\0\x76\0\0\0\xa0\x01\0\0\xe4\x21\0\0\x20\x01\0\0\
-\xc0\x01\0\0\xe8\x21\0\0\x04\0\0\x05\x04\0\0\0\xf2\x21\0\0\x21\x01\0\0\0\0\0\0\
-\xf8\x21\0\0\x22\x01\0\0\0\0\0\0\xfe\x21\0\0\x76\0\0\0\0\0\0\0\x06\x22\0\0\x23\
-\x01\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x04\0\0\0\x32\x01\0\0\x62\0\0\0\0\0\0\0\
-\x2c\x01\0\0\x62\0\0\0\x10\0\0\0\0\0\0\0\x02\0\0\x04\x02\0\0\0\x19\0\0\0\x35\0\
-\0\0\0\0\0\0\x0a\x22\0\0\x35\0\0\0\x08\0\0\0\0\0\0\0\x01\0\0\x04\x01\0\0\0\x19\
-\0\0\0\x35\0\0\0\0\0\0\0\x0f\x22\0\0\x06\0\0\x04\x60\0\0\0\x02\x21\0\0\x1c\x01\
-\0\0\0\0\0\0\x45\x01\0\0\x8c\0\0\0\x80\x01\0\0\x3f\x01\0\0\x8c\0\0\0\0\x02\0\0\
-\x16\x22\0\0\x76\0\0\0\x80\x02\0\0\xe4\x21\0\0\x20\x01\0\0\xa0\x02\0\0\x20\x22\
-\0\0\x5d\0\0\0\xc0\x02\0\0\x28\x22\0\0\x08\0\0\x04\xc0\0\0\0\x3b\x22\0\0\x9e\0\
-\0\0\0\0\0\0\x45\x22\0\0\xa6\0\0\0\0\x02\0\0\x57\x22\0\0\x60\0\0\0\x20\x02\0\0\
-\x83\x11\0\0\x6b\0\0\0\x40\x02\0\0\x67\x22\0\0\x6b\0\0\0\x60\x02\0\0\x6d\x22\0\
-\0\x26\x01\0\0\x80\x02\0\0\x7e\x22\0\0\x26\x01\0\0\xc0\x02\0\0\x8f\x22\0\0\x27\
-\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\x02\x78\x01\0\0\x99\x22\0\0\x06\0\0\x04\x60\0\
-\0\0\xa8\x22\0\0\x26\x01\0\0\0\0\0\0\xb6\x22\0\0\x26\x01\0\0\x40\0\0\0\x71\x11\
-\0\0\x9e\0\0\0\x80\0\0\0\x83\x11\0\0\x02\0\0\0\x80\x02\0\0\xc4\x22\0\0\x02\0\0\
-\0\xa0\x02\0\0\x85\x01\0\0\x28\x01\0\0\xc0\x02\0\0\0\0\0\0\0\0\0\x02\x80\x01\0\
-\0\0\0\0\0\0\0\0\x02\x6a\x01\0\0\0\0\0\0\0\0\0\x02\x69\x01\0\0\0\0\0\0\0\0\0\
-\x02\x2c\x01\0\0\0\0\0\0\0\0\0\x0a\x7f\x01\0\0\0\0\0\0\0\0\0\x02\x2e\x01\0\0\0\
-\0\0\0\0\0\0\x0a\x6b\x01\0\0\0\0\0\0\0\0\0\x02\x30\x01\0\0\0\0\0\0\0\0\0\x0a\
-\x84\x01\0\0\0\0\0\0\0\0\0\x02\x32\x01\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\
-\x48\0\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x02\x34\x01\0\0\0\0\0\0\x02\0\0\x0d\
-\x57\0\0\0\0\0\0\0\x48\0\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x09\0\0\x04\x18\0\0\0\
-\x4f\x10\0\0\x35\0\0\0\0\0\0\0\xcd\x22\0\0\x35\0\0\0\x08\0\0\0\xd3\x22\0\0\x35\
-\0\0\0\x10\0\0\0\xdc\x22\0\0\x35\0\0\0\x18\0\0\0\xe2\x22\0\0\x5d\0\0\0\x20\0\0\
-\0\x77\x14\0\0\x40\0\0\0\x40\0\0\0\xe6\x22\0\0\x5d\0\0\0\x80\0\0\0\xef\x22\0\0\
-\x34\0\0\0\xa0\0\0\0\xfd\x22\0\0\x34\0\0\0\xb0\0\0\0\0\0\0\0\x05\0\0\x84\x10\0\
-\0\0\x05\x23\0\0\x02\0\0\0\0\0\0\0\x11\x23\0\0\x02\0\0\0\x20\0\0\0\x1c\x23\0\0\
-\x60\0\0\0\x40\0\0\x1f\x27\x23\0\0\x60\0\0\0\x5f\0\0\x01\x2f\x23\0\0\x60\0\0\0\
-\x60\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x4e\0\0\0\x04\0\0\0\x0d\0\0\0\x3f\x23\0\0\
-\x08\0\0\x84\x18\0\0\0\x48\x23\0\0\x4e\0\0\0\0\0\0\0\x4f\x23\0\0\x60\0\0\0\x40\
-\0\0\0\xb0\x06\0\0\x60\0\0\0\x60\0\0\0\x56\x23\0\0\x60\0\0\0\x80\0\0\0\x65\x23\
-\0\0\xa6\0\0\0\xa0\0\0\0\x73\x23\0\0\xa6\0\0\0\xa8\0\0\x05\x83\x23\0\0\xa6\0\0\
-\0\xad\0\0\x01\x8e\x23\0\0\xa6\0\0\0\xae\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x60\
-\0\0\0\x04\0\0\0\x03\0\0\0\x97\x23\0\0\x01\0\0\x04\x18\0\0\0\x9e\x23\0\0\x3c\
-\x01\0\0\0\0\0\0\xa0\x23\0\0\x02\0\0\x04\x08\0\0\0\xae\x23\0\0\x60\0\0\0\0\0\0\
-\0\xc6\x12\0\0\x60\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x3b\x01\0\0\x04\0\
-\0\0\x03\0\0\0\xb0\x23\0\0\x11\0\0\x84\x18\0\0\0\xc5\x23\0\0\x02\0\0\0\0\0\0\0\
-\xd5\x23\0\0\x60\0\0\0\x20\0\0\0\xdf\x23\0\0\x60\0\0\0\x40\0\0\0\xe9\x23\0\0\
-\x60\0\0\0\x60\0\0\0\xf3\x23\0\0\x64\0\0\0\x80\0\0\x01\xfe\x23\0\0\x64\0\0\0\
-\x81\0\0\x01\x08\x24\0\0\x64\0\0\0\x82\0\0\x01\x0e\x24\0\0\x64\0\0\0\x83\0\0\
-\x01\x18\x24\0\0\x64\0\0\0\x84\0\0\x03\x20\x24\0\0\x64\0\0\0\x87\0\0\x01\x27\
-\x24\0\0\x64\0\0\0\x88\0\0\x04\x32\x24\0\0\x64\0\0\0\x8c\0\0\x04\x3d\x24\0\0\
-\xa6\0\0\0\x90\0\0\x01\xf1\x06\0\0\xa6\0\0\0\x91\0\0\x07\x49\x24\0\0\xa6\0\0\0\
-\x98\0\0\0\x53\x24\0\0\x64\0\0\0\xa0\0\0\0\x5c\x24\0\0\x64\0\0\0\xb0\0\0\0\x66\
-\x24\0\0\x08\0\0\x04\x40\0\0\0\x6e\x24\0\0\x3f\x01\0\0\0\0\0\0\x73\x24\0\0\x4a\
-\0\0\0\0\x01\0\0\xb3\x12\0\0\x40\x01\0\0\x40\x01\0\0\xab\x20\0\0\x44\x01\0\0\
-\x80\x01\0\0\x26\x01\0\0\xa6\0\0\0\xc0\x01\0\0\x80\x24\0\0\xa6\0\0\0\xc8\x01\0\
-\0\x87\x24\0\0\xa6\0\0\0\xd0\x01\0\0\x8f\x24\0\0\xa6\0\0\0\xd8\x01\0\0\x97\x24\
-\0\0\x02\0\0\x04\x20\0\0\0\x6e\x24\0\0\x41\0\0\0\0\0\0\0\xab\x12\0\0\x4a\0\0\0\
-\xc0\0\0\0\0\0\0\0\0\0\0\x02\x41\x01\0\0\0\0\0\0\x01\0\0\x0d\x42\x01\0\0\0\0\0\
-\0\x43\x01\0\0\xa7\x24\0\0\x02\0\0\x06\x04\0\0\0\xb7\x24\0\0\0\0\0\0\xc9\x24\0\
-\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x3e\x01\0\0\0\0\0\0\0\0\0\x02\x68\x01\0\0\xd9\
-\x24\0\0\x02\0\0\x04\x08\0\0\0\xe8\x24\0\0\x60\0\0\0\0\0\0\0\xb0\x06\0\0\x60\0\
-\0\0\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x45\x01\0\0\x04\0\0\0\x01\0\0\0\0\0\0\
-\0\0\0\0\x03\0\0\0\0\x45\x01\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\x03\0\0\x04\x10\0\
-\0\0\x4f\x23\0\0\x60\0\0\0\0\0\0\0\xac\x06\0\0\x60\0\0\0\x20\0\0\0\xf2\x24\0\0\
-\x4e\0\0\0\x40\0\0\0\0\0\0\0\x03\0\0\x04\x10\0\0\0\xf7\x24\0\0\x60\0\0\0\0\0\0\
-\0\xac\x06\0\0\x60\0\0\0\x20\0\0\0\xf2\x24\0\0\x4e\0\0\0\x40\0\0\0\0\0\0\0\x02\
-\0\0\x04\x08\0\0\0\xfd\x24\0\0\x60\0\0\0\0\0\0\0\x0d\x25\0\0\x60\0\0\0\x20\0\0\
-\0\0\0\0\0\0\0\0\x02\x4c\x01\0\0\0\0\0\0\0\0\0\x0a\x83\x01\0\0\0\0\0\0\0\0\0\
-\x02\x82\x01\0\0\0\0\0\0\0\0\0\x02\x81\x01\0\0\0\0\0\0\0\0\0\x02\x79\x01\0\0\0\
-\0\0\0\0\0\0\x02\x51\x01\0\0\x1b\x25\0\0\x03\0\0\x04\xb8\0\0\0\x2f\x25\0\0\x52\
-\x01\0\0\0\0\0\0\x34\x25\0\0\x4f\0\0\0\x40\x05\0\0\xbd\x20\0\0\x4f\0\0\0\x80\
-\x05\0\0\x42\x25\0\0\0\0\0\x08\x01\x01\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x85\
-\x01\0\0\x50\x01\0\0\x55\x25\0\0\x01\0\0\x0c\x53\x01\0\0\0\0\0\0\x01\0\0\x0d\
-\x02\0\0\0\xdc\x02\0\0\x48\0\0\0\x69\x25\0\0\0\0\0\x0c\x55\x01\0\0\0\0\0\0\0\0\
-\0\x03\0\0\0\0\x51\0\0\0\x04\0\0\0\x0d\0\0\0\x86\x25\0\0\0\0\0\x0e\x57\x01\0\0\
-\x01\0\0\0\0\0\0\0\0\0\0\x0a\x5a\x01\0\0\xf7\x05\0\0\0\0\0\x08\x57\0\0\0\x8e\
-\x25\0\0\0\0\0\x0e\x59\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xb5\0\0\0\
-\x04\0\0\0\x1c\0\0\0\x93\x25\0\0\0\0\0\x0e\x5c\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\xb5\0\0\0\x04\0\0\0\x1b\0\0\0\xaf\x25\0\0\0\0\0\x0e\x5e\x01\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\xb5\0\0\0\x04\0\0\0\x20\0\0\0\xcd\x25\0\0\0\0\
-\0\x0e\x60\x01\0\0\0\0\0\0\xee\x25\0\0\0\0\0\x0e\x5e\x01\0\0\0\0\0\0\x0c\x26\0\
-\0\0\0\0\x0e\x60\x01\0\0\0\0\0\0\x31\x26\0\0\0\0\0\x07\0\0\0\0\xc4\x15\0\0\0\0\
-\0\x07\0\0\0\0\x43\x26\0\0\0\0\0\x07\0\0\0\0\x48\x26\0\0\0\0\0\x07\0\0\0\0\x52\
-\x26\0\0\0\0\0\x07\0\0\0\0\x65\x26\0\0\0\0\0\x07\0\0\0\0\x77\x26\0\0\0\0\0\x07\
-\0\0\0\0\x88\x26\0\0\0\0\0\x07\0\0\0\0\xa4\x26\0\0\0\0\0\x07\0\0\0\0\xbc\x26\0\
-\0\0\0\0\x07\0\0\0\0\xcb\x26\0\0\0\0\0\x07\0\0\0\0\xda\x26\0\0\0\0\0\x07\0\0\0\
-\0\xe5\x26\0\0\0\0\0\x07\0\0\0\0\xf4\x26\0\0\0\0\0\x07\0\0\0\0\x09\x27\0\0\0\0\
-\0\x07\0\0\0\0\xe3\x0e\0\0\0\0\0\x07\0\0\0\0\x14\x27\0\0\0\0\0\x07\0\0\0\0\x7d\
-\x15\0\0\0\0\0\x07\0\0\0\0\x1f\x27\0\0\0\0\0\x07\0\0\0\0\x06\x13\0\0\0\0\0\x07\
-\0\0\0\0\x23\x27\0\0\0\0\0\x07\0\0\0\0\x74\x1d\0\0\0\0\0\x07\0\0\0\0\x46\x09\0\
-\0\0\0\0\x07\0\0\0\0\x30\x27\0\0\0\0\0\x07\0\0\0\0\x38\x27\0\0\0\0\0\x07\0\0\0\
-\0\x47\x27\0\0\0\0\0\x07\0\0\0\0\x4e\x27\0\0\0\0\0\x07\0\0\0\0\x58\x27\0\0\0\0\
-\0\x07\0\0\0\0\x6b\x27\0\0\0\0\0\x07\0\0\0\0\x80\x27\0\0\0\0\0\x07\0\0\0\0\x95\
-\x27\0\0\0\0\0\x07\0\0\0\0\xa5\x27\0\0\0\0\0\x07\0\0\0\0\xb5\x27\0\0\0\0\0\x07\
-\0\0\0\0\xc1\x27\0\0\0\0\0\x07\0\0\0\0\x8f\x46\0\0\x01\0\0\x0f\x0d\0\0\0\x58\
-\x01\0\0\0\0\0\0\x0d\0\0\0\x97\x46\0\0\x06\0\0\x0f\x96\0\0\0\x5b\x01\0\0\0\0\0\
-\0\x04\0\0\0\x5d\x01\0\0\x04\0\0\0\x1c\0\0\0\x5f\x01\0\0\x20\0\0\0\x1b\0\0\0\
-\x61\x01\0\0\x3b\0\0\0\x20\0\0\0\x62\x01\0\0\x5b\0\0\0\x1b\0\0\0\x63\x01\0\0\
-\x76\0\0\0\x20\0\0\0\x9f\x46\0\0\x09\0\0\x0f\xe0\0\0\0\x0c\0\0\0\0\0\0\0\x20\0\
-\0\0\x12\0\0\0\x20\0\0\0\x10\0\0\0\x18\0\0\0\x30\0\0\0\x20\0\0\0\x1e\0\0\0\x50\
-\0\0\0\x20\0\0\0\x22\0\0\0\x70\0\0\0\x20\0\0\0\x24\0\0\0\x90\0\0\0\x20\0\0\0\
-\x28\0\0\0\xb0\0\0\0\x10\0\0\0\x2c\0\0\0\xc0\0\0\0\x10\0\0\0\x2d\0\0\0\xd0\0\0\
-\0\x10\0\0\0\0\x69\x6e\x74\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\
-\x5f\x54\x59\x50\x45\x5f\x5f\0\x74\x79\x70\x65\0\x6b\x65\x79\x5f\x73\x69\x7a\
-\x65\0\x76\x61\x6c\x75\x65\x5f\x73\x69\x7a\x65\0\x6d\x61\x78\x5f\x65\x6e\x74\
-\x72\x69\x65\x73\0\x74\x63\x70\x72\x74\x74\x5f\x6d\x61\x70\0\x74\x63\x70\x72\
-\x74\x74\x5f\x62\x75\x66\x66\x65\x72\0\x6e\x65\x74\x5f\x6c\x61\x74\x65\x6e\x63\
-\x79\x5f\x73\x74\x61\x72\x74\0\x69\x70\x76\x34\x5f\x74\x6f\x70\x5f\x6d\x61\x70\
-\0\x69\x70\x76\x36\x5f\x74\x6f\x70\x5f\x6d\x61\x70\0\x74\x6f\x70\x5f\x73\x6f\
-\x63\x6b\x5f\x73\x74\x6f\x72\x65\0\x6e\x65\x74\x5f\x6c\x61\x74\x65\x6e\x63\x79\
-\x5f\x62\x75\x66\x66\x65\x72\0\x74\x63\x70\x74\x6f\x70\x5f\x62\x75\x66\x66\x65\
-\x72\0\x74\x63\x70\x72\x65\x74\x72\x61\x6e\x73\x5f\x62\x75\x66\x66\x65\x72\0\
-\x74\x63\x70\x5f\x72\x65\x74\x72\x61\x6e\x73\x6d\x69\x74\x5f\x73\x6b\x62\x5f\
-\x65\x76\x65\x6e\x74\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\x74\x79\x70\x65\0\x63\x6f\
-\x6d\x6d\x6f\x6e\x5f\x66\x6c\x61\x67\x73\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\x70\x72\
-\x65\x65\x6d\x70\x74\x5f\x63\x6f\x75\x6e\x74\0\x63\x6f\x6d\x6d\x6f\x6e\x5f\x70\
-\x69\x64\0\x73\x6b\x62\x61\x64\x64\x72\0\x73\x6b\x61\x64\x64\x72\0\x73\x74\x61\
-\x74\x65\0\x73\x70\x6f\x72\x74\0\x64\x70\x6f\x72\x74\0\x66\x61\x6d\x69\x6c\x79\
-\0\x73\x61\x64\x64\x72\0\x64\x61\x64\x64\x72\0\x73\x61\x64\x64\x72\x5f\x76\x36\
-\0\x64\x61\x64\x64\x72\x5f\x76\x36\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\
-\x68\x6f\x72\x74\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x63\x68\x61\x72\0\x5f\
-\x5f\x75\x31\x36\0\x5f\x5f\x75\x38\0\x63\x74\x78\0\x74\x72\x61\x63\x65\x5f\x72\
-\x65\x74\x72\x61\x6e\x73\x6d\x69\x74\0\x73\x6b\x5f\x62\x75\x66\x66\0\x63\x62\0\
-\x5f\x6e\x66\x63\x74\0\x6c\x65\x6e\0\x64\x61\x74\x61\x5f\x6c\x65\x6e\0\x6d\x61\
-\x63\x5f\x6c\x65\x6e\0\x68\x64\x72\x5f\x6c\x65\x6e\0\x71\x75\x65\x75\x65\x5f\
-\x6d\x61\x70\x70\x69\x6e\x67\0\x5f\x5f\x63\x6c\x6f\x6e\x65\x64\x5f\x6f\x66\x66\
-\x73\x65\x74\0\x63\x6c\x6f\x6e\x65\x64\0\x6e\x6f\x68\x64\x72\0\x66\x63\x6c\x6f\
-\x6e\x65\0\x70\x65\x65\x6b\x65\x64\0\x68\x65\x61\x64\x5f\x66\x72\x61\x67\0\x70\
-\x66\x6d\x65\x6d\x61\x6c\x6c\x6f\x63\0\x70\x70\x5f\x72\x65\x63\x79\x63\x6c\x65\
-\0\x61\x63\x74\x69\x76\x65\x5f\x65\x78\x74\x65\x6e\x73\x69\x6f\x6e\x73\0\x74\
-\x61\x69\x6c\0\x65\x6e\x64\0\x68\x65\x61\x64\0\x64\x61\x74\x61\0\x74\x72\x75\
-\x65\x73\x69\x7a\x65\0\x75\x73\x65\x72\x73\0\x65\x78\x74\x65\x6e\x73\x69\x6f\
-\x6e\x73\0\x72\x62\x6e\x6f\x64\x65\0\x6c\x69\x73\x74\0\x6c\x6c\x5f\x6e\x6f\x64\
-\x65\0\x6e\x65\x78\x74\0\x70\x72\x65\x76\0\x64\x65\x76\0\x64\x65\x76\x5f\x73\
-\x63\x72\x61\x74\x63\x68\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\
-\0\x72\x62\x5f\x6e\x6f\x64\x65\0\x5f\x5f\x72\x62\x5f\x70\x61\x72\x65\x6e\x74\
-\x5f\x63\x6f\x6c\x6f\x72\0\x72\x62\x5f\x72\x69\x67\x68\x74\0\x72\x62\x5f\x6c\
-\x65\x66\x74\0\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\x6c\x6c\x69\x73\x74\x5f\
-\x6e\x6f\x64\x65\0\x73\x6b\0\x69\x70\x5f\x64\x65\x66\x72\x61\x67\x5f\x6f\x66\
-\x66\x73\x65\x74\0\x74\x73\x74\x61\x6d\x70\0\x73\x6b\x62\x5f\x6d\x73\x74\x61\
-\x6d\x70\x5f\x6e\x73\0\x6b\x74\x69\x6d\x65\x5f\x74\0\x73\x36\x34\0\x5f\x5f\x73\
-\x36\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x75\x36\x34\0\x5f\x5f\x75\x36\
-\x34\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\
-\0\x63\x68\x61\x72\0\x74\x63\x70\x5f\x74\x73\x6f\x72\x74\x65\x64\x5f\x61\x6e\
-\x63\x68\x6f\x72\0\x5f\x73\x6b\x5f\x72\x65\x64\x69\x72\0\x5f\x73\x6b\x62\x5f\
-\x72\x65\x66\x64\x73\x74\0\x64\x65\x73\x74\x72\x75\x63\x74\x6f\x72\0\x75\x6e\
-\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x68\x65\x61\x64\x65\x72\x73\0\x5f\
-\x5f\x70\x6b\x74\x5f\x74\x79\x70\x65\x5f\x6f\x66\x66\x73\x65\x74\0\x70\x6b\x74\
-\x5f\x74\x79\x70\x65\0\x69\x67\x6e\x6f\x72\x65\x5f\x64\x66\0\x6e\x66\x5f\x74\
-\x72\x61\x63\x65\0\x69\x70\x5f\x73\x75\x6d\x6d\x65\x64\0\x6f\x6f\x6f\x5f\x6f\
-\x6b\x61\x79\0\x6c\x34\x5f\x68\x61\x73\x68\0\x73\x77\x5f\x68\x61\x73\x68\0\x77\
-\x69\x66\x69\x5f\x61\x63\x6b\x65\x64\x5f\x76\x61\x6c\x69\x64\0\x77\x69\x66\x69\
-\x5f\x61\x63\x6b\x65\x64\0\x6e\x6f\x5f\x66\x63\x73\0\x65\x6e\x63\x61\x70\x73\
-\x75\x6c\x61\x74\x69\x6f\x6e\0\x65\x6e\x63\x61\x70\x5f\x68\x64\x72\x5f\x63\x73\
-\x75\x6d\0\x63\x73\x75\x6d\x5f\x76\x61\x6c\x69\x64\0\x5f\x5f\x70\x6b\x74\x5f\
-\x76\x6c\x61\x6e\x5f\x70\x72\x65\x73\x65\x6e\x74\x5f\x6f\x66\x66\x73\x65\x74\0\
-\x72\x65\x6d\x63\x73\x75\x6d\x5f\x6f\x66\x66\x6c\x6f\x61\x64\0\x63\x73\x75\x6d\
-\x5f\x63\x6f\x6d\x70\x6c\x65\x74\x65\x5f\x73\x77\0\x63\x73\x75\x6d\x5f\x6c\x65\
-\x76\x65\x6c\0\x64\x73\x74\x5f\x70\x65\x6e\x64\x69\x6e\x67\x5f\x63\x6f\x6e\x66\
-\x69\x72\x6d\0\x6d\x6f\x6e\x6f\x5f\x64\x65\x6c\x69\x76\x65\x72\x79\x5f\x74\x69\
-\x6d\x65\0\x74\x63\x5f\x73\x6b\x69\x70\x5f\x63\x6c\x61\x73\x73\x69\x66\x79\0\
-\x74\x63\x5f\x61\x74\x5f\x69\x6e\x67\x72\x65\x73\x73\0\x6e\x64\x69\x73\x63\x5f\
-\x6e\x6f\x64\x65\x74\x79\x70\x65\0\x69\x70\x76\x73\x5f\x70\x72\x6f\x70\x65\x72\
-\x74\x79\0\x69\x6e\x6e\x65\x72\x5f\x70\x72\x6f\x74\x6f\x63\x6f\x6c\x5f\x74\x79\
-\x70\x65\0\x72\x65\x64\x69\x72\x65\x63\x74\x65\x64\0\x6e\x66\x5f\x73\x6b\x69\
-\x70\x5f\x65\x67\x72\x65\x73\x73\0\x73\x6c\x6f\x77\x5f\x67\x72\x6f\0\x63\x73\
-\x75\x6d\x5f\x6e\x6f\x74\x5f\x69\x6e\x65\x74\0\x73\x63\x6d\x5f\x69\x6f\x5f\x75\
-\x72\x69\x6e\x67\0\x74\x63\x5f\x69\x6e\x64\x65\x78\0\x70\x72\x69\x6f\x72\x69\
-\x74\x79\0\x73\x6b\x62\x5f\x69\x69\x66\0\x68\x61\x73\x68\0\x61\x6c\x6c\x6f\x63\
-\x5f\x63\x70\x75\0\x73\x65\x63\x6d\x61\x72\x6b\0\x69\x6e\x6e\x65\x72\x5f\x74\
-\x72\x61\x6e\x73\x70\x6f\x72\x74\x5f\x68\x65\x61\x64\x65\x72\0\x69\x6e\x6e\x65\
-\x72\x5f\x6e\x65\x74\x77\x6f\x72\x6b\x5f\x68\x65\x61\x64\x65\x72\0\x69\x6e\x6e\
-\x65\x72\x5f\x6d\x61\x63\x5f\x68\x65\x61\x64\x65\x72\0\x70\x72\x6f\x74\x6f\x63\
-\x6f\x6c\0\x74\x72\x61\x6e\x73\x70\x6f\x72\x74\x5f\x68\x65\x61\x64\x65\x72\0\
-\x6e\x65\x74\x77\x6f\x72\x6b\x5f\x68\x65\x61\x64\x65\x72\0\x6d\x61\x63\x5f\x68\
-\x65\x61\x64\x65\x72\0\x63\x73\x75\x6d\0\x5f\x5f\x77\x73\x75\x6d\0\x5f\x5f\x75\
-\x33\x32\0\x63\x73\x75\x6d\x5f\x73\x74\x61\x72\x74\0\x63\x73\x75\x6d\x5f\x6f\
-\x66\x66\x73\x65\x74\0\x76\x6c\x61\x6e\x5f\x61\x6c\x6c\0\x75\x33\x32\0\x76\x6c\
-\x61\x6e\x5f\x70\x72\x6f\x74\x6f\0\x76\x6c\x61\x6e\x5f\x74\x63\x69\0\x5f\x5f\
-\x62\x65\x31\x36\0\x6e\x61\x70\x69\x5f\x69\x64\0\x73\x65\x6e\x64\x65\x72\x5f\
-\x63\x70\x75\0\x75\x31\x36\0\x6d\x61\x72\x6b\0\x72\x65\x73\x65\x72\x76\x65\x64\
-\x5f\x74\x61\x69\x6c\x72\x6f\x6f\x6d\0\x69\x6e\x6e\x65\x72\x5f\x70\x72\x6f\x74\
-\x6f\x63\x6f\x6c\0\x69\x6e\x6e\x65\x72\x5f\x69\x70\x70\x72\x6f\x74\x6f\0\x73\
-\x6b\x5f\x62\x75\x66\x66\x5f\x64\x61\x74\x61\x5f\x74\0\x72\x65\x66\x63\x6f\x75\
-\x6e\x74\x5f\x74\0\x72\x65\x66\x63\x6f\x75\x6e\x74\x5f\x73\x74\x72\x75\x63\x74\
-\0\x72\x65\x66\x73\0\x61\x74\x6f\x6d\x69\x63\x5f\x74\0\x63\x6f\x75\x6e\x74\x65\
-\x72\0\x74\x63\x70\x5f\x73\x6b\x62\x5f\x63\x62\0\x73\x65\x71\0\x65\x6e\x64\x5f\
-\x73\x65\x71\0\x74\x63\x70\x5f\x66\x6c\x61\x67\x73\0\x73\x61\x63\x6b\x65\x64\0\
-\x69\x70\x5f\x64\x73\x66\x69\x65\x6c\x64\0\x74\x78\x73\x74\x61\x6d\x70\x5f\x61\
-\x63\x6b\0\x65\x6f\x72\0\x68\x61\x73\x5f\x72\x78\x74\x73\x74\x61\x6d\x70\0\x75\
-\x6e\x75\x73\x65\x64\0\x61\x63\x6b\x5f\x73\x65\x71\0\x74\x63\x70\x5f\x74\x77\
-\x5f\x69\x73\x6e\0\x74\x63\x70\x5f\x67\x73\x6f\x5f\x73\x65\x67\x73\0\x74\x63\
-\x70\x5f\x67\x73\x6f\x5f\x73\x69\x7a\x65\0\x74\x78\0\x68\x65\x61\x64\x65\x72\0\
-\x69\x73\x5f\x61\x70\x70\x5f\x6c\x69\x6d\x69\x74\x65\x64\0\x64\x65\x6c\x69\x76\
-\x65\x72\x65\x64\x5f\x63\x65\0\x64\x65\x6c\x69\x76\x65\x72\x65\x64\0\x66\x69\
-\x72\x73\x74\x5f\x74\x78\x5f\x6d\x73\x74\x61\x6d\x70\0\x64\x65\x6c\x69\x76\x65\
-\x72\x65\x64\x5f\x6d\x73\x74\x61\x6d\x70\0\x68\x34\0\x68\x36\0\x69\x6e\x65\x74\
-\x5f\x73\x6b\x62\x5f\x70\x61\x72\x6d\0\x69\x69\x66\0\x6f\x70\x74\0\x66\x6c\x61\
-\x67\x73\0\x66\x72\x61\x67\x5f\x6d\x61\x78\x5f\x73\x69\x7a\x65\0\x69\x70\x5f\
-\x6f\x70\x74\x69\x6f\x6e\x73\0\x66\x61\x64\x64\x72\0\x6e\x65\x78\x74\x68\x6f\
-\x70\0\x6f\x70\x74\x6c\x65\x6e\0\x73\x72\x72\0\x72\x72\0\x74\x73\0\x69\x73\x5f\
-\x73\x74\x72\x69\x63\x74\x72\x6f\x75\x74\x65\0\x73\x72\x72\x5f\x69\x73\x5f\x68\
-\x69\x74\0\x69\x73\x5f\x63\x68\x61\x6e\x67\x65\x64\0\x72\x72\x5f\x6e\x65\x65\
-\x64\x61\x64\x64\x72\0\x74\x73\x5f\x6e\x65\x65\x64\x74\x69\x6d\x65\0\x74\x73\
-\x5f\x6e\x65\x65\x64\x61\x64\x64\x72\0\x72\x6f\x75\x74\x65\x72\x5f\x61\x6c\x65\
-\x72\x74\0\x63\x69\x70\x73\x6f\0\x5f\x5f\x70\x61\x64\x32\0\x5f\x5f\x64\x61\x74\
-\x61\0\x5f\x5f\x62\x65\x33\x32\0\x69\x6e\x65\x74\x36\x5f\x73\x6b\x62\x5f\x70\
-\x61\x72\x6d\0\x72\x61\0\x64\x73\x74\x30\0\x73\x72\x63\x72\x74\0\x64\x73\x74\
-\x31\0\x6c\x61\x73\x74\x6f\x70\x74\0\x6e\x68\x6f\x66\x66\0\x64\x73\x74\x68\x61\
-\x6f\0\x73\x72\x68\x6f\x66\x66\0\x73\x6f\x63\x6b\0\x5f\x5f\x73\x6b\x5f\x63\x6f\
-\x6d\x6d\x6f\x6e\0\x73\x6b\x5f\x72\x78\x5f\x64\x73\x74\0\x73\x6b\x5f\x72\x78\
-\x5f\x64\x73\x74\x5f\x69\x66\x69\x6e\x64\x65\x78\0\x73\x6b\x5f\x72\x78\x5f\x64\
-\x73\x74\x5f\x63\x6f\x6f\x6b\x69\x65\0\x73\x6b\x5f\x6c\x6f\x63\x6b\0\x73\x6b\
-\x5f\x64\x72\x6f\x70\x73\0\x73\x6b\x5f\x72\x63\x76\x6c\x6f\x77\x61\x74\0\x73\
-\x6b\x5f\x65\x72\x72\x6f\x72\x5f\x71\x75\x65\x75\x65\0\x73\x6b\x5f\x72\x65\x63\
-\x65\x69\x76\x65\x5f\x71\x75\x65\x75\x65\0\x73\x6b\x5f\x62\x61\x63\x6b\x6c\x6f\
-\x67\0\x73\x6b\x5f\x66\x6f\x72\x77\x61\x72\x64\x5f\x61\x6c\x6c\x6f\x63\0\x73\
-\x6b\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x5f\x6d\x65\x6d\0\x73\x6b\x5f\x6c\x6c\
-\x5f\x75\x73\x65\x63\0\x73\x6b\x5f\x6e\x61\x70\x69\x5f\x69\x64\0\x73\x6b\x5f\
-\x72\x63\x76\x62\x75\x66\0\x73\x6b\x5f\x66\x69\x6c\x74\x65\x72\0\x73\x6b\x5f\
-\x70\x6f\x6c\x69\x63\x79\0\x73\x6b\x5f\x64\x73\x74\x5f\x63\x61\x63\x68\x65\0\
-\x73\x6b\x5f\x6f\x6d\x65\x6d\x5f\x61\x6c\x6c\x6f\x63\0\x73\x6b\x5f\x73\x6e\x64\
-\x62\x75\x66\0\x73\x6b\x5f\x77\x6d\x65\x6d\x5f\x71\x75\x65\x75\x65\x64\0\x73\
-\x6b\x5f\x77\x6d\x65\x6d\x5f\x61\x6c\x6c\x6f\x63\0\x73\x6b\x5f\x74\x73\x71\x5f\
-\x66\x6c\x61\x67\x73\0\x73\x6b\x5f\x77\x72\x69\x74\x65\x5f\x71\x75\x65\x75\x65\
-\0\x73\x6b\x5f\x70\x65\x65\x6b\x5f\x6f\x66\x66\0\x73\x6b\x5f\x77\x72\x69\x74\
-\x65\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x73\x6b\x5f\x64\x73\x74\x5f\x70\x65\x6e\
-\x64\x69\x6e\x67\x5f\x63\x6f\x6e\x66\x69\x72\x6d\0\x73\x6b\x5f\x70\x61\x63\x69\
-\x6e\x67\x5f\x73\x74\x61\x74\x75\x73\0\x73\x6b\x5f\x73\x6e\x64\x74\x69\x6d\x65\
-\x6f\0\x73\x6b\x5f\x74\x69\x6d\x65\x72\0\x73\x6b\x5f\x70\x72\x69\x6f\x72\x69\
-\x74\x79\0\x73\x6b\x5f\x6d\x61\x72\x6b\0\x73\x6b\x5f\x70\x61\x63\x69\x6e\x67\
-\x5f\x72\x61\x74\x65\0\x73\x6b\x5f\x6d\x61\x78\x5f\x70\x61\x63\x69\x6e\x67\x5f\
-\x72\x61\x74\x65\0\x73\x6b\x5f\x66\x72\x61\x67\0\x73\x6b\x5f\x72\x6f\x75\x74\
-\x65\x5f\x63\x61\x70\x73\0\x73\x6b\x5f\x67\x73\x6f\x5f\x74\x79\x70\x65\0\x73\
-\x6b\x5f\x67\x73\x6f\x5f\x6d\x61\x78\x5f\x73\x69\x7a\x65\0\x73\x6b\x5f\x61\x6c\
-\x6c\x6f\x63\x61\x74\x69\x6f\x6e\0\x73\x6b\x5f\x74\x78\x68\x61\x73\x68\0\x73\
-\x6b\x5f\x67\x73\x6f\x5f\x64\x69\x73\x61\x62\x6c\x65\x64\0\x73\x6b\x5f\x6b\x65\
-\x72\x6e\x5f\x73\x6f\x63\x6b\0\x73\x6b\x5f\x6e\x6f\x5f\x63\x68\x65\x63\x6b\x5f\
-\x74\x78\0\x73\x6b\x5f\x6e\x6f\x5f\x63\x68\x65\x63\x6b\x5f\x72\x78\0\x73\x6b\
-\x5f\x75\x73\x65\x72\x6c\x6f\x63\x6b\x73\0\x73\x6b\x5f\x70\x61\x63\x69\x6e\x67\
-\x5f\x73\x68\x69\x66\x74\0\x73\x6b\x5f\x74\x79\x70\x65\0\x73\x6b\x5f\x70\x72\
-\x6f\x74\x6f\x63\x6f\x6c\0\x73\x6b\x5f\x67\x73\x6f\x5f\x6d\x61\x78\x5f\x73\x65\
-\x67\x73\0\x73\x6b\x5f\x6c\x69\x6e\x67\x65\x72\x74\x69\x6d\x65\0\x73\x6b\x5f\
-\x70\x72\x6f\x74\x5f\x63\x72\x65\x61\x74\x6f\x72\0\x73\x6b\x5f\x63\x61\x6c\x6c\
-\x62\x61\x63\x6b\x5f\x6c\x6f\x63\x6b\0\x73\x6b\x5f\x65\x72\x72\0\x73\x6b\x5f\
-\x65\x72\x72\x5f\x73\x6f\x66\x74\0\x73\x6b\x5f\x61\x63\x6b\x5f\x62\x61\x63\x6b\
-\x6c\x6f\x67\0\x73\x6b\x5f\x6d\x61\x78\x5f\x61\x63\x6b\x5f\x62\x61\x63\x6b\x6c\
-\x6f\x67\0\x73\x6b\x5f\x75\x69\x64\0\x73\x6b\x5f\x74\x78\x72\x65\x68\x61\x73\
-\x68\0\x73\x6b\x5f\x70\x72\x65\x66\x65\x72\x5f\x62\x75\x73\x79\x5f\x70\x6f\x6c\
-\x6c\0\x73\x6b\x5f\x62\x75\x73\x79\x5f\x70\x6f\x6c\x6c\x5f\x62\x75\x64\x67\x65\
-\x74\0\x73\x6b\x5f\x70\x65\x65\x72\x5f\x6c\x6f\x63\x6b\0\x73\x6b\x5f\x62\x69\
-\x6e\x64\x5f\x70\x68\x63\0\x73\x6b\x5f\x70\x65\x65\x72\x5f\x70\x69\x64\0\x73\
-\x6b\x5f\x70\x65\x65\x72\x5f\x63\x72\x65\x64\0\x73\x6b\x5f\x72\x63\x76\x74\x69\
-\x6d\x65\x6f\0\x73\x6b\x5f\x73\x74\x61\x6d\x70\0\x73\x6b\x5f\x74\x73\x6b\x65\
-\x79\0\x73\x6b\x5f\x7a\x63\x6b\x65\x79\0\x73\x6b\x5f\x74\x73\x66\x6c\x61\x67\
-\x73\0\x73\x6b\x5f\x73\x68\x75\x74\x64\x6f\x77\x6e\0\x73\x6b\x5f\x63\x6c\x6f\
-\x63\x6b\x69\x64\0\x73\x6b\x5f\x74\x78\x74\x69\x6d\x65\x5f\x64\x65\x61\x64\x6c\
-\x69\x6e\x65\x5f\x6d\x6f\x64\x65\0\x73\x6b\x5f\x74\x78\x74\x69\x6d\x65\x5f\x72\
-\x65\x70\x6f\x72\x74\x5f\x65\x72\x72\x6f\x72\x73\0\x73\x6b\x5f\x74\x78\x74\x69\
-\x6d\x65\x5f\x75\x6e\x75\x73\x65\x64\0\x73\x6b\x5f\x73\x6f\x63\x6b\x65\x74\0\
-\x73\x6b\x5f\x75\x73\x65\x72\x5f\x64\x61\x74\x61\0\x73\x6b\x5f\x73\x65\x63\x75\
-\x72\x69\x74\x79\0\x73\x6b\x5f\x63\x67\x72\x70\x5f\x64\x61\x74\x61\0\x73\x6b\
-\x5f\x6d\x65\x6d\x63\x67\0\x73\x6b\x5f\x73\x74\x61\x74\x65\x5f\x63\x68\x61\x6e\
-\x67\x65\0\x73\x6b\x5f\x64\x61\x74\x61\x5f\x72\x65\x61\x64\x79\0\x73\x6b\x5f\
-\x77\x72\x69\x74\x65\x5f\x73\x70\x61\x63\x65\0\x73\x6b\x5f\x65\x72\x72\x6f\x72\
-\x5f\x72\x65\x70\x6f\x72\x74\0\x73\x6b\x5f\x62\x61\x63\x6b\x6c\x6f\x67\x5f\x72\
-\x63\x76\0\x73\x6b\x5f\x64\x65\x73\x74\x72\x75\x63\x74\0\x73\x6b\x5f\x72\x65\
-\x75\x73\x65\x70\x6f\x72\x74\x5f\x63\x62\0\x73\x6b\x5f\x62\x70\x66\x5f\x73\x74\
-\x6f\x72\x61\x67\x65\0\x73\x6b\x5f\x72\x63\x75\0\x6e\x73\x5f\x74\x72\x61\x63\
-\x6b\x65\x72\0\x73\x6b\x5f\x62\x69\x6e\x64\x32\x5f\x6e\x6f\x64\x65\0\x73\x6f\
-\x63\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\0\x73\x6b\x63\x5f\x66\x61\x6d\x69\x6c\x79\
-\0\x73\x6b\x63\x5f\x73\x74\x61\x74\x65\0\x73\x6b\x63\x5f\x72\x65\x75\x73\x65\0\
-\x73\x6b\x63\x5f\x72\x65\x75\x73\x65\x70\x6f\x72\x74\0\x73\x6b\x63\x5f\x69\x70\
-\x76\x36\x6f\x6e\x6c\x79\0\x73\x6b\x63\x5f\x6e\x65\x74\x5f\x72\x65\x66\x63\x6e\
-\x74\0\x73\x6b\x63\x5f\x62\x6f\x75\x6e\x64\x5f\x64\x65\x76\x5f\x69\x66\0\x73\
-\x6b\x63\x5f\x70\x72\x6f\x74\0\x73\x6b\x63\x5f\x6e\x65\x74\0\x73\x6b\x63\x5f\
-\x76\x36\x5f\x64\x61\x64\x64\x72\0\x73\x6b\x63\x5f\x76\x36\x5f\x72\x63\x76\x5f\
-\x73\x61\x64\x64\x72\0\x73\x6b\x63\x5f\x63\x6f\x6f\x6b\x69\x65\0\x73\x6b\x63\
-\x5f\x64\x6f\x6e\x74\x63\x6f\x70\x79\x5f\x62\x65\x67\x69\x6e\0\x73\x6b\x63\x5f\
-\x74\x78\x5f\x71\x75\x65\x75\x65\x5f\x6d\x61\x70\x70\x69\x6e\x67\0\x73\x6b\x63\
-\x5f\x72\x78\x5f\x71\x75\x65\x75\x65\x5f\x6d\x61\x70\x70\x69\x6e\x67\0\x73\x6b\
-\x63\x5f\x72\x65\x66\x63\x6e\x74\0\x73\x6b\x63\x5f\x64\x6f\x6e\x74\x63\x6f\x70\
-\x79\x5f\x65\x6e\x64\0\x73\x6b\x63\x5f\x61\x64\x64\x72\x70\x61\x69\x72\0\x5f\
-\x5f\x61\x64\x64\x72\x70\x61\x69\x72\0\x73\x6b\x63\x5f\x64\x61\x64\x64\x72\0\
-\x73\x6b\x63\x5f\x72\x63\x76\x5f\x73\x61\x64\x64\x72\0\x73\x6b\x63\x5f\x68\x61\
-\x73\x68\0\x73\x6b\x63\x5f\x75\x31\x36\x68\x61\x73\x68\x65\x73\0\x73\x6b\x63\
-\x5f\x70\x6f\x72\x74\x70\x61\x69\x72\0\x5f\x5f\x70\x6f\x72\x74\x70\x61\x69\x72\
-\0\x73\x6b\x63\x5f\x64\x70\x6f\x72\x74\0\x73\x6b\x63\x5f\x6e\x75\x6d\0\x73\x6b\
-\x63\x5f\x62\x69\x6e\x64\x5f\x6e\x6f\x64\x65\0\x73\x6b\x63\x5f\x70\x6f\x72\x74\
-\x61\x64\x64\x72\x5f\x6e\x6f\x64\x65\0\x68\x6c\x69\x73\x74\x5f\x6e\x6f\x64\x65\
-\0\x70\x70\x72\x65\x76\0\x70\x6f\x73\x73\x69\x62\x6c\x65\x5f\x6e\x65\x74\x5f\
-\x74\0\x6e\x65\x74\0\x69\x6e\x36\x5f\x61\x64\x64\x72\0\x69\x6e\x36\x5f\x75\0\
-\x75\x36\x5f\x61\x64\x64\x72\x38\0\x75\x36\x5f\x61\x64\x64\x72\x31\x36\0\x75\
-\x36\x5f\x61\x64\x64\x72\x33\x32\0\x61\x74\x6f\x6d\x69\x63\x36\x34\x5f\x74\0\
-\x73\x6b\x63\x5f\x66\x6c\x61\x67\x73\0\x73\x6b\x63\x5f\x6c\x69\x73\x74\x65\x6e\
-\x65\x72\0\x73\x6b\x63\x5f\x74\x77\x5f\x64\x72\0\x73\x6b\x63\x5f\x6e\x6f\x64\
-\x65\0\x73\x6b\x63\x5f\x6e\x75\x6c\x6c\x73\x5f\x6e\x6f\x64\x65\0\x68\x6c\x69\
-\x73\x74\x5f\x6e\x75\x6c\x6c\x73\x5f\x6e\x6f\x64\x65\0\x73\x6b\x63\x5f\x69\x6e\
-\x63\x6f\x6d\x69\x6e\x67\x5f\x63\x70\x75\0\x73\x6b\x63\x5f\x72\x63\x76\x5f\x77\
-\x6e\x64\0\x73\x6b\x63\x5f\x74\x77\x5f\x72\x63\x76\x5f\x6e\x78\x74\0\x73\x6b\
-\x63\x5f\x72\x78\x68\x61\x73\x68\0\x73\x6b\x63\x5f\x77\x69\x6e\x64\x6f\x77\x5f\
-\x63\x6c\x61\x6d\x70\0\x73\x6b\x63\x5f\x74\x77\x5f\x73\x6e\x64\x5f\x6e\x78\x74\
-\0\x73\x6f\x63\x6b\x65\x74\x5f\x6c\x6f\x63\x6b\x5f\x74\0\x73\x6c\x6f\x63\x6b\0\
-\x6f\x77\x6e\x65\x64\0\x77\x71\0\x64\x65\x70\x5f\x6d\x61\x70\0\x73\x70\x69\x6e\
-\x6c\x6f\x63\x6b\x5f\x74\0\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x72\x6c\x6f\x63\
-\x6b\0\x72\x61\x77\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x72\x61\x77\x5f\x6c\
-\x6f\x63\x6b\0\x6d\x61\x67\x69\x63\0\x6f\x77\x6e\x65\x72\x5f\x63\x70\x75\0\x6f\
-\x77\x6e\x65\x72\0\x61\x72\x63\x68\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\
-\0\x71\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x76\x61\x6c\0\x6c\x6f\x63\x6b\x65\x64\
-\0\x70\x65\x6e\x64\x69\x6e\x67\0\x75\x38\0\x6c\x6f\x63\x6b\x65\x64\x5f\x70\x65\
-\x6e\x64\x69\x6e\x67\0\x6c\x6f\x63\x6b\x64\x65\x70\x5f\x6d\x61\x70\0\x6b\x65\
-\x79\0\x63\x6c\x61\x73\x73\x5f\x63\x61\x63\x68\x65\0\x6e\x61\x6d\x65\0\x77\x61\
-\x69\x74\x5f\x74\x79\x70\x65\x5f\x6f\x75\x74\x65\x72\0\x77\x61\x69\x74\x5f\x74\
-\x79\x70\x65\x5f\x69\x6e\x6e\x65\x72\0\x6c\x6f\x63\x6b\x5f\x74\x79\x70\x65\0\
-\x6c\x6f\x63\x6b\x5f\x63\x6c\x61\x73\x73\0\x68\x61\x73\x68\x5f\x65\x6e\x74\x72\
-\x79\0\x6c\x6f\x63\x6b\x5f\x65\x6e\x74\x72\x79\0\x6c\x6f\x63\x6b\x73\x5f\x61\
-\x66\x74\x65\x72\0\x6c\x6f\x63\x6b\x73\x5f\x62\x65\x66\x6f\x72\x65\0\x73\x75\
-\x62\x63\x6c\x61\x73\x73\0\x64\x65\x70\x5f\x67\x65\x6e\x5f\x69\x64\0\x75\x73\
-\x61\x67\x65\x5f\x6d\x61\x73\x6b\0\x75\x73\x61\x67\x65\x5f\x74\x72\x61\x63\x65\
-\x73\0\x6e\x61\x6d\x65\x5f\x76\x65\x72\x73\x69\x6f\x6e\0\x6c\x6f\x63\x6b\x5f\
-\x74\x72\x61\x63\x65\0\x6e\x72\x5f\x65\x6e\x74\x72\x69\x65\x73\0\x65\x6e\x74\
-\x72\x69\x65\x73\0\x5f\x5f\x70\x61\x64\x64\x69\x6e\x67\0\x77\x61\x69\x74\x5f\
-\x71\x75\x65\x75\x65\x5f\x68\x65\x61\x64\x5f\x74\0\x77\x61\x69\x74\x5f\x71\x75\
-\x65\x75\x65\x5f\x68\x65\x61\x64\0\x6c\x6f\x63\x6b\0\x73\x6b\x5f\x62\x75\x66\
-\x66\x5f\x68\x65\x61\x64\0\x71\x6c\x65\x6e\0\x73\x6b\x5f\x62\x75\x66\x66\x5f\
-\x6c\x69\x73\x74\0\x72\x6d\x65\x6d\x5f\x61\x6c\x6c\x6f\x63\0\x73\x6b\x5f\x77\
-\x71\0\x73\x6b\x5f\x77\x71\x5f\x72\x61\x77\0\x78\x66\x72\x6d\x5f\x70\x6f\x6c\
-\x69\x63\x79\0\x78\x70\x5f\x6e\x65\x74\0\x62\x79\x64\x73\x74\0\x62\x79\x69\x64\
-\x78\0\x72\x65\x66\x63\x6e\x74\0\x70\x6f\x73\0\x74\x69\x6d\x65\x72\0\x67\x65\
-\x6e\x69\x64\0\x69\x6e\x64\x65\x78\0\x69\x66\x5f\x69\x64\0\x73\x65\x6c\x65\x63\
-\x74\x6f\x72\0\x6c\x66\x74\0\x63\x75\x72\x6c\x66\x74\0\x77\x61\x6c\x6b\0\x70\
-\x6f\x6c\x71\0\x62\x79\x64\x73\x74\x5f\x72\x65\x69\x6e\x73\x65\x72\x74\0\x61\
-\x63\x74\x69\x6f\x6e\0\x78\x66\x72\x6d\x5f\x6e\x72\0\x73\x65\x63\x75\x72\x69\
-\x74\x79\0\x78\x66\x72\x6d\x5f\x76\x65\x63\0\x62\x79\x64\x73\x74\x5f\x69\x6e\
-\x65\x78\x61\x63\x74\x5f\x6c\x69\x73\x74\0\x72\x63\x75\0\x78\x64\x6f\0\x72\x77\
-\x6c\x6f\x63\x6b\x5f\x74\0\x61\x72\x63\x68\x5f\x72\x77\x6c\x6f\x63\x6b\x5f\x74\
-\0\x71\x72\x77\x6c\x6f\x63\x6b\0\x77\x61\x69\x74\x5f\x6c\x6f\x63\x6b\0\x63\x6e\
-\x74\x73\0\x77\x6c\x6f\x63\x6b\x65\x64\0\x5f\x5f\x6c\x73\x74\x61\x74\x65\0\x74\
-\x69\x6d\x65\x72\x5f\x6c\x69\x73\x74\0\x65\x6e\x74\x72\x79\0\x65\x78\x70\x69\
-\x72\x65\x73\0\x66\x75\x6e\x63\x74\x69\x6f\x6e\0\x78\x66\x72\x6d\x5f\x6d\x61\
-\x72\x6b\0\x76\0\x6d\0\x78\x66\x72\x6d\x5f\x73\x65\x6c\x65\x63\x74\x6f\x72\0\
-\x64\x70\x6f\x72\x74\x5f\x6d\x61\x73\x6b\0\x73\x70\x6f\x72\x74\x5f\x6d\x61\x73\
-\x6b\0\x70\x72\x65\x66\x69\x78\x6c\x65\x6e\x5f\x64\0\x70\x72\x65\x66\x69\x78\
-\x6c\x65\x6e\x5f\x73\0\x70\x72\x6f\x74\x6f\0\x69\x66\x69\x6e\x64\x65\x78\0\x75\
-\x73\x65\x72\0\x78\x66\x72\x6d\x5f\x61\x64\x64\x72\x65\x73\x73\x5f\x74\0\x61\
-\x34\0\x61\x36\0\x69\x6e\x36\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x75\x69\x64\
-\x33\x32\x5f\x74\0\x78\x66\x72\x6d\x5f\x6c\x69\x66\x65\x74\x69\x6d\x65\x5f\x63\
-\x66\x67\0\x73\x6f\x66\x74\x5f\x62\x79\x74\x65\x5f\x6c\x69\x6d\x69\x74\0\x68\
-\x61\x72\x64\x5f\x62\x79\x74\x65\x5f\x6c\x69\x6d\x69\x74\0\x73\x6f\x66\x74\x5f\
-\x70\x61\x63\x6b\x65\x74\x5f\x6c\x69\x6d\x69\x74\0\x68\x61\x72\x64\x5f\x70\x61\
-\x63\x6b\x65\x74\x5f\x6c\x69\x6d\x69\x74\0\x73\x6f\x66\x74\x5f\x61\x64\x64\x5f\
-\x65\x78\x70\x69\x72\x65\x73\x5f\x73\x65\x63\x6f\x6e\x64\x73\0\x68\x61\x72\x64\
-\x5f\x61\x64\x64\x5f\x65\x78\x70\x69\x72\x65\x73\x5f\x73\x65\x63\x6f\x6e\x64\
-\x73\0\x73\x6f\x66\x74\x5f\x75\x73\x65\x5f\x65\x78\x70\x69\x72\x65\x73\x5f\x73\
-\x65\x63\x6f\x6e\x64\x73\0\x68\x61\x72\x64\x5f\x75\x73\x65\x5f\x65\x78\x70\x69\
-\x72\x65\x73\x5f\x73\x65\x63\x6f\x6e\x64\x73\0\x78\x66\x72\x6d\x5f\x6c\x69\x66\
-\x65\x74\x69\x6d\x65\x5f\x63\x75\x72\0\x62\x79\x74\x65\x73\0\x70\x61\x63\x6b\
-\x65\x74\x73\0\x61\x64\x64\x5f\x74\x69\x6d\x65\0\x75\x73\x65\x5f\x74\x69\x6d\
-\x65\0\x78\x66\x72\x6d\x5f\x70\x6f\x6c\x69\x63\x79\x5f\x77\x61\x6c\x6b\x5f\x65\
-\x6e\x74\x72\x79\0\x61\x6c\x6c\0\x64\x65\x61\x64\0\x78\x66\x72\x6d\x5f\x70\x6f\
-\x6c\x69\x63\x79\x5f\x71\x75\x65\x75\x65\0\x68\x6f\x6c\x64\x5f\x71\x75\x65\x75\
-\x65\0\x68\x6f\x6c\x64\x5f\x74\x69\x6d\x65\x72\0\x74\x69\x6d\x65\x6f\x75\x74\0\
-\x62\x6f\x6f\x6c\0\x5f\x42\x6f\x6f\x6c\0\x78\x66\x72\x6d\x5f\x74\x6d\x70\x6c\0\
-\x69\x64\0\x65\x6e\x63\x61\x70\x5f\x66\x61\x6d\x69\x6c\x79\0\x72\x65\x71\x69\
-\x64\0\x6d\x6f\x64\x65\0\x73\x68\x61\x72\x65\0\x6f\x70\x74\x69\x6f\x6e\x61\x6c\
-\0\x61\x6c\x6c\x61\x6c\x67\x73\0\x61\x61\x6c\x67\x6f\x73\0\x65\x61\x6c\x67\x6f\
-\x73\0\x63\x61\x6c\x67\x6f\x73\0\x78\x66\x72\x6d\x5f\x69\x64\0\x73\x70\x69\0\
-\x63\x61\x6c\x6c\x62\x61\x63\x6b\x5f\x68\x65\x61\x64\0\x66\x75\x6e\x63\0\x78\
-\x66\x72\x6d\x5f\x64\x65\x76\x5f\x6f\x66\x66\x6c\x6f\x61\x64\0\x64\x65\x76\x5f\
-\x74\x72\x61\x63\x6b\x65\x72\0\x72\x65\x61\x6c\x5f\x64\x65\x76\0\x6f\x66\x66\
-\x6c\x6f\x61\x64\x5f\x68\x61\x6e\x64\x6c\x65\0\x64\x69\x72\0\x6e\x65\x74\x64\
-\x65\x76\x69\x63\x65\x5f\x74\x72\x61\x63\x6b\x65\x72\0\x73\x6b\x5f\x73\x65\x6e\
-\x64\x5f\x68\x65\x61\x64\0\x74\x63\x70\x5f\x72\x74\x78\x5f\x71\x75\x65\x75\x65\
-\0\x72\x62\x5f\x72\x6f\x6f\x74\0\x5f\x5f\x73\x33\x32\0\x6c\x6f\x6e\x67\0\x70\
-\x61\x67\x65\x5f\x66\x72\x61\x67\0\x70\x61\x67\x65\0\x6f\x66\x66\x73\x65\x74\0\
-\x73\x69\x7a\x65\0\x6e\x65\x74\x64\x65\x76\x5f\x66\x65\x61\x74\x75\x72\x65\x73\
-\x5f\x74\0\x67\x66\x70\x5f\x74\0\x6b\x75\x69\x64\x5f\x74\0\x75\x69\x64\x5f\x74\
-\0\x73\x6f\x63\x6b\x5f\x63\x67\x72\x6f\x75\x70\x5f\x64\x61\x74\x61\0\x63\x67\
-\x72\x6f\x75\x70\0\x63\x6c\x61\x73\x73\x69\x64\0\x6e\x65\x74\x6e\x73\x5f\x74\
-\x72\x61\x63\x6b\x65\x72\0\x70\x74\x5f\x72\x65\x67\x73\0\x72\x31\x35\0\x72\x31\
-\x34\0\x72\x31\x33\0\x72\x31\x32\0\x62\x70\0\x62\x78\0\x72\x31\x31\0\x72\x31\
-\x30\0\x72\x39\0\x72\x38\0\x61\x78\0\x63\x78\0\x64\x78\0\x73\x69\0\x64\x69\0\
-\x6f\x72\x69\x67\x5f\x61\x78\0\x69\x70\0\x63\x73\0\x73\x70\0\x73\x73\0\x74\x6f\
-\x70\x5f\x74\x63\x70\x5f\x73\x65\x6e\x64\x5f\x65\x6e\x74\x72\x79\0\x74\x6f\x70\
-\x5f\x74\x63\x70\x5f\x73\x65\x6e\x64\x5f\x72\x65\x74\0\x74\x6f\x70\x5f\x74\x63\
-\x70\x5f\x72\x65\x63\x76\x5f\x65\x6e\x74\x72\x79\0\x74\x63\x70\x5f\x76\x34\x5f\
-\x63\x6f\x6e\x6e\x65\x63\x74\0\x74\x63\x70\x5f\x76\x36\x5f\x63\x6f\x6e\x6e\x65\
-\x63\x74\0\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\
-\x63\x65\x73\x73\0\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\x76\x34\x5f\x63\
-\x6f\x6e\x6e\x65\x63\x74\0\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\x76\x36\
-\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\
-\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x74\x63\
-\x70\x72\x74\x74\0\x74\x63\x70\x5f\x73\x6f\x63\x6b\0\x69\x6e\x65\x74\x5f\x63\
-\x6f\x6e\x6e\0\x74\x63\x70\x5f\x68\x65\x61\x64\x65\x72\x5f\x6c\x65\x6e\0\x67\
-\x73\x6f\x5f\x73\x65\x67\x73\0\x70\x72\x65\x64\x5f\x66\x6c\x61\x67\x73\0\x62\
-\x79\x74\x65\x73\x5f\x72\x65\x63\x65\x69\x76\x65\x64\0\x73\x65\x67\x73\x5f\x69\
-\x6e\0\x64\x61\x74\x61\x5f\x73\x65\x67\x73\x5f\x69\x6e\0\x72\x63\x76\x5f\x6e\
-\x78\x74\0\x63\x6f\x70\x69\x65\x64\x5f\x73\x65\x71\0\x72\x63\x76\x5f\x77\x75\
-\x70\0\x73\x6e\x64\x5f\x6e\x78\x74\0\x73\x65\x67\x73\x5f\x6f\x75\x74\0\x64\x61\
-\x74\x61\x5f\x73\x65\x67\x73\x5f\x6f\x75\x74\0\x62\x79\x74\x65\x73\x5f\x73\x65\
-\x6e\x74\0\x62\x79\x74\x65\x73\x5f\x61\x63\x6b\x65\x64\0\x64\x73\x61\x63\x6b\
-\x5f\x64\x75\x70\x73\0\x73\x6e\x64\x5f\x75\x6e\x61\0\x73\x6e\x64\x5f\x73\x6d\
-\x6c\0\x72\x63\x76\x5f\x74\x73\x74\x61\x6d\x70\0\x6c\x73\x6e\x64\x74\x69\x6d\
-\x65\0\x6c\x61\x73\x74\x5f\x6f\x6f\x77\x5f\x61\x63\x6b\x5f\x74\x69\x6d\x65\0\
-\x63\x6f\x6d\x70\x72\x65\x73\x73\x65\x64\x5f\x61\x63\x6b\x5f\x72\x63\x76\x5f\
-\x6e\x78\x74\0\x74\x73\x6f\x66\x66\x73\x65\x74\0\x74\x73\x71\x5f\x6e\x6f\x64\
-\x65\0\x74\x73\x6f\x72\x74\x65\x64\x5f\x73\x65\x6e\x74\x5f\x71\x75\x65\x75\x65\
-\0\x73\x6e\x64\x5f\x77\x6c\x31\0\x73\x6e\x64\x5f\x77\x6e\x64\0\x6d\x61\x78\x5f\
-\x77\x69\x6e\x64\x6f\x77\0\x6d\x73\x73\x5f\x63\x61\x63\x68\x65\0\x77\x69\x6e\
-\x64\x6f\x77\x5f\x63\x6c\x61\x6d\x70\0\x72\x63\x76\x5f\x73\x73\x74\x68\x72\x65\
-\x73\x68\0\x72\x61\x63\x6b\0\x61\x64\x76\x6d\x73\x73\0\x63\x6f\x6d\x70\x72\x65\
-\x73\x73\x65\x64\x5f\x61\x63\x6b\0\x64\x75\x70\x5f\x61\x63\x6b\x5f\x63\x6f\x75\
-\x6e\x74\x65\x72\0\x74\x6c\x70\x5f\x72\x65\x74\x72\x61\x6e\x73\0\x63\x68\x72\
-\x6f\x6e\x6f\x5f\x73\x74\x61\x72\x74\0\x63\x68\x72\x6f\x6e\x6f\x5f\x73\x74\x61\
-\x74\0\x63\x68\x72\x6f\x6e\x6f\x5f\x74\x79\x70\x65\0\x72\x61\x74\x65\x5f\x61\
-\x70\x70\x5f\x6c\x69\x6d\x69\x74\x65\x64\0\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\
-\x63\x6f\x6e\x6e\x65\x63\x74\0\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\x6e\x6f\x5f\
-\x63\x6f\x6f\x6b\x69\x65\0\x69\x73\x5f\x73\x61\x63\x6b\x5f\x72\x65\x6e\x65\x67\
-\0\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\x63\x6c\x69\x65\x6e\x74\x5f\x66\x61\x69\
-\x6c\0\x6e\x6f\x6e\x61\x67\x6c\x65\0\x74\x68\x69\x6e\x5f\x6c\x74\x6f\0\x72\x65\
-\x63\x76\x6d\x73\x67\x5f\x69\x6e\x71\0\x72\x65\x70\x61\x69\x72\0\x66\x72\x74\
-\x6f\0\x72\x65\x70\x61\x69\x72\x5f\x71\x75\x65\x75\x65\0\x73\x61\x76\x65\x5f\
-\x73\x79\x6e\0\x73\x79\x6e\x5f\x64\x61\x74\x61\0\x73\x79\x6e\x5f\x66\x61\x73\
-\x74\x6f\x70\x65\x6e\0\x73\x79\x6e\x5f\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\x65\
-\x78\x70\0\x73\x79\x6e\x5f\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\x63\x68\0\x73\
-\x79\x6e\x5f\x64\x61\x74\x61\x5f\x61\x63\x6b\x65\x64\0\x69\x73\x5f\x63\x77\x6e\
-\x64\x5f\x6c\x69\x6d\x69\x74\x65\x64\0\x74\x6c\x70\x5f\x68\x69\x67\x68\x5f\x73\
-\x65\x71\0\x74\x63\x70\x5f\x74\x78\x5f\x64\x65\x6c\x61\x79\0\x74\x63\x70\x5f\
-\x77\x73\x74\x61\x6d\x70\x5f\x6e\x73\0\x74\x63\x70\x5f\x63\x6c\x6f\x63\x6b\x5f\
-\x63\x61\x63\x68\x65\0\x74\x63\x70\x5f\x6d\x73\x74\x61\x6d\x70\0\x73\x72\x74\
-\x74\x5f\x75\x73\0\x6d\x64\x65\x76\x5f\x75\x73\0\x6d\x64\x65\x76\x5f\x6d\x61\
-\x78\x5f\x75\x73\0\x72\x74\x74\x76\x61\x72\x5f\x75\x73\0\x72\x74\x74\x5f\x73\
-\x65\x71\0\x72\x74\x74\x5f\x6d\x69\x6e\0\x70\x61\x63\x6b\x65\x74\x73\x5f\x6f\
-\x75\x74\0\x72\x65\x74\x72\x61\x6e\x73\x5f\x6f\x75\x74\0\x6d\x61\x78\x5f\x70\
-\x61\x63\x6b\x65\x74\x73\x5f\x6f\x75\x74\0\x63\x77\x6e\x64\x5f\x75\x73\x61\x67\
-\x65\x5f\x73\x65\x71\0\x75\x72\x67\x5f\x64\x61\x74\x61\0\x65\x63\x6e\x5f\x66\
-\x6c\x61\x67\x73\0\x6b\x65\x65\x70\x61\x6c\x69\x76\x65\x5f\x70\x72\x6f\x62\x65\
-\x73\0\x72\x65\x6f\x72\x64\x65\x72\x69\x6e\x67\0\x72\x65\x6f\x72\x64\x5f\x73\
-\x65\x65\x6e\0\x73\x6e\x64\x5f\x75\x70\0\x72\x78\x5f\x6f\x70\x74\0\x73\x6e\x64\
-\x5f\x73\x73\x74\x68\x72\x65\x73\x68\0\x73\x6e\x64\x5f\x63\x77\x6e\x64\0\x73\
-\x6e\x64\x5f\x63\x77\x6e\x64\x5f\x63\x6e\x74\0\x73\x6e\x64\x5f\x63\x77\x6e\x64\
-\x5f\x63\x6c\x61\x6d\x70\0\x73\x6e\x64\x5f\x63\x77\x6e\x64\x5f\x75\x73\x65\x64\
-\0\x73\x6e\x64\x5f\x63\x77\x6e\x64\x5f\x73\x74\x61\x6d\x70\0\x70\x72\x69\x6f\
-\x72\x5f\x63\x77\x6e\x64\0\x70\x72\x72\x5f\x64\x65\x6c\x69\x76\x65\x72\x65\x64\
-\0\x70\x72\x72\x5f\x6f\x75\x74\0\x6c\x6f\x73\x74\0\x61\x70\x70\x5f\x6c\x69\x6d\
-\x69\x74\x65\x64\0\x72\x61\x74\x65\x5f\x64\x65\x6c\x69\x76\x65\x72\x65\x64\0\
-\x72\x61\x74\x65\x5f\x69\x6e\x74\x65\x72\x76\x61\x6c\x5f\x75\x73\0\x72\x63\x76\
-\x5f\x77\x6e\x64\0\x77\x72\x69\x74\x65\x5f\x73\x65\x71\0\x6e\x6f\x74\x73\x65\
-\x6e\x74\x5f\x6c\x6f\x77\x61\x74\0\x70\x75\x73\x68\x65\x64\x5f\x73\x65\x71\0\
-\x6c\x6f\x73\x74\x5f\x6f\x75\x74\0\x73\x61\x63\x6b\x65\x64\x5f\x6f\x75\x74\0\
-\x70\x61\x63\x69\x6e\x67\x5f\x74\x69\x6d\x65\x72\0\x63\x6f\x6d\x70\x72\x65\x73\
-\x73\x65\x64\x5f\x61\x63\x6b\x5f\x74\x69\x6d\x65\x72\0\x6c\x6f\x73\x74\x5f\x73\
-\x6b\x62\x5f\x68\x69\x6e\x74\0\x72\x65\x74\x72\x61\x6e\x73\x6d\x69\x74\x5f\x73\
-\x6b\x62\x5f\x68\x69\x6e\x74\0\x6f\x75\x74\x5f\x6f\x66\x5f\x6f\x72\x64\x65\x72\
-\x5f\x71\x75\x65\x75\x65\0\x6f\x6f\x6f\x5f\x6c\x61\x73\x74\x5f\x73\x6b\x62\0\
-\x64\x75\x70\x6c\x69\x63\x61\x74\x65\x5f\x73\x61\x63\x6b\0\x73\x65\x6c\x65\x63\
-\x74\x69\x76\x65\x5f\x61\x63\x6b\x73\0\x72\x65\x63\x76\x5f\x73\x61\x63\x6b\x5f\
-\x63\x61\x63\x68\x65\0\x68\x69\x67\x68\x65\x73\x74\x5f\x73\x61\x63\x6b\0\x6c\
-\x6f\x73\x74\x5f\x63\x6e\x74\x5f\x68\x69\x6e\x74\0\x70\x72\x69\x6f\x72\x5f\x73\
-\x73\x74\x68\x72\x65\x73\x68\0\x68\x69\x67\x68\x5f\x73\x65\x71\0\x72\x65\x74\
-\x72\x61\x6e\x73\x5f\x73\x74\x61\x6d\x70\0\x75\x6e\x64\x6f\x5f\x6d\x61\x72\x6b\
-\x65\x72\0\x75\x6e\x64\x6f\x5f\x72\x65\x74\x72\x61\x6e\x73\0\x62\x79\x74\x65\
-\x73\x5f\x72\x65\x74\x72\x61\x6e\x73\0\x74\x6f\x74\x61\x6c\x5f\x72\x65\x74\x72\
-\x61\x6e\x73\0\x75\x72\x67\x5f\x73\x65\x71\0\x6b\x65\x65\x70\x61\x6c\x69\x76\
-\x65\x5f\x74\x69\x6d\x65\0\x6b\x65\x65\x70\x61\x6c\x69\x76\x65\x5f\x69\x6e\x74\
-\x76\x6c\0\x6c\x69\x6e\x67\x65\x72\x32\0\x62\x70\x66\x5f\x73\x6f\x63\x6b\x5f\
-\x6f\x70\x73\x5f\x63\x62\x5f\x66\x6c\x61\x67\x73\0\x62\x70\x66\x5f\x63\x68\x67\
-\x5f\x63\x63\x5f\x69\x6e\x70\x72\x6f\x67\x72\x65\x73\x73\0\x74\x69\x6d\x65\x6f\
-\x75\x74\x5f\x72\x65\x68\x61\x73\x68\0\x72\x63\x76\x5f\x6f\x6f\x6f\x70\x61\x63\
-\x6b\0\x72\x63\x76\x5f\x72\x74\x74\x5f\x6c\x61\x73\x74\x5f\x74\x73\x65\x63\x72\
-\0\x72\x63\x76\x5f\x72\x74\x74\x5f\x65\x73\x74\0\x72\x63\x76\x71\x5f\x73\x70\
-\x61\x63\x65\0\x6d\x74\x75\x5f\x70\x72\x6f\x62\x65\0\x70\x6c\x62\x5f\x72\x65\
-\x68\x61\x73\x68\0\x6d\x74\x75\x5f\x69\x6e\x66\x6f\0\x69\x73\x5f\x6d\x70\x74\
-\x63\x70\0\x61\x66\x5f\x73\x70\x65\x63\x69\x66\x69\x63\0\x6d\x64\x35\x73\x69\
-\x67\x5f\x69\x6e\x66\x6f\0\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\x72\x65\x71\0\
-\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\x72\x73\x6b\0\x73\x61\x76\x65\x64\x5f\x73\
-\x79\x6e\0\x69\x6e\x65\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x73\
-\x6f\x63\x6b\0\x69\x63\x73\x6b\x5f\x69\x6e\x65\x74\0\x69\x63\x73\x6b\x5f\x61\
-\x63\x63\x65\x70\x74\x5f\x71\x75\x65\x75\x65\0\x69\x63\x73\x6b\x5f\x62\x69\x6e\
-\x64\x5f\x68\x61\x73\x68\0\x69\x63\x73\x6b\x5f\x62\x69\x6e\x64\x32\x5f\x68\x61\
-\x73\x68\0\x69\x63\x73\x6b\x5f\x74\x69\x6d\x65\x6f\x75\x74\0\x69\x63\x73\x6b\
-\x5f\x72\x65\x74\x72\x61\x6e\x73\x6d\x69\x74\x5f\x74\x69\x6d\x65\x72\0\x69\x63\
-\x73\x6b\x5f\x64\x65\x6c\x61\x63\x6b\x5f\x74\x69\x6d\x65\x72\0\x69\x63\x73\x6b\
-\x5f\x72\x74\x6f\0\x69\x63\x73\x6b\x5f\x72\x74\x6f\x5f\x6d\x69\x6e\0\x69\x63\
-\x73\x6b\x5f\x64\x65\x6c\x61\x63\x6b\x5f\x6d\x61\x78\0\x69\x63\x73\x6b\x5f\x70\
-\x6d\x74\x75\x5f\x63\x6f\x6f\x6b\x69\x65\0\x69\x63\x73\x6b\x5f\x63\x61\x5f\x6f\
-\x70\x73\0\x69\x63\x73\x6b\x5f\x61\x66\x5f\x6f\x70\x73\0\x69\x63\x73\x6b\x5f\
-\x75\x6c\x70\x5f\x6f\x70\x73\0\x69\x63\x73\x6b\x5f\x75\x6c\x70\x5f\x64\x61\x74\
-\x61\0\x69\x63\x73\x6b\x5f\x63\x6c\x65\x61\x6e\x5f\x61\x63\x6b\x65\x64\0\x69\
-\x63\x73\x6b\x5f\x73\x79\x6e\x63\x5f\x6d\x73\x73\0\x69\x63\x73\x6b\x5f\x63\x61\
-\x5f\x73\x74\x61\x74\x65\0\x69\x63\x73\x6b\x5f\x63\x61\x5f\x69\x6e\x69\x74\x69\
-\x61\x6c\x69\x7a\x65\x64\0\x69\x63\x73\x6b\x5f\x63\x61\x5f\x73\x65\x74\x73\x6f\
-\x63\x6b\x6f\x70\x74\0\x69\x63\x73\x6b\x5f\x63\x61\x5f\x64\x73\x74\x5f\x6c\x6f\
-\x63\x6b\x65\x64\0\x69\x63\x73\x6b\x5f\x72\x65\x74\x72\x61\x6e\x73\x6d\x69\x74\
-\x73\0\x69\x63\x73\x6b\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x69\x63\x73\x6b\x5f\
-\x62\x61\x63\x6b\x6f\x66\x66\0\x69\x63\x73\x6b\x5f\x73\x79\x6e\x5f\x72\x65\x74\
-\x72\x69\x65\x73\0\x69\x63\x73\x6b\x5f\x70\x72\x6f\x62\x65\x73\x5f\x6f\x75\x74\
-\0\x69\x63\x73\x6b\x5f\x65\x78\x74\x5f\x68\x64\x72\x5f\x6c\x65\x6e\0\x69\x63\
-\x73\x6b\x5f\x61\x63\x6b\0\x69\x63\x73\x6b\x5f\x6d\x74\x75\x70\0\x69\x63\x73\
-\x6b\x5f\x70\x72\x6f\x62\x65\x73\x5f\x74\x73\x74\x61\x6d\x70\0\x69\x63\x73\x6b\
-\x5f\x75\x73\x65\x72\x5f\x74\x69\x6d\x65\x6f\x75\x74\0\x69\x63\x73\x6b\x5f\x63\
-\x61\x5f\x70\x72\x69\x76\0\x69\x6e\x65\x74\x5f\x73\x6f\x63\x6b\0\x70\x69\x6e\
-\x65\x74\x36\0\x69\x6e\x65\x74\x5f\x73\x61\x64\x64\x72\0\x75\x63\x5f\x74\x74\
-\x6c\0\x63\x6d\x73\x67\x5f\x66\x6c\x61\x67\x73\0\x69\x6e\x65\x74\x5f\x6f\x70\
-\x74\0\x69\x6e\x65\x74\x5f\x73\x70\x6f\x72\x74\0\x69\x6e\x65\x74\x5f\x69\x64\0\
-\x74\x6f\x73\0\x6d\x69\x6e\x5f\x74\x74\x6c\0\x6d\x63\x5f\x74\x74\x6c\0\x70\x6d\
-\x74\x75\x64\x69\x73\x63\0\x72\x65\x63\x76\x65\x72\x72\0\x69\x73\x5f\x69\x63\
-\x73\x6b\0\x66\x72\x65\x65\x62\x69\x6e\x64\0\x68\x64\x72\x69\x6e\x63\x6c\0\x6d\
-\x63\x5f\x6c\x6f\x6f\x70\0\x74\x72\x61\x6e\x73\x70\x61\x72\x65\x6e\x74\0\x6d\
-\x63\x5f\x61\x6c\x6c\0\x6e\x6f\x64\x65\x66\x72\x61\x67\0\x62\x69\x6e\x64\x5f\
-\x61\x64\x64\x72\x65\x73\x73\x5f\x6e\x6f\x5f\x70\x6f\x72\x74\0\x72\x65\x63\x76\
-\x65\x72\x72\x5f\x72\x66\x63\x34\x38\x38\x34\0\x64\x65\x66\x65\x72\x5f\x63\x6f\
-\x6e\x6e\x65\x63\x74\0\x72\x63\x76\x5f\x74\x6f\x73\0\x63\x6f\x6e\x76\x65\x72\
-\x74\x5f\x63\x73\x75\x6d\0\x75\x63\x5f\x69\x6e\x64\x65\x78\0\x6d\x63\x5f\x69\
-\x6e\x64\x65\x78\0\x6d\x63\x5f\x61\x64\x64\x72\0\x6d\x63\x5f\x6c\x69\x73\x74\0\
-\x63\x6f\x72\x6b\0\x5f\x5f\x73\x31\x36\0\x73\x68\x6f\x72\x74\0\x69\x6e\x65\x74\
-\x5f\x63\x6f\x72\x6b\x5f\x66\x75\x6c\x6c\0\x62\x61\x73\x65\0\x66\x6c\0\x69\x6e\
-\x65\x74\x5f\x63\x6f\x72\x6b\0\x61\x64\x64\x72\0\x66\x72\x61\x67\x73\x69\x7a\
-\x65\0\x6c\x65\x6e\x67\x74\x68\0\x64\x73\x74\0\x74\x78\x5f\x66\x6c\x61\x67\x73\
-\0\x74\x74\x6c\0\x67\x73\x6f\x5f\x73\x69\x7a\x65\0\x74\x72\x61\x6e\x73\x6d\x69\
-\x74\x5f\x74\x69\x6d\x65\0\x66\x6c\x6f\x77\x69\0\x75\0\x5f\x5f\x66\x6c\x5f\x63\
-\x6f\x6d\x6d\x6f\x6e\0\x69\x70\x34\0\x69\x70\x36\0\x66\x6c\x6f\x77\x69\x5f\x63\
-\x6f\x6d\x6d\x6f\x6e\0\x66\x6c\x6f\x77\x69\x63\x5f\x6f\x69\x66\0\x66\x6c\x6f\
-\x77\x69\x63\x5f\x69\x69\x66\0\x66\x6c\x6f\x77\x69\x63\x5f\x6c\x33\x6d\x64\x65\
-\x76\0\x66\x6c\x6f\x77\x69\x63\x5f\x6d\x61\x72\x6b\0\x66\x6c\x6f\x77\x69\x63\
-\x5f\x74\x6f\x73\0\x66\x6c\x6f\x77\x69\x63\x5f\x73\x63\x6f\x70\x65\0\x66\x6c\
-\x6f\x77\x69\x63\x5f\x70\x72\x6f\x74\x6f\0\x66\x6c\x6f\x77\x69\x63\x5f\x66\x6c\
-\x61\x67\x73\0\x66\x6c\x6f\x77\x69\x63\x5f\x73\x65\x63\x69\x64\0\x66\x6c\x6f\
-\x77\x69\x63\x5f\x75\x69\x64\0\x66\x6c\x6f\x77\x69\x63\x5f\x74\x75\x6e\x5f\x6b\
-\x65\x79\0\x66\x6c\x6f\x77\x69\x63\x5f\x6d\x75\x6c\x74\x69\x70\x61\x74\x68\x5f\
-\x68\x61\x73\x68\0\x66\x6c\x6f\x77\x69\x5f\x74\x75\x6e\x6e\x65\x6c\0\x74\x75\
-\x6e\x5f\x69\x64\0\x5f\x5f\x62\x65\x36\x34\0\x66\x6c\x6f\x77\x69\x34\0\x75\x6c\
-\x69\0\x66\x6c\x6f\x77\x69\x5f\x75\x6c\x69\0\x70\x6f\x72\x74\x73\0\x69\x63\x6d\
-\x70\x74\0\x67\x72\x65\x5f\x6b\x65\x79\0\x6d\x68\x74\0\x63\x6f\x64\x65\0\x66\
-\x6c\x6f\x77\x69\x36\0\x66\x6c\x6f\x77\x6c\x61\x62\x65\x6c\0\x6d\x70\x5f\x68\
-\x61\x73\x68\0\x72\x65\x71\x75\x65\x73\x74\x5f\x73\x6f\x63\x6b\x5f\x71\x75\x65\
-\x75\x65\0\x72\x73\x6b\x71\x5f\x6c\x6f\x63\x6b\0\x72\x73\x6b\x71\x5f\x64\x65\
-\x66\x65\x72\x5f\x61\x63\x63\x65\x70\x74\0\x73\x79\x6e\x66\x6c\x6f\x6f\x64\x5f\
-\x77\x61\x72\x6e\x65\x64\0\x79\x6f\x75\x6e\x67\0\x72\x73\x6b\x71\x5f\x61\x63\
-\x63\x65\x70\x74\x5f\x68\x65\x61\x64\0\x72\x73\x6b\x71\x5f\x61\x63\x63\x65\x70\
-\x74\x5f\x74\x61\x69\x6c\0\x66\x61\x73\x74\x6f\x70\x65\x6e\x71\0\x66\x61\x73\
-\x74\x6f\x70\x65\x6e\x5f\x71\x75\x65\x75\x65\0\x72\x73\x6b\x71\x5f\x72\x73\x74\
-\x5f\x68\x65\x61\x64\0\x72\x73\x6b\x71\x5f\x72\x73\x74\x5f\x74\x61\x69\x6c\0\
-\x6d\x61\x78\x5f\x71\x6c\x65\x6e\0\x71\x75\x69\x63\x6b\0\x70\x69\x6e\x67\x70\
-\x6f\x6e\x67\0\x72\x65\x74\x72\x79\0\x61\x74\x6f\0\x6c\x72\x63\x76\x74\x69\x6d\
-\x65\0\x6c\x61\x73\x74\x5f\x73\x65\x67\x5f\x73\x69\x7a\x65\0\x72\x63\x76\x5f\
-\x6d\x73\x73\0\x73\x65\x61\x72\x63\x68\x5f\x68\x69\x67\x68\0\x73\x65\x61\x72\
-\x63\x68\x5f\x6c\x6f\x77\0\x70\x72\x6f\x62\x65\x5f\x73\x69\x7a\x65\0\x65\x6e\
-\x61\x62\x6c\x65\x64\0\x70\x72\x6f\x62\x65\x5f\x74\x69\x6d\x65\x73\x74\x61\x6d\
-\x70\0\x74\x63\x70\x5f\x72\x61\x63\x6b\0\x6d\x73\x74\x61\x6d\x70\0\x72\x74\x74\
-\x5f\x75\x73\0\x6c\x61\x73\x74\x5f\x64\x65\x6c\x69\x76\x65\x72\x65\x64\0\x72\
-\x65\x6f\x5f\x77\x6e\x64\x5f\x73\x74\x65\x70\x73\0\x72\x65\x6f\x5f\x77\x6e\x64\
-\x5f\x70\x65\x72\x73\x69\x73\x74\0\x64\x73\x61\x63\x6b\x5f\x73\x65\x65\x6e\0\
-\x61\x64\x76\x61\x6e\x63\x65\x64\0\x6d\x69\x6e\x6d\x61\x78\0\x73\0\x6d\x69\x6e\
-\x6d\x61\x78\x5f\x73\x61\x6d\x70\x6c\x65\0\x74\0\x74\x63\x70\x5f\x6f\x70\x74\
-\x69\x6f\x6e\x73\x5f\x72\x65\x63\x65\x69\x76\x65\x64\0\x74\x73\x5f\x72\x65\x63\
-\x65\x6e\x74\x5f\x73\x74\x61\x6d\x70\0\x74\x73\x5f\x72\x65\x63\x65\x6e\x74\0\
-\x72\x63\x76\x5f\x74\x73\x76\x61\x6c\0\x72\x63\x76\x5f\x74\x73\x65\x63\x72\0\
-\x73\x61\x77\x5f\x74\x73\x74\x61\x6d\x70\0\x74\x73\x74\x61\x6d\x70\x5f\x6f\x6b\
-\0\x64\x73\x61\x63\x6b\0\x77\x73\x63\x61\x6c\x65\x5f\x6f\x6b\0\x73\x61\x63\x6b\
-\x5f\x6f\x6b\0\x73\x6d\x63\x5f\x6f\x6b\0\x73\x6e\x64\x5f\x77\x73\x63\x61\x6c\
-\x65\0\x72\x63\x76\x5f\x77\x73\x63\x61\x6c\x65\0\x73\x61\x77\x5f\x75\x6e\x6b\
-\x6e\x6f\x77\x6e\0\x6e\x75\x6d\x5f\x73\x61\x63\x6b\x73\0\x75\x73\x65\x72\x5f\
-\x6d\x73\x73\0\x6d\x73\x73\x5f\x63\x6c\x61\x6d\x70\0\x68\x72\x74\x69\x6d\x65\
-\x72\0\x6e\x6f\x64\x65\0\x5f\x73\x6f\x66\x74\x65\x78\x70\x69\x72\x65\x73\0\x69\
-\x73\x5f\x72\x65\x6c\0\x69\x73\x5f\x73\x6f\x66\x74\0\x69\x73\x5f\x68\x61\x72\
-\x64\0\x74\x69\x6d\x65\x72\x71\x75\x65\x75\x65\x5f\x6e\x6f\x64\x65\0\x68\x72\
-\x74\x69\x6d\x65\x72\x5f\x72\x65\x73\x74\x61\x72\x74\0\x48\x52\x54\x49\x4d\x45\
-\x52\x5f\x4e\x4f\x52\x45\x53\x54\x41\x52\x54\0\x48\x52\x54\x49\x4d\x45\x52\x5f\
-\x52\x45\x53\x54\x41\x52\x54\0\x74\x63\x70\x5f\x73\x61\x63\x6b\x5f\x62\x6c\x6f\
-\x63\x6b\0\x73\x74\x61\x72\x74\x5f\x73\x65\x71\0\x74\x69\x6d\x65\0\x73\x70\x61\
-\x63\x65\0\x70\x72\x6f\x62\x65\x5f\x73\x65\x71\x5f\x73\x74\x61\x72\x74\0\x70\
-\x72\x6f\x62\x65\x5f\x73\x65\x71\x5f\x65\x6e\x64\0\x62\x70\x66\x5f\x70\x65\x72\
-\x66\x5f\x65\x76\x65\x6e\x74\x5f\x64\x61\x74\x61\0\x72\x65\x67\x73\0\x73\x61\
-\x6d\x70\x6c\x65\x5f\x70\x65\x72\x69\x6f\x64\0\x62\x70\x66\x5f\x75\x73\x65\x72\
-\x5f\x70\x74\x5f\x72\x65\x67\x73\x5f\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x74\x63\
-\x70\x72\x74\x74\x5f\x65\x76\x65\x6e\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x74\x63\
-\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\
-\x4c\x49\x43\x45\x4e\x53\x45\0\x7a\x65\x72\x6f\0\x68\x61\x6e\x64\x6c\x65\x5f\
-\x74\x63\x70\x72\x74\x74\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\
-\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x74\x63\x70\x72\x74\x74\x5f\x65\x76\x65\x6e\
-\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\0\x74\x63\x70\x5f\x6b\x70\x72\x6f\
-\x62\x65\x5f\x72\x65\x74\x72\x61\x6e\x73\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\
-\x5f\x5f\x66\x6d\x74\0\x74\x63\x70\x5f\x74\x6f\x70\x5f\x72\x69\x6e\x67\x62\x75\
-\x66\x66\x5f\x73\x65\x6e\x64\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x68\x61\x6e\x64\
-\x6c\x65\x5f\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\
-\x6f\x63\x65\x73\x73\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x62\x70\x66\x5f\x6c\x6f\
-\x63\x61\x6c\x5f\x73\x74\x6f\x72\x61\x67\x65\0\x63\x72\x65\x64\0\x64\x73\x74\
-\x5f\x65\x6e\x74\x72\x79\0\x68\x72\x74\x69\x6d\x65\x72\x5f\x63\x6c\x6f\x63\x6b\
-\x5f\x62\x61\x73\x65\0\x69\x6e\x65\x74\x5f\x62\x69\x6e\x64\x32\x5f\x62\x75\x63\
-\x6b\x65\x74\0\x69\x6e\x65\x74\x5f\x62\x69\x6e\x64\x5f\x62\x75\x63\x6b\x65\x74\
-\0\x69\x6e\x65\x74\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x69\x6f\x6e\x5f\x73\x6f\x63\
-\x6b\x5f\x61\x66\x5f\x6f\x70\x73\0\x69\x6e\x65\x74\x5f\x74\x69\x6d\x65\x77\x61\
-\x69\x74\x5f\x64\x65\x61\x74\x68\x5f\x72\x6f\x77\0\x69\x70\x5f\x6d\x63\x5f\x73\
-\x6f\x63\x6b\x6c\x69\x73\x74\0\x69\x70\x5f\x6f\x70\x74\x69\x6f\x6e\x73\x5f\x72\
-\x63\x75\0\x69\x70\x76\x36\x5f\x70\x69\x6e\x66\x6f\0\x6c\x6f\x63\x6b\x5f\x63\
-\x6c\x61\x73\x73\x5f\x6b\x65\x79\0\x6c\x6f\x63\x6b\x64\x65\x70\x5f\x73\x75\x62\
-\x63\x6c\x61\x73\x73\x5f\x6b\x65\x79\0\x6d\x65\x6d\x5f\x63\x67\x72\x6f\x75\x70\
-\0\x6e\x65\x74\x5f\x64\x65\x76\x69\x63\x65\0\x70\x69\x64\0\x72\x65\x71\x75\x65\
-\x73\x74\x5f\x73\x6f\x63\x6b\0\x73\x6b\x62\x5f\x65\x78\x74\0\x73\x6f\x63\x6b\
-\x5f\x72\x65\x75\x73\x65\x70\x6f\x72\x74\0\x73\x6f\x63\x6b\x65\x74\0\x73\x6f\
-\x63\x6b\x65\x74\x5f\x77\x71\0\x74\x63\x70\x5f\x63\x6f\x6e\x67\x65\x73\x74\x69\
-\x6f\x6e\x5f\x6f\x70\x73\0\x74\x63\x70\x5f\x66\x61\x73\x74\x6f\x70\x65\x6e\x5f\
-\x63\x6f\x6e\x74\x65\x78\x74\0\x74\x63\x70\x5f\x66\x61\x73\x74\x6f\x70\x65\x6e\
-\x5f\x72\x65\x71\x75\x65\x73\x74\0\x74\x63\x70\x5f\x6d\x64\x35\x73\x69\x67\x5f\
-\x69\x6e\x66\x6f\0\x74\x63\x70\x5f\x73\x6f\x63\x6b\x5f\x61\x66\x5f\x6f\x70\x73\
-\0\x74\x63\x70\x5f\x75\x6c\x70\x5f\x6f\x70\x73\0\x78\x66\x72\x6d\x5f\x73\x65\
-\x63\x5f\x63\x74\x78\0\x2f\x68\x6f\x6d\x65\x2f\x6e\x65\x30\x2f\x73\x79\x73\x5f\
-\x63\x6f\x6d\x70\x65\x74\x69\x74\x69\x6f\x6e\x2f\x73\x74\x61\x72\x74\x2f\x63\
-\x70\x75\x5f\x77\x61\x74\x63\x68\x65\x72\x2f\x62\x70\x66\x2f\x6e\x65\x74\x5f\
-\x73\x74\x61\x74\x73\x2e\x62\x70\x66\x2e\x63\0\x20\x20\x20\x20\x73\x74\x72\x75\
-\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\x73\x6b\x20\x3d\x20\x28\x73\x74\x72\x75\
-\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\x29\x63\x74\x78\x2d\x3e\x73\x6b\x61\x64\
-\x64\x72\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x73\x6b\x29\0\x20\x20\x20\x20\
-\x75\x33\x32\x20\x70\x69\x64\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\
-\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\x5f\x74\x67\x69\x64\x28\x29\x20\x26\
-\x20\x30\x78\x46\x46\x46\x46\x46\x46\x46\x46\x3b\x20\0\x20\x20\x20\x20\x69\x66\
-\x28\x70\x69\x64\x20\x3d\x3d\x20\x66\x69\x6c\x69\x74\x65\x72\x5f\x69\x64\x29\0\
-\x20\x20\x20\x20\x75\x36\x34\x20\x6e\x6f\x77\x20\x3d\x20\x62\x70\x66\x5f\x6b\
-\x74\x69\x6d\x65\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\x3b\0\x20\x20\x20\x20\x69\
-\x66\x20\x28\x73\x6b\x62\x29\x20\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\
-\x28\x26\x74\x63\x62\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x74\x63\x62\x29\x2c\
-\x20\x73\x6b\x62\x2d\x3e\x63\x62\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\
-\x65\x71\x20\x3d\x20\x74\x63\x62\x2e\x73\x65\x71\x3b\0\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\
-\x28\x26\x66\x61\x6d\x69\x6c\x79\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x66\x61\
-\x6d\x69\x6c\x79\x29\x2c\x20\x26\x73\x6b\x2d\x3e\x5f\x5f\x73\x6b\x5f\x63\x6f\
-\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x66\x61\x6d\x69\x6c\x79\x29\x3b\0\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\
-\x72\x6e\x65\x6c\x28\x26\x6c\x70\x6f\x72\x74\x2c\x20\x73\x69\x7a\x65\x6f\x66\
-\x28\x6c\x70\x6f\x72\x74\x29\x2c\x20\x26\x73\x6b\x2d\x3e\x5f\x5f\x73\x6b\x5f\
-\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x6e\x75\x6d\x29\x3b\0\x20\x20\x20\
-\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\
-\x6e\x65\x6c\x28\x26\x64\x70\x6f\x72\x74\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\
-\x64\x70\x6f\x72\x74\x29\x2c\x20\x26\x73\x6b\x2d\x3e\x5f\x5f\x73\x6b\x5f\x63\
-\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x64\x70\x6f\x72\x74\x29\x3b\0\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\
-\x72\x6e\x65\x6c\x28\x26\x73\x74\x61\x74\x65\x2c\x20\x73\x69\x7a\x65\x6f\x66\
-\x28\x73\x74\x61\x74\x65\x29\x2c\x20\x26\x73\x6b\x2d\x3e\x5f\x5f\x73\x6b\x5f\
-\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x73\x74\x61\x74\x65\x29\x3b\0\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\
-\x63\x6f\x6d\x6d\x28\x26\x63\x6f\x6d\x6d\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\
-\x63\x6f\x6d\x6d\x29\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x66\x61\x6d\x69\x6c\
-\x79\x20\x21\x3d\x20\x41\x46\x5f\x49\x4e\x45\x54\x20\x26\x26\x20\x66\x61\x6d\
-\x69\x6c\x79\x20\x21\x3d\x20\x41\x46\x5f\x49\x4e\x45\x54\x36\x29\0\x20\x20\x20\
-\x20\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\x5f\x72\x65\x73\x75\x62\x6d\x69\
-\x74\x20\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\
-\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x74\x63\x70\x72\x65\x74\x72\
-\x61\x6e\x73\x5f\x62\x75\x66\x66\x65\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\
-\x74\x72\x75\x63\x74\x20\x74\x63\x70\x5f\x72\x65\x73\x75\x62\x6d\x69\x74\x29\
-\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x62\x75\x66\x66\x29\x7b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\
-\x22\x74\x68\x65\x20\x74\x63\x70\x5f\x72\x65\x74\x72\x61\x6e\x73\x20\x62\x75\
-\x66\x66\x65\x72\x20\x69\x73\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\
-\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\
-\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\x5f\x72\x65\x73\x75\
-\x62\x6d\x69\x74\x29\x29\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x70\x69\
-\x64\x20\x3d\x20\x70\x69\x64\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x64\
-\x70\x6f\x72\x74\x20\x3d\x20\x64\x70\x6f\x72\x74\x3b\0\x20\x20\x20\x20\x62\x75\
-\x66\x66\x2d\x3e\x6c\x70\x6f\x72\x74\x20\x3d\x20\x6c\x70\x6f\x72\x74\x3b\0\x20\
-\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x73\x65\x71\x20\x3d\x20\x73\x65\x71\x3b\0\
-\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x73\x74\x61\x74\x65\x20\x3d\x20\x73\
-\x74\x61\x74\x65\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x6f\x63\x63\x75\
-\x72\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x74\
-\x79\x70\x65\x20\x3d\x20\x74\x79\x70\x65\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\
-\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x73\x74\x72\x28\x62\x75\x66\x66\
-\x2d\x3e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x63\x6f\x6d\x6d\x29\
-\x2c\x63\x6f\x6d\x6d\x29\x3b\0\x20\x20\x20\x20\x73\x77\x69\x74\x63\x68\x28\x66\
-\x61\x6d\x69\x6c\x79\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x75\x66\x66\x2d\x3e\x61\x66\x20\x3d\x20\x41\x46\x5f\x49\x4e\x45\x54\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\
-\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x28\x26\x64\x61\x64\
-\x64\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x64\x61\x64\x64\x72\x29\x2c\x26\x73\
-\x6b\x2d\x3e\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\
-\x64\x61\x64\x64\x72\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\
-\x65\x6c\x28\x26\x73\x61\x64\x64\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x61\
-\x64\x64\x72\x29\x2c\x26\x73\x6b\x2d\x3e\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\
-\x6f\x6e\x2e\x73\x6b\x63\x5f\x72\x63\x76\x5f\x73\x61\x64\x64\x72\x29\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x73\x72\
-\x63\x5f\x61\x64\x64\x72\x2e\x73\x61\x64\x64\x72\x5f\x76\x34\x20\x3d\x20\x73\
-\x61\x64\x64\x72\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\
-\x66\x66\x2d\x3e\x64\x73\x74\x5f\x61\x64\x64\x72\x2e\x64\x61\x64\x64\x72\x5f\
-\x76\x34\x20\x3d\x20\x64\x61\x64\x64\x72\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x61\x66\x20\x3d\x20\x41\x46\x5f\x49\
-\x4e\x45\x54\x36\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\
-\x28\x26\x62\x75\x66\x66\x2d\x3e\x73\x72\x63\x5f\x61\x64\x64\x72\x2e\x73\x61\
-\x64\x64\x72\x5f\x76\x36\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x62\x75\x66\x66\
-\x2d\x3e\x73\x72\x63\x5f\x61\x64\x64\x72\x2e\x73\x61\x64\x64\x72\x5f\x76\x36\
-\x29\x2c\x20\x26\x73\x6b\x2d\x3e\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\
-\x2e\x73\x6b\x63\x5f\x76\x36\x5f\x72\x63\x76\x5f\x73\x61\x64\x64\x72\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\
-\x62\x65\x5f\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x28\x26\x62\x75\x66\
-\x66\x2d\x3e\x64\x73\x74\x5f\x61\x64\x64\x72\x2e\x64\x61\x64\x64\x72\x5f\x76\
-\x36\x2c\x73\x69\x7a\x65\x6f\x66\x28\x62\x75\x66\x66\x2d\x3e\x64\x73\x74\x5f\
-\x61\x64\x64\x72\x2e\x64\x61\x64\x64\x72\x5f\x76\x36\x29\x2c\x26\x73\x6b\x2d\
-\x3e\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x76\x36\
-\x5f\x64\x61\x64\x64\x72\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x64\x69\x73\x63\x61\x72\
-\x64\x28\x62\x75\x66\x66\x2c\x20\x30\x29\x3b\0\x20\x20\x20\x20\x72\x65\x74\x75\
-\x72\x6e\x20\x74\x63\x70\x5f\x6b\x70\x72\x6f\x62\x65\x5f\x72\x65\x74\x72\x61\
-\x6e\x73\x5f\x65\x76\x65\x6e\x74\x28\x73\x6b\x2c\x73\x6b\x62\x2c\x52\x45\x54\
-\x52\x41\x4e\x53\x4d\x49\x54\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\
-\x52\x4f\x42\x45\x28\x74\x6f\x70\x5f\x74\x63\x70\x5f\x73\x65\x6e\x64\x5f\x65\
-\x6e\x74\x72\x79\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\
-\x73\x6b\x29\x7b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\
-\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x6f\x70\x5f\x73\x6f\x63\x6b\x5f\
-\x73\x74\x6f\x72\x65\x2c\x26\x70\x69\x64\x2c\x26\x73\x6b\x2c\x42\x50\x46\x5f\
-\x41\x4e\x59\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x52\x45\x54\x50\x52\
-\x4f\x42\x45\x28\x74\x6f\x70\x5f\x74\x63\x70\x5f\x73\x65\x6e\x64\x5f\x72\x65\
-\x74\x2c\x20\x69\x6e\x74\x20\x72\x65\x74\x29\x7b\0\x20\x20\x20\x20\x73\x74\x72\
-\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\x2a\x73\x6f\x63\x6b\x70\x70\x20\x3d\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\
-\x6d\x28\x26\x74\x6f\x70\x5f\x73\x6f\x63\x6b\x5f\x73\x74\x6f\x72\x65\x2c\x20\
-\x26\x70\x69\x64\x29\x3b\0\x20\x20\x20\x20\x69\x66\x20\x28\x21\x73\x6f\x63\x6b\
-\x70\x70\x29\0\x20\x20\x20\x20\x69\x66\x20\x28\x72\x65\x74\x20\x3e\x20\x30\x29\
-\x20\x7b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\
-\x73\x6b\x20\x3d\x20\x2a\x73\x6f\x63\x6b\x70\x70\x3b\0\x20\x20\x20\x20\x75\x31\
-\x36\x20\x66\x61\x6d\x69\x6c\x79\x20\x3d\x20\x30\x2c\x20\x64\x70\x6f\x72\x74\
-\x20\x3d\x20\x30\x3b\0\x20\x20\x20\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\
-\x45\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\x66\x61\x6d\x69\x6c\x79\x2c\x73\x6b\
-\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x66\x61\
-\x6d\x69\x6c\x79\x29\x3b\0\x20\x20\x20\x20\x69\x66\x20\x28\x66\x61\x6d\x69\x6c\
-\x79\x20\x3d\x3d\x20\x41\x46\x5f\x49\x4e\x45\x54\x29\x7b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x26\x6b\x65\x79\x2c\x30\x2c\x73\x69\
-\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x69\x70\x76\x34\x5f\x6b\x65\
-\x79\x5f\x74\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x6b\x65\x79\x2e\x70\
-\x69\x64\x20\x3d\x20\x70\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\
-\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x63\x6f\x6d\x6d\x28\
-\x26\x6b\x65\x79\x2e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x6b\x65\
-\x79\x2e\x63\x6f\x6d\x6d\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x42\x50\
-\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\x6b\
-\x65\x79\x2e\x73\x61\x64\x64\x72\x2c\x73\x6b\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\
-\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x72\x63\x76\x5f\x73\x61\x64\x64\x72\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\
-\x45\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\x6b\x65\x79\x2e\x64\x61\x64\x64\x72\
-\x2c\x73\x6b\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\
-\x5f\x64\x61\x64\x64\x72\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x42\x50\x46\
-\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\x6b\x65\
-\x79\x2e\x6c\x70\x6f\x72\x74\x2c\x73\x6b\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\
-\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x6e\x75\x6d\x29\x3b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x5f\x49\x4e\x54\
-\x4f\x28\x26\x64\x70\x6f\x72\x74\x2c\x73\x6b\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\
-\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x64\x70\x6f\x72\x74\x29\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x6b\x65\x79\x2e\x64\x70\x6f\x72\x74\x20\x3d\x20\x62\x70\
-\x66\x5f\x6e\x74\x6f\x68\x73\x28\x64\x70\x6f\x72\x74\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x72\x65\x63\x76\x5f\x73\x65\x6e\
-\x64\x5f\x62\x79\x74\x65\x73\x20\x2a\x62\x79\x20\x3d\x20\x62\x70\x66\x5f\x6d\
-\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x69\x70\x76\
-\x34\x5f\x74\x6f\x70\x5f\x6d\x61\x70\x2c\x26\x6b\x65\x79\x29\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x69\x66\x28\x21\x62\x79\x29\x7b\0\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x72\x65\x63\x76\x5f\x73\
-\x65\x6e\x64\x5f\x62\x79\x74\x65\x73\x20\x69\x6e\x69\x74\x20\x3d\x20\x7b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\
-\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x69\x70\x76\x34\x5f\x74\
-\x6f\x70\x5f\x6d\x61\x70\x2c\x26\x6b\x65\x79\x2c\x26\x69\x6e\x69\x74\x2c\x42\
-\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x28\x6e\x6f\x77\
-\x20\x2d\x20\x62\x79\x74\x65\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x6f\x75\x74\x70\
-\x75\x74\x29\x20\x3c\x20\x31\x30\x30\x30\x20\x2a\x20\x4d\x53\x45\x43\x29\0\x20\
-\x20\x20\x20\x75\x36\x34\x20\x72\x65\x63\x76\x20\x3d\x20\x62\x79\x74\x65\x73\
-\x2d\x3e\x72\x65\x63\x76\x3b\0\x20\x20\x20\x20\x75\x36\x34\x20\x73\x65\x6e\x64\
-\x20\x3d\x20\x62\x79\x74\x65\x73\x2d\x3e\x73\x65\x6e\x64\x3b\0\x20\x20\x20\x20\
-\x69\x66\x28\x73\x65\x6e\x64\x20\x3c\x20\x74\x63\x70\x74\x6f\x70\x5f\x73\x65\
-\x6e\x64\x5f\x74\x68\x72\x65\x68\x6f\x6c\x64\x20\x26\x26\x20\x72\x65\x63\x76\
-\x20\x3c\x20\x74\x63\x70\x74\x6f\x70\x5f\x72\x65\x63\x76\x5f\x74\x68\x72\x65\
-\x68\x6f\x6c\x64\x29\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\
-\x5f\x74\x6f\x70\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x20\x2a\x62\x75\x66\
-\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\
-\x65\x72\x76\x65\x28\x26\x74\x63\x70\x74\x6f\x70\x5f\x62\x75\x66\x66\x65\x72\
-\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\x5f\
-\x74\x6f\x70\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x29\x2c\x30\x29\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x26\x6b\x65\x79\x2c\
-\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x69\x70\x76\
-\x36\x5f\x6b\x65\x79\x5f\x74\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x42\
-\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\
-\x6b\x65\x79\x2e\x73\x61\x64\x64\x72\x2c\x73\x6b\x2c\x5f\x5f\x73\x6b\x5f\x63\
-\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x76\x36\x5f\x72\x63\x76\x5f\x73\x61\
-\x64\x64\x72\x2e\x69\x6e\x36\x5f\x75\x2e\x75\x36\x5f\x61\x64\x64\x72\x33\x32\
-\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\
-\x52\x45\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\x6b\x65\x79\x2e\x64\x61\x64\x64\
-\x72\x2c\x73\x6b\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\
-\x63\x5f\x76\x36\x5f\x64\x61\x64\x64\x72\x2e\x69\x6e\x36\x5f\x75\x2e\x75\x36\
-\x5f\x61\x64\x64\x72\x33\x32\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\
-\x72\x75\x63\x74\x20\x72\x65\x63\x76\x5f\x73\x65\x6e\x64\x5f\x62\x79\x74\x65\
-\x73\x20\x2a\x62\x79\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\
-\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x69\x70\x76\x36\x5f\x74\x6f\x70\x5f\
-\x6d\x61\x70\x2c\x26\x6b\x65\x79\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x69\x70\x76\x36\x5f\x74\x6f\x70\x5f\x6d\x61\x70\x2c\x26\
-\x6b\x65\x79\x2c\x26\x69\x6e\x69\x74\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x79\x2d\x3e\x73\x65\x6e\
-\x64\x20\x2b\x3d\x20\x73\x69\x7a\x65\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\
-\x6c\x65\x6d\x28\x26\x69\x70\x76\x34\x5f\x74\x6f\x70\x5f\x6d\x61\x70\x2c\x26\
-\x6b\x65\x79\x2c\x62\x79\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\
-\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x69\x70\x76\x36\x5f\x74\x6f\x70\
-\x5f\x6d\x61\x70\x2c\x26\x6b\x65\x79\x2c\x62\x79\x2c\x42\x50\x46\x5f\x41\x4e\
-\x59\x29\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x72\x65\x63\x76\x20\x3d\
-\x20\x72\x65\x63\x76\x3b\0\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x73\x65\x6e\
-\x64\x20\x3d\x20\x73\x65\x6e\x64\x3b\0\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\
-\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\
-\x63\x74\x20\x74\x63\x70\x5f\x74\x6f\x70\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\
-\x61\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\
-\x62\x65\x5f\x72\x65\x61\x64\x5f\x73\x74\x72\x28\x62\x75\x66\x66\x2d\x3e\x63\
-\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x62\x75\x66\x66\x2d\x3e\x63\x6f\
-\x6d\x6d\x29\x2c\x69\x70\x34\x2d\x3e\x63\x6f\x6d\x6d\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x61\x66\x20\x3d\x20\x41\x46\x5f\x49\
-\x4e\x45\x54\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x70\
-\x69\x64\x20\x3d\x20\x69\x70\x34\x2d\x3e\x70\x69\x64\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x64\x70\x6f\x72\x74\x20\x3d\x20\x69\x70\
-\x34\x2d\x3e\x64\x70\x6f\x72\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\
-\x66\x66\x2d\x3e\x6c\x70\x6f\x72\x74\x20\x3d\x20\x69\x70\x34\x2d\x3e\x6c\x70\
-\x6f\x72\x74\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x64\
-\x73\x74\x5f\x61\x64\x64\x72\x2e\x64\x61\x64\x64\x72\x5f\x76\x34\x20\x3d\x20\
-\x69\x70\x34\x2d\x3e\x64\x61\x64\x64\x72\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x75\x66\x66\x2d\x3e\x73\x72\x63\x5f\x61\x64\x64\x72\x2e\x73\x61\x64\x64\
-\x72\x5f\x76\x34\x20\x3d\x20\x69\x70\x34\x2d\x3e\x73\x61\x64\x64\x72\x3b\0\x20\
-\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\
-\x73\x75\x62\x6d\x69\x74\x28\x62\x75\x66\x66\x2c\x30\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x79\x74\x65\x73\x2d\x3e\x6c\x61\x73\x74\x5f\x6f\x75\x74\
-\x70\x75\x74\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\
-\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\
-\x26\x69\x70\x76\x34\x5f\x74\x6f\x70\x5f\x6d\x61\x70\x2c\x69\x70\x34\x2c\x62\
-\x79\x74\x65\x73\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\x20\x20\x20\x20\x20\
-\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x5f\x73\
-\x74\x72\x28\x62\x75\x66\x66\x2d\x3e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\
-\x66\x28\x62\x75\x66\x66\x2d\x3e\x63\x6f\x6d\x6d\x29\x2c\x69\x70\x36\x2d\x3e\
-\x63\x6f\x6d\x6d\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\
-\x3e\x61\x66\x20\x3d\x20\x41\x46\x5f\x49\x4e\x45\x54\x36\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x70\x69\x64\x20\x3d\x20\x69\x70\x36\
-\x2d\x3e\x70\x69\x64\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\
-\x3e\x64\x70\x6f\x72\x74\x20\x3d\x20\x69\x70\x36\x2d\x3e\x64\x70\x6f\x72\x74\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\x2d\x3e\x6c\x70\x6f\x72\
-\x74\x20\x3d\x20\x69\x70\x36\x2d\x3e\x6c\x70\x6f\x72\x74\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x28\
-\x26\x62\x75\x66\x66\x2d\x3e\x64\x73\x74\x5f\x61\x64\x64\x72\x2e\x64\x61\x64\
-\x64\x72\x5f\x76\x36\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x62\x75\x66\x66\x2d\
-\x3e\x64\x73\x74\x5f\x61\x64\x64\x72\x2e\x64\x61\x64\x64\x72\x5f\x76\x36\x29\
-\x2c\x20\x26\x69\x70\x36\x2d\x3e\x64\x61\x64\x64\x72\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\x64\x28\
-\x26\x62\x75\x66\x66\x2d\x3e\x73\x72\x63\x5f\x61\x64\x64\x72\x2e\x73\x61\x64\
-\x64\x72\x5f\x76\x36\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x62\x75\x66\x66\x2d\
-\x3e\x73\x72\x63\x5f\x61\x64\x64\x72\x2e\x73\x61\x64\x64\x72\x5f\x76\x36\x29\
-\x2c\x20\x26\x69\x70\x36\x2d\x3e\x73\x61\x64\x64\x72\x29\x3b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\
-\x65\x6c\x65\x6d\x28\x26\x69\x70\x76\x36\x5f\x74\x6f\x70\x5f\x6d\x61\x70\x2c\
-\x69\x70\x36\x2c\x62\x79\x74\x65\x73\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\x3b\0\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x64\x65\x6c\x65\x74\x65\x5f\
-\x65\x6c\x65\x6d\x28\x26\x74\x6f\x70\x5f\x73\x6f\x63\x6b\x5f\x73\x74\x6f\x72\
-\x65\x2c\x20\x26\x70\x69\x64\x29\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\
-\x52\x4f\x42\x45\x28\x74\x6f\x70\x5f\x74\x63\x70\x5f\x72\x65\x63\x76\x5f\x65\
-\x6e\x74\x72\x79\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\
-\x73\x6b\x2c\x20\x69\x6e\x74\x20\x63\x6f\x70\x69\x65\x64\x29\x7b\0\x20\x20\x20\
-\x20\x69\x66\x20\x28\x63\x6f\x70\x69\x65\x64\x20\x3c\x3d\x20\x30\x29\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x62\x79\x2d\x3e\x72\x65\x63\x76\x20\
-\x2b\x3d\x20\x63\x6f\x70\x69\x65\x64\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\
-\x50\x52\x4f\x42\x45\x28\x74\x63\x70\x5f\x76\x34\x5f\x63\x6f\x6e\x6e\x65\x63\
-\x74\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\x73\x6b\x29\0\
-\x20\x20\x20\x20\x75\x36\x34\x20\x70\x69\x64\x5f\x74\x67\x69\x64\x20\x3d\x20\
-\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x70\x69\x64\
-\x5f\x74\x67\x69\x64\x28\x29\x3b\0\x20\x20\x20\x20\x75\x33\x32\x20\x74\x67\x69\
-\x64\x20\x3d\x20\x70\x69\x64\x5f\x74\x67\x69\x64\x20\x3e\x3e\x20\x33\x32\x3b\
-\x20\0\x20\x20\x20\x20\x69\x66\x28\x74\x67\x69\x64\x20\x3d\x3d\x20\x30\x29\0\
-\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x70\x75\x62\
-\x6c\x69\x63\x5f\x69\x6e\x66\x6f\x20\x69\x6e\x66\x6f\x20\x3d\x20\x7b\0\x20\x20\
-\x20\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x63\x75\x72\x72\x65\x6e\x74\x5f\x63\
-\x6f\x6d\x6d\x28\x26\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\
-\x6f\x66\x28\x69\x6e\x66\x6f\x2e\x63\x6f\x6d\x6d\x29\x29\x3b\0\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\x5f\x65\x6c\x65\x6d\
-\x28\x26\x6e\x65\x74\x5f\x6c\x61\x74\x65\x6e\x63\x79\x5f\x73\x74\x61\x72\x74\
-\x2c\x26\x73\x6b\x2c\x26\x69\x6e\x66\x6f\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\
-\x3b\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\x50\x52\x4f\x42\x45\x28\x74\x63\x70\
-\x5f\x76\x36\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x2c\x20\x73\x74\x72\x75\x63\x74\
-\x20\x73\x6f\x63\x6b\x20\x2a\x73\x6b\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x4b\
-\x50\x52\x4f\x42\x45\x28\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\
-\x5f\x70\x72\x6f\x63\x65\x73\x73\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x73\x6f\
-\x63\x6b\x20\x2a\x73\x6b\x29\0\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6e\x20\x68\
-\x61\x6e\x64\x6c\x65\x5f\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\
-\x5f\x70\x72\x6f\x63\x65\x73\x73\x28\x73\x6b\x29\x3b\0\x69\x6e\x74\x20\x42\x50\
-\x46\x5f\x50\x52\x4f\x47\x28\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\x76\
-\x34\x5f\x63\x6f\x6e\x6e\x65\x63\x74\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x73\
-\x6f\x63\x6b\x20\x2a\x73\x6b\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\
-\x47\x28\x66\x65\x6e\x74\x72\x79\x5f\x74\x63\x70\x5f\x76\x36\x5f\x63\x6f\x6e\
-\x6e\x65\x63\x74\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\
-\x73\x6b\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x66\x65\x6e\
-\x74\x72\x79\x5f\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\
-\x72\x6f\x63\x65\x73\x73\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\
-\x20\x2a\x73\x6b\x29\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x74\
-\x63\x70\x72\x74\x74\x2c\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\
-\x73\x6b\x29\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\x72\x74\
-\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x20\x2a\x64\x61\x74\x61\x20\x3d\
-\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\
-\x6d\x28\x26\x74\x63\x70\x72\x74\x74\x5f\x6d\x61\x70\x2c\x26\x7a\x65\x72\x6f\
-\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x64\x61\x74\x61\x29\x7b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\x28\x26\x69\x6e\x69\x74\x2c\
-\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\
-\x72\x74\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x29\x29\x3b\0\x20\x20\x20\
-\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\x61\x74\x65\
-\x5f\x65\x6c\x65\x6d\x28\x26\x74\x63\x70\x72\x74\x74\x5f\x6d\x61\x70\x2c\x26\
-\x7a\x65\x72\x6f\x2c\x26\x69\x6e\x69\x74\x2c\x42\x50\x46\x5f\x41\x4e\x59\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x64\x61\x74\x61\x20\x3d\x20\x62\x70\x66\
-\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x74\
-\x63\x70\x72\x74\x74\x5f\x6d\x61\x70\x2c\x26\x7a\x65\x72\x6f\x29\x3b\0\x20\x20\
-\x20\x20\x73\x72\x74\x74\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\
-\x45\x41\x44\x28\x74\x73\x2c\x20\x73\x72\x74\x74\x5f\x75\x73\x29\x20\x3e\x3e\
-\x20\x33\x3b\x20\x2f\x2f\x20\xe5\xb0\x86\x20\x73\x72\x74\x74\x20\xe4\xbb\x8e\
-\xe7\xba\xb3\xe7\xa7\x92\xe8\xbd\xac\xe6\x8d\xa2\xe4\xb8\xba\xe5\xbe\xae\xe7\
-\xa7\x92\0\x20\x20\x20\x20\x69\x66\x28\x73\x72\x74\x74\x20\x3c\x3d\x20\x30\x29\
-\0\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x72\x74\x74\x20\x3c\x20\
-\x35\x29\0\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x72\x74\x74\x20\
-\x3c\x20\x31\x37\x29\0\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\x28\x73\x72\
-\x74\x74\x20\x3c\x20\x33\x33\x29\0\x20\x20\x20\x20\x65\x6c\x73\x65\x20\x69\x66\
-\x28\x73\x72\x74\x74\x20\x3c\x20\x36\x35\x29\0\x20\x20\x20\x20\x65\x6c\x73\x65\
-\x20\x69\x66\x28\x73\x72\x74\x74\x20\x3c\x20\x31\x32\x39\x29\0\x20\x20\x20\x20\
-\x64\x61\x74\x61\x2d\x3e\x64\x61\x74\x61\x5b\x69\x6e\x64\x65\x78\x5d\x20\x2b\
-\x3d\x20\x31\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x75\x70\x64\
-\x61\x74\x65\x5f\x65\x6c\x65\x6d\x28\x26\x74\x63\x70\x72\x74\x74\x5f\x6d\x61\
-\x70\x2c\x26\x7a\x65\x72\x6f\x2c\x64\x61\x74\x61\x2c\x42\x50\x46\x5f\x41\x4e\
-\x59\x29\x3b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\x72\x74\
-\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x20\x2a\x73\x72\x63\x20\x3d\x20\
-\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\
-\x28\x26\x74\x63\x70\x72\x74\x74\x5f\x6d\x61\x70\x2c\x26\x7a\x65\x72\x6f\x29\
-\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x73\x72\x63\x29\x7b\0\x20\x20\x20\x20\
-\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x74\x68\x65\
-\x20\x74\x63\x70\x72\x74\x74\x20\x6d\x61\x70\x20\x69\x73\x20\x6e\x6f\x74\x20\
-\x69\x6e\x69\x74\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\
-\x20\x74\x63\x70\x72\x74\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x20\x2a\
-\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\
-\x72\x65\x73\x65\x72\x76\x65\x28\x26\x74\x63\x70\x72\x74\x74\x5f\x62\x75\x66\
-\x66\x65\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\
-\x63\x70\x72\x74\x74\x5f\x70\x65\x72\x66\x5f\x64\x61\x74\x61\x29\x2c\x30\x29\
-\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\
-\x28\x22\x74\x68\x65\x20\x74\x63\x70\x72\x74\x74\x20\x62\x75\x66\x66\x65\x72\
-\x20\x69\x73\x20\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x6d\x65\
-\x6d\x73\x65\x74\x28\x62\x75\x66\x66\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\
-\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\x72\x74\x74\x5f\x70\x65\x72\x66\x5f\
-\x64\x61\x74\x61\x29\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x62\x75\x66\x66\
-\x2d\x3e\x64\x61\x74\x61\x5b\x69\x5d\x20\x3d\x20\x73\x72\x63\x2d\x3e\x64\x61\
-\x74\x61\x5b\x69\x5d\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\
-\x75\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\x62\x75\x66\x66\x2c\x20\x30\x29\x3b\0\
-\x7d\0\x73\x74\x61\x74\x69\x63\x20\x69\x6e\x74\x20\x68\x61\x6e\x64\x6c\x65\x5f\
-\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\
-\x73\x73\x28\x73\x74\x72\x75\x63\x74\x20\x73\x6f\x63\x6b\x20\x2a\x73\x6b\x29\0\
-\x20\x20\x20\x20\x69\x66\x28\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\
-\x44\x28\x73\x6b\x2c\x20\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\
-\x6b\x63\x5f\x73\x74\x61\x74\x65\x29\x20\x21\x3d\x20\x54\x43\x50\x5f\x53\x59\
-\x4e\x5f\x53\x45\x4e\x54\x29\0\x20\x20\x20\x20\x69\x6e\x66\x6f\x20\x3d\x20\x62\
-\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\
-\x26\x6e\x65\x74\x5f\x6c\x61\x74\x65\x6e\x63\x79\x5f\x73\x74\x61\x72\x74\x2c\
-\x26\x73\x6b\x29\x3b\0\x20\x20\x20\x20\x69\x66\x28\x21\x69\x6e\x66\x6f\x29\0\
-\x20\x20\x20\x20\x6e\x6f\x77\x20\x3d\x20\x62\x70\x66\x5f\x6b\x74\x69\x6d\x65\
-\x5f\x67\x65\x74\x5f\x6e\x73\x28\x29\x3b\0\x20\x20\x20\x20\x64\x65\x6c\x74\x61\
-\x20\x3d\x20\x6e\x6f\x77\x20\x2d\x20\x69\x6e\x66\x6f\x2d\x3e\x74\x69\x6d\x65\
-\x3b\0\x20\x20\x20\x20\x6c\x61\x74\x65\x6e\x63\x79\x20\x3d\x20\x62\x70\x66\x5f\
-\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x6e\x65\
-\x74\x5f\x6c\x61\x74\x65\x6e\x63\x79\x5f\x62\x75\x66\x66\x65\x72\x2c\x73\x69\
-\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x74\x63\x70\x5f\x6e\x65\x74\
-\x5f\x6c\x61\x74\x65\x6e\x63\x79\x29\x2c\x30\x29\x3b\0\x20\x20\x20\x20\x69\x66\
-\x28\x21\x6c\x61\x74\x65\x6e\x63\x79\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x74\x68\x65\x20\x6e\x65\x74\
-\x20\x6c\x61\x74\x65\x6e\x63\x79\x20\x62\x75\x66\x66\x65\x72\x20\x69\x73\x20\
-\x66\x75\x6c\x6c\x5c\x6e\x22\x29\x3b\0\x20\x20\x20\x20\x6d\x65\x6d\x73\x65\x74\
-\x28\x6c\x61\x74\x65\x6e\x63\x79\x2c\x30\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\
-\x74\x72\x75\x63\x74\x20\x74\x63\x70\x5f\x6e\x65\x74\x5f\x6c\x61\x74\x65\x6e\
-\x63\x79\x29\x29\x3b\0\x20\x20\x20\x20\x6c\x61\x74\x65\x6e\x63\x79\x2d\x3e\x64\
-\x65\x6c\x74\x61\x20\x3d\x20\x64\x65\x6c\x74\x61\x3b\0\x20\x20\x20\x20\x6c\x61\
-\x74\x65\x6e\x63\x79\x2d\x3e\x74\x67\x69\x64\x20\x3d\x20\x69\x6e\x66\x6f\x2d\
-\x3e\x70\x69\x64\x3b\0\x20\x20\x20\x20\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\
-\x72\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x74\x72\x28\x6c\x61\x74\
-\x65\x6e\x63\x79\x2d\x3e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x69\
-\x6e\x66\x6f\x2d\x3e\x63\x6f\x6d\x6d\x29\x2c\x69\x6e\x66\x6f\x2d\x3e\x63\x6f\
-\x6d\x6d\x29\x3b\0\x20\x20\x20\x20\x6c\x61\x74\x65\x6e\x63\x79\x2d\x3e\x74\x73\
-\x20\x3d\x20\x6e\x6f\x77\x3b\0\x20\x20\x20\x20\x6c\x61\x74\x65\x6e\x63\x79\x2d\
-\x3e\x6c\x70\x6f\x72\x74\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\
-\x45\x41\x44\x28\x73\x6b\x2c\x20\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\
-\x2e\x73\x6b\x63\x5f\x6e\x75\x6d\x29\x3b\0\x20\x20\x20\x20\x6c\x61\x74\x65\x6e\
-\x63\x79\x2d\x3e\x64\x70\x6f\x72\x74\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\
-\x45\x5f\x52\x45\x41\x44\x28\x73\x6b\x2c\x20\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\
-\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x64\x70\x6f\x72\x74\x29\x3b\0\x20\x20\x20\x20\
-\x6c\x61\x74\x65\x6e\x63\x79\x2d\x3e\x61\x66\x20\x3d\x20\x42\x50\x46\x5f\x43\
-\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\x73\x6b\x2c\x20\x5f\x5f\x73\x6b\x5f\x63\
-\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x66\x61\x6d\x69\x6c\x79\x29\x3b\0\x20\
-\x20\x20\x20\x69\x66\x28\x6c\x61\x74\x65\x6e\x63\x79\x2d\x3e\x61\x66\x20\x3d\
-\x3d\x20\x41\x46\x5f\x49\x4e\x45\x54\x29\x7b\0\x20\x20\x20\x20\x20\x20\x20\x20\
-\x6c\x61\x74\x65\x6e\x63\x79\x2d\x3e\x73\x72\x63\x5f\x61\x64\x64\x72\x2e\x73\
-\x61\x64\x64\x72\x5f\x76\x34\x20\x3d\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\
-\x52\x45\x41\x44\x28\x73\x6b\x2c\x20\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\
-\x6e\x2e\x73\x6b\x63\x5f\x72\x63\x76\x5f\x73\x61\x64\x64\x72\x29\x3b\0\x20\x20\
-\x20\x20\x20\x20\x20\x20\x6c\x61\x74\x65\x6e\x63\x79\x2d\x3e\x64\x73\x74\x5f\
-\x61\x64\x64\x72\x2e\x64\x61\x64\x64\x72\x5f\x76\x34\x20\x3d\x20\x42\x50\x46\
-\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x28\x73\x6b\x2c\x20\x5f\x5f\x73\x6b\
-\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x64\x61\x64\x64\x72\x29\x3b\0\
-\x20\x20\x20\x20\x20\x20\x20\x20\x42\x50\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\
-\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\x6c\x61\x74\x65\x6e\x63\x79\x2d\x3e\x73\
-\x72\x63\x5f\x61\x64\x64\x72\x2e\x73\x61\x64\x64\x72\x5f\x76\x36\x2c\x73\x6b\
-\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x73\x6b\x63\x5f\x76\x36\
-\x5f\x72\x63\x76\x5f\x73\x61\x64\x64\x72\x2e\x69\x6e\x36\x5f\x75\x2e\x75\x36\
-\x5f\x61\x64\x64\x72\x33\x32\x29\x3b\0\x20\x20\x20\x20\x20\x20\x20\x20\x42\x50\
-\x46\x5f\x43\x4f\x52\x45\x5f\x52\x45\x41\x44\x5f\x49\x4e\x54\x4f\x28\x26\x6c\
-\x61\x74\x65\x6e\x63\x79\x2d\x3e\x64\x73\x74\x5f\x61\x64\x64\x72\x2e\x64\x61\
-\x64\x64\x72\x5f\x76\x36\x2c\x73\x6b\x2c\x5f\x5f\x73\x6b\x5f\x63\x6f\x6d\x6d\
-\x6f\x6e\x2e\x73\x6b\x63\x5f\x76\x36\x5f\x64\x61\x64\x64\x72\x2e\x69\x6e\x36\
-\x5f\x75\x2e\x75\x36\x5f\x61\x64\x64\x72\x33\x32\x29\x3b\0\x20\x20\x20\x20\x62\
-\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\x6c\
-\x61\x74\x65\x6e\x63\x79\x2c\x30\x29\x3b\0\x30\x3a\x33\0\x30\x3a\x30\0\x30\x3a\
-\x30\x3a\x33\0\x30\x3a\x30\x3a\x32\x3a\x31\x3a\x31\0\x30\x3a\x30\x3a\x32\x3a\
-\x31\x3a\x30\0\x30\x3a\x30\x3a\x34\0\x30\x3a\x30\x3a\x30\x3a\x31\x3a\x30\0\x30\
-\x3a\x30\x3a\x30\x3a\x31\x3a\x31\0\x30\x3a\x30\x3a\x31\x34\0\x30\x3a\x30\x3a\
-\x31\x33\0\x30\x3a\x31\x34\0\x30\x3a\x31\x30\0\x30\x3a\x30\x3a\x31\x34\x3a\x30\
-\x3a\x32\0\x30\x3a\x30\x3a\x31\x33\x3a\x30\x3a\x32\0\x30\x3a\x31\x33\0\x30\x3a\
-\x36\x33\0\x6c\x69\x63\x65\x6e\x73\x65\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x6d\
-\x61\x70\x73\0\x2e\x74\x65\x78\x74\0\x74\x72\x61\x63\x65\x70\x6f\x69\x6e\x74\
-\x2f\x74\x63\x70\x2f\x74\x63\x70\x5f\x72\x65\x74\x72\x61\x6e\x73\x6d\x69\x74\
-\x5f\x73\x6b\x62\0\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x73\x65\x6e\x64\
-\x6d\x73\x67\0\x6b\x72\x65\x74\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x73\x65\
-\x6e\x64\x6d\x73\x67\0\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\x5f\x63\x6c\x65\
-\x61\x6e\x75\x70\x5f\x72\x62\x75\x66\0\x6b\x70\x72\x6f\x62\x65\x2f\x74\x63\x70\
-\x5f\x76\x34\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x6b\x70\x72\x6f\x62\x65\x2f\x74\
-\x63\x70\x5f\x76\x36\x5f\x63\x6f\x6e\x6e\x65\x63\x74\0\x6b\x70\x72\x6f\x62\x65\
-\x2f\x74\x63\x70\x5f\x72\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\
-\x65\x73\x73\0\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\x5f\x76\x34\x5f\x63\x6f\
-\x6e\x6e\x65\x63\x74\0\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\x5f\x76\x36\x5f\
-\x63\x6f\x6e\x6e\x65\x63\x74\0\x66\x65\x6e\x74\x72\x79\x2f\x74\x63\x70\x5f\x72\
-\x63\x76\x5f\x73\x74\x61\x74\x65\x5f\x70\x72\x6f\x63\x65\x73\x73\0\x66\x65\x6e\
-\x74\x72\x79\x2f\x74\x63\x70\x5f\x72\x63\x76\x5f\x65\x73\x74\x61\x62\x6c\x69\
-\x73\x68\x65\x64\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\0\0\0\0\0\0\x9f\
-\xeb\x01\0\x20\0\0\0\0\0\0\0\xd4\0\0\0\xd4\0\0\0\x7c\x22\0\0\x50\x23\0\0\x0c\
-\x03\0\0\x08\0\0\0\xa5\x46\0\0\x01\0\0\0\0\0\0\0\x56\x01\0\0\xab\x46\0\0\x01\0\
-\0\0\0\0\0\0\x39\0\0\0\xcd\x46\0\0\x01\0\0\0\0\0\0\0\x03\x01\0\0\xe0\x46\0\0\
-\x01\0\0\0\0\0\0\0\x04\x01\0\0\xf6\x46\0\0\x01\0\0\0\0\0\0\0\x05\x01\0\0\x0e\
-\x47\0\0\x01\0\0\0\0\0\0\0\x06\x01\0\0\x24\x47\0\0\x01\0\0\0\0\0\0\0\x07\x01\0\
-\0\x3a\x47\0\0\x01\0\0\0\0\0\0\0\x08\x01\0\0\x57\x47\0\0\x01\0\0\0\0\0\0\0\x0b\
-\x01\0\0\x6d\x47\0\0\x01\0\0\0\0\0\0\0\x0c\x01\0\0\x83\x47\0\0\x01\0\0\0\0\0\0\
-\0\x0d\x01\0\0\xa0\x47\0\0\x01\0\0\0\0\0\0\0\x0e\x01\0\0\xbb\x47\0\0\x01\0\0\0\
-\0\0\0\0\x54\x01\0\0\x10\0\0\0\xa5\x46\0\0\x34\0\0\0\0\0\0\0\xce\x27\0\0\x3c\
-\x41\0\0\0\x20\x01\0\x28\0\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\x30\0\0\0\xce\x27\0\
-\0\x75\x41\0\0\x08\x3c\x01\0\x40\0\0\0\xce\x27\0\0\x75\x41\0\0\x08\x3c\x01\0\
-\x48\0\0\0\xce\x27\0\0\x75\x41\0\0\x08\x3c\x01\0\x58\0\0\0\xce\x27\0\0\0\0\0\0\
-\0\0\0\0\x60\0\0\0\xce\x27\0\0\xb6\x41\0\0\x0c\x48\x01\0\x80\0\0\0\xce\x27\0\0\
-\xee\x41\0\0\x08\x4c\x01\0\x88\0\0\0\xce\x27\0\0\xfc\x41\0\0\x0b\x58\x01\0\x98\
-\0\0\0\xce\x27\0\0\x1a\x42\0\0\x19\x5c\x01\0\xa0\0\0\0\xce\x27\0\0\x38\x42\0\0\
-\x0f\x64\x01\0\xe0\0\0\0\xce\x27\0\0\x91\x42\0\0\x08\x68\x01\0\xe8\0\0\0\xce\
-\x27\0\0\xa3\x42\0\0\x09\x6c\x01\0\x10\x01\0\0\xce\x27\0\0\xdb\x42\0\0\x05\x78\
-\x01\0\x58\x01\0\0\xce\x27\0\0\x1a\x42\0\0\x11\x5c\x01\0\x70\x01\0\0\xce\x27\0\
-\0\x11\x43\0\0\x14\x7c\x01\0\x78\x01\0\0\xce\x27\0\0\x2d\x43\0\0\x1b\x80\x01\0\
-\x80\x01\0\0\xce\x27\0\0\x2d\x43\0\0\x13\x80\x01\0\x88\x01\0\0\xce\x27\0\0\x4c\
-\x43\0\0\x46\x84\x01\0\x90\x01\0\0\xce\x27\0\0\xdb\x42\0\0\x05\x78\x01\0\xa0\
-\x01\0\0\xce\x27\0\0\x4c\x43\0\0\x05\x84\x01\0\xb8\x01\0\0\xce\x27\0\0\x98\x43\
-\0\0\x11\x88\x01\0\xc8\x01\0\0\xce\x27\0\0\xaf\x43\0\0\x16\x8c\x01\0\xe0\x01\0\
-\0\xce\x27\0\0\xdb\x42\0\0\x05\x78\x01\0\xe8\x01\0\0\xce\x27\0\0\xaf\x43\0\0\
-\x16\x8c\x01\0\xf8\x01\0\0\xce\x27\0\0\xaf\x43\0\0\x16\x8c\x01\0\0\x02\0\0\xce\
-\x27\0\0\xaf\x43\0\0\x14\x8c\x01\0\x10\x02\0\0\xce\x27\0\0\xec\x43\0\0\x16\x90\
-\x01\0\x28\x02\0\0\xce\x27\0\0\xdb\x42\0\0\x05\x78\x01\0\x30\x02\0\0\xce\x27\0\
-\0\xec\x43\0\0\x16\x90\x01\0\x40\x02\0\0\xce\x27\0\0\xec\x43\0\0\x16\x90\x01\0\
-\x48\x02\0\0\xce\x27\0\0\xec\x43\0\0\x14\x90\x01\0\x58\x02\0\0\xce\x27\0\0\x2b\
-\x44\0\0\x13\x94\x01\0\x70\x02\0\0\xce\x27\0\0\xdb\x42\0\0\x05\x78\x01\0\x78\
-\x02\0\0\xce\x27\0\0\x2b\x44\0\0\x13\x94\x01\0\x88\x02\0\0\xce\x27\0\0\x2b\x44\
-\0\0\x13\x94\x01\0\x90\x02\0\0\xce\x27\0\0\x2b\x44\0\0\x11\x94\x01\0\x98\x02\0\
-\0\xce\x27\0\0\x68\x44\0\0\x08\x9c\x01\0\xa8\x02\0\0\xce\x27\0\0\x88\x44\0\0\
-\x26\xa0\x01\0\xc0\x02\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xc8\x02\0\0\xce\x27\0\0\
-\x88\x44\0\0\x26\xa0\x01\0\xd8\x02\0\0\xce\x27\0\0\x88\x44\0\0\x26\xa0\x01\0\
-\xe0\x02\0\0\xce\x27\0\0\x88\x44\0\0\x24\xa0\x01\0\xf0\x02\0\0\xce\x27\0\0\xdb\
-\x44\0\0\x26\xa4\x01\0\x08\x03\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\x10\x03\0\0\xce\
-\x27\0\0\xdb\x44\0\0\x26\xa4\x01\0\x20\x03\0\0\xce\x27\0\0\xdb\x44\0\0\x26\xa4\
-\x01\0\x28\x03\0\0\xce\x27\0\0\xdb\x44\0\0\x24\xa4\x01\0\x40\x03\0\0\xce\x27\0\
-\0\x2a\x45\0\0\x09\xb0\x01\0\x70\x03\0\0\xce\x27\0\0\x93\x45\0\0\x09\xb4\x01\0\
-\xa0\x03\0\0\xce\x27\0\0\xf8\x45\0\0\x05\xbc\x01\0\xb8\x03\0\0\xce\x27\0\0\x3a\
-\x41\0\0\x01\xc8\x01\0\xab\x46\0\0\x36\0\0\0\0\0\0\0\xce\x27\0\0\x0e\x28\0\0\
-\x2b\xfc\x04\0\x08\0\0\0\xce\x27\0\0\x40\x28\0\0\x08\xb0\x03\0\x10\0\0\0\xce\
-\x27\0\0\0\0\0\0\0\0\0\0\x18\0\0\0\xce\x27\0\0\x4c\x28\0\0\x0f\xc0\x03\0\x40\0\
-\0\0\xce\x27\0\0\x84\x28\0\0\x08\xc4\x03\0\x48\0\0\0\xce\x27\0\0\x9e\x28\0\0\
-\x0f\xd0\x03\0\x60\0\0\0\xce\x27\0\0\xc0\x28\0\0\x09\xe4\x03\0\x80\0\0\0\xce\
-\x27\0\0\xcf\x28\0\0\x09\xe8\x03\0\xa8\0\0\0\xce\x27\0\0\x0a\x29\0\0\x13\xec\
-\x03\0\xd0\0\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xd8\0\0\0\xce\x27\0\0\x21\x29\0\0\
-\x05\x14\x04\0\x08\x01\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\x10\x01\0\0\xce\x27\0\0\
-\x72\x29\0\0\x05\x18\x04\0\x40\x01\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\x48\x01\0\0\
-\xce\x27\0\0\xbe\x29\0\0\x05\x1c\x04\0\x78\x01\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\
-\x80\x01\0\0\xce\x27\0\0\x0c\x2a\0\0\x05\x20\x04\0\x98\x01\0\0\xce\x27\0\0\0\0\
-\0\0\0\0\0\0\xa0\x01\0\0\xce\x27\0\0\x5a\x2a\0\0\x05\x2c\x04\0\xb0\x01\0\0\xce\
-\x27\0\0\x89\x2a\0\0\x08\x34\x04\0\xb8\x01\0\0\xce\x27\0\0\x89\x2a\0\0\x1a\x34\
-\x04\0\xd8\x01\0\0\xce\x27\0\0\xb9\x2a\0\0\x21\x3c\x04\0\x08\x02\0\0\xce\x27\0\
-\0\x20\x2b\0\0\x08\x40\x04\0\x10\x02\0\0\xce\x27\0\0\x2f\x2b\0\0\x09\x44\x04\0\
-\x38\x02\0\0\xce\x27\0\0\x67\x2b\0\0\x05\x50\x04\0\x70\x02\0\0\xce\x27\0\0\x97\
-\x2b\0\0\x0f\x54\x04\0\x78\x02\0\0\xce\x27\0\0\xac\x2b\0\0\x13\x58\x04\0\x80\
-\x02\0\0\xce\x27\0\0\xac\x2b\0\0\x11\x58\x04\0\x88\x02\0\0\xce\x27\0\0\xc5\x2b\
-\0\0\x13\x5c\x04\0\x90\x02\0\0\xce\x27\0\0\xde\x2b\0\0\x0f\x60\x04\0\xa0\x02\0\
-\0\xce\x27\0\0\xc5\x2b\0\0\x11\x5c\x04\0\xa8\x02\0\0\xce\x27\0\0\xf3\x2b\0\0\
-\x13\x64\x04\0\xb0\x02\0\0\xce\x27\0\0\x0c\x2c\0\0\x11\x6c\x04\0\xc8\x02\0\0\
-\xce\x27\0\0\x23\x2c\0\0\x10\x68\x04\0\xd0\x02\0\0\xce\x27\0\0\xf3\x2b\0\0\x11\
-\x64\x04\0\xd8\x02\0\0\xce\x27\0\0\x67\x2b\0\0\x05\x50\x04\0\xf8\x02\0\0\xce\
-\x27\0\0\x3a\x2c\0\0\x05\x70\x04\0\x08\x03\0\0\xce\x27\0\0\x70\x2c\0\0\x0c\x78\
-\x04\0\x10\x03\0\0\xce\x27\0\0\x70\x2c\0\0\x05\x78\x04\0\x28\x03\0\0\xce\x27\0\
-\0\x84\x2c\0\0\x16\x80\x04\0\x58\x03\0\0\xce\x27\0\0\xa4\x2c\0\0\x0d\x88\x04\0\
-\x80\x03\0\0\xce\x27\0\0\x84\x2c\0\0\x16\x80\x04\0\x88\x03\0\0\xce\x27\0\0\xf8\
-\x2c\0\0\x0d\x8c\x04\0\xa0\x03\0\0\xce\x27\0\0\x50\x2d\0\0\x27\x90\x04\0\xa8\
-\x03\0\0\xce\x27\0\0\x50\x2d\0\0\x25\x90\x04\0\xb0\x03\0\0\xce\x27\0\0\x7d\x2d\
-\0\0\x27\x94\x04\0\xb8\x03\0\0\xce\x27\0\0\x7d\x2d\0\0\x25\x94\x04\0\xd0\x03\0\
-\0\xce\x27\0\0\xaa\x2d\0\0\x16\xb0\x04\0\xf0\x03\0\0\xce\x27\0\0\xcb\x2d\0\0\
-\x0d\xb4\x04\0\x18\x04\0\0\xce\x27\0\0\x4c\x2e\0\0\x2a\xb8\x04\0\x28\x04\0\0\
-\xce\x27\0\0\x4c\x2e\0\0\x0d\xb8\x04\0\x40\x04\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\
-\x60\x04\0\0\xce\x27\0\0\xc7\x2e\0\0\x0d\xcc\x04\0\x78\x04\0\0\xce\x27\0\0\xf1\
-\x2e\0\0\x05\0\x05\0\xcd\x46\0\0\x06\0\0\0\0\0\0\0\xce\x27\0\0\x29\x2f\0\0\x05\
-\x2c\x05\0\x10\0\0\0\xce\x27\0\0\x4c\x28\0\0\x0f\x34\x05\0\x18\0\0\0\xce\x27\0\
-\0\x4c\x28\0\0\x09\x34\x05\0\x28\0\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\
-\xce\x27\0\0\x5e\x2f\0\0\x05\x38\x05\0\x60\0\0\0\xce\x27\0\0\x29\x2f\0\0\x05\
-\x2c\x05\0\xe0\x46\0\0\xb0\0\0\0\0\0\0\0\xce\x27\0\0\x99\x2f\0\0\x05\x4c\x05\0\
-\x08\0\0\0\xce\x27\0\0\x4c\x28\0\0\x0f\x54\x05\0\x10\0\0\0\xce\x27\0\0\x4c\x28\
-\0\0\x09\x54\x05\0\x20\0\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\x28\0\0\0\xce\x27\0\0\
-\xc7\x2f\0\0\x1c\x58\x05\0\x40\0\0\0\xce\x27\0\0\x0e\x30\0\0\x09\x5c\x05\0\x48\
-\0\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\x58\0\0\0\xce\x27\0\0\x99\x2f\0\0\x05\x4c\
-\x05\0\x78\0\0\0\xce\x27\0\0\x1f\x30\0\0\x09\x6c\x05\0\x80\0\0\0\xce\x27\0\0\
-\x32\x30\0\0\x17\x68\x05\0\x88\0\0\0\xce\x27\0\0\x4c\x28\0\0\x0f\xa0\x02\0\xa0\
-\0\0\0\xce\x27\0\0\x51\x30\0\0\x09\xa4\x02\0\xa8\0\0\0\xce\x27\0\0\x51\x30\0\0\
-\x15\xa4\x02\0\xb0\0\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\xa8\x02\0\xe0\0\0\0\xce\
-\x27\0\0\0\0\0\0\0\0\0\0\xe8\0\0\0\xce\x27\0\0\x70\x30\0\0\x05\xb0\x02\0\xf8\0\
-\0\0\xce\x27\0\0\xab\x30\0\0\x09\xb8\x02\0\0\x01\0\0\xce\x27\0\0\xab\x30\0\0\
-\x09\xb8\x02\0\x18\x01\0\0\xce\x27\0\0\xc7\x30\0\0\x09\xc0\x02\0\x50\x01\0\0\
-\xce\x27\0\0\xf9\x30\0\0\x11\xc4\x02\0\x58\x01\0\0\xce\x27\0\0\xc7\x30\0\0\x09\
-\xc0\x02\0\x68\x01\0\0\xce\x27\0\0\x10\x31\0\0\x09\xc8\x02\0\x98\x01\0\0\xce\
-\x27\0\0\xc7\x30\0\0\x09\xc0\x02\0\xa8\x01\0\0\xce\x27\0\0\x4a\x31\0\0\x09\xcc\
-\x02\0\xd0\x01\0\0\xce\x27\0\0\xc7\x30\0\0\x09\xc0\x02\0\xe0\x01\0\0\xce\x27\0\
-\0\x8f\x31\0\0\x09\xd0\x02\0\x08\x02\0\0\xce\x27\0\0\xc7\x30\0\0\x09\xc0\x02\0\
-\x18\x02\0\0\xce\x27\0\0\xd0\x31\0\0\x09\xd4\x02\0\x40\x02\0\0\xce\x27\0\0\xc7\
-\x30\0\0\x09\xc0\x02\0\x48\x02\0\0\xce\x27\0\0\x0f\x32\0\0\x09\xd8\x02\0\x60\
-\x02\0\0\xce\x27\0\0\x4c\x32\0\0\x15\xdc\x02\0\x70\x02\0\0\xce\x27\0\0\x4c\x32\
-\0\0\x13\xdc\x02\0\x80\x02\0\0\xce\x27\0\0\xc7\x30\0\0\x09\xc0\x02\0\x88\x02\0\
-\0\xce\x27\0\0\x72\x32\0\0\x26\xe4\x02\0\xa8\x02\0\0\xce\x27\0\0\xc0\x32\0\0\
-\x0c\xe8\x02\0\xb0\x02\0\0\xce\x27\0\0\xd1\x32\0\0\x2b\xec\x02\0\xf8\x02\0\0\
-\xce\x27\0\0\xfd\x32\0\0\x0d\0\x03\0\x18\x03\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\
-\xe0\x01\0\x28\x03\0\0\xce\x27\0\0\x40\x33\0\0\x16\xe4\x01\0\x30\x03\0\0\xce\
-\x27\0\0\x40\x33\0\0\x0d\xe4\x01\0\x48\x03\0\0\xce\x27\0\0\x40\x33\0\0\x08\xe4\
-\x01\0\x50\x03\0\0\xce\x27\0\0\x71\x33\0\0\x17\xf0\x01\0\x58\x03\0\0\xce\x27\0\
-\0\x8d\x33\0\0\x17\xec\x01\0\x60\x03\0\0\xce\x27\0\0\xa9\x33\0\0\x24\xf4\x01\0\
-\x90\x03\0\0\xce\x27\0\0\xec\x33\0\0\x26\0\x02\0\xc0\x03\0\0\xce\x27\0\0\x20\
-\x2b\0\0\x08\x04\x02\0\xc8\x03\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xf0\x03\0\0\xce\
-\x27\0\0\x59\x34\0\0\x09\x34\x03\0\x30\x04\0\0\xce\x27\0\0\xf9\x30\0\0\x11\x38\
-\x03\0\x38\x04\0\0\xce\x27\0\0\x10\x31\0\0\x1e\x3c\x03\0\x50\x04\0\0\xce\x27\0\
-\0\x10\x31\0\0\x09\x3c\x03\0\x80\x04\0\0\xce\x27\0\0\x59\x34\0\0\x09\x34\x03\0\
-\x88\x04\0\0\xce\x27\0\0\x8b\x34\0\0\x09\x40\x03\0\xb8\x04\0\0\xce\x27\0\0\x59\
-\x34\0\0\x09\x34\x03\0\xc8\x04\0\0\xce\x27\0\0\xe3\x34\0\0\x09\x44\x03\0\xf8\
-\x04\0\0\xce\x27\0\0\xd0\x31\0\0\x09\x48\x03\0\x30\x05\0\0\xce\x27\0\0\x59\x34\
-\0\0\x09\x34\x03\0\x38\x05\0\0\xce\x27\0\0\x0f\x32\0\0\x09\x4c\x03\0\x50\x05\0\
-\0\xce\x27\0\0\x4c\x32\0\0\x15\x50\x03\0\x60\x05\0\0\xce\x27\0\0\x4c\x32\0\0\
-\x13\x50\x03\0\x68\x05\0\0\xce\x27\0\0\x37\x35\0\0\x26\x58\x03\0\x90\x05\0\0\
-\xce\x27\0\0\xc0\x32\0\0\x0c\x5c\x03\0\x98\x05\0\0\xce\x27\0\0\xd1\x32\0\0\x2b\
-\x60\x03\0\xe0\x05\0\0\xce\x27\0\0\x85\x35\0\0\x0d\x74\x03\0\0\x06\0\0\xce\x27\
-\0\0\x9e\x28\0\0\x0f\xe0\x01\0\x10\x06\0\0\xce\x27\0\0\x40\x33\0\0\x16\xe4\x01\
-\0\x18\x06\0\0\xce\x27\0\0\x40\x33\0\0\x0d\xe4\x01\0\x30\x06\0\0\xce\x27\0\0\
-\x40\x33\0\0\x08\xe4\x01\0\x38\x06\0\0\xce\x27\0\0\x71\x33\0\0\x17\xf0\x01\0\
-\x40\x06\0\0\xce\x27\0\0\x8d\x33\0\0\x17\xec\x01\0\x48\x06\0\0\xce\x27\0\0\xa9\
-\x33\0\0\x24\xf4\x01\0\x78\x06\0\0\xce\x27\0\0\xec\x33\0\0\x26\0\x02\0\xa8\x06\
-\0\0\xce\x27\0\0\x20\x2b\0\0\x08\x04\x02\0\xc0\x06\0\0\xce\x27\0\0\xc8\x35\0\0\
-\x16\x14\x03\0\xe0\x06\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xe8\x06\0\0\xce\x27\0\0\
-\xe6\x35\0\0\x0d\x18\x03\0\x10\x07\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\xe0\x01\0\
-\x20\x07\0\0\xce\x27\0\0\x40\x33\0\0\x16\xe4\x01\0\x28\x07\0\0\xce\x27\0\0\x40\
-\x33\0\0\x0d\xe4\x01\0\x40\x07\0\0\xce\x27\0\0\x40\x33\0\0\x08\xe4\x01\0\x48\
-\x07\0\0\xce\x27\0\0\x71\x33\0\0\x17\xf0\x01\0\x50\x07\0\0\xce\x27\0\0\x8d\x33\
-\0\0\x17\xec\x01\0\x58\x07\0\0\xce\x27\0\0\xa9\x33\0\0\x24\xf4\x01\0\x78\x07\0\
-\0\xce\x27\0\0\xec\x33\0\0\x26\0\x02\0\xa8\x07\0\0\xce\x27\0\0\x20\x2b\0\0\x08\
-\x04\x02\0\xc0\x07\0\0\xce\x27\0\0\xc8\x35\0\0\x16\x88\x03\0\xe0\x07\0\0\xce\
-\x27\0\0\0\0\0\0\0\0\0\0\xe8\x07\0\0\xce\x27\0\0\x26\x36\0\0\x0d\x8c\x03\0\x10\
-\x08\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\xe0\x01\0\x18\x08\0\0\xce\x27\0\0\x40\x33\
-\0\0\x16\xe4\x01\0\x20\x08\0\0\xce\x27\0\0\x40\x33\0\0\x0d\xe4\x01\0\x38\x08\0\
-\0\xce\x27\0\0\x40\x33\0\0\x08\xe4\x01\0\x40\x08\0\0\xce\x27\0\0\x71\x33\0\0\
-\x17\xf0\x01\0\x48\x08\0\0\xce\x27\0\0\x8d\x33\0\0\x17\xec\x01\0\x50\x08\0\0\
-\xce\x27\0\0\xa9\x33\0\0\x24\xf4\x01\0\x70\x08\0\0\xce\x27\0\0\xec\x33\0\0\x26\
-\0\x02\0\xa0\x08\0\0\xce\x27\0\0\x20\x2b\0\0\x08\x04\x02\0\xb0\x08\0\0\xce\x27\
-\0\0\x66\x36\0\0\x10\x1c\x02\0\xc0\x08\0\0\xce\x27\0\0\x7d\x36\0\0\x10\x18\x02\
-\0\xd0\x08\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\x20\x09\0\0\xce\x27\0\0\
-\xc9\x36\0\0\x09\x24\x02\0\x40\x09\0\0\xce\x27\0\0\x0e\x37\0\0\x12\x28\x02\0\
-\x48\x09\0\0\xce\x27\0\0\x2a\x37\0\0\x1a\x2c\x02\0\x50\x09\0\0\xce\x27\0\0\x2a\
-\x37\0\0\x13\x2c\x02\0\x58\x09\0\0\xce\x27\0\0\x48\x37\0\0\x1c\x30\x02\0\x60\
-\x09\0\0\xce\x27\0\0\x48\x37\0\0\x15\x30\x02\0\x68\x09\0\0\xce\x27\0\0\x6a\x37\
-\0\0\x1c\x34\x02\0\x70\x09\0\0\xce\x27\0\0\x6a\x37\0\0\x15\x34\x02\0\x78\x09\0\
-\0\xce\x27\0\0\x8c\x37\0\0\x28\x38\x02\0\x80\x09\0\0\xce\x27\0\0\x8c\x37\0\0\
-\x21\x38\x02\0\x88\x09\0\0\xce\x27\0\0\xba\x37\0\0\x28\x3c\x02\0\x90\x09\0\0\
-\xce\x27\0\0\xba\x37\0\0\x21\x3c\x02\0\x98\x09\0\0\xce\x27\0\0\xe8\x37\0\0\x09\
-\x40\x02\0\xb0\x09\0\0\xce\x27\0\0\x0c\x38\0\0\x1c\x48\x02\0\xc0\x09\0\0\xce\
-\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\xc8\x09\0\0\xce\x27\0\0\x2e\x38\0\0\x09\x4c\
-\x02\0\xe8\x09\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\xf0\x09\0\0\xce\x27\0\
-\0\x7d\x36\0\0\x10\x18\x02\0\0\x0a\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\
-\x50\x0a\0\0\xce\x27\0\0\x6c\x38\0\0\x09\x58\x02\0\x70\x0a\0\0\xce\x27\0\0\xb1\
-\x38\0\0\x12\x5c\x02\0\x78\x0a\0\0\xce\x27\0\0\xce\x38\0\0\x1a\x60\x02\0\x80\
-\x0a\0\0\xce\x27\0\0\xce\x38\0\0\x13\x60\x02\0\x88\x0a\0\0\xce\x27\0\0\xec\x38\
-\0\0\x1c\x64\x02\0\x90\x0a\0\0\xce\x27\0\0\xec\x38\0\0\x15\x64\x02\0\x98\x0a\0\
-\0\xce\x27\0\0\x0e\x39\0\0\x1c\x68\x02\0\xa0\x0a\0\0\xce\x27\0\0\x0e\x39\0\0\
-\x15\x68\x02\0\xa8\x0a\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\xb8\x0a\0\0\
-\xce\x27\0\0\x30\x39\0\0\x09\x6c\x02\0\xd8\x0a\0\0\xce\x27\0\0\x66\x36\0\0\x10\
-\x1c\x02\0\xe0\x0a\0\0\xce\x27\0\0\x90\x39\0\0\x09\x70\x02\0\0\x0b\0\0\xce\x27\
-\0\0\xe8\x37\0\0\x09\x78\x02\0\x18\x0b\0\0\xce\x27\0\0\x0c\x38\0\0\x1c\x80\x02\
-\0\x28\x0b\0\0\xce\x27\0\0\xf0\x39\0\0\x09\x84\x02\0\x50\x0b\0\0\xce\x27\0\0\
-\x66\x36\0\0\x10\x1c\x02\0\x60\x0b\0\0\xce\x27\0\0\x7d\x36\0\0\x10\x18\x02\0\
-\x68\x0b\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\xb8\x0b\0\0\xce\x27\0\0\xc9\
-\x36\0\0\x09\x24\x02\0\xd8\x0b\0\0\xce\x27\0\0\x0e\x37\0\0\x12\x28\x02\0\xe0\
-\x0b\0\0\xce\x27\0\0\x2a\x37\0\0\x1a\x2c\x02\0\xe8\x0b\0\0\xce\x27\0\0\x2a\x37\
-\0\0\x13\x2c\x02\0\xf0\x0b\0\0\xce\x27\0\0\x48\x37\0\0\x1c\x30\x02\0\xf8\x0b\0\
-\0\xce\x27\0\0\x48\x37\0\0\x15\x30\x02\0\0\x0c\0\0\xce\x27\0\0\x6a\x37\0\0\x1c\
-\x34\x02\0\x08\x0c\0\0\xce\x27\0\0\x6a\x37\0\0\x15\x34\x02\0\x10\x0c\0\0\xce\
-\x27\0\0\x8c\x37\0\0\x28\x38\x02\0\x18\x0c\0\0\xce\x27\0\0\x8c\x37\0\0\x21\x38\
-\x02\0\x20\x0c\0\0\xce\x27\0\0\xba\x37\0\0\x28\x3c\x02\0\x28\x0c\0\0\xce\x27\0\
-\0\xba\x37\0\0\x21\x3c\x02\0\x30\x0c\0\0\xce\x27\0\0\xe8\x37\0\0\x09\x40\x02\0\
-\x48\x0c\0\0\xce\x27\0\0\x0c\x38\0\0\x1c\x48\x02\0\x58\x0c\0\0\xce\x27\0\0\x66\
-\x36\0\0\x10\x1c\x02\0\x70\x0c\0\0\xce\x27\0\0\x2e\x38\0\0\x09\x4c\x02\0\x88\
-\x0c\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\x98\x0c\0\0\xce\x27\0\0\x7d\x36\
-\0\0\x10\x18\x02\0\xa0\x0c\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\xf0\x0c\0\
-\0\xce\x27\0\0\x6c\x38\0\0\x09\x58\x02\0\x10\x0d\0\0\xce\x27\0\0\xb1\x38\0\0\
-\x12\x5c\x02\0\x18\x0d\0\0\xce\x27\0\0\xce\x38\0\0\x1a\x60\x02\0\x20\x0d\0\0\
-\xce\x27\0\0\xce\x38\0\0\x13\x60\x02\0\x28\x0d\0\0\xce\x27\0\0\xec\x38\0\0\x1c\
-\x64\x02\0\x30\x0d\0\0\xce\x27\0\0\xec\x38\0\0\x15\x64\x02\0\x38\x0d\0\0\xce\
-\x27\0\0\x0e\x39\0\0\x1c\x68\x02\0\x40\x0d\0\0\xce\x27\0\0\x0e\x39\0\0\x15\x68\
-\x02\0\x48\x0d\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\x58\x0d\0\0\xce\x27\0\
-\0\x30\x39\0\0\x09\x6c\x02\0\x78\x0d\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\
-\x80\x0d\0\0\xce\x27\0\0\x90\x39\0\0\x09\x70\x02\0\xa0\x0d\0\0\xce\x27\0\0\xe8\
-\x37\0\0\x09\x78\x02\0\xb8\x0d\0\0\xce\x27\0\0\x0c\x38\0\0\x1c\x80\x02\0\xc8\
-\x0d\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\xd0\x0d\0\0\xce\x27\0\0\xf0\x39\
-\0\0\x09\x84\x02\0\xe8\x0d\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\0\x0e\0\0\xce\x27\0\
-\0\0\0\0\0\0\0\0\0\x08\x0e\0\0\xce\x27\0\0\x2e\x3a\0\0\x05\x7c\x05\0\x20\x0e\0\
-\0\xce\x27\0\0\x99\x2f\0\0\x05\x4c\x05\0\xf6\x46\0\0\xa7\0\0\0\0\0\0\0\xce\x27\
-\0\0\x5e\x3a\0\0\x05\xf8\x05\0\x28\0\0\0\xce\x27\0\0\x9f\x3a\0\0\x09\xfc\x05\0\
-\x30\0\0\0\xce\x27\0\0\x5e\x3a\0\0\x05\xf8\x05\0\x40\0\0\0\xce\x27\0\0\x4c\x28\
-\0\0\x0f\x0c\x06\0\x58\0\0\0\xce\x27\0\0\x51\x30\0\0\x09\x10\x06\0\x60\0\0\0\
-\xce\x27\0\0\x51\x30\0\0\x15\x10\x06\0\x68\0\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\
-\x14\x06\0\x98\0\0\0\xce\x27\0\0\x5e\x3a\0\0\x05\xf8\x05\0\xa0\0\0\0\xce\x27\0\
-\0\x70\x30\0\0\x05\x1c\x06\0\xb0\0\0\0\xce\x27\0\0\xab\x30\0\0\x09\x24\x06\0\
-\xb8\0\0\0\xce\x27\0\0\xab\x30\0\0\x09\x24\x06\0\xd0\0\0\0\xce\x27\0\0\xc7\x30\
-\0\0\x09\x2c\x06\0\x08\x01\0\0\xce\x27\0\0\xf9\x30\0\0\x11\x30\x06\0\x10\x01\0\
-\0\xce\x27\0\0\xc7\x30\0\0\x09\x2c\x06\0\x20\x01\0\0\xce\x27\0\0\x10\x31\0\0\
-\x09\x34\x06\0\x50\x01\0\0\xce\x27\0\0\xc7\x30\0\0\x09\x2c\x06\0\x60\x01\0\0\
-\xce\x27\0\0\x4a\x31\0\0\x09\x38\x06\0\x88\x01\0\0\xce\x27\0\0\xc7\x30\0\0\x09\
-\x2c\x06\0\x98\x01\0\0\xce\x27\0\0\x8f\x31\0\0\x09\x3c\x06\0\xc0\x01\0\0\xce\
-\x27\0\0\xc7\x30\0\0\x09\x2c\x06\0\xd0\x01\0\0\xce\x27\0\0\xd0\x31\0\0\x09\x40\
-\x06\0\xf8\x01\0\0\xce\x27\0\0\xc7\x30\0\0\x09\x2c\x06\0\0\x02\0\0\xce\x27\0\0\
-\x0f\x32\0\0\x09\x44\x06\0\x18\x02\0\0\xce\x27\0\0\x4c\x32\0\0\x15\x48\x06\0\
-\x28\x02\0\0\xce\x27\0\0\x4c\x32\0\0\x13\x48\x06\0\x38\x02\0\0\xce\x27\0\0\xc7\
-\x30\0\0\x09\x2c\x06\0\x40\x02\0\0\xce\x27\0\0\x72\x32\0\0\x26\x50\x06\0\x60\
-\x02\0\0\xce\x27\0\0\xc0\x32\0\0\x0c\x54\x06\0\x68\x02\0\0\xce\x27\0\0\xd1\x32\
-\0\0\x2b\x58\x06\0\xb0\x02\0\0\xce\x27\0\0\xfd\x32\0\0\x0d\x6c\x06\0\xd0\x02\0\
-\0\xce\x27\0\0\x9e\x28\0\0\x0f\xe0\x01\0\xe0\x02\0\0\xce\x27\0\0\x40\x33\0\0\
-\x16\xe4\x01\0\xe8\x02\0\0\xce\x27\0\0\x40\x33\0\0\x0d\xe4\x01\0\0\x03\0\0\xce\
-\x27\0\0\x40\x33\0\0\x08\xe4\x01\0\x08\x03\0\0\xce\x27\0\0\x71\x33\0\0\x17\xf0\
-\x01\0\x10\x03\0\0\xce\x27\0\0\x8d\x33\0\0\x17\xec\x01\0\x18\x03\0\0\xce\x27\0\
-\0\xa9\x33\0\0\x24\xf4\x01\0\x48\x03\0\0\xce\x27\0\0\xec\x33\0\0\x26\0\x02\0\
-\x78\x03\0\0\xce\x27\0\0\x20\x2b\0\0\x08\x04\x02\0\x80\x03\0\0\xce\x27\0\0\0\0\
-\0\0\0\0\0\0\xa8\x03\0\0\xce\x27\0\0\x59\x34\0\0\x09\xa0\x06\0\xe8\x03\0\0\xce\
-\x27\0\0\xf9\x30\0\0\x11\xa4\x06\0\xf0\x03\0\0\xce\x27\0\0\x10\x31\0\0\x1e\xa8\
-\x06\0\x08\x04\0\0\xce\x27\0\0\x10\x31\0\0\x09\xa8\x06\0\x38\x04\0\0\xce\x27\0\
-\0\x59\x34\0\0\x09\xa0\x06\0\x40\x04\0\0\xce\x27\0\0\x8b\x34\0\0\x09\xac\x06\0\
-\x70\x04\0\0\xce\x27\0\0\x59\x34\0\0\x09\xa0\x06\0\x80\x04\0\0\xce\x27\0\0\xe3\
-\x34\0\0\x09\xb0\x06\0\xb0\x04\0\0\xce\x27\0\0\xd0\x31\0\0\x09\xb4\x06\0\xe8\
-\x04\0\0\xce\x27\0\0\x59\x34\0\0\x09\xa0\x06\0\xf0\x04\0\0\xce\x27\0\0\x0f\x32\
-\0\0\x09\xb8\x06\0\x08\x05\0\0\xce\x27\0\0\x4c\x32\0\0\x15\xbc\x06\0\x18\x05\0\
-\0\xce\x27\0\0\x4c\x32\0\0\x13\xbc\x06\0\x20\x05\0\0\xce\x27\0\0\x37\x35\0\0\
-\x26\xc4\x06\0\x48\x05\0\0\xce\x27\0\0\xc0\x32\0\0\x0c\xc8\x06\0\x50\x05\0\0\
-\xce\x27\0\0\xd1\x32\0\0\x2b\xcc\x06\0\x98\x05\0\0\xce\x27\0\0\x85\x35\0\0\x0d\
-\xe0\x06\0\xb8\x05\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\xe0\x01\0\xc8\x05\0\0\xce\
-\x27\0\0\x40\x33\0\0\x16\xe4\x01\0\xd0\x05\0\0\xce\x27\0\0\x40\x33\0\0\x0d\xe4\
-\x01\0\xe8\x05\0\0\xce\x27\0\0\x40\x33\0\0\x08\xe4\x01\0\xf0\x05\0\0\xce\x27\0\
-\0\x71\x33\0\0\x17\xf0\x01\0\xf8\x05\0\0\xce\x27\0\0\x8d\x33\0\0\x17\xec\x01\0\
-\0\x06\0\0\xce\x27\0\0\xa9\x33\0\0\x24\xf4\x01\0\x30\x06\0\0\xce\x27\0\0\xec\
-\x33\0\0\x26\0\x02\0\x60\x06\0\0\xce\x27\0\0\x20\x2b\0\0\x08\x04\x02\0\x78\x06\
-\0\0\xce\x27\0\0\xb4\x3a\0\0\x16\x80\x06\0\x98\x06\0\0\xce\x27\0\0\0\0\0\0\0\0\
-\0\0\xa0\x06\0\0\xce\x27\0\0\xe6\x35\0\0\x0d\x84\x06\0\xc8\x06\0\0\xce\x27\0\0\
-\x9e\x28\0\0\x0f\xe0\x01\0\xd8\x06\0\0\xce\x27\0\0\x40\x33\0\0\x16\xe4\x01\0\
-\xe0\x06\0\0\xce\x27\0\0\x40\x33\0\0\x0d\xe4\x01\0\xf8\x06\0\0\xce\x27\0\0\x40\
-\x33\0\0\x08\xe4\x01\0\0\x07\0\0\xce\x27\0\0\x71\x33\0\0\x17\xf0\x01\0\x08\x07\
-\0\0\xce\x27\0\0\x8d\x33\0\0\x17\xec\x01\0\x10\x07\0\0\xce\x27\0\0\xa9\x33\0\0\
-\x24\xf4\x01\0\x30\x07\0\0\xce\x27\0\0\xec\x33\0\0\x26\0\x02\0\x60\x07\0\0\xce\
-\x27\0\0\x20\x2b\0\0\x08\x04\x02\0\x78\x07\0\0\xce\x27\0\0\xb4\x3a\0\0\x16\xf4\
-\x06\0\x98\x07\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xa0\x07\0\0\xce\x27\0\0\x26\x36\
-\0\0\x0d\xf8\x06\0\xc8\x07\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\xe0\x01\0\xd0\x07\0\
-\0\xce\x27\0\0\x40\x33\0\0\x16\xe4\x01\0\xd8\x07\0\0\xce\x27\0\0\x40\x33\0\0\
-\x0d\xe4\x01\0\xf0\x07\0\0\xce\x27\0\0\x40\x33\0\0\x08\xe4\x01\0\xf8\x07\0\0\
-\xce\x27\0\0\x71\x33\0\0\x17\xf0\x01\0\0\x08\0\0\xce\x27\0\0\x8d\x33\0\0\x17\
-\xec\x01\0\x08\x08\0\0\xce\x27\0\0\xa9\x33\0\0\x24\xf4\x01\0\x28\x08\0\0\xce\
-\x27\0\0\xec\x33\0\0\x26\0\x02\0\x58\x08\0\0\xce\x27\0\0\x20\x2b\0\0\x08\x04\
-\x02\0\x68\x08\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\x78\x08\0\0\xce\x27\0\
-\0\x7d\x36\0\0\x10\x18\x02\0\x88\x08\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\
-\xd8\x08\0\0\xce\x27\0\0\xc9\x36\0\0\x09\x24\x02\0\xf8\x08\0\0\xce\x27\0\0\x0e\
-\x37\0\0\x12\x28\x02\0\0\x09\0\0\xce\x27\0\0\x2a\x37\0\0\x1a\x2c\x02\0\x08\x09\
-\0\0\xce\x27\0\0\x2a\x37\0\0\x13\x2c\x02\0\x10\x09\0\0\xce\x27\0\0\x48\x37\0\0\
-\x1c\x30\x02\0\x18\x09\0\0\xce\x27\0\0\x48\x37\0\0\x15\x30\x02\0\x20\x09\0\0\
-\xce\x27\0\0\x6a\x37\0\0\x1c\x34\x02\0\x28\x09\0\0\xce\x27\0\0\x6a\x37\0\0\x15\
-\x34\x02\0\x30\x09\0\0\xce\x27\0\0\x8c\x37\0\0\x28\x38\x02\0\x38\x09\0\0\xce\
-\x27\0\0\x8c\x37\0\0\x21\x38\x02\0\x40\x09\0\0\xce\x27\0\0\xba\x37\0\0\x28\x3c\
-\x02\0\x48\x09\0\0\xce\x27\0\0\xba\x37\0\0\x21\x3c\x02\0\x50\x09\0\0\xce\x27\0\
-\0\xe8\x37\0\0\x09\x40\x02\0\x68\x09\0\0\xce\x27\0\0\x0c\x38\0\0\x1c\x48\x02\0\
-\x78\x09\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\x80\x09\0\0\xce\x27\0\0\x2e\
-\x38\0\0\x09\x4c\x02\0\xa0\x09\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\xa8\
-\x09\0\0\xce\x27\0\0\x7d\x36\0\0\x10\x18\x02\0\xb8\x09\0\0\xce\x27\0\0\x94\x36\
-\0\0\x05\x14\x02\0\x08\x0a\0\0\xce\x27\0\0\x6c\x38\0\0\x09\x58\x02\0\x28\x0a\0\
-\0\xce\x27\0\0\xb1\x38\0\0\x12\x5c\x02\0\x30\x0a\0\0\xce\x27\0\0\xce\x38\0\0\
-\x1a\x60\x02\0\x38\x0a\0\0\xce\x27\0\0\xce\x38\0\0\x13\x60\x02\0\x40\x0a\0\0\
-\xce\x27\0\0\xec\x38\0\0\x1c\x64\x02\0\x48\x0a\0\0\xce\x27\0\0\xec\x38\0\0\x15\
-\x64\x02\0\x50\x0a\0\0\xce\x27\0\0\x0e\x39\0\0\x1c\x68\x02\0\x58\x0a\0\0\xce\
-\x27\0\0\x0e\x39\0\0\x15\x68\x02\0\x60\x0a\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\
-\x02\0\x70\x0a\0\0\xce\x27\0\0\x30\x39\0\0\x09\x6c\x02\0\x90\x0a\0\0\xce\x27\0\
-\0\x66\x36\0\0\x10\x1c\x02\0\x98\x0a\0\0\xce\x27\0\0\x90\x39\0\0\x09\x70\x02\0\
-\xb8\x0a\0\0\xce\x27\0\0\xe8\x37\0\0\x09\x78\x02\0\xd0\x0a\0\0\xce\x27\0\0\x0c\
-\x38\0\0\x1c\x80\x02\0\xe0\x0a\0\0\xce\x27\0\0\xf0\x39\0\0\x09\x84\x02\0\x08\
-\x0b\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\x18\x0b\0\0\xce\x27\0\0\x7d\x36\
-\0\0\x10\x18\x02\0\x20\x0b\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\x70\x0b\0\
-\0\xce\x27\0\0\xc9\x36\0\0\x09\x24\x02\0\x90\x0b\0\0\xce\x27\0\0\x0e\x37\0\0\
-\x12\x28\x02\0\x98\x0b\0\0\xce\x27\0\0\x2a\x37\0\0\x1a\x2c\x02\0\xa0\x0b\0\0\
-\xce\x27\0\0\x2a\x37\0\0\x13\x2c\x02\0\xa8\x0b\0\0\xce\x27\0\0\x48\x37\0\0\x1c\
-\x30\x02\0\xb0\x0b\0\0\xce\x27\0\0\x48\x37\0\0\x15\x30\x02\0\xb8\x0b\0\0\xce\
-\x27\0\0\x6a\x37\0\0\x1c\x34\x02\0\xc0\x0b\0\0\xce\x27\0\0\x6a\x37\0\0\x15\x34\
-\x02\0\xc8\x0b\0\0\xce\x27\0\0\x8c\x37\0\0\x28\x38\x02\0\xd0\x0b\0\0\xce\x27\0\
-\0\x8c\x37\0\0\x21\x38\x02\0\xd8\x0b\0\0\xce\x27\0\0\xba\x37\0\0\x28\x3c\x02\0\
-\xe0\x0b\0\0\xce\x27\0\0\xba\x37\0\0\x21\x3c\x02\0\xe8\x0b\0\0\xce\x27\0\0\xe8\
-\x37\0\0\x09\x40\x02\0\0\x0c\0\0\xce\x27\0\0\x0c\x38\0\0\x1c\x48\x02\0\x10\x0c\
-\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\x28\x0c\0\0\xce\x27\0\0\x2e\x38\0\0\
-\x09\x4c\x02\0\x40\x0c\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\x50\x0c\0\0\
-\xce\x27\0\0\x7d\x36\0\0\x10\x18\x02\0\x58\x0c\0\0\xce\x27\0\0\x94\x36\0\0\x05\
-\x14\x02\0\xa8\x0c\0\0\xce\x27\0\0\x6c\x38\0\0\x09\x58\x02\0\xc8\x0c\0\0\xce\
-\x27\0\0\xb1\x38\0\0\x12\x5c\x02\0\xd0\x0c\0\0\xce\x27\0\0\xce\x38\0\0\x1a\x60\
-\x02\0\xd8\x0c\0\0\xce\x27\0\0\xce\x38\0\0\x13\x60\x02\0\xe0\x0c\0\0\xce\x27\0\
-\0\xec\x38\0\0\x1c\x64\x02\0\xe8\x0c\0\0\xce\x27\0\0\xec\x38\0\0\x15\x64\x02\0\
-\xf0\x0c\0\0\xce\x27\0\0\x0e\x39\0\0\x1c\x68\x02\0\xf8\x0c\0\0\xce\x27\0\0\x0e\
-\x39\0\0\x15\x68\x02\0\0\x0d\0\0\xce\x27\0\0\x94\x36\0\0\x05\x14\x02\0\x10\x0d\
-\0\0\xce\x27\0\0\x30\x39\0\0\x09\x6c\x02\0\x30\x0d\0\0\xce\x27\0\0\x66\x36\0\0\
-\x10\x1c\x02\0\x38\x0d\0\0\xce\x27\0\0\x90\x39\0\0\x09\x70\x02\0\x58\x0d\0\0\
-\xce\x27\0\0\xe8\x37\0\0\x09\x78\x02\0\x70\x0d\0\0\xce\x27\0\0\x0c\x38\0\0\x1c\
-\x80\x02\0\x80\x0d\0\0\xce\x27\0\0\x66\x36\0\0\x10\x1c\x02\0\x88\x0d\0\0\xce\
-\x27\0\0\xf0\x39\0\0\x09\x84\x02\0\xa0\x0d\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xb0\
-\x0d\0\0\xce\x27\0\0\x5e\x3a\0\0\x05\xf8\x05\0\x0e\x47\0\0\x0a\0\0\0\0\0\0\0\
-\xce\x27\0\0\xd4\x3a\0\0\x05\x1c\x07\0\x10\0\0\0\xce\x27\0\0\x04\x3b\0\0\x14\
-\xc8\0\0\x20\0\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\xd4\0\0\x28\0\0\0\xce\x27\0\0\
-\x33\x3b\0\0\x19\xd0\0\0\x38\0\0\0\xce\x27\0\0\x53\x3b\0\0\x08\xe8\0\0\x40\0\0\
-\0\xce\x27\0\0\x65\x3b\0\0\x24\xf4\0\0\x80\0\0\0\xce\x27\0\0\x8a\x3b\0\0\x05\
-\x08\x01\0\x98\0\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\xce\x27\0\0\xc2\x3b\
-\0\0\x05\x10\x01\0\xd0\0\0\0\xce\x27\0\0\xd4\x3a\0\0\x05\x1c\x07\0\x24\x47\0\0\
-\x0a\0\0\0\0\0\0\0\xce\x27\0\0\x01\x3c\0\0\x05\x34\x07\0\x10\0\0\0\xce\x27\0\0\
-\x04\x3b\0\0\x14\xc8\0\0\x20\0\0\0\xce\x27\0\0\x9e\x28\0\0\x0f\xd4\0\0\x28\0\0\
-\0\xce\x27\0\0\x33\x3b\0\0\x19\xd0\0\0\x38\0\0\0\xce\x27\0\0\x53\x3b\0\0\x08\
-\xe8\0\0\x40\0\0\0\xce\x27\0\0\x65\x3b\0\0\x24\xf4\0\0\x80\0\0\0\xce\x27\0\0\
-\x8a\x3b\0\0\x05\x08\x01\0\x98\0\0\0\xce\x27\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\xce\
-\x27\0\0\xc2\x3b\0\0\x05\x10\x01\0\xd0\0\0\0\xce\x27\0\0\x01\x3c\0\0\x05\x34\
-\x07\0\x3a\x47\0\0\x03\0\0\0\0\0\0\0\xce\x27\0\0\x31\x3c\0\0\x05\x4c\x07\0\x08\
-\0\0\0\xce\x27\0\0\x68\x3c\0\0\x0c\x54\x07\0\x10\0\0\0\xce\x27\0\0\x31\x3c\0\0\
-\x05\x4c\x07\0\x57\x47\0\0\x0a\0\0\0\0\0\0\0\xce\x27\0\0\x95\x3c\0\0\x05\x64\
-\x07\0\x10\0\0\0\xce\x27\0\0\x04\x3b\0\0\x14\xc8\0\0\x20\0\0\0\xce\x27\0\0\x9e\
-\x28\0\0\x0f\xd4\0\0\x28\0\0\0\xce\x27\0\0\x33\x3b\0\0\x19\xd0\0\0\x38\0\0\0\
-\xce\x27\0\0\x53\x3b\0\0\x08\xe8\0\0\x40\0\0\0\xce\x27\0\0\x65\x3b\0\0\x24\xf4\
-\0\0\x80\0\0\0\xce\x27\0\0\x8a\x3b\0\0\x05\x08\x01\0\x98\0\0\0\xce\x27\0\0\0\0\
-\0\0\0\0\0\0\xb0\0\0\0\xce\x27\0\0\xc2\x3b\0\0\x05\x10\x01\0\xd0\0\0\0\xce\x27\
-\0\0\x95\x3c\0\0\x05\x64\x07\0\x6d\x47\0\0\x0a\0\0\0\0\0\0\0\xce\x27\0\0\xca\
-\x3c\0\0\x05\x7c\x07\0\x10\0\0\0\xce\x27\0\0\x04\x3b\0\0\x14\xc8\0\0\x20\0\0\0\
-\xce\x27\0\0\x9e\x28\0\0\x0f\xd4\0\0\x28\0\0\0\xce\x27\0\0\x33\x3b\0\0\x19\xd0\
-\0\0\x38\0\0\0\xce\x27\0\0\x53\x3b\0\0\x08\xe8\0\0\x40\0\0\0\xce\x27\0\0\x65\
-\x3b\0\0\x24\xf4\0\0\x80\0\0\0\xce\x27\0\0\x8a\x3b\0\0\x05\x08\x01\0\x98\0\0\0\
-\xce\x27\0\0\0\0\0\0\0\0\0\0\xb0\0\0\0\xce\x27\0\0\xc2\x3b\0\0\x05\x10\x01\0\
-\xd0\0\0\0\xce\x27\0\0\xca\x3c\0\0\x05\x7c\x07\0\x83\x47\0\0\x03\0\0\0\0\0\0\0\
-\xce\x27\0\0\xff\x3c\0\0\x05\x94\x07\0\x08\0\0\0\xce\x27\0\0\x68\x3c\0\0\x0c\
-\x9c\x07\0\x10\0\0\0\xce\x27\0\0\xff\x3c\0\0\x05\x94\x07\0\xa0\x47\0\0\x13\0\0\
-\0\0\0\0\0\xce\x27\0\0\x3b\x3d\0\0\x05\xac\x07\0\x08\0\0\0\xce\x27\0\0\x60\x3d\
-\0\0\x25\xc4\x07\0\x38\0\0\0\xce\x27\0\0\xac\x3d\0\0\x08\xc8\x07\0\x48\0\0\0\
-\xce\x27\0\0\xbb\x3d\0\0\x09\xd8\x07\0\x78\0\0\0\xce\x27\0\0\xf4\x3d\0\0\x09\
-\xdc\x07\0\xa8\0\0\0\xce\x27\0\0\x32\x3e\0\0\x10\xe4\x07\0\xf8\0\0\0\xce\x27\0\
-\0\0\0\0\0\0\0\0\0\0\x01\0\0\xce\x27\0\0\x69\x3e\0\0\x0c\xf8\x07\0\x20\x01\0\0\
-\xce\x27\0\0\x69\x3e\0\0\x0c\xf8\x07\0\x30\x01\0\0\xce\x27\0\0\xba\x3e\0\0\x08\
-\x0c\x08\0\x48\x01\0\0\xce\x27\0\0\xcc\x3e\0\0\x0d\x14\x08\0\x60\x01\0\0\xce\
-\x27\0\0\xe2\x3e\0\0\x0d\x1c\x08\0\x78\x01\0\0\xce\x27\0\0\xf9\x3e\0\0\x0d\x24\
-\x08\0\x90\x01\0\0\xce\x27\0\0\x10\x3f\0\0\x0d\x2c\x08\0\xa8\x01\0\0\xce\x27\0\
-\0\x27\x3f\0\0\x0d\x34\x08\0\xd0\x01\0\0\xce\x27\0\0\x3f\x3f\0\0\x05\x50\x08\0\
-\xe8\x01\0\0\xce\x27\0\0\x3f\x3f\0\0\x17\x50\x08\0\0\x02\0\0\xce\x27\0\0\x5b\
-\x3f\0\0\x05\x54\x08\0\x38\x02\0\0\xce\x27\0\0\x3b\x3d\0\0\x05\xac\x07\0\xbb\
-\x47\0\0\x19\0\0\0\0\0\0\0\xce\x27\0\0\x94\x3f\0\0\x24\x70\x08\0\x30\0\0\0\xce\
-\x27\0\0\xdf\x3f\0\0\x08\x74\x08\0\x38\0\0\0\xce\x27\0\0\xed\x3f\0\0\x09\x78\
-\x08\0\x68\0\0\0\xce\x27\0\0\x21\x40\0\0\x25\x88\x08\0\x90\0\0\0\xce\x27\0\0\
-\x20\x2b\0\0\x08\x8c\x08\0\x98\0\0\0\xce\x27\0\0\x8c\x40\0\0\x09\x90\x08\0\xc0\
-\0\0\0\xce\x27\0\0\xbf\x40\0\0\x05\x9c\x08\0\0\x01\0\0\xce\x27\0\0\xf3\x40\0\0\
-\x19\xa8\x08\0\x08\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x17\xa8\x08\0\x10\x01\0\0\
-\xce\x27\0\0\xf3\x40\0\0\x19\xa8\x08\0\x18\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x17\
-\xa8\x08\0\x20\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x19\xa8\x08\0\x28\x01\0\0\xce\
-\x27\0\0\xf3\x40\0\0\x17\xa8\x08\0\x30\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x19\xa8\
-\x08\0\x38\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x17\xa8\x08\0\x40\x01\0\0\xce\x27\0\
-\0\xf3\x40\0\0\x19\xa8\x08\0\x48\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x17\xa8\x08\0\
-\x50\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x19\xa8\x08\0\x58\x01\0\0\xce\x27\0\0\xf3\
-\x40\0\0\x17\xa8\x08\0\x60\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x19\xa8\x08\0\x68\
-\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x17\xa8\x08\0\x70\x01\0\0\xce\x27\0\0\xf3\x40\
-\0\0\x19\xa8\x08\0\x78\x01\0\0\xce\x27\0\0\xf3\x40\0\0\x17\xa8\x08\0\x80\x01\0\
-\0\xce\x27\0\0\x19\x41\0\0\x05\xb0\x08\0\x98\x01\0\0\xce\x27\0\0\x3a\x41\0\0\
-\x01\xbc\x08\0\x10\0\0\0\xa5\x46\0\0\x08\0\0\0\x10\0\0\0\x79\0\0\0\x3d\x46\0\0\
-\0\0\0\0\xc0\x01\0\0\x79\0\0\0\x29\x46\0\0\0\0\0\0\x08\x02\0\0\x79\0\0\0\x33\
-\x46\0\0\0\0\0\0\x50\x02\0\0\x79\0\0\0\x23\x46\0\0\0\0\0\0\xa0\x02\0\0\x79\0\0\
-\0\x4d\x46\0\0\0\0\0\0\xe8\x02\0\0\x79\0\0\0\x43\x46\0\0\0\0\0\0\x38\x03\0\0\
-\x79\0\0\0\x6f\x46\0\0\0\0\0\0\x68\x03\0\0\x79\0\0\0\x7a\x46\0\0\0\0\0\0\xab\
-\x46\0\0\x0a\0\0\0\x68\0\0\0\x3a\0\0\0\x1b\x46\0\0\0\0\0\0\xa8\0\0\0\x6e\0\0\0\
-\x1f\x46\0\0\0\0\0\0\xb0\0\0\0\x79\0\0\0\x23\x46\0\0\0\0\0\0\xe8\0\0\0\x79\0\0\
-\0\x29\x46\0\0\0\0\0\0\x20\x01\0\0\x79\0\0\0\x33\x46\0\0\0\0\0\0\x58\x01\0\0\
-\x79\0\0\0\x3d\x46\0\0\0\0\0\0\x30\x03\0\0\x79\0\0\0\x43\x46\0\0\0\0\0\0\x68\
-\x03\0\0\x79\0\0\0\x4d\x46\0\0\0\0\0\0\xd8\x03\0\0\x79\0\0\0\x57\x46\0\0\0\0\0\
-\0\x08\x04\0\0\x79\0\0\0\x5e\x46\0\0\0\0\0\0\xcd\x46\0\0\x01\0\0\0\0\0\0\0\x01\
-\x01\0\0\x65\x46\0\0\0\0\0\0\xe0\x46\0\0\x0a\0\0\0\0\0\0\0\x01\x01\0\0\x6a\x46\
-\0\0\0\0\0\0\xc0\0\0\0\x79\0\0\0\x23\x46\0\0\0\0\0\0\x80\x01\0\0\x79\0\0\0\x4d\
-\x46\0\0\0\0\0\0\xb8\x01\0\0\x79\0\0\0\x43\x46\0\0\0\0\0\0\xf0\x01\0\0\x79\0\0\
-\0\x29\x46\0\0\0\0\0\0\x28\x02\0\0\x79\0\0\0\x33\x46\0\0\0\0\0\0\x60\x04\0\0\
-\x79\0\0\0\x6f\x46\0\0\0\0\0\0\xa0\x04\0\0\x79\0\0\0\x7a\x46\0\0\0\0\0\0\xe0\
-\x04\0\0\x79\0\0\0\x29\x46\0\0\0\0\0\0\x18\x05\0\0\x79\0\0\0\x33\x46\0\0\0\0\0\
-\0\xf6\x46\0\0\x0b\0\0\0\0\0\0\0\x01\x01\0\0\x85\x46\0\0\0\0\0\0\x38\0\0\0\x01\
-\x01\0\0\x65\x46\0\0\0\0\0\0\x78\0\0\0\x79\0\0\0\x23\x46\0\0\0\0\0\0\x38\x01\0\
-\0\x79\0\0\0\x4d\x46\0\0\0\0\0\0\x70\x01\0\0\x79\0\0\0\x43\x46\0\0\0\0\0\0\xa8\
-\x01\0\0\x79\0\0\0\x29\x46\0\0\0\0\0\0\xe0\x01\0\0\x79\0\0\0\x33\x46\0\0\0\0\0\
-\0\x18\x04\0\0\x79\0\0\0\x6f\x46\0\0\0\0\0\0\x58\x04\0\0\x79\0\0\0\x7a\x46\0\0\
-\0\0\0\0\x98\x04\0\0\x79\0\0\0\x29\x46\0\0\0\0\0\0\xd0\x04\0\0\x79\0\0\0\x33\
-\x46\0\0\0\0\0\0\x0e\x47\0\0\x01\0\0\0\0\0\0\0\x01\x01\0\0\x65\x46\0\0\0\0\0\0\
-\x24\x47\0\0\x01\0\0\0\0\0\0\0\x01\x01\0\0\x65\x46\0\0\0\0\0\0\x3a\x47\0\0\x01\
-\0\0\0\0\0\0\0\x01\x01\0\0\x65\x46\0\0\0\0\0\0\xa0\x47\0\0\x01\0\0\0\xe0\0\0\0\
-\x0f\x01\0\0\x8a\x46\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\
-\0\0\0\x69\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x09\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\x06\0\0\0\0\0\0\xd0\
-\x08\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x11\0\0\
-\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x0f\0\0\0\0\0\0\xc0\x03\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\0\0\0\x01\0\0\0\
-\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x13\0\0\0\0\0\0\x88\x04\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x39\0\0\0\x01\0\0\0\x06\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xc8\x17\0\0\0\0\0\0\x70\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4c\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x38\x18\0\0\0\0\0\0\x30\x0e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x62\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x68\x26\0\0\0\0\0\0\xc0\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x7a\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x28\x34\0\0\
-\0\0\0\0\xe0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x90\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\x35\0\0\0\0\0\0\xe0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa6\0\0\0\x01\
-\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x35\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc3\0\0\0\x01\0\0\0\x06\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\x36\0\0\0\0\0\0\xe0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd9\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\xe8\x36\0\0\0\0\0\0\xe0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\xef\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xc8\x37\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x0c\x01\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x37\0\0\
-\0\0\0\0\x48\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x27\x01\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x30\x3a\0\0\0\0\0\0\
-\xa8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x32\x01\
-\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd8\x3b\0\0\0\0\0\0\x0d\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3a\x01\0\0\x01\0\0\
-\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe8\x3b\0\0\0\0\0\0\x96\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x42\x01\0\0\x01\0\0\0\x03\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x80\x3c\0\0\0\0\0\0\xe0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x06\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x60\x3d\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x02\0\0\0\x03\0\0\0\x08\0\0\
-\0\0\0\0\0\x10\0\0\0\0\0\0\0\x10\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\x90\x3d\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\
-\0\0\x10\0\0\0\0\0\0\0\x36\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\xb0\x3d\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x02\0\0\0\x05\0\0\0\x08\0\0\0\0\0\0\0\
-\x10\0\0\0\0\0\0\0\x4d\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc0\
-\x3d\0\0\0\0\0\0\x10\x01\0\0\0\0\0\0\x02\0\0\0\x06\0\0\0\x08\0\0\0\0\0\0\0\x10\
-\0\0\0\0\0\0\0\x67\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x3e\
-\0\0\0\0\0\0\xf0\0\0\0\0\0\0\0\x02\0\0\0\x07\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\
-\0\0\0\0\x83\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc0\x3f\0\0\0\
-\0\0\0\x10\0\0\0\0\0\0\0\x02\0\0\0\x08\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\
-\0\x9d\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x3f\0\0\0\0\0\0\
-\x10\0\0\0\0\0\0\0\x02\0\0\0\x09\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xb7\
-\x05\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x3f\0\0\0\0\0\0\x10\0\
-\0\0\0\0\0\0\x02\0\0\0\x0a\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xd8\x05\0\
-\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf0\x3f\0\0\0\0\0\0\x10\0\0\0\0\
-\0\0\0\x02\0\0\0\x0b\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xf2\x05\0\0\x09\
-\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\
-\x02\0\0\0\x0c\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x0c\x06\0\0\x09\0\0\0\
-\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\x40\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x02\0\
-\0\0\x0d\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x2d\x06\0\0\x09\0\0\0\x40\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x20\x40\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\x02\0\0\0\
-\x0e\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x4c\x06\0\0\x09\0\0\0\x40\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\xa0\x40\0\0\0\0\0\0\x50\0\0\0\0\0\0\0\x02\0\0\0\x0f\0\
-\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x5b\x06\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\xf0\x40\0\0\0\0\0\0\x8a\x87\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x60\x06\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x80\xc8\0\0\0\0\0\0\x7c\x26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0";
-
- *sz = sizeof(data) - 1;
- return (const void *)data;
-}
-
-#ifdef __cplusplus
-struct net_stats_bpf *net_stats_bpf::open(const struct bpf_object_open_opts *opts) { return net_stats_bpf__open_opts(opts); }
-struct net_stats_bpf *net_stats_bpf::open_and_load() { return net_stats_bpf__open_and_load(); }
-int net_stats_bpf::load(struct net_stats_bpf *skel) { return net_stats_bpf__load(skel); }
-int net_stats_bpf::attach(struct net_stats_bpf *skel) { return net_stats_bpf__attach(skel); }
-void net_stats_bpf::detach(struct net_stats_bpf *skel) { net_stats_bpf__detach(skel); }
-void net_stats_bpf::destroy(struct net_stats_bpf *skel) { net_stats_bpf__destroy(skel); }
-const void *net_stats_bpf::elf_bytes(size_t *sz) { return net_stats_bpf__elf_bytes(sz); }
-#endif /* __cplusplus */
-
-__attribute__((unused)) static void
-net_stats_bpf__assert(struct net_stats_bpf *s __attribute__((unused)))
-{
-#ifdef __cplusplus
-#define _Static_assert static_assert
-#endif
- _Static_assert(sizeof(s->rodata->zero) == 4, "unexpected size of 'zero'");
-#ifdef __cplusplus
-#undef _Static_assert
-#endif
-}
-
-#endif /* __NET_STATS_BPF_SKEL_H__ */
diff --git a/.output/net_stats.tmp.bpf.o b/.output/net_stats.tmp.bpf.o
deleted file mode 100644
index 91f0b86..0000000
Binary files a/.output/net_stats.tmp.bpf.o and /dev/null differ
diff --git a/.output/os_spy.o b/.output/os_spy.o
deleted file mode 100644
index fe81f68..0000000
Binary files a/.output/os_spy.o and /dev/null differ
diff --git a/.output/pkgconfig/libbpf.pc b/.output/pkgconfig/libbpf.pc
index 1164a97..c0977ec 100644
--- a/.output/pkgconfig/libbpf.pc
+++ b/.output/pkgconfig/libbpf.pc
@@ -6,7 +6,7 @@ includedir=${prefix}/include
Name: libbpf
Description: BPF library
-Version: 1.5.0
+Version: 1.6.0
Libs: -L${libdir} -lbpf
Requires.private: libelf zlib
Cflags: -I${includedir}
diff --git a/.output/scx_nest.bpf.o b/.output/scx_nest.bpf.o
new file mode 100644
index 0000000..73ac85e
Binary files /dev/null and b/.output/scx_nest.bpf.o differ
diff --git a/.output/scx_nest.skel.h b/.output/scx_nest.skel.h
new file mode 100644
index 0000000..1733a06
--- /dev/null
+++ b/.output/scx_nest.skel.h
@@ -0,0 +1,3634 @@
+/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
+
+/* THIS FILE IS AUTOGENERATED BY BPFTOOL! */
+#ifndef __SCX_NEST_BPF_SKEL_H__
+#define __SCX_NEST_BPF_SKEL_H__
+
+#include
+#include
+#include
+
+#define BPF_SKEL_SUPPORTS_MAP_AUTO_ATTACH 1
+
+struct scx_nest_bpf {
+ struct bpf_object_skeleton *skeleton;
+ struct bpf_object *obj;
+ struct {
+ struct bpf_map *cpu_mask_buffer;
+ struct bpf_map *task_ctx_stor;
+ struct bpf_map *pcpu_ctxs;
+ struct bpf_map *stats_timer;
+ struct bpf_map *template_map;
+ struct bpf_map *fliter_map;
+ struct bpf_map *comm_ignore_map;
+ struct bpf_map *comm_attention_map;
+ struct bpf_map *id_ignore_map;
+ struct bpf_map *id_attention_map;
+ struct bpf_map *stats;
+ struct bpf_map *rodata;
+ struct bpf_map *bss;
+ struct bpf_map *data_uei_dump;
+ struct bpf_map *data;
+ struct bpf_map *data_NESTS;
+ struct bpf_map *nest_ops;
+ } maps;
+ struct {
+ struct scx_nest_bpf__nest_ops__sched_ext_ops {
+ struct bpf_program *select_cpu;
+ struct bpf_program *enqueue;
+ struct bpf_program *dequeue;
+ struct bpf_program *dispatch;
+ struct bpf_program *tick;
+ struct bpf_program *runnable;
+ struct bpf_program *running;
+ struct bpf_program *stopping;
+ struct bpf_program *quiescent;
+ struct bpf_program *yield;
+ struct bpf_program *core_sched_before;
+ struct bpf_program *set_weight;
+ struct bpf_program *set_cpumask;
+ struct bpf_program *update_idle;
+ struct bpf_program *cpu_acquire;
+ struct bpf_program *cpu_release;
+ struct bpf_program *init_task;
+ struct bpf_program *exit_task;
+ struct bpf_program *enable;
+ struct bpf_program *disable;
+ struct bpf_program *dump;
+ struct bpf_program *dump_cpu;
+ struct bpf_program *dump_task;
+ struct bpf_program *cgroup_init;
+ struct bpf_program *cgroup_exit;
+ struct bpf_program *cgroup_prep_move;
+ struct bpf_program *cgroup_move;
+ struct bpf_program *cgroup_cancel_move;
+ struct bpf_program *cgroup_set_weight;
+ struct bpf_program *cpu_online;
+ struct bpf_program *cpu_offline;
+ struct bpf_program *init;
+ struct bpf_program *exit;
+ unsigned int dispatch_max_batch;
+ char __padding_34[4];
+ unsigned long long flags;
+ unsigned int timeout_ms;
+ unsigned int exit_dump_len;
+ unsigned long long hotplug_seq;
+ char __unsupported_38[128];
+ } *nest_ops;
+ } struct_ops;
+ struct {
+ struct bpf_program *nest_select_cpu;
+ struct bpf_program *nest_enqueue;
+ struct bpf_program *nest_dispatch;
+ struct bpf_program *nest_running;
+ struct bpf_program *nest_stopping;
+ struct bpf_program *nest_init_task;
+ struct bpf_program *nest_enable;
+ struct bpf_program *nest_init;
+ struct bpf_program *nest_exit;
+ struct bpf_program *handle_cpu_mask_event;
+ } progs;
+ struct {
+ struct bpf_link *nest_select_cpu;
+ struct bpf_link *nest_enqueue;
+ struct bpf_link *nest_dispatch;
+ struct bpf_link *nest_running;
+ struct bpf_link *nest_stopping;
+ struct bpf_link *nest_init_task;
+ struct bpf_link *nest_enable;
+ struct bpf_link *nest_init;
+ struct bpf_link *nest_exit;
+ struct bpf_link *handle_cpu_mask_event;
+ struct bpf_link *nest_ops;
+ } links;
+ struct scx_nest_bpf__rodata {
+ u64 p_remove_ns;
+ u64 r_max;
+ u64 r_impatient;
+ u64 slice_ns;
+ bool find_fully_idle;
+ char __pad0[7];
+ u64 sampling_cadence_ns;
+ u64 r_depth;
+ bool filter_by_tgid;
+ u32 nr_cpus;
+ char __pad1[36];
+ u32 uei_dump_len;
+ } *rodata;
+ struct scx_nest_bpf__bss {
+ u64 stats_primary_mask;
+ u64 stats_reserved_mask;
+ u64 stats_other_mask;
+ u64 stats_idle_mask;
+ } *bss;
+ struct scx_nest_bpf__data_uei_dump {
+ char uei_dump[1];
+ } *data_uei_dump;
+ struct scx_nest_bpf__data {
+ struct user_exit_info uei;
+ } *data;
+
+#ifdef __cplusplus
+ static inline struct scx_nest_bpf *open(const struct bpf_object_open_opts *opts = nullptr);
+ static inline struct scx_nest_bpf *open_and_load();
+ static inline int load(struct scx_nest_bpf *skel);
+ static inline int attach(struct scx_nest_bpf *skel);
+ static inline void detach(struct scx_nest_bpf *skel);
+ static inline void destroy(struct scx_nest_bpf *skel);
+ static inline const void *elf_bytes(size_t *sz);
+#endif /* __cplusplus */
+};
+
+static void
+scx_nest_bpf__destroy(struct scx_nest_bpf *obj)
+{
+ if (!obj)
+ return;
+ if (obj->skeleton)
+ bpf_object__destroy_skeleton(obj->skeleton);
+ free(obj);
+}
+
+static inline int
+scx_nest_bpf__create_skeleton(struct scx_nest_bpf *obj);
+
+static inline struct scx_nest_bpf *
+scx_nest_bpf__open_opts(const struct bpf_object_open_opts *opts)
+{
+ struct scx_nest_bpf *obj;
+ int err;
+
+ obj = (struct scx_nest_bpf *)calloc(1, sizeof(*obj));
+ if (!obj) {
+ errno = ENOMEM;
+ return NULL;
+ }
+
+ err = scx_nest_bpf__create_skeleton(obj);
+ if (err)
+ goto err_out;
+
+ err = bpf_object__open_skeleton(obj->skeleton, opts);
+ if (err)
+ goto err_out;
+
+ obj->struct_ops.nest_ops = (__typeof__(obj->struct_ops.nest_ops))
+ bpf_map__initial_value(obj->maps.nest_ops, NULL);
+
+ return obj;
+err_out:
+ scx_nest_bpf__destroy(obj);
+ errno = -err;
+ return NULL;
+}
+
+static inline struct scx_nest_bpf *
+scx_nest_bpf__open(void)
+{
+ return scx_nest_bpf__open_opts(NULL);
+}
+
+static inline int
+scx_nest_bpf__load(struct scx_nest_bpf *obj)
+{
+ return bpf_object__load_skeleton(obj->skeleton);
+}
+
+static inline struct scx_nest_bpf *
+scx_nest_bpf__open_and_load(void)
+{
+ struct scx_nest_bpf *obj;
+ int err;
+
+ obj = scx_nest_bpf__open();
+ if (!obj)
+ return NULL;
+ err = scx_nest_bpf__load(obj);
+ if (err) {
+ scx_nest_bpf__destroy(obj);
+ errno = -err;
+ return NULL;
+ }
+ return obj;
+}
+
+static inline int
+scx_nest_bpf__attach(struct scx_nest_bpf *obj)
+{
+ return bpf_object__attach_skeleton(obj->skeleton);
+}
+
+static inline void
+scx_nest_bpf__detach(struct scx_nest_bpf *obj)
+{
+ bpf_object__detach_skeleton(obj->skeleton);
+}
+
+static inline const void *scx_nest_bpf__elf_bytes(size_t *sz);
+
+static inline int
+scx_nest_bpf__create_skeleton(struct scx_nest_bpf *obj)
+{
+ struct bpf_object_skeleton *s;
+ struct bpf_map_skeleton *map __attribute__((unused));
+ int err;
+
+ s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));
+ if (!s) {
+ err = -ENOMEM;
+ goto err;
+ }
+
+ s->sz = sizeof(*s);
+ s->name = "scx_nest_bpf";
+ s->obj = &obj->obj;
+
+ /* maps */
+ s->map_cnt = 17;
+ s->map_skel_sz = 32;
+ s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt,
+ sizeof(*s->maps) > 32 ? sizeof(*s->maps) : 32);
+ if (!s->maps) {
+ err = -ENOMEM;
+ goto err;
+ }
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 0 * s->map_skel_sz);
+ map->name = "cpu_mask_buffer";
+ map->map = &obj->maps.cpu_mask_buffer;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 1 * s->map_skel_sz);
+ map->name = "task_ctx_stor";
+ map->map = &obj->maps.task_ctx_stor;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 2 * s->map_skel_sz);
+ map->name = "pcpu_ctxs";
+ map->map = &obj->maps.pcpu_ctxs;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 3 * s->map_skel_sz);
+ map->name = "stats_timer";
+ map->map = &obj->maps.stats_timer;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 4 * s->map_skel_sz);
+ map->name = "template_map";
+ map->map = &obj->maps.template_map;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 5 * s->map_skel_sz);
+ map->name = "fliter_map";
+ map->map = &obj->maps.fliter_map;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 6 * s->map_skel_sz);
+ map->name = "comm_ignore_map";
+ map->map = &obj->maps.comm_ignore_map;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 7 * s->map_skel_sz);
+ map->name = "comm_attention_map";
+ map->map = &obj->maps.comm_attention_map;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 8 * s->map_skel_sz);
+ map->name = "id_ignore_map";
+ map->map = &obj->maps.id_ignore_map;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 9 * s->map_skel_sz);
+ map->name = "id_attention_map";
+ map->map = &obj->maps.id_attention_map;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 10 * s->map_skel_sz);
+ map->name = "stats";
+ map->map = &obj->maps.stats;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 11 * s->map_skel_sz);
+ map->name = "scx_nest.rodata";
+ map->map = &obj->maps.rodata;
+ map->mmaped = (void **)&obj->rodata;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 12 * s->map_skel_sz);
+ map->name = "scx_nest.bss";
+ map->map = &obj->maps.bss;
+ map->mmaped = (void **)&obj->bss;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 13 * s->map_skel_sz);
+ map->name = ".data.uei_dump";
+ map->map = &obj->maps.data_uei_dump;
+ map->mmaped = (void **)&obj->data_uei_dump;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 14 * s->map_skel_sz);
+ map->name = "scx_nest.data";
+ map->map = &obj->maps.data;
+ map->mmaped = (void **)&obj->data;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 15 * s->map_skel_sz);
+ map->name = ".data.NESTS";
+ map->map = &obj->maps.data_NESTS;
+
+ map = (struct bpf_map_skeleton *)((char *)s->maps + 16 * s->map_skel_sz);
+ map->name = "nest_ops";
+ map->map = &obj->maps.nest_ops;
+ map->link = &obj->links.nest_ops;
+
+ /* programs */
+ s->prog_cnt = 10;
+ s->prog_skel_sz = sizeof(*s->progs);
+ s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);
+ if (!s->progs) {
+ err = -ENOMEM;
+ goto err;
+ }
+
+ s->progs[0].name = "nest_select_cpu";
+ s->progs[0].prog = &obj->progs.nest_select_cpu;
+ s->progs[0].link = &obj->links.nest_select_cpu;
+
+ s->progs[1].name = "nest_enqueue";
+ s->progs[1].prog = &obj->progs.nest_enqueue;
+ s->progs[1].link = &obj->links.nest_enqueue;
+
+ s->progs[2].name = "nest_dispatch";
+ s->progs[2].prog = &obj->progs.nest_dispatch;
+ s->progs[2].link = &obj->links.nest_dispatch;
+
+ s->progs[3].name = "nest_running";
+ s->progs[3].prog = &obj->progs.nest_running;
+ s->progs[3].link = &obj->links.nest_running;
+
+ s->progs[4].name = "nest_stopping";
+ s->progs[4].prog = &obj->progs.nest_stopping;
+ s->progs[4].link = &obj->links.nest_stopping;
+
+ s->progs[5].name = "nest_init_task";
+ s->progs[5].prog = &obj->progs.nest_init_task;
+ s->progs[5].link = &obj->links.nest_init_task;
+
+ s->progs[6].name = "nest_enable";
+ s->progs[6].prog = &obj->progs.nest_enable;
+ s->progs[6].link = &obj->links.nest_enable;
+
+ s->progs[7].name = "nest_init";
+ s->progs[7].prog = &obj->progs.nest_init;
+ s->progs[7].link = &obj->links.nest_init;
+
+ s->progs[8].name = "nest_exit";
+ s->progs[8].prog = &obj->progs.nest_exit;
+ s->progs[8].link = &obj->links.nest_exit;
+
+ s->progs[9].name = "handle_cpu_mask_event";
+ s->progs[9].prog = &obj->progs.handle_cpu_mask_event;
+ s->progs[9].link = &obj->links.handle_cpu_mask_event;
+
+ s->data = scx_nest_bpf__elf_bytes(&s->data_sz);
+
+ obj->skeleton = s;
+ return 0;
+err:
+ bpf_object__destroy_skeleton(s);
+ return err;
+}
+
+static inline const void *scx_nest_bpf__elf_bytes(size_t *sz)
+{
+ static const char data[] __attribute__((__aligned__(8))) = "\
+\x7f\x45\x4c\x46\x02\x01\x01\0\0\0\0\0\0\0\0\0\x01\0\xf7\0\x01\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x80\x32\x01\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\x40\0\x24\0\
+\x01\0\0\x2e\x73\x74\x72\x74\x61\x62\0\x2e\x73\x79\x6d\x74\x61\x62\0\x2e\x74\
+\x65\x78\x74\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\
+\x73\x65\x6c\x65\x63\x74\x5f\x63\x70\x75\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\
+\x73\x2f\x6e\x65\x73\x74\x5f\x65\x6e\x71\x75\x65\x75\x65\0\x73\x74\x72\x75\x63\
+\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\
+\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x72\x75\x6e\
+\x6e\x69\x6e\x67\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\
+\x5f\x73\x74\x6f\x70\x70\x69\x6e\x67\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\
+\x2f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\0\x73\x74\x72\x75\
+\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x65\x6e\x61\x62\x6c\x65\0\x73\
+\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2e\x73\x2f\x6e\x65\x73\x74\x5f\x69\x6e\
+\x69\x74\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x65\
+\x78\x69\x74\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x6c\x69\x63\x65\x6e\
+\x73\x65\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x6d\x61\x70\x73\0\x2e\x62\x73\x73\
+\0\x2e\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2e\x6c\x69\x6e\x6b\0\x2e\x64\
+\x61\x74\x61\x2e\x75\x65\x69\x5f\x64\x75\x6d\x70\0\x2e\x64\x61\x74\x61\0\x2e\
+\x64\x61\x74\x61\x2e\x4e\x45\x53\x54\x53\0\x73\x63\x78\x5f\x6e\x65\x73\x74\x2e\
+\x62\x70\x66\x2e\x63\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x73\x65\x6c\x65\x63\
+\x74\x5f\x63\x70\x75\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x63\x6f\x6d\x70\x61\x63\x74\
+\x5f\x70\x72\x69\x6d\x61\x72\x79\x5f\x63\x6f\x72\x65\0\x5f\x5f\x5f\x5f\x6e\x65\
+\x73\x74\x5f\x73\x65\x6c\x65\x63\x74\x5f\x63\x70\x75\x2e\x5f\x5f\x5f\x66\x6d\
+\x74\x2e\x31\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x73\x65\x6c\x65\x63\x74\x5f\
+\x63\x70\x75\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x33\0\x6e\x72\x5f\x72\x65\x73\x65\
+\x72\x76\x65\x64\0\x6f\x70\x65\x72\x61\x74\x65\x5f\x62\x61\x64\x5f\x67\x75\x79\
+\x73\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x65\x6e\x71\x75\x65\x75\x65\x2e\x5f\
+\x5f\x5f\x66\x6d\x74\0\x76\x74\x69\x6d\x65\x5f\x6e\x6f\x77\0\x5f\x5f\x5f\x5f\
+\x6e\x65\x73\x74\x5f\x64\x69\x73\x70\x61\x74\x63\x68\x2e\x5f\x5f\x5f\x66\x6d\
+\x74\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x64\x69\x73\x70\x61\x74\x63\x68\x2e\
+\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\x30\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x69\
+\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\
+\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\x32\0\x5f\x5f\x5f\x5f\x6e\
+\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\x34\0\x5f\
+\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\
+\x2e\x31\x36\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\
+\x5f\x66\x6d\x74\x2e\x31\x38\0\x73\x74\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\x66\
+\x6e\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\
+\x6d\x74\x2e\x32\x30\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\x75\x5f\x6d\x61\x73\
+\x6b\x5f\x65\x76\x65\x6e\x74\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x63\x6f\x6d\x70\
+\x61\x63\x74\x5f\x70\x72\x69\x6d\x61\x72\x79\x5f\x63\x6f\x72\x65\x2e\x5f\x5f\
+\x5f\x66\x6d\x74\0\x63\x6f\x6d\x70\x61\x63\x74\x5f\x70\x72\x69\x6d\x61\x72\x79\
+\x5f\x63\x6f\x72\x65\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x36\0\x73\x74\x61\x74\x73\
+\x5f\x74\x69\x6d\x65\x72\x66\x6e\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x73\x74\x61\x74\
+\x73\x5f\x74\x69\x6d\x65\x72\x66\x6e\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\x33\0\
+\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\0\x6e\x65\x73\x74\x5f\x73\x65\x6c\x65\x63\
+\x74\x5f\x63\x70\x75\0\x74\x61\x73\x6b\x5f\x63\x74\x78\x5f\x73\x74\x6f\x72\0\
+\x62\x70\x66\x5f\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x6c\x6f\x63\x6b\0\x70\x72\
+\x69\x6d\x61\x72\x79\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x72\x65\x73\x65\x72\x76\
+\x65\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x62\x70\x66\x5f\x72\x63\x75\x5f\x72\x65\
+\x61\x64\x5f\x75\x6e\x6c\x6f\x63\x6b\0\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\
+\x6b\x5f\x61\x6e\x64\0\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\
+\x73\x74\x5f\x63\x70\x75\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x74\x65\x73\x74\x5f\
+\x61\x6e\x64\x5f\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\x5f\x69\x64\x6c\x65\0\x73\
+\x74\x61\x74\x73\0\x70\x63\x70\x75\x5f\x63\x74\x78\x73\0\x73\x63\x78\x5f\x62\
+\x70\x66\x5f\x65\x72\x72\x6f\x72\x5f\x62\x73\x74\x72\0\x66\x69\x6e\x64\x5f\x66\
+\x75\x6c\x6c\x79\x5f\x69\x64\x6c\x65\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x70\x69\
+\x63\x6b\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\0\x62\x70\x66\x5f\x63\x70\x75\x6d\
+\x61\x73\x6b\x5f\x73\x65\x74\x5f\x63\x70\x75\0\x62\x70\x66\x5f\x63\x70\x75\x6d\
+\x61\x73\x6b\x5f\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\0\x73\x6c\x69\x63\x65\x5f\
+\x6e\x73\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\
+\x72\x5f\x69\x6d\x70\x61\x74\x69\x65\x6e\x74\0\x72\x5f\x6d\x61\x78\0\x6e\x65\
+\x73\x74\x5f\x65\x6e\x71\x75\x65\x75\x65\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x64\
+\x69\x73\x70\x61\x74\x63\x68\x5f\x76\x74\x69\x6d\x65\0\x6e\x65\x73\x74\x5f\x64\
+\x69\x73\x70\x61\x74\x63\x68\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x63\x6f\x6e\x73\
+\x75\x6d\x65\0\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x66\x69\x72\x73\
+\x74\0\x70\x5f\x72\x65\x6d\x6f\x76\x65\x5f\x6e\x73\0\x6e\x65\x73\x74\x5f\x72\
+\x75\x6e\x6e\x69\x6e\x67\0\x6e\x65\x73\x74\x5f\x73\x74\x6f\x70\x70\x69\x6e\x67\
+\0\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\0\x62\x70\x66\x5f\
+\x63\x70\x75\x6d\x61\x73\x6b\x5f\x63\x72\x65\x61\x74\x65\0\x62\x70\x66\x5f\x63\
+\x70\x75\x6d\x61\x73\x6b\x5f\x72\x65\x6c\x65\x61\x73\x65\0\x6e\x65\x73\x74\x5f\
+\x65\x6e\x61\x62\x6c\x65\0\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\0\x73\x63\x78\
+\x5f\x62\x70\x66\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x73\x71\0\x62\x70\x66\x5f\
+\x63\x70\x75\x6d\x61\x73\x6b\x5f\x63\x6c\x65\x61\x72\0\x6e\x72\x5f\x63\x70\x75\
+\x73\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x6e\x75\x6d\x5f\x6e\x65\x77\0\x62\
+\x70\x66\x5f\x69\x74\x65\x72\x5f\x6e\x75\x6d\x5f\x6e\x65\x78\x74\0\x62\x70\x66\
+\x5f\x69\x74\x65\x72\x5f\x6e\x75\x6d\x5f\x64\x65\x73\x74\x72\x6f\x79\0\x73\x74\
+\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\0\x73\x61\x6d\x70\x6c\x69\x6e\x67\x5f\x63\
+\x61\x64\x65\x6e\x63\x65\x5f\x6e\x73\0\x6e\x65\x73\x74\x5f\x65\x78\x69\x74\0\
+\x75\x65\x69\0\x75\x65\x69\x5f\x64\x75\x6d\x70\x5f\x6c\x65\x6e\0\x75\x65\x69\
+\x5f\x64\x75\x6d\x70\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\x75\x5f\x6d\x61\x73\
+\x6b\x5f\x65\x76\x65\x6e\x74\0\x63\x70\x75\x5f\x6d\x61\x73\x6b\x5f\x62\x75\x66\
+\x66\x65\x72\0\x73\x74\x61\x74\x73\x5f\x70\x72\x69\x6d\x61\x72\x79\x5f\x6d\x61\
+\x73\x6b\0\x73\x74\x61\x74\x73\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x5f\x6d\x61\
+\x73\x6b\0\x73\x74\x61\x74\x73\x5f\x6f\x74\x68\x65\x72\x5f\x6d\x61\x73\x6b\0\
+\x73\x74\x61\x74\x73\x5f\x69\x64\x6c\x65\x5f\x6d\x61\x73\x6b\0\x63\x6f\x6d\x6d\
+\x5f\x69\x67\x6e\x6f\x72\x65\x5f\x6d\x61\x70\0\x69\x64\x5f\x69\x67\x6e\x6f\x72\
+\x65\x5f\x6d\x61\x70\0\x66\x69\x6c\x74\x65\x72\x5f\x62\x79\x5f\x74\x67\x69\x64\
+\0\x63\x6f\x6d\x6d\x5f\x61\x74\x74\x65\x6e\x74\x69\x6f\x6e\x5f\x6d\x61\x70\0\
+\x69\x64\x5f\x61\x74\x74\x65\x6e\x74\x69\x6f\x6e\x5f\x6d\x61\x70\0\x66\x6c\x69\
+\x74\x65\x72\x5f\x6d\x61\x70\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x67\x65\x74\x5f\
+\x69\x64\x6c\x65\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x73\x63\x78\x5f\x62\x70\x66\
+\x5f\x70\x75\x74\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x5f\x6c\
+\x69\x63\x65\x6e\x73\x65\0\x72\x5f\x64\x65\x70\x74\x68\0\x6e\x65\x73\x74\x5f\
+\x6f\x70\x73\0\x74\x65\x6d\x70\x6c\x61\x74\x65\x5f\x6d\x61\x70\0\x2e\x72\x65\
+\x6c\x2e\x74\x65\x78\x74\0\x2e\x72\x65\x6c\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\
+\x73\x2f\x6e\x65\x73\x74\x5f\x73\x65\x6c\x65\x63\x74\x5f\x63\x70\x75\0\x2e\x72\
+\x65\x6c\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x65\
+\x6e\x71\x75\x65\x75\x65\0\x2e\x72\x65\x6c\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\
+\x73\x2f\x6e\x65\x73\x74\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\x2e\x72\x65\x6c\
+\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x72\x75\x6e\
+\x6e\x69\x6e\x67\0\x2e\x72\x65\x6c\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\
+\x6e\x65\x73\x74\x5f\x73\x74\x6f\x70\x70\x69\x6e\x67\0\x2e\x72\x65\x6c\x73\x74\
+\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x5f\
+\x74\x61\x73\x6b\0\x2e\x72\x65\x6c\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\
+\x6e\x65\x73\x74\x5f\x65\x6e\x61\x62\x6c\x65\0\x2e\x72\x65\x6c\x73\x74\x72\x75\
+\x63\x74\x5f\x6f\x70\x73\x2e\x73\x2f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\0\x2e\
+\x72\x65\x6c\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\
+\x65\x78\x69\x74\0\x2e\x72\x65\x6c\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\
+\x2e\x72\x65\x6c\x2e\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2e\x6c\x69\x6e\
+\x6b\0\x2e\x42\x54\x46\0\x2e\x42\x54\x46\x2e\x65\x78\x74\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x49\x01\0\0\x04\0\xf1\xff\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x03\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\
+\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x58\x01\0\0\x01\0\x14\0\x90\x04\0\0\0\
+\0\0\0\x1c\0\0\0\0\0\0\0\x73\x01\0\0\x02\0\x03\0\x10\0\0\0\0\0\0\0\xd8\x02\0\0\
+\0\0\0\0\x88\x01\0\0\x01\0\x14\0\xac\x04\0\0\0\0\0\0\x1c\0\0\0\0\0\0\0\xa5\x01\
+\0\0\x01\0\x14\0\xc8\x04\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\xc2\x01\0\0\x01\0\x11\0\
+\x20\0\0\0\0\0\0\0\x04\0\0\0\0\0\0\0\xce\x01\0\0\x02\0\x03\0\xe8\x02\0\0\0\0\0\
+\0\xe0\x03\0\0\0\0\0\0\0\0\0\0\x03\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xdf\
+\x01\0\0\x01\0\x14\0\x1c\x05\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\xf7\x01\0\0\x01\0\
+\x11\0\x28\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\x03\0\x06\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\x01\x02\0\0\x01\0\x14\0\x34\x05\0\0\0\0\0\0\x1e\0\0\0\0\0\0\0\
+\x1a\x02\0\0\x01\0\x14\0\x52\x05\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\0\0\0\0\x03\0\
+\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x08\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x03\0\x09\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\
+\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0b\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x36\x02\0\0\x01\0\x14\0\x6c\x05\0\0\0\0\0\0\x1e\0\0\0\0\0\0\0\x4b\
+\x02\0\0\x01\0\x14\0\x8a\x05\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\x63\x02\0\0\x01\0\
+\x14\0\xa4\x05\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x7b\x02\0\0\x01\0\x14\0\xc4\x05\0\
+\0\0\0\0\0\x22\0\0\0\0\0\0\0\x93\x02\0\0\x01\0\x14\0\xe6\x05\0\0\0\0\0\0\x1f\0\
+\0\0\0\0\0\0\xab\x02\0\0\x02\0\x03\0\xc8\x06\0\0\0\0\0\0\x80\x03\0\0\0\0\0\0\
+\xb9\x02\0\0\x01\0\x14\0\x05\x06\0\0\0\0\0\0\x1a\0\0\0\0\0\0\0\0\0\0\0\x03\0\
+\x0c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x0d\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\xd1\x02\0\0\x01\0\x0f\0\x40\0\0\0\0\0\0\0\x21\0\0\0\0\0\0\0\xef\
+\x02\0\0\x01\0\x14\0\xe2\x04\0\0\0\0\0\0\x19\0\0\0\0\0\0\0\x0b\x03\0\0\x01\0\
+\x14\0\xfb\x04\0\0\0\0\0\0\x21\0\0\0\0\0\0\0\x29\x03\0\0\x01\0\x14\0\x1f\x06\0\
+\0\0\0\0\0\x24\0\0\0\0\0\0\0\x3e\x03\0\0\x01\0\x14\0\x43\x06\0\0\0\0\0\0\x1a\0\
+\0\0\0\0\0\0\0\0\0\0\x03\0\x0f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\
+\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x14\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x56\x03\0\0\x12\0\x03\0\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x60\x03\
+\0\0\x12\0\x04\0\0\0\0\0\0\0\0\0\x60\x0b\0\0\0\0\0\0\x70\x03\0\0\x11\0\x10\0\
+\x10\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\x7e\x03\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x90\x03\0\0\x11\x02\x15\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\xa0\
+\x03\0\0\x11\x02\x15\0\x08\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\xb0\x03\0\0\x20\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc4\x03\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\xd4\x03\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe9\x03\0\0\
+\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x09\x04\0\0\x11\0\x10\0\x28\x01\0\0\
+\0\0\0\0\x20\0\0\0\0\0\0\0\x0f\x04\0\0\x11\0\x10\0\x30\0\0\0\0\0\0\0\x20\0\0\0\
+\0\0\0\0\x19\x04\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2c\x04\0\0\x11\
+\0\x0f\0\x20\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\x3c\x04\0\0\x20\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x52\x04\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x66\
+\x04\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7c\x04\0\0\x11\0\x0f\0\x18\
+\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\x85\x04\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\x96\x04\0\0\x11\0\x0f\0\x10\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\xa2\x04\0\
+\0\x11\0\x0f\0\x08\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\xa8\x04\0\0\x12\0\x05\0\0\0\
+\0\0\0\0\0\0\x68\x01\0\0\0\0\0\0\xb5\x04\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\xcc\x04\0\0\x12\0\x06\0\0\0\0\0\0\0\0\0\xd0\x04\0\0\0\0\0\0\xda\x04\0\
+\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xea\x04\0\0\x20\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\xfc\x04\0\0\x11\0\x0f\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\
+\x08\x05\0\0\x12\0\x07\0\0\0\0\0\0\0\0\0\x50\0\0\0\0\0\0\0\x15\x05\0\0\x12\0\
+\x08\0\0\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x23\x05\0\0\x12\0\x09\0\0\0\0\0\0\0\0\
+\0\xb8\0\0\0\0\0\0\0\x32\x05\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x45\
+\x05\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x59\x05\0\0\x12\0\x0a\0\0\0\
+\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x65\x05\0\0\x12\0\x0b\0\0\0\0\0\0\0\0\0\x18\x05\
+\0\0\0\0\0\0\x6f\x05\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x82\x05\0\0\
+\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x94\x05\0\0\x11\0\x0f\0\x3c\0\0\0\0\
+\0\0\0\x04\0\0\0\0\0\0\0\x9c\x05\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\xad\x05\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x05\0\0\x20\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd4\x05\0\0\x11\0\x10\0\x50\0\0\0\0\0\0\0\x20\0\
+\0\0\0\0\0\0\xe0\x05\0\0\x11\0\x0f\0\x28\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\xf4\
+\x05\0\0\x12\0\x0c\0\0\0\0\0\0\0\0\0\xf0\0\0\0\0\0\0\0\xfe\x05\0\0\x11\0\x14\0\
+\0\0\0\0\0\0\0\0\x90\x04\0\0\0\0\0\0\x02\x06\0\0\x11\0\x0f\0\x64\0\0\0\0\0\0\0\
+\x04\0\0\0\0\0\0\0\x0f\x06\0\0\x11\0\x13\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\
+\x18\x06\0\0\x12\0\x0d\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\x2e\x06\0\0\x11\0\
+\x10\0\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x3e\x06\0\0\x11\0\x11\0\0\0\0\0\0\0\0\
+\0\x08\0\0\0\0\0\0\0\x51\x06\0\0\x11\0\x11\0\x08\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\
+\0\x65\x06\0\0\x11\0\x11\0\x10\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\x76\x06\0\0\x11\
+\0\x11\0\x18\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\x86\x06\0\0\x11\0\x10\0\xa8\0\0\0\
+\0\0\0\0\x20\0\0\0\0\0\0\0\x96\x06\0\0\x11\0\x10\0\xe8\0\0\0\0\0\0\0\x20\0\0\0\
+\0\0\0\0\xa4\x06\0\0\x11\0\x0f\0\x38\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\xb3\x06\0\
+\0\x11\0\x10\0\xc8\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xc6\x06\0\0\x11\0\x10\0\x08\
+\x01\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xd7\x06\0\0\x11\0\x10\0\x90\0\0\0\0\0\0\0\
+\x18\0\0\0\0\0\0\0\xe2\x06\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xfb\
+\x06\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x14\x07\0\0\x11\0\x0e\0\0\0\
+\0\0\0\0\0\0\x0d\0\0\0\0\0\0\0\x1d\x07\0\0\x11\0\x0f\0\x30\0\0\0\0\0\0\0\x08\0\
+\0\0\0\0\0\0\x25\x07\0\0\x11\0\x12\0\0\0\0\0\0\0\0\0\xa8\x01\0\0\0\0\0\0\x2e\
+\x07\0\0\x11\0\x10\0\x70\0\0\0\0\0\0\0\x20\0\0\0\0\0\0\0\xbf\x10\0\0\0\0\0\0\
+\x95\0\0\0\0\0\0\0\x85\0\0\0\x08\0\0\0\x63\x0a\xfc\xff\0\0\0\0\xb4\x01\0\0\x0f\
+\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\
+\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x03\0\0\0\0\0\
+\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x7b\x10\0\0\0\0\0\0\xbf\xa2\0\0\0\0\
+\0\0\x07\x02\0\0\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
+\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x09\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\
+\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\
+\0\xe2\x04\0\0\0\0\0\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\
+\xff\x05\0\x3c\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x79\x12\0\0\0\0\0\0\x15\x02\x04\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x79\x17\0\0\0\0\0\0\x55\x07\x0a\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\
+\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\
+\0\xfb\x04\0\0\0\0\0\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\
+\xff\x85\x10\0\0\xff\xff\xff\xff\x05\0\x29\0\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\
+\x85\x10\0\0\xff\xff\xff\xff\x61\xa1\xfc\xff\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x79\x23\0\0\0\0\0\0\x18\x02\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x61\x24\0\
+\0\0\0\0\0\x67\x04\0\0\x20\0\0\0\xc7\x04\0\0\x20\0\0\0\xbd\x43\x0d\0\0\0\0\0\
+\xb4\x03\0\0\x01\0\0\0\xc3\x32\0\0\x01\0\0\0\xbf\x72\0\0\0\0\0\0\x85\x10\0\0\
+\xff\xff\xff\xff\xb4\x01\0\0\x0a\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\
+\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
+\x01\0\0\0\x15\0\x0e\0\0\0\0\0\x05\0\x0a\0\0\0\0\0\xbf\x72\0\0\0\0\0\0\x85\x10\
+\0\0\xff\xff\xff\xff\xb4\x01\0\0\x0b\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\
+\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\
+\0\0\x01\0\0\0\x15\0\x03\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\
+\x7b\x10\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\x01\0\0\0\0\0\0\x73\x16\
+\x10\0\0\0\0\0\xb4\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xbf\x16\0\0\0\0\0\0\xb4\0\0\
+\0\x01\0\0\0\x61\x61\x2c\0\0\0\0\0\x54\x01\0\0\0\0\x20\0\x56\x01\x76\0\0\0\0\0\
+\xbf\x27\0\0\0\0\0\0\xb7\x01\0\0\xe0\x0c\0\0\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\
+\0\0\0\xbf\xa8\0\0\0\0\0\0\x07\x08\0\0\xf0\xff\xff\xff\xbf\x81\0\0\0\0\0\0\xb4\
+\x02\0\0\x10\0\0\0\x85\0\0\0\x73\0\0\0\x61\x61\xc0\x0a\0\0\0\0\x63\x1a\xec\xff\
+\0\0\0\0\x61\x61\xc4\x0a\0\0\0\0\x63\x1a\xe8\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x01\0\0\0\0\0\0\xb4\
+\0\0\0\x01\0\0\0\x55\x01\x62\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xec\xff\
+\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x01\0\0\0\
+\0\0\0\xb4\0\0\0\x01\0\0\0\x55\x01\x5a\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\x71\x11\0\0\0\0\0\0\x56\x01\x08\0\x01\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
+\0\0\xe8\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\
+\xbf\x01\0\0\0\0\0\0\xb4\0\0\0\x01\0\0\0\x55\x01\x4e\0\0\0\0\0\xbf\xa2\0\0\0\0\
+\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
+\x01\0\0\0\xbf\x08\0\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xec\xff\xff\xff\
+\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x09\0\0\0\0\0\0\
+\xb4\x01\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x71\x22\0\0\0\0\0\0\
+\x56\x02\x08\0\x01\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xe8\xff\xff\xff\x18\
+\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xb4\x01\0\0\x01\0\0\0\x55\
+\0\x01\0\0\0\0\0\xb4\x01\0\0\0\0\0\0\x55\x08\x03\0\0\0\0\0\x55\x09\x02\0\0\0\0\
+\0\x54\x01\0\0\x01\0\0\0\x16\x01\x0c\0\0\0\0\0\x79\x64\x58\x03\0\0\0\0\x18\x01\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x13\0\0\0\0\0\0\x18\x02\0\0\x28\0\0\0\0\0\0\0\
+\0\0\0\0\x79\x22\0\0\0\0\0\0\xbf\x45\0\0\0\0\0\0\x1f\x25\0\0\0\0\0\0\x0f\x35\0\
+\0\0\0\0\0\x65\x05\x1f\0\xff\xff\xff\xff\x05\0\x1b\0\0\0\0\0\xb4\x01\0\0\0\0\0\
+\0\x63\x1a\xe4\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xe4\xff\xff\xff\x18\
+\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x01\0\0\0\0\0\0\xb4\0\
+\0\0\x01\0\0\0\x15\x01\x1b\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xec\xff\
+\xff\xff\x85\0\0\0\x01\0\0\0\xbf\x01\0\0\0\0\0\0\xb4\0\0\0\x01\0\0\0\x15\x01\
+\x15\0\0\0\0\0\x79\x64\x58\x03\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\
+\x13\0\0\0\0\0\0\x18\x02\0\0\x28\0\0\0\0\0\0\0\0\0\0\0\x79\x22\0\0\0\0\0\0\xbf\
+\x45\0\0\0\0\0\0\x1f\x25\0\0\0\0\0\0\x0f\x35\0\0\0\0\0\0\x65\x05\x03\0\xff\xff\
+\xff\xff\x79\x13\0\0\0\0\0\0\x1f\x32\0\0\0\0\0\0\xbf\x24\0\0\0\0\0\0\x79\x13\0\
+\0\0\0\0\0\x77\x03\0\0\x01\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\xbf\
+\x75\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\
+\0\xbf\x38\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x06\0\0\0\0\0\0\
+\x7b\x61\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x61\0\0\0\0\0\0\
+\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7b\x61\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x7b\x61\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x18\x01\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x79\x17\0\0\0\0\0\0\x15\x07\x05\0\0\0\0\0\x18\x01\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x55\x01\x07\0\
+\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x7b\x6a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\
+\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\x1f\x06\0\0\0\0\0\0\0\0\0\0\x05\0\
+\x4d\0\0\0\0\0\x7b\x8a\xe8\xff\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbf\x08\0\0\
+\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\x13\0\0\0\0\0\0\xbf\xa6\0\0\0\
+\0\0\0\x07\x06\0\0\xf8\xff\xff\xff\xbf\x61\0\0\0\0\0\0\xb4\x02\0\0\0\0\0\0\x85\
+\x10\0\0\xff\xff\xff\xff\xbf\x61\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x15\0\
+\x06\0\0\0\0\0\x61\x06\0\0\0\0\0\0\xc6\x06\x04\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x61\x11\0\0\0\0\0\0\xae\x16\x10\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\
+\x07\x01\0\0\xf8\xff\xff\xff\x85\x10\0\0\xff\xff\xff\xff\x85\x10\0\0\xff\xff\
+\xff\xff\xbf\x81\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x79\x12\0\0\0\0\0\0\x07\x02\0\0\x78\xec\xff\xff\xb7\x06\0\0\0\0\
+\0\0\x79\xa1\xe8\xff\0\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\xab\0\0\0\x15\0\x2c\
+\0\0\0\0\0\x05\0\x24\0\0\0\0\0\xbc\x61\0\0\0\0\0\0\xbf\x72\0\0\0\0\0\0\x85\x10\
+\0\0\xff\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x54\0\0\0\x01\0\0\0\
+\x56\0\x09\0\0\0\0\0\xbc\x61\0\0\0\0\0\0\x79\xa2\xf0\xff\0\0\0\0\x85\x10\0\0\
+\xff\xff\xff\xff\x54\0\0\0\x01\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x56\0\
+\x02\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x09\0\0\x01\0\0\0\x6f\
+\x69\0\0\0\0\0\0\x79\x12\0\0\0\0\0\0\x4f\x92\0\0\0\0\0\0\x7b\x21\0\0\0\0\0\0\
+\xbc\x61\0\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\0\0\
+\x01\0\0\0\x16\0\x05\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x21\0\0\
+\0\0\0\0\x4f\x91\0\0\0\0\0\0\x7b\x12\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\
+\0\xf8\xff\xff\xff\x85\x10\0\0\xff\xff\xff\xff\x15\0\xcd\xff\0\0\0\0\x05\0\xc6\
+\xff\0\0\0\0\x7b\x6a\xf8\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf8\xff\
+\xff\xff\x18\x01\0\0\x43\x06\0\0\0\0\0\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\
+\0\0\xff\xff\xff\xff\xb4\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\x08\0\0\0\0\0\
+\x7b\x2a\xe8\xff\0\0\0\0\x79\x16\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\xbf\x62\0\0\0\0\0\0\xb7\x03\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\x9c\0\
+\0\0\xbf\x08\0\0\0\0\0\0\xb4\x07\0\0\xfe\xff\xff\xff\x15\x08\xc1\0\0\0\0\0\x85\
+\x10\0\0\xff\xff\xff\xff\x79\x89\0\0\0\0\0\0\x15\x09\x09\0\0\0\0\0\x18\x01\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\x79\x13\0\0\0\0\0\0\x15\x03\x05\0\0\0\0\0\x18\x01\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\x55\x01\
+\x02\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x05\0\xb3\0\0\0\0\0\x79\xa7\xe8\xff\
+\0\0\0\0\x63\x78\x10\0\0\0\0\0\x79\x62\x20\x05\0\0\0\0\xbf\x91\0\0\0\0\0\0\x7b\
+\x3a\xd8\xff\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x61\x81\x0c\0\0\0\0\0\xbf\x92\
+\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\0\0\x01\0\0\0\x16\0\x0f\0\0\0\0\
+\0\x61\x81\x0c\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\0\0\x01\0\0\0\x16\0\
+\x0b\0\0\0\0\0\x61\x81\x0c\0\0\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xb4\x01\0\0\0\0\0\
+\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\
+\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x18\0\0\0\0\0\x05\0\
+\x14\0\0\0\0\0\x61\x81\x0c\0\0\0\0\0\x1e\x71\x47\0\0\0\0\0\xbc\x71\0\0\0\0\0\0\
+\xbf\x92\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\0\0\x01\0\0\0\x16\0\x42\
+\0\0\0\0\0\xbc\x71\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\0\0\x01\0\0\0\
+\x16\0\x3e\0\0\0\0\0\x63\x7a\xfc\xff\0\0\0\0\xb4\x01\0\0\x01\0\0\0\x63\x1a\xf0\
+\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x03\0\0\0\0\0\x79\x01\0\0\0\0\0\0\
+\x07\x01\0\0\x01\0\0\0\x7b\x10\0\0\0\0\0\0\x79\xa9\xe0\xff\0\0\0\0\xb4\x01\0\0\
+\0\0\0\0\x63\x18\x08\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\xff\xff\xff\
+\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x07\0\0\0\0\0\0\
+\x15\x07\x48\0\0\0\0\0\x71\x71\x10\0\0\0\0\0\x56\x01\x4e\0\x01\0\0\0\xbf\x71\0\
+\0\0\0\0\0\x85\0\0\0\xac\0\0\0\x65\0\x08\0\xff\xff\xff\xff\xb7\x01\0\0\0\0\0\0\
+\x7b\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\
+\x01\0\0\x90\x04\0\0\0\0\0\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\
+\xff\xff\xbf\x71\0\0\0\0\0\0\x18\x02\0\0\x10\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
+\xaa\0\0\0\x15\0\x08\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\xbf\
+\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\xac\x04\0\0\0\0\0\0\0\
+\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\x01\0\0\0\0\0\0\
+\x73\x17\x10\0\0\0\0\0\xb4\x01\0\0\x0d\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\
+\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\
+\0\0\0\x01\0\0\0\x15\0\x2c\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\
+\x7b\x10\0\0\0\0\0\0\x05\0\x28\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x71\x11\0\0\0\0\0\0\x56\x01\x0e\0\x01\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\
+\x01\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x63\x0a\xfc\xff\0\0\0\0\xc6\0\x09\0\0\0\
+\0\0\xb4\x01\0\0\x02\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\
+\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\
+\x15\0\xbd\xff\0\0\0\0\x05\0\xb9\xff\0\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\0\
+\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x63\x0a\xfc\xff\0\0\0\0\xc6\0\x3b\0\0\0\0\0\
+\xb4\x01\0\0\x03\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
+\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\
+\xaf\xff\0\0\0\0\x05\0\xab\xff\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\
+\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\xc8\x04\0\0\0\
+\0\0\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x61\xa1\xfc\
+\xff\0\0\0\0\x79\xa2\xd8\xff\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x61\xa1\xfc\
+\xff\0\0\0\0\xbf\x92\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\0\0\x01\0\0\
+\0\x16\0\x08\0\0\0\0\0\xb4\x01\0\0\x01\0\0\0\x84\x01\0\0\0\0\0\0\x18\x02\0\0\
+\x20\0\0\0\0\0\0\0\0\0\0\0\xc3\x12\0\0\x01\0\0\0\x61\xa1\xfc\xff\0\0\0\0\xbf\
+\x92\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x85\x10\0\0\xff\xff\xff\xff\x61\
+\x82\x10\0\0\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x79\xa3\xe8\xff\0\0\0\0\x5e\x12\x01\
+\0\0\0\0\0\x63\x18\x0c\0\0\0\0\0\x63\x38\x10\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\
+\x02\0\0\0\0\0\0\x85\x10\0\0\x5c\0\0\0\x16\0\x0c\0\0\0\0\0\x61\xa2\xfc\xff\0\0\
+\0\0\x67\x02\0\0\x20\0\0\0\xc7\x02\0\0\x20\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\xc0\x4f\x12\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x13\0\0\0\
+\0\0\0\xbf\x61\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x61\
+\xa7\xfc\xff\0\0\0\0\xbc\x70\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\xb4\x07\0\0\0\0\0\0\
+\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x12\0\0\0\0\0\0\x15\x02\x13\0\0\0\0\0\
+\x61\x82\x08\0\0\0\0\0\x04\x02\0\0\x01\0\0\0\x63\x28\x08\0\0\0\0\0\x79\x11\0\0\
+\0\0\0\0\x2d\x21\x0e\0\0\0\0\0\xb4\x01\0\0\0\0\0\0\x63\x18\x08\0\0\0\0\0\xb4\
+\x01\0\0\x07\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\
+\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x03\
+\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x7b\x10\0\0\0\0\0\0\xb4\
+\x07\0\0\x01\0\0\0\x79\x62\x20\x05\0\0\0\0\xbf\x91\0\0\0\0\0\0\x79\xa3\xe0\xff\
+\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x71\
+\x11\0\0\0\0\0\0\x56\x01\x12\0\x01\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\x01\0\
+\0\0\x85\x10\0\0\xff\xff\xff\xff\x63\x0a\xfc\xff\0\0\0\0\xc6\0\x0d\0\0\0\0\0\
+\xb4\x01\0\0\x04\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
+\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\
+\x03\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x7b\x10\0\0\0\0\0\0\
+\x79\xa9\xe0\xff\0\0\0\0\x05\0\x11\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\0\
+\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x63\x0a\xfc\xff\0\0\0\0\xc6\0\x18\0\0\0\0\0\
+\xb4\x01\0\0\x05\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
+\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x79\
+\xa9\xe0\xff\0\0\0\0\x15\0\x03\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\
+\0\0\x7b\x10\0\0\0\0\0\0\xb4\x01\0\0\x08\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\
+\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x85\0\0\0\x01\0\0\0\x15\0\x34\xff\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\
+\0\0\0\x7b\x10\0\0\0\0\0\0\x05\0\x30\xff\0\0\0\0\x63\x7a\xd0\xff\0\0\0\0\x79\
+\x61\x20\x05\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbc\x07\0\
+\0\0\0\0\0\x63\x7a\xfc\xff\0\0\0\0\x79\xa9\xe0\xff\0\0\0\0\xc6\x07\x33\0\0\0\0\
+\0\xb4\x01\0\0\x06\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\
+\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\
+\0\x03\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x7b\x10\0\0\0\0\0\0\
+\xbc\x71\0\0\0\0\0\0\x79\xa2\xd8\xff\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\
+\0\0\x01\0\0\0\x56\0\x18\xff\0\0\0\0\xbc\x71\0\0\0\0\0\0\xbf\x92\0\0\0\0\0\0\
+\x85\x10\0\0\xff\xff\xff\xff\x61\xa1\xd0\xff\0\0\0\0\x4c\x01\0\0\0\0\0\0\x54\
+\x01\0\0\x01\0\0\0\x56\x01\xd5\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x79\x12\0\0\0\0\0\0\x18\x01\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x61\x13\0\0\0\0\0\0\
+\x67\x03\0\0\x20\0\0\0\xc7\x03\0\0\x20\0\0\0\xbd\x32\x17\0\0\0\0\0\xb4\x02\0\0\
+\x01\0\0\0\xc3\x21\0\0\x01\0\0\0\xbc\x71\0\0\0\0\0\0\xbf\x92\0\0\0\0\0\0\x85\
+\x10\0\0\xff\xff\xff\xff\xb4\x01\0\0\x09\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\
+\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x85\0\0\0\x01\0\0\0\x15\0\x03\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\
+\0\0\x7b\x10\0\0\0\0\0\0\x61\xa7\xfc\xff\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\
+\x05\0\x74\xff\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x79\xa1\xe8\xff\0\0\0\0\xbc\
+\x17\0\0\0\0\0\0\x05\0\x70\xff\0\0\0\0\xbc\x71\0\0\0\0\0\0\xbf\x92\0\0\0\0\0\0\
+\x85\x10\0\0\xff\xff\xff\xff\xb4\x01\0\0\x0b\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\
+\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\x85\0\0\0\x01\0\0\0\x15\0\xb0\xfe\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\
+\x01\0\0\0\x7b\x10\0\0\0\0\0\0\x05\0\xac\xfe\0\0\0\0\x79\x17\0\0\0\0\0\0\x79\
+\x78\x58\x03\0\0\0\0\x79\x16\x08\0\0\0\0\0\xb7\x09\0\0\0\0\0\0\x18\x01\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\xbf\x72\0\0\0\0\0\0\xb7\x03\0\0\0\0\0\0\xb7\x04\0\0\0\0\0\
+\0\x85\0\0\0\x9c\0\0\0\x55\0\x08\0\0\0\0\0\x7b\x9a\xf8\xff\0\0\0\0\xbf\xa2\0\0\
+\0\0\0\0\x07\x02\0\0\xf8\xff\xff\xff\x18\x01\0\0\x1c\x05\0\0\0\0\0\0\0\0\0\0\
+\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x05\0\x19\0\0\0\0\0\x18\x01\
+\0\0\x28\0\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\xbf\x83\0\0\0\0\0\0\x1f\x13\
+\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x24\0\0\0\0\0\0\x0f\x43\0\
+\0\0\0\0\0\x65\x03\x03\0\xff\xff\xff\xff\x79\x22\0\0\0\0\0\0\x1f\x21\0\0\0\0\0\
+\0\xbf\x18\0\0\0\0\0\0\xbf\x71\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x85\x10\0\0\x5c\
+\0\0\0\x16\0\x08\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x13\0\0\0\0\
+\0\0\xbf\x71\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\xbf\x84\0\0\0\0\0\0\xbf\x65\0\0\0\
+\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x95\0\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x79\x26\0\0\0\0\0\0\x79\x19\x08\0\0\0\0\0\x79\x17\0\0\0\0\0\0\x63\
+\x7a\xfc\xff\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x18\0\0\0\0\0\0\
+\x15\x08\x01\0\0\0\0\0\x55\x06\x07\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\
+\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\x34\
+\x05\0\0\0\0\0\0\0\0\0\0\x05\0\x0c\0\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
+\xfc\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x55\0\
+\x09\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\
+\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\x52\x05\0\0\0\0\0\0\0\0\0\0\xb4\x03\0\
+\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x95\0\0\0\0\0\0\0\x7b\x0a\xe8\xff\0\0\
+\0\0\xb7\x01\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x54\0\0\0\x01\0\0\0\x56\0\
+\x68\0\0\0\0\0\xbc\x71\0\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\
+\xff\x15\x09\x0d\0\0\0\0\0\x61\x91\xf0\x02\0\0\0\0\x5c\x01\0\0\0\0\0\0\x54\x01\
+\0\0\x01\0\0\0\x16\x01\x09\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\
+\x13\0\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\x18\x02\0\0\x02\0\0\0\0\0\0\0\0\0\0\x80\
+\xb7\x04\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x05\0\xe9\xff\0\0\0\0\x63\x0a\
+\xe0\xff\0\0\0\0\xb4\x01\0\0\x11\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\
+\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\
+\x01\0\0\0\x15\0\x03\0\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x7b\
+\x10\0\0\0\0\0\0\x61\xa1\xe0\xff\0\0\0\0\x54\x01\0\0\x01\0\0\0\x16\x01\xda\xff\
+\0\0\0\0\x15\x09\x2a\0\0\0\0\0\x61\x91\x18\0\0\0\0\0\x56\x01\x28\0\x80\0\0\0\
+\xbf\x81\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x1e\x70\x25\0\0\0\0\0\xb4\x01\
+\0\0\x0e\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\
+\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x03\0\0\
+\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x7b\x10\0\0\0\0\0\0\xbc\x71\0\
+\0\0\0\0\0\xbf\x82\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x18\x01\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\x79\x12\0\0\0\0\0\0\x18\x01\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x61\
+\x13\0\0\0\0\0\0\x67\x03\0\0\x20\0\0\0\xc7\x03\0\0\x20\0\0\0\xbd\x32\x1f\0\0\0\
+\0\0\xb4\x02\0\0\x01\0\0\0\xc3\x21\0\0\x01\0\0\0\xbc\x71\0\0\0\0\0\0\xbf\x62\0\
+\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\x01\0\0\x0a\0\0\0\x63\x1a\xf0\xff\0\
+\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\xb0\xff\0\0\0\0\x05\0\x25\0\0\0\0\0\xb4\
+\x02\0\0\x01\0\0\0\x79\xa1\xe8\xff\0\0\0\0\x73\x21\x10\0\0\0\0\0\x18\x02\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x79\x22\0\0\0\0\0\0\xb7\x03\0\0\x02\0\0\0\x85\0\0\0\xab\
+\0\0\0\xb4\x01\0\0\x0c\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\
+\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\
+\0\x15\0\x9f\xff\0\0\0\0\x05\0\x14\0\0\0\0\0\xbc\x71\0\0\0\0\0\0\xbf\x62\0\0\0\
+\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\x01\0\0\x0b\0\0\0\x63\x1a\xf0\xff\0\0\0\
+\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x93\xff\0\0\0\0\x05\0\x08\0\0\0\0\0\xb4\x01\
+\0\0\x10\0\0\0\x63\x1a\xf0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\
+\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\x15\0\x8a\xff\
+\0\0\0\0\x79\x01\0\0\0\0\0\0\x07\x01\0\0\x01\0\0\0\x7b\x10\0\0\0\0\0\0\x05\0\
+\x86\xff\0\0\0\0\x79\x11\0\0\0\0\0\0\x18\x02\0\0\x28\0\0\0\0\0\0\0\0\0\0\0\x79\
+\x23\0\0\0\0\0\0\x79\x14\x58\x03\0\0\0\0\x1f\x43\0\0\0\0\0\0\x65\x03\x02\0\xff\
+\xff\xff\xff\x79\x11\x58\x03\0\0\0\0\x7b\x12\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\
+\x11\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x22\0\0\0\0\0\0\x79\
+\x13\x50\x03\0\0\0\0\x1f\x32\0\0\0\0\0\0\x61\x13\xf4\x02\0\0\0\0\x27\x02\0\0\
+\x64\0\0\0\x3f\x32\0\0\0\0\0\0\x79\x13\x58\x03\0\0\0\0\x0f\x23\0\0\0\0\0\0\x7b\
+\x31\x58\x03\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x12\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\xb7\x03\0\0\0\0\0\0\xb7\x04\0\0\x01\0\0\0\x85\0\0\0\x9c\0\0\0\
+\xbf\x06\0\0\0\0\0\0\xb4\x07\0\0\xf4\xff\xff\xff\x15\x06\x0c\0\0\0\0\0\x85\x10\
+\0\0\xff\xff\xff\xff\x15\0\x0a\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\xbf\x02\0\0\0\0\0\
+\0\x85\0\0\0\xc2\0\0\0\x15\0\x02\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\x85\x10\0\0\xff\
+\xff\xff\xff\xb4\x01\0\0\xff\xff\xff\xff\x63\x16\x10\0\0\0\0\0\x63\x16\x0c\0\0\
+\0\0\0\xb4\x07\0\0\0\0\0\0\xbc\x70\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x79\x11\0\0\0\
+\0\0\0\x18\x02\0\0\x28\0\0\0\0\0\0\0\0\0\0\0\x79\x22\0\0\0\0\0\0\x7b\x21\x58\
+\x03\0\0\0\0\x95\0\0\0\0\0\0\0\xb4\x01\0\0\0\0\0\0\x63\x1a\xfc\xff\0\0\0\0\xb7\
+\x07\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\xb4\x02\0\0\xff\xff\xff\xff\x85\x10\0\0\
+\xff\xff\xff\xff\xbc\x06\0\0\0\0\0\0\x16\x06\x09\0\0\0\0\0\x7b\x7a\xf0\xff\0\0\
+\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\x6c\x05\0\0\0\
+\0\0\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbc\x60\0\0\0\
+\0\0\0\x95\0\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\x06\0\0\xf4\xff\xff\
+\xff\x15\0\xfb\xff\0\0\0\0\xbf\x01\0\0\0\0\0\0\xbf\x07\0\0\0\0\0\0\x85\x10\0\0\
+\xff\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xbf\x72\0\0\0\0\0\0\x85\0\
+\0\0\xc2\0\0\0\x15\0\x02\0\0\0\0\0\xbf\x01\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\
+\xff\x85\x10\0\0\xff\xff\xff\xff\x15\0\xef\xff\0\0\0\0\xbf\x01\0\0\0\0\0\0\xbf\
+\x06\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\xbf\x62\0\0\0\0\0\0\x85\0\0\0\xc2\0\0\0\x15\0\x02\0\0\0\0\0\xbf\x01\0\0\0\0\
+\0\0\x85\x10\0\0\xff\xff\xff\xff\x18\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\x73\0\
+\0\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xf0\xff\xff\xff\xb4\x08\0\0\0\0\0\0\
+\xbf\x61\0\0\0\0\0\0\xb4\x02\0\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbf\x61\0\
+\0\0\0\0\0\x85\x10\0\0\xff\xff\xff\xff\x15\0\x35\0\0\0\0\0\x61\x01\0\0\0\0\0\0\
+\xc6\x01\x33\0\0\0\0\0\x61\x72\0\0\0\0\0\0\x3e\x21\x31\0\0\0\0\0\x63\x1a\xec\
+\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xec\xff\xff\xff\x18\x01\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x55\x06\x0a\0\0\0\0\
+\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
+\xe0\xff\xff\xff\x18\x01\0\0\x8a\x05\0\0\0\0\0\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\
+\x85\x10\0\0\xff\xff\xff\xff\xb4\x06\0\0\xfe\xff\xff\xff\x05\0\x53\0\0\0\0\0\
+\x73\x86\x10\0\0\0\0\0\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\xb7\x03\0\0\x07\0\0\0\x85\0\0\0\xa9\0\0\0\x15\0\x07\0\0\0\0\0\xb7\x01\0\0\0\0\
+\0\0\x7b\x1a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xe0\xff\xff\xff\
+\x18\x01\0\0\xa4\x05\0\0\0\0\0\0\0\0\0\0\x05\0\x42\0\0\0\0\0\xbf\x61\0\0\0\0\0\
+\0\x18\x02\0\0\x10\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\xaa\0\0\0\x16\0\x07\0\0\0\0\
+\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xe0\xff\0\0\0\0\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\
+\xe0\xff\xff\xff\x18\x01\0\0\xc4\x05\0\0\0\0\0\0\0\0\0\0\x05\0\x36\0\0\0\0\0\
+\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf0\xff\xff\xff\x85\x10\0\0\xff\xff\xff\xff\
+\x15\0\x01\0\0\0\0\0\x05\0\xcb\xff\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf0\
+\xff\xff\xff\x85\x10\0\0\xff\xff\xff\xff\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xfc\
+\xff\xff\xff\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\x01\0\0\0\xbf\x06\0\
+\0\0\0\0\0\x55\x06\x0a\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\
+\xbf\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\xe6\x05\0\0\0\0\0\
+\0\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\x06\0\0\xfd\
+\xff\xff\xff\x05\0\x90\xff\0\0\0\0\xbf\x61\0\0\0\0\0\0\x18\x02\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\xb7\x03\0\0\x07\0\0\0\x85\0\0\0\xa9\0\0\0\xbf\x61\0\0\0\0\0\0\x18\
+\x02\0\0\xc8\x06\0\0\0\0\0\0\0\0\0\0\x85\0\0\0\xaa\0\0\0\x18\x01\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x79\x12\0\0\0\0\0\0\x07\x02\0\0\x78\xec\xff\xff\xb7\x08\0\0\0\0\
+\0\0\xbf\x61\0\0\0\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\xab\0\0\0\xbf\x07\0\0\0\
+\0\0\0\xb4\x06\0\0\0\0\0\0\x16\x07\x7c\xff\0\0\0\0\x7b\x8a\xf0\xff\0\0\0\0\xbf\
+\xa2\0\0\0\0\0\0\x07\x02\0\0\xf0\xff\xff\xff\x18\x01\0\0\x05\x06\0\0\0\0\0\0\0\
+\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xbc\x76\0\0\0\0\0\0\
+\x05\0\x73\xff\0\0\0\0\xb4\x03\0\0\x08\0\0\0\x85\x10\0\0\xff\xff\xff\xff\xb4\
+\x06\0\0\xea\xff\xff\xff\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xf0\xff\xff\xff\x85\
+\x10\0\0\xff\xff\xff\xff\x05\0\x6c\xff\0\0\0\0\x79\x16\0\0\0\0\0\0\x79\x63\x10\
+\0\0\0\0\0\x18\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\x07\x01\0\0\x10\0\0\0\xb4\x02\0\0\x80\0\0\0\x85\0\0\0\x73\0\0\0\x18\x01\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\x01\0\0\x90\0\0\0\x79\x63\x28\0\0\0\0\0\xb4\x02\
+\0\0\0\x04\0\0\x85\0\0\0\x73\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\x12\
+\0\0\0\0\0\0\x79\x63\x30\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x85\0\0\
+\0\x73\0\0\0\xb7\x01\0\0\x01\0\0\0\x16\x01\x02\0\0\0\0\0\x79\x61\x08\0\0\0\0\0\
+\x7b\x17\x08\0\0\0\0\0\x61\x61\0\0\0\0\0\0\x61\x70\0\0\0\0\0\0\xc3\x17\0\0\xf1\
+\0\0\0\x95\0\0\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x20\0\
+\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\x55\0\x05\0\0\0\0\0\x18\x01\0\0\
+\x40\0\0\0\0\0\0\0\0\0\0\0\xb4\x02\0\0\x21\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x13\
+\0\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x7b\x10\0\0\
+\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x7b\x10\x08\0\
+\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x7b\x10\x10\0\
+\0\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x79\x11\0\0\0\0\0\0\x7b\x10\x18\0\
+\0\0\0\0\xbf\x01\0\0\0\0\0\0\xb7\x02\0\0\0\0\0\0\x85\0\0\0\x84\0\0\0\xb4\0\0\0\
+\0\0\0\0\x95\0\0\0\0\0\0\0\x44\x75\x61\x6c\x20\x42\x53\x44\x2f\x47\x50\x4c\0\0\
+\0\0\x80\x84\x1e\0\0\0\0\0\x05\0\0\0\0\0\0\0\x02\0\0\0\0\0\0\0\0\x2d\x31\x01\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\xca\x9a\x3b\0\0\0\0\x05\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\
+\0\x63\x70\x75\x20\x6d\x61\x73\x6b\x20\x72\x69\x6e\x67\x62\x75\x66\x20\x72\x65\
+\x73\x65\x72\x76\x65\x20\x66\x61\x69\x6c\x65\x64\x0a\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x6e\x65\
+\x73\x74\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x63\
+\x61\x6e\x63\x65\x6c\x20\x70\x63\x70\x75\x20\x74\x69\x6d\x65\x72\0\x46\x61\x69\
+\x6c\x65\x64\x20\x74\x6f\x20\x72\x65\x2d\x61\x72\x6d\x20\x70\x63\x70\x75\x20\
+\x74\x69\x6d\x65\x72\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\
+\x75\x70\x20\x70\x63\x70\x75\x20\x63\x74\x78\0\x43\x6f\x75\x6c\x64\x6e\x27\x74\
+\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x70\x63\x70\x75\x20\x63\x74\x78\0\x43\x6f\x75\
+\x6c\x64\x6e\x27\x74\x20\x66\x69\x6e\x64\x20\x70\x72\x69\x6d\x61\x72\x79\x20\
+\x6f\x72\x20\x72\x65\x73\x65\x72\x76\x65\0\x55\x6e\x61\x62\x6c\x65\x20\x74\x6f\
+\x20\x66\x69\x6e\x64\x20\x74\x61\x73\x6b\x20\x63\x74\x78\0\x4e\x6f\x20\x70\x72\
+\x69\x6d\x61\x72\x79\x20\x6f\x72\x20\x72\x65\x73\x65\x72\x76\x65\x20\x63\x70\
+\x75\x6d\x61\x73\x6b\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\
+\x75\x70\x20\x70\x63\x70\x75\x20\x63\x74\x78\0\x46\x61\x69\x6c\x65\x64\x20\x74\
+\x6f\x20\x63\x72\x65\x61\x74\x65\x20\x66\x61\x6c\x6c\x62\x61\x63\x6b\x20\x44\
+\x53\x51\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\
+\x70\x63\x70\x75\x5f\x63\x74\x78\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x69\
+\x6e\x69\x74\x69\x61\x6c\x69\x7a\x65\x20\x70\x63\x70\x75\x20\x74\x69\x6d\x65\
+\x72\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x73\x65\x74\x20\x70\x63\x70\x75\
+\x20\x74\x69\x6d\x65\x72\x20\x63\x61\x6c\x6c\x62\x61\x63\x6b\0\x46\x61\x69\x6c\
+\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x63\x65\x6e\x74\x72\x61\
+\x6c\x20\x74\x69\x6d\x65\x72\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x61\x72\
+\x6d\x20\x73\x74\x61\x74\x73\x20\x74\x69\x6d\x65\x72\0\x46\x61\x69\x6c\x65\x64\
+\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x70\x72\x69\x6d\x61\x72\x79\x20\
+\x6f\x72\x20\x72\x65\x73\x65\x72\x76\x65\0\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\
+\x20\x61\x72\x6d\x20\x73\x74\x61\x74\x73\x20\x74\x69\x6d\x65\x72\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x88\0\0\0\0\0\
+\0\0\x01\0\0\0\x31\0\0\0\xd0\0\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\xe8\0\0\0\0\0\0\
+\0\x0a\0\0\0\x32\0\0\0\xf8\0\0\0\0\0\0\0\x0a\0\0\0\x29\0\0\0\0\x01\0\0\0\0\0\0\
+\x01\0\0\0\x2a\0\0\0\x20\x01\0\0\0\0\0\0\x01\0\0\0\x2b\0\0\0\x60\x01\0\0\0\0\0\
+\0\x01\0\0\0\x25\0\0\0\x78\x01\0\0\0\0\0\0\x0a\0\0\0\x32\0\0\0\x80\x01\0\0\0\0\
+\0\0\x0a\0\0\0\x2c\0\0\0\x98\x01\0\0\0\0\0\0\x0a\0\0\0\x36\0\0\0\xa8\x01\0\0\0\
+\0\0\0\x01\0\0\0\x3a\0\0\0\xc0\x01\0\0\0\0\0\0\x01\0\0\0\x24\0\0\0\x08\x02\0\0\
+\0\0\0\0\x0a\0\0\0\x35\0\0\0\x30\x02\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x60\x02\0\
+\0\0\0\0\0\x0a\0\0\0\x36\0\0\0\x88\x02\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\xc0\x02\
+\0\0\0\0\0\0\x0a\0\0\0\x2c\0\0\0\x78\x03\0\0\0\0\0\0\x01\0\0\0\x5a\0\0\0\xc0\
+\x03\0\0\0\0\0\0\x01\0\0\0\x5b\0\0\0\xf0\x03\0\0\0\0\0\0\x01\0\0\0\x5c\0\0\0\
+\x20\x04\0\0\0\0\0\0\x01\0\0\0\x5b\0\0\0\x60\x04\0\0\0\0\0\0\x01\0\0\0\x5d\0\0\
+\0\x90\x04\0\0\0\0\0\0\x01\0\0\0\x5e\0\0\0\xb8\x04\0\0\0\0\0\0\x01\0\0\0\x5c\0\
+\0\0\xe8\x04\0\0\0\0\0\0\x01\0\0\0\x5e\0\0\0\x40\x05\0\0\0\0\0\0\x01\0\0\0\x37\
+\0\0\0\x58\x05\0\0\0\0\0\0\x01\0\0\0\x24\0\0\0\xb8\x05\0\0\0\0\0\0\x01\0\0\0\
+\x5f\0\0\0\x20\x06\0\0\0\0\0\0\x01\0\0\0\x37\0\0\0\x38\x06\0\0\0\0\0\0\x01\0\0\
+\0\x24\0\0\0\xb0\x06\0\0\0\0\0\0\x0a\0\0\0\x3c\0\0\0\xd0\x06\0\0\0\0\0\0\x01\0\
+\0\0\x57\0\0\0\xf0\x06\0\0\0\0\0\0\x01\0\0\0\x56\0\0\0\x08\x07\0\0\0\0\0\0\x01\
+\0\0\0\x58\0\0\0\x20\x07\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\x38\x07\0\0\0\0\0\0\
+\x0a\0\0\0\x29\0\0\0\x40\x07\0\0\0\0\0\0\x01\0\0\0\x2a\0\0\0\x60\x07\0\0\0\0\0\
+\0\x01\0\0\0\x2b\0\0\0\x88\x07\0\0\0\0\0\0\x0a\0\0\0\x2c\0\0\0\xa8\x07\0\0\0\0\
+\0\0\x01\0\0\0\x25\0\0\0\xc8\x07\0\0\0\0\0\0\x0a\0\0\0\x60\0\0\0\xd8\x07\0\0\0\
+\0\0\0\x01\0\0\0\x4a\0\0\0\x10\x08\0\0\0\0\0\0\x0a\0\0\0\x4b\0\0\0\x20\x08\0\0\
+\0\0\0\0\x0a\0\0\0\x4c\0\0\0\x40\x08\0\0\0\0\0\0\x01\0\0\0\x4a\0\0\0\x70\x08\0\
+\0\0\0\0\0\x0a\0\0\0\x4d\0\0\0\x78\x08\0\0\0\0\0\0\x0a\0\0\0\x2c\0\0\0\x88\x08\
+\0\0\0\0\0\0\x0a\0\0\0\x61\0\0\0\x90\x08\0\0\0\0\0\0\x01\0\0\0\x4f\0\0\0\xf0\
+\x08\0\0\0\0\0\0\x0a\0\0\0\x2e\0\0\0\xf8\x08\0\0\0\0\0\0\x01\0\0\0\x56\0\0\0\
+\x28\x09\0\0\0\0\0\0\x0a\0\0\0\x2e\0\0\0\x38\x09\0\0\0\0\0\0\x01\0\0\0\x57\0\0\
+\0\x50\x09\0\0\0\0\0\0\x01\0\0\0\x58\0\0\0\x98\x09\0\0\0\0\0\0\x0a\0\0\0\x2e\0\
+\0\0\xb0\x09\0\0\0\0\0\0\x01\0\0\0\x59\0\0\0\xe8\x09\0\0\0\0\0\0\x0a\0\0\0\x4c\
+\0\0\0\x18\x0a\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\x30\x0a\0\0\0\0\0\0\x0a\0\0\0\
+\x32\0\0\0\x18\0\0\0\0\0\0\0\x01\0\0\0\x28\0\0\0\x60\0\0\0\0\0\0\0\x0a\0\0\0\
+\x29\0\0\0\x78\0\0\0\0\0\0\0\x01\0\0\0\x2a\0\0\0\x98\0\0\0\0\0\0\0\x01\0\0\0\
+\x2b\0\0\0\xc0\0\0\0\0\0\0\0\x0a\0\0\0\x2c\0\0\0\xf8\0\0\0\0\0\0\0\x0a\0\0\0\
+\x2d\0\0\0\x10\x01\0\0\0\0\0\0\x0a\0\0\0\x2e\0\0\0\x30\x01\0\0\0\0\0\0\x0a\0\0\
+\0\x2f\0\0\0\x78\x01\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\xc0\x01\0\0\0\0\0\0\x0a\0\
+\0\0\x2e\0\0\0\xe0\x01\0\0\0\0\0\0\x0a\0\0\0\x2f\0\0\0\x20\x02\0\0\0\0\0\0\x01\
+\0\0\0\x30\0\0\0\x80\x02\0\0\0\0\0\0\x01\0\0\0\x31\0\0\0\xf0\x02\0\0\0\0\0\0\
+\x01\0\0\0\x25\0\0\0\x08\x03\0\0\0\0\0\0\x0a\0\0\0\x32\0\0\0\x18\x03\0\0\0\0\0\
+\0\x01\0\0\0\x02\0\0\0\x58\x03\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\x70\x03\0\0\0\0\
+\0\0\x0a\0\0\0\x32\0\0\0\xa8\x03\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\xe8\x03\0\0\0\
+\0\0\0\x01\0\0\0\x33\0\0\0\x18\x04\0\0\0\0\0\0\x0a\0\0\0\x34\0\0\0\x50\x04\0\0\
+\0\0\0\0\x01\0\0\0\x30\0\0\0\x88\x04\0\0\0\0\0\0\x0a\0\0\0\x34\0\0\0\xc0\x04\0\
+\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x08\x05\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\x20\x05\
+\0\0\0\0\0\0\x0a\0\0\0\x32\0\0\0\x38\x05\0\0\0\0\0\0\x0a\0\0\0\x35\0\0\0\x50\
+\x05\0\0\0\0\0\0\x0a\0\0\0\x2e\0\0\0\x78\x05\0\0\0\0\0\0\x01\0\0\0\x24\0\0\0\
+\xa0\x05\0\0\0\0\0\0\x0a\0\0\0\x36\0\0\0\xa8\x05\0\0\0\0\0\0\x0a\0\0\0\x2c\0\0\
+\0\xf0\x05\0\0\0\0\0\0\x0a\0\0\0\x02\0\0\0\x30\x06\0\0\0\0\0\0\x01\0\0\0\x37\0\
+\0\0\x58\x06\0\0\0\0\0\0\x0a\0\0\0\x38\0\0\0\x80\x06\0\0\0\0\0\0\x01\0\0\0\x39\
+\0\0\0\xf8\x06\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x50\x07\0\0\0\0\0\0\x0a\0\0\0\
+\x2d\0\0\0\x58\x07\0\0\0\0\0\0\x01\0\0\0\x33\0\0\0\x88\x07\0\0\0\0\0\0\x0a\0\0\
+\0\x34\0\0\0\xc0\x07\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x18\x08\0\0\0\0\0\0\x0a\0\
+\0\0\x34\0\0\0\x50\x08\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\xb0\x08\0\0\0\0\0\0\x01\
+\0\0\0\x30\0\0\0\x08\x09\0\0\0\0\0\0\x0a\0\0\0\x34\0\0\0\x50\x09\0\0\0\0\0\0\
+\x01\0\0\0\x30\0\0\0\x98\x09\0\0\0\0\0\0\x0a\0\0\0\x2e\0\0\0\xc0\x09\0\0\0\0\0\
+\0\x0a\0\0\0\x2e\0\0\0\xe8\x09\0\0\0\0\0\0\x01\0\0\0\x3a\0\0\0\0\x0a\0\0\0\0\0\
+\0\x01\0\0\0\x24\0\0\0\x50\x0a\0\0\0\0\0\0\x0a\0\0\0\x35\0\0\0\x78\x0a\0\0\0\0\
+\0\0\x01\0\0\0\x30\0\0\0\xb8\x0a\0\0\0\0\0\0\x0a\0\0\0\x2c\0\0\0\xc8\x0a\0\0\0\
+\0\0\0\x0a\0\0\0\x2c\0\0\0\xf8\x0a\0\0\0\0\0\0\x0a\0\0\0\x36\0\0\0\x20\x0b\0\0\
+\0\0\0\0\x01\0\0\0\x30\0\0\0\x20\0\0\0\0\0\0\0\x01\0\0\0\x28\0\0\0\x70\0\0\0\0\
+\0\0\0\x01\0\0\0\x25\0\0\0\x88\0\0\0\0\0\0\0\x0a\0\0\0\x32\0\0\0\x98\0\0\0\0\0\
+\0\0\x01\0\0\0\x24\0\0\0\xc0\0\0\0\0\0\0\0\x01\0\0\0\x37\0\0\0\x10\x01\0\0\0\0\
+\0\0\x0a\0\0\0\x02\0\0\0\x20\x01\0\0\0\0\0\0\x01\0\0\0\x37\0\0\0\x58\x01\0\0\0\
+\0\0\0\x0a\0\0\0\x3c\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x2b\0\0\0\x30\0\0\0\0\0\0\
+\0\x01\0\0\0\x2a\0\0\0\x78\0\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\xa0\0\0\0\0\0\0\0\
+\x01\0\0\0\x31\0\0\0\xe0\0\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\xf8\0\0\0\0\0\0\0\
+\x0a\0\0\0\x32\0\0\0\x18\x01\0\0\0\0\0\0\x0a\0\0\0\x3e\0\0\0\x40\x01\0\0\0\0\0\
+\0\x0a\0\0\0\x2e\0\0\0\x70\x01\0\0\0\0\0\0\x01\0\0\0\x37\0\0\0\xa8\x01\0\0\0\0\
+\0\0\x0a\0\0\0\x38\0\0\0\xe0\x01\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x50\x02\0\0\0\
+\0\0\0\x0a\0\0\0\x3f\0\0\0\x80\x02\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\xc8\x02\0\0\
+\0\0\0\0\x0a\0\0\0\x36\0\0\0\xd0\x02\0\0\0\0\0\0\x01\0\0\0\x3a\0\0\0\xe8\x02\0\
+\0\0\0\0\0\x01\0\0\0\x24\0\0\0\x38\x03\0\0\0\0\0\0\x0a\0\0\0\x35\0\0\0\x60\x03\
+\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\xa0\x03\0\0\0\0\0\0\x01\0\0\0\x40\0\0\0\xe8\
+\x03\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x20\x04\0\0\0\0\0\0\x0a\0\0\0\x36\0\0\0\
+\x48\x04\0\0\0\0\0\0\x01\0\0\0\x30\0\0\0\x90\x04\0\0\0\0\0\0\x01\0\0\0\x30\0\0\
+\0\x08\0\0\0\0\0\0\0\x01\0\0\0\x24\0\0\0\x08\0\0\0\0\0\0\0\x01\0\0\0\x37\0\0\0\
+\x08\0\0\0\0\0\0\0\x01\0\0\0\x28\0\0\0\x48\0\0\0\0\0\0\0\x0a\0\0\0\x44\0\0\0\
+\x80\0\0\0\0\0\0\0\x0a\0\0\0\x45\0\0\0\x08\0\0\0\0\0\0\0\x01\0\0\0\x24\0\0\0\
+\x28\0\0\0\0\0\0\0\x0a\0\0\0\x48\0\0\0\x58\0\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\
+\x70\0\0\0\0\0\0\0\x0a\0\0\0\x32\0\0\0\x88\0\0\0\0\0\0\0\x0a\0\0\0\x44\0\0\0\
+\xb0\0\0\0\0\0\0\0\x0a\0\0\0\x49\0\0\0\xb8\0\0\0\0\0\0\0\x01\0\0\0\x2a\0\0\0\
+\xe8\0\0\0\0\0\0\0\x0a\0\0\0\x45\0\0\0\xf0\0\0\0\0\0\0\0\x0a\0\0\0\x44\0\0\0\
+\x10\x01\0\0\0\0\0\0\x0a\0\0\0\x49\0\0\0\x18\x01\0\0\0\0\0\0\x01\0\0\0\x2b\0\0\
+\0\x48\x01\0\0\0\0\0\0\x0a\0\0\0\x45\0\0\0\x50\x01\0\0\0\0\0\0\x01\0\0\0\x4a\0\
+\0\0\x90\x01\0\0\0\0\0\0\x0a\0\0\0\x4b\0\0\0\xa0\x01\0\0\0\0\0\0\x0a\0\0\0\x4c\
+\0\0\0\xe8\x01\0\0\0\0\0\0\x01\0\0\0\x31\0\0\0\x30\x02\0\0\0\0\0\0\x01\0\0\0\
+\x25\0\0\0\x48\x02\0\0\0\0\0\0\x0a\0\0\0\x32\0\0\0\x70\x02\0\0\0\0\0\0\x01\0\0\
+\0\x31\0\0\0\xb8\x02\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\xd8\x02\0\0\0\0\0\0\x01\0\
+\0\0\x02\0\0\0\x18\x03\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\x40\x03\0\0\0\0\0\0\x0a\
+\0\0\0\x4c\0\0\0\x68\x03\0\0\0\0\0\0\x0a\0\0\0\x4d\0\0\0\x80\x03\0\0\0\0\0\0\
+\x01\0\0\0\x4e\0\0\0\xc8\x03\0\0\0\0\0\0\x01\0\0\0\x25\0\0\0\xe0\x03\0\0\0\0\0\
+\0\x0a\0\0\0\x32\0\0\0\0\x04\0\0\0\0\0\0\x01\0\0\0\x4e\0\0\0\x28\x04\0\0\0\0\0\
+\0\x01\0\0\0\x02\0\0\0\x40\x04\0\0\0\0\0\0\x01\0\0\0\x4f\0\0\0\xb0\x04\0\0\0\0\
+\0\0\x01\0\0\0\x25\0\0\0\xc8\x04\0\0\0\0\0\0\x0a\0\0\0\x32\0\0\0\xe8\x04\0\0\0\
+\0\0\0\x0a\0\0\0\x32\0\0\0\x08\x05\0\0\0\0\0\0\x0a\0\0\0\x4d\0\0\0\x10\0\0\0\0\
+\0\0\0\x01\0\0\0\x51\0\0\0\x20\0\0\0\0\0\0\0\x01\0\0\0\x51\0\0\0\x48\0\0\0\0\0\
+\0\0\x01\0\0\0\x51\0\0\0\x78\0\0\0\0\0\0\0\x01\0\0\0\x52\0\0\0\x98\0\0\0\0\0\0\
+\0\x01\0\0\0\x53\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x55\0\0\0\x30\0\0\0\0\0\0\0\
+\x01\0\0\0\x23\0\0\0\x58\0\0\0\0\0\0\0\x01\0\0\0\x56\0\0\0\x78\0\0\0\0\0\0\0\
+\x01\0\0\0\x57\0\0\0\x98\0\0\0\0\0\0\0\x01\0\0\0\x58\0\0\0\xb8\0\0\0\0\0\0\0\
+\x01\0\0\0\x59\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\x27\0\0\0\x08\0\0\0\0\0\0\0\x02\
+\0\0\0\x3b\0\0\0\x18\0\0\0\0\0\0\0\x02\0\0\0\x3d\0\0\0\x30\0\0\0\0\0\0\0\x02\0\
+\0\0\x41\0\0\0\x38\0\0\0\0\0\0\0\x02\0\0\0\x42\0\0\0\x80\0\0\0\0\0\0\0\x02\0\0\
+\0\x43\0\0\0\x90\0\0\0\0\0\0\0\x02\0\0\0\x46\0\0\0\xf8\0\0\0\0\0\0\0\x02\0\0\0\
+\x47\0\0\0\0\x01\0\0\0\0\0\0\x02\0\0\0\x50\0\0\0\x9f\xeb\x01\0\x18\0\0\0\0\0\0\
+\0\x58\x68\0\0\x58\x68\0\0\x3c\x60\0\0\0\0\0\0\0\0\0\x02\x03\0\0\0\x01\0\0\0\0\
+\0\0\x01\x04\0\0\0\x20\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\
+\x1b\0\0\0\x05\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x06\0\0\0\
+\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\x08\0\0\0\0\0\x02\0\0\x04\
+\x10\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x2a\0\0\0\
+\0\0\0\x0e\x07\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x0a\0\0\0\0\0\0\0\0\0\0\x03\0\
+\0\0\0\x02\0\0\0\x04\0\0\0\x1d\0\0\0\0\0\0\0\0\0\0\x02\x0c\0\0\0\0\0\0\0\0\0\0\
+\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x02\0\0\0\0\0\0\0\
+\0\0\0\x02\x0f\0\0\0\x3a\0\0\0\x04\0\0\x04\x18\0\0\0\x43\0\0\0\x10\0\0\0\0\0\0\
+\0\x4c\0\0\0\x11\0\0\0\x40\0\0\0\x58\0\0\0\x14\0\0\0\x60\0\0\0\x66\0\0\0\x14\0\
+\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\x96\x02\0\0\x6f\0\0\0\0\0\0\x08\x12\0\0\0\x73\
+\0\0\0\0\0\0\x08\x13\0\0\0\x79\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\x86\0\0\0\0\
+\0\0\x08\x15\0\0\0\x8a\0\0\0\0\0\0\x08\x02\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\
+\x19\0\0\0\x09\0\0\0\0\0\0\0\x90\0\0\0\x0b\0\0\0\x40\0\0\0\x9a\0\0\0\x0d\0\0\0\
+\x80\0\0\0\x9e\0\0\0\x0e\0\0\0\xc0\0\0\0\xa4\0\0\0\0\0\0\x0e\x16\0\0\0\x01\0\0\
+\0\0\0\0\0\0\0\0\x02\x19\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\
+\x02\0\0\0\0\0\0\0\0\0\0\x02\x1b\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\
+\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\x02\x14\0\0\0\0\0\0\0\0\0\0\x02\x1e\0\0\0\xb2\0\
+\0\0\x02\0\0\x04\x18\0\0\0\xbb\0\0\0\x1f\0\0\0\0\0\0\0\xc1\0\0\0\x23\0\0\0\x80\
+\0\0\0\xd6\0\0\0\x01\0\0\x04\x10\0\0\0\xe0\0\0\0\x22\0\0\0\0\0\0\0\xe9\0\0\0\0\
+\0\0\x08\x21\0\0\0\xef\0\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x03\0\
+\0\0\0\x20\0\0\0\x04\0\0\0\x02\0\0\0\x02\x01\0\0\0\0\0\x08\x24\0\0\0\x07\x01\0\
+\0\0\0\0\x01\x01\0\0\0\x08\0\0\x04\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x18\
+\0\0\0\0\0\0\0\x1e\0\0\0\x1a\0\0\0\x40\0\0\0\x9a\0\0\0\x1c\0\0\0\x80\0\0\0\x9e\
+\0\0\0\x1d\0\0\0\xc0\0\0\0\x0d\x01\0\0\0\0\0\x0e\x25\0\0\0\x01\0\0\0\0\0\0\0\0\
+\0\0\x02\x11\0\0\0\0\0\0\0\0\0\0\x02\x29\0\0\0\x17\x01\0\0\x01\0\0\x04\x10\0\0\
+\0\xbb\0\0\0\x1f\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x18\0\0\
+\0\0\0\0\0\x1e\0\0\0\x0b\0\0\0\x40\0\0\0\x9a\0\0\0\x27\0\0\0\x80\0\0\0\x9e\0\0\
+\0\x28\0\0\0\xc0\0\0\0\x17\x01\0\0\0\0\0\x0e\x2a\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\
+\x02\x2d\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\x90\x01\0\x23\
+\x01\0\0\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x0b\0\0\0\0\0\0\0\x1e\0\0\0\x2c\0\0\0\
+\x40\0\0\0\x9a\0\0\0\x27\0\0\0\x80\0\0\0\x9e\0\0\0\x27\0\0\0\xc0\0\0\0\x34\x01\
+\0\0\0\0\0\x0e\x2e\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x31\0\0\0\0\0\0\0\0\0\0\
+\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x0c\0\0\0\0\0\0\0\0\0\0\x02\x2e\0\0\0\0\0\0\0\
+\0\0\0\x03\0\0\0\0\x32\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x04\x18\0\0\0\
+\x19\0\0\0\x30\0\0\0\0\0\0\0\x1e\0\0\0\x0b\0\0\0\x40\0\0\0\x9a\0\0\0\x27\0\0\0\
+\x80\0\0\0\x41\x01\0\0\x33\0\0\0\xc0\0\0\0\x48\x01\0\0\0\0\0\x0e\x34\0\0\0\x01\
+\0\0\0\0\0\0\0\0\0\0\x02\x37\0\0\0\x53\x01\0\0\x01\0\0\x04\x10\0\0\0\x5d\x01\0\
+\0\x39\0\0\0\0\0\0\0\x62\x01\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\0\0\
+\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x10\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\
+\0\0\x0b\0\0\0\0\0\0\0\x1e\0\0\0\x1a\0\0\0\x40\0\0\0\x9a\0\0\0\x36\0\0\0\x80\0\
+\0\0\x9e\0\0\0\x27\0\0\0\xc0\0\0\0\x67\x01\0\0\0\0\0\x0e\x3a\0\0\0\x01\0\0\0\
+\x77\x01\0\0\0\0\0\x0e\x3a\0\0\0\x01\0\0\0\0\0\0\0\x04\0\0\x04\x20\0\0\0\x19\0\
+\0\0\x0b\0\0\0\0\0\0\0\x1e\0\0\0\x1a\0\0\0\x40\0\0\0\x9a\0\0\0\x27\0\0\0\x80\0\
+\0\0\x9e\0\0\0\x27\0\0\0\xc0\0\0\0\x8a\x01\0\0\0\0\0\x0e\x3d\0\0\0\x01\0\0\0\
+\x98\x01\0\0\0\0\0\x0e\x3d\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x41\0\0\0\0\0\0\0\
+\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\x02\x43\0\0\0\0\
+\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x02\x45\0\
+\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\x02\
+\x47\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x12\0\0\0\0\0\0\0\x04\
+\0\0\x04\x20\0\0\0\x19\0\0\0\x40\0\0\0\0\0\0\0\xa9\x01\0\0\x42\0\0\0\x40\0\0\0\
+\xb2\x01\0\0\x44\0\0\0\x80\0\0\0\x1e\0\0\0\x46\0\0\0\xc0\0\0\0\xbd\x01\0\0\0\0\
+\0\x0e\x48\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x4b\0\0\0\xc3\x01\0\0\x02\0\0\x04\
+\x08\x04\0\0\xcf\x01\0\0\x4c\0\0\0\0\0\0\0\xd7\x01\0\0\x50\0\0\0\0\x20\0\0\xdd\
+\x01\0\0\0\0\0\x08\x4d\0\0\0\xcf\x01\0\0\x01\0\0\x04\0\x04\0\0\xe7\x01\0\0\x4f\
+\0\0\0\0\0\0\0\xec\x01\0\0\0\0\0\x01\x08\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x03\0\0\
+\0\0\x4e\0\0\0\x04\0\0\0\x80\0\0\0\xfa\x01\0\0\0\0\0\x08\x51\0\0\0\x05\x02\0\0\
+\x01\0\0\x04\x04\0\0\0\x15\x02\0\0\x52\0\0\0\0\0\0\0\x1a\x02\0\0\0\0\0\x08\x53\
+\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\0\x23\x02\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\x01\
+\0\0\x0d\x55\0\0\0\x2b\x02\0\0\x4a\0\0\0\0\0\0\0\0\0\0\x02\x56\0\0\0\0\0\0\0\0\
+\0\0\x0a\x4d\0\0\0\x30\x02\0\0\x01\0\0\x0c\x54\0\0\0\0\0\0\0\0\0\0\x02\x21\0\0\
+\0\0\0\0\0\x01\0\0\x0d\x14\0\0\0\x3a\x02\0\0\x58\0\0\0\x3e\x02\0\0\x01\0\0\x0c\
+\x59\0\0\0\0\0\0\0\0\0\0\x0d\0\0\0\0\x4e\x02\0\0\x02\0\0\x0c\x5b\0\0\0\x60\x02\
+\0\0\x02\0\0\x0c\x5b\0\0\0\x74\x02\0\0\x0e\x01\0\x84\x80\x36\0\0\x80\x02\0\0\
+\x5f\0\0\0\0\0\0\0\x8c\x02\0\0\x13\0\0\0\xc0\0\0\0\x94\x02\0\0\x13\0\0\0\xe0\0\
+\0\0\xa0\x02\0\0\x60\0\0\0\0\x01\0\0\xd7\x01\0\0\x50\0\0\0\x40\x01\0\0\xa6\x02\
+\0\0\x13\0\0\0\x60\x01\0\0\xac\x02\0\0\x13\0\0\0\x80\x01\0\0\xb3\x02\0\0\x02\0\
+\0\0\xa0\x01\0\0\xba\x02\0\0\x61\0\0\0\xc0\x01\0\0\xc5\x02\0\0\x13\0\0\0\x40\
+\x02\0\0\xd1\x02\0\0\x4e\0\0\0\x80\x02\0\0\xe5\x02\0\0\x68\0\0\0\xc0\x02\0\0\
+\xf0\x02\0\0\x02\0\0\0\0\x03\0\0\0\x03\0\0\x02\0\0\0\x20\x03\0\0\x09\x03\0\0\
+\x02\0\0\0\x40\x03\0\0\x0f\x03\0\0\x02\0\0\0\x60\x03\0\0\x14\x03\0\0\x02\0\0\0\
+\x80\x03\0\0\x20\x03\0\0\x02\0\0\0\xa0\x03\0\0\x2c\x03\0\0\x13\0\0\0\xc0\x03\0\
+\0\x38\x03\0\0\x69\0\0\0\0\x04\0\0\x3b\x03\0\0\x77\0\0\0\0\x0c\0\0\x3e\x03\0\0\
+\x79\0\0\0\x80\x0d\0\0\x41\x03\0\0\x88\0\0\0\x40\x15\0\0\x4b\x03\0\0\x8c\0\0\0\
+\x80\x15\0\0\x4f\x03\0\0\x94\0\0\0\0\x1c\0\0\x5b\x03\0\0\x6b\0\0\0\x40\x1c\0\0\
+\x65\x03\0\0\x4e\0\0\0\0\x1d\0\0\x71\x03\0\0\x13\0\0\0\x40\x1d\0\0\x81\x03\0\0\
+\x96\0\0\0\x80\x1d\0\0\x92\x03\0\0\x98\0\0\0\xc0\x1d\0\0\x9d\x03\0\0\x98\0\0\0\
+\0\x1e\0\0\xbd\x01\0\0\x99\0\0\0\0\x20\0\0\xa4\x03\0\0\x9a\0\0\0\0\x28\0\0\xb6\
+\x03\0\0\x13\0\0\0\x40\x28\0\0\xc1\x03\0\0\x13\0\0\0\x60\x28\0\0\xc8\x03\0\0\
+\x4e\0\0\0\x80\x28\0\0\xdd\x03\0\0\x02\0\0\0\xc0\x28\0\0\xed\x03\0\0\x9c\0\0\0\
+\0\x29\0\0\xf6\x03\0\0\x9e\0\0\0\x40\x29\0\0\x04\x04\0\0\x4c\0\0\0\x80\x29\0\0\
+\x0e\x04\0\0\x60\0\0\0\x80\x49\0\0\x20\x04\0\0\x67\0\0\0\xc0\x49\0\0\x33\x04\0\
+\0\x67\0\0\0\xd0\x49\0\0\x43\x04\0\0\x02\0\0\0\xe0\x49\0\0\x59\x04\0\0\x9f\0\0\
+\0\0\x4a\0\0\x71\x04\0\0\x6e\0\0\0\x40\x4a\0\0\x80\x04\0\0\xa1\0\0\0\xc0\x4a\0\
+\0\x91\x04\0\0\x4e\0\0\0\0\x4b\0\0\xa1\x04\0\0\x82\0\0\0\x40\x4b\0\0\xb3\x04\0\
+\0\x82\0\0\0\x48\x4b\0\0\xc1\x04\0\0\x02\0\0\0\x60\x4b\0\0\xd4\x04\0\0\x6e\0\0\
+\0\x80\x4b\0\0\xeb\x04\0\0\x02\0\0\0\0\x4c\0\0\xfe\x04\0\0\x6e\0\0\0\x40\x4c\0\
+\0\x12\x05\0\0\x02\0\0\0\xc0\x4c\0\0\x25\x05\0\0\x02\0\0\0\xe0\x4c\0\0\x34\x05\
+\0\0\x9f\0\0\0\0\x4d\0\0\x47\x05\0\0\x6e\0\0\0\x40\x4d\0\0\x58\x05\0\0\x6e\0\0\
+\0\xc0\x4d\0\0\x66\x05\0\0\x02\0\0\0\x40\x4e\0\0\x73\x05\0\0\xa2\0\0\0\x80\x4e\
+\0\0\x7e\x05\0\0\x6e\0\0\0\x80\x4f\0\0\x84\x05\0\0\xa3\0\0\0\0\x50\0\0\x93\x05\
+\0\0\x6b\0\0\0\x40\x51\0\0\xa5\x05\0\0\xa4\0\0\0\0\x52\0\0\xa8\x05\0\0\xa4\0\0\
+\0\x40\x52\0\0\xb2\x05\0\0\xa5\0\0\0\x80\x52\0\0\xca\x05\0\0\x02\0\0\0\xc0\x52\
+\0\0\xd5\x05\0\0\x02\0\0\0\xe0\x52\0\0\xdf\x05\0\0\x02\0\0\0\0\x53\0\0\xeb\x05\
+\0\0\x02\0\0\0\x20\x53\0\0\xf9\x05\0\0\x4e\0\0\0\x40\x53\0\0\0\x06\0\0\x13\0\0\
+\0\x80\x53\0\0\x0c\x06\0\0\x13\0\0\0\xa0\x53\0\x01\x20\x06\0\0\x13\0\0\0\xa1\
+\x53\0\x01\x3a\x06\0\0\x13\0\0\0\xa2\x53\0\x01\x49\x06\0\0\x13\0\0\0\xc0\x53\0\
+\x01\x5d\x06\0\0\x13\0\0\0\xc1\x53\0\x01\x6c\x06\0\0\x13\0\0\0\xc2\x53\0\x01\
+\x76\x06\0\0\x13\0\0\0\xc3\x53\0\x01\x80\x06\0\0\x13\0\0\0\xc4\x53\0\x01\x90\
+\x06\0\0\x13\0\0\0\xc5\x53\0\x01\x9d\x06\0\0\x13\0\0\0\xc6\x53\0\x01\xb1\x06\0\
+\0\x13\0\0\0\xc7\x53\0\x01\xb8\x06\0\0\x13\0\0\0\xc8\x53\0\x01\xc5\x06\0\0\x13\
+\0\0\0\xc9\x53\0\x01\xd1\x06\0\0\x13\0\0\0\xca\x53\0\x01\xdc\x06\0\0\x13\0\0\0\
+\xcb\x53\0\x01\xec\x06\0\0\x13\0\0\0\xcc\x53\0\x01\0\x07\0\0\x13\0\0\0\xcd\x53\
+\0\x01\x0d\x07\0\0\x4e\0\0\0\0\x54\0\0\x1a\x07\0\0\xa6\0\0\0\x40\x54\0\0\x28\
+\x07\0\0\xb6\0\0\0\0\x56\0\0\x2c\x07\0\0\xb6\0\0\0\x20\x56\0\0\x31\x07\0\0\x4e\
+\0\0\0\x40\x56\0\0\x3e\x07\0\0\x68\0\0\0\x80\x56\0\0\x4a\x07\0\0\x68\0\0\0\xc0\
+\x56\0\0\x51\x07\0\0\x6e\0\0\0\0\x57\0\0\x5a\x07\0\0\x6e\0\0\0\x80\x57\0\0\x62\
+\x07\0\0\x68\0\0\0\0\x58\0\0\x6f\x07\0\0\x6e\0\0\0\x40\x58\0\0\x77\x07\0\0\x6e\
+\0\0\0\xc0\x58\0\0\x84\x07\0\0\xb8\0\0\0\x40\x59\0\0\x8f\x07\0\0\xbb\0\0\0\x80\
+\x59\0\0\x99\x07\0\0\x6e\0\0\0\x80\x5b\0\0\xa5\x07\0\0\xbc\0\0\0\0\x5c\0\0\xb0\
+\x07\0\0\x0d\0\0\0\x40\x5c\0\0\xbe\x07\0\0\x0d\0\0\0\x80\x5c\0\0\xce\x07\0\0\
+\x60\0\0\0\xc0\x5c\0\0\xdd\x07\0\0\x6d\0\0\0\0\x5d\0\0\xe3\x07\0\0\x6d\0\0\0\
+\x40\x5d\0\0\xe9\x07\0\0\x6d\0\0\0\x80\x5d\0\0\xef\x07\0\0\xbd\0\0\0\xc0\x5d\0\
+\0\xfc\x07\0\0\xc5\0\0\0\x80\x5e\0\0\x02\x08\0\0\x52\0\0\0\0\x60\0\0\x10\x08\0\
+\0\x4e\0\0\0\x40\x60\0\0\x16\x08\0\0\x4e\0\0\0\x80\x60\0\0\x1d\x08\0\0\x6d\0\0\
+\0\xc0\x60\0\0\x28\x08\0\0\x6d\0\0\0\0\x61\0\0\x37\x08\0\0\x4e\0\0\0\x40\x61\0\
+\0\x3f\x08\0\0\x4e\0\0\0\x80\x61\0\0\x47\x08\0\0\xc9\0\0\0\xc0\x61\0\0\x57\x08\
+\0\0\xcf\0\0\0\x40\x64\0\0\x6c\x08\0\0\xd6\0\0\0\0\x66\0\0\x79\x08\0\0\xd6\0\0\
+\0\x40\x66\0\0\x83\x08\0\0\xd6\0\0\0\x80\x66\0\0\x88\x08\0\0\xe3\0\0\0\xc0\x66\
+\0\0\x5d\x01\0\0\x39\0\0\0\0\x67\0\0\x9d\x08\0\0\xe9\0\0\0\x80\x67\0\0\xa7\x08\
+\0\0\xea\0\0\0\xc0\x67\0\0\xaf\x08\0\0\xec\0\0\0\0\x68\0\0\xb7\x08\0\0\x4e\0\0\
+\0\x80\x68\0\0\xc9\x08\0\0\x4e\0\0\0\xc0\x68\0\0\xda\x08\0\0\xed\0\0\0\0\x69\0\
+\0\xdd\x08\0\0\xee\0\0\0\x40\x69\0\0\xe3\x08\0\0\xef\0\0\0\x80\x69\0\0\xec\x08\
+\0\0\xf0\0\0\0\xc0\x69\0\0\xf4\x08\0\0\xf1\0\0\0\0\x6a\0\0\xfb\x08\0\0\xf2\0\0\
+\0\x40\x6a\0\0\x03\x09\0\0\xf3\0\0\0\x80\x6a\0\0\x0b\x09\0\0\xf3\0\0\0\xc0\x6a\
+\0\0\x18\x09\0\0\xf3\0\0\0\0\x6b\0\0\x26\x09\0\0\xf6\0\0\0\x40\x6b\0\0\x2e\x09\
+\0\0\x4e\0\0\0\0\x6c\0\0\x38\x09\0\0\xf7\0\0\0\x40\x6c\0\0\x44\x09\0\0\x13\0\0\
+\0\x80\x6c\0\0\x51\x09\0\0\xd1\0\0\0\xc0\x6c\0\0\x5c\x09\0\0\xfa\0\0\0\0\x6d\0\
+\0\x6a\x09\0\0\xd9\0\0\0\x40\x6d\0\0\x73\x09\0\0\x13\0\0\0\x60\x6d\0\0\x7d\x09\
+\0\0\xfb\0\0\0\x80\x6d\0\0\x85\x09\0\0\xfd\0\0\0\0\x6e\0\0\x96\x09\0\0\x6d\0\0\
+\0\0\x6f\0\0\xa5\x09\0\0\x6d\0\0\0\x40\x6f\0\0\xb2\x09\0\0\xff\0\0\0\x80\x6f\0\
+\0\xbd\x09\0\0\xbe\0\0\0\xa0\x6f\0\0\xc5\x09\0\0\x02\x01\0\0\xc0\x6f\0\0\xcc\
+\x09\0\0\xcc\0\0\0\0\x70\0\0\xd7\x09\0\0\x68\0\0\0\x80\x70\0\0\xe3\x09\0\0\x04\
+\x01\0\0\xc0\x70\0\0\xf1\x09\0\0\x13\0\0\0\0\x71\0\0\xfa\x09\0\0\x60\0\0\0\x40\
+\x71\0\0\x07\x0a\0\0\x05\x01\0\0\x80\x71\0\0\x10\x0a\0\0\x06\x01\0\0\xc0\x71\0\
+\0\x15\x0a\0\0\x07\x01\0\0\0\x72\0\0\x23\x0a\0\0\x08\x01\0\0\x40\x72\0\0\x2e\
+\x0a\0\0\x09\x01\0\0\x80\x72\0\0\x3e\x0a\0\0\x4e\0\0\0\xc0\x72\0\0\x4d\x0a\0\0\
+\x0a\x01\0\0\0\x73\0\0\x5a\x0a\0\0\x0c\x01\0\0\x40\x73\0\0\x5f\x0a\0\0\x13\0\0\
+\0\0\x75\0\0\x69\x0a\0\0\x6d\0\0\0\x40\x75\0\0\x77\x0a\0\0\x6d\0\0\0\x80\x75\0\
+\0\x84\x0a\0\0\x6d\0\0\0\xc0\x75\0\0\x91\x0a\0\0\x0d\x01\0\0\0\x76\0\0\x9e\x0a\
+\0\0\x10\x01\0\0\0\x7a\0\0\xaf\x0a\0\0\x02\0\0\0\x20\x7a\0\0\xc7\x0a\0\0\x12\
+\x01\0\0\x40\x7a\0\0\xcf\x0a\0\0\x6e\0\0\0\x80\x7a\0\0\xd7\x0a\0\0\x11\0\0\0\0\
+\x7b\0\0\xde\x0a\0\0\x11\0\0\0\x20\x7b\0\0\xe3\x0a\0\0\x13\x01\0\0\x40\x7b\0\0\
+\xef\x0a\0\0\x14\x01\0\0\x80\x7b\0\0\x02\x0b\0\0\x6e\0\0\0\xc0\x7b\0\0\x10\x0b\
+\0\0\x15\x01\0\0\x40\x7c\0\0\x1f\x0b\0\0\xd4\0\0\0\x80\x7c\0\0\x30\x0b\0\0\x13\
+\0\0\0\x80\x7d\0\0\x3c\x0b\0\0\x16\x01\0\0\xa0\x7d\0\0\x4b\x0b\0\0\x17\x01\0\0\
+\xc0\x7d\0\0\x5b\x0b\0\0\xd4\0\0\0\0\x7e\0\0\x6c\x0b\0\0\x6e\0\0\0\0\x7f\0\0\
+\x7c\x0b\0\0\x18\x01\0\0\x80\x7f\0\0\x86\x0b\0\0\x19\x01\0\0\xc0\x7f\0\0\x8e\
+\x0b\0\0\x82\0\0\0\xd0\x7f\0\0\x98\x0b\0\0\x19\x01\0\0\xe0\x7f\0\0\xa7\x0b\0\0\
+\x02\0\0\0\0\x80\0\0\xb5\x0b\0\0\x13\0\0\0\x20\x80\0\0\xc6\x0b\0\0\x13\0\0\0\
+\x40\x80\0\0\xdb\x0b\0\0\x02\0\0\0\x60\x80\0\0\xee\x0b\0\0\x4e\0\0\0\x80\x80\0\
+\0\x01\x0c\0\0\x6d\0\0\0\xc0\x80\0\0\x0c\x0c\0\0\x6d\0\0\0\0\x81\0\0\x25\x0c\0\
+\0\x6d\0\0\0\x40\x81\0\0\x3b\x0c\0\0\xd0\0\0\0\x80\x81\0\0\x45\x0c\0\0\x1a\x01\
+\0\0\0\x82\0\0\x50\x0c\0\0\x1b\x01\0\0\x40\x82\0\0\x5c\x0c\0\0\x4e\0\0\0\x80\
+\x82\0\0\x6e\x0c\0\0\x1c\x01\0\0\xc0\x82\0\0\x83\x0c\0\0\x4e\0\0\0\x80\x83\0\0\
+\x97\x0c\0\0\x1d\x01\0\0\xc0\x83\0\0\x9c\x0c\0\0\x11\0\0\0\0\x84\0\0\xa5\x0c\0\
+\0\x11\0\0\0\x20\x84\0\0\xae\x0c\0\0\x4e\0\0\0\x40\x84\0\0\xbe\x0c\0\0\x02\0\0\
+\0\x80\x84\0\0\xc5\x0c\0\0\x02\0\0\0\xa0\x84\0\0\xd1\x0c\0\0\x02\0\0\0\xc0\x84\
+\0\0\xe2\x0c\0\0\x02\0\0\0\xe0\x84\0\0\xf0\x0c\0\0\xd0\0\0\0\0\x85\0\0\xf9\x0c\
+\0\0\x1e\x01\0\0\x80\x85\0\0\x01\x0d\0\0\x20\x01\0\0\xc0\xa5\0\0\x0d\x0d\0\0\
+\x21\x01\0\0\0\xa6\0\0\x17\x0d\0\0\x23\x01\0\0\x80\xa6\0\0\x1e\x0d\0\0\x02\0\0\
+\0\xc0\xa6\0\0\x29\x0d\0\0\x02\0\0\0\xe0\xa6\0\0\x3a\x0d\0\0\x4e\0\0\0\0\xa7\0\
+\0\x4c\x0d\0\0\x02\0\0\0\x40\xa7\0\0\x61\x0d\0\0\x26\x01\0\0\x80\xa7\0\0\x70\
+\x0d\0\0\x6d\0\0\0\x80\x1f\x01\0\x7f\x0d\0\0\x6d\0\0\0\xc0\x1f\x01\0\x96\x0d\0\
+\0\x02\0\0\0\0\x20\x01\0\xa5\x0d\0\0\x02\0\0\0\x20\x20\x01\0\xb4\x0d\0\0\x1b\
+\x01\0\0\x40\x20\x01\0\xbe\x0d\0\0\x21\0\0\0\x80\x20\x01\0\xcf\x0d\0\0\x52\0\0\
+\0\xc0\x20\x01\0\xdd\x0d\0\0\x52\0\0\0\xe0\x20\x01\0\xf1\x0d\0\0\x4e\0\0\0\0\
+\x21\x01\0\x01\x0e\0\0\x13\0\0\0\x40\x21\x01\0\x1a\x0e\0\0\x27\x01\0\0\x80\x21\
+\x01\0\x27\x0e\0\0\x28\x01\0\0\xc0\x21\x01\0\x2d\x0e\0\0\x29\x01\0\0\0\x22\x01\
+\0\x3b\x0e\0\0\x2a\x01\0\0\x40\x22\x01\0\x41\x0e\0\0\x13\0\0\0\x80\x22\x01\0\
+\x4f\x0e\0\0\x13\0\0\0\xa0\x22\x01\0\x61\x0e\0\0\x2b\x01\0\0\xc0\x22\x01\0\x6b\
+\x0e\0\0\xd0\0\0\0\xc0\x22\x01\0\x6f\x0e\0\0\x50\0\0\0\x40\x23\x01\0\x79\x0e\0\
+\0\x02\0\0\0\x60\x23\x01\0\x8c\x0e\0\0\x68\0\0\0\x80\x23\x01\0\x9c\x0e\0\0\x2c\
+\x01\0\0\xc0\x23\x01\0\xad\x0e\0\0\x30\x01\0\0\0\x25\x01\0\xbb\x0e\0\0\x50\0\0\
+\0\x40\x25\x01\0\xca\x0e\0\0\x02\0\0\0\x60\x25\x01\0\xd6\x0e\0\0\x60\0\0\0\x80\
+\x25\x01\0\xdf\x0e\0\0\x31\x01\0\0\xc0\x25\x01\0\xeb\x0e\0\0\x32\x01\0\0\0\x26\
+\x01\0\xf3\x0e\0\0\x33\x01\0\0\x40\x26\x01\0\x03\x0f\0\0\x60\0\0\0\x80\x26\x01\
+\0\x0d\x0f\0\0\x20\0\0\0\xc0\x26\x01\0\x18\x0f\0\0\x6d\0\0\0\0\x27\x01\0\x21\
+\x0f\0\0\x20\0\0\0\x40\x27\x01\x01\x2a\x0f\0\0\x20\0\0\0\x41\x27\x01\x01\x39\
+\x0f\0\0\x20\0\0\0\x42\x27\x01\x3e\x48\x0f\0\0\xd0\0\0\0\x80\x27\x01\0\x54\x0f\
+\0\0\x02\0\0\0\0\x28\x01\0\x5e\x0f\0\0\x34\x01\0\0\x40\x28\x01\0\x72\x0f\0\0\
+\x34\x01\0\0\x80\x28\x01\0\x7b\x0f\0\0\xd0\0\0\0\xc0\x28\x01\0\x8a\x0f\0\0\x37\
+\x01\0\0\x40\x29\x01\0\x8d\x0f\0\0\x38\x01\0\0\x80\x29\x01\0\x9b\x0f\0\0\x39\
+\x01\0\0\0\x2a\x01\0\x80\x02\0\0\x04\0\0\x04\x18\0\0\0\xa6\x02\0\0\x4e\0\0\0\0\
+\0\0\0\xa2\x0f\0\0\x4e\0\0\0\x40\0\0\0\xaf\x0f\0\0\x11\0\0\0\x80\0\0\0\xb6\x0f\
+\0\0\x11\0\0\0\xa0\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\0\xba\x0f\0\0\x04\0\0\x04\x10\
+\0\0\0\xcd\x0f\0\0\x62\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0\x40\0\0\0\xd3\x0f\0\0\
+\x65\0\0\0\x60\0\0\0\xd7\x0f\0\0\x65\0\0\0\x70\0\0\0\xdb\x0f\0\0\x01\0\0\x04\
+\x08\0\0\0\xe6\x0f\0\0\x63\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x62\0\0\0\0\0\0\0\
+\x02\0\0\x05\x04\0\0\0\xeb\x0f\0\0\x13\0\0\0\0\0\0\0\xf3\x0f\0\0\x52\0\0\0\0\0\
+\0\0\xfb\x0f\0\0\0\0\0\x08\x66\0\0\0\xff\x0f\0\0\0\0\0\x08\x67\0\0\0\x05\x10\0\
+\0\0\0\0\x01\x02\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\x02\x5e\0\0\0\x14\x10\0\0\x17\0\
+\0\x04\0\x01\0\0\x21\x10\0\0\x6a\0\0\0\0\0\0\0\x26\x10\0\0\x6b\0\0\0\x80\0\0\0\
+\x2f\x10\0\0\x6d\0\0\0\x40\x01\0\0\x38\x10\0\0\x6d\0\0\0\x80\x01\0\0\x45\x10\0\
+\0\x6d\0\0\0\xc0\x01\0\0\x4f\x10\0\0\x6e\0\0\0\0\x02\0\0\x09\x03\0\0\x70\0\0\0\
+\x80\x02\0\0\x5a\x10\0\0\x70\0\0\0\x88\x02\0\0\x68\x10\0\0\x70\0\0\0\x90\x02\0\
+\0\x75\x10\0\0\x70\0\0\0\x98\x02\0\0\x82\x10\0\0\x6d\0\0\0\xc0\x02\0\0\x8d\x10\
+\0\0\x6d\0\0\0\0\x03\0\0\x9e\x10\0\0\x6d\0\0\0\x40\x03\0\0\xb4\x10\0\0\x6d\0\0\
+\0\x80\x03\0\0\xbd\x10\0\0\x71\0\0\0\xc0\x03\0\0\xc2\x10\0\0\x6d\0\0\0\0\x04\0\
+\0\xc8\x10\0\0\x6d\0\0\0\x40\x04\0\0\xd6\x10\0\0\x02\0\0\0\x80\x04\0\0\x4a\x07\
+\0\0\x74\0\0\0\xc0\x04\0\0\xdc\x10\0\0\x75\0\0\0\0\x05\0\0\xe3\x10\0\0\x75\0\0\
+\0\x40\x05\0\0\xe8\x10\0\0\x4e\0\0\0\x80\x05\0\0\xf8\x10\0\0\x76\0\0\0\0\x06\0\
+\0\xfc\x10\0\0\x02\0\0\x04\x10\0\0\0\x08\x11\0\0\x4e\0\0\0\0\0\0\0\x0f\x11\0\0\
+\x11\0\0\0\x40\0\0\0\x1a\x11\0\0\x03\0\0\x04\x18\0\0\0\x22\x11\0\0\x4e\0\0\0\0\
+\0\0\0\x34\x11\0\0\x6c\0\0\0\x40\0\0\0\x3d\x11\0\0\x6c\0\0\0\x80\0\0\0\0\0\0\0\
+\0\0\0\x02\x6b\0\0\0\x45\x11\0\0\0\0\0\x08\x20\0\0\0\x49\x11\0\0\x02\0\0\x04\
+\x10\0\0\0\xe6\x0f\0\0\x6f\0\0\0\0\0\0\0\x53\x11\0\0\x6f\0\0\0\x40\0\0\0\0\0\0\
+\0\0\0\0\x02\x6e\0\0\0\x58\x11\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\0\x66\x11\0\0\0\
+\0\0\x08\x72\0\0\0\x6a\x11\0\0\0\0\0\x08\x73\0\0\0\x70\x11\0\0\0\0\0\x01\x08\0\
+\0\0\x40\0\0\x01\0\0\0\0\0\0\0\x02\x69\0\0\0\0\0\0\0\0\0\0\x02\x9e\x02\0\0\x7a\
+\x11\0\0\x09\0\0\x04\x40\0\0\0\x84\x11\0\0\x6d\0\0\0\0\0\0\0\x95\x11\0\0\x6d\0\
+\0\0\x40\0\0\0\x9e\x11\0\0\x6d\0\0\0\x80\0\0\0\xab\x11\0\0\x11\0\0\0\xc0\0\0\0\
+\xb4\x11\0\0\x11\0\0\0\xe0\0\0\0\xc3\x11\0\0\x4e\0\0\0\0\x01\0\0\xcc\x11\0\0\
+\x4e\0\0\0\x40\x01\0\0\xd9\x11\0\0\x4e\0\0\0\x80\x01\0\0\xe2\x11\0\0\x13\0\0\0\
+\xc0\x01\0\0\xeb\x11\0\0\x07\0\0\x04\x30\0\0\0\xfb\x11\0\0\x6e\0\0\0\0\0\0\0\
+\x04\x12\0\0\x4e\0\0\0\x80\0\0\0\x0c\x12\0\0\x4e\0\0\0\xc0\0\0\0\x1b\x12\0\0\
+\x13\0\0\0\0\x01\0\0\x09\x03\0\0\x67\0\0\0\x20\x01\0\0\x26\x12\0\0\x67\0\0\0\
+\x30\x01\0\0\x2e\x12\0\0\x78\0\0\0\x40\x01\0\0\0\0\0\0\0\0\0\x02\x77\0\0\0\x33\
+\x12\0\0\x17\0\0\x84\xf8\0\0\0\x1a\x11\0\0\x6b\0\0\0\0\0\0\0\x43\x12\0\0\x6d\0\
+\0\0\xc0\0\0\0\x4e\x12\0\0\x6d\0\0\0\0\x01\0\0\x5a\x12\0\0\x6d\0\0\0\x40\x01\0\
+\0\x64\x12\0\0\x6d\0\0\0\x80\x01\0\0\x6a\x12\0\0\x6d\0\0\0\xc0\x01\0\0\x75\x12\
+\0\0\x71\0\0\0\0\x02\0\0\x2f\x10\0\0\x6d\0\0\0\x40\x02\0\0\xa6\x02\0\0\x13\0\0\
+\0\x80\x02\0\0\x7d\x12\0\0\x13\0\0\0\xa0\x02\0\x01\x8a\x12\0\0\x13\0\0\0\xa1\
+\x02\0\x01\x95\x12\0\0\x13\0\0\0\xa2\x02\0\x01\xa7\x12\0\0\x13\0\0\0\xa3\x02\0\
+\x01\x41\x03\0\0\x13\0\0\0\xa4\x02\0\x01\xb2\x12\0\0\x13\0\0\0\xa5\x02\0\x01\
+\xbb\x12\0\0\x13\0\0\0\xa6\x02\0\x01\xca\x12\0\0\x13\0\0\0\xa7\x02\0\x01\xdb\
+\x12\0\0\x7a\0\0\0\xc0\x02\0\0\xe4\x12\0\0\x7a\0\0\0\xc0\x04\0\0\xf3\x12\0\0\
+\x84\0\0\0\xc0\x06\0\0\xf6\x12\0\0\x85\0\0\0\0\x07\0\0\x07\x13\0\0\x89\0\0\0\
+\x40\x07\0\0\x18\x13\0\0\x88\0\0\0\x80\x07\0\0\x1e\x13\0\0\x08\0\0\x04\x40\0\0\
+\0\x26\x13\0\0\x7b\0\0\0\0\0\0\0\x2b\x13\0\0\x7c\0\0\0\0\x01\0\0\x38\x13\0\0\
+\x7d\0\0\0\x40\x01\0\0\x41\x13\0\0\x81\0\0\0\x80\x01\0\0\x46\x13\0\0\x82\0\0\0\
+\xc0\x01\0\0\x4c\x13\0\0\x82\0\0\0\xc8\x01\0\0\x53\x13\0\0\x82\0\0\0\xd0\x01\0\
+\0\x5b\x13\0\0\x82\0\0\0\xd8\x01\0\0\x63\x13\0\0\x02\0\0\x04\x20\0\0\0\x26\x13\
+\0\0\x6b\0\0\0\0\0\0\0\x73\x13\0\0\x7c\0\0\0\xc0\0\0\0\x7b\x13\0\0\0\0\0\x08\
+\x71\0\0\0\0\0\0\0\0\0\0\x02\x7e\0\0\0\0\0\0\0\x01\0\0\x0d\x7f\0\0\0\0\0\0\0\
+\x80\0\0\0\x83\x13\0\0\x02\0\0\x06\x04\0\0\0\x93\x13\0\0\0\0\0\0\xa5\x13\0\0\
+\x01\0\0\0\0\0\0\0\0\0\0\x02\x7a\0\0\0\0\0\0\0\0\0\0\x02\xa1\x02\0\0\xb5\x13\0\
+\0\0\0\0\x08\x83\0\0\0\xb8\x13\0\0\0\0\0\x08\x70\0\0\0\0\0\0\0\0\0\0\x02\x9d\
+\x02\0\0\xbd\x13\0\0\0\0\0\x08\x86\0\0\0\0\0\0\0\0\0\0\x02\x87\0\0\0\0\0\0\0\
+\x01\0\0\x0d\x23\0\0\0\0\0\0\0\x88\0\0\0\0\0\0\0\0\0\0\x02\x79\0\0\0\xd3\x13\0\
+\0\0\0\0\x08\x8a\0\0\0\0\0\0\0\0\0\0\x02\x8b\0\0\0\0\0\0\0\x01\0\0\x0d\x68\0\0\
+\0\0\0\0\0\x88\0\0\0\xe4\x13\0\0\x16\0\0\x04\xd0\0\0\0\xf5\x13\0\0\x8d\0\0\0\0\
+\0\0\0\xf9\x13\0\0\x8e\0\0\0\x40\0\0\0\x02\x14\0\0\x6b\0\0\0\0\x01\0\0\x0b\x14\
+\0\0\x11\0\0\0\xc0\x01\0\0\x13\x14\0\0\x11\0\0\0\xe0\x01\0\0\xa6\x02\0\0\x11\0\
+\0\0\0\x02\0\0\x08\x11\0\0\x11\0\0\0\x20\x02\0\0\x1d\x14\0\0\x14\0\0\0\x40\x02\
+\0\0\x28\x14\0\0\x14\0\0\0\x60\x02\0\0\x34\x14\0\0\x11\0\0\0\x80\x02\0\0\x3c\
+\x14\0\0\x8f\0\0\0\xc0\x02\0\0\x45\x14\0\0\x90\0\0\0\x40\x03\0\0\x4f\x14\0\0\
+\x6e\0\0\0\x80\x03\0\0\x5d\x14\0\0\x4e\0\0\0\0\x04\0\0\x69\x14\0\0\x6d\0\0\0\
+\x40\x04\0\0\x77\x14\0\0\x6d\0\0\0\x80\x04\0\0\x83\x14\0\0\x6d\0\0\0\xc0\x04\0\
+\0\xc2\x10\0\0\x6d\0\0\0\0\x05\0\0\x92\x14\0\0\x6d\0\0\0\x40\x05\0\0\x9c\x14\0\
+\0\x23\0\0\0\x80\x05\0\0\xa5\x14\0\0\x93\0\0\0\xc0\x05\0\0\xb6\x14\0\0\x6e\0\0\
+\0\0\x06\0\0\0\0\0\0\0\0\0\x02\xa0\x02\0\0\xc1\x14\0\0\x03\0\0\x04\x18\0\0\0\
+\x26\x13\0\0\x6e\0\0\0\0\0\0\0\xa6\x02\0\0\x11\0\0\0\x80\0\0\0\xd3\x14\0\0\x11\
+\0\0\0\xa0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x68\0\0\0\x04\0\0\0\x02\0\0\0\xd8\
+\x14\0\0\0\0\0\x08\x91\0\0\0\xe6\x14\0\0\0\0\0\x08\x92\0\0\0\0\0\0\0\x01\0\0\
+\x04\x08\0\0\0\x23\x02\0\0\x71\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x33\x02\0\0\0\0\
+\0\0\0\0\0\x02\x95\0\0\0\0\0\0\0\0\0\0\x0a\xcb\x02\0\0\0\0\0\0\0\0\0\x02\xca\
+\x02\0\0\xf1\x14\0\0\x04\0\0\x84\x04\0\0\0\x9e\0\0\0\x13\0\0\0\0\0\0\x0b\xfb\
+\x14\0\0\x13\0\0\0\x0b\0\0\x03\x05\x15\0\0\x13\0\0\0\x0e\0\0\x01\x0c\x15\0\0\
+\x13\0\0\0\x0f\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x97\0\0\0\x04\0\0\0\x02\0\0\0\
+\x19\x15\0\0\x1d\0\0\x04\0\x01\0\0\x2a\x15\0\0\x6d\0\0\0\0\0\0\0\x35\x15\0\0\
+\x6d\0\0\0\x40\0\0\0\x3e\x15\0\0\x6d\0\0\0\x80\0\0\0\x49\x15\0\0\x6d\0\0\0\xc0\
+\0\0\0\x52\x15\0\0\x6d\0\0\0\0\x01\0\0\x5f\x15\0\0\x6d\0\0\0\x40\x01\0\0\x6a\
+\x15\0\0\x6d\0\0\0\x80\x01\0\0\x76\x15\0\0\x6d\0\0\0\xc0\x01\0\0\x80\x15\0\0\
+\x71\0\0\0\0\x02\0\0\x92\x15\0\0\x6d\0\0\0\x40\x02\0\0\x9e\x15\0\0\x6d\0\0\0\
+\x80\x02\0\0\xa8\x15\0\0\x71\0\0\0\xc0\x02\0\0\xba\x15\0\0\x71\0\0\0\0\x03\0\0\
+\xc3\x15\0\0\x6d\0\0\0\x40\x03\0\0\xcd\x15\0\0\x6d\0\0\0\x80\x03\0\0\xe0\x15\0\
+\0\x6d\0\0\0\xc0\x03\0\0\xfc\x15\0\0\x6d\0\0\0\0\x04\0\0\x19\x16\0\0\x6d\0\0\0\
+\x40\x04\0\0\x32\x16\0\0\x6d\0\0\0\x80\x04\0\0\x47\x16\0\0\x6d\0\0\0\xc0\x04\0\
+\0\x52\x16\0\0\x6d\0\0\0\0\x05\0\0\x62\x16\0\0\x6d\0\0\0\x40\x05\0\0\x75\x16\0\
+\0\x6d\0\0\0\x80\x05\0\0\x86\x16\0\0\x6d\0\0\0\xc0\x05\0\0\x98\x16\0\0\x6d\0\0\
+\0\0\x06\0\0\xaa\x16\0\0\x6d\0\0\0\x40\x06\0\0\xc5\x16\0\0\x6d\0\0\0\x80\x06\0\
+\0\xd8\x16\0\0\x6d\0\0\0\xc0\x06\0\0\xe8\x16\0\0\x6d\0\0\0\0\x07\0\0\xfb\x16\0\
+\0\x01\0\0\x04\x08\0\0\0\x06\x17\0\0\x9b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xb9\0\
+\0\0\0\0\0\0\0\0\0\x02\x9d\0\0\0\0\0\0\0\0\0\0\x0a\x4c\0\0\0\0\0\0\0\0\0\0\x02\
+\x4c\0\0\0\x0c\x17\0\0\x02\0\0\x05\x04\0\0\0\x18\x17\0\0\xa0\0\0\0\0\0\0\0\x1a\
+\x17\0\0\x11\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x04\x04\0\0\0\x03\x09\0\0\x82\0\0\0\
+\0\0\0\0\x1c\x17\0\0\x82\0\0\0\x08\0\0\0\x24\x17\0\0\x82\0\0\0\x10\0\0\0\x2d\
+\x17\0\0\x82\0\0\0\x18\0\0\0\0\0\0\0\0\0\0\x02\xcc\x02\0\0\x73\x05\0\0\x04\0\0\
+\x04\x20\0\0\0\x35\x17\0\0\x4e\0\0\0\0\0\0\0\x3c\x17\0\0\x21\0\0\0\x40\0\0\0\
+\x46\x17\0\0\x21\0\0\0\x80\0\0\0\x53\x17\0\0\x21\0\0\0\xc0\0\0\0\x5f\x17\0\0\
+\x03\0\0\x04\x28\0\0\0\x0f\x03\0\0\x02\0\0\0\0\0\0\0\x6a\x17\0\0\x6e\0\0\0\x40\
+\0\0\0\x74\x17\0\0\x6e\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\x9f\x02\0\0\0\0\0\0\0\
+\0\0\x02\xa2\x02\0\0\x1a\x07\0\0\x03\0\0\x04\x38\0\0\0\x7e\x17\0\0\x4e\0\0\0\0\
+\0\0\0\x88\x17\0\0\xa7\0\0\0\x40\0\0\0\0\0\0\0\xab\0\0\0\x80\0\0\0\0\0\0\0\0\0\
+\0\x02\xa8\0\0\0\0\0\0\0\x01\0\0\x0d\xa9\0\0\0\0\0\0\0\xaa\0\0\0\x8b\x17\0\0\0\
+\0\0\x01\x08\0\0\0\x40\0\0\x01\0\0\0\0\0\0\0\x02\xa6\0\0\0\0\0\0\0\x03\0\0\x05\
+\x28\0\0\0\x90\x17\0\0\xac\0\0\0\0\0\0\0\x96\x17\0\0\xad\0\0\0\0\0\0\0\xa0\x17\
+\0\0\xb4\0\0\0\0\0\0\0\0\0\0\0\x06\0\0\x04\x28\0\0\0\xa5\x17\0\0\x27\0\0\0\0\0\
+\0\0\xab\x17\0\0\x11\0\0\0\x40\0\0\0\xa6\x02\0\0\x11\0\0\0\x60\0\0\0\xaf\x17\0\
+\0\x11\0\0\0\x80\0\0\0\xb6\x17\0\0\x6d\0\0\0\xc0\0\0\0\xbb\x17\0\0\x27\0\0\0\0\
+\x01\0\0\0\0\0\0\x04\0\0\x04\x18\0\0\0\xc2\x17\0\0\xae\0\0\0\0\0\0\0\x19\0\0\0\
+\xb0\0\0\0\x20\0\0\0\0\0\0\0\xb1\0\0\0\x40\0\0\0\x73\x13\0\0\x6d\0\0\0\x80\0\0\
+\0\xca\x17\0\0\0\0\0\x08\xaf\0\0\0\xd4\x17\0\0\0\0\0\x08\x02\0\0\0\xe7\x17\0\0\
+\x03\0\0\x06\x04\0\0\0\xf5\x17\0\0\0\0\0\0\xfd\x17\0\0\x01\0\0\0\x07\x18\0\0\
+\x02\0\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\x11\x18\0\0\xb2\0\0\0\0\0\0\0\x16\x18\
+\0\0\xb3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xce\x02\0\0\0\0\0\0\0\0\0\x02\xcf\x02\
+\0\0\0\0\0\0\x05\0\0\x04\x20\0\0\0\x22\x18\0\0\xb5\0\0\0\0\0\0\0\x27\x18\0\0\
+\x02\0\0\0\x40\0\0\0\x2c\x18\0\0\x02\0\0\0\x60\0\0\0\x38\x18\0\0\x4e\0\0\0\x80\
+\0\0\0\x3f\x18\0\0\x4e\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\xd0\x02\0\0\x47\x18\0\
+\0\0\0\0\x08\xb7\0\0\0\x4d\x18\0\0\0\0\0\x08\x02\0\0\0\0\0\0\0\0\0\0\x02\xc3\
+\x02\0\0\x5c\x18\0\0\x02\0\0\x04\x10\0\0\0\xe6\x0f\0\0\x9b\0\0\0\0\0\0\0\x67\
+\x18\0\0\xba\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x9b\0\0\0\0\0\0\0\0\0\0\x03\0\0\
+\0\0\xb9\0\0\0\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x02\xa5\x02\0\0\xef\x07\0\0\
+\x03\0\0\x04\x18\0\0\0\xdd\x07\0\0\x6d\0\0\0\0\0\0\0\xe3\x07\0\0\x6d\0\0\0\x40\
+\0\0\0\x6d\x18\0\0\xbe\0\0\0\x80\0\0\0\x72\x18\0\0\0\0\0\x08\xbf\0\0\0\x81\x18\
+\0\0\x01\0\0\x04\x04\0\0\0\x8e\x18\0\0\xc0\0\0\0\0\0\0\0\x97\x18\0\0\0\0\0\x08\
+\xc1\0\0\0\xa7\x18\0\0\x01\0\0\x04\x04\0\0\0\0\0\0\0\xc2\0\0\0\0\0\0\0\0\0\0\0\
+\x03\0\0\x05\x04\0\0\0\xab\x17\0\0\x52\0\0\0\0\0\0\0\0\0\0\0\xc3\0\0\0\0\0\0\0\
+\0\0\0\0\xc4\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x02\0\0\0\xb1\x18\0\0\x82\0\0\0\
+\0\0\0\0\x26\x09\0\0\x82\0\0\0\x08\0\0\0\0\0\0\0\x02\0\0\x04\x04\0\0\0\xb8\x18\
+\0\0\x65\0\0\0\0\0\0\0\xc7\x18\0\0\x65\0\0\0\x10\0\0\0\xfc\x07\0\0\x07\0\0\x04\
+\x30\0\0\0\xcc\x18\0\0\xc6\0\0\0\0\0\0\0\xd5\x18\0\0\x21\0\0\0\x40\0\0\0\x46\
+\x13\0\0\xc8\0\0\0\x80\0\0\0\xb6\x0f\0\0\x13\0\0\0\xa0\0\0\0\xdd\x07\0\0\x6d\0\
+\0\0\xc0\0\0\0\xe3\x07\0\0\x6d\0\0\0\0\x01\0\0\xe9\x07\0\0\x6d\0\0\0\x40\x01\0\
+\0\xdf\x18\0\0\0\0\0\x08\xc7\0\0\0\xcc\x18\0\0\x01\0\0\x04\x04\0\0\0\xea\x18\0\
+\0\x13\0\0\0\0\0\0\0\xf3\x18\0\0\x05\0\0\x06\x04\0\0\0\xff\x18\0\0\0\0\0\0\x0e\
+\x19\0\0\x01\0\0\0\x19\x19\0\0\x02\0\0\0\x23\x19\0\0\x03\0\0\0\x2e\x19\0\0\x04\
+\0\0\0\x47\x08\0\0\x03\0\0\x04\x50\0\0\0\x3a\x19\0\0\xce\0\0\0\0\0\0\0\x40\x19\
+\0\0\x13\0\0\0\x40\x02\0\0\x4e\x19\0\0\x13\0\0\0\x60\x02\0\0\x5c\x19\0\0\x02\0\
+\0\x04\x18\0\0\0\x70\x19\0\0\x6d\0\0\0\0\0\0\0\x78\x19\0\0\xcb\0\0\0\x40\0\0\0\
+\x7f\x19\0\0\x01\0\0\x04\x10\0\0\0\x8f\x19\0\0\xcc\0\0\0\0\0\0\0\x97\x19\0\0\
+\x02\0\0\x04\x10\0\0\0\x8f\x19\0\0\xcd\0\0\0\0\0\0\0\xa6\x19\0\0\x6c\0\0\0\x40\
+\0\0\0\x8f\x19\0\0\x01\0\0\x04\x08\0\0\0\x1a\x11\0\0\x6c\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\x03\0\0\0\0\xca\0\0\0\x04\0\0\0\x03\0\0\0\x57\x08\0\0\x03\0\0\x04\x38\0\
+\0\0\xb2\x19\0\0\xd0\0\0\0\0\0\0\0\xb7\x19\0\0\xd4\0\0\0\x80\0\0\0\xbd\x19\0\0\
+\x13\0\0\0\x80\x01\0\0\xc7\x19\0\0\x02\0\0\x04\x10\0\0\0\xe6\x0f\0\0\xd1\0\0\0\
+\0\0\0\0\xd5\x19\0\0\xd2\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\xd0\0\0\0\0\0\0\0\0\
+\0\0\x02\xd3\0\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\xd1\0\0\0\xb7\x19\0\0\
+\x04\0\0\x04\x20\0\0\0\xda\x19\0\0\x90\0\0\0\0\0\0\0\xe0\x19\0\0\xbe\0\0\0\x40\
+\0\0\0\xea\x19\0\0\xd5\0\0\0\x60\0\0\0\xee\x19\0\0\x6e\0\0\0\x80\0\0\0\xf8\x19\
+\0\0\x01\0\0\x04\x04\0\0\0\xc7\x18\0\0\x52\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xd7\
+\0\0\0\0\0\0\0\0\0\0\x0a\xd8\0\0\0\x83\x08\0\0\x1a\0\0\x04\xb8\0\0\0\xd7\x01\0\
+\0\x90\0\0\0\0\0\0\0\x0e\x1a\0\0\xd9\0\0\0\x40\0\0\0\x12\x1a\0\0\xdd\0\0\0\x60\
+\0\0\0\x16\x1a\0\0\xd9\0\0\0\x80\0\0\0\x1b\x1a\0\0\xdd\0\0\0\xa0\0\0\0\x20\x1a\
+\0\0\xd9\0\0\0\xc0\0\0\0\x25\x1a\0\0\xdd\0\0\0\xe0\0\0\0\x2a\x1a\0\0\xd9\0\0\0\
+\0\x01\0\0\x30\x1a\0\0\xdd\0\0\0\x20\x01\0\0\x36\x1a\0\0\x13\0\0\0\x40\x01\0\0\
+\x41\x1a\0\0\xe1\0\0\0\x80\x01\0\0\x51\x1a\0\0\xe1\0\0\0\xc0\x01\0\0\x5f\x1a\0\
+\0\xe1\0\0\0\0\x02\0\0\x6d\x1a\0\0\xe1\0\0\0\x40\x02\0\0\x76\x1a\0\0\xe1\0\0\0\
+\x80\x02\0\0\x82\x1a\0\0\x70\0\0\0\xc0\x02\0\0\x8e\x1a\0\0\xe3\0\0\0\0\x03\0\0\
+\x9e\x1a\0\0\xe3\0\0\0\x40\x03\0\0\xae\x1a\0\0\xe3\0\0\0\x80\x03\0\0\xbd\x1a\0\
+\0\xe3\0\0\0\xc0\x03\0\0\xd6\x0e\0\0\x60\0\0\0\0\x04\0\0\xce\x1a\0\0\xe4\0\0\0\
+\x40\x04\0\0\xd3\x1a\0\0\xe5\0\0\0\x80\x04\0\0\xdb\x1a\0\0\xe6\0\0\0\xc0\x04\0\
+\0\xe3\x1a\0\0\xe7\0\0\0\0\x05\0\0\0\0\0\0\xe8\0\0\0\x40\x05\0\0\xee\x1a\0\0\0\
+\0\0\x08\xda\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\0\xab\x17\0\0\xdb\0\0\0\0\0\0\0\
+\xf5\x1a\0\0\0\0\0\x08\xdc\0\0\0\xfb\x1a\0\0\0\0\0\x08\x13\0\0\0\x0c\x1b\0\0\0\
+\0\0\x08\xde\0\0\0\0\0\0\0\x01\0\0\x04\x04\0\0\0\xab\x17\0\0\xdf\0\0\0\0\0\0\0\
+\x13\x1b\0\0\0\0\0\x08\xe0\0\0\0\x19\x1b\0\0\0\0\0\x08\x13\0\0\0\x2a\x1b\0\0\0\
+\0\0\x08\xe2\0\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\xab\x17\0\0\x6d\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x02\xbc\x02\0\0\0\0\0\0\0\0\0\x02\xb8\x02\0\0\0\0\0\0\0\0\0\x02\
+\xa9\x02\0\0\0\0\0\0\0\0\0\x02\xab\x02\0\0\0\0\0\0\0\0\0\x02\xbf\x02\0\0\0\0\0\
+\0\x02\0\0\x05\x10\0\0\0\x37\x1b\0\0\x02\0\0\0\0\0\0\0\x6b\x0e\0\0\xd0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x02\xd1\x02\0\0\x3f\x1b\0\0\x01\0\0\x04\x08\0\0\0\x48\x1b\
+\0\0\xeb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xd2\x02\0\0\x52\x1b\0\0\x01\0\0\x04\
+\x10\0\0\0\x5b\x1b\0\0\x6e\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xbb\x02\0\0\0\0\0\0\
+\0\0\0\x02\xd3\x02\0\0\0\0\0\0\0\0\0\x02\xd4\x02\0\0\0\0\0\0\0\0\0\x02\xaa\x02\
+\0\0\0\0\0\0\0\0\0\x02\xcd\x02\0\0\0\0\0\0\0\0\0\x02\xd6\x02\0\0\x65\x1b\0\0\0\
+\0\0\x08\xf4\0\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\x6e\x1b\0\0\xf5\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x03\0\0\0\0\x4e\0\0\0\x04\0\0\0\x01\0\0\0\x72\x1b\0\0\x02\0\0\
+\x04\x18\0\0\0\x7d\x1b\0\0\x6e\0\0\0\0\0\0\0\xf4\x08\0\0\xf3\0\0\0\x80\0\0\0\
+\x82\x1b\0\0\0\0\0\x08\xf8\0\0\0\x89\x1b\0\0\0\0\0\x08\xf9\0\0\0\x99\x1b\0\0\0\
+\0\0\x08\x4e\0\0\0\0\0\0\0\0\0\0\x02\xd7\x02\0\0\x7d\x09\0\0\x03\0\0\x04\x10\0\
+\0\0\xaa\x1b\0\0\x02\0\0\0\0\0\0\0\xaf\x1b\0\0\x52\0\0\0\x20\0\0\0\xbc\x1b\0\0\
+\xfc\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\xd8\x02\0\0\xc3\x1b\0\0\x04\0\0\x04\x20\
+\0\0\0\xd9\x1b\0\0\xfe\0\0\0\0\0\0\0\xe2\x1b\0\0\x4e\0\0\0\x40\0\0\0\xe9\x1b\0\
+\0\x4e\0\0\0\x80\0\0\0\xed\x1b\0\0\x23\0\0\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\x38\0\
+\0\0\xf9\x1b\0\0\0\0\0\x08\0\x01\0\0\x04\x1c\0\0\x01\0\0\x04\x04\0\0\0\0\0\0\0\
+\x01\x01\0\0\0\0\0\0\0\0\0\0\x01\0\0\x05\x04\0\0\0\x0d\x1c\0\0\xbf\0\0\0\0\0\0\
+\0\x13\x1c\0\0\x01\0\0\x04\x08\0\0\0\xe6\x0f\0\0\x03\x01\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\x02\x02\x01\0\0\0\0\0\0\0\0\0\x02\xd9\x02\0\0\0\0\0\0\0\0\0\x02\xc1\x02\0\
+\0\0\0\0\0\0\0\0\x02\xd5\x02\0\0\0\0\0\0\0\0\0\x02\xda\x02\0\0\0\0\0\0\0\0\0\
+\x02\xc2\x02\0\0\0\0\0\0\0\0\0\x02\xdb\x02\0\0\0\0\0\0\0\0\0\x02\x0b\x01\0\0\
+\x1f\x1c\0\0\0\0\0\x08\xc9\x02\0\0\x30\x1c\0\0\x07\0\0\x04\x38\0\0\0\x43\x1c\0\
+\0\x6d\0\0\0\0\0\0\0\x49\x1c\0\0\x6d\0\0\0\x40\0\0\0\x4f\x1c\0\0\x6d\0\0\0\x80\
+\0\0\0\x55\x1c\0\0\x6d\0\0\0\xc0\0\0\0\x5b\x1c\0\0\x6d\0\0\0\0\x01\0\0\x66\x1c\
+\0\0\x6d\0\0\0\x40\x01\0\0\x72\x1c\0\0\x6d\0\0\0\x80\x01\0\0\x88\x1c\0\0\0\0\0\
+\x08\x0e\x01\0\0\0\0\0\0\x01\0\0\x04\x80\0\0\0\xe7\x01\0\0\x0f\x01\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x03\0\0\0\0\x4e\0\0\0\x04\0\0\0\x10\0\0\0\x93\x1c\0\0\0\0\0\x08\
+\x11\x01\0\0\xa7\x1c\0\0\x01\0\0\x04\x04\0\0\0\xcc\x18\0\0\xc6\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x02\xad\x02\0\0\0\0\0\0\0\0\0\x02\xdc\x02\0\0\0\0\0\0\0\0\0\x02\
+\xdd\x02\0\0\0\0\0\0\0\0\0\x02\xde\x02\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x82\0\0\0\
+\x04\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\x02\x9b\x02\0\0\0\0\0\0\0\0\0\x02\xa4\x02\0\
+\0\xb9\x1c\0\0\0\0\0\x01\x02\0\0\0\x10\0\0\x01\0\0\0\0\0\0\0\x02\xdf\x02\0\0\0\
+\0\0\0\0\0\0\x02\x4e\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x4e\0\0\0\x04\0\0\0\x03\0\
+\0\0\0\0\0\0\0\0\0\x02\xe0\x02\0\0\xbf\x1c\0\0\x03\0\0\x04\x08\x04\0\0\xd4\x1c\
+\0\0\x1f\x01\0\0\0\0\0\0\xd9\x1c\0\0\x23\0\0\0\0\x20\0\0\xe8\x1c\0\0\x23\0\0\0\
+\x08\x20\0\0\xf1\x1c\0\0\x01\0\0\x04\0\x04\0\0\xcf\x01\0\0\x4d\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x02\xbd\x02\0\0\x0b\x1d\0\0\x03\0\0\x04\x10\0\0\0\x15\x1d\0\0\x22\
+\x01\0\0\0\0\0\0\xe2\x1b\0\0\x12\0\0\0\x40\0\0\0\x1a\x1d\0\0\x12\0\0\0\x60\0\0\
+\0\0\0\0\0\0\0\0\x02\xa3\x02\0\0\0\0\0\0\0\0\0\x02\xe1\x02\0\0\x61\x0d\0\0\x04\
+\0\0\x04\x78\0\0\0\x1f\x1d\0\0\x25\x01\0\0\0\0\0\0\x29\x1d\0\0\x13\0\0\0\0\x03\
+\0\0\xb6\x17\0\0\x4e\0\0\0\x40\x03\0\0\x2f\x1d\0\0\x4e\0\0\0\x80\x03\0\0\0\0\0\
+\0\0\0\0\x03\0\0\0\0\x4e\0\0\0\x04\0\0\0\x0c\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
+\x24\x01\0\0\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\xa8\x02\0\0\0\0\0\0\0\0\0\
+\x02\xa6\x02\0\0\0\0\0\0\0\0\0\x02\xc0\x02\0\0\0\0\0\0\0\0\0\x02\xe2\x02\0\0\
+\x61\x0e\0\0\0\0\0\x04\0\0\0\0\x33\x1d\0\0\x04\0\0\x04\x28\0\0\0\x3e\x1d\0\0\
+\xb9\0\0\0\0\0\0\0\x73\x13\0\0\x4e\0\0\0\x80\0\0\0\x38\x13\0\0\x2d\x01\0\0\xc0\
+\0\0\0\xa6\x02\0\0\x11\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\x02\x2e\x01\0\0\0\0\0\0\
+\x01\0\0\x0d\0\0\0\0\0\0\0\0\x2f\x01\0\0\0\0\0\0\0\0\0\x02\x2c\x01\0\0\0\0\0\0\
+\0\0\0\x02\xb7\x02\0\0\0\0\0\0\0\0\0\x02\xb5\x02\0\0\0\0\0\0\0\0\0\x02\xe3\x02\
+\0\0\0\0\0\0\0\0\0\x02\xe4\x02\0\0\x44\x1d\0\0\x01\0\0\x04\x08\0\0\0\x06\x17\0\
+\0\x63\0\0\0\0\0\0\0\x4f\x1d\0\0\x01\0\0\x05\x08\0\0\0\x5f\x1d\0\0\x36\x01\0\0\
+\0\0\0\0\x66\x1d\0\0\x02\0\0\x04\x08\0\0\0\x71\x1d\0\0\x23\0\0\0\0\0\0\0\x7c\
+\x1d\0\0\x13\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x35\x01\0\0\x04\0\0\0\
+\x01\0\0\0\0\0\0\0\0\0\0\x02\xe5\x02\0\0\x87\x1d\0\0\x16\0\0\x84\x40\x11\0\0\
+\x95\x1d\0\0\x3b\x01\0\0\0\0\0\0\x9f\x1d\0\0\x4e\0\0\0\xc0\0\0\0\xa2\x1d\0\0\
+\x67\0\0\0\0\x01\0\0\xa5\x1d\0\0\x67\0\0\0\x10\x01\0\0\xa8\x1d\0\0\x67\0\0\0\
+\x20\x01\0\0\xb0\x1d\0\0\x67\0\0\0\x30\x01\0\0\xb8\x1d\0\0\x4e\0\0\0\x40\x01\0\
+\0\xbf\x1d\0\0\x4e\0\0\0\x80\x01\0\0\xc6\x1d\0\0\x94\x01\0\0\xc0\x01\0\0\xd1\
+\x1d\0\0\x4e\0\0\0\xc0\x02\0\0\xdd\x1d\0\0\x4e\0\0\0\0\x03\0\0\xe8\x1d\0\0\x4e\
+\0\0\0\x40\x03\0\0\xec\x1d\0\0\x4e\0\0\0\x80\x03\0\0\xf4\x1d\0\0\x4e\0\0\0\xc0\
+\x03\0\0\xff\x1d\0\0\x95\x01\0\0\0\x04\0\0\x09\x1e\0\0\x4e\0\0\0\x40\x04\0\0\
+\x13\x1e\0\0\x13\0\0\0\x80\x04\0\x01\x1d\x1e\0\0\x11\0\0\0\xa0\x04\0\0\x22\x1e\
+\0\0\x4e\0\0\0\xc0\x04\0\0\x2b\x1e\0\0\x4e\0\0\0\0\x05\0\0\x3b\x1e\0\0\x96\x01\
+\0\0\x40\x05\0\0\x41\x1e\0\0\x97\x01\0\0\0\x06\0\0\x45\x1e\0\0\x0d\0\0\x84\x08\
+\0\0\0\x51\x1e\0\0\x65\0\0\0\0\0\0\0\x58\x1e\0\0\x65\0\0\0\x10\0\0\0\x5e\x1e\0\
+\0\x65\0\0\0\x20\0\0\x08\x19\0\0\0\x65\0\0\0\x28\0\0\x04\x1a\x17\0\0\x65\0\0\0\
+\x2c\0\0\x01\x64\x1e\0\0\x65\0\0\0\x2d\0\0\x02\x68\x1e\0\0\x65\0\0\0\x2f\0\0\
+\x01\x6a\x1e\0\0\x65\0\0\0\x30\0\0\x04\x71\x1e\0\0\x65\0\0\0\x34\0\0\x01\x75\
+\x1e\0\0\x65\0\0\0\x35\0\0\x01\x77\x1e\0\0\x65\0\0\0\x36\0\0\x01\x79\x1e\0\0\
+\x65\0\0\0\x37\0\0\x01\x7b\x1e\0\0\x65\0\0\0\x38\0\0\x08\0\0\0\0\0\0\0\x03\0\0\
+\0\0\x3a\x01\0\0\x04\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\x02\x3d\x01\0\0\x81\x1e\0\0\
+\x4e\0\0\x04\x30\x05\0\0\x8c\x1e\0\0\x6e\0\0\0\0\0\0\0\x98\x1e\0\0\x6e\0\0\0\
+\x80\0\0\0\xa5\x1e\0\0\x6e\0\0\0\0\x01\0\0\x4f\x10\0\0\x6b\0\0\0\x80\x01\0\0\
+\xb1\x1e\0\0\x6d\0\0\0\x40\x02\0\0\xbd\x1e\0\0\x6e\0\0\0\x80\x02\0\0\xcb\x1e\0\
+\0\xb9\0\0\0\0\x03\0\0\xd7\x1e\0\0\x6e\0\0\0\x80\x03\0\0\xe4\x1e\0\0\x02\0\0\0\
+\0\x04\0\0\xf0\x1e\0\0\x02\0\0\0\x20\x04\0\0\xfb\x1e\0\0\x02\0\0\0\x40\x04\0\0\
+\x06\x1f\0\0\x13\0\0\0\x60\x04\0\0\x62\x07\0\0\x3c\x01\0\0\x80\x04\0\0\x17\x1f\
+\0\0\x3e\x01\0\0\xc0\x04\0\0\x1b\x1f\0\0\x60\0\0\0\0\x05\0\0\x46\x13\0\0\x3f\
+\x01\0\0\x40\x05\0\0\x27\x1f\0\0\x13\0\0\0\x60\x05\0\0\x29\x1d\0\0\x40\x01\0\0\
+\x80\x05\0\0\x34\x1f\0\0\x91\0\0\0\xc0\x05\0\0\x40\x1f\0\0\x6d\0\0\0\0\x06\0\0\
+\x53\x1f\0\0\x6d\0\0\0\x40\x06\0\0\x66\x1f\0\0\x6d\0\0\0\x80\x06\0\0\x6d\x1f\0\
+\0\x44\x01\0\0\xc0\x06\0\0\x72\x1f\0\0\x65\0\0\0\0\x0b\0\0\x7e\x1f\0\0\x65\0\0\
+\0\x10\x0b\0\0\x8d\x1f\0\0\x65\0\0\0\x20\x0b\0\0\x97\x1f\0\0\x49\x01\0\0\x40\
+\x0b\0\0\x3a\x02\0\0\x17\x01\0\0\x40\x11\0\0\x9a\x1f\0\0\x5b\x01\0\0\x80\x11\0\
+\0\xa2\x1f\0\0\x90\0\0\0\xc0\x11\0\0\xab\x1f\0\0\x91\0\0\0\0\x12\0\0\xc4\x1f\0\
+\0\x91\0\0\0\x40\x12\0\0\xdd\x1f\0\0\xd4\0\0\0\x80\x12\0\0\xe9\x1f\0\0\x6e\0\0\
+\0\x80\x13\0\0\x4a\x07\0\0\x3c\x01\0\0\0\x14\0\0\xf4\x1f\0\0\x02\0\0\0\x40\x14\
+\0\0\xb6\x0f\0\0\x02\0\0\0\x60\x14\0\0\xfa\x1f\0\0\x6e\0\0\0\x80\x14\0\0\xda\
+\x19\0\0\x68\0\0\0\0\x15\0\0\x06\x20\0\0\xd4\0\0\0\x40\x15\0\0\x11\x20\0\0\x52\
+\0\0\0\x40\x16\0\0\x1c\x20\0\0\x5c\x01\0\0\x80\x16\0\0\x1f\x20\0\0\x6e\0\0\0\
+\xc0\x16\0\0\x28\x20\0\0\x4e\0\0\0\x40\x17\0\0\x34\x20\0\0\x02\0\0\0\x80\x17\0\
+\0\x40\x20\0\0\x5d\x01\0\0\xc0\x17\0\0\x46\x20\0\0\x5f\x01\0\0\x80\x18\0\0\x4d\
+\x20\0\0\x13\0\0\0\xc0\x18\0\0\x5c\x20\0\0\x13\0\0\0\xe0\x18\0\0\x69\x20\0\0\
+\x13\0\0\0\0\x19\0\0\x79\x20\0\0\x4e\0\0\0\x40\x19\0\0\x86\x20\0\0\x60\x01\0\0\
+\x80\x19\0\0\x92\x20\0\0\x60\x01\0\0\x80\x1a\0\0\xa6\x20\0\0\xd0\0\0\0\x80\x1b\
+\0\0\xb3\x20\0\0\x13\0\0\0\0\x1c\0\0\xc0\x20\0\0\x64\x01\0\0\x40\x1c\0\0\xd2\
+\x20\0\0\x52\0\0\0\x80\x1c\0\0\xde\x20\0\0\x65\x01\0\0\xc0\x1c\0\0\xeb\x20\0\0\
+\x66\x01\0\0\x80\x1d\0\0\xfe\x20\0\0\x4e\0\0\0\xc0\x1d\0\0\x0f\x21\0\0\x3c\x01\
+\0\0\0\x1e\0\0\x19\x21\0\0\x67\x01\0\0\x40\x1e\0\0\xc7\x19\0\0\xd0\0\0\0\x80\
+\x1e\0\0\x21\x21\0\0\x69\x01\0\0\0\x1f\0\0\x24\x21\0\0\x6d\0\0\0\x40\x1f\0\0\
+\x27\x21\0\0\x91\0\0\0\x80\x1f\0\0\x34\x21\0\0\x6a\x01\0\0\xc0\x1f\0\0\x3a\x21\
+\0\0\x6c\x01\0\0\0\x20\0\0\x4b\x21\0\0\x60\0\0\0\x40\x20\0\0\x64\x21\0\0\x82\
+\x01\0\0\x80\x20\0\0\x69\x21\0\0\x6d\0\0\0\xc0\x20\0\0\x74\x21\0\0\x83\x01\0\0\
+\0\x21\0\0\xbc\x1b\0\0\x84\x01\0\0\x40\x21\0\0\x7d\x21\0\0\x85\x01\0\0\x80\x21\
+\0\0\x88\x21\0\0\x93\x01\0\0\x40\x28\0\0\xd6\x0e\0\0\x60\0\0\0\x80\x28\0\0\x8d\
+\x21\0\0\x6e\0\0\0\xc0\x28\0\0\x95\x21\0\0\x12\0\0\0\x40\x29\0\0\0\0\0\0\0\0\0\
+\x02\x99\x02\0\0\x9f\x21\0\0\x06\0\0\x86\x04\0\0\0\xb0\x21\0\0\xfc\xff\xff\xff\
+\xc6\x21\0\0\xfd\xff\xff\xff\xdc\x21\0\0\xfe\xff\xff\xff\xf3\x21\0\0\xff\xff\
+\xff\xff\x08\x22\0\0\0\0\0\0\x22\x22\0\0\x01\0\0\0\x3a\x22\0\0\0\0\0\x08\x41\
+\x01\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\x44\x22\0\0\x42\x01\0\0\0\0\0\0\x46\x22\
+\0\0\0\0\0\x08\x43\x01\0\0\0\0\0\0\x01\0\0\x04\x08\0\0\0\x44\x22\0\0\x90\0\0\0\
+\0\0\0\0\x4e\x22\0\0\x3c\0\0\x84\x88\0\0\0\x19\0\0\0\x12\0\0\0\0\0\0\0\x1a\x1d\
+\0\0\x12\0\0\0\x20\0\0\0\x5e\x22\0\0\x20\0\0\0\x40\0\0\0\0\0\0\0\x45\x01\0\0\
+\x80\0\0\0\x65\x22\0\0\x20\0\0\0\xc0\0\0\0\x71\x22\0\0\x20\0\0\0\0\x01\0\0\x7d\
+\x22\0\0\x20\0\0\0\x40\x01\0\x01\x86\x22\0\0\x20\0\0\0\x41\x01\0\x01\x8e\x22\0\
+\0\x20\0\0\0\x42\x01\0\x01\x95\x22\0\0\x20\0\0\0\x43\x01\0\x01\x9f\x22\0\0\x20\
+\0\0\0\x44\x01\0\x01\xac\x22\0\0\x20\0\0\0\x45\x01\0\x01\xbb\x22\0\0\x20\0\0\0\
+\x46\x01\0\x01\xc6\x22\0\0\x20\0\0\0\x47\x01\0\x01\xd3\x22\0\0\x20\0\0\0\x48\
+\x01\0\x01\x5d\x01\0\0\x20\0\0\0\x49\x01\0\x01\xd8\x22\0\0\x20\0\0\0\x4a\x01\0\
+\x01\xdd\x22\0\0\x20\0\0\0\x4b\x01\0\x01\xea\x22\0\0\x20\0\0\0\x4c\x01\0\x01\
+\xf9\x22\0\0\x20\0\0\0\x4d\x01\0\x01\xfe\x22\0\0\x20\0\0\0\x4e\x01\0\x01\x08\
+\x23\0\0\x20\0\0\0\x4f\x01\0\x02\x13\x23\0\0\x20\0\0\0\x51\x01\0\x01\x1d\x23\0\
+\0\x20\0\0\0\x52\x01\0\x01\x2b\x23\0\0\x20\0\0\0\x53\x01\0\x01\x38\x23\0\0\x20\
+\0\0\0\x54\x01\0\x01\x46\x23\0\0\x20\0\0\0\x55\x01\0\x01\x5f\x23\0\0\x20\0\0\0\
+\x56\x01\0\x01\x76\x23\0\0\x20\0\0\0\x57\x01\0\x01\x7c\x23\0\0\x20\0\0\0\x58\
+\x01\0\x01\x86\x23\0\0\x20\0\0\0\x59\x01\0\x01\x92\x23\0\0\x20\0\0\0\x5a\x01\0\
+\x01\xa1\x23\0\0\x20\0\0\0\x5b\x01\0\x01\xb0\x23\0\0\x20\0\0\0\x5c\x01\0\x01\
+\xbb\x23\0\0\x20\0\0\0\x5d\x01\0\x01\xc3\x23\0\0\x20\0\0\0\x5e\x01\0\x01\xcd\
+\x23\0\0\x20\0\0\0\x5f\x01\0\x01\xd8\x23\0\0\x20\0\0\0\x60\x01\0\x01\xdf\x23\0\
+\0\x20\0\0\0\x61\x01\0\x01\xe9\x23\0\0\x20\0\0\0\x62\x01\0\x01\xf2\x23\0\0\x20\
+\0\0\0\x63\x01\0\x01\x01\x24\0\0\x20\0\0\0\x64\x01\0\x01\x10\x24\0\0\x20\0\0\0\
+\x65\x01\0\x01\x18\x24\0\0\x20\0\0\0\x66\x01\0\x1a\0\0\0\0\x46\x01\0\0\x80\x01\
+\0\0\x25\x24\0\0\x12\0\0\0\xa0\x01\0\0\0\0\0\0\x47\x01\0\0\xc0\x01\0\0\0\0\0\0\
+\x48\x01\0\0\0\x02\0\0\x2d\x24\0\0\x20\0\0\0\x40\x02\0\0\x40\x24\0\0\x20\0\0\0\
+\x80\x02\0\0\x51\x24\0\0\x12\0\0\0\xc0\x02\0\0\xc2\x17\0\0\x15\0\0\0\xe0\x02\0\
+\0\x63\x24\0\0\x20\0\0\0\0\x03\0\0\x74\x24\0\0\x12\0\0\0\x40\x03\0\0\x82\x24\0\
+\0\x66\0\0\0\x60\x03\0\0\x93\x24\0\0\x66\0\0\0\x70\x03\0\0\xa0\x24\0\0\x12\0\0\
+\0\x80\x03\0\0\xb0\x24\0\0\x12\0\0\0\xa0\x03\0\0\xbd\x24\0\0\x20\0\0\0\xc0\x03\
+\0\0\xc6\x24\0\0\x20\0\0\0\0\x04\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\xce\x24\0\0\
+\x20\0\0\0\0\0\0\0\xdc\x24\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x05\x04\0\0\0\
+\xe8\x24\0\0\x12\0\0\0\0\0\0\0\xf6\x24\0\0\x12\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\
+\x05\x08\0\0\0\x07\x25\0\0\x20\0\0\0\0\0\0\0\x0f\x25\0\0\x20\0\0\0\0\0\0\0\x1b\
+\x25\0\0\x20\0\0\0\0\0\0\0\x27\x25\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x04\0\0\x05\
+\x08\0\0\0\x2f\x25\0\0\x20\0\0\0\0\0\0\0\x36\x25\0\0\x20\0\0\0\0\0\0\0\x42\x25\
+\0\0\x20\0\0\0\0\0\0\0\x4f\x25\0\0\x20\0\0\0\0\0\0\0\x57\x25\0\0\x0c\0\0\x04\
+\xc0\0\0\0\0\0\0\0\x4a\x01\0\0\0\0\0\0\x65\x25\0\0\x68\0\0\0\0\x03\0\0\xde\x20\
+\0\0\x60\0\0\0\x40\x03\0\0\xfe\x20\0\0\x4e\0\0\0\x80\x03\0\0\x46\x13\0\0\x02\0\
+\0\0\xc0\x03\0\0\x6c\x25\0\0\x40\x01\0\0\0\x04\0\0\xce\x24\0\0\x6d\0\0\0\x40\
+\x04\0\0\0\0\0\0\x58\x01\0\0\x80\x04\0\0\x77\x25\0\0\x6d\0\0\0\0\x05\0\0\x86\
+\x25\0\0\x6d\0\0\0\x40\x05\0\0\x91\x25\0\0\x6d\0\0\0\x80\x05\0\0\xa1\x25\0\0\
+\x6d\0\0\0\xc0\x05\0\0\0\0\0\0\x07\0\0\x05\x60\0\0\0\0\0\0\0\x4b\x01\0\0\0\0\0\
+\0\0\0\0\0\x4d\x01\0\0\0\0\0\0\0\0\0\0\x4e\x01\0\0\0\0\0\0\0\0\0\0\x4f\x01\0\0\
+\0\0\0\0\0\0\0\0\x50\x01\0\0\0\0\0\0\0\0\0\0\x51\x01\0\0\0\0\0\0\0\0\0\0\x57\
+\x01\0\0\0\0\0\0\0\0\0\0\x0a\0\0\x04\x60\0\0\0\x5e\x22\0\0\x6d\0\0\0\0\0\0\0\
+\xb2\x25\0\0\x6d\0\0\0\x40\0\0\0\xbb\x25\0\0\x4e\0\0\0\x80\0\0\0\xc7\x25\0\0\
+\x4e\0\0\0\xc0\0\0\0\xd2\x25\0\0\x02\0\0\0\0\x01\0\0\xe3\x25\0\0\x02\0\0\0\x20\
+\x01\0\0\xe7\x25\0\0\x02\0\0\0\x40\x01\0\0\xa6\x02\0\0\x02\0\0\0\x60\x01\0\0\
+\xf0\x25\0\0\x4c\x01\0\0\x80\x01\0\0\xfa\x25\0\0\x4c\x01\0\0\x40\x02\0\0\x05\
+\x26\0\0\x04\0\0\x04\x18\0\0\0\x5e\x22\0\0\x6d\0\0\0\0\0\0\0\x19\x26\0\0\x13\0\
+\0\0\x40\0\0\0\x1d\x26\0\0\x02\0\0\0\x60\0\0\0\xe3\x25\0\0\x02\0\0\0\x80\0\0\0\
+\0\0\0\0\x01\0\0\x04\x08\0\0\0\x23\x26\0\0\x6d\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\
+\x04\x40\0\0\0\x1e\x13\0\0\x7a\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\x04\x10\0\0\0\x2e\
+\x26\0\0\x6e\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x36\x26\0\0\x6d\0\0\0\
+\0\0\0\0\x3e\x26\0\0\x6d\0\0\0\x40\0\0\0\0\0\0\0\x02\0\0\x04\x28\0\0\0\x43\x26\
+\0\0\x52\x01\0\0\0\0\0\0\x48\x26\0\0\x53\x01\0\0\xc0\0\0\0\x50\x26\0\0\x04\0\0\
+\x04\x18\0\0\0\x63\x26\0\0\x4e\0\0\0\0\0\0\0\x2b\x02\0\0\x4e\0\0\0\x40\0\0\0\
+\xe9\x1b\0\0\x82\0\0\0\x80\0\0\0\x19\0\0\0\x82\0\0\0\x88\0\0\0\x6b\x26\0\0\x02\
+\0\0\x04\x10\0\0\0\x77\x26\0\0\x54\x01\0\0\0\0\0\0\xe6\x0f\0\0\x56\x01\0\0\x40\
+\0\0\0\x7d\x26\0\0\x01\0\0\x04\x08\0\0\0\xe6\x0f\0\0\x55\x01\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\x02\x54\x01\0\0\0\0\0\0\0\0\0\x02\x53\x01\0\0\0\0\0\0\x05\0\0\x04\x18\
+\0\0\0\x88\x26\0\0\x82\0\0\0\0\0\0\0\x93\x26\0\0\x82\0\0\0\x08\0\0\0\x9e\x26\0\
+\0\x65\0\0\0\x10\0\0\0\xa6\x26\0\0\x6d\0\0\0\x40\0\0\0\xab\x26\0\0\x6d\0\0\0\
+\x80\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\0\0\0\0\x59\x01\0\0\0\0\0\0\0\0\0\0\
+\x5a\x01\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\xb1\x26\0\0\x6d\0\0\0\0\0\0\
+\0\xbd\x26\0\0\x40\x01\0\0\x40\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\xc9\x26\0\0\
+\x6d\0\0\0\0\0\0\0\xd6\x26\0\0\x6d\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x9a\x02\0\
+\0\0\0\0\0\0\0\0\x02\x9c\x02\0\0\xe2\x26\0\0\0\0\0\x08\x5e\x01\0\0\xf4\x26\0\0\
+\x02\0\0\x04\x18\0\0\0\x6d\x18\0\0\xff\0\0\0\0\0\0\0\x04\x27\0\0\x6e\0\0\0\x40\
+\0\0\0\0\0\0\0\0\0\0\x02\xbe\x02\0\0\x09\x27\0\0\x03\0\0\x04\x20\0\0\0\x26\x13\
+\0\0\x61\0\0\0\0\0\0\0\xd5\x19\0\0\x61\x01\0\0\x80\0\0\0\x12\x27\0\0\x64\x01\0\
+\0\xc0\0\0\0\0\0\0\0\0\0\0\x02\x62\x01\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\
+\x63\x01\0\0\0\0\0\0\0\0\0\x02\x60\x01\0\0\x1a\x27\0\0\x01\0\0\x04\x08\0\0\0\
+\xf9\x22\0\0\x68\0\0\0\0\0\0\0\x22\x27\0\0\x03\0\0\x04\x18\0\0\0\x7d\x1b\0\0\
+\x6e\0\0\0\0\0\0\0\x6d\x18\0\0\xbe\0\0\0\x80\0\0\0\x39\x27\0\0\x13\0\0\0\xa0\0\
+\0\0\0\0\0\0\0\0\0\x02\xc4\x02\0\0\0\0\0\0\0\0\0\x02\x68\x01\0\0\0\0\0\0\x01\0\
+\0\x0d\0\0\0\0\0\0\0\0\x3c\x01\0\0\0\0\0\0\0\0\0\x02\xac\x02\0\0\0\0\0\0\0\0\0\
+\x02\x6b\x01\0\0\0\0\0\0\0\0\0\x0d\x6d\0\0\0\x49\x27\0\0\0\0\0\x08\x6d\x01\0\0\
+\0\0\0\0\0\0\0\x02\x6e\x01\0\0\0\0\0\0\x03\0\0\x0d\0\0\0\0\0\0\0\0\x3c\x01\0\0\
+\0\0\0\0\x6f\x01\0\0\0\0\0\0\x7c\x01\0\0\0\0\0\0\0\0\0\x02\x70\x01\0\0\x61\x27\
+\0\0\x1a\0\0\x04\0\x01\0\0\x72\x27\0\0\x6d\0\0\0\0\0\0\0\x7f\x27\0\0\x6d\0\0\0\
+\x40\0\0\0\x86\x27\0\0\x6d\0\0\0\x80\0\0\0\x19\0\0\0\x6d\0\0\0\xc0\0\0\0\x8f\
+\x27\0\0\x71\x01\0\0\0\x01\0\0\xb6\x17\0\0\x6d\0\0\0\x40\x01\0\0\x24\x21\0\0\
+\x6d\0\0\0\x80\x01\0\0\x99\x27\0\0\x72\x01\0\0\xc0\x01\0\0\xa3\x27\0\0\x6d\0\0\
+\0\0\x02\0\0\xa6\x27\0\0\x73\x01\0\0\x40\x02\0\0\xb0\x27\0\0\x74\x01\0\0\x80\
+\x02\0\0\xb4\x27\0\0\x75\x01\0\0\xc0\x02\0\0\xbd\x27\0\0\x76\x01\0\0\0\x03\0\0\
+\x08\x11\0\0\x77\x01\0\0\x40\x03\0\0\xcb\x27\0\0\x79\x01\0\0\x80\x03\0\0\xd4\
+\x27\0\0\x6d\0\0\0\xc0\x03\0\0\xd8\x27\0\0\x7b\x01\0\0\0\x04\0\0\xe2\x27\0\0\
+\x7b\x01\0\0\x80\x04\0\0\xec\x27\0\0\x6d\0\0\0\0\x05\0\0\xfc\x27\0\0\x6d\0\0\0\
+\x40\x05\0\0\xd8\x23\0\0\x6d\0\0\0\x80\x05\0\0\x06\x28\0\0\x6d\0\0\0\xc0\x05\0\
+\0\x0b\x28\0\0\x6d\0\0\0\0\x06\0\0\x15\x28\0\0\x6d\0\0\0\x40\x06\0\0\x24\x28\0\
+\0\x6d\0\0\0\x80\x06\0\0\x33\x28\0\0\x6d\0\0\0\xc0\x06\0\0\0\0\0\0\x02\0\0\x04\
+\x08\0\0\0\x28\x07\0\0\x11\0\0\0\0\0\0\0\x3c\x28\0\0\x11\0\0\0\x20\0\0\0\0\0\0\
+\0\x02\0\0\x04\x08\0\0\0\xb6\x0f\0\0\x11\0\0\0\0\0\0\0\x40\x28\0\0\x11\0\0\0\
+\x20\0\0\0\0\0\0\0\0\0\0\x02\xc5\x02\0\0\0\0\0\0\0\0\0\x02\xc6\x02\0\0\0\0\0\0\
+\0\0\0\x02\xc7\x02\0\0\0\0\0\0\0\0\0\x02\x6d\0\0\0\x49\x28\0\0\x02\0\0\x05\x08\
+\0\0\0\x5c\x28\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\x78\x01\0\0\0\0\0\0\0\0\0\0\x03\0\
+\0\x04\x08\0\0\0\x61\x28\0\0\x12\0\0\0\0\0\0\0\x69\x28\0\0\x66\0\0\0\x20\0\0\0\
+\x70\x28\0\0\x66\0\0\0\x30\0\0\0\x77\x28\0\0\x02\0\0\x05\x08\0\0\0\xab\x17\0\0\
+\x20\0\0\0\0\0\0\0\0\0\0\0\x7a\x01\0\0\0\0\0\0\0\0\0\0\x0b\0\0\x84\x08\0\0\0\
+\x89\x28\0\0\x20\0\0\0\0\0\0\x05\x90\x28\0\0\x20\0\0\0\x05\0\0\x0e\x98\x28\0\0\
+\x20\0\0\0\x13\0\0\x05\xa2\x28\0\0\x20\0\0\0\x18\0\0\x02\xab\x28\0\0\x20\0\0\0\
+\x1a\0\0\x07\xb4\x28\0\0\x20\0\0\0\x21\0\0\x04\xc0\x28\0\0\x20\0\0\0\x25\0\0\
+\x01\xcb\x28\0\0\x20\0\0\0\x26\0\0\x02\xd6\x28\0\0\x20\0\0\0\x28\0\0\x03\xde\
+\x28\0\0\x20\0\0\0\x2b\0\0\x03\xe7\x28\0\0\x20\0\0\0\x2e\0\0\x12\xf0\x28\0\0\
+\x02\0\0\x04\x10\0\0\0\xfa\x28\0\0\x20\0\0\0\0\0\0\0\xfe\x28\0\0\x7c\x01\0\0\
+\x40\0\0\0\0\0\0\0\0\0\0\x02\x7d\x01\0\0\x03\x29\0\0\x15\0\0\x04\xa8\0\0\0\x0b\
+\x29\0\0\x4e\0\0\0\0\0\0\0\x0f\x29\0\0\x4e\0\0\0\x40\0\0\0\x13\x29\0\0\x4e\0\0\
+\0\x80\0\0\0\x17\x29\0\0\x4e\0\0\0\xc0\0\0\0\x1b\x29\0\0\x4e\0\0\0\0\x01\0\0\
+\x1e\x29\0\0\x4e\0\0\0\x40\x01\0\0\x21\x29\0\0\x4e\0\0\0\x80\x01\0\0\x25\x29\0\
+\0\x4e\0\0\0\xc0\x01\0\0\x29\x29\0\0\x4e\0\0\0\0\x02\0\0\x2c\x29\0\0\x4e\0\0\0\
+\x40\x02\0\0\x2f\x29\0\0\x4e\0\0\0\x80\x02\0\0\x32\x29\0\0\x4e\0\0\0\xc0\x02\0\
+\0\x35\x29\0\0\x4e\0\0\0\0\x03\0\0\x38\x29\0\0\x4e\0\0\0\x40\x03\0\0\x3b\x29\0\
+\0\x4e\0\0\0\x80\x03\0\0\x3e\x29\0\0\x4e\0\0\0\xc0\x03\0\0\xa3\x27\0\0\x4e\0\0\
+\0\0\x04\0\0\0\0\0\0\x7e\x01\0\0\x40\x04\0\0\xa6\x02\0\0\x4e\0\0\0\x80\x04\0\0\
+\x9f\x1d\0\0\x4e\0\0\0\xc0\x04\0\0\0\0\0\0\x80\x01\0\0\0\x05\0\0\0\0\0\0\x03\0\
+\0\x05\x08\0\0\0\x46\x29\0\0\x65\0\0\0\0\0\0\0\x49\x29\0\0\x6d\0\0\0\0\0\0\0\
+\x4d\x29\0\0\x7f\x01\0\0\0\0\0\0\x4d\x29\0\0\x03\0\0\x84\x08\0\0\0\x46\x29\0\0\
+\x6d\0\0\0\0\0\0\x10\x55\x29\0\0\x6d\0\0\0\x10\0\0\x02\x58\x29\0\0\x6d\0\0\0\
+\x12\0\0\x01\0\0\0\0\x03\0\0\x05\x08\0\0\0\x5c\x29\0\0\x65\0\0\0\0\0\0\0\x5f\
+\x29\0\0\x6d\0\0\0\0\0\0\0\x63\x29\0\0\x81\x01\0\0\0\0\0\0\x63\x29\0\0\x0a\0\0\
+\x84\x08\0\0\0\x5c\x29\0\0\x6d\0\0\0\0\0\0\x10\x6b\x29\0\0\x6d\0\0\0\x10\0\0\
+\x01\x6f\x29\0\0\x6d\0\0\0\x11\0\0\x01\x77\x29\0\0\x6d\0\0\0\x12\0\0\x01\x7b\
+\x29\0\0\x6d\0\0\0\x20\0\0\x08\x19\0\0\0\x6d\0\0\0\x30\0\0\x04\x82\x29\0\0\x6d\
+\0\0\0\x38\0\0\x01\x8a\x29\0\0\x6d\0\0\0\x39\0\0\x01\x8d\x29\0\0\x6d\0\0\0\x3a\
+\0\0\x01\x94\x29\0\0\x6d\0\0\0\x3c\0\0\x04\0\0\0\0\0\0\0\x02\xb4\x02\0\0\0\0\0\
+\0\0\0\0\x02\x97\x02\0\0\0\0\0\0\0\0\0\x02\x98\x02\0\0\x7d\x21\0\0\x0f\0\0\x04\
+\xd8\0\0\0\xd5\x19\0\0\x86\x01\0\0\0\0\0\0\xe6\x0f\0\0\x89\x01\0\0\x40\0\0\0\
+\xa6\x02\0\0\x4e\0\0\0\x80\0\0\0\x9c\x29\0\0\x60\0\0\0\xc0\0\0\0\xa4\x29\0\0\
+\x86\x01\0\0\0\x01\0\0\xaf\x29\0\0\x8c\x01\0\0\x40\x01\0\0\xba\x29\0\0\x8e\x01\
+\0\0\xc0\x02\0\0\xc4\x29\0\0\x8c\x01\0\0\0\x03\0\0\xcd\x29\0\0\x4e\0\0\0\x80\
+\x04\0\0\xd8\x29\0\0\x4e\0\0\0\xc0\x04\0\0\x7d\x1b\0\0\x6e\0\0\0\0\x05\0\0\xe8\
+\x29\0\0\x6e\0\0\0\x80\x05\0\0\xf3\x29\0\0\x8f\x01\0\0\0\x06\0\0\xfc\x29\0\0\
+\x89\x01\0\0\x40\x06\0\0\x04\x2a\0\0\x4e\0\0\0\x80\x06\0\0\x10\x2a\0\0\0\0\0\
+\x08\x87\x01\0\0\0\0\0\0\0\0\0\x02\x88\x01\0\0\0\0\0\0\x04\0\0\x0d\0\0\0\0\0\0\
+\0\0\x4e\0\0\0\0\0\0\0\x4e\0\0\0\0\0\0\0\x89\x01\0\0\0\0\0\0\x8a\x01\0\0\0\0\0\
+\0\0\0\0\x02\x85\x01\0\0\0\0\0\0\0\0\0\x02\x8b\x01\0\0\x1e\x2a\0\0\x01\0\0\x04\
+\xa8\0\0\0\xfe\x28\0\0\x7d\x01\0\0\0\0\0\0\x2a\x2a\0\0\x03\0\0\x04\x30\0\0\0\
+\x3a\x2a\0\0\x8d\x01\0\0\0\0\0\0\x47\x2a\0\0\x8d\x01\0\0\x40\0\0\0\x53\x2a\0\0\
+\xd4\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\xb6\x02\0\0\0\0\0\0\0\0\0\x02\x8c\x01\0\
+\0\x5e\x2a\0\0\0\0\0\x08\x90\x01\0\0\0\0\0\0\0\0\0\x02\x91\x01\0\0\0\0\0\0\x02\
+\0\0\x0d\x02\0\0\0\0\0\0\0\x89\x01\0\0\0\0\0\0\x92\x01\0\0\x70\x2a\0\0\x03\0\0\
+\x06\x04\0\0\0\x7f\x2a\0\0\0\0\0\0\xa9\x2a\0\0\x01\0\0\0\xd3\x2a\0\0\x02\0\0\0\
+\0\0\0\0\0\0\0\x02\xc8\x02\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x3c\x01\0\0\x04\0\0\0\
+\x04\0\0\0\0\0\0\0\0\0\0\x02\xe6\x02\0\0\xfe\x2a\0\0\x02\0\0\x04\x10\0\0\0\x41\
+\x13\0\0\x6d\0\0\0\0\0\0\0\x1a\x1d\0\0\x6d\0\0\0\x40\0\0\0\x41\x1e\0\0\x07\0\0\
+\x04\x80\x10\0\0\xe7\x25\0\0\x13\0\0\0\0\0\0\0\x0b\x2b\0\0\x4e\0\0\0\x40\0\0\0\
+\x1c\x2b\0\0\x98\x01\0\0\x80\0\0\0\x24\x2b\0\0\x98\x01\0\0\xc0\0\0\0\x33\x2b\0\
+\0\x99\x01\0\0\0\x01\0\0\x38\x2b\0\0\x99\x01\0\0\x80\x01\0\0\x43\x2b\0\0\x9a\
+\x01\0\0\0\x02\0\0\0\0\0\0\0\0\0\x02\x9a\x01\0\0\x4d\x2b\0\0\x03\0\0\x04\x10\0\
+\0\0\x5c\x2b\0\0\x6d\0\0\0\0\0\0\0\x69\x2b\0\0\x13\0\0\0\x40\0\0\0\x76\x2b\0\0\
+\x13\0\0\0\x60\0\0\0\x1c\x2b\0\0\x0a\0\0\x84\x40\x10\0\0\x1a\x1d\0\0\x13\0\0\0\
+\0\0\0\0\x88\x2b\0\0\x13\0\0\0\x20\0\0\0\x92\x2b\0\0\x6d\0\0\0\x40\0\0\0\x9c\
+\x2b\0\0\x6d\0\0\0\x80\0\0\0\xab\x2b\0\0\x6d\0\0\0\xc0\0\0\0\xaf\x2b\0\0\x13\0\
+\0\0\0\x01\0\x01\xb9\x2b\0\0\x13\0\0\0\x01\x01\0\x01\xc2\x2b\0\0\x13\0\0\0\x02\
+\x01\0\x01\xd2\x2b\0\0\x13\0\0\0\x03\x01\0\x01\xfe\x28\0\0\x9b\x01\0\0\0\x02\0\
+\0\xd9\x2b\0\0\x05\0\0\x05\0\x10\0\0\xe6\x2b\0\0\x9c\x01\0\0\0\0\0\0\xec\x2b\0\
+\0\x9e\x01\0\0\0\0\0\0\xf3\x2b\0\0\xa6\x01\0\0\0\0\0\0\xf8\x2b\0\0\xa8\x01\0\0\
+\0\0\0\0\xfe\x2b\0\0\xac\x01\0\0\0\0\0\0\x08\x2c\0\0\x09\0\0\x04\x70\0\0\0\x14\
+\x2c\0\0\x11\0\0\0\0\0\0\0\x18\x2c\0\0\x11\0\0\0\x20\0\0\0\x1c\x2c\0\0\x11\0\0\
+\0\x40\0\0\0\x20\x2c\0\0\x11\0\0\0\x60\0\0\0\x24\x2c\0\0\x11\0\0\0\x80\0\0\0\
+\x28\x2c\0\0\x11\0\0\0\xa0\0\0\0\x2c\x2c\0\0\x11\0\0\0\xc0\0\0\0\x30\x2c\0\0\
+\x9d\x01\0\0\xe0\0\0\0\xaf\x0f\0\0\x11\0\0\0\x60\x03\0\0\0\0\0\0\0\0\0\x03\0\0\
+\0\0\x11\0\0\0\x04\0\0\0\x14\0\0\0\x39\x2c\0\0\x0b\0\0\x04\0\x02\0\0\x14\x2c\0\
+\0\x65\0\0\0\0\0\0\0\x18\x2c\0\0\x65\0\0\0\x10\0\0\0\x1c\x2c\0\0\x65\0\0\0\x20\
+\0\0\0\x46\x2c\0\0\x65\0\0\0\x30\0\0\0\0\0\0\0\x9f\x01\0\0\x40\0\0\0\x4a\x2c\0\
+\0\x11\0\0\0\xc0\0\0\0\x50\x2c\0\0\x11\0\0\0\xe0\0\0\0\x30\x2c\0\0\xa2\x01\0\0\
+\0\x01\0\0\x5b\x2c\0\0\xa3\x01\0\0\0\x05\0\0\x9e\x26\0\0\xa4\x01\0\0\0\x0d\0\0\
+\0\0\0\0\xa5\x01\0\0\x80\x0e\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\0\0\0\0\xa0\x01\
+\0\0\0\0\0\0\0\0\0\0\xa1\x01\0\0\0\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x65\x2c\
+\0\0\x6d\0\0\0\0\0\0\0\x69\x2c\0\0\x6d\0\0\0\x40\0\0\0\0\0\0\0\x04\0\0\x04\x10\
+\0\0\0\x20\x2c\0\0\x11\0\0\0\0\0\0\0\x24\x2c\0\0\x11\0\0\0\x20\0\0\0\x28\x2c\0\
+\0\x11\0\0\0\x40\0\0\0\x2c\x2c\0\0\x11\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\
+\0\x11\0\0\0\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x11\0\0\0\x04\0\0\0\
+\x40\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x11\0\0\0\x04\0\0\0\x0c\0\0\0\0\0\0\0\x02\
+\0\0\x05\x30\0\0\0\x6d\x2c\0\0\xa4\x01\0\0\0\0\0\0\x76\x2c\0\0\xa4\x01\0\0\0\0\
+\0\0\x82\x2c\0\0\x10\0\0\x04\x88\0\0\0\x14\x2c\0\0\x11\0\0\0\0\0\0\0\x18\x2c\0\
+\0\x11\0\0\0\x20\0\0\0\x1c\x2c\0\0\x11\0\0\0\x40\0\0\0\x20\x2c\0\0\x11\0\0\0\
+\x60\0\0\0\x24\x2c\0\0\x11\0\0\0\x80\0\0\0\x28\x2c\0\0\x11\0\0\0\xa0\0\0\0\x2c\
+\x2c\0\0\x11\0\0\0\xc0\0\0\0\x30\x2c\0\0\x9d\x01\0\0\xe0\0\0\0\x8f\x2c\0\0\x82\
+\0\0\0\x60\x03\0\0\x94\x2c\0\0\x82\0\0\0\x68\x03\0\0\x9c\x2c\0\0\x82\0\0\0\x70\
+\x03\0\0\xa6\x2c\0\0\x82\0\0\0\x78\x03\0\0\xb0\x2c\0\0\x82\0\0\0\x80\x03\0\0\
+\xb3\x2c\0\0\x82\0\0\0\x88\x03\0\0\x43\x26\0\0\xa7\x01\0\0\xc0\x03\0\0\xba\x2c\
+\0\0\x11\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\x02\xe7\x02\0\0\xc4\x2c\0\0\x03\0\0\x04\
+\x40\x02\0\0\xd0\x2c\0\0\x9e\x01\0\0\0\0\0\0\xd5\x2c\0\0\xa9\x01\0\0\0\x10\0\0\
+\xdc\x2c\0\0\xab\x01\0\0\0\x12\0\0\xf0\x2c\0\0\x03\0\0\x04\x40\0\0\0\x92\x2b\0\
+\0\x6d\0\0\0\0\0\0\0\xfe\x2c\0\0\x6d\0\0\0\x40\0\0\0\x40\x28\0\0\xaa\x01\0\0\
+\x80\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x6d\0\0\0\x04\0\0\0\x06\0\0\0\0\0\0\0\0\0\
+\0\x03\0\0\0\0\x82\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x82\0\0\0\
+\x04\0\0\0\0\x10\0\0\0\0\0\0\x03\0\0\x0d\x23\0\0\0\0\0\0\0\x4a\0\0\0\0\0\0\0\
+\x55\0\0\0\0\0\0\0\x55\0\0\0\x07\x2d\0\0\x02\0\0\x0c\xad\x01\0\0\0\0\0\0\x02\0\
+\0\x0d\x23\0\0\0\0\0\0\0\x11\0\0\0\0\0\0\0\x55\0\0\0\x17\x2d\0\0\x02\0\0\x0c\
+\xaf\x01\0\0\0\0\0\0\x01\0\0\x0d\x23\0\0\0\0\0\0\0\x14\0\0\0\x2c\x2d\0\0\x02\0\
+\0\x0c\xb1\x01\0\0\0\0\0\0\x03\0\0\x0d\0\0\0\0\0\0\0\0\xfe\0\0\0\0\0\0\0\x58\0\
+\0\0\0\0\0\0\x11\0\0\0\x4c\x2d\0\0\x02\0\0\x0c\xb3\x01\0\0\0\0\0\0\x02\0\0\x0d\
+\x14\0\0\0\0\0\0\0\x55\0\0\0\0\0\0\0\x6d\0\0\0\x5f\x2d\0\0\x02\0\0\x0c\xb5\x01\
+\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\x11\0\0\0\0\0\0\0\x4a\0\0\0\x75\x2d\0\
+\0\x02\0\0\x0c\xb7\x01\0\0\x89\x2d\0\0\x02\0\0\x0c\xb7\x01\0\0\0\0\0\0\x04\0\0\
+\x0d\0\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x6d\0\0\0\0\0\0\0\x6d\0\0\0\0\0\0\0\x6d\
+\0\0\0\x9f\x2d\0\0\x02\0\0\x0c\xba\x01\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\x3a\x02\
+\0\0\x58\0\0\0\xb0\x2d\0\0\x01\0\0\x0c\xbc\x01\0\0\0\0\0\0\x05\0\0\x0d\0\0\0\0\
+\0\0\0\0\x68\0\0\0\0\0\0\0\x6d\0\0\0\0\0\0\0\x6d\0\0\0\0\0\0\0\x6d\0\0\0\0\0\0\
+\0\x6d\0\0\0\xbd\x2d\0\0\x02\0\0\x0c\xbe\x01\0\0\xd4\x2d\0\0\x01\0\0\x0c\xbc\
+\x01\0\0\0\0\0\0\x01\0\0\x0d\x23\0\0\0\0\0\0\0\x6d\0\0\0\xe2\x2d\0\0\x02\0\0\
+\x0c\xc1\x01\0\0\0\0\0\0\x01\0\0\x0d\x11\0\0\0\0\0\0\0\x55\0\0\0\xf2\x2d\0\0\
+\x02\0\0\x0c\xc3\x01\0\0\x04\x2e\0\0\x01\0\0\x0c\xbc\x01\0\0\x11\x2e\0\0\x01\0\
+\0\x0c\xbc\x01\0\0\x1f\x2e\0\0\x01\0\0\x0c\x59\0\0\0\0\0\0\0\0\0\0\x0d\x4a\0\0\
+\0\x2e\x2e\0\0\x02\0\0\x0c\xc8\x01\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x4a\
+\0\0\0\x41\x2e\0\0\x02\0\0\x0c\xca\x01\0\0\x55\x2e\0\0\x01\0\0\x0c\xbc\x01\0\0\
+\x61\x2e\0\0\x01\0\0\x0c\x59\0\0\0\0\0\0\0\x02\0\0\x0d\x14\0\0\0\0\0\0\0\x6d\0\
+\0\0\0\0\0\0\x14\0\0\0\x6b\x2e\0\0\x02\0\0\x0c\xce\x01\0\0\x7e\x2e\0\0\x02\0\0\
+\x0c\xca\x01\0\0\0\0\0\0\x03\0\0\x0d\x02\0\0\0\0\0\0\0\xd2\x01\0\0\0\0\0\0\x02\
+\0\0\0\0\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\x02\xd3\x01\0\0\x90\x2e\0\0\x01\0\0\x04\
+\x08\0\0\0\xe0\0\0\0\xd4\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x20\0\0\0\
+\x04\0\0\0\x01\0\0\0\x9d\x2e\0\0\x02\0\0\x0c\xd1\x01\0\0\0\0\0\0\x01\0\0\x0d\
+\x0d\0\0\0\0\0\0\0\xd2\x01\0\0\xae\x2e\0\0\x02\0\0\x0c\xd6\x01\0\0\0\0\0\0\x01\
+\0\0\x0d\0\0\0\0\0\0\0\0\xd2\x01\0\0\xc0\x2e\0\0\x02\0\0\x0c\xd8\x01\0\0\xd5\
+\x2e\0\0\x01\0\0\x0c\xbc\x01\0\0\xdf\x2e\0\0\x07\0\0\x04\x38\0\0\0\xed\x2e\0\0\
+\xdc\x01\0\0\0\0\0\0\xd5\x05\0\0\x71\0\0\0\x40\0\0\0\xf2\x2e\0\0\xdd\x01\0\0\
+\x80\0\0\0\xf9\x2e\0\0\x1b\x01\0\0\xc0\0\0\0\xfc\x2e\0\0\x11\0\0\0\0\x01\0\0\
+\x03\x2f\0\0\xfe\0\0\0\x40\x01\0\0\x07\x2f\0\0\xfe\0\0\0\x80\x01\0\0\x0c\x2f\0\
+\0\x09\0\0\x06\x04\0\0\0\x1a\x2f\0\0\0\0\0\0\x28\x2f\0\0\x01\0\0\0\x36\x2f\0\0\
+\x40\0\0\0\x45\x2f\0\0\x41\0\0\0\x58\x2f\0\0\x42\0\0\0\x6c\x2f\0\0\x43\0\0\0\
+\x7b\x2f\0\0\0\x04\0\0\x8a\x2f\0\0\x01\x04\0\0\x9d\x2f\0\0\x02\x04\0\0\0\0\0\0\
+\0\0\0\x02\xde\x01\0\0\0\0\0\0\0\0\0\x0a\x38\0\0\0\0\0\0\0\0\0\0\x02\xe0\x01\0\
+\0\xb2\x2f\0\0\x03\0\0\x04\xb8\0\0\0\xfe\x28\0\0\xe1\x01\0\0\0\0\0\0\xce\x24\0\
+\0\x20\0\0\0\x40\x05\0\0\x06\x28\0\0\x20\0\0\0\x80\x05\0\0\xc6\x2f\0\0\0\0\0\
+\x08\x7d\x01\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\x3a\x02\0\0\xdf\x01\0\0\xd9\x2f\
+\0\0\x01\0\0\x0c\xe2\x01\0\0\0\0\0\0\0\0\0\x02\x1f\0\0\0\0\0\0\0\x03\0\0\x0d\
+\x02\0\0\0\xef\x2f\0\0\x60\0\0\0\x9a\0\0\0\x0d\0\0\0\xbb\0\0\0\xe4\x01\0\0\xf3\
+\x2f\0\0\0\0\0\x0c\xe5\x01\0\0\0\0\0\0\x02\0\0\x0d\x02\0\0\0\x68\x1e\0\0\x68\0\
+\0\0\x08\x30\0\0\x6d\0\0\0\x12\x30\0\0\0\0\0\x0c\xe7\x01\0\0\x23\x30\0\0\0\0\0\
+\x0c\xe5\x01\0\0\0\0\0\0\0\0\0\x0d\x55\0\0\0\x31\x30\0\0\x02\0\0\x0c\xea\x01\0\
+\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x55\0\0\0\x4a\x30\0\0\x02\0\0\x0c\xec\
+\x01\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x0d\0\0\0\x63\x30\0\0\0\
+\0\0\x0e\xee\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x0a\xf1\x01\0\0\0\0\0\0\0\0\0\x09\
+\x6d\0\0\0\x6c\x30\0\0\0\0\0\x0e\xf0\x01\0\0\x01\0\0\0\x78\x30\0\0\0\0\0\x0e\
+\xf0\x01\0\0\x01\0\0\0\x7e\x30\0\0\0\0\0\x0e\xf0\x01\0\0\x01\0\0\0\x8a\x30\0\0\
+\0\0\0\x0e\xf0\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x0a\xf7\x01\0\0\0\0\0\0\0\0\0\
+\x09\x23\0\0\0\x93\x30\0\0\0\0\0\x0e\xf6\x01\0\0\x01\0\0\0\xa3\x30\0\0\0\0\0\
+\x0e\xf0\x01\0\0\x01\0\0\0\xb7\x30\0\0\0\0\0\x0e\xf0\x01\0\0\x01\0\0\0\xbf\x30\
+\0\0\0\0\0\x0e\xf6\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x0a\xfd\x01\0\0\0\0\0\0\0\0\
+\0\x09\x11\0\0\0\xce\x30\0\0\0\0\0\x0e\xfc\x01\0\0\x01\0\0\0\0\0\0\0\0\0\0\x03\
+\0\0\0\0\xde\x01\0\0\x04\0\0\0\x21\0\0\0\xd6\x30\0\0\0\0\0\x0e\xff\x01\0\0\0\0\
+\0\0\xf4\x30\0\0\0\0\0\x0e\x6d\0\0\0\x01\0\0\0\x07\x31\0\0\0\0\0\x0e\x6d\0\0\0\
+\x01\0\0\0\x1b\x31\0\0\0\0\0\x0e\x6d\0\0\0\x01\0\0\0\x2c\x31\0\0\0\0\0\x0e\x6d\
+\0\0\0\x01\0\0\0\x3c\x31\0\0\x27\0\0\x04\xa8\x01\0\0\x4a\x31\0\0\x06\x02\0\0\0\
+\0\0\0\x55\x31\0\0\x08\x02\0\0\x40\0\0\0\x5d\x31\0\0\x08\x02\0\0\x80\0\0\0\x65\
+\x31\0\0\x0a\x02\0\0\xc0\0\0\0\x6e\x31\0\0\x0c\x02\0\0\0\x01\0\0\x73\x31\0\0\
+\x08\x02\0\0\x40\x01\0\0\x7c\x31\0\0\x0c\x02\0\0\x80\x01\0\0\x84\x31\0\0\x0e\
+\x02\0\0\xc0\x01\0\0\x8d\x31\0\0\x08\x02\0\0\0\x02\0\0\x97\x31\0\0\x10\x02\0\0\
+\x40\x02\0\0\x9d\x31\0\0\x10\x02\0\0\x80\x02\0\0\xaf\x31\0\0\x12\x02\0\0\xc0\
+\x02\0\0\xba\x31\0\0\x14\x02\0\0\0\x03\0\0\xc6\x31\0\0\x16\x02\0\0\x40\x03\0\0\
+\xd2\x31\0\0\x18\x02\0\0\x80\x03\0\0\xde\x31\0\0\x1c\x02\0\0\xc0\x03\0\0\xea\
+\x31\0\0\x21\x02\0\0\0\x04\0\0\xf4\x31\0\0\x25\x02\0\0\x40\x04\0\0\xfe\x31\0\0\
+\x0c\x02\0\0\x80\x04\0\0\x05\x32\0\0\x0c\x02\0\0\xc0\x04\0\0\x07\x2f\0\0\x29\
+\x02\0\0\0\x05\0\0\x0d\x32\0\0\x2d\x02\0\0\x40\x05\0\0\x16\x32\0\0\x2f\x02\0\0\
+\x80\x05\0\0\x20\x32\0\0\x31\x02\0\0\xc0\x05\0\0\x2c\x32\0\0\x61\x02\0\0\0\x06\
+\0\0\x38\x32\0\0\x63\x02\0\0\x40\x06\0\0\x49\x32\0\0\x65\x02\0\0\x80\x06\0\0\
+\x55\x32\0\0\x65\x02\0\0\xc0\x06\0\0\x68\x32\0\0\x67\x02\0\0\0\x07\0\0\x7a\x32\
+\0\0\x69\x02\0\0\x40\x07\0\0\x85\x32\0\0\x69\x02\0\0\x80\x07\0\0\x91\x32\0\0\
+\x6b\x02\0\0\xc0\x07\0\0\x96\x32\0\0\x6d\x02\0\0\0\x08\0\0\x9b\x32\0\0\x11\0\0\
+\0\x40\x08\0\0\xa6\x02\0\0\x6d\0\0\0\x80\x08\0\0\xae\x32\0\0\x11\0\0\0\xc0\x08\
+\0\0\xb9\x32\0\0\x11\0\0\0\xe0\x08\0\0\xc7\x32\0\0\x6d\0\0\0\0\x09\0\0\xd3\x32\
+\0\0\x70\x02\0\0\x40\x09\0\0\0\0\0\0\0\0\0\x02\x07\x02\0\0\0\0\0\0\x03\0\0\x0d\
+\x14\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\x6d\0\0\0\0\0\0\0\0\0\0\
+\x02\x09\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x6d\0\0\
+\0\0\0\0\0\0\0\0\x02\x0b\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\x14\0\0\0\
+\0\0\0\0\x68\0\0\0\0\0\0\0\0\0\0\x02\x0d\x02\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\
+\0\0\0\x68\0\0\0\0\0\0\0\0\0\0\x02\x0f\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\
+\0\0\x68\0\0\0\0\0\0\0\x23\0\0\0\0\0\0\0\0\0\0\x02\x11\x02\0\0\0\0\0\0\x02\0\0\
+\x0d\x23\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\0\0\0\x02\x13\x02\0\
+\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x11\0\0\0\0\0\0\0\0\0\
+\0\x02\x15\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x55\0\
+\0\0\0\0\0\0\0\0\0\x02\x17\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\x14\0\0\
+\0\0\0\0\0\x23\0\0\0\0\0\0\0\0\0\0\x02\x19\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\
+\0\0\0\0\x14\0\0\0\0\0\0\0\x1a\x02\0\0\0\0\0\0\0\0\0\x02\x1b\x02\0\0\xd8\x32\0\
+\0\0\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\x02\x1d\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\
+\0\0\0\0\x14\0\0\0\0\0\0\0\x1e\x02\0\0\0\0\0\0\0\0\0\x02\x1f\x02\0\0\xed\x32\0\
+\0\x02\0\0\x04\x10\0\0\0\xf2\x2e\0\0\x20\x02\0\0\0\0\0\0\xf9\x22\0\0\x68\0\0\0\
+\x40\0\0\0\x02\x33\0\0\x04\0\0\x06\x04\0\0\0\x19\x33\0\0\0\0\0\0\x2c\x33\0\0\
+\x01\0\0\0\x3f\x33\0\0\x02\0\0\0\x54\x33\0\0\x03\0\0\0\0\0\0\0\0\0\0\x02\x22\
+\x02\0\0\0\0\0\0\x02\0\0\x0d\x14\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x23\x02\0\0\0\
+\0\0\0\0\0\0\x02\x24\x02\0\0\x6c\x33\0\0\x02\0\0\x04\x10\0\0\0\x7f\x33\0\0\x23\
+\0\0\0\0\0\0\0\xd8\x23\0\0\x93\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x02\x26\x02\0\0\0\
+\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x27\x02\0\0\0\0\0\0\0\0\0\
+\x02\x28\x02\0\0\x84\x33\0\0\x01\0\0\x04\x01\0\0\0\x97\x33\0\0\x23\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\x02\x2a\x02\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x2b\x02\0\
+\0\0\0\0\0\0\0\0\x02\x2c\x02\0\0\xa1\x33\0\0\x05\0\0\x04\x28\0\0\0\xed\x2e\0\0\
+\xdc\x01\0\0\0\0\0\0\xd5\x05\0\0\x71\0\0\0\x40\0\0\0\xf2\x2e\0\0\xdd\x01\0\0\
+\x80\0\0\0\xae\x33\0\0\x6d\0\0\0\xc0\0\0\0\xb4\x33\0\0\x6d\0\0\0\0\x01\0\0\0\0\
+\0\0\0\0\0\x02\x2e\x02\0\0\0\0\0\0\x03\0\0\x0d\0\0\0\0\0\0\0\0\x2b\x02\0\0\0\0\
+\0\0\x14\0\0\0\0\0\0\0\x23\0\0\0\0\0\0\0\0\0\0\x02\x30\x02\0\0\0\0\0\0\x02\0\0\
+\x0d\0\0\0\0\0\0\0\0\x2b\x02\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\0\0\0\x02\x32\x02\0\
+\0\0\0\0\0\x02\0\0\x0d\x14\0\0\0\0\0\0\0\x93\0\0\0\0\0\0\0\x5f\x02\0\0\xd8\x23\
+\0\0\x2a\0\0\x04\xc0\x07\0\0\xbf\x33\0\0\x34\x02\0\0\0\0\0\0\xa6\x02\0\0\x4e\0\
+\0\0\x80\x06\0\0\xc4\x33\0\0\x02\0\0\0\xc0\x06\0\0\xca\x33\0\0\x02\0\0\0\xe0\
+\x06\0\0\xd4\x33\0\0\x02\0\0\0\0\x07\0\0\xe3\x33\0\0\x02\0\0\0\x20\x07\0\0\xf8\
+\x33\0\0\x02\0\0\0\x40\x07\0\0\x08\x34\0\0\x02\0\0\0\x60\x07\0\0\x1b\x34\0\0\
+\x02\0\0\0\x80\x07\0\0\x38\x34\0\0\x02\0\0\0\xa0\x07\0\0\x57\x34\0\0\x02\0\0\0\
+\xc0\x07\0\0\x6c\x34\0\0\x40\x02\0\0\0\x08\0\0\x6f\x34\0\0\x41\x02\0\0\x40\x08\
+\0\0\x7a\x34\0\0\x41\x02\0\0\0\x0a\0\0\x86\x34\0\0\x42\x02\0\0\xc0\x0b\0\0\x90\
+\x34\0\0\x65\0\0\0\0\x11\0\0\xa0\x34\0\0\x65\0\0\0\x10\x11\0\0\xb0\x34\0\0\x65\
+\0\0\0\x20\x11\0\0\xc4\x34\0\0\x65\0\0\0\x30\x11\0\0\xd8\x34\0\0\x43\x02\0\0\
+\x40\x11\0\0\xdf\x34\0\0\x44\x02\0\0\xc0\x14\0\0\xef\x34\0\0\x45\x02\0\0\x80\
+\x16\0\0\xf4\x34\0\0\x6e\0\0\0\xc0\x16\0\0\xff\x34\0\0\x46\x02\0\0\x40\x17\0\0\
+\x07\x35\0\0\x93\0\0\0\x40\x1e\0\0\x10\x35\0\0\x93\0\0\0\x80\x1e\0\0\x1d\x35\0\
+\0\x47\x02\0\0\xc0\x1e\0\0\x27\x35\0\0\x6e\0\0\0\0\x1f\0\0\x36\x35\0\0\x48\x02\
+\0\0\0\x20\0\0\x3c\x35\0\0\x93\0\0\0\0\x20\0\0\x4d\x35\0\0\x4a\x02\0\0\x40\x20\
+\0\0\x58\x35\0\0\x4a\x02\0\0\x40\x21\0\0\xef\x07\0\0\xbd\0\0\0\x40\x22\0\0\x5e\
+\x35\0\0\x6e\0\0\0\0\x23\0\0\x67\x35\0\0\xd4\0\0\0\x80\x23\0\0\x75\x35\0\0\x5d\
+\x01\0\0\x80\x24\0\0\x83\x35\0\0\x38\x02\0\0\x40\x25\0\0\x96\x35\0\0\x4c\x02\0\
+\0\x40\x26\0\0\x9a\x35\0\0\x4d\x02\0\0\x80\x26\0\0\x9e\x35\0\0\x5d\x02\0\0\0\
+\x3d\0\0\xa6\x35\0\0\x31\x01\0\0\x80\x3d\0\0\xb7\x35\0\0\x5e\x02\0\0\xc0\x3d\0\
+\0\xc1\x35\0\0\x0e\0\0\x04\xd0\0\0\0\xd8\x23\0\0\x93\0\0\0\0\0\0\0\x5c\x29\0\0\
+\x35\x02\0\0\x40\0\0\0\xd5\x35\0\0\x36\x02\0\0\x80\0\0\0\x5a\x07\0\0\x6e\0\0\0\
+\0\x01\0\0\x51\x07\0\0\x6e\0\0\0\x80\x01\0\0\xdc\x35\0\0\x6e\0\0\0\0\x02\0\0\
+\x24\x21\0\0\x02\0\0\0\x80\x02\0\0\xa6\x02\0\0\x13\0\0\0\xa0\x02\0\0\xeb\x35\0\
+\0\x6d\0\0\0\xc0\x02\0\0\xf5\x35\0\0\x52\0\0\0\0\x03\0\0\0\x36\0\0\x38\x02\0\0\
+\x40\x03\0\0\x0d\x36\0\0\x3d\x02\0\0\x40\x04\0\0\x4a\x07\0\0\x3f\x02\0\0\0\x06\
+\0\0\xd4\x33\0\0\x02\0\0\0\x40\x06\0\0\0\0\0\0\0\0\0\x02\xb1\x02\0\0\x1b\x36\0\
+\0\x02\0\0\x04\x10\0\0\0\x26\x36\0\0\x4e\0\0\0\0\0\0\0\x37\x36\0\0\x37\x02\0\0\
+\x40\0\0\0\0\0\0\0\0\0\0\x02\xa7\x02\0\0\x3c\x36\0\0\x03\0\0\x04\x20\0\0\0\x37\
+\x36\0\0\x90\0\0\0\0\0\0\0\x3e\x1d\0\0\x6e\0\0\0\x40\0\0\0\xd5\x19\0\0\x39\x02\
+\0\0\xc0\0\0\0\x48\x36\0\0\0\0\0\x08\x3a\x02\0\0\0\0\0\0\0\0\0\x02\x3b\x02\0\0\
+\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x3c\x02\0\0\0\0\0\0\0\0\0\x02\x38\x02\0\0\
+\x54\x36\0\0\x03\0\0\x04\x38\0\0\0\xb2\x19\0\0\x38\x02\0\0\0\0\0\0\x6b\x0e\0\0\
+\xd0\0\0\0\0\x01\0\0\x5d\x36\0\0\x3e\x02\0\0\x80\x01\0\0\0\0\0\0\0\0\0\x02\xb3\
+\x02\0\0\0\0\0\0\0\0\0\x02\x34\x02\0\0\0\0\0\0\0\0\0\x02\xae\x02\0\0\x60\x36\0\
+\0\x03\0\0\x04\x38\0\0\0\x6c\x34\0\0\x40\x02\0\0\0\0\0\0\x6c\x36\0\0\x4e\0\0\0\
+\x40\0\0\0\x78\x36\0\0\x2c\x01\0\0\x80\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x41\x02\
+\0\0\x04\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x3f\x02\0\0\x04\0\0\0\x0e\0\
+\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x0e\0\0\0\0\0\0\0\0\0\0\x02\
+\xaf\x02\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x6e\0\0\0\x04\0\0\0\x0e\0\0\0\0\0\0\0\0\
+\0\0\x02\xb0\x02\0\0\x85\x36\0\0\x01\0\0\x04\0\0\0\0\x97\x36\0\0\x49\x02\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\0\0\0\0\x99\x36\0\0\x02\0\
+\0\x04\x20\0\0\0\xaa\x36\0\0\x4b\x02\0\0\0\0\0\0\xb2\x36\0\0\x6d\0\0\0\xc0\0\0\
+\0\xc0\x36\0\0\x03\0\0\x04\x18\0\0\0\xe3\x07\0\0\x6d\0\0\0\0\0\0\0\xdd\x07\0\0\
+\x6d\0\0\0\x40\0\0\0\x8d\x10\0\0\x21\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\x02\xb2\x02\
+\0\0\xcd\x36\0\0\x07\0\0\x04\xd0\x02\0\0\xd8\x36\0\0\x5a\x02\0\0\0\0\0\0\xe2\
+\x36\0\0\x5b\x02\0\0\x80\x09\0\0\xa6\x02\0\0\x5c\x02\0\0\0\x13\0\0\xe8\x36\0\0\
+\x6e\0\0\0\x40\x14\0\0\xf1\x36\0\0\x4e\x02\0\0\xc0\x14\0\0\xd5\x35\0\0\x36\x02\
+\0\0\0\x15\0\0\xfa\x36\0\0\x38\x02\0\0\x80\x15\0\0\0\0\0\0\0\0\0\x02\x4f\x02\0\
+\0\x07\x37\0\0\x02\0\0\x04\x10\0\0\0\x6b\x0e\0\0\xd0\0\0\0\0\0\0\0\x16\x37\0\0\
+\x59\x02\0\0\x80\0\0\0\x1c\x37\0\0\x02\0\0\x04\x18\0\0\0\x64\x21\0\0\x82\x01\0\
+\0\0\0\0\0\0\0\0\0\x51\x02\0\0\x40\0\0\0\0\0\0\0\x02\0\0\x05\x10\0\0\0\x30\x37\
+\0\0\x58\x02\0\0\0\0\0\0\x69\x21\0\0\x6d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x53\
+\x02\0\0\x3f\x37\0\0\x07\0\0\x04\x68\0\0\0\0\0\0\0\x54\x02\0\0\0\0\0\0\xef\x2f\
+\0\0\x56\x02\0\0\x40\0\0\0\x9a\0\0\0\x57\x02\0\0\x80\0\0\0\x52\x37\0\0\x6e\0\0\
+\0\0\x01\0\0\x5b\x37\0\0\x6e\0\0\0\x80\x01\0\0\x26\x13\0\0\x6b\0\0\0\0\x02\0\0\
+\x6b\x0e\0\0\xd0\0\0\0\xc0\x02\0\0\0\0\0\0\x02\0\0\x05\x08\0\0\0\x63\x37\0\0\
+\x55\x02\0\0\0\0\0\0\x67\x37\0\0\x60\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\xb9\x02\0\
+\0\0\0\0\0\0\0\0\x02\xba\x02\0\0\x72\x37\0\0\x02\0\0\x04\x10\0\0\0\x89\x37\0\0\
+\x20\0\0\0\0\0\0\0\x99\x37\0\0\x12\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\
+\x52\x02\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x50\x02\0\0\x04\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x4e\x02\0\0\x04\0\0\0\x26\0\0\0\0\0\0\0\0\
+\0\0\x03\0\0\0\0\x9a\0\0\0\x04\0\0\0\x26\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x82\0\
+\0\0\x04\0\0\0\x26\0\0\0\xa5\x37\0\0\x04\0\0\x04\x10\0\0\0\xba\x37\0\0\x23\0\0\
+\0\0\0\0\0\xc1\x37\0\0\x02\0\0\0\x20\0\0\0\xca\x37\0\0\x02\0\0\0\x40\0\0\0\xe0\
+\x37\0\0\x02\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x93\0\0\0\x04\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\x02\x60\x02\0\0\xf0\x37\0\0\x01\0\0\x04\x04\0\0\0\x08\x11\0\
+\0\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\x62\x02\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\
+\0\0\0\0\x93\0\0\0\0\0\0\0\0\0\0\x02\x64\x02\0\0\0\0\0\0\x03\0\0\x0d\x14\0\0\0\
+\0\0\0\0\x68\0\0\0\0\0\0\0\x93\0\0\0\0\0\0\0\x93\0\0\0\0\0\0\0\0\0\0\x02\x66\
+\x02\0\0\0\0\0\0\x03\0\0\x0d\0\0\0\0\0\0\0\0\x68\0\0\0\0\0\0\0\x93\0\0\0\0\0\0\
+\0\x93\0\0\0\0\0\0\0\0\0\0\x02\x68\x02\0\0\0\0\0\0\x02\0\0\x0d\0\0\0\0\0\0\0\0\
+\x93\0\0\0\0\0\0\0\x11\0\0\0\0\0\0\0\0\0\0\x02\x6a\x02\0\0\0\0\0\0\x01\0\0\x0d\
+\0\0\0\0\0\0\0\0\x14\0\0\0\0\0\0\0\0\0\0\x02\x6c\x02\0\0\0\0\0\0\0\0\0\x0d\x14\
+\0\0\0\0\0\0\0\0\0\0\x02\x6e\x02\0\0\0\0\0\0\x01\0\0\x0d\0\0\0\0\0\0\0\0\x6f\
+\x02\0\0\0\0\0\0\0\0\0\x02\xdb\x01\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\
+\0\0\0\x80\0\0\0\x05\x38\0\0\0\0\0\x0e\x05\x02\0\0\x01\0\0\0\0\0\0\0\0\0\0\x03\
+\0\0\0\0\x38\0\0\0\x04\0\0\0\x01\0\0\0\x0e\x38\0\0\0\0\0\x0e\x72\x02\0\0\x01\0\
+\0\0\x17\x38\0\0\0\0\0\x0e\xfc\x01\0\0\x01\0\0\0\x24\x38\0\0\x04\0\0\x04\x90\
+\x04\0\0\xed\x2e\0\0\x02\0\0\0\0\0\0\0\xd5\x05\0\0\x71\0\0\0\x40\0\0\0\xf2\x2e\
+\0\0\x70\x02\0\0\x80\0\0\0\x03\x2f\0\0\x76\x02\0\0\x80\x04\0\0\0\0\0\0\0\0\0\
+\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\0\x04\0\0\x33\x38\0\0\0\0\0\x0e\x75\x02\0\0\
+\x01\0\0\0\x37\x38\0\0\0\0\0\x0e\x10\0\0\0\x01\0\0\0\x47\x38\0\0\0\0\0\x0e\x10\
+\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x1c\0\0\0\x57\
+\x38\0\0\0\0\0\x0e\x7a\x02\0\0\0\0\0\0\x72\x38\0\0\0\0\0\x0e\x7a\x02\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x1a\0\0\0\x8f\x38\0\0\0\0\0\
+\x0e\x7d\x02\0\0\0\0\0\0\xac\x38\0\0\0\0\0\x0e\x14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x19\0\0\0\xb8\x38\0\0\0\0\0\x0e\x80\x02\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x21\0\0\0\xd4\x38\0\0\0\0\
+\0\x0e\x82\x02\0\0\0\0\0\0\xf2\x38\0\0\0\0\0\x0e\x6d\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x18\0\0\0\xfc\x38\0\0\0\0\0\x0e\x85\x02\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x1e\0\0\0\x14\x39\0\0\0\
+\0\0\x0e\x87\x02\0\0\0\0\0\0\x2d\x39\0\0\0\0\0\x0e\x7d\x02\0\0\0\0\0\0\x49\x39\
+\0\0\0\0\0\x0e\x87\x02\0\0\0\0\0\0\x5e\x39\0\0\0\0\0\x0e\x7d\x02\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x20\0\0\0\x76\x39\0\0\0\0\0\x0e\
+\x8c\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x22\0\0\0\
+\x8e\x39\0\0\0\0\0\x0e\x8e\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\
+\x04\0\0\0\x1f\0\0\0\xa6\x39\0\0\0\0\0\x0e\x90\x02\0\0\0\0\0\0\xbe\x39\0\0\0\0\
+\0\x0e\x7d\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x38\0\0\0\x04\0\0\0\x24\0\
+\0\0\xd6\x39\0\0\0\0\0\x0e\x93\x02\0\0\0\0\0\0\xeb\x39\0\0\0\0\0\x0e\x7d\x02\0\
+\0\0\0\0\0\x03\x3a\0\0\0\0\0\x12\x4b\0\0\0\x08\x3a\0\0\0\0\0\x07\0\0\0\0\x19\
+\x3a\0\0\0\0\0\x07\0\0\0\0\x17\x1f\0\0\0\0\0\x07\0\0\0\0\x26\x3a\0\0\0\0\0\x07\
+\0\0\0\0\x3d\x3a\0\0\0\0\0\x07\0\0\0\0\x50\x3a\0\0\0\0\0\x07\0\0\0\0\xf3\x12\0\
+\0\0\0\0\x07\0\0\0\0\xdc\x10\0\0\0\0\0\x07\0\0\0\0\x5c\x3a\0\0\0\0\0\x07\0\0\0\
+\0\x66\x3a\0\0\0\0\0\x07\0\0\0\0\x75\x3a\0\0\0\0\0\x07\0\0\0\0\x88\x3a\0\0\0\0\
+\0\x07\0\0\0\0\x15\x1d\0\0\0\0\0\x07\0\0\0\0\x7c\x0b\0\0\0\0\0\x07\0\0\0\0\x96\
+\x3a\0\0\0\0\0\x07\0\0\0\0\xa1\x3a\0\0\0\0\0\x07\0\0\0\0\xac\x3a\0\0\0\0\0\x07\
+\0\0\0\0\xbc\x3a\0\0\0\0\0\x07\0\0\0\0\xc7\x3a\0\0\0\0\0\x07\0\0\0\0\xec\x08\0\
+\0\0\0\0\x07\0\0\0\0\xdb\x1a\0\0\0\0\0\x07\0\0\0\0\xd6\x3a\0\0\0\0\0\x07\0\0\0\
+\0\xe4\x3a\0\0\0\0\0\x07\0\0\0\0\xec\x3a\0\0\0\0\0\x07\0\0\0\0\xf8\x3a\0\0\0\0\
+\0\x07\0\0\0\0\x04\x3b\0\0\0\0\0\x07\0\0\0\0\x15\x3b\0\0\0\0\0\x07\0\0\0\0\x23\
+\x3b\0\0\0\0\0\x07\0\0\0\0\x2d\x3b\0\0\0\0\0\x07\0\0\0\0\x3e\x3b\0\0\0\0\0\x07\
+\0\0\0\0\x47\x3b\0\0\0\0\0\x07\0\0\0\0\x59\x3b\0\0\0\0\0\x07\0\0\0\0\x65\x3b\0\
+\0\0\0\0\x07\0\0\0\0\x6f\x3b\0\0\0\0\0\x07\0\0\0\0\x7b\x3b\0\0\0\0\0\x07\0\0\0\
+\0\x8e\x3b\0\0\0\0\0\x07\0\0\0\0\xa5\x3b\0\0\0\0\0\x07\0\0\0\0\x9a\0\0\0\0\0\0\
+\x07\0\0\0\0\xaf\x3b\0\0\0\0\0\x07\0\0\0\0\xbf\x3b\0\0\0\0\0\x07\0\0\0\0\xe3\
+\x1a\0\0\0\0\0\x07\0\0\0\0\xcd\x3b\0\0\0\0\0\x07\0\0\0\0\x07\x0a\0\0\0\0\0\x07\
+\0\0\0\0\x23\x0a\0\0\0\0\0\x07\0\0\0\0\x28\x07\0\0\0\0\0\x07\0\0\0\0\xd5\x3b\0\
+\0\0\0\0\x07\0\0\0\0\xec\x3b\0\0\0\0\0\x07\0\0\0\0\x01\x3c\0\0\0\0\0\x07\0\0\0\
+\0\x11\x3c\0\0\0\0\0\x07\0\0\0\0\x23\x3c\0\0\0\0\0\x07\0\0\0\0\x2f\x3c\0\0\0\0\
+\0\x07\0\0\0\0\x3e\x3c\0\0\0\0\0\x07\0\0\0\0\x4f\x03\0\0\0\0\0\x07\0\0\0\0\x49\
+\x3c\0\0\0\0\0\x07\0\0\0\0\x52\x3c\0\0\0\0\0\x07\0\0\0\0\x60\x3c\0\0\0\0\0\x07\
+\0\0\0\0\x72\x3c\0\0\0\0\0\x07\0\0\0\0\x81\x3c\0\0\0\0\0\x07\0\0\0\0\x9d\x08\0\
+\0\0\0\0\x07\0\0\0\0\x88\x3c\0\0\0\0\0\x07\0\0\0\0\x96\x3c\0\0\0\0\0\x07\0\0\0\
+\0\xa3\x3c\0\0\0\0\0\x07\0\0\0\0\xb1\x3c\0\0\0\0\0\x07\0\0\0\0\xba\x3c\0\0\0\0\
+\0\x07\0\0\0\0\x5c\x09\0\0\0\0\0\x07\0\0\0\0\xc9\x3c\0\0\0\0\0\x07\0\0\0\0\xd8\
+\x3c\0\0\0\0\0\x07\0\0\0\0\x15\x0a\0\0\0\0\0\x07\0\0\0\0\x2e\x0a\0\0\0\0\0\x07\
+\0\0\0\0\xe8\x3c\0\0\0\0\0\x07\0\0\0\0\xf9\x3c\0\0\0\0\0\x07\0\0\0\0\x11\x3d\0\
+\0\0\0\0\x07\0\0\0\0\x45\x0c\0\0\0\0\0\x07\0\0\0\0\x97\x0c\0\0\0\0\0\x07\0\0\0\
+\0\x20\x3d\0\0\0\0\0\x07\0\0\0\0\x30\x3d\0\0\0\0\0\x07\0\0\0\0\x3c\x3d\0\0\0\0\
+\0\x07\0\0\0\0\xf3\x0e\0\0\0\0\0\x07\0\0\0\0\x8d\x0f\0\0\0\0\0\x07\0\0\0\0\xff\
+\x1d\0\0\0\0\0\x07\0\0\0\0\x48\x3d\0\0\0\0\0\x07\0\0\0\0\x08\x5f\0\0\x01\0\0\
+\x0f\x0d\0\0\0\xef\x01\0\0\0\0\0\0\x0d\0\0\0\x10\x5f\0\0\x0b\0\0\x0f\x68\0\0\0\
+\xf2\x01\0\0\0\0\0\0\x08\0\0\0\xf3\x01\0\0\x08\0\0\0\x08\0\0\0\xf4\x01\0\0\x10\
+\0\0\0\x08\0\0\0\xf5\x01\0\0\x18\0\0\0\x08\0\0\0\xf8\x01\0\0\x20\0\0\0\x01\0\0\
+\0\xf9\x01\0\0\x28\0\0\0\x08\0\0\0\xfa\x01\0\0\x30\0\0\0\x08\0\0\0\xfb\x01\0\0\
+\x38\0\0\0\x01\0\0\0\xfe\x01\0\0\x3c\0\0\0\x04\0\0\0\0\x02\0\0\x40\0\0\0\x21\0\
+\0\0\x74\x02\0\0\x64\0\0\0\x04\0\0\0\x18\x5f\0\0\x0b\0\0\x0f\x48\x01\0\0\x08\0\
+\0\0\0\0\0\0\x10\0\0\0\x17\0\0\0\x10\0\0\0\x20\0\0\0\x26\0\0\0\x30\0\0\0\x20\0\
+\0\0\x2b\0\0\0\x50\0\0\0\x20\0\0\0\x2f\0\0\0\x70\0\0\0\x20\0\0\0\x35\0\0\0\x90\
+\0\0\0\x18\0\0\0\x3b\0\0\0\xa8\0\0\0\x20\0\0\0\x3c\0\0\0\xc8\0\0\0\x20\0\0\0\
+\x3e\0\0\0\xe8\0\0\0\x20\0\0\0\x3f\0\0\0\x08\x01\0\0\x20\0\0\0\x49\0\0\0\x28\
+\x01\0\0\x20\0\0\0\x1e\x5f\0\0\x06\0\0\x0f\x30\0\0\0\x01\x02\0\0\0\0\0\0\x08\0\
+\0\0\x02\x02\0\0\x08\0\0\0\x08\0\0\0\x03\x02\0\0\x10\0\0\0\x08\0\0\0\x04\x02\0\
+\0\x18\0\0\0\x08\0\0\0\x7f\x02\0\0\x20\0\0\0\x04\0\0\0\x84\x02\0\0\x28\0\0\0\
+\x08\0\0\0\x23\x5f\0\0\x01\0\0\x0f\xa8\x01\0\0\x71\x02\0\0\0\0\0\0\xa8\x01\0\0\
+\x34\x5f\0\0\x01\0\0\x0f\x01\0\0\0\x73\x02\0\0\0\0\0\0\x01\0\0\0\x43\x5f\0\0\
+\x11\0\0\x0f\x5d\x06\0\0\x77\x02\0\0\0\0\0\0\x90\x04\0\0\x7b\x02\0\0\x90\x04\0\
+\0\x1c\0\0\0\x7c\x02\0\0\xac\x04\0\0\x1c\0\0\0\x7e\x02\0\0\xc8\x04\0\0\x1a\0\0\
+\0\x81\x02\0\0\xe2\x04\0\0\x19\0\0\0\x83\x02\0\0\xfb\x04\0\0\x21\0\0\0\x86\x02\
+\0\0\x1c\x05\0\0\x18\0\0\0\x88\x02\0\0\x34\x05\0\0\x1e\0\0\0\x89\x02\0\0\x52\
+\x05\0\0\x1a\0\0\0\x8a\x02\0\0\x6c\x05\0\0\x1e\0\0\0\x8b\x02\0\0\x8a\x05\0\0\
+\x1a\0\0\0\x8d\x02\0\0\xa4\x05\0\0\x20\0\0\0\x8f\x02\0\0\xc4\x05\0\0\x22\0\0\0\
+\x91\x02\0\0\xe6\x05\0\0\x1f\0\0\0\x92\x02\0\0\x05\x06\0\0\x1a\0\0\0\x94\x02\0\
+\0\x1f\x06\0\0\x24\0\0\0\x95\x02\0\0\x43\x06\0\0\x1a\0\0\0\x49\x5f\0\0\x02\0\0\
+\x0f\x10\0\0\0\x78\x02\0\0\0\0\0\0\x08\0\0\0\x79\x02\0\0\x08\0\0\0\x08\0\0\0\
+\x55\x5f\0\0\x16\0\0\x0f\0\0\0\0\x5c\0\0\0\0\0\0\0\0\0\0\0\x5d\0\0\0\0\0\0\0\0\
+\0\0\0\xae\x01\0\0\0\0\0\0\0\0\0\0\xb0\x01\0\0\0\0\0\0\0\0\0\0\xb2\x01\0\0\0\0\
+\0\0\0\0\0\0\xb4\x01\0\0\0\0\0\0\0\0\0\0\xb6\x01\0\0\0\0\0\0\0\0\0\0\xb8\x01\0\
+\0\0\0\0\0\0\0\0\0\xb9\x01\0\0\0\0\0\0\0\0\0\0\xbb\x01\0\0\0\0\0\0\0\0\0\0\xbf\
+\x01\0\0\0\0\0\0\0\0\0\0\xc2\x01\0\0\0\0\0\0\0\0\0\0\xc4\x01\0\0\0\0\0\0\0\0\0\
+\0\xc9\x01\0\0\0\0\0\0\0\0\0\0\xcb\x01\0\0\0\0\0\0\0\0\0\0\xcf\x01\0\0\0\0\0\0\
+\0\0\0\0\xd0\x01\0\0\0\0\0\0\0\0\0\0\xd5\x01\0\0\0\0\0\0\0\0\0\0\xd7\x01\0\0\0\
+\0\0\0\0\0\0\0\xd9\x01\0\0\0\0\0\0\0\0\0\0\xeb\x01\0\0\0\0\0\0\0\0\0\0\xed\x01\
+\0\0\0\0\0\0\0\0\0\0\0\x69\x6e\x74\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\
+\x5a\x45\x5f\x54\x59\x50\x45\x5f\x5f\0\x74\x79\x70\x65\0\x6d\x61\x78\x5f\x65\
+\x6e\x74\x72\x69\x65\x73\0\x63\x70\x75\x5f\x6d\x61\x73\x6b\x5f\x62\x75\x66\x66\
+\x65\x72\0\x74\x61\x73\x6b\x5f\x63\x74\x78\0\x74\x6d\x70\x5f\x6d\x61\x73\x6b\0\
+\x70\x72\x65\x76\x5f\x6d\x69\x73\x73\x65\x73\0\x61\x74\x74\x61\x63\x68\x65\x64\
+\x5f\x63\x6f\x72\x65\0\x70\x72\x65\x76\x5f\x63\x70\x75\0\x75\x33\x32\0\x5f\x5f\
+\x75\x33\x32\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x73\x33\x32\0\
+\x5f\x5f\x73\x33\x32\0\x6d\x61\x70\x5f\x66\x6c\x61\x67\x73\0\x6b\x65\x79\0\x76\
+\x61\x6c\x75\x65\0\x74\x61\x73\x6b\x5f\x63\x74\x78\x5f\x73\x74\x6f\x72\0\x70\
+\x63\x70\x75\x5f\x63\x74\x78\0\x74\x69\x6d\x65\x72\0\x73\x63\x68\x65\x64\x75\
+\x6c\x65\x64\x5f\x63\x6f\x6d\x70\x61\x63\x74\x69\x6f\x6e\0\x62\x70\x66\x5f\x74\
+\x69\x6d\x65\x72\0\x5f\x5f\x6f\x70\x61\x71\x75\x65\0\x5f\x5f\x75\x36\x34\0\x75\
+\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x62\x6f\
+\x6f\x6c\0\x5f\x42\x6f\x6f\x6c\0\x70\x63\x70\x75\x5f\x63\x74\x78\x73\0\x73\x74\
+\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\0\x66\x69\x6c\x74\x65\x72\x5f\x69\x6e\x6e\
+\x65\x72\x5f\x6d\x61\x70\0\x74\x65\x6d\x70\x6c\x61\x74\x65\x5f\x6d\x61\x70\0\
+\x76\x61\x6c\x75\x65\x73\0\x66\x6c\x69\x74\x65\x72\x5f\x6d\x61\x70\0\x63\x6f\
+\x6d\x6d\x5f\x69\x6e\x66\x6f\0\x63\x6f\x6d\x6d\0\x63\x68\x61\x72\0\x63\x6f\x6d\
+\x6d\x5f\x69\x67\x6e\x6f\x72\x65\x5f\x6d\x61\x70\0\x63\x6f\x6d\x6d\x5f\x61\x74\
+\x74\x65\x6e\x74\x69\x6f\x6e\x5f\x6d\x61\x70\0\x69\x64\x5f\x69\x67\x6e\x6f\x72\
+\x65\x5f\x6d\x61\x70\0\x69\x64\x5f\x61\x74\x74\x65\x6e\x74\x69\x6f\x6e\x5f\x6d\
+\x61\x70\0\x6b\x65\x79\x5f\x73\x69\x7a\x65\0\x76\x61\x6c\x75\x65\x5f\x73\x69\
+\x7a\x65\0\x73\x74\x61\x74\x73\0\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\
+\x63\x70\x75\x6d\x61\x73\x6b\0\x75\x73\x61\x67\x65\0\x63\x70\x75\x6d\x61\x73\
+\x6b\x5f\x74\0\x62\x69\x74\x73\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\
+\x6e\x67\0\x72\x65\x66\x63\x6f\x75\x6e\x74\x5f\x74\0\x72\x65\x66\x63\x6f\x75\
+\x6e\x74\x5f\x73\x74\x72\x75\x63\x74\0\x72\x65\x66\x73\0\x61\x74\x6f\x6d\x69\
+\x63\x5f\x74\0\x63\x6f\x75\x6e\x74\x65\x72\0\x6d\x61\x73\x6b\0\x63\x61\x73\x74\
+\x5f\x6d\x61\x73\x6b\0\x63\x74\x78\0\x6e\x65\x73\x74\x5f\x73\x65\x6c\x65\x63\
+\x74\x5f\x63\x70\x75\0\x62\x70\x66\x5f\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x6c\
+\x6f\x63\x6b\0\x62\x70\x66\x5f\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x75\x6e\x6c\
+\x6f\x63\x6b\0\x74\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\0\x74\x68\x72\x65\
+\x61\x64\x5f\x69\x6e\x66\x6f\0\x5f\x5f\x73\x74\x61\x74\x65\0\x73\x61\x76\x65\
+\x64\x5f\x73\x74\x61\x74\x65\0\x73\x74\x61\x63\x6b\0\x66\x6c\x61\x67\x73\0\x70\
+\x74\x72\x61\x63\x65\0\x6f\x6e\x5f\x63\x70\x75\0\x77\x61\x6b\x65\x5f\x65\x6e\
+\x74\x72\x79\0\x77\x61\x6b\x65\x65\x5f\x66\x6c\x69\x70\x73\0\x77\x61\x6b\x65\
+\x65\x5f\x66\x6c\x69\x70\x5f\x64\x65\x63\x61\x79\x5f\x74\x73\0\x6c\x61\x73\x74\
+\x5f\x77\x61\x6b\x65\x65\0\x72\x65\x63\x65\x6e\x74\x5f\x75\x73\x65\x64\x5f\x63\
+\x70\x75\0\x77\x61\x6b\x65\x5f\x63\x70\x75\0\x6f\x6e\x5f\x72\x71\0\x70\x72\x69\
+\x6f\0\x73\x74\x61\x74\x69\x63\x5f\x70\x72\x69\x6f\0\x6e\x6f\x72\x6d\x61\x6c\
+\x5f\x70\x72\x69\x6f\0\x72\x74\x5f\x70\x72\x69\x6f\x72\x69\x74\x79\0\x73\x65\0\
+\x72\x74\0\x64\x6c\0\x64\x6c\x5f\x73\x65\x72\x76\x65\x72\0\x73\x63\x78\0\x73\
+\x63\x68\x65\x64\x5f\x63\x6c\x61\x73\x73\0\x63\x6f\x72\x65\x5f\x6e\x6f\x64\x65\
+\0\x63\x6f\x72\x65\x5f\x63\x6f\x6f\x6b\x69\x65\0\x63\x6f\x72\x65\x5f\x6f\x63\
+\x63\x75\x70\x61\x74\x69\x6f\x6e\0\x73\x63\x68\x65\x64\x5f\x74\x61\x73\x6b\x5f\
+\x67\x72\x6f\x75\x70\0\x75\x63\x6c\x61\x6d\x70\x5f\x72\x65\x71\0\x75\x63\x6c\
+\x61\x6d\x70\0\x70\x72\x65\x65\x6d\x70\x74\x5f\x6e\x6f\x74\x69\x66\x69\x65\x72\
+\x73\0\x62\x74\x72\x61\x63\x65\x5f\x73\x65\x71\0\x70\x6f\x6c\x69\x63\x79\0\x6d\
+\x61\x78\x5f\x61\x6c\x6c\x6f\x77\x65\x64\x5f\x63\x61\x70\x61\x63\x69\x74\x79\0\
+\x6e\x72\x5f\x63\x70\x75\x73\x5f\x61\x6c\x6c\x6f\x77\x65\x64\0\x63\x70\x75\x73\
+\x5f\x70\x74\x72\0\x75\x73\x65\x72\x5f\x63\x70\x75\x73\x5f\x70\x74\x72\0\x63\
+\x70\x75\x73\x5f\x6d\x61\x73\x6b\0\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x5f\x70\
+\x65\x6e\x64\x69\x6e\x67\0\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x5f\x64\x69\x73\
+\x61\x62\x6c\x65\x64\0\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x5f\x66\x6c\x61\x67\
+\x73\0\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x6c\x6f\x63\x6b\x5f\x6e\x65\x73\x74\
+\x69\x6e\x67\0\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x75\x6e\x6c\x6f\x63\x6b\x5f\
+\x73\x70\x65\x63\x69\x61\x6c\0\x72\x63\x75\x5f\x6e\x6f\x64\x65\x5f\x65\x6e\x74\
+\x72\x79\0\x72\x63\x75\x5f\x62\x6c\x6f\x63\x6b\x65\x64\x5f\x6e\x6f\x64\x65\0\
+\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x6e\x76\x63\x73\x77\0\x72\x63\x75\x5f\
+\x74\x61\x73\x6b\x73\x5f\x68\x6f\x6c\x64\x6f\x75\x74\0\x72\x63\x75\x5f\x74\x61\
+\x73\x6b\x73\x5f\x69\x64\x78\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x69\x64\
+\x6c\x65\x5f\x63\x70\x75\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x68\x6f\x6c\
+\x64\x6f\x75\x74\x5f\x6c\x69\x73\x74\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\
+\x65\x78\x69\x74\x5f\x63\x70\x75\0\x72\x63\x75\x5f\x74\x61\x73\x6b\x73\x5f\x65\
+\x78\x69\x74\x5f\x6c\x69\x73\x74\0\x74\x72\x63\x5f\x72\x65\x61\x64\x65\x72\x5f\
+\x6e\x65\x73\x74\x69\x6e\x67\0\x74\x72\x63\x5f\x69\x70\x69\x5f\x74\x6f\x5f\x63\
+\x70\x75\0\x74\x72\x63\x5f\x72\x65\x61\x64\x65\x72\x5f\x73\x70\x65\x63\x69\x61\
+\x6c\0\x74\x72\x63\x5f\x68\x6f\x6c\x64\x6f\x75\x74\x5f\x6c\x69\x73\x74\0\x74\
+\x72\x63\x5f\x62\x6c\x6b\x64\x5f\x6e\x6f\x64\x65\0\x74\x72\x63\x5f\x62\x6c\x6b\
+\x64\x5f\x63\x70\x75\0\x73\x63\x68\x65\x64\x5f\x69\x6e\x66\x6f\0\x74\x61\x73\
+\x6b\x73\0\x70\x75\x73\x68\x61\x62\x6c\x65\x5f\x74\x61\x73\x6b\x73\0\x70\x75\
+\x73\x68\x61\x62\x6c\x65\x5f\x64\x6c\x5f\x74\x61\x73\x6b\x73\0\x6d\x6d\0\x61\
+\x63\x74\x69\x76\x65\x5f\x6d\x6d\0\x66\x61\x75\x6c\x74\x73\x5f\x64\x69\x73\x61\
+\x62\x6c\x65\x64\x5f\x6d\x61\x70\x70\x69\x6e\x67\0\x65\x78\x69\x74\x5f\x73\x74\
+\x61\x74\x65\0\x65\x78\x69\x74\x5f\x63\x6f\x64\x65\0\x65\x78\x69\x74\x5f\x73\
+\x69\x67\x6e\x61\x6c\0\x70\x64\x65\x61\x74\x68\x5f\x73\x69\x67\x6e\x61\x6c\0\
+\x6a\x6f\x62\x63\x74\x6c\0\x70\x65\x72\x73\x6f\x6e\x61\x6c\x69\x74\x79\0\x73\
+\x63\x68\x65\x64\x5f\x72\x65\x73\x65\x74\x5f\x6f\x6e\x5f\x66\x6f\x72\x6b\0\x73\
+\x63\x68\x65\x64\x5f\x63\x6f\x6e\x74\x72\x69\x62\x75\x74\x65\x73\x5f\x74\x6f\
+\x5f\x6c\x6f\x61\x64\0\x73\x63\x68\x65\x64\x5f\x6d\x69\x67\x72\x61\x74\x65\x64\
+\0\x73\x63\x68\x65\x64\x5f\x72\x65\x6d\x6f\x74\x65\x5f\x77\x61\x6b\x65\x75\x70\
+\0\x73\x63\x68\x65\x64\x5f\x72\x74\x5f\x6d\x75\x74\x65\x78\0\x69\x6e\x5f\x65\
+\x78\x65\x63\x76\x65\0\x69\x6e\x5f\x69\x6f\x77\x61\x69\x74\0\x72\x65\x73\x74\
+\x6f\x72\x65\x5f\x73\x69\x67\x6d\x61\x73\x6b\0\x69\x6e\x5f\x6c\x72\x75\x5f\x66\
+\x61\x75\x6c\x74\0\x6e\x6f\x5f\x63\x67\x72\x6f\x75\x70\x5f\x6d\x69\x67\x72\x61\
+\x74\x69\x6f\x6e\0\x66\x72\x6f\x7a\x65\x6e\0\x75\x73\x65\x5f\x6d\x65\x6d\x64\
+\x65\x6c\x61\x79\0\x69\x6e\x5f\x6d\x65\x6d\x73\x74\x61\x6c\x6c\0\x69\x6e\x5f\
+\x65\x76\x65\x6e\x74\x66\x64\0\x70\x61\x73\x69\x64\x5f\x61\x63\x74\x69\x76\x61\
+\x74\x65\x64\0\x72\x65\x70\x6f\x72\x74\x65\x64\x5f\x73\x70\x6c\x69\x74\x5f\x6c\
+\x6f\x63\x6b\0\x69\x6e\x5f\x74\x68\x72\x61\x73\x68\x69\x6e\x67\0\x61\x74\x6f\
+\x6d\x69\x63\x5f\x66\x6c\x61\x67\x73\0\x72\x65\x73\x74\x61\x72\x74\x5f\x62\x6c\
+\x6f\x63\x6b\0\x70\x69\x64\0\x74\x67\x69\x64\0\x73\x74\x61\x63\x6b\x5f\x63\x61\
+\x6e\x61\x72\x79\0\x72\x65\x61\x6c\x5f\x70\x61\x72\x65\x6e\x74\0\x70\x61\x72\
+\x65\x6e\x74\0\x63\x68\x69\x6c\x64\x72\x65\x6e\0\x73\x69\x62\x6c\x69\x6e\x67\0\
+\x67\x72\x6f\x75\x70\x5f\x6c\x65\x61\x64\x65\x72\0\x70\x74\x72\x61\x63\x65\x64\
+\0\x70\x74\x72\x61\x63\x65\x5f\x65\x6e\x74\x72\x79\0\x74\x68\x72\x65\x61\x64\
+\x5f\x70\x69\x64\0\x70\x69\x64\x5f\x6c\x69\x6e\x6b\x73\0\x74\x68\x72\x65\x61\
+\x64\x5f\x6e\x6f\x64\x65\0\x76\x66\x6f\x72\x6b\x5f\x64\x6f\x6e\x65\0\x73\x65\
+\x74\x5f\x63\x68\x69\x6c\x64\x5f\x74\x69\x64\0\x63\x6c\x65\x61\x72\x5f\x63\x68\
+\x69\x6c\x64\x5f\x74\x69\x64\0\x77\x6f\x72\x6b\x65\x72\x5f\x70\x72\x69\x76\x61\
+\x74\x65\0\x75\x74\x69\x6d\x65\0\x73\x74\x69\x6d\x65\0\x67\x74\x69\x6d\x65\0\
+\x70\x72\x65\x76\x5f\x63\x70\x75\x74\x69\x6d\x65\0\x76\x74\x69\x6d\x65\0\x74\
+\x69\x63\x6b\x5f\x64\x65\x70\x5f\x6d\x61\x73\x6b\0\x6e\x76\x63\x73\x77\0\x6e\
+\x69\x76\x63\x73\x77\0\x73\x74\x61\x72\x74\x5f\x74\x69\x6d\x65\0\x73\x74\x61\
+\x72\x74\x5f\x62\x6f\x6f\x74\x74\x69\x6d\x65\0\x6d\x69\x6e\x5f\x66\x6c\x74\0\
+\x6d\x61\x6a\x5f\x66\x6c\x74\0\x70\x6f\x73\x69\x78\x5f\x63\x70\x75\x74\x69\x6d\
+\x65\x72\x73\0\x70\x6f\x73\x69\x78\x5f\x63\x70\x75\x74\x69\x6d\x65\x72\x73\x5f\
+\x77\x6f\x72\x6b\0\x70\x74\x72\x61\x63\x65\x72\x5f\x63\x72\x65\x64\0\x72\x65\
+\x61\x6c\x5f\x63\x72\x65\x64\0\x63\x72\x65\x64\0\x63\x61\x63\x68\x65\x64\x5f\
+\x72\x65\x71\x75\x65\x73\x74\x65\x64\x5f\x6b\x65\x79\0\x6e\x61\x6d\x65\x69\x64\
+\x61\x74\x61\0\x73\x79\x73\x76\x73\x65\x6d\0\x73\x79\x73\x76\x73\x68\x6d\0\x6c\
+\x61\x73\x74\x5f\x73\x77\x69\x74\x63\x68\x5f\x63\x6f\x75\x6e\x74\0\x6c\x61\x73\
+\x74\x5f\x73\x77\x69\x74\x63\x68\x5f\x74\x69\x6d\x65\0\x66\x73\0\x66\x69\x6c\
+\x65\x73\0\x69\x6f\x5f\x75\x72\x69\x6e\x67\0\x6e\x73\x70\x72\x6f\x78\x79\0\x73\
+\x69\x67\x6e\x61\x6c\0\x73\x69\x67\x68\x61\x6e\x64\0\x62\x6c\x6f\x63\x6b\x65\
+\x64\0\x72\x65\x61\x6c\x5f\x62\x6c\x6f\x63\x6b\x65\x64\0\x73\x61\x76\x65\x64\
+\x5f\x73\x69\x67\x6d\x61\x73\x6b\0\x70\x65\x6e\x64\x69\x6e\x67\0\x73\x61\x73\
+\x5f\x73\x73\x5f\x73\x70\0\x73\x61\x73\x5f\x73\x73\x5f\x73\x69\x7a\x65\0\x73\
+\x61\x73\x5f\x73\x73\x5f\x66\x6c\x61\x67\x73\0\x74\x61\x73\x6b\x5f\x77\x6f\x72\
+\x6b\x73\0\x61\x75\x64\x69\x74\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x6c\x6f\x67\
+\x69\x6e\x75\x69\x64\0\x73\x65\x73\x73\x69\x6f\x6e\x69\x64\0\x73\x65\x63\x63\
+\x6f\x6d\x70\0\x73\x79\x73\x63\x61\x6c\x6c\x5f\x64\x69\x73\x70\x61\x74\x63\x68\
+\0\x70\x61\x72\x65\x6e\x74\x5f\x65\x78\x65\x63\x5f\x69\x64\0\x73\x65\x6c\x66\
+\x5f\x65\x78\x65\x63\x5f\x69\x64\0\x61\x6c\x6c\x6f\x63\x5f\x6c\x6f\x63\x6b\0\
+\x70\x69\x5f\x6c\x6f\x63\x6b\0\x77\x61\x6b\x65\x5f\x71\0\x70\x69\x5f\x77\x61\
+\x69\x74\x65\x72\x73\0\x70\x69\x5f\x74\x6f\x70\x5f\x74\x61\x73\x6b\0\x70\x69\
+\x5f\x62\x6c\x6f\x63\x6b\x65\x64\x5f\x6f\x6e\0\x69\x6e\x5f\x75\x62\x73\x61\x6e\
+\0\x6a\x6f\x75\x72\x6e\x61\x6c\x5f\x69\x6e\x66\x6f\0\x62\x69\x6f\x5f\x6c\x69\
+\x73\x74\0\x70\x6c\x75\x67\0\x72\x65\x63\x6c\x61\x69\x6d\x5f\x73\x74\x61\x74\
+\x65\0\x69\x6f\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x63\x61\x70\x74\x75\x72\x65\
+\x5f\x63\x6f\x6e\x74\x72\x6f\x6c\0\x70\x74\x72\x61\x63\x65\x5f\x6d\x65\x73\x73\
+\x61\x67\x65\0\x6c\x61\x73\x74\x5f\x73\x69\x67\x69\x6e\x66\x6f\0\x69\x6f\x61\
+\x63\0\x70\x73\x69\x5f\x66\x6c\x61\x67\x73\0\x61\x63\x63\x74\x5f\x72\x73\x73\
+\x5f\x6d\x65\x6d\x31\0\x61\x63\x63\x74\x5f\x76\x6d\x5f\x6d\x65\x6d\x31\0\x61\
+\x63\x63\x74\x5f\x74\x69\x6d\x65\x78\x70\x64\0\x6d\x65\x6d\x73\x5f\x61\x6c\x6c\
+\x6f\x77\x65\x64\0\x6d\x65\x6d\x73\x5f\x61\x6c\x6c\x6f\x77\x65\x64\x5f\x73\x65\
+\x71\0\x63\x70\x75\x73\x65\x74\x5f\x6d\x65\x6d\x5f\x73\x70\x72\x65\x61\x64\x5f\
+\x72\x6f\x74\x6f\x72\0\x63\x67\x72\x6f\x75\x70\x73\0\x63\x67\x5f\x6c\x69\x73\
+\x74\0\x63\x6c\x6f\x73\x69\x64\0\x72\x6d\x69\x64\0\x72\x6f\x62\x75\x73\x74\x5f\
+\x6c\x69\x73\x74\0\x63\x6f\x6d\x70\x61\x74\x5f\x72\x6f\x62\x75\x73\x74\x5f\x6c\
+\x69\x73\x74\0\x70\x69\x5f\x73\x74\x61\x74\x65\x5f\x6c\x69\x73\x74\0\x70\x69\
+\x5f\x73\x74\x61\x74\x65\x5f\x63\x61\x63\x68\x65\0\x66\x75\x74\x65\x78\x5f\x65\
+\x78\x69\x74\x5f\x6d\x75\x74\x65\x78\0\x66\x75\x74\x65\x78\x5f\x73\x74\x61\x74\
+\x65\0\x70\x65\x72\x66\x5f\x72\x65\x63\x75\x72\x73\x69\x6f\x6e\0\x70\x65\x72\
+\x66\x5f\x65\x76\x65\x6e\x74\x5f\x63\x74\x78\x70\0\x70\x65\x72\x66\x5f\x65\x76\
+\x65\x6e\x74\x5f\x6d\x75\x74\x65\x78\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\
+\x5f\x6c\x69\x73\x74\0\x6d\x65\x6d\x70\x6f\x6c\x69\x63\x79\0\x69\x6c\x5f\x70\
+\x72\x65\x76\0\x69\x6c\x5f\x77\x65\x69\x67\x68\x74\0\x70\x72\x65\x66\x5f\x6e\
+\x6f\x64\x65\x5f\x66\x6f\x72\x6b\0\x6e\x75\x6d\x61\x5f\x73\x63\x61\x6e\x5f\x73\
+\x65\x71\0\x6e\x75\x6d\x61\x5f\x73\x63\x61\x6e\x5f\x70\x65\x72\x69\x6f\x64\0\
+\x6e\x75\x6d\x61\x5f\x73\x63\x61\x6e\x5f\x70\x65\x72\x69\x6f\x64\x5f\x6d\x61\
+\x78\0\x6e\x75\x6d\x61\x5f\x70\x72\x65\x66\x65\x72\x72\x65\x64\x5f\x6e\x69\x64\
+\0\x6e\x75\x6d\x61\x5f\x6d\x69\x67\x72\x61\x74\x65\x5f\x72\x65\x74\x72\x79\0\
+\x6e\x6f\x64\x65\x5f\x73\x74\x61\x6d\x70\0\x6c\x61\x73\x74\x5f\x74\x61\x73\x6b\
+\x5f\x6e\x75\x6d\x61\x5f\x70\x6c\x61\x63\x65\x6d\x65\x6e\x74\0\x6c\x61\x73\x74\
+\x5f\x73\x75\x6d\x5f\x65\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x6e\x75\
+\x6d\x61\x5f\x77\x6f\x72\x6b\0\x6e\x75\x6d\x61\x5f\x67\x72\x6f\x75\x70\0\x6e\
+\x75\x6d\x61\x5f\x66\x61\x75\x6c\x74\x73\0\x74\x6f\x74\x61\x6c\x5f\x6e\x75\x6d\
+\x61\x5f\x66\x61\x75\x6c\x74\x73\0\x6e\x75\x6d\x61\x5f\x66\x61\x75\x6c\x74\x73\
+\x5f\x6c\x6f\x63\x61\x6c\x69\x74\x79\0\x6e\x75\x6d\x61\x5f\x70\x61\x67\x65\x73\
+\x5f\x6d\x69\x67\x72\x61\x74\x65\x64\0\x72\x73\x65\x71\0\x72\x73\x65\x71\x5f\
+\x6c\x65\x6e\0\x72\x73\x65\x71\x5f\x73\x69\x67\0\x72\x73\x65\x71\x5f\x65\x76\
+\x65\x6e\x74\x5f\x6d\x61\x73\x6b\0\x6d\x6d\x5f\x63\x69\x64\0\x6c\x61\x73\x74\
+\x5f\x6d\x6d\x5f\x63\x69\x64\0\x6d\x69\x67\x72\x61\x74\x65\x5f\x66\x72\x6f\x6d\
+\x5f\x63\x70\x75\0\x6d\x6d\x5f\x63\x69\x64\x5f\x61\x63\x74\x69\x76\x65\0\x63\
+\x69\x64\x5f\x77\x6f\x72\x6b\0\x74\x6c\x62\x5f\x75\x62\x63\0\x73\x70\x6c\x69\
+\x63\x65\x5f\x70\x69\x70\x65\0\x74\x61\x73\x6b\x5f\x66\x72\x61\x67\0\x64\x65\
+\x6c\x61\x79\x73\0\x6e\x72\x5f\x64\x69\x72\x74\x69\x65\x64\0\x6e\x72\x5f\x64\
+\x69\x72\x74\x69\x65\x64\x5f\x70\x61\x75\x73\x65\0\x64\x69\x72\x74\x79\x5f\x70\
+\x61\x75\x73\x65\x64\x5f\x77\x68\x65\x6e\0\x6c\x61\x74\x65\x6e\x63\x79\x5f\x72\
+\x65\x63\x6f\x72\x64\x5f\x63\x6f\x75\x6e\x74\0\x6c\x61\x74\x65\x6e\x63\x79\x5f\
+\x72\x65\x63\x6f\x72\x64\0\x74\x69\x6d\x65\x72\x5f\x73\x6c\x61\x63\x6b\x5f\x6e\
+\x73\0\x64\x65\x66\x61\x75\x6c\x74\x5f\x74\x69\x6d\x65\x72\x5f\x73\x6c\x61\x63\
+\x6b\x5f\x6e\x73\0\x63\x75\x72\x72\x5f\x72\x65\x74\x5f\x73\x74\x61\x63\x6b\0\
+\x63\x75\x72\x72\x5f\x72\x65\x74\x5f\x64\x65\x70\x74\x68\0\x72\x65\x74\x5f\x73\
+\x74\x61\x63\x6b\0\x66\x74\x72\x61\x63\x65\x5f\x74\x69\x6d\x65\x73\x74\x61\x6d\
+\x70\0\x74\x72\x61\x63\x65\x5f\x6f\x76\x65\x72\x72\x75\x6e\0\x74\x72\x61\x63\
+\x69\x6e\x67\x5f\x67\x72\x61\x70\x68\x5f\x70\x61\x75\x73\x65\0\x74\x72\x61\x63\
+\x65\x5f\x72\x65\x63\x75\x72\x73\x69\x6f\x6e\0\x6d\x65\x6d\x63\x67\x5f\x6e\x72\
+\x5f\x70\x61\x67\x65\x73\x5f\x6f\x76\x65\x72\x5f\x68\x69\x67\x68\0\x61\x63\x74\
+\x69\x76\x65\x5f\x6d\x65\x6d\x63\x67\0\x6f\x62\x6a\x63\x67\0\x74\x68\x72\x6f\
+\x74\x74\x6c\x65\x5f\x64\x69\x73\x6b\0\x75\x74\x61\x73\x6b\0\x73\x65\x71\x75\
+\x65\x6e\x74\x69\x61\x6c\x5f\x69\x6f\0\x73\x65\x71\x75\x65\x6e\x74\x69\x61\x6c\
+\x5f\x69\x6f\x5f\x61\x76\x67\0\x6b\x6d\x61\x70\x5f\x63\x74\x72\x6c\0\x72\x63\
+\x75\0\x72\x63\x75\x5f\x75\x73\x65\x72\x73\0\x70\x61\x67\x65\x66\x61\x75\x6c\
+\x74\x5f\x64\x69\x73\x61\x62\x6c\x65\x64\0\x6f\x6f\x6d\x5f\x72\x65\x61\x70\x65\
+\x72\x5f\x6c\x69\x73\x74\0\x6f\x6f\x6d\x5f\x72\x65\x61\x70\x65\x72\x5f\x74\x69\
+\x6d\x65\x72\0\x73\x74\x61\x63\x6b\x5f\x76\x6d\x5f\x61\x72\x65\x61\0\x73\x74\
+\x61\x63\x6b\x5f\x72\x65\x66\x63\x6f\x75\x6e\x74\0\x70\x61\x74\x63\x68\x5f\x73\
+\x74\x61\x74\x65\0\x73\x65\x63\x75\x72\x69\x74\x79\0\x62\x70\x66\x5f\x73\x74\
+\x6f\x72\x61\x67\x65\0\x62\x70\x66\x5f\x63\x74\x78\0\x62\x70\x66\x5f\x6e\x65\
+\x74\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x6d\x63\x65\x5f\x76\x61\x64\x64\x72\0\
+\x6d\x63\x65\x5f\x6b\x66\x6c\x61\x67\x73\0\x6d\x63\x65\x5f\x61\x64\x64\x72\0\
+\x6d\x63\x65\x5f\x72\x69\x70\x76\0\x6d\x63\x65\x5f\x77\x68\x6f\x6c\x65\x5f\x70\
+\x61\x67\x65\0\x5f\x5f\x6d\x63\x65\x5f\x72\x65\x73\x65\x72\x76\x65\x64\0\x6d\
+\x63\x65\x5f\x6b\x69\x6c\x6c\x5f\x6d\x65\0\x6d\x63\x65\x5f\x63\x6f\x75\x6e\x74\
+\0\x6b\x72\x65\x74\x70\x72\x6f\x62\x65\x5f\x69\x6e\x73\x74\x61\x6e\x63\x65\x73\
+\0\x72\x65\x74\x68\x6f\x6f\x6b\x73\0\x6c\x31\x64\x5f\x66\x6c\x75\x73\x68\x5f\
+\x6b\x69\x6c\x6c\0\x72\x76\0\x75\x73\x65\x72\x5f\x65\x76\x65\x6e\x74\x5f\x6d\
+\x6d\0\x74\x68\x72\x65\x61\x64\0\x73\x79\x73\x63\x61\x6c\x6c\x5f\x77\x6f\x72\
+\x6b\0\x73\x74\x61\x74\x75\x73\0\x63\x70\x75\0\x5f\x5f\x63\x61\x6c\x6c\x5f\x73\
+\x69\x6e\x67\x6c\x65\x5f\x6e\x6f\x64\x65\0\x6c\x6c\x69\x73\x74\0\x73\x72\x63\0\
+\x64\x73\x74\0\x6c\x6c\x69\x73\x74\x5f\x6e\x6f\x64\x65\0\x6e\x65\x78\x74\0\x75\
+\x5f\x66\x6c\x61\x67\x73\0\x61\x5f\x66\x6c\x61\x67\x73\0\x75\x31\x36\0\x5f\x5f\
+\x75\x31\x36\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x73\x68\x6f\x72\x74\0\x73\
+\x63\x68\x65\x64\x5f\x65\x6e\x74\x69\x74\x79\0\x6c\x6f\x61\x64\0\x72\x75\x6e\
+\x5f\x6e\x6f\x64\x65\0\x64\x65\x61\x64\x6c\x69\x6e\x65\0\x6d\x69\x6e\x5f\x76\
+\x72\x75\x6e\x74\x69\x6d\x65\0\x6d\x69\x6e\x5f\x73\x6c\x69\x63\x65\0\x67\x72\
+\x6f\x75\x70\x5f\x6e\x6f\x64\x65\0\x73\x63\x68\x65\x64\x5f\x64\x65\x6c\x61\x79\
+\x65\x64\0\x72\x65\x6c\x5f\x64\x65\x61\x64\x6c\x69\x6e\x65\0\x63\x75\x73\x74\
+\x6f\x6d\x5f\x73\x6c\x69\x63\x65\0\x65\x78\x65\x63\x5f\x73\x74\x61\x72\x74\0\
+\x73\x75\x6d\x5f\x65\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x70\x72\x65\
+\x76\x5f\x73\x75\x6d\x5f\x65\x78\x65\x63\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x76\
+\x72\x75\x6e\x74\x69\x6d\x65\0\x76\x6c\x61\x67\0\x73\x6c\x69\x63\x65\0\x6e\x72\
+\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\0\x64\x65\x70\x74\x68\0\x63\x66\
+\x73\x5f\x72\x71\0\x6d\x79\x5f\x71\0\x72\x75\x6e\x6e\x61\x62\x6c\x65\x5f\x77\
+\x65\x69\x67\x68\x74\0\x61\x76\x67\0\x6c\x6f\x61\x64\x5f\x77\x65\x69\x67\x68\
+\x74\0\x77\x65\x69\x67\x68\x74\0\x69\x6e\x76\x5f\x77\x65\x69\x67\x68\x74\0\x72\
+\x62\x5f\x6e\x6f\x64\x65\0\x5f\x5f\x72\x62\x5f\x70\x61\x72\x65\x6e\x74\x5f\x63\
+\x6f\x6c\x6f\x72\0\x72\x62\x5f\x72\x69\x67\x68\x74\0\x72\x62\x5f\x6c\x65\x66\
+\x74\0\x75\x36\x34\0\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\x70\x72\x65\x76\0\
+\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x63\x68\x61\x72\0\x73\x36\x34\0\x5f\x5f\
+\x73\x36\x34\0\x6c\x6f\x6e\x67\x20\x6c\x6f\x6e\x67\0\x73\x63\x68\x65\x64\x5f\
+\x61\x76\x67\0\x6c\x61\x73\x74\x5f\x75\x70\x64\x61\x74\x65\x5f\x74\x69\x6d\x65\
+\0\x6c\x6f\x61\x64\x5f\x73\x75\x6d\0\x72\x75\x6e\x6e\x61\x62\x6c\x65\x5f\x73\
+\x75\x6d\0\x75\x74\x69\x6c\x5f\x73\x75\x6d\0\x70\x65\x72\x69\x6f\x64\x5f\x63\
+\x6f\x6e\x74\x72\x69\x62\0\x6c\x6f\x61\x64\x5f\x61\x76\x67\0\x72\x75\x6e\x6e\
+\x61\x62\x6c\x65\x5f\x61\x76\x67\0\x75\x74\x69\x6c\x5f\x61\x76\x67\0\x75\x74\
+\x69\x6c\x5f\x65\x73\x74\0\x73\x63\x68\x65\x64\x5f\x72\x74\x5f\x65\x6e\x74\x69\
+\x74\x79\0\x72\x75\x6e\x5f\x6c\x69\x73\x74\0\x74\x69\x6d\x65\x6f\x75\x74\0\x77\
+\x61\x74\x63\x68\x64\x6f\x67\x5f\x73\x74\x61\x6d\x70\0\x74\x69\x6d\x65\x5f\x73\
+\x6c\x69\x63\x65\0\x6f\x6e\x5f\x6c\x69\x73\x74\0\x62\x61\x63\x6b\0\x73\x63\x68\
+\x65\x64\x5f\x64\x6c\x5f\x65\x6e\x74\x69\x74\x79\0\x64\x6c\x5f\x72\x75\x6e\x74\
+\x69\x6d\x65\0\x64\x6c\x5f\x64\x65\x61\x64\x6c\x69\x6e\x65\0\x64\x6c\x5f\x70\
+\x65\x72\x69\x6f\x64\0\x64\x6c\x5f\x62\x77\0\x64\x6c\x5f\x64\x65\x6e\x73\x69\
+\x74\x79\0\x72\x75\x6e\x74\x69\x6d\x65\0\x64\x6c\x5f\x74\x68\x72\x6f\x74\x74\
+\x6c\x65\x64\0\x64\x6c\x5f\x79\x69\x65\x6c\x64\x65\x64\0\x64\x6c\x5f\x6e\x6f\
+\x6e\x5f\x63\x6f\x6e\x74\x65\x6e\x64\x69\x6e\x67\0\x64\x6c\x5f\x6f\x76\x65\x72\
+\x72\x75\x6e\0\x64\x6c\x5f\x64\x65\x66\x65\x72\0\x64\x6c\x5f\x64\x65\x66\x65\
+\x72\x5f\x61\x72\x6d\x65\x64\0\x64\x6c\x5f\x64\x65\x66\x65\x72\x5f\x72\x75\x6e\
+\x6e\x69\x6e\x67\0\x64\x6c\x5f\x74\x69\x6d\x65\x72\0\x69\x6e\x61\x63\x74\x69\
+\x76\x65\x5f\x74\x69\x6d\x65\x72\0\x72\x71\0\x73\x65\x72\x76\x65\x72\x5f\x68\
+\x61\x73\x5f\x74\x61\x73\x6b\x73\0\x73\x65\x72\x76\x65\x72\x5f\x70\x69\x63\x6b\
+\x5f\x74\x61\x73\x6b\0\x70\x69\x5f\x73\x65\0\x68\x72\x74\x69\x6d\x65\x72\0\x6e\
+\x6f\x64\x65\0\x5f\x73\x6f\x66\x74\x65\x78\x70\x69\x72\x65\x73\0\x66\x75\x6e\
+\x63\x74\x69\x6f\x6e\0\x62\x61\x73\x65\0\x73\x74\x61\x74\x65\0\x69\x73\x5f\x72\
+\x65\x6c\0\x69\x73\x5f\x73\x6f\x66\x74\0\x69\x73\x5f\x68\x61\x72\x64\0\x74\x69\
+\x6d\x65\x72\x71\x75\x65\x75\x65\x5f\x6e\x6f\x64\x65\0\x65\x78\x70\x69\x72\x65\
+\x73\0\x6b\x74\x69\x6d\x65\x5f\x74\0\x68\x72\x74\x69\x6d\x65\x72\x5f\x72\x65\
+\x73\x74\x61\x72\x74\0\x48\x52\x54\x49\x4d\x45\x52\x5f\x4e\x4f\x52\x45\x53\x54\
+\x41\x52\x54\0\x48\x52\x54\x49\x4d\x45\x52\x5f\x52\x45\x53\x54\x41\x52\x54\0\
+\x75\x38\0\x5f\x5f\x75\x38\0\x64\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\x68\x61\
+\x73\x5f\x74\x61\x73\x6b\x73\x5f\x66\0\x64\x6c\x5f\x73\x65\x72\x76\x65\x72\x5f\
+\x70\x69\x63\x6b\x5f\x66\0\x73\x63\x68\x65\x64\x5f\x65\x78\x74\x5f\x65\x6e\x74\
+\x69\x74\x79\0\x64\x73\x71\0\x64\x73\x71\x5f\x6c\x69\x73\x74\0\x64\x73\x71\x5f\
+\x70\x72\x69\x71\0\x64\x73\x71\x5f\x73\x65\x71\0\x64\x73\x71\x5f\x66\x6c\x61\
+\x67\x73\0\x73\x74\x69\x63\x6b\x79\x5f\x63\x70\x75\0\x68\x6f\x6c\x64\x69\x6e\
+\x67\x5f\x63\x70\x75\0\x6b\x66\x5f\x6d\x61\x73\x6b\0\x6b\x66\x5f\x74\x61\x73\
+\x6b\x73\0\x6f\x70\x73\x5f\x73\x74\x61\x74\x65\0\x72\x75\x6e\x6e\x61\x62\x6c\
+\x65\x5f\x6e\x6f\x64\x65\0\x72\x75\x6e\x6e\x61\x62\x6c\x65\x5f\x61\x74\0\x63\
+\x6f\x72\x65\x5f\x73\x63\x68\x65\x64\x5f\x61\x74\0\x64\x64\x73\x70\x5f\x64\x73\
+\x71\x5f\x69\x64\0\x64\x64\x73\x70\x5f\x65\x6e\x71\x5f\x66\x6c\x61\x67\x73\0\
+\x64\x73\x71\x5f\x76\x74\x69\x6d\x65\0\x64\x69\x73\x61\x6c\x6c\x6f\x77\0\x63\
+\x67\x72\x70\x5f\x6d\x6f\x76\x69\x6e\x67\x5f\x66\x72\x6f\x6d\0\x74\x61\x73\x6b\
+\x73\x5f\x6e\x6f\x64\x65\0\x73\x63\x78\x5f\x64\x73\x71\x5f\x6c\x69\x73\x74\x5f\
+\x6e\x6f\x64\x65\0\x70\x72\x69\x76\0\x61\x74\x6f\x6d\x69\x63\x5f\x6c\x6f\x6e\
+\x67\x5f\x74\0\x61\x74\x6f\x6d\x69\x63\x36\x34\x5f\x74\0\x75\x63\x6c\x61\x6d\
+\x70\x5f\x73\x65\0\x62\x75\x63\x6b\x65\x74\x5f\x69\x64\0\x61\x63\x74\x69\x76\
+\x65\0\x75\x73\x65\x72\x5f\x64\x65\x66\x69\x6e\x65\x64\0\x73\x63\x68\x65\x64\
+\x5f\x73\x74\x61\x74\x69\x73\x74\x69\x63\x73\0\x77\x61\x69\x74\x5f\x73\x74\x61\
+\x72\x74\0\x77\x61\x69\x74\x5f\x6d\x61\x78\0\x77\x61\x69\x74\x5f\x63\x6f\x75\
+\x6e\x74\0\x77\x61\x69\x74\x5f\x73\x75\x6d\0\x69\x6f\x77\x61\x69\x74\x5f\x63\
+\x6f\x75\x6e\x74\0\x69\x6f\x77\x61\x69\x74\x5f\x73\x75\x6d\0\x73\x6c\x65\x65\
+\x70\x5f\x73\x74\x61\x72\x74\0\x73\x6c\x65\x65\x70\x5f\x6d\x61\x78\0\x73\x75\
+\x6d\x5f\x73\x6c\x65\x65\x70\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x62\x6c\x6f\x63\
+\x6b\x5f\x73\x74\x61\x72\x74\0\x62\x6c\x6f\x63\x6b\x5f\x6d\x61\x78\0\x73\x75\
+\x6d\x5f\x62\x6c\x6f\x63\x6b\x5f\x72\x75\x6e\x74\x69\x6d\x65\0\x65\x78\x65\x63\
+\x5f\x6d\x61\x78\0\x73\x6c\x69\x63\x65\x5f\x6d\x61\x78\0\x6e\x72\x5f\x6d\x69\
+\x67\x72\x61\x74\x69\x6f\x6e\x73\x5f\x63\x6f\x6c\x64\0\x6e\x72\x5f\x66\x61\x69\
+\x6c\x65\x64\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\x5f\x61\x66\x66\x69\
+\x6e\x65\0\x6e\x72\x5f\x66\x61\x69\x6c\x65\x64\x5f\x6d\x69\x67\x72\x61\x74\x69\
+\x6f\x6e\x73\x5f\x72\x75\x6e\x6e\x69\x6e\x67\0\x6e\x72\x5f\x66\x61\x69\x6c\x65\
+\x64\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\x5f\x68\x6f\x74\0\x6e\x72\x5f\
+\x66\x6f\x72\x63\x65\x64\x5f\x6d\x69\x67\x72\x61\x74\x69\x6f\x6e\x73\0\x6e\x72\
+\x5f\x77\x61\x6b\x65\x75\x70\x73\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\
+\x73\x79\x6e\x63\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x6d\x69\x67\x72\
+\x61\x74\x65\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x6c\x6f\x63\x61\x6c\
+\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x72\x65\x6d\x6f\x74\x65\0\x6e\
+\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x61\x66\x66\x69\x6e\x65\0\x6e\x72\x5f\
+\x77\x61\x6b\x65\x75\x70\x73\x5f\x61\x66\x66\x69\x6e\x65\x5f\x61\x74\x74\x65\
+\x6d\x70\x74\x73\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x70\x61\x73\x73\
+\x69\x76\x65\0\x6e\x72\x5f\x77\x61\x6b\x65\x75\x70\x73\x5f\x69\x64\x6c\x65\0\
+\x63\x6f\x72\x65\x5f\x66\x6f\x72\x63\x65\x69\x64\x6c\x65\x5f\x73\x75\x6d\0\x68\
+\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\x66\x69\x72\x73\x74\0\x72\x63\x75\x5f\
+\x73\x70\x65\x63\x69\x61\x6c\0\x62\0\x73\0\x6e\x65\x65\x64\x5f\x71\x73\0\x65\
+\x78\x70\x5f\x68\x69\x6e\x74\0\x6e\x65\x65\x64\x5f\x6d\x62\0\x70\x63\x6f\x75\
+\x6e\x74\0\x72\x75\x6e\x5f\x64\x65\x6c\x61\x79\0\x6c\x61\x73\x74\x5f\x61\x72\
+\x72\x69\x76\x61\x6c\0\x6c\x61\x73\x74\x5f\x71\x75\x65\x75\x65\x64\0\x70\x6c\
+\x69\x73\x74\x5f\x6e\x6f\x64\x65\0\x70\x72\x69\x6f\x5f\x6c\x69\x73\x74\0\x6e\
+\x6f\x64\x65\x5f\x6c\x69\x73\x74\0\x61\x72\x63\x68\x5f\x64\x61\x74\x61\0\x66\
+\x6e\0\x6c\x6f\x6e\x67\0\x66\x75\x74\x65\x78\0\x6e\x61\x6e\x6f\x73\x6c\x65\x65\
+\x70\0\x70\x6f\x6c\x6c\0\x75\x61\x64\x64\x72\0\x76\x61\x6c\0\x62\x69\x74\x73\
+\x65\x74\0\x74\x69\x6d\x65\0\x75\x61\x64\x64\x72\x32\0\x63\x6c\x6f\x63\x6b\x69\
+\x64\0\x63\x6c\x6f\x63\x6b\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\
+\x5f\x63\x6c\x6f\x63\x6b\x69\x64\x5f\x74\0\x74\x69\x6d\x65\x73\x70\x65\x63\x5f\
+\x74\x79\x70\x65\0\x54\x54\x5f\x4e\x4f\x4e\x45\0\x54\x54\x5f\x4e\x41\x54\x49\
+\x56\x45\0\x54\x54\x5f\x43\x4f\x4d\x50\x41\x54\0\x72\x6d\x74\x70\0\x63\x6f\x6d\
+\x70\x61\x74\x5f\x72\x6d\x74\x70\0\x75\x66\x64\x73\0\x6e\x66\x64\x73\0\x68\x61\
+\x73\x5f\x74\x69\x6d\x65\x6f\x75\x74\0\x74\x76\x5f\x73\x65\x63\0\x74\x76\x5f\
+\x6e\x73\x65\x63\0\x70\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\
+\x70\x69\x64\x5f\x74\0\x68\x6c\x69\x73\x74\x5f\x6e\x6f\x64\x65\0\x70\x70\x72\
+\x65\x76\0\x6c\x6f\x63\x6b\0\x72\x61\x77\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\
+\x5f\x74\0\x72\x61\x77\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x72\x61\x77\x5f\
+\x6c\x6f\x63\x6b\0\x61\x72\x63\x68\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\
+\0\x71\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x6c\x6f\x63\x6b\x65\x64\0\x6c\x6f\x63\
+\x6b\x65\x64\x5f\x70\x65\x6e\x64\x69\x6e\x67\0\x74\x61\x69\x6c\0\x73\x65\x71\
+\x63\x6f\x75\x6e\x74\0\x73\x74\x61\x72\x74\x74\x69\x6d\x65\0\x73\x65\x71\x63\
+\x6f\x75\x6e\x74\x5f\x74\0\x73\x65\x71\x75\x65\x6e\x63\x65\0\x76\x74\x69\x6d\
+\x65\x5f\x73\x74\x61\x74\x65\0\x56\x54\x49\x4d\x45\x5f\x49\x4e\x41\x43\x54\x49\
+\x56\x45\0\x56\x54\x49\x4d\x45\x5f\x49\x44\x4c\x45\0\x56\x54\x49\x4d\x45\x5f\
+\x53\x59\x53\0\x56\x54\x49\x4d\x45\x5f\x55\x53\x45\x52\0\x56\x54\x49\x4d\x45\
+\x5f\x47\x55\x45\x53\x54\0\x62\x61\x73\x65\x73\0\x74\x69\x6d\x65\x72\x73\x5f\
+\x61\x63\x74\x69\x76\x65\0\x65\x78\x70\x69\x72\x79\x5f\x61\x63\x74\x69\x76\x65\
+\0\x70\x6f\x73\x69\x78\x5f\x63\x70\x75\x74\x69\x6d\x65\x72\x5f\x62\x61\x73\x65\
+\0\x6e\x65\x78\x74\x65\x76\x74\0\x74\x71\x68\x65\x61\x64\0\x74\x69\x6d\x65\x72\
+\x71\x75\x65\x75\x65\x5f\x68\x65\x61\x64\0\x72\x62\x5f\x72\x6f\x6f\x74\0\x72\
+\x62\x5f\x72\x6f\x6f\x74\x5f\x63\x61\x63\x68\x65\x64\0\x72\x62\x5f\x6c\x65\x66\
+\x74\x6d\x6f\x73\x74\0\x77\x6f\x72\x6b\0\x6d\x75\x74\x65\x78\0\x73\x63\x68\x65\
+\x64\x75\x6c\x65\x64\0\x63\x61\x6c\x6c\x62\x61\x63\x6b\x5f\x68\x65\x61\x64\0\
+\x66\x75\x6e\x63\0\x6f\x77\x6e\x65\x72\0\x77\x61\x69\x74\x5f\x6c\x6f\x63\x6b\0\
+\x6f\x73\x71\0\x77\x61\x69\x74\x5f\x6c\x69\x73\x74\0\x6f\x70\x74\x69\x6d\x69\
+\x73\x74\x69\x63\x5f\x73\x70\x69\x6e\x5f\x71\x75\x65\x75\x65\0\x75\x69\x64\0\
+\x67\x69\x64\0\x73\x75\x69\x64\0\x73\x67\x69\x64\0\x65\x75\x69\x64\0\x65\x67\
+\x69\x64\0\x66\x73\x75\x69\x64\0\x66\x73\x67\x69\x64\0\x73\x65\x63\x75\x72\x65\
+\x62\x69\x74\x73\0\x63\x61\x70\x5f\x69\x6e\x68\x65\x72\x69\x74\x61\x62\x6c\x65\
+\0\x63\x61\x70\x5f\x70\x65\x72\x6d\x69\x74\x74\x65\x64\0\x63\x61\x70\x5f\x65\
+\x66\x66\x65\x63\x74\x69\x76\x65\0\x63\x61\x70\x5f\x62\x73\x65\x74\0\x63\x61\
+\x70\x5f\x61\x6d\x62\x69\x65\x6e\x74\0\x6a\x69\x74\x5f\x6b\x65\x79\x72\x69\x6e\
+\x67\0\x73\x65\x73\x73\x69\x6f\x6e\x5f\x6b\x65\x79\x72\x69\x6e\x67\0\x70\x72\
+\x6f\x63\x65\x73\x73\x5f\x6b\x65\x79\x72\x69\x6e\x67\0\x74\x68\x72\x65\x61\x64\
+\x5f\x6b\x65\x79\x72\x69\x6e\x67\0\x72\x65\x71\x75\x65\x73\x74\x5f\x6b\x65\x79\
+\x5f\x61\x75\x74\x68\0\x75\x73\x65\x72\0\x75\x73\x65\x72\x5f\x6e\x73\0\x75\x63\
+\x6f\x75\x6e\x74\x73\0\x67\x72\x6f\x75\x70\x5f\x69\x6e\x66\x6f\0\x6b\x75\x69\
+\x64\x5f\x74\0\x75\x69\x64\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x75\
+\x69\x64\x33\x32\x5f\x74\0\x6b\x67\x69\x64\x5f\x74\0\x67\x69\x64\x5f\x74\0\x5f\
+\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x67\x69\x64\x33\x32\x5f\x74\0\x6b\x65\x72\x6e\
+\x65\x6c\x5f\x63\x61\x70\x5f\x74\0\x6e\x6f\x6e\x5f\x72\x63\x75\0\x73\x79\x73\
+\x76\x5f\x73\x65\x6d\0\x75\x6e\x64\x6f\x5f\x6c\x69\x73\x74\0\x73\x79\x73\x76\
+\x5f\x73\x68\x6d\0\x73\x68\x6d\x5f\x63\x6c\x69\x73\x74\0\x73\x69\x67\x73\x65\
+\x74\x5f\x74\0\x73\x69\x67\0\x73\x69\x67\x70\x65\x6e\x64\x69\x6e\x67\0\x6c\x69\
+\x73\x74\0\x73\x69\x7a\x65\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x73\
+\x69\x7a\x65\x5f\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x75\x6c\x6f\x6e\x67\
+\x5f\x74\0\x6d\x6f\x64\x65\0\x66\x69\x6c\x74\x65\x72\x5f\x63\x6f\x75\x6e\x74\0\
+\x66\x69\x6c\x74\x65\x72\0\x73\x79\x73\x63\x61\x6c\x6c\x5f\x75\x73\x65\x72\x5f\
+\x64\x69\x73\x70\x61\x74\x63\x68\0\x73\x65\x6c\x65\x63\x74\x6f\x72\0\x6f\x66\
+\x66\x73\x65\x74\0\x6c\x65\x6e\0\x6f\x6e\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\
+\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\0\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\
+\x72\x6c\x6f\x63\x6b\0\x77\x61\x6b\x65\x5f\x71\x5f\x6e\x6f\x64\x65\0\x6b\x65\
+\x72\x6e\x65\x6c\x5f\x73\x69\x67\x69\x6e\x66\x6f\x5f\x74\0\x74\x61\x73\x6b\x5f\
+\x69\x6f\x5f\x61\x63\x63\x6f\x75\x6e\x74\x69\x6e\x67\0\x72\x63\x68\x61\x72\0\
+\x77\x63\x68\x61\x72\0\x73\x79\x73\x63\x72\0\x73\x79\x73\x63\x77\0\x72\x65\x61\
+\x64\x5f\x62\x79\x74\x65\x73\0\x77\x72\x69\x74\x65\x5f\x62\x79\x74\x65\x73\0\
+\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\x5f\x77\x72\x69\x74\x65\x5f\x62\x79\x74\
+\x65\x73\0\x6e\x6f\x64\x65\x6d\x61\x73\x6b\x5f\x74\0\x73\x65\x71\x63\x6f\x75\
+\x6e\x74\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\x5f\x74\0\x73\x65\x71\x63\x6f\x75\
+\x6e\x74\x5f\x73\x70\x69\x6e\x6c\x6f\x63\x6b\0\x73\x68\x6f\x72\x74\0\x74\x6c\
+\x62\x66\x6c\x75\x73\x68\x5f\x75\x6e\x6d\x61\x70\x5f\x62\x61\x74\x63\x68\0\x61\
+\x72\x63\x68\0\x66\x6c\x75\x73\x68\x5f\x72\x65\x71\x75\x69\x72\x65\x64\0\x77\
+\x72\x69\x74\x61\x62\x6c\x65\0\x61\x72\x63\x68\x5f\x74\x6c\x62\x66\x6c\x75\x73\
+\x68\x5f\x75\x6e\x6d\x61\x70\x5f\x62\x61\x74\x63\x68\0\x70\x61\x67\x65\x5f\x66\
+\x72\x61\x67\0\x70\x61\x67\x65\0\x73\x69\x7a\x65\0\x62\x61\x63\x6b\x74\x72\x61\
+\x63\x65\0\x63\x6f\x75\x6e\x74\0\x6d\x61\x78\0\x74\x69\x6d\x65\x72\x5f\x6c\x69\
+\x73\x74\0\x65\x6e\x74\x72\x79\0\x6c\x6c\x69\x73\x74\x5f\x68\x65\x61\x64\0\x72\
+\x76\x5f\x74\x61\x73\x6b\x5f\x6d\x6f\x6e\x69\x74\x6f\x72\0\x64\x61\x5f\x6d\x6f\
+\x6e\0\x64\x61\x5f\x6d\x6f\x6e\x69\x74\x6f\x72\0\x6d\x6f\x6e\x69\x74\x6f\x72\
+\x69\x6e\x67\0\x63\x75\x72\x72\x5f\x73\x74\x61\x74\x65\0\x74\x68\x72\x65\x61\
+\x64\x5f\x73\x74\x72\x75\x63\x74\0\x74\x6c\x73\x5f\x61\x72\x72\x61\x79\0\x73\
+\x70\0\x65\x73\0\x64\x73\0\x66\x73\x69\x6e\x64\x65\x78\0\x67\x73\x69\x6e\x64\
+\x65\x78\0\x66\x73\x62\x61\x73\x65\0\x67\x73\x62\x61\x73\x65\0\x70\x74\x72\x61\
+\x63\x65\x5f\x62\x70\x73\0\x76\x69\x72\x74\x75\x61\x6c\x5f\x64\x72\x36\0\x70\
+\x74\x72\x61\x63\x65\x5f\x64\x72\x37\0\x63\x72\x32\0\x74\x72\x61\x70\x5f\x6e\
+\x72\0\x65\x72\x72\x6f\x72\x5f\x63\x6f\x64\x65\0\x69\x6f\x5f\x62\x69\x74\x6d\
+\x61\x70\0\x69\x6f\x70\x6c\x5f\x65\x6d\x75\x6c\0\x69\x6f\x70\x6c\x5f\x77\x61\
+\x72\x6e\0\x70\x6b\x72\x75\0\x66\x65\x61\x74\x75\x72\x65\x73\0\x66\x65\x61\x74\
+\x75\x72\x65\x73\x5f\x6c\x6f\x63\x6b\x65\x64\0\x73\x68\x73\x74\x6b\0\x66\x70\
+\x75\0\x64\x65\x73\x63\x5f\x73\x74\x72\x75\x63\x74\0\x6c\x69\x6d\x69\x74\x30\0\
+\x62\x61\x73\x65\x30\0\x62\x61\x73\x65\x31\0\x64\x70\x6c\0\x70\0\x6c\x69\x6d\
+\x69\x74\x31\0\x61\x76\x6c\0\x6c\0\x64\0\x67\0\x62\x61\x73\x65\x32\0\x70\x65\
+\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x65\x76\x65\x6e\x74\x5f\x65\x6e\x74\x72\x79\
+\0\x73\x69\x62\x6c\x69\x6e\x67\x5f\x6c\x69\x73\x74\0\x61\x63\x74\x69\x76\x65\
+\x5f\x6c\x69\x73\x74\0\x67\x72\x6f\x75\x70\x5f\x69\x6e\x64\x65\x78\0\x6d\x69\
+\x67\x72\x61\x74\x65\x5f\x65\x6e\x74\x72\x79\0\x68\x6c\x69\x73\x74\x5f\x65\x6e\
+\x74\x72\x79\0\x61\x63\x74\x69\x76\x65\x5f\x65\x6e\x74\x72\x79\0\x6e\x72\x5f\
+\x73\x69\x62\x6c\x69\x6e\x67\x73\0\x65\x76\x65\x6e\x74\x5f\x63\x61\x70\x73\0\
+\x67\x72\x6f\x75\x70\x5f\x63\x61\x70\x73\0\x67\x72\x6f\x75\x70\x5f\x67\x65\x6e\
+\x65\x72\x61\x74\x69\x6f\x6e\0\x70\x6d\x75\0\x70\x6d\x75\x5f\x70\x72\x69\x76\
+\x61\x74\x65\0\x61\x74\x74\x61\x63\x68\x5f\x73\x74\x61\x74\x65\0\x63\x68\x69\
+\x6c\x64\x5f\x63\x6f\x75\x6e\x74\0\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\
+\x65\x6e\x61\x62\x6c\x65\x64\0\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x72\
+\x75\x6e\x6e\x69\x6e\x67\0\x74\x73\x74\x61\x6d\x70\0\x61\x74\x74\x72\0\x68\x65\
+\x61\x64\x65\x72\x5f\x73\x69\x7a\x65\0\x69\x64\x5f\x68\x65\x61\x64\x65\x72\x5f\
+\x73\x69\x7a\x65\0\x72\x65\x61\x64\x5f\x73\x69\x7a\x65\0\x68\x77\0\x70\x6d\x75\
+\x5f\x63\x74\x78\0\x72\x65\x66\x63\x6f\x75\x6e\x74\0\x63\x68\x69\x6c\x64\x5f\
+\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x65\x6e\x61\x62\x6c\x65\x64\0\x63\
+\x68\x69\x6c\x64\x5f\x74\x6f\x74\x61\x6c\x5f\x74\x69\x6d\x65\x5f\x72\x75\x6e\
+\x6e\x69\x6e\x67\0\x63\x68\x69\x6c\x64\x5f\x6d\x75\x74\x65\x78\0\x63\x68\x69\
+\x6c\x64\x5f\x6c\x69\x73\x74\0\x6f\x6e\x63\x70\x75\0\x6f\x77\x6e\x65\x72\x5f\
+\x65\x6e\x74\x72\x79\0\x6d\x6d\x61\x70\x5f\x6d\x75\x74\x65\x78\0\x6d\x6d\x61\
+\x70\x5f\x63\x6f\x75\x6e\x74\0\x72\x62\0\x72\x62\x5f\x65\x6e\x74\x72\x79\0\x72\
+\x63\x75\x5f\x62\x61\x74\x63\x68\x65\x73\0\x72\x63\x75\x5f\x70\x65\x6e\x64\x69\
+\x6e\x67\0\x77\x61\x69\x74\x71\0\x66\x61\x73\x79\x6e\x63\0\x70\x65\x6e\x64\x69\
+\x6e\x67\x5f\x77\x61\x6b\x65\x75\x70\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x6b\x69\
+\x6c\x6c\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x64\x69\x73\x61\x62\x6c\x65\0\x70\
+\x65\x6e\x64\x69\x6e\x67\x5f\x61\x64\x64\x72\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\
+\x69\x72\x71\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x64\x69\x73\x61\x62\x6c\x65\x5f\
+\x69\x72\x71\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x74\x61\x73\x6b\0\x70\x65\x6e\
+\x64\x69\x6e\x67\x5f\x77\x6f\x72\x6b\0\x70\x65\x6e\x64\x69\x6e\x67\x5f\x77\x6f\
+\x72\x6b\x5f\x77\x61\x69\x74\0\x65\x76\x65\x6e\x74\x5f\x6c\x69\x6d\x69\x74\0\
+\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x73\0\x61\x64\x64\x72\x5f\x66\x69\
+\x6c\x74\x65\x72\x5f\x72\x61\x6e\x67\x65\x73\0\x61\x64\x64\x72\x5f\x66\x69\x6c\
+\x74\x65\x72\x73\x5f\x67\x65\x6e\0\x61\x75\x78\x5f\x65\x76\x65\x6e\x74\0\x64\
+\x65\x73\x74\x72\x6f\x79\0\x6e\x73\0\x69\x64\0\x6c\x6f\x73\x74\x5f\x73\x61\x6d\
+\x70\x6c\x65\x73\0\x63\x6c\x6f\x63\x6b\0\x6f\x76\x65\x72\x66\x6c\x6f\x77\x5f\
+\x68\x61\x6e\x64\x6c\x65\x72\0\x6f\x76\x65\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\
+\x64\x6c\x65\x72\x5f\x63\x6f\x6e\x74\x65\x78\x74\0\x70\x72\x6f\x67\0\x62\x70\
+\x66\x5f\x63\x6f\x6f\x6b\x69\x65\0\x74\x70\x5f\x65\x76\x65\x6e\x74\0\x66\x74\
+\x72\x61\x63\x65\x5f\x6f\x70\x73\0\x63\x67\x72\x70\0\x73\x62\x5f\x6c\x69\x73\
+\x74\0\x6f\x72\x69\x67\x5f\x74\x79\x70\x65\0\x70\x65\x72\x66\x5f\x65\x76\x65\
+\x6e\x74\x5f\x73\x74\x61\x74\x65\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\
+\x53\x54\x41\x54\x45\x5f\x44\x45\x41\x44\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\
+\x54\x5f\x53\x54\x41\x54\x45\x5f\x45\x58\x49\x54\0\x50\x45\x52\x46\x5f\x45\x56\
+\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x45\x52\x52\x4f\x52\0\x50\x45\x52\x46\
+\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x4f\x46\x46\0\x50\x45\x52\
+\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\x5f\x49\x4e\x41\x43\x54\
+\x49\x56\x45\0\x50\x45\x52\x46\x5f\x45\x56\x45\x4e\x54\x5f\x53\x54\x41\x54\x45\
+\x5f\x41\x43\x54\x49\x56\x45\0\x6c\x6f\x63\x61\x6c\x36\x34\x5f\x74\0\x61\0\x6c\
+\x6f\x63\x61\x6c\x5f\x74\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x61\x74\
+\x74\x72\0\x63\x6f\x6e\x66\x69\x67\0\x73\x61\x6d\x70\x6c\x65\x5f\x74\x79\x70\
+\x65\0\x72\x65\x61\x64\x5f\x66\x6f\x72\x6d\x61\x74\0\x64\x69\x73\x61\x62\x6c\
+\x65\x64\0\x69\x6e\x68\x65\x72\x69\x74\0\x70\x69\x6e\x6e\x65\x64\0\x65\x78\x63\
+\x6c\x75\x73\x69\x76\x65\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x75\x73\x65\x72\0\
+\x65\x78\x63\x6c\x75\x64\x65\x5f\x6b\x65\x72\x6e\x65\x6c\0\x65\x78\x63\x6c\x75\
+\x64\x65\x5f\x68\x76\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x69\x64\x6c\x65\0\x6d\
+\x6d\x61\x70\0\x66\x72\x65\x71\0\x69\x6e\x68\x65\x72\x69\x74\x5f\x73\x74\x61\
+\x74\0\x65\x6e\x61\x62\x6c\x65\x5f\x6f\x6e\x5f\x65\x78\x65\x63\0\x74\x61\x73\
+\x6b\0\x77\x61\x74\x65\x72\x6d\x61\x72\x6b\0\x70\x72\x65\x63\x69\x73\x65\x5f\
+\x69\x70\0\x6d\x6d\x61\x70\x5f\x64\x61\x74\x61\0\x73\x61\x6d\x70\x6c\x65\x5f\
+\x69\x64\x5f\x61\x6c\x6c\0\x65\x78\x63\x6c\x75\x64\x65\x5f\x68\x6f\x73\x74\0\
+\x65\x78\x63\x6c\x75\x64\x65\x5f\x67\x75\x65\x73\x74\0\x65\x78\x63\x6c\x75\x64\
+\x65\x5f\x63\x61\x6c\x6c\x63\x68\x61\x69\x6e\x5f\x6b\x65\x72\x6e\x65\x6c\0\x65\
+\x78\x63\x6c\x75\x64\x65\x5f\x63\x61\x6c\x6c\x63\x68\x61\x69\x6e\x5f\x75\x73\
+\x65\x72\0\x6d\x6d\x61\x70\x32\0\x63\x6f\x6d\x6d\x5f\x65\x78\x65\x63\0\x75\x73\
+\x65\x5f\x63\x6c\x6f\x63\x6b\x69\x64\0\x63\x6f\x6e\x74\x65\x78\x74\x5f\x73\x77\
+\x69\x74\x63\x68\0\x77\x72\x69\x74\x65\x5f\x62\x61\x63\x6b\x77\x61\x72\x64\0\
+\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\x73\0\x6b\x73\x79\x6d\x62\x6f\x6c\0\x62\
+\x70\x66\x5f\x65\x76\x65\x6e\x74\0\x61\x75\x78\x5f\x6f\x75\x74\x70\x75\x74\0\
+\x63\x67\x72\x6f\x75\x70\0\x74\x65\x78\x74\x5f\x70\x6f\x6b\x65\0\x62\x75\x69\
+\x6c\x64\x5f\x69\x64\0\x69\x6e\x68\x65\x72\x69\x74\x5f\x74\x68\x72\x65\x61\x64\
+\0\x72\x65\x6d\x6f\x76\x65\x5f\x6f\x6e\x5f\x65\x78\x65\x63\0\x73\x69\x67\x74\
+\x72\x61\x70\0\x5f\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x5f\x31\0\x62\x70\x5f\
+\x74\x79\x70\x65\0\x62\x72\x61\x6e\x63\x68\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x74\
+\x79\x70\x65\0\x73\x61\x6d\x70\x6c\x65\x5f\x72\x65\x67\x73\x5f\x75\x73\x65\x72\
+\0\x73\x61\x6d\x70\x6c\x65\x5f\x73\x74\x61\x63\x6b\x5f\x75\x73\x65\x72\0\x73\
+\x61\x6d\x70\x6c\x65\x5f\x72\x65\x67\x73\x5f\x69\x6e\x74\x72\0\x61\x75\x78\x5f\
+\x77\x61\x74\x65\x72\x6d\x61\x72\x6b\0\x73\x61\x6d\x70\x6c\x65\x5f\x6d\x61\x78\
+\x5f\x73\x74\x61\x63\x6b\0\x5f\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x5f\x32\0\
+\x61\x75\x78\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x73\x69\x7a\x65\0\x5f\x5f\x72\x65\
+\x73\x65\x72\x76\x65\x64\x5f\x33\0\x73\x69\x67\x5f\x64\x61\x74\x61\0\x63\x6f\
+\x6e\x66\x69\x67\x33\0\x73\x61\x6d\x70\x6c\x65\x5f\x70\x65\x72\x69\x6f\x64\0\
+\x73\x61\x6d\x70\x6c\x65\x5f\x66\x72\x65\x71\0\x77\x61\x6b\x65\x75\x70\x5f\x65\
+\x76\x65\x6e\x74\x73\0\x77\x61\x6b\x65\x75\x70\x5f\x77\x61\x74\x65\x72\x6d\x61\
+\x72\x6b\0\x62\x70\x5f\x61\x64\x64\x72\0\x6b\x70\x72\x6f\x62\x65\x5f\x66\x75\
+\x6e\x63\0\x75\x70\x72\x6f\x62\x65\x5f\x70\x61\x74\x68\0\x63\x6f\x6e\x66\x69\
+\x67\x31\0\x62\x70\x5f\x6c\x65\x6e\0\x6b\x70\x72\x6f\x62\x65\x5f\x61\x64\x64\
+\x72\0\x70\x72\x6f\x62\x65\x5f\x6f\x66\x66\x73\x65\x74\0\x63\x6f\x6e\x66\x69\
+\x67\x32\0\x68\x77\x5f\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\0\x74\x61\x72\
+\x67\x65\x74\0\x70\x72\x65\x76\x5f\x63\x6f\x75\x6e\x74\0\x69\x6e\x74\x65\x72\
+\x72\x75\x70\x74\x73\x5f\x73\x65\x71\0\x69\x6e\x74\x65\x72\x72\x75\x70\x74\x73\
+\0\x66\x72\x65\x71\x5f\x74\x69\x6d\x65\x5f\x73\x74\x61\x6d\x70\0\x66\x72\x65\
+\x71\x5f\x63\x6f\x75\x6e\x74\x5f\x73\x74\x61\x6d\x70\0\x6c\x61\x73\x74\x5f\x74\
+\x61\x67\0\x63\x6f\x6e\x66\x69\x67\x5f\x62\x61\x73\x65\0\x65\x76\x65\x6e\x74\
+\x5f\x62\x61\x73\x65\0\x65\x76\x65\x6e\x74\x5f\x62\x61\x73\x65\x5f\x72\x64\x70\
+\x6d\x63\0\x69\x64\x78\0\x6c\x61\x73\x74\x5f\x63\x70\x75\0\x65\x78\x74\x72\x61\
+\x5f\x72\x65\x67\0\x62\x72\x61\x6e\x63\x68\x5f\x72\x65\x67\0\x68\x77\x5f\x70\
+\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x65\x78\x74\x72\x61\0\x72\x65\x67\0\
+\x61\x6c\x6c\x6f\x63\0\x61\x75\x78\x5f\x63\x6f\x6e\x66\x69\x67\0\x74\x70\x5f\
+\x6c\x69\x73\x74\0\x70\x77\x72\x5f\x61\x63\x63\0\x70\x74\x73\x63\0\x69\x6e\x66\
+\x6f\0\x62\x70\x5f\x6c\x69\x73\x74\0\x61\x72\x63\x68\x5f\x68\x77\x5f\x62\x72\
+\x65\x61\x6b\x70\x6f\x69\x6e\x74\0\x61\x64\x64\x72\x65\x73\x73\0\x72\x68\x6c\
+\x69\x73\x74\x5f\x68\x65\x61\x64\0\x72\x68\x65\x61\x64\0\x72\x68\x61\x73\x68\
+\x5f\x68\x65\x61\x64\0\x69\x6f\x6d\x6d\x75\x5f\x62\x61\x6e\x6b\0\x69\x6f\x6d\
+\x6d\x75\x5f\x63\x6e\x74\x72\0\x70\x61\x64\x64\x69\x6e\x67\0\x63\x6f\x6e\x66\0\
+\x63\x6f\x6e\x66\x31\0\x6c\x61\x73\x74\x5f\x70\x65\x72\x69\x6f\x64\0\x70\x65\
+\x72\x69\x6f\x64\x5f\x6c\x65\x66\x74\0\x73\x61\x76\x65\x64\x5f\x6d\x65\x74\x72\
+\x69\x63\0\x73\x61\x76\x65\x64\x5f\x73\x6c\x6f\x74\x73\0\x77\x61\x69\x74\x5f\
+\x71\x75\x65\x75\x65\x5f\x68\x65\x61\x64\x5f\x74\0\x77\x61\x69\x74\x5f\x71\x75\
+\x65\x75\x65\x5f\x68\x65\x61\x64\0\x68\x65\x61\x64\0\x69\x72\x71\x5f\x77\x6f\
+\x72\x6b\0\x69\x72\x71\x77\x61\x69\x74\0\x72\x63\x75\x77\x61\x69\x74\0\x70\x65\
+\x72\x66\x5f\x61\x64\x64\x72\x5f\x66\x69\x6c\x74\x65\x72\x73\x5f\x68\x65\x61\
+\x64\0\x6e\x72\x5f\x66\x69\x6c\x65\x5f\x66\x69\x6c\x74\x65\x72\x73\0\x70\x65\
+\x72\x66\x5f\x6f\x76\x65\x72\x66\x6c\x6f\x77\x5f\x68\x61\x6e\x64\x6c\x65\x72\
+\x5f\x74\0\x70\x65\x72\x66\x5f\x73\x61\x6d\x70\x6c\x65\x5f\x64\x61\x74\x61\0\
+\x73\x61\x6d\x70\x6c\x65\x5f\x66\x6c\x61\x67\x73\0\x70\x65\x72\x69\x6f\x64\0\
+\x64\x79\x6e\x5f\x73\x69\x7a\x65\0\x74\x69\x64\x5f\x65\x6e\x74\x72\x79\0\x63\
+\x70\x75\x5f\x65\x6e\x74\x72\x79\0\x69\x70\0\x63\x61\x6c\x6c\x63\x68\x61\x69\
+\x6e\0\x72\x61\x77\0\x62\x72\x5f\x73\x74\x61\x63\x6b\0\x62\x72\x5f\x73\x74\x61\
+\x63\x6b\x5f\x63\x6e\x74\x72\0\x64\x61\x74\x61\x5f\x73\x72\x63\0\x74\x78\x6e\0\
+\x72\x65\x67\x73\x5f\x75\x73\x65\x72\0\x72\x65\x67\x73\x5f\x69\x6e\x74\x72\0\
+\x73\x74\x61\x63\x6b\x5f\x75\x73\x65\x72\x5f\x73\x69\x7a\x65\0\x73\x74\x72\x65\
+\x61\x6d\x5f\x69\x64\0\x61\x64\x64\x72\0\x70\x68\x79\x73\x5f\x61\x64\x64\x72\0\
+\x64\x61\x74\x61\x5f\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\0\x63\x6f\x64\x65\x5f\
+\x70\x61\x67\x65\x5f\x73\x69\x7a\x65\0\x61\x75\x78\x5f\x73\x69\x7a\x65\0\x74\
+\x69\x64\0\x72\x65\x73\x65\x72\x76\x65\x64\0\x70\x65\x72\x66\x5f\x73\x61\x6d\
+\x70\x6c\x65\x5f\x77\x65\x69\x67\x68\x74\0\x66\x75\x6c\x6c\0\x76\x61\x72\x31\
+\x5f\x64\x77\0\x76\x61\x72\x32\x5f\x77\0\x76\x61\x72\x33\x5f\x77\0\x70\x65\x72\
+\x66\x5f\x6d\x65\x6d\x5f\x64\x61\x74\x61\x5f\x73\x72\x63\0\x6d\x65\x6d\x5f\x6f\
+\x70\0\x6d\x65\x6d\x5f\x6c\x76\x6c\0\x6d\x65\x6d\x5f\x73\x6e\x6f\x6f\x70\0\x6d\
+\x65\x6d\x5f\x6c\x6f\x63\x6b\0\x6d\x65\x6d\x5f\x64\x74\x6c\x62\0\x6d\x65\x6d\
+\x5f\x6c\x76\x6c\x5f\x6e\x75\x6d\0\x6d\x65\x6d\x5f\x72\x65\x6d\x6f\x74\x65\0\
+\x6d\x65\x6d\x5f\x73\x6e\x6f\x6f\x70\x78\0\x6d\x65\x6d\x5f\x62\x6c\x6b\0\x6d\
+\x65\x6d\x5f\x68\x6f\x70\x73\0\x6d\x65\x6d\x5f\x72\x73\x76\x64\0\x70\x65\x72\
+\x66\x5f\x72\x65\x67\x73\0\x61\x62\x69\0\x72\x65\x67\x73\0\x70\x74\x5f\x72\x65\
+\x67\x73\0\x72\x31\x35\0\x72\x31\x34\0\x72\x31\x33\0\x72\x31\x32\0\x62\x70\0\
+\x62\x78\0\x72\x31\x31\0\x72\x31\x30\0\x72\x39\0\x72\x38\0\x61\x78\0\x63\x78\0\
+\x64\x78\0\x73\x69\0\x64\x69\0\x6f\x72\x69\x67\x5f\x61\x78\0\x63\x73\0\x63\x73\
+\x78\0\x66\x72\x65\x64\x5f\x63\x73\0\x73\x6c\0\x77\x66\x65\0\x73\x73\0\x73\x73\
+\x78\0\x66\x72\x65\x64\x5f\x73\x73\0\x73\x74\x69\0\x73\x77\x65\x76\x65\x6e\x74\
+\0\x6e\x6d\x69\0\x76\x65\x63\x74\x6f\x72\0\x65\x6e\x63\x6c\x61\x76\x65\0\x6c\
+\x6d\0\x6e\x65\x73\x74\x65\x64\0\x69\x6e\x73\x6e\x6c\x65\x6e\0\x70\x72\x69\x76\
+\x61\x74\x65\0\x73\x61\x76\x65\x64\x5f\x66\x75\x6e\x63\0\x6c\x6f\x63\x61\x6c\
+\x5f\x68\x61\x73\x68\0\x66\x75\x6e\x63\x5f\x68\x61\x73\x68\0\x6f\x6c\x64\x5f\
+\x68\x61\x73\x68\0\x74\x72\x61\x6d\x70\x6f\x6c\x69\x6e\x65\0\x74\x72\x61\x6d\
+\x70\x6f\x6c\x69\x6e\x65\x5f\x73\x69\x7a\x65\0\x73\x75\x62\x6f\x70\x5f\x6c\x69\
+\x73\x74\0\x6f\x70\x73\x5f\x66\x75\x6e\x63\0\x6d\x61\x6e\x61\x67\x65\x64\0\x64\
+\x69\x72\x65\x63\x74\x5f\x63\x61\x6c\x6c\0\x66\x74\x72\x61\x63\x65\x5f\x66\x75\
+\x6e\x63\x5f\x74\0\x66\x74\x72\x61\x63\x65\x5f\x72\x65\x67\x73\0\x66\x74\x72\
+\x61\x63\x65\x5f\x6f\x70\x73\x5f\x68\x61\x73\x68\0\x6e\x6f\x74\x72\x61\x63\x65\
+\x5f\x68\x61\x73\x68\0\x66\x69\x6c\x74\x65\x72\x5f\x68\x61\x73\x68\0\x72\x65\
+\x67\x65\x78\x5f\x6c\x6f\x63\x6b\0\x66\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\x5f\
+\x66\x75\x6e\x63\x5f\x74\0\x66\x74\x72\x61\x63\x65\x5f\x6f\x70\x73\x5f\x63\x6d\
+\x64\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\x44\x5f\x45\x4e\x41\
+\x42\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\x4f\x44\x49\x46\x59\x5f\
+\x53\x45\x4c\x46\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\x4d\x44\x5f\
+\x45\x4e\x41\x42\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\x4d\x4f\x44\x49\
+\x46\x59\x5f\x50\x45\x45\x52\0\x46\x54\x52\x41\x43\x45\x5f\x4f\x50\x53\x5f\x43\
+\x4d\x44\x5f\x44\x49\x53\x41\x42\x4c\x45\x5f\x53\x48\x41\x52\x45\x5f\x49\x50\
+\x4d\x4f\x44\x49\x46\x59\x5f\x50\x45\x45\x52\0\x74\x68\x72\x65\x61\x64\x5f\x73\
+\x68\x73\x74\x6b\0\x61\x76\x78\x35\x31\x32\x5f\x74\x69\x6d\x65\x73\x74\x61\x6d\
+\x70\0\x66\x70\x73\x74\x61\x74\x65\0\x5f\x5f\x74\x61\x73\x6b\x5f\x66\x70\x73\
+\x74\x61\x74\x65\0\x70\x65\x72\x6d\0\x67\x75\x65\x73\x74\x5f\x70\x65\x72\x6d\0\
+\x5f\x5f\x66\x70\x73\x74\x61\x74\x65\0\x66\x70\x75\x5f\x73\x74\x61\x74\x65\x5f\
+\x70\x65\x72\x6d\0\x5f\x5f\x73\x74\x61\x74\x65\x5f\x70\x65\x72\x6d\0\x5f\x5f\
+\x73\x74\x61\x74\x65\x5f\x73\x69\x7a\x65\0\x5f\x5f\x75\x73\x65\x72\x5f\x73\x74\
+\x61\x74\x65\x5f\x73\x69\x7a\x65\0\x75\x73\x65\x72\x5f\x73\x69\x7a\x65\0\x78\
+\x66\x65\x61\x74\x75\x72\x65\x73\0\x75\x73\x65\x72\x5f\x78\x66\x65\x61\x74\x75\
+\x72\x65\x73\0\x78\x66\x64\0\x69\x73\x5f\x76\x61\x6c\x6c\x6f\x63\0\x69\x73\x5f\
+\x67\x75\x65\x73\x74\0\x69\x73\x5f\x63\x6f\x6e\x66\x69\x64\x65\x6e\x74\x69\x61\
+\x6c\0\x69\x6e\x5f\x75\x73\x65\0\x66\x70\x72\x65\x67\x73\x5f\x73\x74\x61\x74\
+\x65\0\x66\x73\x61\x76\x65\0\x66\x78\x73\x61\x76\x65\0\x73\x6f\x66\x74\0\x78\
+\x73\x61\x76\x65\0\x5f\x5f\x70\x61\x64\x64\x69\x6e\x67\0\x66\x72\x65\x67\x73\
+\x5f\x73\x74\x61\x74\x65\0\x63\x77\x64\0\x73\x77\x64\0\x74\x77\x64\0\x66\x69\
+\x70\0\x66\x63\x73\0\x66\x6f\x6f\0\x66\x6f\x73\0\x73\x74\x5f\x73\x70\x61\x63\
+\x65\0\x66\x78\x72\x65\x67\x73\x5f\x73\x74\x61\x74\x65\0\x66\x6f\x70\0\x6d\x78\
+\x63\x73\x72\0\x6d\x78\x63\x73\x72\x5f\x6d\x61\x73\x6b\0\x78\x6d\x6d\x5f\x73\
+\x70\x61\x63\x65\0\x72\x69\x70\0\x72\x64\x70\0\x70\x61\x64\x64\x69\x6e\x67\x31\
+\0\x73\x77\x5f\x72\x65\x73\x65\x72\x76\x65\x64\0\x73\x77\x72\x65\x67\x73\x5f\
+\x73\x74\x61\x74\x65\0\x66\x74\x6f\x70\0\x63\x68\x61\x6e\x67\x65\x64\0\x6c\x6f\
+\x6f\x6b\x61\x68\x65\x61\x64\0\x6e\x6f\x5f\x75\x70\x64\x61\x74\x65\0\x72\x6d\0\
+\x61\x6c\x69\x6d\x69\x74\0\x65\x6e\x74\x72\x79\x5f\x65\x69\x70\0\x78\x72\x65\
+\x67\x73\x5f\x73\x74\x61\x74\x65\0\x69\x33\x38\x37\0\x68\x65\x61\x64\x65\x72\0\
+\x65\x78\x74\x65\x6e\x64\x65\x64\x5f\x73\x74\x61\x74\x65\x5f\x61\x72\x65\x61\0\
+\x78\x73\x74\x61\x74\x65\x5f\x68\x65\x61\x64\x65\x72\0\x78\x63\x6f\x6d\x70\x5f\
+\x62\x76\0\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x61\x6e\x64\0\x62\
+\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\0\
+\x73\x63\x78\x5f\x62\x70\x66\x5f\x74\x65\x73\x74\x5f\x61\x6e\x64\x5f\x63\x6c\
+\x65\x61\x72\x5f\x63\x70\x75\x5f\x69\x64\x6c\x65\0\x73\x63\x78\x5f\x62\x70\x66\
+\x5f\x65\x72\x72\x6f\x72\x5f\x62\x73\x74\x72\0\x73\x63\x78\x5f\x62\x70\x66\x5f\
+\x70\x69\x63\x6b\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\0\x62\x70\x66\x5f\x63\x70\
+\x75\x6d\x61\x73\x6b\x5f\x73\x65\x74\x5f\x63\x70\x75\0\x62\x70\x66\x5f\x63\x70\
+\x75\x6d\x61\x73\x6b\x5f\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\0\x73\x63\x78\x5f\
+\x62\x70\x66\x5f\x64\x69\x73\x70\x61\x74\x63\x68\0\x6e\x65\x73\x74\x5f\x65\x6e\
+\x71\x75\x65\x75\x65\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x64\x69\x73\x70\x61\x74\
+\x63\x68\x5f\x76\x74\x69\x6d\x65\0\x6e\x65\x73\x74\x5f\x64\x69\x73\x70\x61\x74\
+\x63\x68\0\x73\x63\x78\x5f\x62\x70\x66\x5f\x63\x6f\x6e\x73\x75\x6d\x65\0\x62\
+\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x66\x69\x72\x73\x74\0\x6e\x65\x73\
+\x74\x5f\x72\x75\x6e\x6e\x69\x6e\x67\0\x6e\x65\x73\x74\x5f\x73\x74\x6f\x70\x70\
+\x69\x6e\x67\0\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\0\x62\
+\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x63\x72\x65\x61\x74\x65\0\x62\x70\
+\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x72\x65\x6c\x65\x61\x73\x65\0\x6e\x65\
+\x73\x74\x5f\x65\x6e\x61\x62\x6c\x65\0\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\0\
+\x73\x63\x78\x5f\x62\x70\x66\x5f\x63\x72\x65\x61\x74\x65\x5f\x64\x73\x71\0\x62\
+\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x63\x6c\x65\x61\x72\0\x62\x70\x66\
+\x5f\x69\x74\x65\x72\x5f\x6e\x75\x6d\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x6e\
+\x75\x6d\x5f\x6e\x65\x77\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x6e\x75\x6d\x5f\
+\x6e\x65\x78\x74\0\x62\x70\x66\x5f\x69\x74\x65\x72\x5f\x6e\x75\x6d\x5f\x64\x65\
+\x73\x74\x72\x6f\x79\0\x6e\x65\x73\x74\x5f\x65\x78\x69\x74\0\x73\x63\x78\x5f\
+\x65\x78\x69\x74\x5f\x69\x6e\x66\x6f\0\x6b\x69\x6e\x64\0\x72\x65\x61\x73\x6f\
+\x6e\0\x62\x74\0\x62\x74\x5f\x6c\x65\x6e\0\x6d\x73\x67\0\x64\x75\x6d\x70\0\x73\
+\x63\x78\x5f\x65\x78\x69\x74\x5f\x6b\x69\x6e\x64\0\x53\x43\x58\x5f\x45\x58\x49\
+\x54\x5f\x4e\x4f\x4e\x45\0\x53\x43\x58\x5f\x45\x58\x49\x54\x5f\x44\x4f\x4e\x45\
+\0\x53\x43\x58\x5f\x45\x58\x49\x54\x5f\x55\x4e\x52\x45\x47\0\x53\x43\x58\x5f\
+\x45\x58\x49\x54\x5f\x55\x4e\x52\x45\x47\x5f\x42\x50\x46\0\x53\x43\x58\x5f\x45\
+\x58\x49\x54\x5f\x55\x4e\x52\x45\x47\x5f\x4b\x45\x52\x4e\0\x53\x43\x58\x5f\x45\
+\x58\x49\x54\x5f\x53\x59\x53\x52\x51\0\x53\x43\x58\x5f\x45\x58\x49\x54\x5f\x45\
+\x52\x52\x4f\x52\0\x53\x43\x58\x5f\x45\x58\x49\x54\x5f\x45\x52\x52\x4f\x52\x5f\
+\x42\x50\x46\0\x53\x43\x58\x5f\x45\x58\x49\x54\x5f\x45\x52\x52\x4f\x52\x5f\x53\
+\x54\x41\x4c\x4c\0\x62\x70\x66\x5f\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\
+\x64\x61\x74\x61\0\x62\x70\x66\x5f\x75\x73\x65\x72\x5f\x70\x74\x5f\x72\x65\x67\
+\x73\x5f\x74\0\x68\x61\x6e\x64\x6c\x65\x5f\x63\x70\x75\x5f\x6d\x61\x73\x6b\x5f\
+\x65\x76\x65\x6e\x74\0\x6d\x61\x70\0\x63\x6f\x6d\x70\x61\x63\x74\x5f\x70\x72\
+\x69\x6d\x61\x72\x79\x5f\x63\x6f\x72\x65\0\x65\x6e\x71\x5f\x66\x6c\x61\x67\x73\
+\0\x6f\x70\x65\x72\x61\x74\x65\x5f\x62\x61\x64\x5f\x67\x75\x79\x73\0\x73\x74\
+\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\x66\x6e\0\x73\x63\x78\x5f\x62\x70\x66\x5f\
+\x67\x65\x74\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x73\x63\x78\
+\x5f\x62\x70\x66\x5f\x70\x75\x74\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\x6d\x61\
+\x73\x6b\0\x5f\x6c\x69\x63\x65\x6e\x73\x65\0\x70\x5f\x72\x65\x6d\x6f\x76\x65\
+\x5f\x6e\x73\0\x72\x5f\x6d\x61\x78\0\x72\x5f\x69\x6d\x70\x61\x74\x69\x65\x6e\
+\x74\0\x73\x6c\x69\x63\x65\x5f\x6e\x73\0\x66\x69\x6e\x64\x5f\x66\x75\x6c\x6c\
+\x79\x5f\x69\x64\x6c\x65\0\x73\x61\x6d\x70\x6c\x69\x6e\x67\x5f\x63\x61\x64\x65\
+\x6e\x63\x65\x5f\x6e\x73\0\x72\x5f\x64\x65\x70\x74\x68\0\x66\x69\x6c\x74\x65\
+\x72\x5f\x62\x79\x5f\x74\x67\x69\x64\0\x6e\x72\x5f\x63\x70\x75\x73\0\x68\x61\
+\x6e\x64\x6c\x65\x5f\x63\x70\x75\x5f\x6d\x61\x73\x6b\x5f\x65\x76\x65\x6e\x74\
+\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\0\x73\x74\x61\x74\x73\x5f\x70\x72\x69\x6d\x61\
+\x72\x79\x5f\x6d\x61\x73\x6b\0\x73\x74\x61\x74\x73\x5f\x72\x65\x73\x65\x72\x76\
+\x65\x64\x5f\x6d\x61\x73\x6b\0\x73\x74\x61\x74\x73\x5f\x6f\x74\x68\x65\x72\x5f\
+\x6d\x61\x73\x6b\0\x73\x74\x61\x74\x73\x5f\x69\x64\x6c\x65\x5f\x6d\x61\x73\x6b\
+\0\x73\x63\x68\x65\x64\x5f\x65\x78\x74\x5f\x6f\x70\x73\0\x73\x65\x6c\x65\x63\
+\x74\x5f\x63\x70\x75\0\x65\x6e\x71\x75\x65\x75\x65\0\x64\x65\x71\x75\x65\x75\
+\x65\0\x64\x69\x73\x70\x61\x74\x63\x68\0\x74\x69\x63\x6b\0\x72\x75\x6e\x6e\x61\
+\x62\x6c\x65\0\x72\x75\x6e\x6e\x69\x6e\x67\0\x73\x74\x6f\x70\x70\x69\x6e\x67\0\
+\x71\x75\x69\x65\x73\x63\x65\x6e\x74\0\x79\x69\x65\x6c\x64\0\x63\x6f\x72\x65\
+\x5f\x73\x63\x68\x65\x64\x5f\x62\x65\x66\x6f\x72\x65\0\x73\x65\x74\x5f\x77\x65\
+\x69\x67\x68\x74\0\x73\x65\x74\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x75\x70\x64\
+\x61\x74\x65\x5f\x69\x64\x6c\x65\0\x63\x70\x75\x5f\x61\x63\x71\x75\x69\x72\x65\
+\0\x63\x70\x75\x5f\x72\x65\x6c\x65\x61\x73\x65\0\x69\x6e\x69\x74\x5f\x74\x61\
+\x73\x6b\0\x65\x78\x69\x74\x5f\x74\x61\x73\x6b\0\x65\x6e\x61\x62\x6c\x65\0\x64\
+\x69\x73\x61\x62\x6c\x65\0\x64\x75\x6d\x70\x5f\x63\x70\x75\0\x64\x75\x6d\x70\
+\x5f\x74\x61\x73\x6b\0\x63\x67\x72\x6f\x75\x70\x5f\x69\x6e\x69\x74\0\x63\x67\
+\x72\x6f\x75\x70\x5f\x65\x78\x69\x74\0\x63\x67\x72\x6f\x75\x70\x5f\x70\x72\x65\
+\x70\x5f\x6d\x6f\x76\x65\0\x63\x67\x72\x6f\x75\x70\x5f\x6d\x6f\x76\x65\0\x63\
+\x67\x72\x6f\x75\x70\x5f\x63\x61\x6e\x63\x65\x6c\x5f\x6d\x6f\x76\x65\0\x63\x67\
+\x72\x6f\x75\x70\x5f\x73\x65\x74\x5f\x77\x65\x69\x67\x68\x74\0\x63\x70\x75\x5f\
+\x6f\x6e\x6c\x69\x6e\x65\0\x63\x70\x75\x5f\x6f\x66\x66\x6c\x69\x6e\x65\0\x69\
+\x6e\x69\x74\0\x65\x78\x69\x74\0\x64\x69\x73\x70\x61\x74\x63\x68\x5f\x6d\x61\
+\x78\x5f\x62\x61\x74\x63\x68\0\x74\x69\x6d\x65\x6f\x75\x74\x5f\x6d\x73\0\x65\
+\x78\x69\x74\x5f\x64\x75\x6d\x70\x5f\x6c\x65\x6e\0\x68\x6f\x74\x70\x6c\x75\x67\
+\x5f\x73\x65\x71\0\x6e\x61\x6d\x65\0\x73\x63\x78\x5f\x63\x70\x75\x5f\x61\x63\
+\x71\x75\x69\x72\x65\x5f\x61\x72\x67\x73\0\x73\x63\x78\x5f\x63\x70\x75\x5f\x72\
+\x65\x6c\x65\x61\x73\x65\x5f\x61\x72\x67\x73\0\x73\x63\x78\x5f\x63\x70\x75\x5f\
+\x70\x72\x65\x65\x6d\x70\x74\x5f\x72\x65\x61\x73\x6f\x6e\0\x53\x43\x58\x5f\x43\
+\x50\x55\x5f\x50\x52\x45\x45\x4d\x50\x54\x5f\x52\x54\0\x53\x43\x58\x5f\x43\x50\
+\x55\x5f\x50\x52\x45\x45\x4d\x50\x54\x5f\x44\x4c\0\x53\x43\x58\x5f\x43\x50\x55\
+\x5f\x50\x52\x45\x45\x4d\x50\x54\x5f\x53\x54\x4f\x50\0\x53\x43\x58\x5f\x43\x50\
+\x55\x5f\x50\x52\x45\x45\x4d\x50\x54\x5f\x55\x4e\x4b\x4e\x4f\x57\x4e\0\x73\x63\
+\x78\x5f\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\x5f\x61\x72\x67\x73\0\x66\x6f\x72\
+\x6b\0\x73\x63\x78\x5f\x65\x78\x69\x74\x5f\x74\x61\x73\x6b\x5f\x61\x72\x67\x73\
+\0\x63\x61\x6e\x63\x65\x6c\x6c\x65\x64\0\x73\x63\x78\x5f\x64\x75\x6d\x70\x5f\
+\x63\x74\x78\0\x61\x74\x5f\x6e\x73\0\x61\x74\x5f\x6a\x69\x66\x66\x69\x65\x73\0\
+\x73\x65\x6c\x66\0\x6c\x65\x76\x65\x6c\0\x6d\x61\x78\x5f\x64\x65\x70\x74\x68\0\
+\x6e\x72\x5f\x64\x65\x73\x63\x65\x6e\x64\x61\x6e\x74\x73\0\x6e\x72\x5f\x64\x79\
+\x69\x6e\x67\x5f\x64\x65\x73\x63\x65\x6e\x64\x61\x6e\x74\x73\0\x6d\x61\x78\x5f\
+\x64\x65\x73\x63\x65\x6e\x64\x61\x6e\x74\x73\0\x6e\x72\x5f\x70\x6f\x70\x75\x6c\
+\x61\x74\x65\x64\x5f\x63\x73\x65\x74\x73\0\x6e\x72\x5f\x70\x6f\x70\x75\x6c\x61\
+\x74\x65\x64\x5f\x64\x6f\x6d\x61\x69\x6e\x5f\x63\x68\x69\x6c\x64\x72\x65\x6e\0\
+\x6e\x72\x5f\x70\x6f\x70\x75\x6c\x61\x74\x65\x64\x5f\x74\x68\x72\x65\x61\x64\
+\x65\x64\x5f\x63\x68\x69\x6c\x64\x72\x65\x6e\0\x6e\x72\x5f\x74\x68\x72\x65\x61\
+\x64\x65\x64\x5f\x63\x68\x69\x6c\x64\x72\x65\x6e\0\x6b\x6e\0\x70\x72\x6f\x63\
+\x73\x5f\x66\x69\x6c\x65\0\x65\x76\x65\x6e\x74\x73\x5f\x66\x69\x6c\x65\0\x70\
+\x73\x69\x5f\x66\x69\x6c\x65\x73\0\x73\x75\x62\x74\x72\x65\x65\x5f\x63\x6f\x6e\
+\x74\x72\x6f\x6c\0\x73\x75\x62\x74\x72\x65\x65\x5f\x73\x73\x5f\x6d\x61\x73\x6b\
+\0\x6f\x6c\x64\x5f\x73\x75\x62\x74\x72\x65\x65\x5f\x63\x6f\x6e\x74\x72\x6f\x6c\
+\0\x6f\x6c\x64\x5f\x73\x75\x62\x74\x72\x65\x65\x5f\x73\x73\x5f\x6d\x61\x73\x6b\
+\0\x73\x75\x62\x73\x79\x73\0\x6e\x72\x5f\x64\x79\x69\x6e\x67\x5f\x73\x75\x62\
+\x73\x79\x73\0\x72\x6f\x6f\x74\0\x63\x73\x65\x74\x5f\x6c\x69\x6e\x6b\x73\0\x65\
+\x5f\x63\x73\x65\x74\x73\0\x64\x6f\x6d\x5f\x63\x67\x72\x70\0\x6f\x6c\x64\x5f\
+\x64\x6f\x6d\x5f\x63\x67\x72\x70\0\x72\x73\x74\x61\x74\x5f\x63\x70\x75\0\x72\
+\x73\x74\x61\x74\x5f\x63\x73\x73\x5f\x6c\x69\x73\x74\0\x5f\x70\x61\x64\x5f\0\
+\x72\x73\x74\x61\x74\x5f\x66\x6c\x75\x73\x68\x5f\x6e\x65\x78\x74\0\x6c\x61\x73\
+\x74\x5f\x62\x73\x74\x61\x74\0\x62\x73\x74\x61\x74\0\x70\x69\x64\x6c\x69\x73\
+\x74\x73\0\x70\x69\x64\x6c\x69\x73\x74\x5f\x6d\x75\x74\x65\x78\0\x6f\x66\x66\
+\x6c\x69\x6e\x65\x5f\x77\x61\x69\x74\x71\0\x72\x65\x6c\x65\x61\x73\x65\x5f\x61\
+\x67\x65\x6e\x74\x5f\x77\x6f\x72\x6b\0\x70\x73\x69\0\x62\x70\x66\0\x66\x72\x65\
+\x65\x7a\x65\x72\0\x62\x70\x66\x5f\x63\x67\x72\x70\x5f\x73\x74\x6f\x72\x61\x67\
+\x65\0\x61\x6e\x63\x65\x73\x74\x6f\x72\x73\0\x63\x67\x72\x6f\x75\x70\x5f\x73\
+\x75\x62\x73\x79\x73\x5f\x73\x74\x61\x74\x65\0\x72\x65\x66\x63\x6e\x74\0\x72\
+\x73\x74\x61\x74\x5f\x63\x73\x73\x5f\x6e\x6f\x64\x65\0\x73\x65\x72\x69\x61\x6c\
+\x5f\x6e\x72\0\x6f\x6e\x6c\x69\x6e\x65\x5f\x63\x6e\x74\0\x64\x65\x73\x74\x72\
+\x6f\x79\x5f\x77\x6f\x72\x6b\0\x64\x65\x73\x74\x72\x6f\x79\x5f\x72\x77\x6f\x72\
+\x6b\0\x70\x65\x72\x63\x70\x75\x5f\x72\x65\x66\0\x70\x65\x72\x63\x70\x75\x5f\
+\x63\x6f\x75\x6e\x74\x5f\x70\x74\x72\0\x64\x61\x74\x61\0\x77\x6f\x72\x6b\x5f\
+\x73\x74\x72\x75\x63\x74\0\x77\x6f\x72\x6b\x5f\x66\x75\x6e\x63\x5f\x74\0\x72\
+\x63\x75\x5f\x77\x6f\x72\x6b\0\x77\x71\0\x63\x67\x72\x6f\x75\x70\x5f\x66\x69\
+\x6c\x65\0\x6e\x6f\x74\x69\x66\x69\x65\x64\x5f\x61\x74\0\x6e\x6f\x74\x69\x66\
+\x79\x5f\x74\x69\x6d\x65\x72\0\x63\x61\x63\x68\x65\x6c\x69\x6e\x65\x5f\x70\x61\
+\x64\x64\x69\x6e\x67\0\x78\0\x63\x67\x72\x6f\x75\x70\x5f\x62\x61\x73\x65\x5f\
+\x73\x74\x61\x74\0\x63\x70\x75\x74\x69\x6d\x65\0\x66\x6f\x72\x63\x65\x69\x64\
+\x6c\x65\x5f\x73\x75\x6d\0\x74\x61\x73\x6b\x5f\x63\x70\x75\x74\x69\x6d\x65\0\
+\x63\x67\x72\x6f\x75\x70\x5f\x62\x70\x66\0\x65\x66\x66\x65\x63\x74\x69\x76\x65\
+\0\x70\x72\x6f\x67\x73\0\x73\x74\x6f\x72\x61\x67\x65\x73\0\x69\x6e\x61\x63\x74\
+\x69\x76\x65\0\x72\x65\x6c\x65\x61\x73\x65\x5f\x77\x6f\x72\x6b\0\x62\x70\x66\
+\x5f\x70\x72\x6f\x67\x5f\x61\x72\x72\x61\x79\0\x69\x74\x65\x6d\x73\0\x62\x70\
+\x66\x5f\x70\x72\x6f\x67\x5f\x61\x72\x72\x61\x79\x5f\x69\x74\x65\x6d\0\x63\x67\
+\x72\x6f\x75\x70\x5f\x73\x74\x6f\x72\x61\x67\x65\0\x62\x70\x66\x5f\x63\x67\x72\
+\x6f\x75\x70\x5f\x73\x74\x6f\x72\x61\x67\x65\0\x6c\x69\x73\x74\x5f\x6d\x61\x70\
+\0\x6c\x69\x73\x74\x5f\x63\x67\0\x62\x75\x66\0\x70\x65\x72\x63\x70\x75\x5f\x62\
+\x75\x66\0\x62\x70\x66\x5f\x63\x67\x72\x6f\x75\x70\x5f\x73\x74\x6f\x72\x61\x67\
+\x65\x5f\x6b\x65\x79\0\x63\x67\x72\x6f\x75\x70\x5f\x69\x6e\x6f\x64\x65\x5f\x69\
+\x64\0\x61\x74\x74\x61\x63\x68\x5f\x74\x79\x70\x65\0\x63\x67\x72\x6f\x75\x70\
+\x5f\x66\x72\x65\x65\x7a\x65\x72\x5f\x73\x74\x61\x74\x65\0\x66\x72\x65\x65\x7a\
+\x65\0\x65\x5f\x66\x72\x65\x65\x7a\x65\0\x6e\x72\x5f\x66\x72\x6f\x7a\x65\x6e\
+\x5f\x64\x65\x73\x63\x65\x6e\x64\x61\x6e\x74\x73\0\x6e\x72\x5f\x66\x72\x6f\x7a\
+\x65\x6e\x5f\x74\x61\x73\x6b\x73\0\x73\x63\x78\x5f\x63\x67\x72\x6f\x75\x70\x5f\
+\x69\x6e\x69\x74\x5f\x61\x72\x67\x73\0\x6e\x65\x73\x74\x5f\x6f\x70\x73\0\x75\
+\x65\x69\x5f\x64\x75\x6d\x70\0\x75\x65\x69\x5f\x64\x75\x6d\x70\x5f\x6c\x65\x6e\
+\0\x75\x73\x65\x72\x5f\x65\x78\x69\x74\x5f\x69\x6e\x66\x6f\0\x75\x65\x69\0\x70\
+\x72\x69\x6d\x61\x72\x79\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x72\x65\x73\x65\x72\
+\x76\x65\x5f\x63\x70\x75\x6d\x61\x73\x6b\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\
+\x73\x65\x6c\x65\x63\x74\x5f\x63\x70\x75\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x5f\x5f\
+\x5f\x5f\x6e\x65\x73\x74\x5f\x73\x65\x6c\x65\x63\x74\x5f\x63\x70\x75\x2e\x5f\
+\x5f\x5f\x66\x6d\x74\x2e\x31\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x73\x65\x6c\
+\x65\x63\x74\x5f\x63\x70\x75\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x33\0\x6e\x72\x5f\
+\x72\x65\x73\x65\x72\x76\x65\x64\0\x63\x6f\x6d\x70\x61\x63\x74\x5f\x70\x72\x69\
+\x6d\x61\x72\x79\x5f\x63\x6f\x72\x65\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x63\x6f\x6d\
+\x70\x61\x63\x74\x5f\x70\x72\x69\x6d\x61\x72\x79\x5f\x63\x6f\x72\x65\x2e\x5f\
+\x5f\x5f\x66\x6d\x74\x2e\x36\0\x76\x74\x69\x6d\x65\x5f\x6e\x6f\x77\0\x5f\x5f\
+\x5f\x5f\x6e\x65\x73\x74\x5f\x65\x6e\x71\x75\x65\x75\x65\x2e\x5f\x5f\x5f\x66\
+\x6d\x74\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x64\x69\x73\x70\x61\x74\x63\x68\
+\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x64\x69\x73\
+\x70\x61\x74\x63\x68\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\x30\0\x5f\x5f\x5f\x5f\
+\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x5f\x5f\x5f\
+\x5f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\
+\x32\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\
+\x6d\x74\x2e\x31\x34\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x2e\
+\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\x36\0\x5f\x5f\x5f\x5f\x6e\x65\x73\x74\x5f\x69\
+\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\x38\0\x5f\x5f\x5f\x5f\x6e\x65\
+\x73\x74\x5f\x69\x6e\x69\x74\x2e\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\x30\0\x73\x74\
+\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\x66\x6e\x2e\x5f\x5f\x5f\x66\x6d\x74\0\x73\
+\x74\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\x66\x6e\x2e\x5f\x5f\x5f\x66\x6d\x74\
+\x2e\x32\x33\0\x6b\x70\x74\x72\0\x74\x72\x61\x63\x65\x5f\x65\x76\x65\x6e\x74\
+\x5f\x63\x61\x6c\x6c\0\x65\x76\x65\x6e\x74\x5f\x66\x69\x6c\x74\x65\x72\0\x70\
+\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x70\x6d\x75\x5f\x63\x6f\x6e\x74\x65\
+\x78\x74\0\x70\x65\x72\x66\x5f\x65\x76\x65\x6e\x74\x5f\x63\x6f\x6e\x74\x65\x78\
+\x74\0\x70\x65\x72\x66\x5f\x62\x75\x66\x66\x65\x72\0\x6d\x6d\x5f\x73\x74\x72\
+\x75\x63\x74\0\x73\x63\x78\x5f\x64\x69\x73\x70\x61\x74\x63\x68\x5f\x71\0\x68\
+\x72\x74\x69\x6d\x65\x72\x5f\x63\x6c\x6f\x63\x6b\x5f\x62\x61\x73\x65\0\x61\x64\
+\x64\x72\x65\x73\x73\x5f\x73\x70\x61\x63\x65\0\x63\x6f\x6d\x70\x6c\x65\x74\x69\
+\x6f\x6e\0\x6f\x62\x6a\x5f\x63\x67\x72\x6f\x75\x70\0\x70\x65\x72\x63\x70\x75\
+\x5f\x72\x65\x66\x5f\x64\x61\x74\x61\0\x6d\x65\x6d\x5f\x63\x67\x72\x6f\x75\x70\
+\0\x75\x73\x65\x72\x5f\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\0\x70\x69\x64\x5f\
+\x6e\x61\x6d\x65\x73\x70\x61\x63\x65\0\x63\x73\x73\x5f\x73\x65\x74\0\x6b\x65\
+\x72\x6e\x66\x73\x5f\x6e\x6f\x64\x65\0\x63\x67\x72\x6f\x75\x70\x5f\x72\x6f\x6f\
+\x74\0\x63\x67\x72\x6f\x75\x70\x5f\x72\x73\x74\x61\x74\x5f\x63\x70\x75\0\x63\
+\x67\x72\x6f\x75\x70\x5f\x73\x75\x62\x73\x79\x73\0\x70\x73\x69\x5f\x67\x72\x6f\
+\x75\x70\0\x77\x6f\x72\x6b\x71\x75\x65\x75\x65\x5f\x73\x74\x72\x75\x63\x74\0\
+\x62\x70\x66\x5f\x70\x72\x6f\x67\0\x62\x70\x66\x5f\x6c\x6f\x63\x61\x6c\x5f\x73\
+\x74\x6f\x72\x61\x67\x65\0\x66\x74\x72\x61\x63\x65\x5f\x68\x61\x73\x68\0\x76\
+\x6d\x5f\x73\x74\x72\x75\x63\x74\0\x75\x73\x65\x72\x5f\x73\x74\x72\x75\x63\x74\
+\0\x62\x70\x66\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\x62\x75\x66\x66\x65\x72\0\
+\x62\x70\x66\x5f\x63\x67\x72\x6f\x75\x70\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\
+\x6d\x61\x70\0\x66\x73\x5f\x73\x74\x72\x75\x63\x74\0\x70\x69\x70\x65\x5f\x69\
+\x6e\x6f\x64\x65\x5f\x69\x6e\x66\x6f\0\x66\x61\x73\x79\x6e\x63\x5f\x73\x74\x72\
+\x75\x63\x74\0\x67\x65\x6e\x64\x69\x73\x6b\0\x70\x65\x72\x66\x5f\x61\x64\x64\
+\x72\x5f\x66\x69\x6c\x74\x65\x72\x5f\x72\x61\x6e\x67\x65\0\x70\x65\x72\x66\x5f\
+\x63\x61\x6c\x6c\x63\x68\x61\x69\x6e\x5f\x65\x6e\x74\x72\x79\0\x70\x65\x72\x66\
+\x5f\x72\x61\x77\x5f\x72\x65\x63\x6f\x72\x64\0\x70\x65\x72\x66\x5f\x62\x72\x61\
+\x6e\x63\x68\x5f\x73\x74\x61\x63\x6b\0\x70\x65\x72\x66\x5f\x63\x67\x72\x6f\x75\
+\x70\0\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x69\x67\x69\x6e\x66\x6f\0\x74\x61\x73\
+\x6b\x5f\x67\x72\x6f\x75\x70\0\x72\x63\x75\x5f\x6e\x6f\x64\x65\0\x73\x69\x67\
+\x6e\x61\x6c\x5f\x73\x74\x72\x75\x63\x74\0\x5f\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\
+\x74\x69\x6d\x65\x73\x70\x65\x63\0\x6f\x6c\x64\x5f\x74\x69\x6d\x65\x73\x70\x65\
+\x63\x33\x32\0\x70\x6f\x6c\x6c\x66\x64\0\x73\x65\x6d\x5f\x75\x6e\x64\x6f\x5f\
+\x6c\x69\x73\x74\0\x66\x69\x6c\x65\x73\x5f\x73\x74\x72\x75\x63\x74\0\x69\x6f\
+\x5f\x75\x72\x69\x6e\x67\x5f\x74\x61\x73\x6b\0\x62\x6c\x6b\x5f\x70\x6c\x75\x67\
+\0\x73\x69\x67\x68\x61\x6e\x64\x5f\x73\x74\x72\x75\x63\x74\0\x73\x65\x63\x63\
+\x6f\x6d\x70\x5f\x66\x69\x6c\x74\x65\x72\0\x72\x74\x5f\x6d\x75\x74\x65\x78\x5f\
+\x77\x61\x69\x74\x65\x72\0\x72\x6f\x62\x75\x73\x74\x5f\x6c\x69\x73\x74\x5f\x68\
+\x65\x61\x64\0\x63\x6f\x6d\x70\x61\x74\x5f\x72\x6f\x62\x75\x73\x74\x5f\x6c\x69\
+\x73\x74\x5f\x68\x65\x61\x64\0\x66\x75\x74\x65\x78\x5f\x70\x69\x5f\x73\x74\x61\
+\x74\x65\0\x74\x61\x73\x6b\x5f\x64\x65\x6c\x61\x79\x5f\x69\x6e\x66\x6f\0\x75\
+\x70\x72\x6f\x62\x65\x5f\x74\x61\x73\x6b\0\x62\x70\x66\x5f\x72\x75\x6e\x5f\x63\
+\x74\x78\0\x6d\x61\x74\x68\x5f\x65\x6d\x75\x5f\x69\x6e\x66\x6f\0\x2f\x68\x6f\
+\x6d\x65\x2f\x6e\x65\x31\x2f\x73\x79\x73\x5f\x63\x6f\x6d\x70\x65\x74\x69\x74\
+\x69\x6f\x6e\x2f\x73\x63\x78\x2d\x70\x6c\x75\x67\x2f\x2e\x2f\x69\x6e\x63\x6c\
+\x75\x64\x65\x2f\x73\x63\x78\x2f\x63\x6f\x6d\x6d\x6f\x6e\x2e\x62\x70\x66\x2e\
+\x68\0\x63\x6f\x6e\x73\x74\x20\x73\x74\x72\x75\x63\x74\x20\x63\x70\x75\x6d\x61\
+\x73\x6b\x20\x2a\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x73\x74\x72\x75\x63\
+\x74\x20\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x20\x2a\x6d\x61\x73\x6b\
+\x29\0\x09\x72\x65\x74\x75\x72\x6e\x20\x28\x63\x6f\x6e\x73\x74\x20\x73\x74\x72\
+\x75\x63\x74\x20\x63\x70\x75\x6d\x61\x73\x6b\x20\x2a\x29\x6d\x61\x73\x6b\x3b\0\
+\x2f\x68\x6f\x6d\x65\x2f\x6e\x65\x31\x2f\x73\x79\x73\x5f\x63\x6f\x6d\x70\x65\
+\x74\x69\x74\x69\x6f\x6e\x2f\x73\x63\x78\x2d\x70\x6c\x75\x67\x2f\x62\x70\x66\
+\x2f\x73\x63\x78\x5f\x6e\x65\x73\x74\x2e\x62\x70\x66\x2e\x63\0\x09\x73\x33\x32\
+\x20\x63\x70\x75\x20\x3d\x20\x62\x70\x66\x5f\x67\x65\x74\x5f\x73\x6d\x70\x5f\
+\x70\x72\x6f\x63\x65\x73\x73\x6f\x72\x5f\x69\x64\x28\x29\x3b\0\x09\x75\x36\x34\
+\x20\x2a\x63\x6e\x74\x5f\x70\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\
+\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x73\x74\x61\x74\x73\x2c\x20\
+\x26\x69\x64\x78\x29\x3b\0\x09\x69\x66\x20\x28\x63\x6e\x74\x5f\x70\x29\0\x09\
+\x09\x28\x2a\x63\x6e\x74\x5f\x70\x29\x2b\x2b\x3b\0\x09\x70\x63\x70\x75\x5f\x63\
+\x74\x78\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\
+\x5f\x65\x6c\x65\x6d\x28\x26\x70\x63\x70\x75\x5f\x63\x74\x78\x73\x2c\x20\x26\
+\x63\x70\x75\x29\x3b\x2f\x2f\x20\xe6\x9f\xa5\xe6\x89\xbe\xe5\xbd\x93\xe5\x89\
+\x8d\xe6\xa0\xb8\xe5\xbf\x83\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x8b\xe6\x96\x87\0\
+\x09\x69\x66\x20\x28\x21\x70\x63\x70\x75\x5f\x63\x74\x78\x29\x20\x7b\0\x09\x09\
+\x73\x63\x78\x5f\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x43\x6f\x75\x6c\
+\x64\x6e\x27\x74\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x70\x63\x70\x75\x20\x63\x74\
+\x78\x22\x29\x3b\x2f\x2f\x20\xe5\xa6\x82\xe6\x9e\x9c\xe4\xb8\x8a\xe4\xb8\x8b\
+\xe6\x96\x87\xe4\xb8\xba\xe7\xa9\xba\xef\xbc\x8c\xe8\xae\xb0\xe5\xbd\x95\xe9\
+\x94\x99\xe8\xaf\xaf\xe5\xb9\xb6\xe9\x80\x80\xe5\x87\xba\0\x09\x09\x72\x65\x74\
+\x75\x72\x6e\x20\x30\x3b\0\x09\x62\x70\x66\x5f\x72\x63\x75\x5f\x72\x65\x61\x64\
+\x5f\x6c\x6f\x63\x6b\x28\x29\x3b\x2f\x2f\x20\xe5\x8a\xa0\xe9\x94\x81\xe4\xbb\
+\xa5\xe4\xbf\x9d\xe6\x8a\xa4\xe8\xae\xbf\xe9\x97\xae\0\x09\x70\x72\x69\x6d\x61\
+\x72\x79\x20\x3d\x20\x70\x72\x69\x6d\x61\x72\x79\x5f\x63\x70\x75\x6d\x61\x73\
+\x6b\x3b\x20\x2f\x2f\x20\xe8\x8e\xb7\xe5\x8f\x96\x20\x50\x72\x69\x6d\x61\x72\
+\x79\x20\x4e\x65\x73\x74\x20\xe7\x9a\x84\xe6\xa0\xb8\xe5\xbf\x83\xe6\x8e\xa9\
+\xe7\xa0\x81\0\x09\x69\x66\x20\x28\x21\x70\x72\x69\x6d\x61\x72\x79\x20\x7c\x7c\
+\x20\x21\x72\x65\x73\x65\x72\x76\x65\x29\x20\x7b\0\x09\x09\x73\x63\x78\x5f\x62\
+\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x43\x6f\x75\x6c\x64\x6e\x27\x74\x20\
+\x66\x69\x6e\x64\x20\x70\x72\x69\x6d\x61\x72\x79\x20\x6f\x72\x20\x72\x65\x73\
+\x65\x72\x76\x65\x22\x29\x3b\x2f\x2f\x20\xe5\xa6\x82\xe6\x9e\x9c\xe4\xbb\xbb\
+\xe4\xbd\x95\xe4\xb8\x80\xe4\xb8\xaa\xe6\x8e\xa9\xe7\xa0\x81\xe4\xb8\xba\xe7\
+\xa9\xba\xef\xbc\x8c\xe8\xae\xb0\xe5\xbd\x95\xe9\x94\x99\xe8\xaf\xaf\xe5\xb9\
+\xb6\xe9\x80\x80\xe5\x87\xba\0\x09\x09\x62\x70\x66\x5f\x72\x63\x75\x5f\x72\x65\
+\x61\x64\x5f\x75\x6e\x6c\x6f\x63\x6b\x28\x29\x3b\0\x09\x62\x70\x66\x5f\x63\x70\
+\x75\x6d\x61\x73\x6b\x5f\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\x28\x63\x70\x75\
+\x2c\x20\x70\x72\x69\x6d\x61\x72\x79\x29\x3b\0\x09\x74\x72\x79\x5f\x6d\x61\x6b\
+\x65\x5f\x63\x6f\x72\x65\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x28\x63\x70\x75\
+\x2c\x20\x72\x65\x73\x65\x72\x76\x65\x2c\x20\x66\x61\x6c\x73\x65\x29\x3b\0\x09\
+\x69\x66\x20\x28\x74\x6d\x70\x5f\x6e\x72\x5f\x72\x65\x73\x65\x72\x76\x65\x64\
+\x20\x3c\x20\x72\x5f\x6d\x61\x78\x29\x20\x7b\x20\0\x09\x74\x6d\x70\x5f\x6e\x72\
+\x5f\x72\x65\x73\x65\x72\x76\x65\x64\x20\x3d\x20\x6e\x72\x5f\x72\x65\x73\x65\
+\x72\x76\x65\x64\x3b\0\x09\x09\x5f\x5f\x73\x79\x6e\x63\x5f\x66\x65\x74\x63\x68\
+\x5f\x61\x6e\x64\x5f\x61\x64\x64\x28\x26\x6e\x72\x5f\x72\x65\x73\x65\x72\x76\
+\x65\x64\x2c\x20\x31\x29\x3b\x2f\x2f\x20\xe5\x8e\x9f\xe5\xad\x90\xe5\xa2\x9e\
+\xe5\x8a\xa0\x20\x52\x65\x73\x65\x72\x76\x65\x20\xe6\xa0\xb8\xe5\xbf\x83\xe8\
+\xae\xa1\xe6\x95\xb0\0\x09\x09\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\
+\x73\x65\x74\x5f\x63\x70\x75\x28\x63\x70\x75\x2c\x20\x72\x65\x73\x65\x72\x76\
+\x65\x64\x29\x3b\x2f\x2f\x20\xe5\xb0\x86\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\
+\xe6\xa0\xb8\xe5\xbf\x83\xe5\x8a\xa0\xe5\x85\xa5\x20\x52\x65\x73\x65\x72\x76\
+\x65\x20\xe6\x8e\xa9\xe7\xa0\x81\0\x09\x09\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\
+\x73\x6b\x5f\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\x28\x63\x70\x75\x2c\x20\x72\
+\x65\x73\x65\x72\x76\x65\x64\x29\x3b\x2f\x2f\x20\xe5\xa6\x82\xe6\x9e\x9c\x20\
+\x52\x65\x73\x65\x72\x76\x65\x20\xe5\xb7\xb2\xe6\xbb\xa1\xef\xbc\x8c\xe6\xb8\
+\x85\xe9\x99\xa4\xe8\xaf\xa5\xe6\xa0\xb8\xe5\xbf\x83\0\x09\x62\x70\x66\x5f\x72\
+\x63\x75\x5f\x72\x65\x61\x64\x5f\x75\x6e\x6c\x6f\x63\x6b\x28\x29\x3b\x2f\x2f\
+\x20\xe8\xa7\xa3\xe9\x94\x81\0\x09\x70\x63\x70\x75\x5f\x63\x74\x78\x2d\x3e\x73\
+\x63\x68\x65\x64\x75\x6c\x65\x64\x5f\x63\x6f\x6d\x70\x61\x63\x74\x69\x6f\x6e\
+\x20\x3d\x20\x66\x61\x6c\x73\x65\x3b\0\x7d\0\x73\x74\x61\x74\x69\x63\x20\x69\
+\x6e\x74\x20\x6f\x70\x65\x72\x61\x74\x65\x5f\x62\x61\x64\x5f\x67\x75\x79\x73\
+\x28\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\
+\x20\x2a\x70\x2c\x75\x36\x34\x20\x65\x6e\x71\x5f\x66\x6c\x61\x67\x73\x29\x7b\0\
+\x09\x69\x66\x28\x70\x2d\x3e\x66\x6c\x61\x67\x73\x20\x26\x20\x50\x46\x5f\x4b\
+\x54\x48\x52\x45\x41\x44\x29\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\
+\x65\x61\x64\x5f\x6b\x65\x72\x6e\x65\x6c\x5f\x73\x74\x72\x28\x6e\x61\x6d\x65\
+\x2e\x63\x6f\x6d\x6d\x2c\x73\x69\x7a\x65\x6f\x66\x28\x70\x2d\x3e\x63\x6f\x6d\
+\x6d\x29\x2c\x70\x2d\x3e\x63\x6f\x6d\x6d\x29\x3b\0\x09\x75\x33\x32\x20\x70\x69\
+\x64\x20\x3d\x20\x70\x2d\x3e\x70\x69\x64\x3b\0\x09\x75\x33\x32\x20\x74\x67\x69\
+\x64\x20\x3d\x20\x70\x2d\x3e\x74\x67\x69\x64\x3b\0\x09\x75\x33\x32\x20\x2a\x69\
+\x64\x65\x6e\x74\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\
+\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x63\x6f\x6d\x6d\x5f\x69\x67\x6e\x6f\x72\
+\x65\x5f\x6d\x61\x70\x2c\x26\x6e\x61\x6d\x65\x29\x3b\0\x09\x69\x66\x28\x69\x64\
+\x65\x6e\x74\x29\x7b\0\x09\x69\x64\x65\x6e\x74\x20\x3d\x20\x62\x70\x66\x5f\x6d\
+\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x69\x64\x5f\
+\x69\x67\x6e\x6f\x72\x65\x5f\x6d\x61\x70\x2c\x26\x70\x69\x64\x29\x3b\0\x09\x69\
+\x66\x28\x66\x69\x6c\x74\x65\x72\x5f\x62\x79\x5f\x74\x67\x69\x64\x29\x7b\0\x09\
+\x09\x69\x64\x65\x6e\x74\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\
+\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x69\x64\x5f\x69\x67\x6e\x6f\x72\
+\x65\x5f\x6d\x61\x70\x2c\x26\x74\x67\x69\x64\x29\x3b\0\x09\x09\x69\x66\x28\x69\
+\x64\x65\x6e\x74\x29\x7b\0\x09\x69\x64\x65\x6e\x74\x20\x3d\x20\x62\x70\x66\x5f\
+\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x63\x6f\
+\x6d\x6d\x5f\x61\x74\x74\x65\x6e\x74\x69\x6f\x6e\x5f\x6d\x61\x70\x2c\x26\x6e\
+\x61\x6d\x65\x29\x3b\0\x09\x69\x64\x65\x6e\x74\x5f\x69\x64\x20\x3d\x20\x62\x70\
+\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\
+\x69\x64\x5f\x61\x74\x74\x65\x6e\x74\x69\x6f\x6e\x5f\x6d\x61\x70\x2c\x26\x70\
+\x69\x64\x29\x3b\0\x09\x09\x69\x64\x65\x6e\x74\x5f\x74\x67\x69\x64\x20\x3d\x20\
+\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\
+\x28\x26\x69\x64\x5f\x61\x74\x74\x65\x6e\x74\x69\x6f\x6e\x5f\x6d\x61\x70\x2c\
+\x26\x74\x67\x69\x64\x29\x3b\0\x09\x69\x66\x28\x69\x64\x65\x6e\x74\x20\x7c\x7c\
+\x20\x69\x64\x65\x6e\x74\x5f\x69\x64\x20\x7c\x7c\x20\x69\x64\x65\x6e\x74\x5f\
+\x74\x67\x69\x64\x29\x7b\0\x09\x09\x75\x36\x34\x20\x76\x74\x69\x6d\x65\x20\x3d\
+\x20\x70\x2d\x3e\x73\x63\x78\x2e\x64\x73\x71\x5f\x76\x74\x69\x6d\x65\x3b\x2f\
+\x2f\x20\xe8\x8e\xb7\xe5\x8f\x96\xe4\xbb\xbb\xe5\x8a\xa1\xe7\x9a\x84\xe8\x99\
+\x9a\xe6\x8b\x9f\xe6\x97\xb6\xe9\x97\xb4\0\x09\x09\x69\x66\x20\x28\x76\x74\x69\
+\x6d\x65\x5f\x62\x65\x66\x6f\x72\x65\x28\x76\x74\x69\x6d\x65\x2c\x20\x76\x74\
+\x69\x6d\x65\x5f\x6e\x6f\x77\x20\x2d\x20\x73\x6c\x69\x63\x65\x5f\x6e\x73\x29\
+\x29\0\x09\x72\x65\x74\x75\x72\x6e\x20\x28\x73\x36\x34\x29\x28\x61\x20\x2d\x20\
+\x62\x29\x20\x3c\x20\x30\x3b\0\x09\x09\x09\x76\x74\x69\x6d\x65\x20\x3d\x20\x76\
+\x74\x69\x6d\x65\x5f\x6e\x6f\x77\x20\x2d\x20\x73\x6c\x69\x63\x65\x5f\x6e\x73\
+\x3b\0\x09\x75\x33\x32\x20\x7a\x65\x72\x6f\x20\x3d\x20\x30\x3b\0\x09\x73\x74\
+\x72\x75\x63\x74\x20\x66\x69\x6c\x74\x65\x72\x5f\x69\x6e\x6e\x65\x72\x5f\x6d\
+\x61\x70\x20\x2a\x62\x61\x64\x5f\x67\x75\x79\x20\x3d\x20\x62\x70\x66\x5f\x6d\
+\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x66\x6c\x69\
+\x74\x65\x72\x5f\x6d\x61\x70\x2c\x26\x7a\x65\x72\x6f\x29\x3b\0\x09\x69\x66\x28\
+\x62\x61\x64\x5f\x67\x75\x79\x29\x7b\0\x09\x09\x69\x64\x65\x6e\x74\x20\x3d\x20\
+\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\
+\x28\x62\x61\x64\x5f\x67\x75\x79\x2c\x26\x70\x69\x64\x29\x3b\0\x09\x09\x09\x75\
+\x36\x34\x20\x76\x74\x69\x6d\x65\x20\x3d\x20\x70\x2d\x3e\x73\x63\x78\x2e\x64\
+\x73\x71\x5f\x76\x74\x69\x6d\x65\x3b\x2f\x2f\x20\xe8\x8e\xb7\xe5\x8f\x96\xe4\
+\xbb\xbb\xe5\x8a\xa1\xe7\x9a\x84\xe8\x99\x9a\xe6\x8b\x9f\xe6\x97\xb6\xe9\x97\
+\xb4\0\x09\x09\x09\x69\x66\x20\x28\x76\x74\x69\x6d\x65\x5f\x62\x65\x66\x6f\x72\
+\x65\x28\x76\x74\x69\x6d\x65\x2c\x20\x76\x74\x69\x6d\x65\x5f\x6e\x6f\x77\x20\
+\x2d\x20\x73\x6c\x69\x63\x65\x5f\x6e\x73\x29\x29\0\x73\x74\x61\x74\x69\x63\x20\
+\x69\x6e\x74\x20\x73\x74\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\x66\x6e\x28\x76\
+\x6f\x69\x64\x20\x2a\x6d\x61\x70\x2c\x20\x69\x6e\x74\x20\x2a\x6b\x65\x79\x2c\
+\x20\x73\x74\x72\x75\x63\x74\x20\x62\x70\x66\x5f\x74\x69\x6d\x65\x72\x20\x2a\
+\x74\x69\x6d\x65\x72\x29\0\x09\x73\x74\x61\x74\x73\x5f\x72\x65\x73\x65\x72\x76\
+\x65\x64\x5f\x6d\x61\x73\x6b\x20\x3d\x20\x30\x3b\0\x09\x73\x74\x61\x74\x73\x5f\
+\x70\x72\x69\x6d\x61\x72\x79\x5f\x6d\x61\x73\x6b\x20\x3d\x20\x30\x3b\0\x09\x73\
+\x74\x61\x74\x73\x5f\x6f\x74\x68\x65\x72\x5f\x6d\x61\x73\x6b\x20\x3d\x20\x30\
+\x3b\0\x09\x73\x74\x61\x74\x73\x5f\x69\x64\x6c\x65\x5f\x6d\x61\x73\x6b\x20\x3d\
+\x20\x30\x3b\0\x09\x62\x70\x66\x5f\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x6c\x6f\
+\x63\x6b\x28\x29\x3b\0\x09\x70\x72\x69\x6d\x61\x72\x79\x20\x3d\x20\x70\x72\x69\
+\x6d\x61\x72\x79\x5f\x63\x70\x75\x6d\x61\x73\x6b\x3b\0\x09\x09\x73\x63\x78\x5f\
+\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\x74\
+\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x70\x72\x69\x6d\x61\x72\x79\x20\x6f\x72\
+\x20\x72\x65\x73\x65\x72\x76\x65\x22\x29\x3b\0\x09\x69\x64\x6c\x65\x20\x3d\x20\
+\x73\x63\x78\x5f\x62\x70\x66\x5f\x67\x65\x74\x5f\x69\x64\x6c\x65\x5f\x63\x70\
+\x75\x6d\x61\x73\x6b\x28\x29\x3b\0\x09\x62\x70\x66\x5f\x66\x6f\x72\x28\x63\x70\
+\x75\x2c\x20\x30\x2c\x20\x6e\x72\x5f\x63\x70\x75\x73\x29\x20\x7b\0\x09\x62\x70\
+\x66\x5f\x72\x63\x75\x5f\x72\x65\x61\x64\x5f\x75\x6e\x6c\x6f\x63\x6b\x28\x29\
+\x3b\0\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x70\x75\x74\x5f\x69\x64\x6c\x65\x5f\
+\x63\x70\x75\x6d\x61\x73\x6b\x28\x69\x64\x6c\x65\x29\x3b\0\x09\x65\x72\x72\x20\
+\x3d\x20\x62\x70\x66\x5f\x74\x69\x6d\x65\x72\x5f\x73\x74\x61\x72\x74\x28\x74\
+\x69\x6d\x65\x72\x2c\x20\x73\x61\x6d\x70\x6c\x69\x6e\x67\x5f\x63\x61\x64\x65\
+\x6e\x63\x65\x5f\x6e\x73\x20\x2d\x20\x35\x30\x30\x30\x2c\x20\x30\x29\x3b\0\x09\
+\x69\x66\x20\x28\x65\x72\x72\x29\0\x09\x09\x69\x66\x20\x28\x62\x70\x66\x5f\x63\
+\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\x28\x63\x70\x75\
+\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x70\x72\x69\x6d\x61\x72\x79\
+\x29\x29\x29\0\x09\x09\x65\x6c\x73\x65\x20\x69\x66\x20\x28\x62\x70\x66\x5f\x63\
+\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\x28\x63\x70\x75\
+\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x72\x65\x73\x65\x72\x76\x65\
+\x29\x29\x29\0\x09\x09\x69\x66\x20\x28\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\
+\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\x28\x63\x70\x75\x2c\x20\x69\x64\x6c\
+\x65\x29\x29\0\x09\x09\x09\x73\x74\x61\x74\x73\x5f\x69\x64\x6c\x65\x5f\x6d\x61\
+\x73\x6b\x20\x7c\x3d\x20\x28\x31\x55\x4c\x4c\x20\x3c\x3c\x20\x63\x70\x75\x29\
+\x3b\0\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x46\
+\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x61\x72\x6d\x20\x73\x74\x61\x74\x73\x20\
+\x74\x69\x6d\x65\x72\x22\x29\x3b\0\x73\x33\x32\x20\x42\x50\x46\x5f\x53\x54\x52\
+\x55\x43\x54\x5f\x4f\x50\x53\x28\x6e\x65\x73\x74\x5f\x73\x65\x6c\x65\x63\x74\
+\x5f\x63\x70\x75\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x73\
+\x74\x72\x75\x63\x74\x20\x2a\x70\x2c\x20\x73\x33\x32\x20\x70\x72\x65\x76\x5f\
+\x63\x70\x75\x2c\0\x09\x74\x63\x74\x78\x20\x3d\x20\x62\x70\x66\x5f\x74\x61\x73\
+\x6b\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\x67\x65\x74\x28\x26\x74\x61\x73\x6b\
+\x5f\x63\x74\x78\x5f\x73\x74\x6f\x72\x2c\x20\x70\x2c\x20\x30\x2c\x20\x30\x29\
+\x3b\0\x09\x69\x66\x20\x28\x21\x74\x63\x74\x78\x29\0\x09\x70\x5f\x6d\x61\x73\
+\x6b\x20\x3d\x20\x74\x63\x74\x78\x2d\x3e\x74\x6d\x70\x5f\x6d\x61\x73\x6b\x3b\0\
+\x09\x69\x66\x20\x28\x21\x70\x5f\x6d\x61\x73\x6b\x20\x7c\x7c\x20\x21\x70\x72\
+\x69\x6d\x61\x72\x79\x20\x7c\x7c\x20\x21\x72\x65\x73\x65\x72\x76\x65\x29\x20\
+\x7b\0\x09\x09\x72\x65\x74\x75\x72\x6e\x20\x63\x70\x75\x3b\0\x09\x74\x63\x74\
+\x78\x2d\x3e\x70\x72\x65\x76\x5f\x63\x70\x75\x20\x3d\x20\x70\x72\x65\x76\x5f\
+\x63\x70\x75\x3b\0\x09\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x61\x6e\
+\x64\x28\x70\x5f\x6d\x61\x73\x6b\x2c\x20\x70\x2d\x3e\x63\x70\x75\x73\x5f\x70\
+\x74\x72\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x70\x72\x69\x6d\x61\
+\x72\x79\x29\x29\x3b\0\x09\x69\x66\x20\x28\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\
+\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\x28\x74\x63\x74\x78\x2d\x3e\x61\
+\x74\x74\x61\x63\x68\x65\x64\x5f\x63\x6f\x72\x65\x2c\x20\x63\x61\x73\x74\x5f\
+\x6d\x61\x73\x6b\x28\x70\x5f\x6d\x61\x73\x6b\x29\x29\x20\x26\x26\0\x09\x20\x20\
+\x20\x20\x73\x63\x78\x5f\x62\x70\x66\x5f\x74\x65\x73\x74\x5f\x61\x6e\x64\x5f\
+\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\x5f\x69\x64\x6c\x65\x28\x74\x63\x74\x78\
+\x2d\x3e\x61\x74\x74\x61\x63\x68\x65\x64\x5f\x63\x6f\x72\x65\x29\x29\x20\x7b\0\
+\x09\x09\x63\x70\x75\x20\x3d\x20\x74\x63\x74\x78\x2d\x3e\x61\x74\x74\x61\x63\
+\x68\x65\x64\x5f\x63\x6f\x72\x65\x3b\0\x09\x69\x66\x20\x28\x70\x72\x65\x76\x5f\
+\x63\x70\x75\x20\x21\x3d\x20\x74\x63\x74\x78\x2d\x3e\x61\x74\x74\x61\x63\x68\
+\x65\x64\x5f\x63\x6f\x72\x65\x20\x26\x26\0\x09\x20\x20\x20\x20\x62\x70\x66\x5f\
+\x63\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\x28\x70\x72\
+\x65\x76\x5f\x63\x70\x75\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x70\
+\x5f\x6d\x61\x73\x6b\x29\x29\x20\x26\x26\0\x09\x20\x20\x20\x20\x73\x63\x78\x5f\
+\x62\x70\x66\x5f\x74\x65\x73\x74\x5f\x61\x6e\x64\x5f\x63\x6c\x65\x61\x72\x5f\
+\x63\x70\x75\x5f\x69\x64\x6c\x65\x28\x70\x72\x65\x76\x5f\x63\x70\x75\x29\x29\
+\x20\x7b\0\x09\x09\x63\x70\x75\x20\x3d\x20\x70\x72\x65\x76\x5f\x63\x70\x75\x3b\
+\0\x09\x09\x74\x63\x74\x78\x2d\x3e\x70\x72\x65\x76\x5f\x6d\x69\x73\x73\x65\x73\
+\x20\x3d\x20\x30\x3b\0\x09\x70\x63\x70\x75\x5f\x63\x74\x78\x20\x3d\x20\x62\x70\
+\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\
+\x70\x63\x70\x75\x5f\x63\x74\x78\x73\x2c\x20\x26\x63\x70\x75\x29\x3b\0\x09\x69\
+\x66\x20\x28\x70\x63\x70\x75\x5f\x63\x74\x78\x29\x20\x7b\0\x09\x09\x69\x66\x20\
+\x28\x70\x63\x70\x75\x5f\x63\x74\x78\x2d\x3e\x73\x63\x68\x65\x64\x75\x6c\x65\
+\x64\x5f\x63\x6f\x6d\x70\x61\x63\x74\x69\x6f\x6e\x29\x20\x7b\0\x09\x09\x09\x69\
+\x66\x20\x28\x62\x70\x66\x5f\x74\x69\x6d\x65\x72\x5f\x63\x61\x6e\x63\x65\x6c\
+\x28\x26\x70\x63\x70\x75\x5f\x63\x74\x78\x2d\x3e\x74\x69\x6d\x65\x72\x29\x20\
+\x3c\x20\x30\x29\0\x09\x09\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x65\x72\x72\
+\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x63\x61\x6e\x63\x65\
+\x6c\x20\x70\x63\x70\x75\x20\x74\x69\x6d\x65\x72\x22\x29\x3b\0\x09\x09\x09\x69\
+\x66\x20\x28\x62\x70\x66\x5f\x74\x69\x6d\x65\x72\x5f\x73\x65\x74\x5f\x63\x61\
+\x6c\x6c\x62\x61\x63\x6b\x28\x26\x70\x63\x70\x75\x5f\x63\x74\x78\x2d\x3e\x74\
+\x69\x6d\x65\x72\x2c\x20\x63\x6f\x6d\x70\x61\x63\x74\x5f\x70\x72\x69\x6d\x61\
+\x72\x79\x5f\x63\x6f\x72\x65\x29\x29\0\x09\x09\x09\x09\x73\x63\x78\x5f\x62\x70\
+\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\
+\x72\x65\x2d\x61\x72\x6d\x20\x70\x63\x70\x75\x20\x74\x69\x6d\x65\x72\x22\x29\
+\x3b\0\x09\x09\x09\x70\x63\x70\x75\x5f\x63\x74\x78\x2d\x3e\x73\x63\x68\x65\x64\
+\x75\x6c\x65\x64\x5f\x63\x6f\x6d\x70\x61\x63\x74\x69\x6f\x6e\x20\x3d\x20\x66\
+\x61\x6c\x73\x65\x3b\0\x09\x69\x66\x20\x28\x66\x69\x6e\x64\x5f\x66\x75\x6c\x6c\
+\x79\x5f\x69\x64\x6c\x65\x29\x20\x7b\0\x09\x09\x63\x70\x75\x20\x3d\x20\x73\x63\
+\x78\x5f\x62\x70\x66\x5f\x70\x69\x63\x6b\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\
+\x28\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x70\x5f\x6d\x61\x73\x6b\x29\x2c\0\
+\x09\x09\x69\x66\x20\x28\x63\x70\x75\x20\x3e\x3d\x20\x30\x29\x20\x7b\0\x09\x63\
+\x70\x75\x20\x3d\x20\x73\x63\x78\x5f\x62\x70\x66\x5f\x70\x69\x63\x6b\x5f\x69\
+\x64\x6c\x65\x5f\x63\x70\x75\x28\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x70\
+\x5f\x6d\x61\x73\x6b\x29\x2c\x20\x30\x29\x3b\0\x09\x69\x66\x20\x28\x63\x70\x75\
+\x20\x3e\x3d\x20\x30\x29\x20\x7b\0\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x65\
+\x72\x72\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\
+\x6b\x75\x70\x20\x70\x63\x70\x75\x20\x63\x74\x78\x22\x29\x3b\0\x09\x62\x70\x66\
+\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x73\x65\x74\x5f\x63\x70\x75\x28\x63\x70\
+\x75\x2c\x20\x70\x72\x69\x6d\x61\x72\x79\x29\x3b\0\x09\x69\x66\x20\x28\x62\x70\
+\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\x28\
+\x63\x70\x75\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x72\x65\x73\x65\
+\x72\x76\x65\x29\x29\x29\x20\x7b\0\x09\x09\x5f\x5f\x73\x79\x6e\x63\x5f\x73\x75\
+\x62\x5f\x61\x6e\x64\x5f\x66\x65\x74\x63\x68\x28\x26\x6e\x72\x5f\x72\x65\x73\
+\x65\x72\x76\x65\x64\x2c\x20\x31\x29\x3b\0\x09\x09\x62\x70\x66\x5f\x63\x70\x75\
+\x6d\x61\x73\x6b\x5f\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\x28\x63\x70\x75\x2c\
+\x20\x72\x65\x73\x65\x72\x76\x65\x29\x3b\0\x09\x69\x66\x20\x28\x74\x63\x74\x78\
+\x2d\x3e\x70\x72\x65\x76\x5f\x63\x70\x75\x20\x3d\x3d\x20\x6e\x65\x77\x5f\x63\
+\x70\x75\x29\0\x09\x75\x70\x64\x61\x74\x65\x5f\x61\x74\x74\x61\x63\x68\x65\x64\
+\x28\x74\x63\x74\x78\x2c\x20\x70\x72\x65\x76\x5f\x63\x70\x75\x2c\x20\x63\x70\
+\x75\x29\x3b\0\x09\x09\x74\x63\x74\x78\x2d\x3e\x61\x74\x74\x61\x63\x68\x65\x64\
+\x5f\x63\x6f\x72\x65\x20\x3d\x20\x6e\x65\x77\x5f\x63\x70\x75\x3b\x2f\x2f\x20\
+\xe5\xa6\x82\xe6\x9e\x9c\xe4\xbb\xbb\xe5\x8a\xa1\xe7\x9a\x84\xe4\xb8\x8a\xe4\
+\xb8\x80\xe6\xac\xa1\xe6\xa0\xb8\xe5\xbf\x83\xe4\xb8\x8e\xe5\xbd\x93\xe5\x89\
+\x8d\xe6\xa0\xb8\xe5\xbf\x83\xe7\x9b\xb8\xe5\x90\x8c\xef\xbc\x8c\xe5\x88\x99\
+\xe9\x99\x84\xe5\x8a\xa0\xe5\x88\xb0\xe5\xbd\x93\xe5\x89\x8d\xe6\xa0\xb8\xe5\
+\xbf\x83\0\x09\x74\x63\x74\x78\x2d\x3e\x70\x72\x65\x76\x5f\x63\x70\x75\x20\x3d\
+\x20\x70\x72\x65\x76\x5f\x63\x70\x75\x3b\x2f\x2f\x20\xe6\x9b\xb4\xe6\x96\xb0\
+\xe4\xbb\xbb\xe5\x8a\xa1\xe7\x9a\x84\xe4\xb8\x8a\xe4\xb8\x80\xe6\xac\xa1\xe6\
+\xa0\xb8\xe5\xbf\x83\xe8\xae\xb0\xe5\xbd\x95\0\x09\x69\x6e\x74\x20\x72\x65\x74\
+\x20\x3d\x20\x6f\x70\x65\x72\x61\x74\x65\x5f\x62\x61\x64\x5f\x67\x75\x79\x73\
+\x28\x70\x2c\x30\x29\x3b\0\x09\x69\x66\x28\x72\x65\x74\x20\x3d\x3d\x20\x31\x29\
+\0\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x64\x69\x73\x70\x61\x74\x63\x68\x28\
+\x70\x2c\x20\x53\x43\x58\x5f\x44\x53\x51\x5f\x4c\x4f\x43\x41\x4c\x5f\x4f\x4e\
+\x20\x7c\x20\x63\x70\x75\x20\x20\x2c\x20\x73\x6c\x69\x63\x65\x5f\x6e\x73\x2c\
+\x20\x30\x29\x3b\0\x09\x72\x65\x74\x75\x72\x6e\x20\x63\x70\x75\x3b\0\x09\x69\
+\x66\x20\x28\x72\x5f\x69\x6d\x70\x61\x74\x69\x65\x6e\x74\x20\x3e\x20\x30\x20\
+\x26\x26\x20\x2b\x2b\x74\x63\x74\x78\x2d\x3e\x70\x72\x65\x76\x5f\x6d\x69\x73\
+\x73\x65\x73\x20\x3e\x3d\x20\x72\x5f\x69\x6d\x70\x61\x74\x69\x65\x6e\x74\x29\
+\x20\x7b\0\x09\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x61\x6e\x64\x28\
+\x70\x5f\x6d\x61\x73\x6b\x2c\x20\x70\x2d\x3e\x63\x70\x75\x73\x5f\x70\x74\x72\
+\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x72\x65\x73\x65\x72\x76\x65\
+\x29\x29\x3b\0\x09\x63\x70\x75\x20\x3d\x20\x73\x63\x78\x5f\x62\x70\x66\x5f\x70\
+\x69\x63\x6b\x5f\x69\x64\x6c\x65\x5f\x63\x70\x75\x28\x70\x2d\x3e\x63\x70\x75\
+\x73\x5f\x70\x74\x72\x2c\x20\x30\x29\x3b\x2f\x2f\x20\xe4\xbb\x8e\xe4\xbb\xbb\
+\xe5\x8a\xa1\xe5\x85\x81\xe8\xae\xb8\xe7\x9a\x84\x20\x43\x50\x55\x20\xe9\x9b\
+\x86\xe5\x90\x88\xe4\xb8\xad\xe9\x80\x89\xe6\x8b\xa9\xe4\xbb\xbb\xe6\x84\x8f\
+\xe7\xa9\xba\xe9\x97\xb2\xe6\xa0\xb8\xe5\xbf\x83\0\x09\x09\x69\x66\x20\x28\x62\
+\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\
+\x28\x63\x70\x75\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x70\x72\x69\
+\x6d\x61\x72\x79\x29\x29\x29\x2f\x2f\x20\xe5\xa6\x82\xe6\x9e\x9c\xe6\xa0\xb8\
+\xe5\xbf\x83\xe5\xb1\x9e\xe4\xba\x8e\x20\x50\x72\x69\x6d\x61\x72\x79\x20\x4e\
+\x65\x73\x74\xef\xbc\x8c\xe7\x9b\xb4\xe6\x8e\xa5\xe8\xbf\x81\xe7\xa7\xbb\0\x09\
+\x09\x65\x6c\x73\x65\x20\x69\x66\x20\x28\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\
+\x73\x6b\x5f\x74\x65\x73\x74\x5f\x63\x70\x75\x28\x63\x70\x75\x2c\x20\x63\x61\
+\x73\x74\x5f\x6d\x61\x73\x6b\x28\x72\x65\x73\x65\x72\x76\x65\x29\x29\x29\x2f\
+\x2f\x20\xe5\xa6\x82\xe6\x9e\x9c\xe6\xa0\xb8\xe5\xbf\x83\xe5\xb1\x9e\xe4\xba\
+\x8e\x20\x52\x65\x73\x65\x72\x76\x65\x20\x4e\x65\x73\x74\xef\xbc\x8c\xe6\x8f\
+\x90\xe5\x8d\x87\xe5\x88\xb0\x20\x50\x72\x69\x6d\x61\x72\x79\x20\x4e\x65\x73\
+\x74\0\x09\x72\x65\x74\x75\x72\x6e\x20\x70\x72\x65\x76\x5f\x63\x70\x75\x3b\0\
+\x09\x73\x74\x72\x75\x63\x74\x20\x63\x70\x75\x5f\x6d\x61\x73\x6b\x5f\x64\x61\
+\x74\x61\x20\x2a\x62\x75\x66\x66\x20\x3d\x20\x62\x70\x66\x5f\x72\x69\x6e\x67\
+\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\x63\x70\x75\x5f\x6d\x61\
+\x73\x6b\x5f\x62\x75\x66\x66\x65\x72\x2c\x73\x69\x7a\x65\x6f\x66\x28\x73\x74\
+\x72\x75\x63\x74\x20\x63\x70\x75\x5f\x6d\x61\x73\x6b\x5f\x64\x61\x74\x61\x29\
+\x2c\x30\x29\x3b\0\x09\x69\x66\x28\x21\x62\x75\x66\x66\x29\x7b\0\x09\x09\x62\
+\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x63\x70\x75\x20\x6d\x61\x73\x6b\
+\x20\x72\x69\x6e\x67\x62\x75\x66\x20\x72\x65\x73\x65\x72\x76\x65\x20\x66\x61\
+\x69\x6c\x65\x64\x5c\x6e\x22\x29\x3b\0\x09\x62\x75\x66\x66\x2d\x3e\x73\x74\x61\
+\x74\x73\x5f\x70\x72\x69\x6d\x61\x72\x79\x5f\x6d\x61\x73\x6b\x20\x3d\x20\x73\
+\x74\x61\x74\x73\x5f\x70\x72\x69\x6d\x61\x72\x79\x5f\x6d\x61\x73\x6b\x3b\0\x09\
+\x62\x75\x66\x66\x2d\x3e\x73\x74\x61\x74\x73\x5f\x72\x65\x73\x65\x72\x76\x65\
+\x64\x5f\x6d\x61\x73\x6b\x20\x3d\x20\x73\x74\x61\x74\x73\x5f\x72\x65\x73\x65\
+\x72\x76\x65\x64\x5f\x6d\x61\x73\x6b\x3b\0\x09\x62\x75\x66\x66\x2d\x3e\x73\x74\
+\x61\x74\x73\x5f\x6f\x74\x68\x65\x72\x5f\x6d\x61\x73\x6b\x20\x3d\x20\x73\x74\
+\x61\x74\x73\x5f\x6f\x74\x68\x65\x72\x5f\x6d\x61\x73\x6b\x3b\0\x09\x62\x75\x66\
+\x66\x2d\x3e\x73\x74\x61\x74\x73\x5f\x69\x64\x6c\x65\x5f\x6d\x61\x73\x6b\x20\
+\x3d\x20\x73\x74\x61\x74\x73\x5f\x69\x64\x6c\x65\x5f\x6d\x61\x73\x6b\x3b\0\x09\
+\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x73\x75\x62\x6d\x69\x74\x28\
+\x62\x75\x66\x66\x2c\x30\x29\x3b\0\x76\x6f\x69\x64\x20\x42\x50\x46\x5f\x53\x54\
+\x52\x55\x43\x54\x5f\x4f\x50\x53\x28\x6e\x65\x73\x74\x5f\x65\x6e\x71\x75\x65\
+\x75\x65\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x73\x74\x72\
+\x75\x63\x74\x20\x2a\x70\x2c\x20\x75\x36\x34\x20\x65\x6e\x71\x5f\x66\x6c\x61\
+\x67\x73\x29\0\x09\x75\x36\x34\x20\x76\x74\x69\x6d\x65\x20\x3d\x20\x70\x2d\x3e\
+\x73\x63\x78\x2e\x64\x73\x71\x5f\x76\x74\x69\x6d\x65\x3b\x2f\x2f\x20\xe8\x8e\
+\xb7\xe5\x8f\x96\xe4\xbb\xbb\xe5\x8a\xa1\xe7\x9a\x84\xe8\x99\x9a\xe6\x8b\x9f\
+\xe6\x97\xb6\xe9\x97\xb4\0\x09\x69\x66\x20\x28\x21\x74\x63\x74\x78\x29\x20\x7b\
+\0\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x55\x6e\
+\x61\x62\x6c\x65\x20\x74\x6f\x20\x66\x69\x6e\x64\x20\x74\x61\x73\x6b\x20\x63\
+\x74\x78\x22\x29\x3b\0\x09\x09\x72\x65\x74\x75\x72\x6e\x3b\0\x09\x69\x66\x20\
+\x28\x76\x74\x69\x6d\x65\x5f\x62\x65\x66\x6f\x72\x65\x28\x76\x74\x69\x6d\x65\
+\x2c\x20\x76\x74\x69\x6d\x65\x5f\x6e\x6f\x77\x20\x2d\x20\x73\x6c\x69\x63\x65\
+\x5f\x6e\x73\x29\x29\0\x09\x09\x76\x74\x69\x6d\x65\x20\x3d\x20\x76\x74\x69\x6d\
+\x65\x5f\x6e\x6f\x77\x20\x2d\x20\x73\x6c\x69\x63\x65\x5f\x6e\x73\x3b\0\x09\x69\
+\x6e\x74\x20\x72\x65\x74\x20\x3d\x20\x6f\x70\x65\x72\x61\x74\x65\x5f\x62\x61\
+\x64\x5f\x67\x75\x79\x73\x28\x70\x2c\x65\x6e\x71\x5f\x66\x6c\x61\x67\x73\x29\
+\x3b\0\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x64\x69\x73\x70\x61\x74\x63\x68\
+\x5f\x76\x74\x69\x6d\x65\x28\x70\x2c\x20\x46\x41\x4c\x4c\x42\x41\x43\x4b\x5f\
+\x44\x53\x51\x5f\x49\x44\x2c\x20\x73\x6c\x69\x63\x65\x5f\x6e\x73\x2c\x20\x76\
+\x74\x69\x6d\x65\x2c\0\x09\x72\x65\x73\x65\x72\x76\x65\x20\x3d\x20\x72\x65\x73\
+\x65\x72\x76\x65\x5f\x63\x70\x75\x6d\x61\x73\x6b\x3b\0\x76\x6f\x69\x64\x20\x42\
+\x50\x46\x5f\x53\x54\x52\x55\x43\x54\x5f\x4f\x50\x53\x28\x6e\x65\x73\x74\x5f\
+\x64\x69\x73\x70\x61\x74\x63\x68\x2c\x20\x73\x33\x32\x20\x63\x70\x75\x2c\x20\
+\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\x20\
+\x2a\x70\x72\x65\x76\x29\0\x09\x73\x33\x32\x20\x6b\x65\x79\x20\x3d\x20\x63\x70\
+\x75\x3b\0\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\
+\x4e\x6f\x20\x70\x72\x69\x6d\x61\x72\x79\x20\x6f\x72\x20\x72\x65\x73\x65\x72\
+\x76\x65\x20\x63\x70\x75\x6d\x61\x73\x6b\x22\x29\x3b\0\x09\x70\x63\x70\x75\x5f\
+\x63\x74\x78\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\
+\x70\x5f\x65\x6c\x65\x6d\x28\x26\x70\x63\x70\x75\x5f\x63\x74\x78\x73\x2c\x20\
+\x26\x6b\x65\x79\x29\x3b\0\x09\x69\x66\x20\x28\x21\x73\x63\x78\x5f\x62\x70\x66\
+\x5f\x63\x6f\x6e\x73\x75\x6d\x65\x28\x46\x41\x4c\x4c\x42\x41\x43\x4b\x5f\x44\
+\x53\x51\x5f\x49\x44\x29\x29\x20\x7b\0\x09\x09\x69\x6e\x5f\x70\x72\x69\x6d\x61\
+\x72\x79\x20\x3d\x20\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x74\x65\
+\x73\x74\x5f\x63\x70\x75\x28\x63\x70\x75\x2c\x20\x63\x61\x73\x74\x5f\x6d\x61\
+\x73\x6b\x28\x70\x72\x69\x6d\x61\x72\x79\x29\x29\x3b\0\x09\x09\x69\x66\x20\x28\
+\x70\x72\x65\x76\x20\x26\x26\x20\x28\x70\x72\x65\x76\x2d\x3e\x73\x63\x78\x2e\
+\x66\x6c\x61\x67\x73\x20\x26\x20\x53\x43\x58\x5f\x54\x41\x53\x4b\x5f\x51\x55\
+\x45\x55\x45\x44\x29\x20\x26\x26\x20\x69\x6e\x5f\x70\x72\x69\x6d\x61\x72\x79\
+\x29\x20\x7b\0\x09\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x64\x69\x73\x70\x61\
+\x74\x63\x68\x28\x70\x72\x65\x76\x2c\x20\x53\x43\x58\x5f\x44\x53\x51\x5f\x4c\
+\x4f\x43\x41\x4c\x2c\x20\x73\x6c\x69\x63\x65\x5f\x6e\x73\x2c\x20\x30\x29\x3b\0\
+\x09\x09\x09\x72\x65\x74\x75\x72\x6e\x3b\0\x09\x09\x69\x66\x20\x28\x69\x6e\x5f\
+\x70\x72\x69\x6d\x61\x72\x79\x29\x20\x7b\x20\x2f\x2f\x20\xe5\xa6\x82\xe6\x9e\
+\x9c\xe6\xa0\xb8\xe5\xbf\x83\xe5\x9c\xa8\x20\x50\x72\x69\x6d\x61\x72\x79\x20\
+\x4e\x65\x73\x74\0\x09\x09\x09\x69\x66\x20\x28\x28\x70\x72\x65\x76\x20\x26\x26\
+\x20\x70\x72\x65\x76\x2d\x3e\x5f\x5f\x73\x74\x61\x74\x65\x20\x3d\x3d\x20\x54\
+\x41\x53\x4b\x5f\x44\x45\x41\x44\x29\x20\x26\x26\0\x09\x09\x09\x20\x20\x20\x20\
+\x28\x63\x70\x75\x20\x21\x3d\x20\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\
+\x5f\x66\x69\x72\x73\x74\x28\x63\x61\x73\x74\x5f\x6d\x61\x73\x6b\x28\x70\x72\
+\x69\x6d\x61\x72\x79\x29\x29\x29\x29\x20\x7b\0\x09\x09\x09\x09\x62\x70\x66\x5f\
+\x63\x70\x75\x6d\x61\x73\x6b\x5f\x63\x6c\x65\x61\x72\x5f\x63\x70\x75\x28\x63\
+\x70\x75\x2c\x20\x70\x72\x69\x6d\x61\x72\x79\x29\x3b\x2f\x2f\x20\xe4\xbb\x8e\
+\x20\x50\x72\x69\x6d\x61\x72\x79\x20\x4e\x65\x73\x74\x20\xe4\xb8\xad\xe7\xa7\
+\xbb\xe9\x99\xa4\xe6\xa0\xb8\xe5\xbf\x83\0\x09\x09\x09\x09\x70\x63\x70\x75\x5f\
+\x63\x74\x78\x2d\x3e\x73\x63\x68\x65\x64\x75\x6c\x65\x64\x5f\x63\x6f\x6d\x70\
+\x61\x63\x74\x69\x6f\x6e\x20\x3d\x20\x74\x72\x75\x65\x3b\x2f\x2f\x20\xe6\xa0\
+\x87\xe8\xae\xb0\xe6\xa0\xb8\xe5\xbf\x83\xe9\x9c\x80\xe8\xa6\x81\xe5\x8e\x8b\
+\xe7\xbc\xa9\0\x09\x09\x09\x09\x62\x70\x66\x5f\x74\x69\x6d\x65\x72\x5f\x73\x74\
+\x61\x72\x74\x28\x26\x70\x63\x70\x75\x5f\x63\x74\x78\x2d\x3e\x74\x69\x6d\x65\
+\x72\x2c\x20\x70\x5f\x72\x65\x6d\x6f\x76\x65\x5f\x6e\x73\x2c\0\x76\x6f\x69\x64\
+\x20\x42\x50\x46\x5f\x53\x54\x52\x55\x43\x54\x5f\x4f\x50\x53\x28\x6e\x65\x73\
+\x74\x5f\x72\x75\x6e\x6e\x69\x6e\x67\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x74\
+\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\x20\x2a\x70\x29\0\x09\x69\x66\x20\x28\
+\x76\x74\x69\x6d\x65\x5f\x62\x65\x66\x6f\x72\x65\x28\x76\x74\x69\x6d\x65\x5f\
+\x6e\x6f\x77\x2c\x20\x70\x2d\x3e\x73\x63\x78\x2e\x64\x73\x71\x5f\x76\x74\x69\
+\x6d\x65\x29\x29\0\x09\x09\x76\x74\x69\x6d\x65\x5f\x6e\x6f\x77\x20\x3d\x20\x70\
+\x2d\x3e\x73\x63\x78\x2e\x64\x73\x71\x5f\x76\x74\x69\x6d\x65\x3b\0\x76\x6f\x69\
+\x64\x20\x42\x50\x46\x5f\x53\x54\x52\x55\x43\x54\x5f\x4f\x50\x53\x28\x6e\x65\
+\x73\x74\x5f\x73\x74\x6f\x70\x70\x69\x6e\x67\x2c\x20\x73\x74\x72\x75\x63\x74\
+\x20\x74\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\x20\x2a\x70\x2c\x20\x62\x6f\
+\x6f\x6c\x20\x72\x75\x6e\x6e\x61\x62\x6c\x65\x29\0\x09\x70\x2d\x3e\x73\x63\x78\
+\x2e\x64\x73\x71\x5f\x76\x74\x69\x6d\x65\x20\x2b\x3d\x20\x28\x73\x6c\x69\x63\
+\x65\x5f\x6e\x73\x20\x2d\x20\x70\x2d\x3e\x73\x63\x78\x2e\x73\x6c\x69\x63\x65\
+\x29\x20\x2a\x20\x31\x30\x30\x20\x2f\x20\x70\x2d\x3e\x73\x63\x78\x2e\x77\x65\
+\x69\x67\x68\x74\x3b\0\x73\x33\x32\x20\x42\x50\x46\x5f\x53\x54\x52\x55\x43\x54\
+\x5f\x4f\x50\x53\x28\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\
+\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\x73\x6b\x5f\x73\x74\x72\x75\x63\
+\x74\x20\x2a\x70\x2c\0\x09\x74\x63\x74\x78\x20\x3d\x20\x62\x70\x66\x5f\x74\x61\
+\x73\x6b\x5f\x73\x74\x6f\x72\x61\x67\x65\x5f\x67\x65\x74\x28\x26\x74\x61\x73\
+\x6b\x5f\x63\x74\x78\x5f\x73\x74\x6f\x72\x2c\x20\x70\x2c\x20\x30\x2c\0\x09\x63\
+\x70\x75\x6d\x61\x73\x6b\x20\x3d\x20\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\
+\x6b\x5f\x63\x72\x65\x61\x74\x65\x28\x29\x3b\0\x09\x69\x66\x20\x28\x21\x63\x70\
+\x75\x6d\x61\x73\x6b\x29\0\x09\x63\x70\x75\x6d\x61\x73\x6b\x20\x3d\x20\x62\x70\
+\x66\x5f\x6b\x70\x74\x72\x5f\x78\x63\x68\x67\x28\x26\x74\x63\x74\x78\x2d\x3e\
+\x74\x6d\x70\x5f\x6d\x61\x73\x6b\x2c\x20\x63\x70\x75\x6d\x61\x73\x6b\x29\x3b\0\
+\x09\x69\x66\x20\x28\x63\x70\x75\x6d\x61\x73\x6b\x29\0\x09\x09\x62\x70\x66\x5f\
+\x63\x70\x75\x6d\x61\x73\x6b\x5f\x72\x65\x6c\x65\x61\x73\x65\x28\x63\x70\x75\
+\x6d\x61\x73\x6b\x29\x3b\0\x09\x74\x63\x74\x78\x2d\x3e\x70\x72\x65\x76\x5f\x63\
+\x70\x75\x20\x3d\x20\x2d\x31\x3b\0\x09\x74\x63\x74\x78\x2d\x3e\x61\x74\x74\x61\
+\x63\x68\x65\x64\x5f\x63\x6f\x72\x65\x20\x3d\x20\x2d\x31\x3b\0\x76\x6f\x69\x64\
+\x20\x42\x50\x46\x5f\x53\x54\x52\x55\x43\x54\x5f\x4f\x50\x53\x28\x6e\x65\x73\
+\x74\x5f\x65\x6e\x61\x62\x6c\x65\x2c\x20\x73\x74\x72\x75\x63\x74\x20\x74\x61\
+\x73\x6b\x5f\x73\x74\x72\x75\x63\x74\x20\x2a\x70\x29\0\x09\x70\x2d\x3e\x73\x63\
+\x78\x2e\x64\x73\x71\x5f\x76\x74\x69\x6d\x65\x20\x3d\x20\x76\x74\x69\x6d\x65\
+\x5f\x6e\x6f\x77\x3b\0\x73\x33\x32\x20\x42\x50\x46\x5f\x53\x54\x52\x55\x43\x54\
+\x5f\x4f\x50\x53\x5f\x53\x4c\x45\x45\x50\x41\x42\x4c\x45\x28\x6e\x65\x73\x74\
+\x5f\x69\x6e\x69\x74\x29\0\x09\x75\x33\x32\x20\x6b\x65\x79\x20\x3d\x20\x30\x3b\
+\0\x09\x65\x72\x72\x20\x3d\x20\x73\x63\x78\x5f\x62\x70\x66\x5f\x63\x72\x65\x61\
+\x74\x65\x5f\x64\x73\x71\x28\x46\x41\x4c\x4c\x42\x41\x43\x4b\x5f\x44\x53\x51\
+\x5f\x49\x44\x2c\x20\x4e\x55\x4d\x41\x5f\x4e\x4f\x5f\x4e\x4f\x44\x45\x29\x3b\0\
+\x09\x69\x66\x20\x28\x65\x72\x72\x29\x20\x7b\0\x09\x09\x73\x63\x78\x5f\x62\x70\
+\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\
+\x63\x72\x65\x61\x74\x65\x20\x66\x61\x6c\x6c\x62\x61\x63\x6b\x20\x44\x53\x51\
+\x22\x29\x3b\0\x09\x62\x70\x66\x5f\x63\x70\x75\x6d\x61\x73\x6b\x5f\x63\x6c\x65\
+\x61\x72\x28\x63\x70\x75\x6d\x61\x73\x6b\x29\x3b\0\x09\x63\x70\x75\x6d\x61\x73\
+\x6b\x20\x3d\x20\x62\x70\x66\x5f\x6b\x70\x74\x72\x5f\x78\x63\x68\x67\x28\x26\
+\x70\x72\x69\x6d\x61\x72\x79\x5f\x63\x70\x75\x6d\x61\x73\x6b\x2c\x20\x63\x70\
+\x75\x6d\x61\x73\x6b\x29\x3b\0\x09\x63\x70\x75\x6d\x61\x73\x6b\x20\x3d\x20\x62\
+\x70\x66\x5f\x6b\x70\x74\x72\x5f\x78\x63\x68\x67\x28\x26\x72\x65\x73\x65\x72\
+\x76\x65\x5f\x63\x70\x75\x6d\x61\x73\x6b\x2c\x20\x63\x70\x75\x6d\x61\x73\x6b\
+\x29\x3b\0\x09\x09\x73\x33\x32\x20\x6b\x65\x79\x20\x3d\x20\x63\x70\x75\x3b\0\
+\x09\x09\x73\x74\x72\x75\x63\x74\x20\x70\x63\x70\x75\x5f\x63\x74\x78\x20\x2a\
+\x63\x74\x78\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\
+\x70\x5f\x65\x6c\x65\x6d\x28\x26\x70\x63\x70\x75\x5f\x63\x74\x78\x73\x2c\x20\
+\x26\x6b\x65\x79\x29\x3b\0\x09\x09\x69\x66\x20\x28\x21\x63\x74\x78\x29\x20\x7b\
+\0\x09\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x46\
+\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x70\x63\x70\
+\x75\x5f\x63\x74\x78\x22\x29\x3b\0\x09\x09\x63\x74\x78\x2d\x3e\x73\x63\x68\x65\
+\x64\x75\x6c\x65\x64\x5f\x63\x6f\x6d\x70\x61\x63\x74\x69\x6f\x6e\x20\x3d\x20\
+\x66\x61\x6c\x73\x65\x3b\0\x09\x09\x69\x66\x20\x28\x62\x70\x66\x5f\x74\x69\x6d\
+\x65\x72\x5f\x69\x6e\x69\x74\x28\x26\x63\x74\x78\x2d\x3e\x74\x69\x6d\x65\x72\
+\x2c\x20\x26\x70\x63\x70\x75\x5f\x63\x74\x78\x73\x2c\x20\x43\x4c\x4f\x43\x4b\
+\x5f\x42\x4f\x4f\x54\x54\x49\x4d\x45\x29\x29\x20\x7b\0\x09\x09\x09\x73\x63\x78\
+\x5f\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\
+\x74\x6f\x20\x69\x6e\x69\x74\x69\x61\x6c\x69\x7a\x65\x20\x70\x63\x70\x75\x20\
+\x74\x69\x6d\x65\x72\x22\x29\x3b\0\x09\x09\x09\x73\x63\x78\x5f\x62\x70\x66\x5f\
+\x65\x72\x72\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\x74\x6f\x20\x73\x65\
+\x74\x20\x70\x63\x70\x75\x20\x74\x69\x6d\x65\x72\x20\x63\x61\x6c\x6c\x62\x61\
+\x63\x6b\x22\x29\x3b\0\x09\x09\x65\x72\x72\x20\x3d\x20\x62\x70\x66\x5f\x74\x69\
+\x6d\x65\x72\x5f\x73\x65\x74\x5f\x63\x61\x6c\x6c\x62\x61\x63\x6b\x28\x26\x63\
+\x74\x78\x2d\x3e\x74\x69\x6d\x65\x72\x2c\x20\x63\x6f\x6d\x70\x61\x63\x74\x5f\
+\x70\x72\x69\x6d\x61\x72\x79\x5f\x63\x6f\x72\x65\x29\x3b\0\x09\x09\x69\x66\x20\
+\x28\x65\x72\x72\x29\x20\x7b\0\x09\x74\x69\x6d\x65\x72\x20\x3d\x20\x62\x70\x66\
+\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x73\
+\x74\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\x2c\x20\x26\x6b\x65\x79\x29\x3b\0\x09\
+\x69\x66\x20\x28\x21\x74\x69\x6d\x65\x72\x29\x20\x7b\0\x09\x09\x73\x63\x78\x5f\
+\x62\x70\x66\x5f\x65\x72\x72\x6f\x72\x28\x22\x46\x61\x69\x6c\x65\x64\x20\x74\
+\x6f\x20\x6c\x6f\x6f\x6b\x75\x70\x20\x63\x65\x6e\x74\x72\x61\x6c\x20\x74\x69\
+\x6d\x65\x72\x22\x29\x3b\0\x09\x09\x72\x65\x74\x75\x72\x6e\x20\x2d\x45\x53\x52\
+\x43\x48\x3b\0\x09\x62\x70\x66\x5f\x74\x69\x6d\x65\x72\x5f\x69\x6e\x69\x74\x28\
+\x74\x69\x6d\x65\x72\x2c\x20\x26\x73\x74\x61\x74\x73\x5f\x74\x69\x6d\x65\x72\
+\x2c\x20\x43\x4c\x4f\x43\x4b\x5f\x42\x4f\x4f\x54\x54\x49\x4d\x45\x29\x3b\0\x09\
+\x62\x70\x66\x5f\x74\x69\x6d\x65\x72\x5f\x73\x65\x74\x5f\x63\x61\x6c\x6c\x62\
+\x61\x63\x6b\x28\x74\x69\x6d\x65\x72\x2c\x20\x73\x74\x61\x74\x73\x5f\x74\x69\
+\x6d\x65\x72\x66\x6e\x29\x3b\0\x76\x6f\x69\x64\x20\x42\x50\x46\x5f\x53\x54\x52\
+\x55\x43\x54\x5f\x4f\x50\x53\x28\x6e\x65\x73\x74\x5f\x65\x78\x69\x74\x2c\x20\
+\x73\x74\x72\x75\x63\x74\x20\x73\x63\x78\x5f\x65\x78\x69\x74\x5f\x69\x6e\x66\
+\x6f\x20\x2a\x65\x69\x29\0\x09\x55\x45\x49\x5f\x52\x45\x43\x4f\x52\x44\x28\x75\
+\x65\x69\x2c\x20\x65\x69\x29\x3b\0\x30\x3a\x35\0\x30\x3a\x31\x32\x37\0\x30\x3a\
+\x39\x32\0\x30\x3a\x39\x33\0\x30\x3a\x32\x33\x3a\x31\x38\0\x30\x3a\x33\x37\0\
+\x30\x3a\x32\x33\x3a\x35\0\x30\x3a\x31\0\x30\x3a\x32\x33\x3a\x31\x37\0\x30\x3a\
+\x32\x33\x3a\x36\0\x30\x3a\x32\0\x30\x3a\x36\0\x30\x3a\x30\0\x6c\x69\x63\x65\
+\x6e\x73\x65\0\x2e\x72\x6f\x64\x61\x74\x61\0\x2e\x6d\x61\x70\x73\0\x2e\x62\x73\
+\x73\0\x2e\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2e\x6c\x69\x6e\x6b\0\x2e\
+\x64\x61\x74\x61\x2e\x75\x65\x69\x5f\x64\x75\x6d\x70\0\x2e\x64\x61\x74\x61\0\
+\x2e\x64\x61\x74\x61\x2e\x4e\x45\x53\x54\x53\0\x2e\x6b\x73\x79\x6d\x73\0\x2e\
+\x74\x65\x78\x74\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\
+\x5f\x73\x65\x6c\x65\x63\x74\x5f\x63\x70\x75\0\x73\x74\x72\x75\x63\x74\x5f\x6f\
+\x70\x73\x2f\x6e\x65\x73\x74\x5f\x65\x6e\x71\x75\x65\x75\x65\0\x73\x74\x72\x75\
+\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x64\x69\x73\x70\x61\x74\x63\
+\x68\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x72\x75\
+\x6e\x6e\x69\x6e\x67\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\
+\x74\x5f\x73\x74\x6f\x70\x70\x69\x6e\x67\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\
+\x73\x2f\x6e\x65\x73\x74\x5f\x69\x6e\x69\x74\x5f\x74\x61\x73\x6b\0\x73\x74\x72\
+\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\x65\x6e\x61\x62\x6c\x65\0\
+\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2e\x73\x2f\x6e\x65\x73\x74\x5f\x69\
+\x6e\x69\x74\0\x73\x74\x72\x75\x63\x74\x5f\x6f\x70\x73\x2f\x6e\x65\x73\x74\x5f\
+\x65\x78\x69\x74\0\0\0\0\0\x9f\xeb\x01\0\x20\0\0\0\0\0\0\0\xcc\0\0\0\xcc\0\0\0\
+\x8c\x19\0\0\x58\x1a\0\0\xd4\x01\0\0\x08\0\0\0\x5c\x5f\0\0\x04\0\0\0\0\0\0\0\
+\x57\0\0\0\x10\0\0\0\xe6\x01\0\0\xe8\x02\0\0\xe8\x01\0\0\xc8\x06\0\0\xe9\x01\0\
+\0\x62\x5f\0\0\x01\0\0\0\0\0\0\0\x5a\0\0\0\x7d\x5f\0\0\x01\0\0\0\0\0\0\0\xbd\
+\x01\0\0\x95\x5f\0\0\x01\0\0\0\0\0\0\0\xc0\x01\0\0\xae\x5f\0\0\x01\0\0\0\0\0\0\
+\0\xc5\x01\0\0\xc6\x5f\0\0\x01\0\0\0\0\0\0\0\xc6\x01\0\0\xdf\x5f\0\0\x01\0\0\0\
+\0\0\0\0\xc7\x01\0\0\xf9\x5f\0\0\x01\0\0\0\0\0\0\0\xcc\x01\0\0\x10\x60\0\0\x01\
+\0\0\0\0\0\0\0\xcd\x01\0\0\x27\x60\0\0\x01\0\0\0\0\0\0\0\xda\x01\0\0\x81\x1e\0\
+\0\x01\0\0\0\0\0\0\0\xe3\x01\0\0\x10\0\0\0\x5c\x5f\0\0\x66\0\0\0\0\0\0\0\x56\
+\x3d\0\0\x94\x3d\0\0\0\x0c\x05\0\x08\0\0\0\x56\x3d\0\0\xce\x3d\0\0\x02\x14\x05\
+\0\x10\0\0\0\xf4\x3d\0\0\x2a\x3e\0\0\x0c\x68\x04\0\x18\0\0\0\xf4\x3d\0\0\x2a\
+\x3e\0\0\x06\x68\x04\0\x40\0\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\x58\0\0\
+\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x60\0\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\
+\x8c\x03\0\x88\0\0\0\xf4\x3d\0\0\x9c\x3e\0\0\x0d\x8c\x04\0\xa8\0\0\0\xf4\x3d\0\
+\0\xf0\x3e\0\0\x06\x90\x04\0\xb8\0\0\0\xf4\x3d\0\0\x02\x3f\0\0\x03\x94\x04\0\
+\xf0\0\0\0\xf4\x3d\0\0\x5f\x3f\0\0\x03\x98\x04\0\xf8\0\0\0\xf4\x3d\0\0\x6b\x3f\
+\0\0\x02\xa0\x04\0\0\x01\0\0\xf4\x3d\0\0\x99\x3f\0\0\x0c\xa4\x04\0\x18\x01\0\0\
+\xf4\x3d\0\0\xdc\x3f\0\0\x0f\xac\x04\0\x48\x01\0\0\xf4\x3d\0\0\xf9\x3f\0\0\x03\
+\xb0\x04\0\x80\x01\0\0\xf4\x3d\0\0\x67\x40\0\0\x03\xb4\x04\0\x88\x01\0\0\xf4\
+\x3d\0\0\x5f\x3f\0\0\x03\xb8\x04\0\x90\x01\0\0\xf4\x3d\0\0\x80\x40\0\0\x18\xc8\
+\x04\0\x98\x01\0\0\xf4\x3d\0\0\x80\x40\0\0\x02\xc8\x04\0\xa0\x01\0\0\xf4\x3d\0\
+\0\xa6\x40\0\0\x19\xd0\x04\0\xa8\x01\0\0\xf4\x3d\0\0\xd4\x40\0\0\x18\xec\x03\0\
+\xc0\x01\0\0\xf4\x3d\0\0\xf5\x40\0\0\x14\xe0\x03\0\xe8\x01\0\0\xf4\x3d\0\0\xd4\
+\x40\0\0\x16\xec\x03\0\xf8\x01\0\0\xf4\x3d\0\0\x15\x41\0\0\x03\0\x04\0\0\x02\0\
+\0\xf4\x3d\0\0\x62\x41\0\0\x03\x04\x04\0\x30\x02\0\0\xf4\x3d\0\0\x51\x3e\0\0\
+\x0f\x84\x03\0\x48\x02\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x50\x02\0\0\
+\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\x58\x02\0\0\xf4\x3d\0\0\xb2\x41\0\0\x03\
+\x1c\x04\0\x88\x02\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\xa0\x02\0\0\xf4\
+\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\xa8\x02\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\
+\x03\0\xc0\x02\0\0\xf4\x3d\0\0\x04\x42\0\0\x02\xd4\x04\0\xd0\x02\0\0\xf4\x3d\0\
+\0\x25\x42\0\0\x21\xe0\x04\0\xd8\x02\0\0\xf4\x3d\0\0\x4e\x42\0\0\x01\xe8\x04\0\
+\xe8\x02\0\0\xf4\x3d\0\0\x50\x42\0\0\0\xf4\x04\0\xf8\x02\0\0\xf4\x3d\0\0\x92\
+\x42\0\0\x08\xfc\x04\0\0\x03\0\0\xf4\x3d\0\0\x92\x42\0\0\x0e\xfc\x04\0\x40\x03\
+\0\0\xf4\x3d\0\0\xad\x42\0\0\x02\x08\x05\0\x58\x03\0\0\xf4\x3d\0\0\xec\x42\0\0\
+\x0f\x10\x05\0\x60\x03\0\0\xf4\x3d\0\0\xec\x42\0\0\x06\x10\x05\0\x68\x03\0\0\
+\xf4\x3d\0\0\xff\x42\0\0\x10\x14\x05\0\x70\x03\0\0\xf4\x3d\0\0\xff\x42\0\0\x06\
+\x14\x05\0\x78\x03\0\0\xf4\x3d\0\0\x14\x43\0\0\x0f\x20\x05\0\xa8\x03\0\0\xf4\
+\x3d\0\0\x4f\x43\0\0\x05\x24\x05\0\xc0\x03\0\0\xf4\x3d\0\0\x5b\x43\0\0\x0a\x3c\
+\x05\0\xe8\x03\0\0\xf4\x3d\0\0\x4f\x43\0\0\x05\x40\x05\0\xf0\x03\0\0\xf4\x3d\0\
+\0\x8e\x43\0\0\x05\x4c\x05\0\x20\x04\0\0\xf4\x3d\0\0\xa3\x43\0\0\x0b\x50\x05\0\
+\x48\x04\0\0\xf4\x3d\0\0\xd8\x43\0\0\x06\x54\x05\0\x60\x04\0\0\xf4\x3d\0\0\xe5\
+\x43\0\0\x0a\x6c\x05\0\x90\x04\0\0\xf4\x3d\0\0\x1e\x44\0\0\x0d\x70\x05\0\xb8\
+\x04\0\0\xf4\x3d\0\0\x8e\x43\0\0\x05\x78\x05\0\xe8\x04\0\0\xf4\x3d\0\0\x57\x44\
+\0\0\x10\x7c\x05\0\x18\x05\0\0\xf4\x3d\0\0\x94\x44\0\0\x0b\x84\x05\0\x38\x05\0\
+\0\xf4\x3d\0\0\xba\x44\0\0\x16\x88\x05\0\x40\x05\0\0\xf4\x3d\0\0\xf8\x44\0\0\
+\x27\x8c\x05\0\x58\x05\0\0\xf4\x3d\0\0\xf8\x44\0\0\x1b\x8c\x05\0\x70\x05\0\0\
+\xf4\x3d\0\0\xf8\x44\0\0\x25\x8c\x05\0\x80\x05\0\0\xf4\x3d\0\0\x29\x45\0\0\x11\
+\xa4\x03\0\x88\x05\0\0\xf4\x3d\0\0\xf8\x44\0\0\x07\x8c\x05\0\x90\x05\0\0\xf4\
+\x3d\0\0\x43\x45\0\0\x18\x90\x05\0\xa0\x05\0\0\xf4\x3d\0\0\x64\x45\0\0\x06\xa8\
+\x05\0\xb8\x05\0\0\xf4\x3d\0\0\x73\x45\0\0\x25\xac\x05\0\xe0\x05\0\0\xf4\x3d\0\
+\0\xbf\x45\0\0\x05\xb0\x05\0\xf8\x05\0\0\xf4\x3d\0\0\xcd\x45\0\0\x0b\xb4\x05\0\
+\x10\x06\0\0\xf4\x3d\0\0\xd8\x43\0\0\x06\xb8\x05\0\x18\x06\0\0\xf4\x3d\0\0\xfa\
+\x45\0\0\x17\xbc\x05\0\x20\x06\0\0\xf4\x3d\0\0\x39\x46\0\0\x28\xc0\x05\0\x38\
+\x06\0\0\xf4\x3d\0\0\x39\x46\0\0\x1c\xc0\x05\0\x50\x06\0\0\xf4\x3d\0\0\x39\x46\
+\0\0\x26\xc0\x05\0\x60\x06\0\0\xf4\x3d\0\0\x29\x45\0\0\x11\xa4\x03\0\x68\x06\0\
+\0\xf4\x3d\0\0\x39\x46\0\0\x08\xc0\x05\0\xc0\x06\0\0\xf4\x3d\0\0\x4e\x42\0\0\
+\x01\xe4\x05\0\xc8\x06\0\0\xf4\x3d\0\0\x6b\x46\0\0\0\xa4\x0b\0\xd0\x06\0\0\xf4\
+\x3d\0\0\xb2\x46\0\0\x16\xbc\x0b\0\xf0\x06\0\0\xf4\x3d\0\0\xcc\x46\0\0\x15\xb8\
+\x0b\0\x08\x07\0\0\xf4\x3d\0\0\xe5\x46\0\0\x13\xc0\x0b\0\x20\x07\0\0\xf4\x3d\0\
+\0\xfc\x46\0\0\x12\xc4\x0b\0\x38\x07\0\0\xf4\x3d\0\0\x12\x47\0\0\x02\xd0\x0b\0\
+\x40\x07\0\0\xf4\x3d\0\0\x28\x47\0\0\x0c\xd4\x0b\0\x58\x07\0\0\xf4\x3d\0\0\xdc\
+\x3f\0\0\x0f\xdc\x0b\0\x88\x07\0\0\xf4\x3d\0\0\x67\x40\0\0\x03\xe0\x0b\0\x90\
+\x07\0\0\xf4\x3d\0\0\x44\x47\0\0\x03\xe4\x0b\0\xc8\x07\0\0\xf4\x3d\0\0\x7c\x47\
+\0\0\x09\xf4\x0b\0\xd8\x07\0\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xf8\x0b\0\x18\x08\0\
+\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xf8\x0b\0\x58\x08\0\0\xf4\x3d\0\0\xa0\x47\0\0\
+\x02\xf8\x0b\0\x70\x08\0\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xf8\x0b\0\x78\x08\0\0\
+\xf4\x3d\0\0\xbc\x47\0\0\x02\x24\x0c\0\x80\x08\0\0\xf4\x3d\0\0\xd4\x47\0\0\x02\
+\x28\x0c\0\x90\x08\0\0\xf4\x3d\0\0\xf5\x47\0\0\x1f\x30\x0c\0\xa8\x08\0\0\xf4\
+\x3d\0\0\xf5\x47\0\0\x33\x30\x0c\0\xb8\x08\0\0\xf4\x3d\0\0\xf5\x47\0\0\x08\x30\
+\x0c\0\xd0\x08\0\0\xf4\x3d\0\0\x33\x48\0\0\x06\x34\x0c\0\xe0\x08\0\0\xf4\x3d\0\
+\0\x3d\x48\0\0\x07\xfc\x0b\0\x18\x09\0\0\xf4\x3d\0\0\x72\x48\0\0\x0c\x04\x0c\0\
+\x88\x09\0\0\xf4\x3d\0\0\xac\x48\0\0\x07\x18\x0c\0\xc0\x09\0\0\xf4\x3d\0\0\xd3\
+\x48\0\0\x14\x1c\x0c\0\xe8\x09\0\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xf8\x0b\0\0\x0a\
+\0\0\xf4\x3d\0\0\xf8\x48\0\0\x03\x38\x0c\0\x38\x0a\0\0\xf4\x3d\0\0\x4e\x42\0\0\
+\x01\x44\x0c\0\x62\x5f\0\0\x85\0\0\0\0\0\0\0\xf4\x3d\0\0\x26\x49\0\0\x05\xec\
+\x05\0\x18\0\0\0\xf4\x3d\0\0\x6f\x49\0\0\x09\x14\x06\0\x58\0\0\0\xf4\x3d\0\0\
+\xa6\x49\0\0\x06\x18\x06\0\x60\0\0\0\xf4\x3d\0\0\x12\x47\0\0\x02\x28\x06\0\x68\
+\0\0\0\xf4\x3d\0\0\xb2\x49\0\0\x11\x2c\x06\0\x70\0\0\0\xf4\x3d\0\0\xcc\x49\0\0\
+\x0e\x38\x06\0\xc8\0\0\0\xf4\x3d\0\0\xf4\x49\0\0\x03\x10\x08\0\xd8\0\0\0\xf4\
+\x3d\0\0\x02\x4a\0\0\x11\x4c\x06\0\xe0\0\0\0\xf4\x3d\0\0\x1e\x4a\0\0\x1d\x54\
+\x06\0\xe8\0\0\0\xf4\x3d\0\0\x1e\x4a\0\0\x02\x54\x06\0\0\x01\0\0\xf4\x3d\0\0\
+\x59\x4a\0\0\x21\x64\x06\0\x08\x01\0\0\xf4\x3d\0\0\x59\x4a\0\0\x06\x64\x06\0\
+\x20\x01\0\0\xf4\x3d\0\0\x59\x4a\0\0\x43\x64\x06\0\x28\x01\0\0\xf4\x3d\0\0\x9e\
+\x4a\0\0\x2c\x68\x06\0\x30\x01\0\0\xf4\x3d\0\0\x9e\x4a\0\0\x06\x68\x06\0\x40\
+\x01\0\0\xf4\x3d\0\0\x59\x4a\0\0\x43\x64\x06\0\x48\x01\0\0\xf4\x3d\0\0\xdb\x4a\
+\0\0\x0f\x6c\x06\0\x50\x01\0\0\xf4\x3d\0\0\xdb\x4a\0\0\x07\x6c\x06\0\x78\x01\0\
+\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\x90\x01\0\0\xf4\x3d\0\0\x82\x3e\0\0\
+\x06\x88\x03\0\x98\x01\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\xa0\x01\0\0\
+\xf4\x3d\0\0\xf8\x4a\0\0\x18\x9c\x06\0\xa8\x01\0\0\xf4\x3d\0\0\xf8\x4a\0\0\x26\
+\x9c\x06\0\xb0\x01\0\0\xf4\x3d\0\0\x20\x4b\0\0\x06\xa0\x06\0\xd0\x01\0\0\xf4\
+\x3d\0\0\x20\x4b\0\0\x38\xa0\x06\0\xd8\x01\0\0\xf4\x3d\0\0\x5a\x4b\0\0\x06\xa4\
+\x06\0\xf0\x01\0\0\xf4\x3d\0\0\x20\x4b\0\0\x38\xa0\x06\0\xf8\x01\0\0\xf4\x3d\0\
+\0\x8c\x4b\0\0\x07\xa8\x06\0\x20\x02\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\
+\x38\x02\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x40\x02\0\0\xf4\x3d\0\0\x8e\
+\x3e\0\0\x0b\x8c\x03\0\x68\x02\0\0\xf4\x3d\0\0\x9e\x4b\0\0\x15\x50\x08\0\x80\
+\x02\0\0\xf4\x3d\0\0\xb7\x4b\0\0\x0d\x54\x08\0\xa0\x02\0\0\xf4\x3d\0\0\xea\x4b\
+\0\0\x06\x5c\x08\0\xa8\x02\0\0\xf4\x3d\0\0\xfb\x4b\0\0\x11\x60\x08\0\xb0\x02\0\
+\0\xf4\x3d\0\0\xfb\x4b\0\0\x07\x60\x08\0\xb8\x02\0\0\xf4\x3d\0\0\x23\x4c\0\0\
+\x08\x6c\x08\0\xc8\x02\0\0\xf4\x3d\0\0\x23\x4c\0\0\x2b\x6c\x08\0\xd8\x02\0\0\
+\xf4\x3d\0\0\x52\x4c\0\0\x05\x70\x08\0\x10\x03\0\0\xf4\x3d\0\0\x84\x4c\0\0\x08\
+\x78\x08\0\x40\x03\0\0\xf4\x3d\0\0\xcb\x4c\0\0\x05\x7c\x08\0\x80\x03\0\0\xf4\
+\x3d\0\0\xfd\x4c\0\0\x23\x84\x08\0\xa8\x03\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\
+\x03\0\xc0\x03\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\xc8\x03\0\0\xf4\x3d\0\
+\0\x8e\x3e\0\0\x0b\x8c\x03\0\xe8\x03\0\0\xf4\x3d\0\0\x28\x4d\0\0\x06\xc4\x06\0\
+\x08\x04\0\0\xf4\x3d\0\0\x40\x4d\0\0\x09\xcc\x06\0\x20\x04\0\0\xf4\x3d\0\0\x40\
+\x4d\0\0\x07\xcc\x06\0\x28\x04\0\0\xf4\x3d\0\0\x71\x4d\0\0\x0b\xd4\x06\0\x50\
+\x04\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\x68\x04\0\0\xf4\x3d\0\0\x82\x3e\
+\0\0\x06\x88\x03\0\x70\x04\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\x78\x04\0\
+\0\xf4\x3d\0\0\x83\x4d\0\0\x08\xf4\x06\0\x90\x04\0\0\xf4\x3d\0\0\x83\x4d\0\0\
+\x06\xf4\x06\0\x98\x04\0\0\xf4\x3d\0\0\xb7\x4d\0\0\x0a\xf8\x06\0\xc0\x04\0\0\
+\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\xd8\x04\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\
+\x88\x03\0\xe0\x04\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\xf0\x04\0\0\xf4\
+\x3d\0\0\xc8\x4d\0\0\x03\x98\x08\0\x28\x05\0\0\xf4\x3d\0\0\xf6\x4d\0\0\x16\xa4\
+\x08\0\x30\x05\0\0\xf4\x3d\0\0\xf6\x4d\0\0\x02\xa4\x08\0\x40\x05\0\0\xf4\x3d\0\
+\0\x1a\x4e\0\0\x1b\xd8\x08\0\x48\x05\0\0\xf4\x3d\0\0\x1a\x4e\0\0\x06\xd8\x08\0\
+\x70\x05\0\0\xf4\x3d\0\0\x50\x4e\0\0\x03\xdc\x08\0\x90\x05\0\0\xf4\x3d\0\0\x79\
+\x4e\0\0\x19\xe0\x08\0\x98\x05\0\0\xf4\x3d\0\0\x79\x4e\0\0\x03\xe0\x08\0\xa8\
+\x05\0\0\xf4\x3d\0\0\xbc\x47\0\0\x02\xe8\x08\0\xb0\x05\0\0\xf4\x3d\0\0\xa0\x4e\
+\0\0\x0c\x40\x04\0\xb8\x05\0\0\xf4\x3d\0\0\xc0\x4e\0\0\x22\xf0\x08\0\xc8\x05\0\
+\0\xf4\x3d\0\0\xa0\x4e\0\0\x15\x40\x04\0\xd0\x05\0\0\xf4\x3d\0\0\xe7\x4e\0\0\
+\x17\x44\x04\0\xd8\x05\0\0\xf4\x3d\0\0\x59\x4f\0\0\x11\x48\x04\0\xe0\x05\0\0\
+\xf4\x3d\0\0\x9c\x4f\0\0\x0c\0\x09\0\xf8\x05\0\0\xf4\x3d\0\0\xbe\x4f\0\0\x09\
+\x04\x09\0\0\x06\0\0\xf4\x3d\0\0\xcc\x4f\0\0\x2a\x08\x09\0\x28\x06\0\0\xf4\x3d\
+\0\0\xcc\x4f\0\0\x28\x08\x09\0\x30\x06\0\0\xf4\x3d\0\0\xcc\x4f\0\0\x31\x08\x09\
+\0\x48\x06\0\0\xf4\x3d\0\0\xcc\x4f\0\0\x03\x08\x09\0\x60\x06\0\0\xf4\x3d\0\0\
+\x0a\x50\0\0\x09\x10\x09\0\x68\x06\0\0\xf4\x3d\0\0\x26\x49\0\0\x05\xec\x05\0\
+\x80\x06\0\0\xf4\x3d\0\0\x17\x50\0\0\x06\x18\x07\0\x98\x06\0\0\xf4\x3d\0\0\x17\
+\x50\0\0\x16\x18\x07\0\xa0\x06\0\0\xf4\x3d\0\0\x17\x50\0\0\x19\x18\x07\0\xb8\
+\x06\0\0\xf4\x3d\0\0\x17\x50\0\0\x30\x18\x07\0\xc0\x06\0\0\xf4\x3d\0\0\x17\x50\
+\0\0\x16\x18\x07\0\xd0\x06\0\0\xf4\x3d\0\0\x9e\x4b\0\0\x15\x20\x07\0\xf8\x06\0\
+\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\x10\x07\0\0\xf4\x3d\0\0\x82\x3e\0\0\
+\x06\x88\x03\0\x18\x07\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\x38\x07\0\0\
+\xf4\x3d\0\0\x55\x50\0\0\x1d\x40\x07\0\x40\x07\0\0\xf4\x3d\0\0\x55\x50\0\0\x02\
+\x40\x07\0\x58\x07\0\0\xf4\x3d\0\0\x28\x4d\0\0\x06\x44\x07\0\x78\x07\0\0\xf4\
+\x3d\0\0\x40\x4d\0\0\x09\x48\x07\0\x90\x07\0\0\xf4\x3d\0\0\x40\x4d\0\0\x07\x48\
+\x07\0\x98\x07\0\0\xf4\x3d\0\0\x71\x4d\0\0\x0b\x50\x07\0\xc0\x07\0\0\xf4\x3d\0\
+\0\x51\x3e\0\0\x0f\x84\x03\0\xd8\x07\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\
+\xe0\x07\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\x08\x08\0\0\xf4\x3d\0\0\x83\
+\x4d\0\0\x08\x70\x07\0\x20\x08\0\0\xf4\x3d\0\0\x83\x4d\0\0\x06\x70\x07\0\x28\
+\x08\0\0\xf4\x3d\0\0\xb7\x4d\0\0\x0a\x74\x07\0\x50\x08\0\0\xf4\x3d\0\0\x51\x3e\
+\0\0\x0f\x84\x03\0\x70\x08\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x78\x08\0\
+\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\xb0\x08\0\0\xf4\x3d\0\0\x51\x3e\0\0\
+\x0f\x84\x03\0\xc8\x08\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\xd0\x08\0\0\
+\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\xf8\x08\0\0\xf4\x3d\0\0\x90\x50\0\0\x21\
+\x94\x07\0\0\x09\0\0\xf4\x3d\0\0\x90\x50\0\0\x08\x94\x07\0\x18\x09\0\0\xf4\x3d\
+\0\0\x90\x50\0\0\x06\x94\x07\0\x28\x09\0\0\xf4\x3d\0\0\xb7\x4d\0\0\x0a\x98\x07\
+\0\x50\x09\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\x68\x09\0\0\xf4\x3d\0\0\
+\x82\x3e\0\0\x06\x88\x03\0\x70\x09\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\
+\x88\x09\0\0\xf4\x3d\0\0\xf9\x50\0\0\x07\xec\x07\0\xb0\x09\0\0\xf4\x3d\0\0\x5f\
+\x51\0\0\x0c\xf4\x07\0\xe8\x09\0\0\xf4\x3d\0\0\xd4\x40\0\0\x18\xec\x03\0\0\x0a\
+\0\0\xf4\x3d\0\0\xf5\x40\0\0\x14\xe0\x03\0\x28\x0a\0\0\xf4\x3d\0\0\xd4\x40\0\0\
+\x16\xec\x03\0\x38\x0a\0\0\xf4\x3d\0\0\x15\x41\0\0\x03\0\x04\0\x40\x0a\0\0\xf4\
+\x3d\0\0\x62\x41\0\0\x03\x04\x04\0\x78\x0a\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\
+\x03\0\x90\x0a\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x98\x0a\0\0\xf4\x3d\0\
+\0\x8e\x3e\0\0\x0b\x8c\x03\0\xb0\x0a\0\0\xf4\x3d\0\0\xf4\x49\0\0\x0a\x10\x08\0\
+\xb8\x0a\0\0\xf4\x3d\0\0\x67\x40\0\0\x03\x0c\x08\0\xc0\x0a\0\0\xf4\x3d\0\0\xf4\
+\x49\0\0\x03\x10\x08\0\xc8\x0a\0\0\xf4\x3d\0\0\xbc\x47\0\0\x02\x1c\x08\0\xe0\
+\x0a\0\0\xf4\x3d\0\0\xd4\x51\0\0\x02\x20\x08\0\xe8\x0a\0\0\xf4\x3d\0\0\xb2\x41\
+\0\0\x03\x1c\x04\0\x20\x0b\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\x38\x0b\0\
+\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x40\x0b\0\0\xf4\x3d\0\0\x8e\x3e\0\0\
+\x0b\x8c\x03\0\x7d\x5f\0\0\x13\0\0\0\0\0\0\0\xf4\x3d\0\0\x5e\x53\0\0\x06\x1c\
+\x09\0\x08\0\0\0\xf4\x3d\0\0\xa6\x53\0\0\x15\x28\x09\0\x10\0\0\0\xf4\x3d\0\0\
+\x5e\x53\0\0\x06\x1c\x09\0\x20\0\0\0\xf4\x3d\0\0\x6f\x49\0\0\x09\x30\x09\0\x50\
+\0\0\0\xf4\x3d\0\0\xe3\x53\0\0\x06\x34\x09\0\x58\0\0\0\xf4\x3d\0\0\xf1\x53\0\0\
+\x03\x38\x09\0\x90\0\0\0\xf4\x3d\0\0\x1d\x54\0\0\x03\x3c\x09\0\x98\0\0\0\xf4\
+\x3d\0\0\x27\x54\0\0\x1a\x5c\x09\0\xb0\0\0\0\xf4\x3d\0\0\x27\x54\0\0\x24\x5c\
+\x09\0\xc0\0\0\0\xf4\x3d\0\0\x27\x54\0\0\x26\x5c\x09\0\xd8\0\0\0\xf4\x3d\0\0\
+\x29\x45\0\0\x11\xa4\x03\0\xe0\0\0\0\xf4\x3d\0\0\x27\x54\0\0\x06\x5c\x09\0\xe8\
+\0\0\0\xf4\x3d\0\0\x57\x54\0\0\x17\x60\x09\0\xf0\0\0\0\xf4\x3d\0\0\x57\x54\0\0\
+\x15\x60\x09\0\0\x01\0\0\xf4\x3d\0\0\x77\x54\0\0\x0c\x6c\x09\0\x18\x01\0\0\xf4\
+\x3d\0\0\xbe\x4f\0\0\x09\x70\x09\0\x20\x01\0\0\xf4\x3d\0\0\xa1\x54\0\0\x2e\x74\
+\x09\0\x38\x01\0\0\xf4\x3d\0\0\xa1\x54\0\0\x03\x74\x09\0\x60\x01\0\0\xf4\x3d\0\
+\0\x5e\x53\0\0\x06\x1c\x09\0\x95\x5f\0\0\x34\0\0\0\0\0\0\0\xf4\x3d\0\0\xdf\x54\
+\0\0\x0c\xa8\x09\0\x18\0\0\0\xf4\x3d\0\0\xfb\x54\0\0\x06\x88\x09\0\x28\0\0\0\
+\xf4\x3d\0\0\x41\x55\0\0\x06\x98\x09\0\x30\0\0\0\xf4\x3d\0\0\x28\x47\0\0\x0c\
+\xa4\x09\0\x48\0\0\0\xf4\x3d\0\0\xdc\x3f\0\0\x0f\xac\x09\0\x60\0\0\0\xf4\x3d\0\
+\0\x51\x55\0\0\x03\xb0\x09\0\xa0\0\0\0\xf4\x3d\0\0\x83\x55\0\0\x0d\xc0\x09\0\
+\xb8\0\0\0\xf4\x3d\0\0\xf0\x3e\0\0\x06\xc4\x09\0\xc8\0\0\0\xf4\x3d\0\0\xc8\x4d\
+\0\0\x03\xc8\x09\0\0\x01\0\0\xf4\x3d\0\0\xfb\x54\0\0\x06\x88\x09\0\x10\x01\0\0\
+\xf4\x3d\0\0\xb6\x55\0\0\x07\xdc\x09\0\x28\x01\0\0\xf4\x3d\0\0\xb6\x55\0\0\x06\
+\xdc\x09\0\x30\x01\0\0\xf4\x3d\0\0\xe0\x55\0\0\x10\xe4\x09\0\x48\x01\0\0\xf4\
+\x3d\0\0\x1e\x56\0\0\x0c\xf8\x09\0\x50\x01\0\0\xf4\x3d\0\0\x1e\x56\0\0\x1a\xf8\
+\x09\0\x58\x01\0\0\xf4\x3d\0\0\x1e\x56\0\0\x33\xf8\x09\0\x70\x01\0\0\xf4\x3d\0\
+\0\x61\x56\0\0\x2a\xfc\x09\0\x88\x01\0\0\xf4\x3d\0\0\x61\x56\0\0\x04\xfc\x09\0\
+\xb0\x01\0\0\xf4\x3d\0\0\x98\x56\0\0\x04\0\x0a\0\xe0\x01\0\0\xf4\x3d\0\0\x51\
+\x3e\0\0\x0f\x84\x03\0\xf8\x01\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\0\x02\
+\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\x20\x02\0\0\xf4\x3d\0\0\xa3\x56\0\0\
+\x07\x14\x0a\0\x30\x02\0\0\xf4\x3d\0\0\xd7\x56\0\0\x0e\x54\x0a\0\x38\x02\0\0\
+\xf4\x3d\0\0\xd7\x56\0\0\x17\x54\x0a\0\x40\x02\0\0\xf4\x3d\0\0\xd7\x56\0\0\x2d\
+\x54\x0a\0\x48\x02\0\0\xf4\x3d\0\0\x06\x57\0\0\x10\x58\x0a\0\x58\x02\0\0\xf4\
+\x3d\0\0\xd7\x56\0\0\x2d\x54\x0a\0\x80\x02\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\
+\x03\0\x98\x02\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\xa0\x02\0\0\xf4\x3d\0\
+\0\x8e\x3e\0\0\x0b\x8c\x03\0\xb8\x02\0\0\xf4\x3d\0\0\x3f\x57\0\0\x05\x64\x0a\0\
+\xd0\x02\0\0\xf4\x3d\0\0\xd4\x40\0\0\x18\xec\x03\0\xe8\x02\0\0\xf4\x3d\0\0\xf5\
+\x40\0\0\x14\xe0\x03\0\x10\x03\0\0\xf4\x3d\0\0\xd4\x40\0\0\x16\xec\x03\0\x20\
+\x03\0\0\xf4\x3d\0\0\x15\x41\0\0\x03\0\x04\0\x28\x03\0\0\xf4\x3d\0\0\x62\x41\0\
+\0\x03\x04\x04\0\x60\x03\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\x78\x03\0\0\
+\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x80\x03\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\
+\x8c\x03\0\x98\x03\0\0\xf4\x3d\0\0\x8b\x57\0\0\x24\x74\x0a\0\xa0\x03\0\0\xf4\
+\x3d\0\0\xd1\x57\0\0\x27\x98\x0a\0\xb8\x03\0\0\xf4\x3d\0\0\xd1\x57\0\0\x05\x98\
+\x0a\0\xe8\x03\0\0\xf4\x3d\0\0\x51\x3e\0\0\x0f\x84\x03\0\0\x04\0\0\xf4\x3d\0\0\
+\x82\x3e\0\0\x06\x88\x03\0\x08\x04\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\
+\x10\x04\0\0\xf4\x3d\0\0\xb2\x41\0\0\x03\x1c\x04\0\x48\x04\0\0\xf4\x3d\0\0\x51\
+\x3e\0\0\x0f\x84\x03\0\x60\x04\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\x68\
+\x04\0\0\xf4\x3d\0\0\x8e\x3e\0\0\x0b\x8c\x03\0\x90\x04\0\0\xf4\x3d\0\0\x51\x3e\
+\0\0\x0f\x84\x03\0\xa8\x04\0\0\xf4\x3d\0\0\x82\x3e\0\0\x06\x88\x03\0\xae\x5f\0\
+\0\x08\0\0\0\0\0\0\0\xf4\x3d\0\0\x04\x58\0\0\x06\xc8\x0a\0\x08\0\0\0\xf4\x3d\0\
+\0\x3d\x58\0\0\x13\xe8\x0a\0\x20\0\0\0\xf4\x3d\0\0\x3d\x58\0\0\x25\xe8\x0a\0\
+\x28\0\0\0\xf4\x3d\0\0\x29\x45\0\0\x11\xa4\x03\0\x30\0\0\0\xf4\x3d\0\0\x3d\x58\
+\0\0\x06\xe8\x0a\0\x38\0\0\0\xf4\x3d\0\0\x6d\x58\0\0\x16\xec\x0a\0\x40\0\0\0\
+\xf4\x3d\0\0\x6d\x58\0\0\x0d\xec\x0a\0\x48\0\0\0\xf4\x3d\0\0\x04\x58\0\0\x06\
+\xc8\x0a\0\xc6\x5f\0\0\x09\0\0\0\0\0\0\0\xf4\x3d\0\0\x8d\x58\0\0\x06\xfc\x0a\0\
+\x08\0\0\0\xf4\x3d\0\0\xd6\x58\0\0\x17\x08\x0b\0\x20\0\0\0\xf4\x3d\0\0\xd6\x58\
+\0\0\x29\x08\x0b\0\x28\0\0\0\xf4\x3d\0\0\xd6\x58\0\0\x20\x08\x0b\0\x30\0\0\0\
+\xf4\x3d\0\0\xd6\x58\0\0\x3f\x08\x0b\0\x38\0\0\0\xf4\x3d\0\0\xd6\x58\0\0\x30\
+\x08\x0b\0\x40\0\0\0\xf4\x3d\0\0\xd6\x58\0\0\x36\x08\x0b\0\x48\0\0\0\xf4\x3d\0\
+\0\xd6\x58\0\0\x13\x08\x0b\0\x60\0\0\0\xf4\x3d\0\0\x8d\x58\0\0\x06\xfc\x0a\0\
+\xdf\x5f\0\0\x0b\0\0\0\0\0\0\0\xf4\x3d\0\0\x1c\x59\0\0\x05\x18\x0b\0\x08\0\0\0\
+\xf4\x3d\0\0\x56\x59\0\0\x09\x40\x0b\0\x40\0\0\0\xf4\x3d\0\0\xa6\x49\0\0\x06\
+\x48\x0b\0\x48\0\0\0\xf4\x3d\0\0\x89\x59\0\0\x0c\x54\x0b\0\x50\0\0\0\xf4\x3d\0\
+\0\xaa\x59\0\0\x06\x58\x0b\0\x58\0\0\0\xf4\x3d\0\0\xb9\x59\0\0\x0c\x64\x0b\0\
+\x70\0\0\0\xf4\x3d\0\0\xed\x59\0\0\x06\x68\x0b\0\x78\0\0\0\xf4\x3d\0\0\xfb\x59\
+\0\0\x03\x6c\x0b\0\x90\0\0\0\xf4\x3d\0\0\x1b\x5a\0\0\x11\x78\x0b\0\x98\0\0\0\
+\xf4\x3d\0\0\x31\x5a\0\0\x16\x74\x0b\0\xa8\0\0\0\xf4\x3d\0\0\x1c\x59\0\0\x05\
+\x18\x0b\0\xf9\x5f\0\0\x04\0\0\0\0\0\0\0\xf4\x3d\0\0\x4c\x5a\0\0\x06\x8c\x0b\0\
+\x08\0\0\0\xf4\x3d\0\0\x84\x5a\0\0\x15\x94\x0b\0\x20\0\0\0\xf4\x3d\0\0\x84\x5a\
+\0\0\x13\x94\x0b\0\x28\0\0\0\xf4\x3d\0\0\x4c\x5a\0\0\x06\x8c\x0b\0\x10\x60\0\0\
+\x2e\0\0\0\0\0\0\0\xf4\x3d\0\0\xa3\x5a\0\0\0\x4c\x0c\0\x08\0\0\0\xf4\x3d\0\0\
+\xcb\x5a\0\0\x06\x64\x0c\0\x18\0\0\0\xf4\x3d\0\0\xd9\x5a\0\0\x08\x6c\x0c\0\x38\
+\0\0\0\xf4\x3d\0\0\x13\x5b\0\0\x06\x70\x0c\0\x40\0\0\0\xf4\x3d\0\0\x1f\x5b\0\0\
+\x03\x74\x0c\0\x78\0\0\0\xf4\x3d\0\0\xa3\x5a\0\0\x05\x4c\x0c\0\x88\0\0\0\xf4\
+\x3d\0\0\x89\x59\0\0\x0c\x84\x0c\0\x98\0\0\0\xf4\x3d\0\0\xaa\x59\0\0\x06\x88\
+\x0c\0\xa0\0\0\0\xf4\x3d\0\0\x51\x5b\0\0\x02\x90\x0c\0\xb8\0\0\0\xf4\x3d\0\0\
+\x6e\x5b\0\0\x0c\x94\x0c\0\xd8\0\0\0\xf4\x3d\0\0\xed\x59\0\0\x06\x98\x0c\0\xe0\
+\0\0\0\xf4\x3d\0\0\xfb\x59\0\0\x03\x9c\x0c\0\xf0\0\0\0\xf4\x3d\0\0\x89\x59\0\0\
+\x0c\xa4\x0c\0\xf8\0\0\0\xf4\x3d\0\0\xaa\x59\0\0\x06\xa8\x0c\0\0\x01\0\0\xf4\
+\x3d\0\0\x51\x5b\0\0\x02\xb4\x0c\0\x18\x01\0\0\xf4\x3d\0\0\xa3\x5b\0\0\x0c\xb8\
+\x0c\0\x38\x01\0\0\xf4\x3d\0\0\xed\x59\0\0\x06\xbc\x0c\0\x40\x01\0\0\xf4\x3d\0\
+\0\xfb\x59\0\0\x03\xc0\x0c\0\x50\x01\0\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xc8\x0c\0\
+\x98\x01\0\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xc8\x0c\0\xc8\x01\0\0\xf4\x3d\0\0\xa0\
+\x47\0\0\x02\xc8\x0c\0\xd0\x01\0\0\xf4\x3d\0\0\xd8\x5b\0\0\x07\xcc\x0c\0\xe8\
+\x01\0\0\xf4\x3d\0\0\xe9\x5b\0\0\x1a\xd0\x0c\0\x08\x02\0\0\xf4\x3d\0\0\x29\x5c\
+\0\0\x07\xd8\x0c\0\x18\x02\0\0\xf4\x3d\0\0\x37\x5c\0\0\x04\xdc\x0c\0\x60\x02\0\
+\0\xf4\x3d\0\0\x66\x5c\0\0\x1d\xe8\x0c\0\x68\x02\0\0\xf4\x3d\0\0\x8b\x5c\0\0\
+\x07\xec\x0c\0\xa0\x02\0\0\xf4\x3d\0\0\xcc\x5c\0\0\x04\xf0\x0c\0\xc8\x02\0\0\
+\xf4\x3d\0\0\x01\x5d\0\0\x04\x04\x0d\0\xd0\x02\0\0\xf4\x3d\0\0\x38\x5d\0\0\x09\
+\xfc\x0c\0\xf0\x02\0\0\xf4\x3d\0\0\x7b\x5d\0\0\x07\0\x0d\0\0\x03\0\0\xf4\x3d\0\
+\0\x01\x5d\0\0\x04\x04\x0d\0\x40\x03\0\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xc8\x0c\0\
+\x68\x03\0\0\xf4\x3d\0\0\xa0\x47\0\0\x02\xc8\x0c\0\x80\x03\0\0\xf4\x3d\0\0\x88\
+\x5d\0\0\x0a\x18\x0d\0\xa0\x03\0\0\xf4\x3d\0\0\xba\x5d\0\0\x06\x1c\x0d\0\xb0\
+\x03\0\0\xf4\x3d\0\0\xc9\x5d\0\0\x03\x20\x0d\0\xf0\x03\0\0\xf4\x3d\0\0\xfc\x5d\
+\0\0\x03\x24\x0d\0\xf8\x03\0\0\xf4\x3d\0\0\x0d\x5e\0\0\x02\x2c\x0d\0\x20\x04\0\
+\0\xf4\x3d\0\0\x43\x5e\0\0\x02\x30\x0d\0\x40\x04\0\0\xf4\x3d\0\0\xf5\x47\0\0\
+\x1f\x34\x0d\0\x58\x04\0\0\xf4\x3d\0\0\xf5\x47\0\0\x33\x34\x0d\0\x68\x04\0\0\
+\xf4\x3d\0\0\xf5\x47\0\0\x08\x34\x0d\0\x90\x04\0\0\xf4\x3d\0\0\x33\x48\0\0\x06\
+\x38\x0d\0\x98\x04\0\0\xf4\x3d\0\0\xf8\x48\0\0\x03\x3c\x0d\0\x08\x05\0\0\xf4\
+\x3d\0\0\xa0\x47\0\0\x02\xc8\x0c\0\x27\x60\0\0\x05\0\0\0\0\0\0\0\xf4\x3d\0\0\
+\x72\x5e\0\0\x06\x50\x0d\0\x08\0\0\0\xf4\x3d\0\0\xab\x5e\0\0\x02\x58\x0d\0\xb8\
+\0\0\0\xf4\x3d\0\0\xab\x5e\0\0\x02\x58\x0d\0\xd0\0\0\0\xf4\x3d\0\0\xab\x5e\0\0\
+\x02\x58\x0d\0\xe8\0\0\0\xf4\x3d\0\0\x72\x5e\0\0\x06\x50\x0d\0\x81\x1e\0\0\x0e\
+\0\0\0\0\0\0\0\xf4\x3d\0\0\xe6\x51\0\0\x1f\x6c\x0d\0\x28\0\0\0\xf4\x3d\0\0\x4a\
+\x52\0\0\x05\x70\x0d\0\x30\0\0\0\xf4\x3d\0\0\x56\x52\0\0\x03\x74\x0d\0\x50\0\0\
+\0\xf4\x3d\0\0\x5f\x3f\0\0\x03\x78\x0d\0\x58\0\0\0\xf4\x3d\0\0\x89\x52\0\0\x1d\
+\x80\x0d\0\x70\0\0\0\xf4\x3d\0\0\x89\x52\0\0\x1b\x80\x0d\0\x78\0\0\0\xf4\x3d\0\
+\0\xb9\x52\0\0\x1e\x84\x0d\0\x90\0\0\0\xf4\x3d\0\0\xb9\x52\0\0\x1c\x84\x0d\0\
+\x98\0\0\0\xf4\x3d\0\0\xeb\x52\0\0\x1b\x88\x0d\0\xb0\0\0\0\xf4\x3d\0\0\xeb\x52\
+\0\0\x19\x88\x0d\0\xb8\0\0\0\xf4\x3d\0\0\x17\x53\0\0\x1a\x8c\x0d\0\xd0\0\0\0\
+\xf4\x3d\0\0\x17\x53\0\0\x18\x8c\x0d\0\xd8\0\0\0\xf4\x3d\0\0\x41\x53\0\0\x02\
+\x90\x0d\0\xf0\0\0\0\xf4\x3d\0\0\x4e\x42\0\0\x01\x98\x0d\0\x10\0\0\0\x5c\x5f\0\
+\0\x06\0\0\0\xf8\x02\0\0\x5e\0\0\0\xc1\x5e\0\0\0\0\0\0\x18\x03\0\0\x5e\0\0\0\
+\xc5\x5e\0\0\0\0\0\0\x58\x03\0\0\x5e\0\0\0\xcb\x5e\0\0\0\0\0\0\x68\x03\0\0\x5e\
+\0\0\0\xd0\x5e\0\0\0\0\0\0\x38\x05\0\0\x5e\0\0\0\xd5\x5e\0\0\0\0\0\0\x18\x06\0\
+\0\x5e\0\0\0\xd5\x5e\0\0\0\0\0\0\x62\x5f\0\0\x03\0\0\0\xe0\0\0\0\x5e\0\0\0\xdd\
+\x5e\0\0\0\0\0\0\x38\x07\0\0\x5e\0\0\0\xdd\x5e\0\0\0\0\0\0\xf8\x08\0\0\x5e\0\0\
+\0\xdd\x5e\0\0\0\0\0\0\x7d\x5f\0\0\x01\0\0\0\x08\0\0\0\x5e\0\0\0\xd5\x5e\0\0\0\
+\0\0\0\x95\x5f\0\0\x02\0\0\0\x50\x01\0\0\x5e\0\0\0\xe2\x5e\0\0\0\0\0\0\x38\x02\
+\0\0\x5e\0\0\0\xe9\x5e\0\0\0\0\0\0\xae\x5f\0\0\x02\0\0\0\x20\0\0\0\x5e\0\0\0\
+\xd5\x5e\0\0\0\0\0\0\x38\0\0\0\x5e\0\0\0\xd5\x5e\0\0\0\0\0\0\xc6\x5f\0\0\x04\0\
+\0\0\x20\0\0\0\x5e\0\0\0\xed\x5e\0\0\0\0\0\0\x30\0\0\0\x5e\0\0\0\xf5\x5e\0\0\0\
+\0\0\0\x48\0\0\0\x5e\0\0\0\xd5\x5e\0\0\0\0\0\0\x58\0\0\0\x5e\0\0\0\xd5\x5e\0\0\
+\0\0\0\0\xf9\x5f\0\0\x01\0\0\0\x20\0\0\0\x5e\0\0\0\xd5\x5e\0\0\0\0\0\0\x27\x60\
+\0\0\x06\0\0\0\x08\0\0\0\xdb\x01\0\0\xfc\x5e\0\0\0\0\0\0\x60\0\0\0\xdb\x01\0\0\
+\xc1\x5e\0\0\0\0\0\0\x90\0\0\0\xdb\x01\0\0\0\x5f\0\0\0\0\0\0\xb0\0\0\0\xdb\x01\
+\0\0\xe9\x5e\0\0\x02\0\0\0\xc0\0\0\0\xdb\x01\0\0\xe9\x5e\0\0\0\0\0\0\xd0\0\0\0\
+\xdb\x01\0\0\x04\x5f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x01\0\0\0\x03\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\0\0\0\0\
+\0\0\0\x75\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x09\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb8\x08\0\0\0\0\0\0\x90\
+\x09\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x11\0\0\
+\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x48\x12\0\0\0\0\0\0\x48\x0a\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\0\0\0\x01\0\0\0\
+\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x1c\0\0\0\0\0\0\x60\x0b\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x32\0\0\0\x01\0\0\0\x06\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\xf0\x27\0\0\0\0\0\0\x68\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x4a\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x58\x29\0\0\0\0\0\0\xd0\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\x63\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x28\x2e\0\0\0\0\0\0\x50\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\x7b\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x78\x2e\0\0\0\
+\0\0\0\x68\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x94\
+\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x2e\0\0\0\0\0\0\xb8\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xae\0\0\0\x01\0\0\
+\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x98\x2f\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc5\0\0\0\x01\0\0\0\x06\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\xc8\x2f\0\0\0\0\0\0\x18\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xdc\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\xe0\x34\0\0\0\0\0\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\xf1\0\0\0\x01\0\0\0\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\
+\x35\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\xfc\0\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x36\0\0\0\0\0\
+\0\x0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x04\x01\
+\0\0\x01\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x36\0\0\0\0\0\0\x68\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x0c\x01\0\0\x01\0\0\
+\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x48\x37\0\0\0\0\0\0\x48\x01\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x12\x01\0\0\x08\0\0\0\x03\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\x90\x38\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x17\x01\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x90\x38\0\0\0\0\0\0\xa8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\x28\x01\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\x38\x3a\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x37\x01\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x40\x3a\
+\0\0\0\0\0\0\x5d\x06\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\x3d\x01\0\0\x01\0\0\0\x03\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xa0\x40\0\0\0\0\0\
+\0\x10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3b\x07\
+\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb0\x40\0\0\0\0\0\0\xc0\x03\0\
+\0\0\0\0\0\x02\0\0\0\x03\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x45\x07\0\0\
+\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x70\x44\0\0\0\0\0\0\x70\x03\0\0\0\
+\0\0\0\x02\0\0\0\x04\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x64\x07\0\0\x09\
+\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x47\0\0\0\0\0\0\x80\0\0\0\0\0\0\0\
+\x02\0\0\0\x05\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x80\x07\0\0\x09\0\0\0\
+\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x60\x48\0\0\0\0\0\0\x70\x01\0\0\0\0\0\0\x02\
+\0\0\0\x06\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x9d\x07\0\0\x09\0\0\0\x40\
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd0\x49\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x02\0\0\0\
+\x07\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xb9\x07\0\0\x09\0\0\0\x40\0\0\0\
+\0\0\0\0\0\0\0\0\0\0\0\0\xe0\x49\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x02\0\0\0\x08\0\
+\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xd6\x07\0\0\x09\0\0\0\x40\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\0\0\xf0\x49\0\0\0\0\0\0\x30\0\0\0\0\0\0\0\x02\0\0\0\x09\0\0\0\
+\x08\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\xf4\x07\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\
+\0\0\0\0\0\0\0\x20\x4a\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x02\0\0\0\x0a\0\0\0\x08\0\
+\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x0f\x08\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\0\0\x30\x4a\0\0\0\0\0\0\x10\x02\0\0\0\0\0\0\x02\0\0\0\x0b\0\0\0\x08\0\0\0\
+\0\0\0\0\x10\0\0\0\0\0\0\0\x2a\x08\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\0\0\x40\x4c\0\0\0\0\0\0\x50\0\0\0\0\0\0\0\x02\0\0\0\x0c\0\0\0\x08\0\0\0\0\0\0\
+\0\x10\0\0\0\0\0\0\0\x43\x08\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x90\x4c\0\0\0\0\0\0\x60\0\0\0\0\0\0\0\x02\0\0\0\x0d\0\0\0\x08\0\0\0\0\0\0\0\
+\x10\0\0\0\0\0\0\0\x52\x08\0\0\x09\0\0\0\x40\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf0\
+\x4c\0\0\0\0\0\0\x90\0\0\0\0\0\0\0\x02\0\0\0\x12\0\0\0\x08\0\0\0\0\0\0\0\x10\0\
+\0\0\0\0\0\0\x67\x08\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x80\x4d\0\0\
+\0\0\0\0\xac\xc8\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
+\x6c\x08\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x30\x16\x01\0\0\0\0\0\
+\x4c\x1c\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+
+ *sz = sizeof(data) - 1;
+ return (const void *)data;
+}
+
+#ifdef __cplusplus
+struct scx_nest_bpf *scx_nest_bpf::open(const struct bpf_object_open_opts *opts) { return scx_nest_bpf__open_opts(opts); }
+struct scx_nest_bpf *scx_nest_bpf::open_and_load() { return scx_nest_bpf__open_and_load(); }
+int scx_nest_bpf::load(struct scx_nest_bpf *skel) { return scx_nest_bpf__load(skel); }
+int scx_nest_bpf::attach(struct scx_nest_bpf *skel) { return scx_nest_bpf__attach(skel); }
+void scx_nest_bpf::detach(struct scx_nest_bpf *skel) { scx_nest_bpf__detach(skel); }
+void scx_nest_bpf::destroy(struct scx_nest_bpf *skel) { scx_nest_bpf__destroy(skel); }
+const void *scx_nest_bpf::elf_bytes(size_t *sz) { return scx_nest_bpf__elf_bytes(sz); }
+#endif /* __cplusplus */
+
+__attribute__((unused)) static void
+scx_nest_bpf__assert(struct scx_nest_bpf *s __attribute__((unused)))
+{
+#ifdef __cplusplus
+#define _Static_assert static_assert
+#endif
+ _Static_assert(sizeof(s->rodata->p_remove_ns) == 8, "unexpected size of 'p_remove_ns'");
+ _Static_assert(sizeof(s->rodata->r_max) == 8, "unexpected size of 'r_max'");
+ _Static_assert(sizeof(s->rodata->r_impatient) == 8, "unexpected size of 'r_impatient'");
+ _Static_assert(sizeof(s->rodata->slice_ns) == 8, "unexpected size of 'slice_ns'");
+ _Static_assert(sizeof(s->rodata->find_fully_idle) == 1, "unexpected size of 'find_fully_idle'");
+ _Static_assert(sizeof(s->rodata->sampling_cadence_ns) == 8, "unexpected size of 'sampling_cadence_ns'");
+ _Static_assert(sizeof(s->rodata->r_depth) == 8, "unexpected size of 'r_depth'");
+ _Static_assert(sizeof(s->rodata->filter_by_tgid) == 1, "unexpected size of 'filter_by_tgid'");
+ _Static_assert(sizeof(s->rodata->nr_cpus) == 4, "unexpected size of 'nr_cpus'");
+ _Static_assert(sizeof(s->rodata->uei_dump_len) == 4, "unexpected size of 'uei_dump_len'");
+ _Static_assert(sizeof(s->bss->stats_primary_mask) == 8, "unexpected size of 'stats_primary_mask'");
+ _Static_assert(sizeof(s->bss->stats_reserved_mask) == 8, "unexpected size of 'stats_reserved_mask'");
+ _Static_assert(sizeof(s->bss->stats_other_mask) == 8, "unexpected size of 'stats_other_mask'");
+ _Static_assert(sizeof(s->bss->stats_idle_mask) == 8, "unexpected size of 'stats_idle_mask'");
+ _Static_assert(sizeof(s->data_uei_dump->uei_dump) == 1, "unexpected size of 'uei_dump'");
+ _Static_assert(sizeof(s->data->uei) == 1168, "unexpected size of 'uei'");
+#ifdef __cplusplus
+#undef _Static_assert
+#endif
+}
+
+#endif /* __SCX_NEST_BPF_SKEL_H__ */
diff --git a/.output/scx_nest.tmp.bpf.o b/.output/scx_nest.tmp.bpf.o
new file mode 100644
index 0000000..2cc60a7
Binary files /dev/null and b/.output/scx_nest.tmp.bpf.o differ
diff --git a/.output/scx_plug.o b/.output/scx_plug.o
new file mode 100644
index 0000000..ed63fff
Binary files /dev/null and b/.output/scx_plug.o differ
diff --git a/.output/scx_spy.o b/.output/scx_spy.o
new file mode 100644
index 0000000..71a63dc
Binary files /dev/null and b/.output/scx_spy.o differ
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 242a7e9..32bc6ff 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -101,6 +101,7 @@
"proc_data.h": "c",
"btf.h": "c",
"io_stats.skel.h": "c",
- "env.h": "c"
+ "env.h": "c",
+ "common.h": "c"
}
}
\ No newline at end of file
diff --git a/Document/cpu.md b/Document/cpu.md
new file mode 100644
index 0000000..f530e82
--- /dev/null
+++ b/Document/cpu.md
@@ -0,0 +1,248 @@
+## 挂载的程åºå’Œç›¸å…³é’©å
+这里把å‰é¢éƒ¨åˆ†å’Œcpuéƒ¨åˆ†æ— å…³çš„è¾“å‡ºåˆ é™¤äº†ï¼Œåªæ˜¾ç¤ºcpu的部分
+```shell
+root@ne0-System:~# bpftool prog show
+1097: raw_tracepoint name handle_sched_wakeup tag 09665ce5a1061f80 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 1208B jited 730B memlock 4096B map_ids 527,536,544
+ btf_id 438
+1099: raw_tracepoint name handle_sched_wakeup_new tag 09665ce5a1061f80 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 1208B jited 730B memlock 4096B map_ids 527,536,544
+ btf_id 438
+1100: tracepoint name handle_task_create tag efc6aaf5cb501cf1 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 464B jited 276B memlock 4096B map_ids 527,544
+ btf_id 438
+1101: tracepoint name handle_task_exit tag bbd5266b129ac1f5 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 536B jited 316B memlock 4096B map_ids 527,536,531,533,537,544
+ btf_id 438
+1102: tracepoint name record_task_switch tag 84f5ae70e9eae07c gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 6648B jited 4141B memlock 8192B map_ids 528,529,527,531,539,544,533,542,530,536,537,540
+ btf_id 438
+1103: tracepoint name record_backtrace tag 609e86149c8868ed gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 968B jited 556B memlock 4096B map_ids 531,532,544,533,527
+ btf_id 438
+1104: tracepoint name record_cpu_idle tag da0312df36e18d94 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 584B jited 312B memlock 4096B map_ids 528,529,544
+ btf_id 438
+1105: tracepoint name trace_sys_enter tag b321ae7b2ce4198b gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 1160B jited 660B memlock 4096B map_ids 527,536,544
+ btf_id 438
+1106: tracepoint name trace_sys_exit tag ab90f585a0514ff8 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 1152B jited 653B memlock 4096B map_ids 527,536,544
+ btf_id 438
+1107: tracepoint name trace_cpu_softirq_entry tag 54c4d1a106cfa8a9 gpl recursion_misses 13
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 712B jited 403B memlock 4096B map_ids 528,529,544
+ btf_id 438
+1108: tracepoint name trace_cpu_softirq_exit tag 3d80b7c8e918ee61 gpl recursion_misses 13
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 632B jited 357B memlock 4096B map_ids 528,529,544
+ btf_id 438
+1109: tracepoint name trace_cpu_irq_entry tag eba63ed6afd29a18 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 712B jited 403B memlock 4096B map_ids 528,529,544
+ btf_id 438
+1110: tracepoint name trace_cpu_irq_exit tag 9626ba411786b4fa gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 632B jited 357B memlock 4096B map_ids 528,529,544
+ btf_id 438
+1111: perf_event name handle_cpu_event tag 47b18a86e41937b8 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 2000B jited 1318B memlock 4096B map_ids 545,534,544,529,528,538
+ btf_id 438
+1112: perf_event name handle_sys_latency_event tag 865cfeaa4297ac99 gpl
+ loaded_at 2024-12-22T14:14:47+0800 uid 0
+ xlated 1280B jited 654B memlock 4096B map_ids 541,544,530
+ btf_id 438
+```
+```shell
+root@ne0-System:~# bpftool link show
+1: tracing prog 2
+ prog_type tracing attach_type modify_return
+ target_obj_id 1 target_btf_id 35400
+408: raw_tracepoint prog 1120
+ tp 'sched_wakeup'
+409: raw_tracepoint prog 1122
+ tp 'sched_wakeup_new'
+410: perf_event prog 1123
+ tracepoint sched_process_fork
+411: perf_event prog 1124
+ tracepoint sched_process_exit
+412: perf_event prog 1125
+ tracepoint sched_switch
+413: perf_event prog 1126
+ tracepoint sched_switch
+414: perf_event prog 1127
+ tracepoint cpu_idle
+415: perf_event prog 1128
+ tracepoint sys_enter
+416: perf_event prog 1129
+ tracepoint sys_exit
+417: perf_event prog 1130
+ tracepoint softirq_entry
+418: perf_event prog 1131
+ tracepoint softirq_exit
+419: perf_event prog 1132
+ tracepoint irq_handler_entry
+420: perf_event prog 1133
+ tracepoint irq_handler_exit
+421: perf_event prog 1134
+ event 6 :0
+422: perf_event prog 1135
+ event 6 :0
+```
+
+挂载了14个ebpf程åºï¼Œraw_tracepoint 2个,tracepoint 10 个,perf_event 2 个
+
+## cpu使用情况
+é€šè¿‡æŒ‚è½½åœ¨ä»¥ä¸‹å†…æ ¸èŠ‚ç‚¹ä¸Šçš„ BPF 程åºï¼Œå¯¹ CPU ä¸åŒåŠŸèƒ½çš„ä½¿ç”¨çŽ‡è¿›è¡Œç»Ÿè®¡ï¼š
+- è¿è¡Œæ—¶é—´ï¼šsched_switch
+- 空闲状æ€ï¼šcpu_idle
+- å†…æ ¸æ€æˆ–用户æ€ï¼šsys_enter å’Œ sys_exit
+- è½¯ä¸æ–:softirq_entry å’Œ softirq_exit
+- ç¡¬ä¸æ–:irq_handler_entry å’Œ irq_handler_exit
+
+这些节点的挂载覆盖 CPU çš„å„ç§å·¥ä½œçжæ€ï¼Œæ”¯æŒç³»ç»Ÿçº§åˆ«çš„使用率分æž
+
+本地文件ä¿å˜åœ¨`visualize/run/cpu_usage.csv`ä¸ï¼Œæ ¼å¼å¦‚下
+```
+CPU ID,User Time,Kernel Time,Idle Time,IRQ Time,SoftIRQ Time
+0,0.000000,0.050000,0.920000,0.000000,0.000000
+1,0.000000,0.010000,0.940000,0.000000,0.000000
+2,0.000000,0.020000,0.900000,0.000000,0.000000
+3,0.000000,0.020000,0.960000,0.000000,0.000000
+4,0.000000,0.050000,0.940000,0.000000,0.000000
+5,0.000000,0.140000,0.840000,0.000000,0.000000
+6,0.000000,0.050000,0.930000,0.000000,0.000000
+7,0.000000,0.100000,0.840000,0.000000,0.000000
+8,0.000000,0.010000,0.970000,0.000000,0.000000
+9,0.000000,0.040000,0.860000,0.000000,0.000000
+10,0.000000,0.020000,0.950000,0.000000,0.000000
+11,0.030000,0.590000,0.290000,0.000000,0.000000
+```
+æ¯500ms用perf事件输出一次
+
+## cpuå 用率高的线程的情况
+系统为æ¯ä¸ªä»»åŠ¡ç»´æŠ¤äº†ä¸€ä¸ª struct task_cpu_usage æ•°æ®ç»“构,用于å˜å‚¨çº¿ç¨‹çš„ CPU 使用情况,并记录在 task_cpu_usage_map ä¸ã€‚
+åŒæ—¶ï¼Œé€šè¿‡ä»¥ä¸‹æœºåˆ¶å¯¹é«˜å 用线程进行æ•获和输出:
+1. 高å 用线程的æ•获
+ - 使用函数 task_concerned_update(struct task_cpu_usage *task_usage, u32 threshold)
+ - 该函数对线程的 CPU å 用情况进行判æ–,并将å 用率高于阈值的线程移入 thread_occupied_mapï¼Œå¹¶è§¦å‘ perf 输出
+2. 输出优化
+ - æ¯ 500 毫秒清ç†ä¸€æ¬¡å 用率记录
+ - è®¾ç½®å‚æ•°ç¡®ä¿æå‰è¶…过阈值的线程ä¸ä¼šè¢«é‡å¤è¾“出
+ - 对于æå‰è¾¾åˆ°é˜ˆå€¼çš„线程,其å ç”¨çŽ‡æ ¹æ®æ—¶é—´æ¯”例进行线性增长,公å¼å¦‚下
+
+ `u64 delta = (HALF_SECOND + task_usage->last_clear_time - now) * 10 / HALF_SECOND;`
+
+输出ä¿å˜åœ¨`visualize/run/task_usage.csv`
+```
+PID,Name,Total Percent,Kernel Percent,User Percent
+76167,code,51.000000,1.000000,0.000000
+76318,cpptools,185.000000,1.000000,0.000000
+77306,xrdp,21.000000,1.000000,0.000000
+3863,Xorg,10.000000,1.000000,0.000000
+76167,code,42.000000,1.000000,0.000000
+3863,Xorg,41.000000,1.000000,0.000000
+77306,xrdp,53.000000,1.000000,0.000000
+3863,Xorg,30.000000,1.000000,0.000000
+77306,xrdp,37.000000,1.000000,0.000000
+```
+
+## cpuå 用率高的进程的情况
+统计高å 用进程的逻辑与线程类似,但记录维度由 pid 转æ¢ä¸º tgid(进程 ID)。具体实现包括:
+1. 进程 CPU 使用记录
+ - 所有进程的 CPU 使用情况å˜å‚¨åœ¨ process_map ä¸
+ - 通过 process_concerned_update(struct process_struct *ps, u32 threshold) 函数,判æ–高å 用进程并触å‘记录与输出
+2. 高å 用进程的管ç†ä¸Žè¾“出
+ - 高å 用进程的信æ¯å˜å‚¨åœ¨ process_occupied_map ä¸ï¼Œå¹¶é€šè¿‡ perf 输出
+
+è¿™ç§è®¾è®¡ä¸Žçº¿ç¨‹ç»Ÿè®¡ä¸€è‡´ï¼Œä¾¿äºŽä»Žçº¿ç¨‹å’Œè¿›ç¨‹ä¸¤ä¸ªç»´åº¦æ•获 CPU 高å 用的异常行为
+
+输出ä¿å˜åœ¨`visualize/run/process_stat.csv`
+```
+TGID,Kids Length,Total Percent
+77306,1,68.000000
+3863,1,51.000000
+76167,9,60.000000
+76167,11,65.000000
+77306,1,53.000000
+77620,1,150.000000
+```
+
+
+
+## 调度延迟
+调度延迟功能å‚考自 runqlat,用于监控任务ç‰å¾… CPU 调度的时间分布。其具体实现特点如下:
+1. 时间区间统计
+ - 将任务ç‰å¾…调度的时间分为 8 个区间,分别代表ä¸åŒçš„ç‰å¾…时间范围
+ - æ•°æ®è®°å½•为累计值,从 BPF 程åºå¯åŠ¨å¼€å§‹ï¼Œæ¯ 500 毫秒更新一次
+2. åæ˜ CPU 压力
+ - ç´¯è®¡å€¼åæ˜ 系统ä¸ä»»åŠ¡çš„è°ƒåº¦å»¶è¿Ÿåˆ†å¸ƒï¼Œä»Žä¸å¯ä»¥è¯„ä¼°å½“å‰ CPU 的压力情况
+ - 当å˜åœ¨å¼‚常任务å ç”¨å¤§é‡ CPU 时,åŽå‡ 个区间的值会增长更快,表明调度压力显著增åŠ
+
+通过分æžè°ƒåº¦å»¶è¿Ÿï¼Œå¯ä»¥å¿«é€Ÿåˆ¤æ–系统当å‰çš„调度å¥åº·çŠ¶å†µï¼Œå¹¶ä¸ºå¼‚å¸¸ä»»åŠ¡çš„å®šä½æä¾›ä¾æ®
+
+本地文件是在`visualize/run/runqlat`
+```
+1us,4us,16us,64us,256us,1ms,4ms,4ms+
+4384,570,252,36,0,0,0,0
+4764,1019,514,68,0,0,2,0
+5144,1376,818,101,0,1,3,1
+5336,1611,1067,125,1,1,3,1
+5403,1680,1167,176,2,3,3,1
+5415,1719,1221,234,2,3,3,1
+5426,1746,1262,280,2,4,3,1
+5432,1773,1296,319,2,4,3,1
+5515,1842,1357,366,3,5,3,1
+5728,1951,1413,391,3,5,3,1
+6423,2338,1563,434,6,8,3,1
+6498,2424,1626,483,6,8,3,1
+6732,2567,1702,521,10,9,3,1
+6975,2688,1783,568,10,9,3,1
+6986,2737,1827,626,10,9,3,1
+7192,2821,1874,659,11,9,3,1
+```
+
+
+## 实验
+这部分对应的视频是â€cpu部分â€ï¼ŒåŒæ ·è¿™ä¹Ÿæ˜¯ä¹‹åŽscx-nestéƒ¨åˆ†çš„é¦–ä¸ªæµ‹è¯•è§†é¢‘ï¼Œä¸‹é¢æ‰€æœ‰çš„图片都是æºäºŽè¿™ä¸ªè§†é¢‘,具体数æ®åˆ†æžåœ¨scx-nest部分详细分æž
+
+
+
+
+
+
+对比pid部分和tgid部分å¯ä»¥çœ‹åˆ°ç›‘视程åºéƒ½æˆåŠŸæŠŠstress-ng识别了出æ¥
+
+对于csvæ•°æ®ä¹Ÿéƒ½åšäº†å¯è§†åŒ–处ç†ï¼Œå¯¹äºŽcpu部分的就在`visualize/cpu_data_analyse.py`,这里展示部分统计图
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Document/cpu_kernel_time.png b/Document/cpu_kernel_time.png
new file mode 100644
index 0000000..cc22088
Binary files /dev/null and b/Document/cpu_kernel_time.png differ
diff --git a/Document/img.png b/Document/img.png
new file mode 100644
index 0000000..9acdf77
Binary files /dev/null and b/Document/img.png differ
diff --git a/Document/img_1.png b/Document/img_1.png
new file mode 100644
index 0000000..5427a25
Binary files /dev/null and b/Document/img_1.png differ
diff --git a/Document/img_10.png b/Document/img_10.png
new file mode 100644
index 0000000..b36bf59
Binary files /dev/null and b/Document/img_10.png differ
diff --git a/Document/img_11.png b/Document/img_11.png
new file mode 100644
index 0000000..2bb61af
Binary files /dev/null and b/Document/img_11.png differ
diff --git a/Document/img_12.png b/Document/img_12.png
new file mode 100644
index 0000000..9b686b9
Binary files /dev/null and b/Document/img_12.png differ
diff --git a/Document/img_13.png b/Document/img_13.png
new file mode 100644
index 0000000..629596a
Binary files /dev/null and b/Document/img_13.png differ
diff --git a/Document/img_14.png b/Document/img_14.png
new file mode 100644
index 0000000..403abdf
Binary files /dev/null and b/Document/img_14.png differ
diff --git a/Document/img_15.png b/Document/img_15.png
new file mode 100644
index 0000000..42829dd
Binary files /dev/null and b/Document/img_15.png differ
diff --git a/Document/img_16.png b/Document/img_16.png
new file mode 100644
index 0000000..3cef8ff
Binary files /dev/null and b/Document/img_16.png differ
diff --git a/Document/img_17.png b/Document/img_17.png
new file mode 100644
index 0000000..eef1255
Binary files /dev/null and b/Document/img_17.png differ
diff --git a/Document/img_18.png b/Document/img_18.png
new file mode 100644
index 0000000..6c0072e
Binary files /dev/null and b/Document/img_18.png differ
diff --git a/Document/img_19.png b/Document/img_19.png
new file mode 100644
index 0000000..a2886b0
Binary files /dev/null and b/Document/img_19.png differ
diff --git a/Document/img_2.png b/Document/img_2.png
new file mode 100644
index 0000000..d5458e4
Binary files /dev/null and b/Document/img_2.png differ
diff --git a/Document/img_20.png b/Document/img_20.png
new file mode 100644
index 0000000..1811b34
Binary files /dev/null and b/Document/img_20.png differ
diff --git a/Document/img_21.png b/Document/img_21.png
new file mode 100644
index 0000000..7b3419b
Binary files /dev/null and b/Document/img_21.png differ
diff --git a/Document/img_22.png b/Document/img_22.png
new file mode 100644
index 0000000..b11a281
Binary files /dev/null and b/Document/img_22.png differ
diff --git a/Document/img_23.png b/Document/img_23.png
new file mode 100644
index 0000000..78b3702
Binary files /dev/null and b/Document/img_23.png differ
diff --git a/Document/img_24.png b/Document/img_24.png
new file mode 100644
index 0000000..d45b7d2
Binary files /dev/null and b/Document/img_24.png differ
diff --git a/Document/img_25.png b/Document/img_25.png
new file mode 100644
index 0000000..4aa9dd2
Binary files /dev/null and b/Document/img_25.png differ
diff --git a/Document/img_26.png b/Document/img_26.png
new file mode 100644
index 0000000..f279877
Binary files /dev/null and b/Document/img_26.png differ
diff --git a/Document/img_27.png b/Document/img_27.png
new file mode 100644
index 0000000..66145c2
Binary files /dev/null and b/Document/img_27.png differ
diff --git a/Document/img_28.png b/Document/img_28.png
new file mode 100644
index 0000000..253ab98
Binary files /dev/null and b/Document/img_28.png differ
diff --git a/Document/img_29.png b/Document/img_29.png
new file mode 100644
index 0000000..1ef8bb2
Binary files /dev/null and b/Document/img_29.png differ
diff --git a/Document/img_3.png b/Document/img_3.png
new file mode 100644
index 0000000..795312b
Binary files /dev/null and b/Document/img_3.png differ
diff --git a/Document/img_30.png b/Document/img_30.png
new file mode 100644
index 0000000..fa6c236
Binary files /dev/null and b/Document/img_30.png differ
diff --git a/Document/img_31.png b/Document/img_31.png
new file mode 100644
index 0000000..45040e5
Binary files /dev/null and b/Document/img_31.png differ
diff --git a/Document/img_32.jpg b/Document/img_32.jpg
new file mode 100644
index 0000000..bcee0fa
Binary files /dev/null and b/Document/img_32.jpg differ
diff --git a/Document/img_33.jpg b/Document/img_33.jpg
new file mode 100644
index 0000000..86989fc
Binary files /dev/null and b/Document/img_33.jpg differ
diff --git a/Document/img_4.png b/Document/img_4.png
new file mode 100644
index 0000000..7e89156
Binary files /dev/null and b/Document/img_4.png differ
diff --git a/Document/img_5.png b/Document/img_5.png
new file mode 100644
index 0000000..25ec4ba
Binary files /dev/null and b/Document/img_5.png differ
diff --git a/Document/img_6.png b/Document/img_6.png
new file mode 100644
index 0000000..b4adb0b
Binary files /dev/null and b/Document/img_6.png differ
diff --git a/Document/img_7.png b/Document/img_7.png
new file mode 100644
index 0000000..70d6a7d
Binary files /dev/null and b/Document/img_7.png differ
diff --git a/Document/img_8.png b/Document/img_8.png
new file mode 100644
index 0000000..34d82f9
Binary files /dev/null and b/Document/img_8.png differ
diff --git a/Document/img_9.png b/Document/img_9.png
new file mode 100644
index 0000000..f4d08cd
Binary files /dev/null and b/Document/img_9.png differ
diff --git a/Document/io.md b/Document/io.md
new file mode 100644
index 0000000..3e8cd95
--- /dev/null
+++ b/Document/io.md
@@ -0,0 +1,209 @@
+## 挂载的程åºå’Œç›¸å…³é’©å
+```shell
+root@ne0-System:~# bpftool link show
+1: tracing prog 2
+ prog_type tracing attach_type modify_return
+ target_obj_id 1 target_btf_id 35400
+444: perf_event prog 1178
+ tracepoint block_rq_issue
+445: perf_event prog 1180
+ tracepoint block_rq_complete
+446: perf_event prog 1182
+ tracepoint sys_enter_read
+447: perf_event prog 1183
+ tracepoint sys_enter_write
+448: perf_event prog 1184
+ tracepoint sched_process_exit
+449: perf_event prog 1181
+ event 6 :0
+```
+```shell
+root@ne0-System:~# bpftool prog show
+1178: tracepoint name io_trace_rq_issue tag cc594f0a6ac10c35 gpl
+ loaded_at 2024-12-22T16:00:30+0800 uid 0
+ xlated 112B jited 69B memlock 4096B map_ids 602,611
+ btf_id 478
+1180: tracepoint name io_trace_rq_complete tag ede2777588a83655 gpl
+ loaded_at 2024-12-22T16:00:30+0800 uid 0
+ xlated 584B jited 340B memlock 4096B map_ids 602,604,611
+ btf_id 478
+1181: perf_event name handle_io_wait_event tag efb43df12d62b386 gpl
+ loaded_at 2024-12-22T16:00:30+0800 uid 0
+ xlated 1280B jited 654B memlock 4096B map_ids 603,611,604
+ btf_id 478
+1182: tracepoint name io_trace_enter_read tag 723f556fb255b6fe gpl
+ loaded_at 2024-12-22T16:00:30+0800 uid 0
+ xlated 2256B jited 1200B memlock 4096B map_ids 605,606,607,611,608,609
+ btf_id 478
+1183: tracepoint name io_trace_enter_write tag e393cb3e6a12faa6 gpl
+ loaded_at 2024-12-22T16:00:30+0800 uid 0
+ xlated 2264B jited 1203B memlock 4096B map_ids 605,606,607,611,608,609
+ btf_id 478
+1184: tracepoint name handle_io_task_exit tag c08bfb018faad224 gpl
+ loaded_at 2024-12-22T16:00:30+0800 uid 0
+ xlated 184B jited 117B memlock 4096B map_ids 605,611
+ btf_id 478
+```
+总挂载点数é‡6个,tracepoint5 个(block_rq_issue, block_rq_complete, sys_enter_read, sys_enter_write, sched_process_exit),
+perf_event 1 个
+
+
+## 系统IO的整体情况
+cpu部分是当时第一个编写的,所以把部分å¯ä»¥ä»Žprocçš„è¯»çš„ä¹Ÿé‡æ–°ç”¨ebpfå¤çŽ°äº†ä¸€ä¸‹ï¼Œ
+之åŽçš„三个部分都是先通过procèŽ·å–æ•´ä½“性的数æ®ï¼Œç„¶åŽå¯¹äºŽproc获得ä¸äº†çš„,å†è¿›ä¸€æ¥ebpf
+
+```shell
+Disk IO Statistics
+---------------------------------------------------------------------
+Device Read(MB/s) Write(MB/s) IOPS iowait(ms)
+---------------------------------------------------------------------
+nvme0n1 0.00 0.09 12 0.42
+nvme0n1p1 0.00 0.00 0 0.00
+nvme0n1p2 0.00 0.00 0 0.00
+nvme0n1p3 0.00 0.00 0 0.00
+nvme0n1p4 0.00 0.00 0 0.00
+nvme0n1p5 0.00 0.00 0 0.00
+nvme0n1p6 0.00 0.00 0 0.00
+nvme0n1p7 0.00 0.00 0 0.00
+nvme0n1p8 0.00 0.00 0 0.00
+nvme0n1p9 0.00 0.09 12 0.42
+nvme0n1p10 0.00 0.00 0 0.00
+sda 0.00 0.00 0 0.00
+sda1 0.00 0.00 0 0.00
+---------------------------------------------------------------------
+```
+从procä¸è¯»å–æ•°æ®å¤„ç†åŽå¾—åˆ°çš„è¡¨æ ¼ï¼Œæ˜¯ä¸€å¼ æ˜¾ç¤ºç£ç›˜å’Œåˆ†åŒº I/O ç»Ÿè®¡çš„è¡¨æ ¼ï¼Œç”¨äºŽç›‘æŽ§ç³»ç»Ÿä¸å„ç£ç›˜è®¾å¤‡åŠå…¶åˆ†åŒºçš„è¯»å†™æ€§èƒ½æŒ‡æ ‡
+- Device:ç£ç›˜æˆ–分区的设备å称,例如 nvme0n1, nvme0n1p1, sda
+- Read/Write(MB/s):æ¯ç§’读å–/写入的数æ®é‡ï¼ˆå•ä½ï¼šMB/s)
+- IOPS:æ¯ç§’ I/O æ“作数(Input/Output Operations Per Second)
+- iowait:I/O ç‰å¾…时间(å•ä½ï¼šæ¯«ç§’),表示设备平å‡ç‰å¾…æ—¶é—´
+
+检测å„个ç£ç›˜å’Œåˆ†åŒºçš„ I/O 活动,识别活跃的设备和潜在的性能瓶颈。
+
+
+## 对写入或读å–超阈值的task进行监视
+1. 对写入或读å–超阈值的任务进行监视
+ - 实现方å¼
+ - 建立 io_task_stats_mapï¼Œç”¨äºŽæ˜ å°„æ¯ä¸ªä»»åŠ¡çš„è¯»å–é‡å’Œå†™å…¥é‡
+ - 挂载在以下 tracepoint 节点
+ - tracepoint/syscalls/sys_enter_write:统计写入调用次数
+ - tracepoint/syscalls/sys_enter_read:统计读å–调用次数
+ - 实现逻辑
+ - 通过 io_task_compare_and_commit(struct io_task_stats *task) 函数,对超过阈值的任务进行æ•èŽ·å¹¶è§¦å‘ perf 输出
+2. 阈值定义
+ - ç»Ÿè®¡ç›®æ ‡ï¼šåœ¨æŒ‡å®šæ—¶é—´çª—å£å†…的读å–和写入调用次数,å³è¯»å†™é¢‘率
+ - 具体结构为
+```c
+struct io_stats_threhold task = {
+ .read_count = 50,
+ .write_count = 50,
+ .time_window = (1000 * MSEC) // 1s
+};
+```
+ - æå‰è¾¾åˆ°é˜ˆå€¼çš„调整:对于æå‰è¾¾åˆ°é˜ˆå€¼çš„ä»»åŠ¡ï¼Œæ ¹æ®è·ç¦»æ—¶é—´çª—壿œ«å°¾çš„æ—¶é—´ï¼ŒåЍæ€è°ƒæ•´ç»Ÿè®¡å€¼
+```c
+u64 time_spare = task->last_clear_time + threhold->time_window - now;
+time_spare = time_spare * 100 / threhold->time_window;
+time_spare = (u32)time_spare;
+if (time_spare > 10) {
+ buff->write_count *= (time_spare / 10);
+ buff->read_count *= (time_spare / 10);
+}
+```
+
+
+对于结果的输出,本地的数æ®ä¿å˜åœ¨`visualize/run/io_task_stats.csv`
+```
+PID,Command,Read Count,Write Count
+76310,cpptools,450,0
+76493,cpptools-srv,450,0
+76495,cpptools-srv,0,450
+76500,cpptools,0,450
+76502,cpptools,0,450
+76499,cpptools,0,450
+76501,cpptools,0,450
+76497,cpptools-srv,0,450
+76494,cpptools-srv,0,450
+76241,code,198,300
+77982,os_spy,40,200
+77982,os_spy,48,200
+77982,os_spy,48,200
+77982,os_spy,48,200
+2899,prometheus-node,450,0
+2896,prometheus-node,450,0
+7023,prometheus-node,450,0
+```
+
+## 对写入或读å–超阈值的process进行监视
+- 实现方å¼
+ - 类似于任务的监视机制,但统计的å•ä½ä¸ºè¿›ç¨‹
+ - 使用 io_process_stats_map 记录æ¯ä¸ªè¿›ç¨‹çš„ IO 行为
+- 特点
+ - 通过相åŒçš„逻辑判æ–è¶…é˜ˆå€¼çš„è¿›ç¨‹ï¼Œå¹¶è§¦å‘ perf 输出
+ - 便于从全局视角监控å 用 IO 资æºè¾ƒå¤šçš„进程
+
+æ•°æ®å˜å‚¨åœ¨æœ¬åœ°çš„`visualize/run/io_process_stats`
+```
+TGID,Read Count,Write Count
+76306,100,65
+76490,100,51
+76076,100,56
+723,100,2
+723,101,2
+3993,41,100
+3993,60,100
+723,100,1
+723,101,1
+3993,44,100
+```
+
+## 对IO请求的相应延迟
+- 延迟计算
+ - 挂载在以下 tracepoint 节点
+ - tracepoint/block/block_rq_issue:记录 IO 请求开始的时间
+ - tracepoint/block/block_rq_complete:记录 IO 请求完æˆçš„æ—¶é—´
+ - 计算请求延迟为两次时间记录的差值
+- 延迟统计
+ - 对请求延迟进行计数统计,记录延迟分布数æ®
+
+具体的本地数æ®å˜å‚¨åœ¨`visualize/run/iowait_perf`
+
+```
+1us,4us,16us,64us,256us,1ms,4ms,4ms+
+0,0,0,0,1,0,0,0
+0,0,0,0,2,1,1,0
+0,0,0,0,2,1,1,0
+0,0,0,0,3,1,3,0
+0,0,0,0,3,1,3,0
+0,0,0,0,4,1,3,0
+0,0,0,0,4,1,3,0
+0,0,0,1,8,3,6,1
+0,0,0,1,8,3,6,1
+0,0,0,1,8,4,6,2
+0,0,0,1,8,4,6,2
+0,0,0,1,8,4,6,2
+0,0,0,1,8,4,6,2
+0,0,0,1,8,5,6,2
+0,0,0,1,8,5,6,2
+0,0,0,1,8,7,7,2
+0,0,0,1,8,7,7,2
+```
+
+
+## 实验
+具体在视频链接的“IO部分â€
+
+
+
+
+
+
+
+
+
+
+
+
+对于csvæ•°æ®ä¹Ÿéƒ½åšäº†å¯è§†åŒ–处ç†ï¼Œå¯¹äºŽio部分的就在`visualize/io_data_analyse.py`,这里展示部分统计图
+
+
diff --git a/Document/io_task_write.png b/Document/io_task_write.png
new file mode 100644
index 0000000..586ef05
Binary files /dev/null and b/Document/io_task_write.png differ
diff --git a/Document/memory.md b/Document/memory.md
new file mode 100644
index 0000000..15b7993
--- /dev/null
+++ b/Document/memory.md
@@ -0,0 +1,358 @@
+## 挂载的程åºå’Œç›¸å…³é’©å
+```shell
+root@ne0-System:~# bpftool link show
+1260: kprobe name malloc_enter tag 2e4ae9a5ee7c4561 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 240B jited 148B memlock 4096B map_ids 666,660
+ btf_id 501
+1262: kprobe name free_enter tag fc5984fdad8cdf46 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 352B jited 213B memlock 4096B map_ids 661,662,666
+ btf_id 501
+1263: kprobe name calloc_enter tag 33dfaebac0a311fb gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 256B jited 156B memlock 4096B map_ids 666,660
+ btf_id 501
+1264: kprobe name realloc_enter tag 95ea65071e38bc9e gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 576B jited 340B memlock 4096B map_ids 661,662,666,660
+ btf_id 501
+1265: kprobe name mmap_enter tag 6d3f5f3c48ca8ee9 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 240B jited 148B memlock 4096B map_ids 666,660
+ btf_id 501
+1266: kprobe name munmap_enter tag fc5984fdad8cdf46 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 352B jited 213B memlock 4096B map_ids 661,662,666
+ btf_id 501
+1267: kprobe name posix_memalign_enter tag ea48ae5dc2be047f gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 344B jited 200B memlock 4096B map_ids 663,666,660
+ btf_id 501
+1268: kprobe name aligned_alloc_enter tag 6d3f5f3c48ca8ee9 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 240B jited 148B memlock 4096B map_ids 666,660
+ btf_id 501
+1269: kprobe name valloc_enter tag 2e4ae9a5ee7c4561 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 240B jited 148B memlock 4096B map_ids 666,660
+ btf_id 501
+1270: kprobe name memalign_enter tag 6d3f5f3c48ca8ee9 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 240B jited 148B memlock 4096B map_ids 666,660
+ btf_id 501
+1271: kprobe name pvalloc_enter tag 2e4ae9a5ee7c4561 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 240B jited 148B memlock 4096B map_ids 666,660
+ btf_id 501
+1272: kprobe name malloc_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1273: kprobe name calloc_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1274: kprobe name realloc_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1275: kprobe name mmap_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1276: kprobe name posix_memalign_exit tag 88fa353e53959581 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 936B jited 549B memlock 4096B map_ids 663,660,664,661,666,662,667
+ btf_id 501
+1277: kprobe name aligned_alloc_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1278: kprobe name valloc_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1279: kprobe name memalign_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1280: kprobe name pvalloc_exit tag ce5ecb314224e364 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 736B jited 430B memlock 4096B map_ids 660,664,661,666,662,667
+ btf_id 501
+1281: tracepoint name memleak__kmalloc tag bbdda729ba968fd2 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 1096B jited 635B memlock 4096B map_ids 666,660,664,661,662,667
+ btf_id 501
+1282: tracepoint name memleak__kfree tag 4c1aa144b95d034a gpl recursion_misses 2
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 408B jited 241B memlock 4096B map_ids 661,662,666
+ btf_id 501
+1283: tracepoint name memleak__kmem_cache_alloc_node tag bbdda729ba968fd2 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 1096B jited 635B memlock 4096B map_ids 666,660,664,661,662,667
+ btf_id 501
+1284: tracepoint name memleak__kmem_cache_free tag 4c1aa144b95d034a gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 408B jited 241B memlock 4096B map_ids 661,662,666
+ btf_id 501
+1285: tracepoint name memleak__mm_page_alloc tag f996963c6c5eaf51 gpl recursion_misses 1
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 1008B jited 590B memlock 4096B map_ids 666,660,664,661,662,667
+ btf_id 501
+1286: tracepoint name memleak__mm_page_free tag 371c7edce49a5522 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 352B jited 213B memlock 4096B map_ids 661,662,666
+ btf_id 501
+1287: tracepoint name memleak__percpu_alloc_percpu tag 6a9933a1487357b8 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 976B jited 572B memlock 4096B map_ids 666,660,664,661,662,667
+ btf_id 501
+1288: tracepoint name memleak__percpu_free_percpu tag e471e6ba77e95c74 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 352B jited 213B memlock 4096B map_ids 661,662,666
+ btf_id 501
+1291: kprobe name oom_kill_process tag c29222416dc6edb9 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 344B jited 198B memlock 4096B map_ids 676,677
+ btf_id 502
+1292: tracepoint name trace_kmalloc tag 06788d6a8d9da18d gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 2104B jited 1101B memlock 4096B map_ids 669,670,673,677,674,675
+ btf_id 502
+1293: tracepoint name trace_kfree tag 06788d6a8d9da18d gpl recursion_misses 2
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 2104B jited 1101B memlock 4096B map_ids 669,670,673,677,674,675
+ btf_id 502
+1294: tracepoint name trace_page_alloc tag 9e84541614dd95cf gpl recursion_misses 1
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 2104B jited 1101B memlock 4096B map_ids 669,670,673,677,674,675
+ btf_id 502
+1295: tracepoint name trace_page_free tag 9e84541614dd95cf gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 2104B jited 1101B memlock 4096B map_ids 669,670,673,677,674,675
+ btf_id 502
+1296: tracepoint name trace_cache_alloc tag 2df646d571e4d41e gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 2112B jited 1106B memlock 4096B map_ids 669,670,673,677,674,675
+ btf_id 502
+1297: tracepoint name trace_cache_free tag 2df646d571e4d41e gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 2112B jited 1106B memlock 4096B map_ids 669,670,673,677,674,675
+ btf_id 502
+1298: tracepoint name handle_mm_task_exit tag c08bfb018faad224 gpl
+ loaded_at 2024-12-22T17:27:42+0800 uid 0
+ xlated 184B jited 117B memlock 4096B map_ids 669,677
+ btf_id 502
+```
+```shell
+root@ne0-System:~# bpftool link show
+1: tracing prog 2
+ prog_type tracing attach_type modify_return
+ target_obj_id 1 target_btf_id 35400
+487: perf_event prog 1281
+ tracepoint kmalloc
+488: perf_event prog 1282
+ tracepoint kfree
+489: perf_event prog 1283
+ tracepoint kmem_cache_alloc
+490: perf_event prog 1284
+ tracepoint kmem_cache_free
+491: perf_event prog 1285
+ tracepoint mm_page_alloc
+492: perf_event prog 1286
+ tracepoint mm_page_free
+493: perf_event prog 1287
+ tracepoint percpu_alloc_percpu
+494: perf_event prog 1288
+ tracepoint percpu_free_percpu
+495: perf_event prog 1291
+ kprobe ffffffffa79bf480 oom_kill_process
+496: perf_event prog 1292
+ tracepoint kmalloc
+497: perf_event prog 1293
+ tracepoint kfree
+498: perf_event prog 1294
+ tracepoint mm_page_alloc
+499: perf_event prog 1295
+ tracepoint mm_page_free
+500: perf_event prog 1296
+ tracepoint kmem_cache_alloc
+501: perf_event prog 1297
+ tracepoint kmem_cache_free
+502: perf_event prog 1298
+ tracepoint sched_process_exit
+```
+æŒ‚è½½çš„ç¨‹åºæ€»æ•°24个,kprobeæŒ‚è½½åˆ°å†…æ ¸å‡½æ•°å…¥å£å’Œå‡ºå£ï¼Œå…± 13 个程åºï¼ŒtracepointæŒ‚è½½åˆ°å†…æ ¸äº‹ä»¶ç‚¹ï¼ˆå¦‚å†…å˜åˆ†é…ã€é¡µåˆ†é…),共 11 个程åº
+
+
+## 系统整体的内å˜åˆ†é…情况
+通过直接在procä¸èŽ·å¾—çš„æ•°æ®å¯ä»¥ç›´æŽ¥åˆ†æžå¾—到当å‰ç³»ç»Ÿçš„æ•´ä½“情况
+```
+--- Memory Usage ---
+Total Memory: 32672744 kB
+Used Memory: 23731496 kB (72.63%)
+Available Memory: 28289196 kB (86.58%)
+Buffers: 1374208 kB
+Cached: 17898404 kB
+
+--- Swap Memory ---
+Total Swap: 32226300 kB
+Used Swap: 0 kB (0.00%)
+
+--- Memory Commitment ---
+Commit Limit: 48562672 kB
+Committed AS: 13347864 kB (27.49%)
+```
+- Memory Usage
+ - Used Memory:已使用内å˜ï¼ŒåŒ…括æ£åœ¨è¢«ç¨‹åºã€ç³»ç»Ÿç¼“å˜å’Œå…¶ä»–å†…æ ¸ç»„ä»¶å 用的内å˜
+ - Available Memory:表示目å‰å¯ä¾›æ–°ä»»åŠ¡ä½¿ç”¨çš„å†…å˜é‡ï¼ŒåŒ…括缓å˜å¯è¢«å›žæ”¶çš„部分
+ - Buffers:系统用于å—设备(如硬盘) I/O æ“作的缓冲区
+ - Cached:系统文件和程åºçš„ç¼“å˜æ•°æ®ï¼Œç”¨äºŽåŠ é€ŸåŽç»è®¿é—®
+- Swap Memory
+ - Total Swap:总交æ¢åˆ†åŒº
+ - Used Swap:已使用交æ¢åˆ†åŒº
+- Memory Commitment
+ - Commit Limit:系统å…è®¸çš„æœ€å¤§å†…å˜æ‰¿è¯ºé‡ï¼ŒåŒ…括物ç†å†…å˜å’Œäº¤æ¢åˆ†åŒº
+ - Committed AS:表示当å‰ç¨‹åºæ€»å…±ç”³è¯·çš„内å˜é‡ï¼ˆè™šæ‹Ÿåœ°å€ç©ºé—´ï¼‰ã€‚尽管申请了这部分内å˜ï¼Œä½†æœªå¿…全部被物ç†å†…å˜å®žé™…分é…
+
+
+## å†…æ ¸ä¸çš„内å˜åˆ†é…事件的跟踪
+这里的代ç 具体æ¥è¯´å°±æ˜¯å‚考 https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/16-memleak ,
+想去å°è¯•ç€å†™ä¸€ä¸‹æ ˆå›žæº¯çš„功能,我看网上这个就是个例å,于是å°è¯•ç€å¤çŽ°ä¸€ä¸‹ï¼ŒåŒæ—¶æŠŠå®ƒèžåˆè¿›æˆ‘的代ç ,
+è¿è¡Œçš„æœ¬åœ°ç»“æžœå˜å‚¨åœ¨[这里](visualize/proc/mm_alloc.txt)
+```
+ 0 [] __kmalloc_node_track_caller + 0x2f8
+ 0 [] __alloc_pages + 0x262
+ 0 [] __kmalloc_node.cold + 0x8b
+ 0 [] kmalloc_trace + 0x26f
+ 0 [] kmem_cache_alloc_node + 0x28d
+ 0 [] __kmalloc_node + 0x2fa
+ 0 [] __kmalloc + 0x290
+ 0 [] kmem_cache_alloc + 0x272
+ 0 [] kmem_cache_alloc_lru + 0x267
+ 0 [] pcpu_alloc + 0x476
+ 0 [] kmalloc_node_trace + 0x29a
+ 0 [] __kmalloc_node_track_caller + 0x2f8
+```
+å¤çŽ°è¿‡ç¨‹ä¸é‡åˆ°äº†å¾ˆå¤šé—®é¢˜ï¼Œæœ€ç»ˆç®—是到了上é¢è¿™ä¸ªç¨‹åº¦ï¼Œç®—是能精确定ä½åˆ°å†…æ ¸çš„å†…å˜åˆ†é…事件
+
+
+
+## taskå’Œprocess的内å˜åˆ†é…频率记录
+- æŒ‚è½½ç‚¹ï¼šç¨‹åºæŒ‚è½½åˆ°ä»¥ä¸‹å†…æ ¸ tracepoint 节点,记录内å˜åˆ†é…与释放的频率
+ - 分é…相关
+ - `tracepoint/kmem/kmalloc`
+ - `tracepoint/kmem/mm_page_alloc`
+ - `tracepoint/kmem/kmem_cache_alloc`
+ - 释放相关
+ - `tracepoint/kmem/kfree`
+ - `tracepoint/kmem/mm_page_free`
+ - `tracepoint/kmem/kmem_cache_free`
+- 记录维度
+ - 任务级:æ¯ä¸ªä»»åŠ¡çš„å†…å˜åˆ†é…频率统计
+ - 使用 task_compare_and_commit(struct task_mm_stats *task) 函数
+ - æ•获频ç¹è¿›è¡Œå†…å˜åˆ†é…和释放的异常任务
+ - 进程级:æ¯ä¸ªè¿›ç¨‹çš„内å˜åˆ†é…频率统计
+ - 使用 process_compare_and_commit(struct process_mm_stats *process) 函数
+ - å¯¹å¼‚å¸¸è¿›ç¨‹çš„å†…å˜æ“作进行记录
+
+æ•èŽ·é«˜é¢‘çŽ‡åˆ†é…æˆ–释放内å˜çš„任务和进程,定ä½å†…å˜æ³„æ¼æˆ–频ç¹å†…å˜æ“作引å‘的性能问题
+
+æ•°æ®åœ¨æœ¬åœ°çš„[这里](visualize/run/task_mm_stats.csv)å’Œ[这里](visualize/run/process_mm_stats.csv)
+
+
+```
+PID,Command,Kmem Count,Vmem Count,Slab Count
+76316,cpptools,0,500,71
+76318,cpptools,9,75,500
+77572,cpptools-srv,18,51,500
+76167,code,28,500,44
+76310,cpptools,500,8,333
+76493,cpptools-srv,500,31,334
+76208,code,9,500,21
+76084,Chrome_IOThread,2,500,17
+3863,Xorg,500,2,85
+76170,ThreadPoolForeg,0,500,3
+78661,os_spy,500,19,98
+76188,Compositor,21,500,81
+76171,ThreadPoolForeg,0,500,0
+3863,Xorg,500,1,94
+4033,xfwm4,500,0,117
+78661,os_spy,500,2,103
+76230,VizCompositorTh,500,0,106
+3863,Xorg,500,0,61
+78661,os_spy,2,500,70
+3863,Xorg,500,0,59
+76167,code,0,500,11
+2899,prometheus-node,286,27,500
+2900,prometheus-node,285,30,500
+810,prometheus-node,281,14,500
+```
+```
+TGID,Kmem Count,Vmem Count,Slab Count
+76306,6,1000,129
+76490,319,190,1000
+76167,97,1000,89
+76208,52,1000,50
+76076,2,1000,25
+78661,1000,19,98
+3863,1000,3,151
+3863,1000,1,252
+4033,1000,0,246
+78661,1000,2,103
+3863,1000,1,122
+78661,2,1000,148
+3863,1000,1,122
+76167,0,1000,12
+723,362,170,1000
+704,1000,84,482
+78661,1000,0,93
+3863,1000,1,112
+3863,1000,1,115
+```
+
+## oom事件记录
+- 挂载点
+ - 挂载到 kprobe/oom_kill_process,æ•èŽ·ç³»ç»Ÿè§¦å‘ OOM 事件时的详细信æ¯
+- æ•°æ®ç»“æž„
+ - OOM 事件的数æ®é€šè¿‡ä»¥ä¸‹ç»“æž„ä½“ä¼ é€’åˆ°ç”¨æˆ·æ€
+```c
+struct oom_event {
+ u32 trigger_id; // è§¦å‘ OOM 的进程 PID
+ u32 killed_id; // 被 OOM æ€æ»çš„进程 PID
+ char comm[TASK_COMM_LEN]; // è¢«æ€æ»è¿›ç¨‹çš„命令å
+ u64 kill_time; // OOM å‘生的时间戳
+};
+```
+精确记录 OOM 事件的触å‘与å—害者,便于快速分æžå†…å˜ä¸è¶³çš„åŽŸå› ï¼Œç»“åˆå†…å˜åˆ†é…频率数æ®ï¼Œå¯ä»¥æ·±å…¥å®šä½å¼‚常任务或进程
+
+æ•°æ®åœ¨æœ¬åœ°çš„[这里](visualize/run/oom_event.csv)
+
+
+
+
+## 实验
+具体对应的是链接ä¸çš„“memory部分â€
+
+
+
+
+
+
+
+
+
+
+
+对于csvæ•°æ®ä¹Ÿéƒ½åšäº†å¯è§†åŒ–处ç†ï¼Œå¯¹äºŽmemory部分的就在`visualize/mm_data_analyse.py`,这里展示部分统计图
+
+
+
+
+
+
+
+
+
diff --git a/Document/net.md b/Document/net.md
new file mode 100644
index 0000000..9c0f3c5
--- /dev/null
+++ b/Document/net.md
@@ -0,0 +1,260 @@
+## 挂载的程åºå’Œç›¸å…³é’©å
+```shell
+root@ne0-System:~# bpftool prog show
+1486: tracepoint name trace_retransmit tag 3626250b7905d155 gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 1160B jited 639B memlock 4096B map_ids 763,765
+ btf_id 556
+1488: kprobe name top_tcp_send_entry tag a7ce508aab49e47f gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 112B jited 70B memlock 4096B map_ids 760,765
+ btf_id 556
+1489: kprobe name top_tcp_send_ret tag d9c91fb97919a059 gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 3680B jited 1984B memlock 4096B map_ids 760,758,762,765,759
+ btf_id 556
+1490: kprobe name top_tcp_recv_entry tag 3db6d55e406884b9 gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 3552B jited 1910B memlock 4096B map_ids 758,762,765,759
+ btf_id 556
+1491: kprobe name tcp_v4_connect tag b03fb14003ec8076 gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 224B jited 126B memlock 4096B map_ids 757,765
+ btf_id 556
+1492: kprobe name tcp_v6_connect tag b03fb14003ec8076 gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 224B jited 126B memlock 4096B map_ids 757,765
+ btf_id 556
+1493: kprobe name tcp_rcv_state_process tag e94e0aad43db0596 gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 1008B jited 561B memlock 4096B map_ids 757,761,765
+ btf_id 556
+1494: tracing name tcprtt tag e11fbd522e358eb5 gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 680B jited 387B memlock 4096B map_ids 755,765
+ btf_id 556
+1495: perf_event name handle_tcprtt_event tag 2a56ebe47815a31d gpl
+ loaded_at 2024-12-22T22:05:26+0800 uid 0
+ xlated 472B jited 244B memlock 4096B map_ids 755,765,756
+ btf_id 556
+```
+```shell
+root@ne0-System:~# bpftool link show
+568: perf_event prog 1486
+ tracepoint tcp_retransmit_skb
+569: perf_event prog 1488
+ kprobe ffffffffa85b3020 tcp_sendmsg
+570: perf_event prog 1489
+ kretprobe ffffffffa85b3020 tcp_sendmsg
+571: perf_event prog 1490
+ kprobe ffffffffa85b3170 tcp_cleanup_rbuf
+572: perf_event prog 1491
+ kprobe ffffffffa85d3b70 tcp_v4_connect
+573: perf_event prog 1492
+ kprobe ffffffffa86ac640 tcp_v6_connect
+574: perf_event prog 1493
+ kprobe ffffffffa85c6290 tcp_rcv_state_process
+575: tracing prog 1494
+ prog_type tracing attach_type trace_fentry
+ target_obj_id 1 target_btf_id 55882
+576: perf_event prog 1495
+ event 6 :0
+```
+æŒ‚è½½çš„ç¨‹åºæ•°é‡9个,tracepoint 1个,kprobe/kretprobe 6 个
+
+
+## 系统整体的网络接å£ç»Ÿè®¡ä¿¡æ¯
+首先还是先从procä¸ç›´æŽ¥ç³»ç»Ÿçš„æ•´ä½“性数æ®
+```
+Interface,Bytes Received,Packets Received,Errs Rcv,Drops Rcv,Bytes Sent,Packets Sent,Errs Sent,Drops Sent
+lo,357168131,258560,0,0,357168131,258560,0,0
+enp5s0,3269952491,3791526,0,18932,12237168071,9750198,0,0
+docker0,0,0,0,0,0,0,0,0
+
+lo,357168131,258560,0,0,357168131,258560,0,0
+enp5s0,3269951654,3791513,0,18932,12237124409,9750158,0,0
+docker0,0,0,0,0,0,0,0,0
+```
+- Interface:网络接å£çš„å称,例如 lo(本地回环)ã€enp5s0(以太网接å£ï¼‰ã€docker0(Docker 桥接接å£ï¼‰
+- Bytes Received:接收到的总å—节数
+- Packets Received:接收到的数æ®åŒ…总数
+- Errs Rcv:接收时å‘生的错误数é‡ï¼ˆä¾‹å¦‚æ ¡éªŒé”™è¯¯æˆ–å¸§é”™è¯¯ï¼‰
+- Drops Rcv:接收时丢弃的数æ®åŒ…æ•°é‡ï¼Œå¯èƒ½å› 为队列溢出或其他原å›
+- Bytes Sent:å‘é€çš„æ€»å—节数
+- Packets Sent:å‘é€çš„æ•°æ®åŒ…总数
+- Errs Sent:å‘逿—¶å‘生的错误数é‡
+- Drops Sent:å‘逿—¶ä¸¢å¼ƒçš„æ•°æ®åŒ…æ•°é‡
+
+从这些信æ¯å¾—到系统整体的网络接å£çš„æµé‡ç»Ÿè®¡æ•°æ®è¡¨æœ¬åœ°æ•°æ®åœ¨[这里](visualize/proc/net.csv)
+
+## tcptop
+tcptop 用于显示系统ä¸åŸºäºŽ TCP å议的网络æµé‡ç»Ÿè®¡ä¿¡æ¯ï¼ŒåŒ…括æ¯ä¸ªè¿›ç¨‹çš„å‘é€å’ŒæŽ¥æ”¶æµé‡
+- 实现方å¼
+ - æŒ‚è½½åœ¨ä»¥ä¸‹å†…æ ¸èŠ‚ç‚¹
+ - kprobe/tcp_sendmsg å’Œ kretprobe/tcp_sendmsg:获å–任务的å‘é€å—节数
+ - kprobe/tcp_cleanup_rbuf:获å–任务的接收å—节数
+- 功能特点
+ - 实时统计æ¯ä¸ªè¿›ç¨‹çš„网络å‘é€å’ŒæŽ¥æ”¶æµé‡
+ - 帮助快速定ä½é«˜æµé‡çš„任务或进程,便于分æžç³»ç»Ÿçš„网络行为
+
+
+```
+Timestamp,PID,Comm,Sent_Bytes,Received_Bytes
+2024-12-22 22:05:27,79852,xrdp,76064,1976
+2024-12-22 22:05:28,79852,xrdp,629012,4251
+2024-12-22 22:05:29,79852,xrdp,930864,5628
+2024-12-22 22:05:30,79852,xrdp,1094929,5723
+2024-12-22 22:05:31,79852,xrdp,1186351,5749
+2024-12-22 22:05:32,79852,xrdp,1492384,5795
+2024-12-22 22:05:33,79852,xrdp,1651137,7911
+2024-12-22 22:18:21,79852,xrdp,872722,3271
+2024-12-22 22:18:22,79852,xrdp,1999434,8459
+2024-12-22 22:18:23,79852,xrdp,2662462,12991
+2024-12-22 22:18:24,79852,xrdp,3010331,14944
+2024-12-22 22:18:25,79852,xrdp,3014084,14966
+2024-12-22 22:18:26,79852,xrdp,3014392,15182
+2024-12-22 22:18:27,79852,xrdp,3014776,15254
+2024-12-22 22:18:28,79852,xrdp,3014978,15254
+2024-12-22 22:18:29,915,prometheus,11867,0
+```
+è¿è¡Œçš„æœ¬åœ°ç»“æžœå˜å‚¨åœ¨[这里](visualize/run/tcptop.csv)
+
+
+## tcprtt
+tcprtt 用于显示系统ä¸åŸºäºŽ TCP 连接的往返时间(Round-Trip Time, RTT)分布情况
+- 实现方å¼
+ - 挂载在 fentry/tcp_rcv_established 节点
+ - èŽ·å– sock ä¸çš„ srtt_us å—æ®µï¼Œæå–往返时间
+- 功能特点
+ - æ¯ç§’通过 perf 输出统计数æ®ï¼Œå±•示ä¸åŒ RTT 区间的网络请求分布
+ - 帮助分æžç³»ç»Ÿç½‘络延迟情况,评估网络性能
+
+
+```
+1ms,4ms,16ms,32ms,64ms,128ms,256ms,256ms+
+0,0,8,10,10,0,0,0
+0,0,139,10,10,0,0,0
+0,0,303,11,10,0,0,0
+3,0,333,30,47,0,0,0
+3,0,387,32,47,0,0,0
+3,31,422,32,47,0,0,0
+3,31,520,34,47,1,0,0
+6,33,522,37,47,1,0,0
+6,33,524,40,47,1,0,0
+6,33,525,40,47,1,0,0
+6,33,525,48,47,1,0,0
+6,33,525,58,47,1,0,0
+6,33,525,66,50,1,0,0
+12,33,525,75,50,1,0,0
+12,33,525,75,54,1,0,0
+12,33,525,75,56,1,0,0
+12,33,525,75,58,1,0,0
+15,35,525,75,60,1,0,0
+15,35,525,75,63,1,0,0
+15,35,525,75,66,1,0,0
+15,35,525,75,70,1,0,0
+15,35,525,75,82,1,0,0
+15,35,525,75,94,1,0,0
+15,35,525,101,102,1,0,0
+15,35,525,102,103,1,0,0
+```
+è¿è¡Œçš„æœ¬åœ°ç»“æžœå˜å‚¨åœ¨[这里](visualize/run/tcprtt.csv)
+
+
+## tcpretrans
+tcpretrans 用于显示系统ä¸å‘生的 TCP é‡ä¼ 事件,定ä½å…·ä½“的任务和连接
+- 实现方å¼
+ - 挂载在 tracepoint/tcp/tcp_retransmit_skb 节点
+ - æ•èŽ·æ¯æ¬¡ TCP æ•°æ®åŒ…é‡ä¼ 事件
+- 功能特点
+ - 精确记录å‘生é‡ä¼ 的任务信æ¯ï¼ŒåŒ…括 PIDã€æº IP å’Œç›®æ ‡ IP ç‰
+ - 帮助分æžç½‘络抖动ã€ä¸¢åŒ…ç‰é—®é¢˜ï¼Œä¼˜åŒ–ç³»ç»Ÿç½‘ç»œä¼ è¾“æ€§èƒ½
+
+网络这部分的数æ®éƒ½æ˜¯é€šè¿‡`visualize/net_with_delay.sh`è¿™ä¸ªæ¥æ¨¡æ‹Ÿçš„ï¼Œè¿™ä¸ªè„šæœ¬ä¼šåŠ å…¥ç»™ç³»ç»ŸåŠ å…¥ä¸€å®šçš„å»¶è¿Ÿå’ŒæŽ‰åŒ…çŽ‡ï¼Œè¿è¡Œ60s
+```
+Timestamp,PID,Comm,State,Event_Type,Source_IP,Source_Port,Destination_IP,Destination_Port
+2024-12-22 22:18:31.175572385,81508,python3,ESTABLISHED,1,::ffff:10.193.121.196,15629,::ffff:10.196.79.194,61794
+2024-12-22 22:18:35.664009094,81510,python3,ESTABLISHED,1,10.193.121.196,1764,98.85.100.80,443
+2024-12-22 22:18:36.030003791,81514,python3,ESTABLISHED,1,::ffff:10.193.121.196,15629,::ffff:10.196.79.194,61794
+2024-12-22 22:18:36.030738760,81514,python3,ESTABLISHED,1,::ffff:10.193.121.196,15629,::ffff:10.196.79.194,61794
+2024-12-22 22:18:39.633488507,81510,python3,ESTABLISHED,1,10.193.121.196,2692,98.85.100.80,443
+2024-12-22 22:18:39.636941928,81510,python3,ESTABLISHED,1,10.193.121.196,2692,98.85.100.80,443
+2024-12-22 22:18:41.211002518,81508,python3,ESTABLISHED,1,::ffff:10.193.121.196,15629,::ffff:10.196.79.194,61794
+2024-12-22 22:18:41.211005083,81508,python3,ESTABLISHED,1,::ffff:10.193.121.196,15629,::ffff:10.196.79.194,61794
+2024-12-22 22:18:43.497009470,81512,python3,ESTABLISHED,1,10.193.121.196,6788,98.85.100.80,443
+2024-12-22 22:18:48.290008285,81512,python3,ESTABLISHED,1,10.193.121.196,17028,98.85.100.80,443
+2024-12-22 22:18:48.547011250,81506,python3,ESTABLISHED,1,10.193.121.196,11918,34.226.108.155,443
+2024-12-22 22:18:48.797912580,81505,python3,ESTABLISHED,1,10.193.121.196,37504,34.226.108.155,443
+2024-12-22 22:18:48.798215136,81505,python3,ESTABLISHED,1,10.193.121.196,37504,34.226.108.155,443
+2024-12-22 22:18:48.798589181,81505,python3,ESTABLISHED,1,10.193.121.196,37504,34.226.108.155,443
+2024-12-22 22:18:48.799707180,81505,python3,ESTABLISHED,1,10.193.121.196,37504,34.226.108.155,443
+2024-12-22 22:18:49.708015183,81223,C1 CompilerThre,ESTABLISHED,1,10.193.121.196,13454,34.226.108.155,443
+```
+è¿è¡Œçš„æœ¬åœ°ç»“æžœå˜å‚¨åœ¨[这里](visualize/run/tcpretrans.csv)
+
+
+## tcp连接延迟
+用于监控 TCP 连接建立过程ä¸çš„延迟情况
+- 实现方å¼
+ - æŒ‚è½½åœ¨ä»¥ä¸‹å†…æ ¸èŠ‚ç‚¹
+ - tcp_v4_connect å’Œ tcp_v6_connect:æ•获 IPv4 å’Œ IPv6 çš„ TCP 连接请求
+ - tcp_rcv_state_process:æ•获 TCP 状æ€å¤„ç†äº‹ä»¶
+- 功能特点
+ - 记录从连接请求到完æˆçš„æ—¶é—´é—´éš”,精确评估 TCP 连接延迟
+ - 帮助å‘现å¯èƒ½å¯¼è‡´è¿žæŽ¥å»¶è¿Ÿçš„网络或系统问题
+
+
+
+```
+Timestamp,PID,Comm,Delay_us
+2024-12-22 22:05:27.675840321,76241,code,278458368
+2024-12-22 22:18:31.565844370,81505,python3,247682805
+2024-12-22 22:18:31.569318272,81508,python3,251836536
+2024-12-22 22:18:31.570976574,81506,python3,239246101
+2024-12-22 22:18:31.571226255,81510,python3,239484962
+2024-12-22 22:18:31.571479964,81507,python3,239863430
+2024-12-22 22:18:31.573810751,81515,python3,242115724
+2024-12-22 22:18:31.574551499,81512,python3,242965114
+2024-12-22 22:18:31.576232680,81509,python3,244483253
+```
+è¿è¡Œçš„æœ¬åœ°ç»“æžœå˜å‚¨åœ¨[这里](visualize/run/net_latency.csv)
+
+
+
+## 实验
+对应视频链接ä¸çš„“网络部分â€ï¼Œå¯¹äºŽè¿™éƒ¨åˆ†è¦æ³¨æ„的是我对网络专门编写了个测试程åºï¼Œå…·ä½“文件是`visualize/net_test.py`,
+在è¿è¡Œè„šæœ¬`visualize/net_with_delay.sh`ä¸ï¼Œå¯ä»¥ä¿®æ”¹ç½‘络平å‡å»¶è¿Ÿå’ŒæŽ‰åŒ…率,在上é¢è§£æžä¸ï¼Œæˆ‘是用笔记本远程控制主机åšçš„,
+所以在`tcptop`ä¸å¯ä»¥çœ‹åˆ°
+```
+Timestamp,PID,Comm,Sent_Bytes,Received_Bytes
+2024-12-22 22:05:27,79852,xrdp,76064,1976
+```
+åŒæ—¶ç½‘络影å“和掉包率对系统影å“å¾ˆå¤§ï¼Œä½†æ˜¯è™šæ‹Ÿæœºä¸æ²¡ç”¨äº†è¿œç¨‹æŽ§åˆ¶è¿™éƒ¨åˆ†ï¼Œå³ä¾¿æˆ‘把平å‡å»¶è¿Ÿæé«˜åˆ°10ms,掉包率æé«˜åˆ°5%,
+对系统整体影å“ä»ç„¶æœ‰é™ï¼Œè™šæ‹Ÿæœºä¸ç”¨åˆ°ç½‘络的任务还是少,é‡ä¼ 事件甚至是空的
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+对于csvæ•°æ®ä¹Ÿéƒ½åšäº†å¯è§†åŒ–处ç†ï¼Œå¯¹äºŽnet部分的就在`visualize/net_data_analyse.py`,这里展示部分统计图
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Document/net_sent.png b/Document/net_sent.png
new file mode 100644
index 0000000..44c4ff0
Binary files /dev/null and b/Document/net_sent.png differ
diff --git a/Document/process_cpu_total.png b/Document/process_cpu_total.png
new file mode 100644
index 0000000..123da3b
Binary files /dev/null and b/Document/process_cpu_total.png differ
diff --git a/Document/recieve_bytes.png b/Document/recieve_bytes.png
new file mode 100644
index 0000000..4e42353
Binary files /dev/null and b/Document/recieve_bytes.png differ
diff --git a/Document/sched/img.png b/Document/sched/img.png
new file mode 100644
index 0000000..42c47b3
Binary files /dev/null and b/Document/sched/img.png differ
diff --git a/Document/sched/img_1.png b/Document/sched/img_1.png
new file mode 100644
index 0000000..d831d11
Binary files /dev/null and b/Document/sched/img_1.png differ
diff --git a/Document/sched/img_10.png b/Document/sched/img_10.png
new file mode 100644
index 0000000..d6f5751
Binary files /dev/null and b/Document/sched/img_10.png differ
diff --git a/Document/sched/img_11.png b/Document/sched/img_11.png
new file mode 100644
index 0000000..5c385dd
Binary files /dev/null and b/Document/sched/img_11.png differ
diff --git a/Document/sched/img_2.png b/Document/sched/img_2.png
new file mode 100644
index 0000000..e5db42a
Binary files /dev/null and b/Document/sched/img_2.png differ
diff --git a/Document/sched/img_3.png b/Document/sched/img_3.png
new file mode 100644
index 0000000..14105e4
Binary files /dev/null and b/Document/sched/img_3.png differ
diff --git a/Document/sched/img_4.png b/Document/sched/img_4.png
new file mode 100644
index 0000000..0fc56a4
Binary files /dev/null and b/Document/sched/img_4.png differ
diff --git a/Document/sched/img_5.png b/Document/sched/img_5.png
new file mode 100644
index 0000000..60447b9
Binary files /dev/null and b/Document/sched/img_5.png differ
diff --git a/Document/sched/img_6.png b/Document/sched/img_6.png
new file mode 100644
index 0000000..0001aa2
Binary files /dev/null and b/Document/sched/img_6.png differ
diff --git a/Document/sched/img_8.png b/Document/sched/img_8.png
new file mode 100644
index 0000000..4b0e1d1
Binary files /dev/null and b/Document/sched/img_8.png differ
diff --git a/Document/sched/img_9.png b/Document/sched/img_9.png
new file mode 100644
index 0000000..bb87a9c
Binary files /dev/null and b/Document/sched/img_9.png differ
diff --git "a/Document/sched/thread\344\275\277\347\224\250.md" "b/Document/sched/thread\344\275\277\347\224\250.md"
new file mode 100644
index 0000000..0df8d47
--- /dev/null
+++ "b/Document/sched/thread\344\275\277\347\224\250.md"
@@ -0,0 +1,581 @@
+### c++的thread库
+```shell
+C++ Standard Library
+├── 线程创建与管ç†
+│ ├── std::thread : 创建线程对象
+│ ├── join() : ç‰å¾…线程完æˆ
+│ ├── detach() : 将线程设为分离状æ€
+│ └── hardware_concurrency(): 返回系统ä¸å¯å¹¶å‘执行的线程数é‡
+│
+├── çº¿ç¨‹åŒæ¥ä¸Žäº’æ–¥
+│ ├── std::mutex : 互斥é”
+│ │ ├── lock() : 显å¼åŠ é”
+│ │ ├── unlock() : 显å¼è§£é”
+│ │ └── try_lock() : å°è¯•åŠ é”(éžé˜»å¡žï¼‰
+│ ├── std::lock_guard : 自动管ç†äº’æ–¥é”
+│ ├── std::unique_lock : çµæ´»ç®¡ç†é”ï¼Œæ”¯æŒæ‰‹åЍé”定/è§£é”
+│ └── std::condition_variable : æ¡ä»¶å˜é‡ï¼Œç”¨äºŽç‰å¾…或通知线程
+│
+├── 线程通信
+│ ├── std::future : 获å–å¼‚æ¥æ“作结果
+│ ├── std::promise : æä¾›å€¼ç»™`future`
+│ └── std::async : å¯åЍ异æ¥ä»»åŠ¡å¹¶è¿”å›ž`future`
+│
+├── 线程局部å˜å‚¨
+│ └── thread_local : 定义线程局部å˜å‚¨å˜é‡
+│
+├── åŽŸåæ“ä½œ
+│ └── std::atomic : æä¾›åŽŸåæ“ä½œï¼Œé¿å…é”
+│ ├── store() : å˜å‚¨å€¼
+│ ├── load() : åŠ è½½å€¼
+│ └── compare_exchange : 比较并交æ¢
+│
+├── 线程异常处ç†
+│ └── std::terminate : æ•获未处ç†å¼‚常并终æ¢çº¿ç¨‹
+│
+└── 线程ID与状æ€
+ ├── std::this_thread::get_id() : 获å–当å‰çº¿ç¨‹ID
+ ├── std::thread::get_id() : 获å–线程对象的ID
+ ├── std::this_thread::sleep_for(): ä¼‘çœ æŒ‡å®šæ—¶é—´
+ └── std::this_thread::yield() : 暂时让出CPU时间片
+```
+#### thread函数的应用
+- 创建线程
+```c
+template< class Function, class... Args >
+explicit thread(Function&& f, Args&&... args); // åˆ›å»ºçº¿ç¨‹ï¼Œå¹¶ä¼ é€’å‚æ•°ç»™å‡½æ•°ï¼Œå¯ä»¥æ˜¯å¤šä¸ªå‚æ•°
+```
+对于这个函数注æ„命åç©ºé—´ï¼Œå¯¹äºŽç±»å†…çš„å‚æ•°ï¼Œå¦‚æžœthread在类内定义,直接用this指针,如果在类外定义
+```c
+// çº¿ç¨‹åˆ›å»ºæ—¶ä¼ é€’æˆå‘˜å‡½æ•°å’Œ this 指针
+std::thread t(&FooBar::foo, this, 傿•°åˆ—表);
+
+MyClass obj;
+// 通过 std::thread 调用 MyClass çš„æˆå‘˜å‡½æ•°
+std::thread t(&MyClass::printMessage, &obj); // ä¼ é€’æˆå‘˜å‡½æ•°æŒ‡é’ˆå’Œå¯¹è±¡æŒ‡é’ˆ
+```
+
+
+- 移动 std::thread 对象
+
+感觉和转接所有æƒå·®ä¸å¤šï¼Œt1 被移动给了 t2ï¼Œå› æ¤ t1 ä¸å†å…³è”线程,ä¸èƒ½å†è°ƒç”¨ join() 或其他æˆå‘˜å‡½æ•°
+```c
+std::thread t1(myFunction); // 创建线程
+// 将 t1 移动给 t2
+std::thread t2 = std::move(t1);
+```
+- è”æŽ¥
+
+在调用 join() 或 detach() 之å‰ï¼Œæœ€å¥½æ£€æŸ¥çº¿ç¨‹æ˜¯å¦å¯è”接,é¿å…程åºå´©æºƒ
+```c
+// bool joinable() const; // 检查线程是å¦å¯è”接
+#include
+#include
+
+void myFunction() {
+ std::cout << "Hello from thread!" << std::endl;
+}
+
+int main() {
+ std::thread t;
+
+ if (t.joinable()) {
+ t.join();
+ } else {
+ std::cout << "Thread is not joinable." << std::endl;
+ }
+
+ t = std::thread(myFunction); // 现在 t å…³è”到一个新的线程
+
+ if (t.joinable()) {
+ t.join();
+ }
+
+ return 0;
+}
+```
+- 获å–线程 ID:get_id()
+```c
+std::thread::id get_id() const; // 获å–线程的 ID
+```
+- 线程休çœ
+
+æœ‰æ—¶ä½ å¸Œæœ›è®©çº¿ç¨‹æš‚åœæ‰§è¡Œä¸€æ®µæ—¶é—´ï¼Œå¯ä»¥ä½¿ç”¨ sleep_for() 或 sleep_until()
+```c
+template< class Rep, class Period >
+void std::this_thread::sleep_for(const std::chrono::duration& rel_time); // 使当å‰çº¿ç¨‹ä¼‘çœ æŒ‡å®šæ—¶é—´
+
+template< class Clock, class Duration >
+void std::this_thread::sleep_until(const std::chrono::time_point& abs_time); // 使当å‰çº¿ç¨‹ä¼‘çœ ç›´åˆ°æŒ‡å®šæ—¶é—´
+```
+
+- 线程间通信
+
+线程间通信是多线程编程的é‡è¦éƒ¨åˆ†ã€‚std::promise å’Œ std::future æä¾›äº†ä¸€ç§æ–¹ä¾¿çš„æ–¹å¼è®©çº¿ç¨‹é—´ä¼ 递数æ®ã€‚
+
+å…¶å®žå¼‚æ¥æ›´å¥½ä¸€äº›ï¼Œè¿™éƒ¨åˆ†åˆ°æ—¶å€™å†å±•å¼€
+
+### é”å’Œæ¡ä»¶å˜é‡
+#### std::mutex:互斥é”
+```c
+class mutex {
+ public:
+ void lock(); // 阻塞,直到æˆåŠŸåŠ é”
+ void unlock(); // è§£é”互斥é”
+ bool try_lock(); // å°è¯•åŠ é”,如果é”定æˆåŠŸè¿”å›ž true,å¦åˆ™ç«‹å³è¿”回 false
+};
+```
+
+#### std::lock_guard:自动管ç†äº’æ–¥é”
+```c
+template< class Mutex >
+class lock_guard {
+public:
+explicit lock_guard( Mutex& m ); // æž„é€ æ—¶è‡ªåŠ¨åŠ é”
+~lock_guard(); // æžæž„时自动解é”
+};
+```
+```c
+std::mutex mtx; // 全局互斥é”
+int shared_data = 0;
+
+void increment() {
+ for (int i = 0; i < 10000; ++i) {
+ std::lock_guard lock(mtx); // è‡ªåŠ¨åŠ é”和解é”
+ ++shared_data;
+ // 当 lock 离开作用域时自动解é”
+ }
+}
+```
+std::lock_guard ä¼šåœ¨æž„é€ æ—¶è‡ªåŠ¨åŠ é”ï¼Œå¹¶åœ¨å…¶ç”Ÿå‘½å‘¨æœŸç»“æŸæ—¶è‡ªåŠ¨è§£é”,这简化了显å¼çš„ lock() å’Œ unlock() æ“作,é¿å…了手动管ç†é”的错误
+
+#### std::unique_lockï¼šçµæ´»ç®¡ç†é”
+std::unique_lock æä¾›äº†æ¯” std::lock_guard æ›´åŠ çµæ´»çš„é”ç®¡ç†æ–¹å¼ã€‚它å…è®¸æ‰‹åŠ¨åŠ é”和解é”,甚至å¯ä»¥å»¶è¿ŸåŠ é”ã€æå‰è§£é”,适åˆéœ€è¦æ›´å¤æ‚çš„é”æŽ§åˆ¶çš„åœºæ™¯
+```c
+template< class Mutex >
+class unique_lock {
+ public:
+ explicit unique_lock( Mutex& m ); // æž„é€ æ—¶åŠ é”
+ unique_lock( Mutex& m, std::defer_lock ); // 创建é”对象但ä¸ç«‹å³åŠ é”,å…许手动控制é”的时机
+ unique_lock( Mutex& m, std::try_to_lock );// å¯ä»¥ç«‹å³å°è¯•åŠ é”ï¼Œè€Œä¸æ˜¯é˜»å¡žç‰å¾…
+ unique_lock( Mutex& m, std::adopt_lock ); // é”å·²åŠ é”状æ€
+ void lock(); // æ‰‹åŠ¨åŠ é”
+ void unlock(); // 手动解é”
+ bool owns_lock() const; // è¿”å›žå½“å‰æ˜¯å¦æ‹¥æœ‰é”
+ Mutex* release(); // 释放é”的控制æƒï¼Œä½†ä¸è§£é”
+};
+```
+```c
+void task(int id) {
+ std::cout << "Thread " << id << " is trying to lock...\n";
+
+ // std::unique_lock 默认会阻塞线程直到获得é”
+ std::unique_lock lock(mtx);
+
+ std::cout << "Thread " << id << " has locked and is incrementing shared_data.\n";
+ ++shared_data;
+ std::cout << "Thread " << id << " incremented shared_data to " << shared_data << "\n";
+
+ // 自动解é”在 lock å¯¹è±¡çš„ä½œç”¨åŸŸç»“æŸæ—¶
+}
+```
+```c
+void task(int id) {
+ std::unique_lock lock(mtx, std::defer_lock); // å»¶è¿ŸåŠ é”
+
+ std::cout << "Thread " << id << " is trying to lock...\n";
+ lock.lock(); // æ‰‹åŠ¨åŠ é”,这里会阻塞线程直到获得é”
+
+ std::cout << "Thread " << id << " has locked and is incrementing shared_data.\n";
+ ++shared_data;
+ std::cout << "Thread " << id << " incremented shared_data to " << shared_data << "\n";
+
+ lock.unlock(); // 手动解é”,å…许其他线程获得é”
+}
+```
+- std::try_to_lock:å°è¯•åŠ é”(éžé˜»å¡žï¼‰
+ - 用于å°è¯•获å–互斥é”,但ä¸ä¼šé˜»å¡žå½“å‰çº¿ç¨‹ã€‚如果é”å·²ç»è¢«å…¶ä»–çº¿ç¨‹æŒæœ‰ï¼Œstd::try_to_lock 会立å³è¿”回,而ä¸ä¼šç‰å¾…é”被释放
+- std::adopt_lock:接å—ä¸€ä¸ªå·²åŠ é”的互斥é”
+ - 用于接管已ç»ç”±å…¶ä»–æœºåˆ¶åŠ é”的互斥é”,而ä¸ä¼šå°è¯•å†åŠ é”。也就是说,é”å·²ç»è¢«åŠ é”,当å‰çº¿ç¨‹åªæ˜¯å£°æ˜Žå®ƒçŽ°åœ¨è¦ç®¡ç†è¿™ä¸ªé”
+ - å½“ä½ é€šè¿‡æŸç§æ–¹å¼å·²ç»æ‰‹åŠ¨åŠ é”(例如通过 mtx.lock()),然åŽéœ€è¦é€šè¿‡ std::unique_lock 管ç†è¿™ä¸ªé”的生命周期时,å¯ä»¥ä½¿ç”¨ std::adopt_lock
+```c
+#include
+#include
+#include
+
+std::mutex mtx;
+
+void adopt_lock_task() {
+ mtx.lock(); // æ‰‹åŠ¨åŠ é”
+ std::cout << "Mutex manually locked.\n";
+
+ std::unique_lock lock(mtx, std::adopt_lock); // æŽ¥ç®¡å·²åŠ é”çš„é”
+
+ std::cout << "Managed by unique_lock, performing critical work.\n";
+ // é”将在 lock 离开作用域时自动释放
+}
+
+int main() {
+ std::thread t(adopt_lock_task);
+
+ t.join();
+
+ return 0;
+}
+```
+
+#### unique_lock和lock_guard的使用
+std::unique_lock å’Œ lock_guard 对象的设计是为了在å•个线程ä¸ç®¡ç†é”,而ä¸èƒ½åœ¨å¤šä¸ªçº¿ç¨‹ä¹‹é—´å…±äº«åŒä¸€ä¸ª std::unique_lock 对象,它们俩主è¦ä½œç”¨æ˜¯
+- 在å•个线程ä¸é”定互斥é”(如 std::mutex)并管ç†é”的生命周期
+- 通过 RAII(Resource Acquisition Is Initializationï¼‰åŽŸåˆ™è‡ªåŠ¨åœ¨ä½œç”¨åŸŸç»“æŸæ—¶é‡Šæ”¾é”
+
+ 它本质上是一个线程内的工具,ä¿è¯å½“å‰çº¿ç¨‹åœ¨æŒæœ‰é”时能够安全地æ“作共享资æºï¼Œå¹¶åœ¨ä¸éœ€è¦é”æ—¶åŠæ—¶é‡Šæ”¾é”
+
+#### std::condition_variable:æ¡ä»¶å˜é‡
+```c
+class condition_variable {
+ public:
+ void wait( std::unique_lock& lock ); // ç‰å¾…æ¡ä»¶æ»¡è¶³ï¼Œé‡Šæ”¾é”并进入阻塞状æ€
+ template< class Predicate >
+ void wait( std::unique_lock& lock, Predicate pred ); // 带æ¡ä»¶çš„ç‰å¾…,直到 pred 返回 true
+ void notify_one(); // 通知一个ç‰å¾…的线程
+ void notify_all(); // 通知所有ç‰å¾…的线程
+};
+```
+cv.wait(lock, predicate);:带有谓è¯çš„ wait() 函数会在唤醒时首先检查谓è¯ã€‚
+如果谓è¯ä¸º true,则ä¸è¿›å…¥ç‰å¾…状æ€ï¼›å¦‚果谓è¯ä¸º false,则会释放é”并进入ç‰å¾…状æ€ï¼Œç›´åˆ°æ¡ä»¶æ»¡è¶³å¹¶å†æ¬¡å”¤é†’
+```c
+cv.wait(lock, [] { return ready; });
+```
+```c
+#include
+#include
+#include
+#include
+#include
+
+std::mutex mtx;
+std::condition_variable cv;
+std::queue buffer;
+const unsigned int max_buffer_size = 10;
+
+void producer() {
+ int value = 0;
+ while (value < 50) {
+ std::unique_lock lock(mtx);
+ cv.wait(lock, [] { return buffer.size() < max_buffer_size; }); // ç‰å¾…缓冲区有空间
+ buffer.push(value++);
+ std::cout << "Produced: " << value << std::endl;
+ cv.notify_all(); // 通知消费者
+ }
+}
+
+void consumer() {
+ while (true) {
+ std::unique_lock lock(mtx);
+ cv.wait(lock, [] { return !buffer.empty(); }); // ç‰å¾…缓冲区有数æ®
+ int value = buffer.front();
+ buffer.pop();
+ std::cout << "Consumed: " << value << std::endl;
+ cv.notify_all(); // 通知生产者
+ if (value == 49) break; // 消费到50结æŸ
+ }
+}
+
+int main() {
+ std::thread prod(producer);
+ std::thread cons(consumer);
+
+ prod.join();
+ cons.join();
+
+ return 0;
+}
+```
+
+### optional
+std::optional 是 C++17 å¼•å…¥çš„ä¸€ç§æ•°æ®ç±»åž‹ï¼Œç”¨äºŽè¡¨ç¤ºä¸€ä¸ªå€¼å¯ä»¥å˜åœ¨ä¹Ÿå¯ä»¥ä¸å˜åœ¨ã€‚
+它与 Rust çš„ Option 类型类似,å…è®¸ä½ å®‰å…¨åœ°å¤„ç†é‚£äº›å¯èƒ½æ²¡æœ‰å€¼çš„æƒ…况,é¿å…了直接使用指针带æ¥çš„空指针(null)错误。
+```c
+std::optional
+├── æ•°æ®æˆå‘˜ï¼ˆå†…部实现)
+│ ├── std::aligned_storage::type storage
+│ │ └── 用于å˜å‚¨ç±»åž‹ä¸º T 的对象(未åˆå§‹åŒ–的内å˜ï¼‰
+│ ├── bool has_value_flag
+│ └── ç”¨äºŽæ ‡è®° optional 是å¦å˜å‚¨äº†æœ‰æ•ˆçš„值
+│
+├── æž„é€ å‡½æ•°
+│ ├── optional() noexcept
+│ │ └── é»˜è®¤æž„é€ å‡½æ•°ï¼Œåˆ›å»ºæ— å€¼çŠ¶æ€çš„ optional
+│ ├── optional(const T& value)
+│ │ └── é€šè¿‡ä¼ å…¥å€¼æž„é€ ï¼Œåˆ›å»ºæœ‰å€¼çŠ¶æ€çš„ optional
+│ ├── optional(T&& value)
+│ │ └── ç§»åŠ¨æž„é€ ï¼Œåˆ›å»ºæœ‰å€¼çŠ¶æ€çš„ optional
+│ ├── optional(const optional& other)
+│ │ └── å¤åˆ¶æž„é€ ï¼Œåˆ›å»ºä¸€ä¸ªæ–°çš„ optional å¹¶å¤åˆ¶ other 的值(如果有)
+│ ├── optional(optional&& other)
+│ └── ç§»åŠ¨æž„é€ ï¼Œä»Žå…¶ä»– optional 移动其内容
+│
+├── 赋值è¿ç®—符
+│ ├── optional& operator=(const T& value)
+│ │ └── å¤åˆ¶èµ‹å€¼ï¼Œå°† T 类型的值赋给 optional
+│ ├── optional& operator=(T&& value)
+│ │ └── 移动赋值,将 T 类型的值移动给 optional
+│ ├── optional& operator=(const optional& other)
+│ │ └── å¤åˆ¶èµ‹å€¼ï¼Œå°† other èµ‹å€¼ç»™å½“å‰ optional
+│ ├── optional& operator=(optional&& other)
+│ └── 移动赋值,将 other çš„å€¼ç§»åŠ¨åˆ°å½“å‰ optional
+│
+├── æžæž„函数
+│ └── ~optional()
+│ └── æžæž„å‡½æ•°ï¼Œé”€æ¯ optional ä¸çš„值(如果有),并é‡ç½®ä¸ºæ— 值状æ€
+│
+├── æˆå‘˜å‡½æ•°
+│ ├── bool has_value() const noexcept
+│ │ └── 检查 optional 是å¦åŒ…嫿œ‰æ•ˆå€¼ï¼Œè¿”回 true 表示有值
+│ ├── T& value()
+│ │ └── 返回å˜å‚¨çš„值,如果没有值则抛出 std::bad_optional_access 异常
+│ ├── const T& value() const
+│ │ └── const 版本的 value 函数,返回å˜å‚¨çš„å€¼ï¼Œè‹¥æ— å€¼åˆ™æŠ›å¼‚å¸¸
+│ ├── T value_or(const T& default_value) const
+│ │ └── 如果有值,返回å˜å‚¨çš„å€¼ï¼›å¦‚æžœæ— å€¼ï¼Œè¿”å›ž default_value
+│ ├── void reset() noexcept
+│ │ └── å°† optional ç½®ä¸ºæ— å€¼çŠ¶æ€ï¼Œå¦‚æžœæœ‰å€¼åˆ™è°ƒç”¨æžæž„函数释放资æº
+│ ├── template
+│ │ T& emplace(Args&&... args)
+│ │ └── æž„é€ ä¸€ä¸ªæ–°çš„ T 对象并å˜å‚¨åˆ° optional ä¸ï¼Œæ›¿æ¢çŽ°æœ‰çš„å€¼
+│
+├── å…¶ä»–è¿ç®—符
+│ ├── T& operator*()
+│ │ └── 解引用è¿ç®—符,返回å˜å‚¨çš„值
+│ ├── const T& operator*() const
+│ │ └── const 版本的解引用è¿ç®—符,返回å˜å‚¨çš„值
+│ ├── T* operator->()
+│ │ └── 指针访问è¿ç®—符,返回å˜å‚¨çš„值的指针
+│ ├── const T* operator->() const
+│ │ └── const 版本的指针访问è¿ç®—符,返回å˜å‚¨å€¼çš„æŒ‡é’ˆ
+│
+└── 异常
+ └── std::bad_optional_access
+ └── 当å°è¯•è®¿é—®æ— å€¼çš„ optional 时抛出的异常
+```
+
+
+
+
+### barrier
+c++20引入了std::barrier
+
+```shell
+std::barrier (C++20)
+├── æž„é€ å‡½æ•°
+│ ├── std::barrier(ptrdiff_t expected): 创建一个å±éšœï¼Œè®¾å®šçº¿ç¨‹æ•°
+│ └── std::barrier(ptrdiff_t expected, CompletionFunction callback):
+│ └── 创建一个å±éšœï¼Œè®¾ç½®çº¿ç¨‹æ•°å¹¶å®šä¹‰å›žè°ƒå‡½æ•°ï¼Œå½“所有线程到达å±éšœåŽï¼Œæ‰§è¡Œå›žè°ƒ
+│
+├── 常用æˆå‘˜å‡½æ•°
+│ ├── arrive() : 表示当å‰çº¿ç¨‹åˆ°è¾¾å±éšœï¼Œä½†ä¸ç‰å¾…其他线程
+│ │ └── 返回剩余ç‰å¾…线程数
+│ ├── arrive_and_wait() : 当å‰çº¿ç¨‹åˆ°è¾¾å±éšœå¹¶ç‰å¾…其他线程,所有线程到达åŽç»§ç»æ‰§è¡Œ
+│ ├── arrive_and_drop() : 当å‰çº¿ç¨‹åˆ°è¾¾å±éšœå¹¶é€€å‡ºå±éšœï¼Œä¸å†å‚与接下æ¥çš„åŒæ¥
+│ ├── reset() : é‡ç½®å±éšœï¼Œä½¿å…¶å¯é‡æ–°ä½¿ç”¨
+│ └── expected() : 返回当å‰å±éšœæœŸæœ›çš„线程数é‡
+│
+├── 回调函数 (å¯é€‰)
+│ └── 在所有线程到达å±éšœæ—¶æ‰§è¡Œï¼Œå¯ä»¥ç”¨äºŽæ‰§è¡ŒæŸäº›çŠ¶æ€æ›´æ–°æˆ–å…¶ä»–æ“作
+│
+├── å†…éƒ¨åŒæ¥æœºåˆ¶
+│ ├── 自动é‡ç½®ï¼šæ¯å½“所有线程到达å±éšœæ—¶ï¼Œå±éšœä¼šè‡ªåЍé‡ç½®ï¼Œå‡†å¤‡ä¸‹ä¸€æ¬¡åŒæ¥
+│ └── å¹¶å‘安全:å±éšœçš„æ‰€æœ‰æ“作是线程安全的
+│
+└── å±éšœä½¿ç”¨åœºæ™¯
+ ├── å¤šé˜¶æ®µä»»åŠ¡çš„åŒæ¥
+ ├── 在多个线程的并行æ“ä½œå®ŒæˆæŸä¸ªæ¥éª¤åŽï¼Œç»Ÿä¸€ç‰å¾…进入下一个æ¥éª¤
+ └── é€šè¿‡å›žè°ƒå‡½æ•°æŽ§åˆ¶å…±äº«èµ„æºæˆ–执行特定任务
+```
+
+
+#### lambda表达å¼
+lambda表达å¼åœ¨å›žè°ƒå‡½æ•°è¿™è¾¹å¾ˆå¸¸ç”¨ï¼Œè¿™é‡Œè¡¥å……一下
+
+Lambda è¡¨è¾¾å¼æ˜¯ä¸€ç§å¯ä»¥åœ¨ä»£ç ä¸ç®€æ´åœ°å®šä¹‰å†…è”å‡½æ•°çš„è¯æ³•,特别适åˆä¸´æ—¶æ€§ã€ä¸€æ¬¡æ€§ä½¿ç”¨çš„函数,常用于回调ã€ç®—法或多线程ç‰åœºæ™¯
+```c
+[æ•获列表] (傿•°åˆ—表) -> 返回类型 {
+ 函数体
+}
+```
+- æ•获列表([]ï¼‰ï¼šç”¨äºŽæŒ‡å®šä»Žå¤–éƒ¨ä½œç”¨åŸŸä¸æ•获哪些å˜é‡
+- 傿•°åˆ—表(()):å¯ä»¥ä¸ºç©ºæˆ–者包å«ä¸€ä¸ªæˆ–å¤šä¸ªå‚æ•°
+- 返回类型(->):(å¯é€‰ï¼‰ç”¨äºŽæŒ‡å®šè¿”回类型,如果çœç•¥ï¼Œç¼–è¯‘å™¨ä¼šæ ¹æ®å‡½æ•°ä½“自动推æ–
+- 函数体({}):就是 Lambda 表达å¼çš„具体实现部分,类似普通函数的实现
+
+å¯¹äºŽå‚æ•°åˆ—表,是å¯ä»¥æ¨¡æ‹Ÿå‡½æ•°
+```c
+[](int x) { cout << static_cast(x + 48);
+```
+
+æ•èŽ·åˆ—è¡¨ç®—æ˜¯æ ¸å¿ƒçš„éƒ¨åˆ†
+- []ï¼šä¸æ•获任何外部å˜é‡
+- [=]:按值æ•获外部å˜é‡ï¼ŒLambda 内部å¯ä»¥ä½¿ç”¨å¤–部å˜é‡çš„æ‹·è´
+- [&]:按引用æ•获外部å˜é‡ï¼ŒLambda 内部å¯ä»¥ä¿®æ”¹å¤–部å˜é‡
+- [this]:æ•获当å‰ç±»çš„this指针,å…许 Lambda 访问类的æˆå‘˜
+- [a, &b]:按值æ•获 a,按引用æ•获 b,æ•获列表ä¸å¯ä»¥æ··åˆæŒ‰å€¼å’ŒæŒ‰å¼•用
+
+关于æ•获列表,注æ„的一点是Lambda æ•获列表是显å¼çš„,它需è¦ä½ 在 [] 䏿˜Žç¡®æŒ‡å®šæ•获的外部å˜é‡ï¼ˆæŒ‰å€¼æˆ–按引用)。
+这些æ•获的å˜é‡å˜åœ¨äºŽ Lambda 定义时的作用域 ä¸ï¼Œé€šå¸¸å¹¶ä¸éœ€è¦ä½œä¸º Lambda çš„å‚æ•°ä¼ 入。
+
+```c
+#include
+
+class Button {
+public:
+ void onClick() {
+ // æ•获 this,访问类的æˆå‘˜å‡½æ•°å’Œæˆå‘˜å˜é‡
+ auto handleClick = [this]() {
+ std::cout << "Button clicked! Updating status." << std::endl;
+ this->status = "Clicked"; // 修改类的æˆå‘˜å˜é‡
+ };
+
+ // 模拟按钮点击事件
+ handleClick();
+ }
+
+ void printStatus() {
+ std::cout << "Button status: " << status << std::endl;
+ }
+
+private:
+ std::string status = "Not clicked";
+};
+
+int main() {
+ Button button;
+ button.printStatus();
+
+ // 模拟点击按钮
+ button.onClick();
+ button.printStatus();
+
+ return 0;
+}
+```
+
+```c
+#include
+#include
+
+int main() {
+ int fixed_data = 100;
+ int state = 0;
+
+ // 按值æ•获 fixed_data,按引用æ•获 state
+ auto task = [fixed_data, &state]() {
+ state = fixed_data * 2; // 修改 state,但ä¸èƒ½ä¿®æ”¹ fixed_data
+ std::cout << "Task completed. State updated to: " << state << std::endl;
+ };
+
+ // 创建并è¿è¡Œçº¿ç¨‹
+ std::thread t(task);
+ t.join(); // ç‰å¾…å线程执行完毕
+
+ // 输出修改åŽçš„状æ€
+ std::cout << "Final state: " << state << std::endl;
+
+ return 0;
+}
+```
+
+#### barrier函数的应用
+```c++
+std::barrier barrier(线程数é‡, å¯é€‰çš„回调函数);
+```
+- 线程数é‡ï¼šæŒ‡è¦ç‰å¾…的线程的数é‡ã€‚当这么多线程都到达å±éšœç‚¹æ—¶ï¼Œæ‰€æœ‰çº¿ç¨‹æ‰ä¼šç»§ç»æ‰§è¡Œ
+- å¯é€‰çš„回调函数(å¯çœç•¥ï¼‰ï¼šå½“所有线程都到达å±éšœç‚¹æ—¶ï¼Œä¼šæ‰§è¡Œè¯¥å›žè°ƒå‡½æ•°ã€‚回调函数å¯ä»¥ç”¨æ¥æ‰§è¡ŒæŸäº›æ“作,比如改å˜çжæ€ã€æ›´æ–°å…±äº«æ•°æ®ç‰
+
+
+
+
+
+### 例题
+- äº¤æ›¿è¾“å‡ºå¥‡å¶æ•°å—å‡çº§ç‰ˆ
+
+```c
+class ZeroEvenOdd {
+private:
+ int n;
+ condition_variable cv;
+ int now;
+ bool flag;
+ mutex mx;
+
+public:
+ ZeroEvenOdd(int n) {
+ this->n = n;
+ now = 0;
+ flag = false;
+ thread tz(&ZeroEvenOdd::zero, this, [](int x) { cout << x; });
+ thread te(&ZeroEvenOdd::even, this, [](int x) { cout << x; });
+
+ if(n > 1) {
+ thread to(&ZeroEvenOdd::odd, this, [](int x) { cout << x; });
+ to.join();
+ }
+ tz.join();
+ te.join();
+ }
+
+ // printNumber(x) outputs "x", where x is an integer.
+ void zero(function printNumber) {
+ while(now < n){
+ unique_lock lg(mx);
+ printNumber(0);
+ flag = true;
+ cv.notify_all();
+ while(flag){
+ cv.wait(lg);
+ }
+ }
+ }
+
+ void even(function printNumber) {
+ while(now < n){
+ unique_lock lg(mx);
+ while(now % 2 == 1 || !flag){ // 由于多线程的情况,当now >=n时候,相当于外循环已ç»ä¸æ»¡è¶³äº†ï¼Œä½†ä»å›°åœ¨å†…循环
+ cv.wait(lg);
+ }
+ printNumber(now);
+ flag = false;
+ now++;
+ cv.notify_all();
+ }
+ }
+
+ void odd(function printNumber) {
+ while(now < n){
+ unique_lock lg(mx);
+ while(now % 2 == 0 || !flag){// 这里åŒç†
+ cv.wait(lg);
+ }
+ printNumber(now);
+ flag = false;
+ now++;
+ cv.notify_all();
+ }
+ }
+};
+```
+- 对于上é¢çš„æƒ…况,能总结的
+ - å¯¹äºŽå¤šçº¿ç¨‹é—®é¢˜ï¼Œé¦–å…ˆç¡®å®šå“ªäº›æ•°æ®æ˜¯è¦å…±äº«çš„
+ - 对于共享数æ®
+ - 共享数æ®çš„访问控制,互斥é”ä¿æŠ¤ç‰æ˜¯ä¸€æ–¹é¢
+ - å¦å¤–一方é¢å°±æ˜¯äº’斥数æ®çš„æ›´æ–°ï¼Œä»¥åŠæ›´æ–°å¯èƒ½å¯¼è‡´çš„å½±å“(上é¢å°±æ˜¯å†…部循环时候,对更新带æ¥çš„影哿²¡æœ‰è€ƒè™‘å…¨é¢ï¼‰
+ - è¦å°½å¯èƒ½æŽ§åˆ¶å…±äº«æ•°æ®çš„å½±å“èŒƒå›´ï¼Œå…±äº«æ•°æ®æ›´æ–°æœ‰æ—¶å€™ä¸æ˜¯æ‰€æœ‰æƒ…况都能想到
+ - 共享的数æ®å°½é‡å°‘点,能线程独有就独有,少犯错
+ - 对于线程ä¸çš„æ ‡å¿—,尽å¯èƒ½ä¸€ä¸ªçº¿ç¨‹ä¸€ä¸ªï¼Œå½“ä¸å¾—ä¸å…±äº«æ—¶å€™ï¼Œè¦ä¹ˆå°±åˆ«ç”¨å®ƒæ¥åŒºåˆ†å•个,å•独建立个东西æ¥åŒºåˆ†
+
+
+
+
+
+
+
diff --git "a/Document/sched/\344\273\273\345\212\241\347\232\204\345\206\205\346\240\270\346\200\201\350\241\250\347\244\272.md" "b/Document/sched/\344\273\273\345\212\241\347\232\204\345\206\205\346\240\270\346\200\201\350\241\250\347\244\272.md"
new file mode 100644
index 0000000..0817a5f
--- /dev/null
+++ "b/Document/sched/\344\273\273\345\212\241\347\232\204\345\206\205\346\240\270\346\200\201\350\241\250\347\244\272.md"
@@ -0,0 +1,369 @@
+### task_struct结构整体性介ç»
+å†…æ ¸æºç ä¸task_struct结构光sched.hä¸å°±æœ‰ä¸ƒå…«ç™¾è¡Œï¼Œé‡Œé¢çš„ç»“æž„å¼€æžæ•£å¶å¯ä»¥è¯´æ˜¯ä¸ªç›¸å½“庞大的结构
+
+这里是按功能将部分é‡è¦æˆå‘˜ä»‹ç»
+```c
+task_struct
+├── Process Identification
+│ ├── pid: process id,è¿›ç¨‹çš„å”¯ä¸€æ ‡è¯†ç¬¦ (PID)
+│ ├── tgid: thread group ID,线程组 ID
+│ └── comm: 进程的å¯è¯»åç§°
+├── Process State Management
+│ ├── state: 当å‰è¿›ç¨‹çš„çŠ¶æ€ (TASK_RUNNING, TASK_INTERRUPTIBLE ç‰)
+│ ├── exit_state: 进程退出状æ€
+│ ├── exit_code: 进程退出时的返回ç
+│ ├── jobctl: 记录任务控制的状æ€ï¼ˆå¦‚作业控制信å·ï¼‰
+│ └── atomic_flags: è¿›ç¨‹çš„åŽŸåæ“ä½œæ ‡å¿—ï¼Œç”¨äºŽåŒæ¥
+├── Scheduling
+│ ├── prio: 进程的动æ€ä¼˜å…ˆçº§
+│ ├── static_prio: è¿›ç¨‹çš„é™æ€ä¼˜å…ˆçº§
+│ ├── rt_priority: 实时任务的优先级
+│ ├── sched_class: 进程的调度类(CFS, RT ç‰ï¼‰
+│ ├── se: 普通调度实体 (sched_entity)
+│ ├── rt: 实时调度实体 (sched_rt_entity)
+│ ├── sched_info: 调度器的统计信æ¯
+│ └── on_rq: 进程是å¦åœ¨è¿è¡Œé˜Ÿåˆ—ä¸Šçš„æ ‡å¿—
+├── Memory Management
+│ ├── mm: 指å‘è¿›ç¨‹çš„å†…å˜æè¿°ç¬¦ (mm_struct)
+│ ├── active_mm: å†…æ ¸çº¿ç¨‹çš„å†…å˜æè¿°ç¬¦ï¼Œå½“ mm == NULL 时使用
+│ ├── min_flt: 次缺页错误次数
+│ ├── maj_flt: 主缺页错误次数
+│ ├── reclaim_state: 内å˜å›žæ”¶çжæ€ï¼Œç”¨äºŽè¿›ç¨‹å†…å˜ç®¡ç†
+│ └── numa_group: NUMA 相关信æ¯ï¼Œç”¨äºŽå¤„ç†å¤šå¤„ç†å™¨ç³»ç»Ÿä¸Šçš„内å˜åˆ†é…
+├── File System and I/O Management
+│ ├── fs: 文件系统相关信æ¯ï¼ŒæŒ‡å‘进程的 fs_struct
+│ ├── files: 打开文件的表 (files_struct)
+│ ├── io_context: I/O 上下文,用于跟踪进程的 I/O æ“作
+│ ├── splice_pipe: ç¼“å˜æœ€è¿‘çš„ç®¡é“ (pipe_inode_info)
+│ ├── bio_list: å—设备 I/O 相关信æ¯
+│ └── plug: 用于å—设备 I/O çš„æ’å…¥æ“作状æ€
+├── Signal Handling
+│ ├── signal: ä¿¡å·å¤„ç†ç»“æž„ (signal_struct)ï¼Œè¿›ç¨‹çš„ä¿¡å·æŽ§åˆ¶å—
+│ ├── sighand: ä¿¡å·å¤„ç†ç¨‹åºè¡¨ (sighand_struct),æ£åœ¨é€šè¿‡ä¿¡å·å¤„ç†å‡½æ•°è¿›è¡Œå¤„ç†çš„ä¿¡å·
+│ ├── pending: 挂起的信å·é˜Ÿåˆ—
+│ ├── blocked: 阻塞的信å·é›†
+│ └── pdeath_signal: çˆ¶è¿›ç¨‹ç»ˆæ¢æ—¶è¦å‘é€çš„ä¿¡å·
+├── Security and Credentials
+│ ├── cred: 进程的有效å‡è¯ (cred),包括 UIDã€GID ç‰
+│ ├── real_cred: 进程的实际å‡è¯
+│ ├── seccomp: Seccomp 安全é…置,é™åˆ¶ç³»ç»Ÿè°ƒç”¨çš„安全机制
+│ ├── audit_context: 审计相关的上下文信æ¯
+│ └── security: 用于 LSM 模å—çš„å®‰å…¨å—æ®µ
+├── Inter-Process Relationships
+│ ├── real_parent: 实际的父进程
+│ ├── parent: 接收 SIGCHLD 的父进程
+│ ├── children: å进程链表
+│ ├── sibling: 兄弟进程链表
+│ ├── group_leader: 线程组的组长指针
+│ └── ptraced: 被 ptrace() 跟踪的进程链表
+├── Namespace Management
+│ ├── nsproxy: 命å空间代ç†ç»“构,å˜å‚¨è¿›ç¨‹çš„命å空间信æ¯
+│ ├── cgroups: 进程所属的控制组 (cgroup)
+│ ├── cg_list: cgroup 任务链表
+│ └── namespaces: 进程的å„ç§å‘½å空间 (pid, net, uts, ipc ç‰)
+├── Time and Statistics
+│ ├── start_time: 进程的å¯åŠ¨æ—¶é—´ï¼ˆå•调时间)
+│ ├── utime: 用户æ€è¿è¡Œæ—¶é—´
+│ ├── stime: å†…æ ¸æ€è¿è¡Œæ—¶é—´
+│ ├── nvcsw: è¿›ç¨‹çš„è‡ªæ„¿ä¸Šä¸‹æ–‡åˆ‡æ¢æ¬¡æ•°
+│ ├── nivcsw: 进程的éžè‡ªæ„¿ä¸Šä¸‹æ–‡åˆ‡æ¢æ¬¡æ•°
+│ └── sched_statistics: 调度器的统计信æ¯
+├── Thread and CPU State
+│ ├── thread: æ¯ä¸ª CPU 特定的线程状æ€ç»“æž„ (thread_struct)
+│ ├── recent_used_cpu: 最近使用的 CPU
+│ ├── on_cpu: 进程是å¦å½“剿£åœ¨è¿è¡Œçš„æ ‡å¿—
+│ └── wake_cpu: å”¤é†’è¿›ç¨‹æ—¶ä½¿ç”¨çš„ç›®æ ‡ CPU
+├── Debugging and Tracing
+│ ├── ptrace: 记录 ptrace 系统调用的调试状æ€
+│ ├── last_siginfo: 上次å‘é€ç»™è¯¥è¿›ç¨‹çš„ä¿¡å·ä¿¡æ¯
+│ ├── task_state_change: 记录进程状æ€å˜æ›´çš„æ—¶é—´æˆ³
+│ └── trace_recursion: 跟踪递归的掩ç 和计数器
+├── Resource Limits and Accounting
+│ ├── rlimit: 资æºé™åˆ¶ (RLIMIT_CPU, RLIMIT_NOFILE ç‰)
+│ ├── ioac: I/O 统计信æ¯ï¼Œç”¨äºŽ I/O èµ„æºæ¶ˆè€—的统计
+│ └── acct_rss_mem1: 进程的 RSS 内å˜ä½¿ç”¨é‡
+├── Error Handling and Recovery
+│ ├── task_works: 用于延迟处ç†çš„任务列表(如信å·å¤„ç†ï¼‰
+│ ├── restart_block: 系统调用é‡å¯æ—¶ä½¿ç”¨çš„上下文
+│ └── oom_reaper_list: 用于记录 OOM 情况下需è¦å¤„ç†çš„进程
+```
+
+### 进程状æ€
+- TASK_RUNNING:æ¤çжæ€çš„进程在å¯è¿è¡Œé˜Ÿåˆ—ä¸ï¼Œç‰å¾… CPU 调度程åºåˆ†é…时间片
+- TASK_INTERRUPTIBLE,å¯ä¸æ–çš„ç¡çœ 状æ€ï¼šè™½ç„¶åœ¨ç¡çœ ,ç‰å¾… I/O 完æˆï¼Œä½†æ˜¯è¿™ä¸ªæ—¶å€™ä¸€ä¸ªä¿¡å·æ¥çš„æ—¶å€™ï¼Œè¿›ç¨‹è¿˜æ˜¯è¦è¢«å”¤é†’。åªä¸è¿‡å”¤é†’åŽï¼Œ
+䏿˜¯ç»§ç»åˆšæ‰çš„æ“ä½œï¼Œè€Œæ˜¯è¿›è¡Œä¿¡å·å¤„ç†
+- TASK_UNINTERRUPTIBLE,ä¸å¯ä¸æ–çš„ç¡çœ 状æ€ï¼šä¸å¯è¢«ä¿¡å·å”¤é†’,åªèƒ½æ»ç‰ I/O æ“作完æˆã€‚一旦 I/O æ“ä½œå› ä¸ºç‰¹æ®ŠåŽŸå› ä¸èƒ½å®Œæˆï¼Œè¿™ä¸ªæ—¶å€™ï¼Œè°ä¹Ÿå«ä¸é†’这个进程了。
+kill 本身也是一个信å·ï¼Œæ—¢ç„¶è¿™ä¸ªçжæ€ä¸å¯è¢«ä¿¡å·å”¤é†’,kill ä¿¡å·ä¹Ÿè¢«å¿½ç•¥äº†ã€‚除éžé‡å¯ç”µè„‘,没有其他办法。
+- TASK_KILLABLE,å¯ä»¥ç»ˆæ¢çš„æ–°ç¡çœ 状æ€ï¼šè¿›ç¨‹å¤„于这ç§çжæ€ä¸ï¼Œå®ƒçš„è¿è¡ŒåŽŸç†ç±»ä¼¼ TASK_UNINTERRUPTIBLE,åªä¸è¿‡å¯ä»¥å“应致命信å·
+```c
+#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
+```
+- TASK_STOPPEDï¼šè¿›ç¨‹è¢«åœæ¢ï¼ˆæš‚åœï¼‰ï¼Œé€šå¸¸æ˜¯æ”¶åˆ° SIGSTOPã€SIGTSTPã€SIGTTIN 或 SIGTTOU ä¿¡å·å¯¼è‡´ï¼Œç‰å¾…外部信å·ï¼ˆå¦‚ SIGCONTï¼‰æ¥æ¢å¤è¿è¡Œï¼Œå¸¸ç”¨äºŽè°ƒè¯•æ—¶æš‚åœè¿›ç¨‹æ‰§è¡Œ
+- TASK_TRACED: 进程æ£åœ¨è¢«è°ƒè¯•器(如 gdb)跟踪,通常是由于执行了 ptrace 系统调用
+- EXIT_ZOMBIE (僵尸æ€):进程已ç»ç»ˆæ¢ï¼Œä½†å®ƒçš„父进程尚未通过 wait() 系统调用获å–它的退出状æ€
+- EXIT_DEAD (æ»äº¡æ€):僵尸进程的终æ¢çжæ€å·²ç»è¢«å…¶çˆ¶è¿›ç¨‹èŽ·å–,进程的资æºå·²è¢«å®Œå…¨å›žæ”¶ï¼Œåœ¨è¯¥çжæ€ä¸‹ï¼Œè¿›ç¨‹å·²ç»ä¸å†å˜åœ¨ï¼Œå…¶è¿›ç¨‹è¡¨é¡¹ä¼šè¢«å†…æ ¸å›žæ”¶ã€‚
+- TASK_PARKED:æŸäº›æƒ…况下线程会被“挂起â€ï¼Œç‰å¾…被唤醒或处ç†ã€‚通常用于æŸäº›ç‰¹æ®Šçš„硬件或资æºåœºæ™¯
+```c
+sys_fork
+ ├── _do_fork
+ ├── wake_up_new_task
+ ├── p->state = TASK_RUNNING
+ ├── 进程分é…到 CPU,进入è¿è¡Œçжæ€
+ │ ├── 时间片用完或被抢å ï¼Œé‡æ–°è°ƒåº¦
+ │ └── 执行任务
+ ├── 进程ç‰å¾…æŸäº‹ä»¶æˆ–资æºï¼š
+ │ ├── TASK_INTERRUPTIBLE (å¯è¢«ä¿¡å·å”¤é†’çš„ç¡çœ )
+ │ ├── TASK_UNINTERRUPTIBLE (ä¸å¯è¢«ä¿¡å·å”¤é†’çš„ç¡çœ )
+ │ └── TASK_KILLABLE (åªèƒ½è¢« SIGKILL 终æ¢çš„ç¡çœ )
+ ├── 进程被 SIGSTOP ä¿¡å·åœæ¢ï¼š
+ │ └── TASK_STOPPED (进程暂åœ)
+ └── 进程退出,进入僵尸状æ€ï¼š
+ └── EXIT_ZOMBIE (进程结æŸä½†çˆ¶è¿›ç¨‹æœªå›žæ”¶)
+```
+
+### 进程æƒé™
+#### 基本知识
+- 用户ID(UID):用户 ID æ˜¯ç³»ç»Ÿä¸æ¯ä¸ªç”¨æˆ·çš„å”¯ä¸€æ ‡è¯†ç¬¦ï¼Œç”¨æ¥åŒºåˆ†ä¸åŒçš„系统用户
+ - 系统用户: 是æ“作系统ä¸åˆ›å»ºçš„æ¯ä¸ªç”¨æˆ·è´¦æˆ·ï¼ˆå¦‚ rootã€user1ã€user2 ç‰ï¼‰ï¼Œæ¯ä¸ªç³»ç»Ÿç”¨æˆ·éƒ½æœ‰ä¸€ä¸ªå”¯ä¸€çš„ UID。通过 UID,系统å¯ä»¥ç®¡ç†ä¸åŒç”¨æˆ·çš„æƒé™å’Œèµ„æºè®¿é—®
+ - UID 0: 在 Linux 系统ä¸ï¼ŒUID 为 0 的用户是超级用户(root),拥有最高æƒé™ï¼Œå¯ä»¥æ‰§è¡Œæ‰€æœ‰æ“作
+ - å½“ç¨‹åºæˆ–进程è¿è¡Œæ—¶ï¼Œå®ƒç»§æ‰¿äº†å¯åŠ¨å®ƒçš„ç”¨æˆ·çš„ UID,这个 UID 用于控制进程的æƒé™èŒƒå›´ã€‚比如,一个普通用户è¿è¡Œçš„程åºä¸èƒ½è®¿é—®åªæœ‰ root 用户能访问的资æº
+ - 进程å¯ä»¥ä½¿ç”¨ setuid() 系统调用临时改å˜å…¶ UID,获å–ä¸åŒçš„æƒé™ã€‚这在æŸäº›æƒ…况下(如 SUID 程åºï¼‰ç”¨äºŽä¸´æ—¶æå‡è¿›ç¨‹çš„æƒé™
+- 组 ID (GID):组 ID æ˜¯ç³»ç»Ÿä¸æ¯ä¸ªç”¨æˆ·ç»„çš„å”¯ä¸€æ ‡è¯†ç¬¦ï¼Œç”¨äºŽç®¡ç†ä¸€ç»„用户的访问æƒé™
+ - 用户组: 系统ä¸çš„æ¯ä¸ªç”¨æˆ·é€šå¸¸éƒ½å±žäºŽè‡³å°‘ä¸€ä¸ªç”¨æˆ·ç»„ï¼Œç”¨æˆ·ç»„æ˜¯å¤šä¸ªç”¨æˆ·çš„é›†åˆï¼Œç»„ä¸çš„用户共享相åŒçš„组æƒé™ã€‚æ¯ä¸ªç”¨æˆ·ç»„都有一个唯一的 GID
+ - 一个用户å¯ä»¥åŒæ—¶å±žäºŽå¤šä¸ªç»„:æ¯ä¸ªç”¨æˆ·éƒ½æœ‰ä¸€ä¸ªä¸»ç»„(Primary Group)和å¯èƒ½çš„å¤šä¸ªé™„åŠ ç»„ï¼ˆSupplementary Groups)。
+ 主组的 GID 记录在用户的账户信æ¯ä¸ï¼Œè€Œé™„åŠ ç»„çš„ GID 则ä¿å˜åœ¨ group_info 结构ä¸
+ - 补充组 (Supplementary Groups):æ¯ä¸ªç”¨æˆ·å¯ä»¥å±žäºŽå¤šä¸ªç»„,除了主组外,用户还å¯ä»¥å±žäºŽå¤šä¸ªé™„åŠ ç»„
+ - 进程ä¸ä»…继承用户的主组 GIDï¼Œè¿˜ä¼šç»§æ‰¿ç”¨æˆ·çš„é™„åŠ ç»„ã€‚è¿™æ ·è¿›ç¨‹å¯ä»¥é€šè¿‡å¤šä¸ªç»„çš„æƒé™æ¥è®¿é—®ç³»ç»Ÿèµ„æº
+
+
+struct cred 是 Linux å†…æ ¸ä¸ç”¨äºŽæè¿°è¿›ç¨‹èº«ä»½ï¼ˆcredentials)的数æ®ç»“构,
+它ä¿å˜äº†ä¸Žç”¨æˆ·ã€ç»„åŠå…¶æƒé™ç›¸å…³çš„ä¿¡æ¯ã€‚这个结构体在æƒé™ç®¡ç†å’Œè®¿é—®æŽ§åˆ¶ä¸æ‰®æ¼”了é‡è¦è§’色,控制进程在系统ä¸èƒ½åšä»€ä¹ˆã€‚
+
+```c
+struct cred {
+ atomic_long_t usage;
+ kuid_t uid; /* real UID of the task */
+ kgid_t gid; /* real GID of the task */
+ kuid_t suid; /* saved UID of the task */
+ kgid_t sgid; /* saved GID of the task */
+ kuid_t euid; /* effective UID of the task */
+ kgid_t egid; /* effective GID of the task */
+ kuid_t fsuid; /* UID for VFS ops */
+ kgid_t fsgid; /* GID for VFS ops */
+ unsigned securebits; /* SUID-less security management */
+ kernel_cap_t cap_inheritable; /* caps our children can inherit */
+ kernel_cap_t cap_permitted; /* caps we're permitted */
+ kernel_cap_t cap_effective; /* caps we can actually use */
+ kernel_cap_t cap_bset; /* capability bounding set */
+ kernel_cap_t cap_ambient; /* Ambient capability set */
+#ifdef CONFIG_KEYS
+ unsigned char jit_keyring; /* default keyring to attach requested
+ * keys to */
+ struct key *session_keyring; /* keyring inherited over fork */
+ struct key *process_keyring; /* keyring private to this process */
+ struct key *thread_keyring; /* keyring private to this thread */
+ struct key *request_key_auth; /* assumed request_key authority */
+#endif
+#ifdef CONFIG_SECURITY
+ void *security; /* LSM security */
+#endif
+ struct user_struct *user; /* real user ID subscription */
+ struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */
+ struct ucounts *ucounts;
+ struct group_info *group_info; /* supplementary groups for euid/fsgid */
+ /* RCU deletion */
+ union {
+ int non_rcu; /* Can we skip RCU deletion? */
+ struct rcu_head rcu; /* RCU deletion hook */
+ };
+} __randomize_layout;
+```
+这里细化讲一部分,剩下的在注释ä¸å°±èƒ½ç†è§£å¤§æ¦‚
+- struct user_struct userï¼šæŒ‡å‘ user_struct 结构体,表示当å‰ç”¨æˆ·çš„引用和é…é¢ç®¡ç†
+ - user_struct 用于管ç†ç³»ç»Ÿä¸ä¸Žç”¨æˆ·ç›¸å…³çš„资æºå’Œé…é¢ã€‚å®ƒè·Ÿè¸ªç”¨æˆ·çš„è¿›ç¨‹æ•°ã€æ–‡ä»¶å¥æŸ„æ•°ã€å†…å˜ä½¿ç”¨ç‰ä¿¡æ¯
+- struct user_namespace user_ns:指å‘用户命å空间 (user_namespace) 的指针
+ - 用户命å空间 是 Linux 容器的关键特性之一,它å…许在åŒä¸€ç³»ç»Ÿä¸Šåˆ›å»ºä¸åŒçš„用户命å空间,使得ä¸åŒå‘½å空间ä¸çš„用户和组 ID 是独立的
+ - user_ns å…许进程在特定的命å空间ä¸ä½¿ç”¨ä¸åŒçš„ UID å’Œ GID,而ä¸å½±å“其他命å空间ä¸çš„用户和组
+ - 容器实现的底层原ç†ä¹‹ä¸€ï¼Œåˆ°æ—¶å€™ä¼šè¯¦ç»†è¯´
+- struct group_info group_info:group_info å˜å‚¨è¿›ç¨‹çš„补充组信æ¯
+
+#### å‡ ä¸ªuidå’Œgid
+- atomic_long_t usageï¼šå¼•ç”¨è®¡æ•°å™¨ï¼Œè¡¨ç¤ºå½“å‰ cred 结构体的引用次数
+ - å†…æ ¸ä½¿ç”¨ usage æ¥ç®¡ç† cred 的生命周期,当一个进程ä¸å†ä½¿ç”¨è¿™ä¸ª cred 时,引用计数器会å‡å°‘。如果计数é™ä¸ºé›¶ï¼Œå†…æ ¸ä¼šé‡Šæ”¾è¯¥ cred 结构体
+- kuid_t uid, gid:uid 是任务的 真实用户 ID (Real UID),gid 是 真实组 ID (Real GID)
+ - 一般情况下,è°å¯åŠ¨çš„è¿›ç¨‹ï¼Œå°±æ˜¯è°çš„ ID。但是æƒé™å®¡æ ¸çš„æ—¶å€™ï¼Œå¾€å¾€ä¸æ¯”较这两个,也就是说ä¸å¤§èµ·ä½œç”¨
+- kuid_t euid, egid:任务的 有效用户 ID (Effective UID),egid 是 有效组 ID (Effective GID)
+ - 表示当å‰è¿›ç¨‹çš„“活动身份â€ï¼Œ**它决定了进程在系统ä¸çš„æƒé™**
+ - 一个进程å¯ä»¥é€šè¿‡ SUID ç¨‹åºæˆ– seteuid() 系统调用临时改å˜å…¶ euid,从而获å–é¢å¤–çš„æƒé™
+ - SUID 的工作原ç†ï¼š
+ - å¦‚æžœä¸€ä¸ªå¯æ‰§è¡Œæ–‡ä»¶çš„ SUID ä½è¢«è®¾ç½®ï¼Œé‚£ä¹ˆå½“任何用户è¿è¡Œè¯¥ç¨‹åºæ—¶ï¼Œç¨‹åºä¼šä¸´æ—¶èŽ·å¾—è¯¥æ–‡ä»¶çš„æ‰€æœ‰è€…çš„æƒé™ï¼Œå³ euid 会被设置为文件的所有者 UID
+ - è¿™æ ·ï¼Œç¨‹åºçš„ euid 就是文件的所有者 UID(例如,root),而 uid ä»ç„¶æ˜¯å¯åŠ¨è¯¥ç¨‹åºçš„用户 UID
+- kuid_t suid, sgid:suid 是任务的 ä¿å˜çš„用户 ID (Saved UID)ã€ä¿å˜çš„组 ID (Saved GID)
+ - 用于æƒé™çš„回退和æ¢å¤ã€‚它们是在执行 setuid()ã€setgid() ç‰ç³»ç»Ÿè°ƒç”¨åŽä¿å˜çš„原始 ID
+ - 当进程以æŸç§ä¸´æ—¶æ–¹å¼ï¼ˆæ¯”如通过 SUID 程åºï¼‰æ”¹å˜äº† euid å’Œ egid 时,ä¿å˜çš„ UID å’Œ GID å¯ä»¥ç”¨äºŽå°†è¿›ç¨‹æ¢å¤åˆ°åŽŸå§‹èº«ä»½
+- kuid_t fsuid, fsgid:文件系统æ“作使用的用户 IDã€ç»„ ID
+ - 控制文件系统æ“作时的æƒé™ï¼Œåœ¨è®¿é—®æ–‡ä»¶æˆ–目录时,系统会å‚考 fsuid å’Œ fsgidï¼Œè€Œä¸æ˜¯ euid å’Œ egid
+
+一般说æ¥ï¼Œfsuidã€euid,和 uid æ˜¯ä¸€æ ·çš„ï¼Œfsgidã€egid,和 gid ä¹Ÿæ˜¯ä¸€æ ·çš„ã€‚å› ä¸ºè°å¯åŠ¨çš„è¿›ç¨‹ï¼Œå°±åº”è¯¥å®¡æ ¸å¯åŠ¨çš„ç”¨æˆ·åˆ°åº•æœ‰æ²¡æœ‰è¿™ä¸ªæƒé™ã€‚
+
+è¿™é‡Œä¸¾å‡ ä¸ªç”¨åˆ°SUID的例å
+- passwd 程åºï¼šå®ƒå…许普通用户修改自己的密ç ï¼Œè™½ç„¶å¯†ç æ–‡ä»¶ /etc/shadow åªæœ‰ root 用户å¯ä»¥ä¿®æ”¹
+ - 当用户è¿è¡Œ passwd 时,进程会以用户的 UID å¯åŠ¨ï¼Œä½†ç”±äºŽ passwd çš„ SUID ä½è¢«è®¾ç½®ï¼Œå®ƒçš„ euid 被临时更改为 root(UID 0)
+ - è¿™æ ·ï¼Œç¨‹åºèŽ·å¾—äº†ä¿®æ”¹ /etc/shadow 文件的æƒé™ï¼Œå› 为它现在以 root çš„æƒé™è¿è¡Œ
+- sudo命令:sudo 程åºéœ€è¦åœ¨æ‰§è¡Œæ—¶ä¸´æ—¶èŽ·å¾— root æƒé™ï¼Œä»¥ä¾¿èƒ½å¤Ÿæ‰§è¡Œç³»ç»Ÿçº§çš„管ç†ä»»åŠ¡ã€‚ä¸ºäº†å®žçŽ°è¿™ä¸€ç‚¹ï¼Œsudo 使用了 SUID(Set User ID) 机制
+ - å¯ä»¥é€šè¿‡ ls -l 命令查看 sudo 程åºçš„æƒé™ï¼Œæ¥ç¡®è®¤ SUID 使˜¯å¦è®¾ç½®
+ - rwsr-xr-x ä¸çš„ s 就表示 SUID ä½å·²ç»è®¾ç½®ï¼Œæ–‡ä»¶çš„æ‰€æœ‰è€…是 rootï¼Œå› æ¤å½“任何用户执行 sudo 时,它会以 root æƒé™è¿è¡Œ
+ - 用户输入 sudo 命令,例如 sudo apt update
+ - 系统调用时,由于 sudo çš„ SUID ä½è¢«è®¾ç½®ï¼Œè¿›ç¨‹çš„ æœ‰æ•ˆç”¨æˆ· ID (euid) 被临时设置为 root,å³ä½¿å®žé™…è¿è¡Œè¯¥å‘½ä»¤çš„用户是一个普通用户
+ - 如果用户被授æƒè¿è¡Œè¯¥å‘½ä»¤ï¼Œsudo 会以 root æƒé™æ‰§è¡Œç”¨æˆ·è¾“入的命令(例如 apt update),å¦åˆ™ä¼šæ‹’ç»æ‰§è¡Œ
+ - 完æˆå‘½ä»¤æ‰§è¡ŒåŽï¼Œè¿›ç¨‹çš„æƒé™å°†æ¢å¤åˆ°æ™®é€šç”¨æˆ·çš„æƒé™
+```c
+(base) ne0@ne0-System:~$ ls -l /usr/bin/sudo
+-rwsr-xr-x 1 root root 232416 4月 4 2023 /usr/bin/sudo
+```
+
+#### capabilities
+除了以用户和用户组控制æƒé™ï¼ŒLinux 还有å¦ä¸€ä¸ªæœºåˆ¶å°±æ˜¯capabilities,设计目的是将超级用户(root 用户)的æƒåŠ›è¿›è¡Œç»†åŒ–æŽ§åˆ¶ï¼Œ
+å…è®¸éž root 用户执行æŸäº›ç‰¹æƒæ“作,而ä¸å¿…赋予它们所有 root æƒé™ã€‚这部分设计让系统å¯ä»¥æ›´çµæ´»åœ°åˆ†é…æƒé™ï¼Œå¹¶æé«˜å®‰å…¨æ€§ã€‚
+æ¯ä¸ªèƒ½åŠ›ä»£è¡¨ä¸€ä¸ªå…·ä½“çš„æƒé™ï¼Œä¾‹å¦‚,CAP_NET_ADMIN å…许管ç†ç½‘络接å£ï¼ŒCAP_SYS_ADMIN å…许执行å„ç§ç³»ç»Ÿç®¡ç†æ“作。
+
+- cap_inheritable(å¯ç»§æ‰¿èƒ½åŠ›ï¼‰ï¼šè¡¨ç¤ºå½“å‰è¿›ç¨‹çš„å进程å¯ä»¥ç»§æ‰¿çš„能力集åˆ
+- cap_permitted(å…许的能力):任务层é¢ï¼Œcap_permitted 是被å…许的所有能力集åˆã€‚è¿™ä¸ªå—æ®µå®šä¹‰äº†è¿›ç¨‹åœ¨**当å‰çŽ¯å¢ƒä¸‹å¯èƒ½èŽ·å¾—çš„èƒ½åŠ›çš„æœ€å¤§é›†åˆ**
+- cap_effective(实际使用的能力):cap_effective æ˜¯è¿›ç¨‹å½“å‰ å®žé™…ç”Ÿæ•ˆçš„èƒ½åŠ›é›†åˆ
+- cap_ambient(环境能力集åˆï¼‰ï¼šä¸€ç§çŽ¯å¢ƒèƒ½åŠ›é›†åˆï¼Œå®ƒå…许将æŸäº›èƒ½åŠ›ä»Žçˆ¶è¿›ç¨‹ç»§æ‰¿åˆ°å进程,并始终处于 cap_effective 状æ€
+ - éž root 用户进程使用 exec 执行一个程åºçš„æ—¶å€™ï¼Œå¦‚何ä¿ç•™æƒé™çš„问题,当执行 exec 的时候,cap_ambient ä¼šè¢«æ·»åŠ åˆ° cap_permitted ä¸ï¼ŒåŒæ—¶è®¾ç½®åˆ° cap_effective ä¸
+- cap_bset(能力边界集åˆï¼‰ï¼šä¹Ÿå°±æ˜¯ capability bounding set,**系统层é¢**,系统层é¢çš„安全é™åˆ¶ï¼Œå®ƒå®šä¹‰äº†ä¸€ä¸ªè¿›ç¨‹èƒ½å¤ŸèŽ·å¾—çš„æ‰€æœ‰èƒ½åŠ›çš„ä¸Šé™ã€‚
+ - 如果这个集åˆä¸ä¸å˜åœ¨æŸä¸ªæƒé™ï¼Œé‚£ä¹ˆç³»ç»Ÿä¸çš„æ‰€æœ‰è¿›ç¨‹éƒ½æ²¡æœ‰è¿™ä¸ªæƒé™ã€‚å³ä½¿rootæƒé™æ‰§è¡Œçš„è¿›ç¨‹ä¹Ÿä¸€æ ·
+
+
+### ç”¨æˆ·æ ˆå’Œå†…æ ¸æ ˆ
+#### ç”¨æˆ·æ ˆ
+ç”¨æˆ·æ ˆæ˜¯æ¯ä¸ªè¿›ç¨‹æˆ–线程在用户æ€ï¼ˆuser space)è¿è¡Œæ—¶ä½¿ç”¨çš„æ ˆï¼Œä¸»è¦ç”¨äºŽå˜å‚¨å±€éƒ¨å˜é‡ã€å‡½æ•°å‚æ•°ã€è¿”回地å€ç‰ã€‚
+
+æ¯ä¸ªçº¿ç¨‹éƒ½æœ‰ç‹¬ç«‹çš„ç”¨æˆ·æ ˆï¼Œç”¨äºŽä¿å˜è¯¥çº¿ç¨‹çš„函数调用信æ¯ã€å±€éƒ¨å˜é‡ã€è¿”回地å€ç‰ã€‚è¿™æ˜¯å› ä¸ºæ¯ä¸ªçº¿ç¨‹æ‰§è¡Œè‡ªå·±çš„æŽ§åˆ¶æµï¼Œè°ƒç”¨ä¸åŒçš„函数,
+需è¦ç‹¬ç«‹çš„æ ˆæ¥ä¿å˜æ‰§è¡Œçжæ€ã€‚尽管线程共享åŒä¸€ä¸ªè¿›ç¨‹çš„地å€ç©ºé—´ï¼ˆå¦‚ä»£ç æ®µã€å…¨å±€å˜é‡ã€å †ç‰ï¼‰ï¼Œä½†æ¯ä¸ªçº¿ç¨‹çš„ç”¨æˆ·æ ˆæ˜¯ç‹¬ç«‹çš„ã€‚
+
+ç”¨æˆ·æ ˆçš„å…·ä½“ä½ç½®é€šå¸¸ä¸Žtask的内å˜ç®¡ç†ç»“构(mm_struct)有关,包å«äº†è¿›ç¨‹çš„虚拟内å˜åŒºåŸŸä»¥åŠç”¨æˆ·æ ˆæŒ‡é’ˆç‰ä¿¡æ¯ã€‚
+这个结构到内å˜å…³ç³»éƒ¨åˆ†åœ¨è¯¦ç»†è¯´
+
+
+- ç”¨æˆ·æ ˆçš„å¸ƒå±€
+```shell
++----------------------------+ <- æ ˆé¡¶ï¼ˆé«˜åœ°å€ï¼‰
+| è¿”å›žåœ°å€ |
++----------------------------+
+| å‡½æ•°å‚æ•° |
++----------------------------+
+| 局部å˜é‡ |
++----------------------------+
+| ä¸‹ä¸€ä¸ªæ ˆå¸§ï¼ˆåµŒå¥—å‡½æ•°è°ƒç”¨ï¼‰ |
++----------------------------+
+| ... |
++----------------------------+ <- æ ˆåº•ï¼ˆä½Žåœ°å€ï¼‰
+```
+å¯ä»¥è¯´çº¿ç¨‹çš„ç”¨æˆ·æ ˆæ˜¯ç”±çº¿ç¨‹ä¸æ‰€æœ‰å‡½æ•°çš„æ ˆå¸§ç»„æˆçš„
+- æ ˆå¸§æ˜¯æ¯ä¸ªå‡½æ•°è°ƒç”¨æ—¶åœ¨æ ˆä¸Šåˆ†é…的内å˜å—ã€‚æ¯æ¬¡å‡½æ•°è°ƒç”¨ï¼Œéƒ½ä¼šåœ¨æ ˆä¸Šåˆ†é…ä¸€ä¸ªæ ˆå¸§ï¼Œå˜å‚¨è¯¥å‡½æ•°çš„局部å˜é‡ã€å‚数和返回地å€ç‰ä¿¡æ¯ã€‚
+当函数嵌套调用时,æ¯ä¸ªåµŒå¥—å‡½æ•°éƒ½ä¼šåœ¨æ ˆä¸Šåˆ›å»ºä¸€ä¸ªæ–°çš„æ ˆå¸§ï¼Œæ–°çš„æ ˆå¸§ä½äºŽæ ˆé¡¶ã€‚
+- ç”¨æˆ·æ ˆæ˜¯æ ˆå¸§çš„é›†åˆã€‚æ ˆå¸§æŒ‰è°ƒç”¨é¡ºåºåœ¨æ ˆä¸Šè¿žç»åˆ†é…ï¼Œæ ˆçš„å¢žé•¿æ–¹å‘通常是从高地å€å‘低地å€ã€‚当剿 ˆé¡¶æŒ‡é’ˆ rsp æŒ‡å‘æœ€ä¸Šå±‚çš„æ ˆå¸§ï¼Œä¹Ÿå°±æ˜¯å½“å‰æ£åœ¨æ‰§è¡Œçš„å‡½æ•°çš„æ ˆå¸§ã€‚
+æ¯æ¬¡å‡½æ•°è°ƒç”¨éƒ½ä¼šåœ¨ç”¨æˆ·æ ˆä¸Šåˆ›å»ºæ–°çš„æ ˆå¸§ï¼Œå‡½æ•°è¿”å›žæ—¶åˆ™ä¼šä»Žç”¨æˆ·æ ˆä¸å¼¹å‡ºç›¸åº”çš„æ ˆå¸§ã€‚
+
+
+- æ ˆå¸§çš„ç»“æž„
+```shell
++-----------------------------+ <- æ ˆé¡¶ï¼Œé«˜åœ°å€ï¼ˆå†…å˜åœ°å€è¾ƒå¤§ï¼‰
+| è¿”å›žåœ°å€ (Return Address) | <- 调用函数时,返回地å€è¢«åŽ‹å…¥æ ˆ
++-----------------------------+
+| 调用者的 %rbp (Old %rbp) | <- ä¿å˜è°ƒç”¨è€…çš„åŸºå€æŒ‡é’ˆ (Base Pointer)
++-----------------------------+
+| 局部å˜é‡ 1 (Local Variable 1)|
++-----------------------------+
+| 局部å˜é‡ 2 (Local Variable 2)|
++-----------------------------+
+| 傿•° 1 (Argument 1) | <- 通常ä¿å˜åœ¨åç§»é‡å¤„
++-----------------------------+
+| 傿•° 2 (Argument 2) |
++-----------------------------+
+| ... | <- 更多局部å˜é‡æˆ–临时å˜å‚¨çš„空间
++-----------------------------+
+| %rsp (当剿 ˆæŒ‡é’ˆ) | <- æ ˆåº•ï¼Œä½Žåœ°å€
++-----------------------------+
+```
+- 返回地å€: 在调用一个函数时,call 指令会将返回地å€ï¼ˆè°ƒç”¨è€…çš„ä¸‹ä¸€æ¡æŒ‡ä»¤åœ°å€ï¼‰åŽ‹å…¥æ ˆä¸ï¼Œè¿™æ ·å½“被调用的函数执行完毕时,ret æŒ‡ä»¤ä¼šä»Žæ ˆä¸å¼¹å‡ºè¿”回地å€å¹¶è·³è½¬å›žè°ƒç”¨è€…
+- æ—§çš„ rbpï¼ˆè°ƒç”¨è€…çš„æ ˆå¸§åŸºå€ï¼‰: 在进入新函数时,rbp 会ä¿å˜è°ƒç”¨è€…çš„æ ˆå¸§æŒ‡é’ˆï¼ˆåŸºå€æŒ‡é’ˆï¼‰ï¼Œä»¥ä¾¿å‡½æ•°è¿”回时能够æ¢å¤è°ƒç”¨è€…çš„æ ˆå¸§ã€‚
+通过 push %rbp ä¿å˜è°ƒç”¨è€…çš„ rbp,而åŽé€šè¿‡ mov %rsp, %rbp è®¾ç½®æ–°çš„æ ˆå¸§åŸºå€
+- 局部å˜é‡å’Œä¸´æ—¶æ•°æ®: 这些å˜é‡æ˜¯åœ¨å‡½æ•°å†…部定义的局部å˜é‡ï¼Œå®ƒä»¬é€šå¸¸å˜å‚¨åœ¨æ ˆä¸Šå¹¶ä¸”ä½äºŽ rbp çš„åç§»ä½ç½®ã€‚
+局部å˜é‡å¯ä»¥æ ¹æ®éœ€è¦å 用ä¸åŒçš„æ ˆç©ºé—´ã€‚通过 sub 指令å‡å°‘ rsp çš„å€¼åˆ†é…æ ˆç©ºé—´
+- ä¼ é€’çš„å‚æ•°: 在 x86-64 的调用约定ä¸ï¼Œå‡½æ•°çš„å‰ 6 ä¸ªå‚æ•°é€šå¸¸é€šè¿‡å¯„å˜å™¨ä¼ 递,但它们通常会在进入函数åŽä¿å˜åˆ°æ ˆä¸ï¼Œ
+ä»¥ä¾¿å‡½æ•°ä½¿ç”¨ã€‚å‚æ•°ä¿å˜åœ¨æ ˆçš„ rbp 基å€çš„æŸäº›åç§»é‡å¤„
+- æ ˆåº• (%rsp): æ ˆæŒ‡é’ˆ rsp 指å‘当剿 ˆé¡¶ï¼Œæ ˆå¸§ç»“æŸæ—¶æ¢å¤ rsp,并通过 leave 指令将 rbp æ¢å¤æˆä¹‹å‰çš„值,最终通过 ret ä»Žæ ˆä¸å¼¹å‡ºè¿”回地å€
+
+下é¢è¿™ä¸ªcreate_processçš„æ ˆå¸§å°±æ˜¯ä¸Šé¢çš„一个例å的直接表现
+
+
+
+#### å†…æ ¸æ ˆ
+在 Linux å†…æ ¸ä¸ï¼Œæ¯ä¸ªtaskéƒ½æœ‰ä¸€ä¸ªå†…æ ¸æ ˆï¼ˆkernel stack),用于在taskå¤„äºŽå†…æ ¸æ€æ—¶ä¿å˜æ‰§è¡Œçš„上下文和临时数æ®ã€‚å†…æ ¸æ ˆåœ¨ç³»ç»Ÿè°ƒç”¨ã€å¼‚常处ç†ã€ä»¥åŠä¸æ–å¤„ç†æ—¶å°¤ä¸ºé‡è¦ã€‚
+
+å†…æ ¸æ ˆæ˜¯è¿›ç¨‹åˆ‡æ¢åˆ°å†…æ ¸æ€æ—¶ä½¿ç”¨çš„æ ˆï¼Œç”¨äºŽå˜å‚¨ä»¥ä¸‹å†…容:
+- 系统调用的上下文信æ¯ï¼šå½“一个用户æ€è¿›ç¨‹é€šè¿‡ç³»ç»Ÿè°ƒç”¨è¿›å…¥å†…æ ¸æ€æ—¶ï¼Œå†…æ ¸æ ˆç”¨äºŽä¿å˜ç³»ç»Ÿè°ƒç”¨çš„傿•°ã€è¿”回地å€ç‰ä¿¡æ¯
+- 䏿–或异常处ç†çš„ä¸Šä¸‹æ–‡ï¼šå½“ä¸æ–或异常å‘生时,CPU 会自动切æ¢åˆ°å†…æ ¸æ€ï¼Œæ¤æ—¶å†…æ ¸æ ˆç”¨äºŽä¿å˜ CPU 的寄å˜å™¨çжæ€ç‰ä¿¡æ¯ï¼Œä»¥ä¾¿ä¸æ–处ç†ç»“æŸåŽå¯ä»¥æ¢å¤æ£å¸¸çš„æ‰§è¡Œçжæ€
+- å†…æ ¸å‡½æ•°è°ƒç”¨çš„å±€éƒ¨å˜é‡ï¼šå½“å†…æ ¸è°ƒç”¨è‡ªèº«çš„å‡½æ•°æ—¶ï¼Œå’Œç”¨æˆ·æ€ä¸€æ ·ï¼Œå†…æ ¸å‡½æ•°çš„å±€éƒ¨å˜é‡ä¹Ÿä¼šè¢«ä¿å˜åœ¨å†…æ ¸æ ˆä¸Š
+
+ç®€å•æ¥è¯´ï¼Œå†…æ ¸æ ˆæ˜¯å†…æ ¸æ€ä¸‹æ‰§è¡Œä»£ç 的临时å˜å‚¨åŒºåŸŸï¼Œå®ƒä¿å˜äº†taskçš„å†…æ ¸æ€æ‰§è¡ŒçŽ¯å¢ƒã€‚
+
+å¯¹äºŽå†…æ ¸æ ˆå’Œç”¨æˆ·æ ˆçš„åŒºåˆ«ï¼Œä½œç”¨æ–¹é¢çš„åŒºåˆ«ä¸Šé¢æœ‰äº†ï¼Œæ€»çš„æ¥è¯´ï¼Œæ˜¯ç”±äºŽç¨‹åºåœ¨ 用户æ€å’Œå†…æ ¸æ€ ä¹‹é—´çš„**æƒé™èŒƒå›´**和行为差异导致的
+- æ ˆçš„å¤§å°ä¸Žä½ç½®
+ - ç”¨æˆ·æ ˆï¼šå¤§å°ä¸€èˆ¬ä¸æ˜¯å›ºå®šçš„,å¯ä»¥æ ¹æ®éœ€è¦åЍæ€å¢žé•¿
+ - å†…æ ¸æ ˆï¼šå†…æ ¸æ ˆçš„å¤§å°é€šå¸¸æ˜¯å›ºå®šçš„。典型的 Linux 系统ä¸ï¼Œå†…æ ¸æ ˆå¤§å°ä¸ºä¸¤é¡µå†…å˜ï¼Œç”±äºŽå†…æ ¸æ ˆçš„å¤§å°å›ºå®šä¸”较å°ï¼Œå†…æ ¸ä¸ä¸èƒ½è¿›è¡Œè¿‡åº¦å¤æ‚的递归æ“作,é¿å…æ ˆæº¢å‡ºã€‚
+- æ ˆå¸§ç®¡ç†
+ - ç”¨æˆ·æ ˆï¼šæ ˆå¸§ç®¡ç†ç”±ç”¨æˆ·æ€ç¨‹åºå’Œç¼–è¯‘å™¨çš„çº¦å®šæ¥æŽ§åˆ¶ã€‚æ¯ä¸ªå‡½æ•°è°ƒç”¨éƒ½ä¼šåœ¨ç”¨æˆ·æ ˆä¸Šåˆ†é…ä¸€ä¸ªæ–°çš„æ ˆå¸§
+ - å†…æ ¸æ ˆï¼šæ ˆå¸§ç®¡ç†ç”±å†…æ ¸æ¥æŽ§åˆ¶ã€‚å½“å†…æ ¸è°ƒç”¨å†…æ ¸æ€çš„å‡½æ•°æ—¶ï¼Œä¹Ÿä¼šåœ¨å†…æ ¸æ ˆä¸Šåˆ†é…æ ˆå¸§
+
+#### task_structä¸å¯¹äºŽå†…æ ¸æ ˆçš„ç®¡ç†
+在 task_struct ä¸ï¼Œå†…æ ¸æ ˆçš„ç®¡ç†æ˜¯é€šè¿‡ä¸¤ä¸ªé‡è¦çš„å—æ®µæ¥è¿›è¡Œçš„,分别是:
+- thread_info 结构: å˜æ”¾äº†çº¿ç¨‹çš„æ ‡å¿—ã€çжæ€ã€CPU ä¿¡æ¯ç‰ã€‚thread_info 通常ä½äºŽå†…æ ¸æ ˆçš„ä½Žåœ°å€éƒ¨åˆ†ï¼Œä¹Ÿå°±æ˜¯å†…æ ¸æ ˆçš„åŸºå€ã€‚
+- stack 指针: task_struct ä¸çš„ void *stack 指针指å‘当å‰è¿›ç¨‹çš„å†…æ ¸æ ˆã€‚æ¯ä¸ªè¿›ç¨‹çš„å†…æ ¸æ ˆæœ‰å›ºå®šå¤§å°ï¼ˆé€šå¸¸ä¸º 8KB 或 16KB),这个指针指å‘å†…æ ¸æ ˆçš„èµ·å§‹åœ°å€ã€‚
+
+
+å†…æ ¸æ ˆçš„ç»“æž„å¯ä»¥ç”±ä¸Šå›¾è¡¨ç¤ºï¼ˆé¢„ç•™8个å—节是对于32ä½ç³»ç»Ÿï¼‰ï¼Œå†…æ ¸æ ˆçš„åº•éƒ¨é€šå¸¸æ˜¯ thread_info ç»“æž„ï¼Œæ ˆçš„é¡¶éƒ¨å˜å‚¨ç€å¤„ç†ç³»ç»Ÿè°ƒç”¨æˆ–䏿–时需è¦ä¿å˜çš„寄å˜å™¨å†…容,这些寄å˜å™¨é€šè¿‡ pt_regs 结构ä¿å˜ã€‚
+当å‘生系统调用时,系统从用户æ€åˆ‡æ¢åˆ°å†…æ ¸æ€ï¼Œæ¤æ—¶é¦–å…ˆè¦åšçš„æ˜¯ä¿å˜å½“å‰è¿è¡Œçº¿ç¨‹çš„上下文(包括 CPU 寄å˜å™¨ï¼‰ï¼Œç³»ç»Ÿä¼šå°†å¯„å˜å™¨çš„å€¼åŽ‹å…¥å†…æ ¸æ ˆï¼Œå¹¶å˜å‚¨åœ¨ pt_regs 结构ä¸ã€‚
+
+åœ¨å†…æ ¸ä»£ç ä¸ï¼Œthread_info å’Œ stack 被å°è£…在一个å«åš thread_union çš„è”åˆä½“ä¸ï¼š
+thread_union 结åˆäº†çº¿ç¨‹çš„ å†…æ ¸æ ˆ å’Œ thread_infoï¼Œè¿™æ ·å¯ä»¥é«˜æ•ˆåœ°ç»„ç»‡å†…æ ¸æ ˆï¼Œå¹¶é€šè¿‡æ ˆæŒ‡é’ˆå¿«é€Ÿè®¿é—® thread_info 结构
+```c
+union thread_union {
+ #ifndef CONFIG_THREAD_INFO_IN_TASK
+ struct thread_info thread_info;
+ #endif
+ unsigned long stack[THREAD_SIZE / sizeof(long)];
+};
+```
+- 对于从taskæ‰¾åˆ°å¯¹åº”çš„å†…æ ¸æ ˆï¼Œç›´æŽ¥åˆ©ç”¨stack指针å³å¯
+- å¯¹äºŽä»Žå†…æ ¸æ ˆæ‰¾åˆ°å¯¹åº”çš„task
+ - é¦–å…ˆä»Žæ ˆé¡¶ä½ç½®å‡åŽ»THREAD_SIZE,定ä½åˆ°thread_infoçš„ä½ç½®
+ - 之åŽthread_info䏿œ‰æŒ‡å‘task的指针
+```c
+struct thread_info {
+ struct task_struct *task; /* main task structure */
+ unsigned long flags; /* low level flags */
+ __u32 cpu; /* current CPU */
+ int preempt_count; /* 0 => preemptable,
+ <0 => BUG */
+ struct thread_info *real_thread; /* Points to non-IRQ stack */
+ unsigned long aux_fp_regs[FP_SIZE]; /* auxiliary fp_regs to save/restore
+ them out-of-band */
+};
+```
+在上é¢ä»£ç ä¸å¯ä»¥å‘现有个real_threadçš„å‚æ•°ï¼Œè¿™ä¸ªå‚数设计是为了处ç†ä¸æ–处ç†ç¨‹åºå’Œå¼‚å¸¸å¤„ç†æ—¶æ¶‰åŠçš„ä¸åŒå†…æ ¸æ ˆçš„æƒ…å†µ
+- real_thread 指å‘的是线程的éžä¸æ–æ ˆçš„ thread_info 结构
+- 当å‘ç”Ÿä¸æ–æ—¶ï¼Œç³»ç»Ÿä¼šä½¿ç”¨ä¸€ä¸ªç‹¬ç«‹çš„ä¸æ–æ ˆå’Œä¸Žä¹‹å…³è”çš„ thread_info 结构体,而 real_thread ç”¨äºŽè¿½æº¯åˆ°è¯¥çº¿ç¨‹çš„å®žé™…å†…æ ¸æ ˆå’Œç›¸å…³ä¿¡æ¯
+
+
+
+
+
+
+
+
+
+
diff --git "a/Document/sched/\350\260\203\345\272\246.md" "b/Document/sched/\350\260\203\345\272\246.md"
new file mode 100644
index 0000000..a430c69
--- /dev/null
+++ "b/Document/sched/\350\260\203\345\272\246.md"
@@ -0,0 +1,456 @@
+## Linux调度器的整体架构
+```shell
+调度器架构
+│
+├── CPU è¿è¡Œé˜Ÿåˆ— (rq) (æ¯ä¸ªCPU都有一个)
+│ ├── struct rq
+│ │ ├── struct cfs_rq (CFS 调度类的è¿è¡Œé˜Ÿåˆ—)
+│ │ │ ├── struct rb_root_cached ï¼ˆçº¢é»‘æ ‘æ ¹èŠ‚ç‚¹ï¼Œç”¨äºŽç®¡ç†CFS任务)
+│ │ │ │ ├── struct sched_entity (调度实体,æ¯ä¸ªCFS任务的表示)
+│ │ │ │ │ ├── struct task_struct (关è”的进程)
+│ │ │ │ │ ├── u64 vruntime (虚拟è¿è¡Œæ—¶é—´ï¼Œå†³å®šè°ƒåº¦é¡ºåºï¼‰
+│ │ │ │ │ └── struct rb_node ï¼ˆçº¢é»‘æ ‘èŠ‚ç‚¹ï¼Œç”¨äºŽæŽ’åºï¼‰
+│ │ │ │ └── 其他调度实体 ...
+│ │ │ └── tasks_timeline (任务时间线,通过 vruntime 排åºï¼‰
+│ │ │
+│ │ ├── struct rt_rq (实时调度类的è¿è¡Œé˜Ÿåˆ—)
+│ │ │ ├── struct highest_prio (最高优先级的任务)
+│ │ │ ├── struct task_struct (关è”的实时任务)
+│ │ │ └── 其他优先级队列...
+│ │ │
+│ │ ├── struct dl_rq (Deadline 调度类的è¿è¡Œé˜Ÿåˆ—)
+│ │ │ ├── struct rb_root_cached ï¼ˆçº¢é»‘æ ‘æ ¹èŠ‚ç‚¹ï¼Œç”¨äºŽç®¡ç†DL任务)
+│ │ │ ├── struct sched_dl_entity (Deadline调度实体)
+│ │ │ │ ├── struct task_struct (关è”的进程)
+│ │ │ │ └── struct rb_node ï¼ˆçº¢é»‘æ ‘èŠ‚ç‚¹ï¼Œç”¨äºŽæŽ’åºï¼‰
+│ │ │ └── 其他DL任务...
+│ │
+│ ├── struct task_struct *idle (空闲任务,用于CPU空闲时)
+│ └── struct task_struct *stop ï¼ˆåœæ¢ä»»åŠ¡ï¼Œç‰¹å®šæƒ…å†µä¸‹è§¦å‘)
+│
+├── 调度类 (sched_class)
+│ ├── struct sched_class
+│ │ ├── enqueue_task() ï¼ˆå°†ä»»åŠ¡åŠ å…¥è¿è¡Œé˜Ÿåˆ—的函数)
+│ │ ├── dequeue_task() (从è¿è¡Œé˜Ÿåˆ—移除任务的函数)
+│ │ ├── pick_next_task() (选择下一个任务执行的函数)
+│ │ └── 其他调度相关函数...
+│
+├── è´Ÿè½½å‡è¡¡ (sched_domain)
+│ ├── struct sched_domain (调度域,多个 CPU 组æˆä¸€ä¸ªè°ƒåº¦åŸŸï¼‰
+│ │ ├── struct cpumask (CPU mask,定义哪些CPU属于该调度域)
+│ │ ├── load_balance() (负载å‡è¡¡å‡½æ•°ï¼‰
+│ │ ├── select_task_rq() (选择哪个CPUæ¥è¿è¡ŒæŸä¸ªä»»åŠ¡ï¼‰
+│ │ └── å…¶ä»–è´Ÿè½½å‡è¡¡ç›¸å…³å‡½æ•°...
+│
+└── 全局调度状æ€
+ ├── è¿è¡Œä¸çš„ task_struct
+ │ ├── 当剿£åœ¨è¿è¡Œçš„任务 (struct task_struct)
+ │ └── 下一个å³å°†è°ƒåº¦çš„任务 (next task)
+ │
+ └── 调度信æ¯
+ ├── context_switches ï¼ˆä¸Šä¸‹æ–‡åˆ‡æ¢æ¬¡æ•°ï¼‰
+ ├── nr_running (当å‰è¿è¡Œé˜Ÿåˆ—ä¸çš„任务数)
+ └── preempt_count (抢å 计数,决定是å¦å¯ä»¥æŠ¢å )
+```
+1. CPU è¿è¡Œé˜Ÿåˆ— (rq):
+ - æ¯ä¸ª CPU 都有一个独立的 rq(è¿è¡Œé˜Ÿåˆ—),用于管ç†è¯¥ CPU 上的所有任务
+ - æ¯ä¸ª rq 包å«å¤šä¸ªè°ƒåº¦ç±»é˜Ÿåˆ—(如 cfs_rqã€rt_rq å’Œ dl_rq),用于ä¸åŒç±»åž‹çš„任务(CFSã€å®žæ—¶ã€Deadline 调度类)
+ - æ¯ä¸ªè°ƒåº¦ç±»æœ‰å…¶ç‰¹å®šçš„æ•°æ®ç»“æž„æ¥ç®¡ç†ä»»åŠ¡ï¼Œå¦‚ struct cfs_rq ä½¿ç”¨çº¢é»‘æ ‘ç®¡ç† CFS 任务,
+ struct rt_rq 使用优先级队列管ç†å®žæ—¶ä»»åŠ¡ï¼Œstruct dl_rq ä½¿ç”¨çº¢é»‘æ ‘ç®¡ç† Deadline 任务
+2. 调度类 (sched_class):
+ - ä¸åŒçš„调度类实现ä¸åŒçš„调度ç–略。比如,CFS 使用完全公平调度算法,实时调度 使用优先级调度,Deadline调度 åˆ™åŸºäºŽä»»åŠ¡çš„æˆªæ¢æ—¶é—´
+ - æ¯ä¸ªè°ƒåº¦ç±»é€šè¿‡å®žçŽ°ä¸€ç»„å‡½æ•°ï¼ˆå¦‚ enqueue_task()ã€dequeue_task() å’Œ pick_next_task())æ¥å®šä¹‰å¦‚何调度进程
+3. è´Ÿè½½å‡è¡¡ (sched_domain):
+ - åœ¨å¤šæ ¸ç³»ç»Ÿä¸ï¼Œå¤šä¸ª CPU 组æˆä¸€ä¸ªè°ƒåº¦åŸŸï¼ˆsched_domain),通过负载å‡è¡¡ç¡®ä¿ä»»åŠ¡åœ¨å¤šä¸ª CPU 之间å‡åŒ€åˆ†å¸ƒ
+ - 调度域通过 cpumask æ¥å®šä¹‰å“ªäº› CPU 属于该域,并通过 load_balance() 函数æ¥å®žçް CPU 之间的任务分é…
+4. 全局调度状æ€ï¼š
+ - åŒ…å«æ‰€æœ‰å½“å‰è¿è¡Œä¸çš„任务信æ¯å’Œè°ƒåº¦å™¨çš„状æ€ä¿¡æ¯ï¼Œå¦‚ä¸Šä¸‹æ–‡åˆ‡æ¢æ¬¡æ•°ã€å½“å‰ CPU 的任务数ç‰
+ - nr_running è¡¨ç¤ºå½“å‰æ£åœ¨ rq ä¸ç‰å¾…è¿è¡Œçš„任务数,preempt_count 用于决定当å‰ä»»åŠ¡æ˜¯å¦å¯ä»¥è¢«æŠ¢å
+
+## 调度ç–略和调度类
+### 调度ç–ç•¥
+```c
+#define SCHED_NORMAL 0
+#define SCHED_FIFO 1
+#define SCHED_RR 2
+#define SCHED_BATCH 3
+#define SCHED_IDLE 5
+#define SCHED_DEADLINE 6
+```
+1. SCHED_NORMAL (也称为 SCHED_OTHER,值为 0):CFS调度器
+ - Linux ä¸çš„默认调度ç–略,适用于大多数进程。它是一个时间共享调度ç–略,也就是基于优先级和时间片的调度ç–ç•¥
+ - 使用 vruntime(虚拟è¿è¡Œæ—¶é—´ï¼‰æ¥å†³å®šè°ƒåº¦é¡ºåºï¼Œå°½å¯èƒ½å…¬å¹³åœ°ä¸ºæ‰€æœ‰è¿›ç¨‹åˆ†é… CPU。
+ - 适用于普通的用户进程,如桌é¢åº”用ã€åŽå°æœåŠ¡ç‰ã€‚
+2. SCHED_FIFO (值为 1):RT调度器
+ - FIFO(先入先出)调度算法。该ç–略适用于需è¦ä¸¥æ ¼çš„实时调度的任务,优先级高的任务å¯ä»¥é•¿æ—¶é—´å æ® CPUï¼Œé™¤éžæœ‰æ›´é«˜ä¼˜å…ˆçº§çš„任务出现
+ - 当有更高优先级的任务进入系统时,当å‰ä»»åŠ¡ä¼šè¢«æŠ¢å
+ - 但是,åŒä¼˜å…ˆçº§çš„任务ä¸ä¼šæŠ¢å 它,它会一直è¿è¡Œåˆ°ä¸»åŠ¨è®©å‡º CPU(比如调用 sched_yield())或进入ç‰å¾…状æ€
+3. SCHED_RR (Round Robin, 值为 2):RT调度器ç–
+ - 基于固定优先级的时间片轮转调度。优先级相åŒçš„任务按轮转的方å¼èŽ·å– CPU,æ¯ä¸ªä»»åŠ¡è¿è¡Œä¸€ä¸ªæ—¶é—´ç‰‡åŽï¼Œè°ƒåº¦å™¨ä¼šåˆ‡æ¢åˆ°ä¸‹ä¸€ä¸ªä»»åŠ¡
+ - SCHED_RR æä¾›äº†ç›¸å¯¹å…¬å¹³çš„实时调度,ä¸åŒäºŽ SCHED_FIFO,æ¯ä¸ªç›¸åŒä¼˜å…ˆçº§çš„任务都能在一定时间内执行
+4. SCHED_BATCH (值为 3):CFS调度器
+ - 适用于ä¸é‡è¦çš„ã€å¯¹å“åº”æ—¶é—´è¦æ±‚ä¸é«˜çš„æ‰¹å¤„ç†ä»»åŠ¡ã€‚è®¾è®¡ç›®æ ‡æ˜¯é™ä½Žæ‰¹å¤„ç†ä»»åŠ¡å¯¹äº¤äº’æ€§ä»»åŠ¡ï¼ˆå¦‚æ¡Œé¢åº”用)的影å“
+ - 基于 CFS 的调度算法,但优先级较低,CPU 分é…较少
+ - 适用于低优先级的批处ç†ä»»åŠ¡ï¼Œå¦‚å¤§è§„æ¨¡æ•°æ®å¤„ç†ã€åŽå°è®¡ç®—ç‰ã€‚这类任务ä¸è¦æ±‚快速å“应
+5. SCHED_IDLE (值为 5):CFS-IDLE
+ - 空闲调度ç–略,是最低优先级的调度ç–略,任务仅在系统空闲时è¿è¡Œï¼Œé€šå¸¸ç”¨äºŽæœ€ä½Žä¼˜å…ˆçº§çš„åŽå°ä»»åŠ¡
+ - 适用于系统维护任务ã€åŽå°æ•°æ®å¤„ç†ç‰ï¼Œè¿™äº›ä»»åŠ¡å¯ä»¥åœ¨ CPU 空闲时è¿è¡Œ
+6. SCHED_DEADLINE (值为 6):DL调度器
+ - Linux æä¾›çš„硬实时调度ç–略,用于需è¦ä¿è¯åœ¨æŸä¸ªç‰¹å®šæ—¶é—´å†…完æˆçš„任务
+ - 基于 EDF(Earliest Deadline Firstï¼Œæœ€æ—©æˆªæ¢æ—¶é—´ä¼˜å…ˆï¼‰ç®—æ³•ï¼Œç³»ç»Ÿä¼šä¼˜å…ˆè°ƒåº¦æœ€æŽ¥è¿‘æˆªæ¢æ—¶é—´çš„任务
+
+### 调度类
+对应上é¢çš„调度ç–略,都有相应的调度器,在讲具体调度类之å‰ï¼Œå…ˆçœ‹çœ‹sched_class本身
+```shell
+sched_class
+│
+├── 基本æ“作函数
+│ ├── enqueue_task(rq, task, flags) - å°†ä»»åŠ¡åŠ å…¥è¿è¡Œé˜Ÿåˆ—
+│ ├── dequeue_task(rq, task, flags) - 将任务从è¿è¡Œé˜Ÿåˆ—移除
+│ ├── yield_task(rq) - 当å‰ä»»åŠ¡ä¸»åŠ¨è®©å‡º CPU
+│ ├── yield_to_task(rq, task) - å…许指定任务抢å 当å‰ä»»åŠ¡
+│ ├── wakeup_preempt(rq, task, flags) - ä»»åŠ¡å”¤é†’æ—¶åˆ¤æ–æ˜¯å¦æŠ¢å 当å‰ä»»åŠ¡
+│ ├── pick_next_task(rq) - 选择下一个执行的任务
+│ └── put_prev_task(rq, task) - 将当å‰ä»»åŠ¡åˆ‡æ¢å‡ºåŽ»æ—¶çš„å¤„ç†
+│
+├── 多处ç†å™¨ç›¸å…³æ“作 (SMP)
+│ ├── balance(rq, prev, rq_flags) - 多 CPU 系统ä¸è´Ÿè½½å‡è¡¡
+│ ├── select_task_rq(task, cpu, flags) - 选择任务应该在哪个 CPU è¿è¡Œ
+│ ├── migrate_task_rq(task, new_cpu) - è¿ç§»ä»»åŠ¡åˆ°æ–°çš„ CPU
+│ ├── task_woken(rq, task) - 任务被唤醒时的处ç†
+│ ├── set_cpus_allowed(task, ctx) - 设置任务å…许在哪些 CPU 上è¿è¡Œ
+│ ├── rq_online(rq) - æŸä¸ª CPU 被å¯ç”¨æ—¶è°ƒç”¨
+│ └── rq_offline(rq) - æŸä¸ª CPU 被åœç”¨æ—¶è°ƒç”¨
+│
+├── 时间片管ç†å’Œä»»åŠ¡ç®¡ç†
+│ ├── task_tick(rq, task, queued) - æ¯æ¬¡æ—¶é’Ÿä¸æ–更新任务状æ€
+│ ├── task_fork(task) - 新任务被创建时的处ç†
+│ ├── task_dead(task) - 任务退出时的处ç†
+│
+├── 任务切æ¢
+│ ├── switching_to(rq, task) - 准备切æ¢åˆ°æŸä¸ªä»»åŠ¡æ—¶çš„æ“作
+│ ├── switched_from(rq, task) - 从当å‰ä»»åŠ¡åˆ‡æ¢å‡ºåŽ»æ—¶çš„å¤„ç†
+│ ├── switched_to(rq, task) - 切æ¢åˆ°æŸä¸ªä»»åŠ¡æ—¶çš„å¤„ç†
+│
+├── 优先级管ç†
+│ ├── reweight_task(rq, task, newprio) - 任务的æƒé‡æˆ–ä¼˜å…ˆçº§æ”¹å˜æ—¶çš„处ç†
+│ └── prio_changed(rq, task, oldprio) - 任务优先级å‘生å˜åŒ–时的处ç†
+│
+├── 特定调度ç–略支æŒ
+│ ├── get_rr_interval(rq, task) - èŽ·å– SCHED_RR 调度ç–略下的时间片长度
+│ ├── update_curr(rq) - 更新当å‰ä»»åŠ¡çš„è°ƒåº¦ä¿¡æ¯
+│ └── task_change_group(task) - 任务切æ¢åˆ°ä¸åŒè°ƒåº¦ç»„时的处ç†
+│
+└── æ ¸å¿ƒè°ƒåº¦åŠŸèƒ½
+ ├── 调度器在任务è¿è¡Œã€ä»»åŠ¡åˆ›å»ºã€ä»»åŠ¡ç»“æŸç‰åœºæ™¯ä¸‹ï¼Œæ‰§è¡Œé€‚当的行为
+ ├── æ”¯æŒæŠ¢å å¼è°ƒåº¦ã€è½®è½¬è°ƒåº¦ã€å®žæ—¶è°ƒåº¦ã€æ‰¹å¤„ç†ç‰å¤šç§è°ƒåº¦ç–ç•¥
+ └── 通过多处ç†å™¨è´Ÿè½½å‡è¡¡ã€CPU 亲和性ã€ä¼˜å…ˆçº§ç®¡ç†ï¼Œä¼˜åŒ–å¤šæ ¸çŽ¯å¢ƒçš„æ€§èƒ½
+```
+但实际的代ç ä¸ï¼Œè¿™ä¸ªsched_classçš„ä½œç”¨æ›´åƒæ˜¯c++ä¸çš„虚类,æä¾›äº†ä¸€ä¸ªæ¨¡æ¿ï¼Œç„¶åŽä¸åŒçš„调度类对于其ä¸çš„æŽ¥å£æœ‰ç€ä¸åŒçš„实现方å¼
+
+总的æ¥è¯´ï¼Œæœ‰ä¸‹é¢è¿™å‡ ç§è°ƒåº¦ç±»ï¼Œä»Žä¸Šåˆ°ä¸‹ï¼Œä¼˜å…ˆçº§ä»Žé«˜åˆ°ä½Ž
+```c
+#define SCHED_DATA \
+ STRUCT_ALIGN(); \
+ __sched_class_highest = .; \
+ *(__stop_sched_class) \
+ *(__dl_sched_class) \
+ *(__rt_sched_class) \
+ *(__fair_sched_class) \
+ *(__ext_sched_class) \
+ *(__idle_sched_class) \
+ __sched_class_lowest = .;
+```
+- __stop_sched_class:主è¦åŠŸèƒ½æ˜¯ç”¨äºŽåœæ¢ä»»åŠ¡çš„è°ƒåº¦ï¼Œä»»åŠ¡ä¼˜å…ˆçº§æœ€é«˜ï¼Œä¸€èˆ¬ç”±å†…æ ¸åœ¨åœç”¨æˆ–é‡å¯ CPU 时使用
+- __dl_sched_class (Deadline 调度类):实现了Deadline 调度ç–ç•¥ï¼ˆå³ SCHED_DEADLINE)
+- __rt_sched_class (实时调度类): 实现了 Linux 的实时调度ç–ç•¥ï¼ˆå³ SCHED_FIFO å’Œ SCHED_RR)
+- __fair_sched_class (完全公平调度类):实现了 Linux 的完全公平调度器(CFSï¼Œå³ SCHED_NORMAL), Linux 的默认调度ç–略,适用于大多数用户进程
+- __ext_sched_class (扩展调度类)ï¼šåœ¨è¿‘æœŸåŠ å…¥å†…æ ¸ï¼ŒåŸºäºŽeBPF实现,具体是利用sched_ext,它æä¾›äº†ä¸€å¥—接å£ï¼Œå®žçŽ°äº†è°ƒåº¦å™¨çš„ç”¨æˆ·æ€è®¾è®¡
+- __idle_sched_class (空闲调度类): 实现了空闲调度ç–略(SCHED_IDLEï¼‰ã€‚è¯¥ç±»çš„ä»»åŠ¡æ˜¯æœ€ä½Žä¼˜å…ˆçº§çš„ä»»åŠ¡ï¼Œåªæœ‰åœ¨ç³»ç»Ÿæ²¡æœ‰å…¶ä»–任务è¿è¡Œæ—¶æ‰ä¼šè°ƒåº¦è¿™äº›ç©ºé—²ä»»åŠ¡
+
+## CFS调度
+CFS çš„æ ¸å¿ƒæ€æƒ³æ˜¯åŸºäºŽè™šæ‹Ÿè¿è¡Œæ—¶é—´ï¼ˆvruntimeï¼‰ï¼Œé€šè¿‡çº¢é»‘æ ‘ç®¡ç†ä»»åŠ¡é˜Ÿåˆ—ï¼Œä¼˜å…ˆè°ƒåº¦è™šæ‹Ÿè¿è¡Œæ—¶é—´æœ€çŸçš„任务,从而实现 "完全公平" 的调度。
+
+### CFS è°ƒåº¦çš„æ ¸å¿ƒæ€æƒ³
+ - 虚拟è¿è¡Œæ—¶é—´ï¼šæ¯ä¸ªä»»åŠ¡éƒ½æœ‰ä¸€ä¸ª vruntime,CFS 使用这个虚拟è¿è¡Œæ—¶é—´æ¥å†³å®šä»»åŠ¡èŽ·å¾— CPU 的先åŽé¡ºåºã€‚任务è¿è¡Œæ—¶ï¼Œvruntime å¢žåŠ ï¼Œ
+ è¿è¡Œå¾—越多,vruntime 越大。 调度器总是选择 vruntime 最å°çš„任务è¿è¡Œï¼Œè¿™æ ·å¯ä»¥ç¡®ä¿ CPU 时间的公平分é…
+ - 优先级影å“:任务的优先级会影å“å…¶ vruntime 的增长速度。优先级低的任务,vruntime å¢žé•¿å¾—å¿«ï¼Œå› æ¤è¢«é€‰æ‹©åˆ°çš„æœºä¼šå°±æ›´å°‘
+ - 消耗的实际时间和vruntime,与高低优先级的关系,简å•è”æƒ³å°±æ˜¯â€œå¤©ä¸Šä¸€å¤©ï¼Œåœ°ä¸‹ä¸€å¹´â€
+ - çº¢é»‘æ ‘ç»“æž„ï¼šCFS é€šè¿‡çº¢é»‘æ ‘ï¼ˆrb_tree)æ¥ç®¡ç†æ‰€æœ‰çš„å°±ç»ªä»»åŠ¡ã€‚èƒ½ç¡®ä¿æ“ä½œçš„æ—¶é—´å¤æ‚度为 O(log N)。
+ CFS ä¸ï¼Œçº¢é»‘æ ‘çš„æ¯ä¸ªèŠ‚ç‚¹å¯¹åº”ä¸€ä¸ªä»»åŠ¡ï¼ŒæŒ‰ vruntime 排åº
+
+### vruntime与优先级
+在具体实现ä¸ï¼Œæ˜¯é€šè¿‡ä»¥ä¸‹æµç¨‹å®žçŽ°çš„
+```c
+update_curr()
+│
+├── 1. 获å–当å‰è¿è¡Œçš„调度实体 (curr) : cfs_rq->curr
+│
+├── 2. 计算实际执行时间 delta_exec : update_curr_se()
+│ └── 如果 delta_exec <= 0,返回
+│
+├── 3. 计算 vruntime å¢žé‡ ï¼š calc_delta_fair(delta_exec, curr)
+│ ├── 如果任务的æƒé‡ä¸Ž NICE_0_LOAD ä¸åŒ
+│ │ └── 调用 __calc_delta() 进行调整
+│ └── å¦åˆ™ï¼Œç›´æŽ¥è¿”回 delta_exec
+│
+├── 4. æ›´æ–° vruntime : curr->vruntime += 调整åŽçš„ delta_exec
+│
+├── 5. æ›´æ–°æˆªæ¢æ—¶é—´å’Œæœ€å° vruntime : update_deadline()ã€update_min_vruntime()
+│
+└── 6. 对当å‰ä»»åŠ¡åšé¢å¤–æ›´æ–° : update_curr_task(),account_cfs_rq_runtime()
+```
+å…¶ä¸ä¼šæ ¹æ®calc_delta_fair() 使用调度实体的调度æƒé‡æ¥è°ƒæ•´æ‰§è¡Œæ—¶é—´ï¼Œç¡®ä¿æƒé‡å¤§çš„任务增长 vruntime 的速度慢,从而获得更多的 CPU æ—¶é—´
+
+对于优先级和æƒé‡çš„关系,具体如下,这里其实对应的也是nice值和æƒé‡çš„关系
+```c
+const int sched_prio_to_weight[40] = {
+ /* -20 */ 88761, 71755, 56483, 46273, 36291,
+ /* -15 */ 29154, 23254, 18705, 14949, 11916,
+ /* -10 */ 9548, 7620, 6100, 4904, 3906,
+ /* -5 */ 3121, 2501, 1991, 1586, 1277,
+ /* 0 */ 1024, 820, 655, 526, 423,
+ /* 5 */ 335, 272, 215, 172, 137,
+ /* 10 */ 110, 87, 70, 56, 45,
+ /* 15 */ 36, 29, 23, 18, 15,
+};
+```
+对于优先级的部分,task_struct䏿œ‰prioã€static_prio å’Œ normal_prio
+- 陿€ä¼˜å…ˆçº§ (static_prio)
+ - ç”±ç”¨æˆ·æˆ–è€…å†…æ ¸åœ¨ä»»åŠ¡åˆ›å»ºæ—¶è®¾å®šï¼Œä¸ä¼šåŠ¨æ€æ”¹å˜ï¼Œä½†å®ƒå¯ä»¥é€šè¿‡ä¿®æ”¹ nice 值或调度ç–ç•¥æ¥è°ƒæ•´
+ - 它是直接作用于load_weight和vruntime的
+ - 在 Linux 系统ä¸ï¼Œnice 值å¯ä»¥é€šè¿‡å…¬å¼æ˜ 射为static_prio
+ - static_prio = MAX_RT_PRIO + (nice + 20)
+ - å…¶ä¸MAX_RT_PRIO为100
+ - 这个公å¼å°† nice 值从 -20 到 19 æ˜ å°„ä¸º static_prio 的值从 100 到 139
+ - nice = -20 对应 static_prio = 100(最高优先级)
+ - nice = 0 对应 static_prio = 120(默认优先级)
+ - nice = 19 对应 static_prio = 139(最低优先级)
+ - 在sched_entityçš„load_weight设置时,é 的就是static_prio
+ - 而load_weightåˆå½±å“了vruntime
+- 动æ€ä¼˜å…ˆçº§ (prio)
+ - CFS è°ƒåº¦å™¨ä¼šæ ¹æ®ç³»ç»Ÿçš„è´Ÿè½½ã€ä»»åŠ¡çš„è¿è¡Œæ—¶é—´ã€ç”¨æˆ·äº¤äº’性ç‰ä¿¡æ¯ï¼ŒåЍæ€è°ƒæ•´ prio 的值
+ - prio的值影å“了这个任务会ä¸ä¼šè¢«é€‰ä¸è¿›è¡Œè°ƒåº¦è¿è¡Œï¼Œä¼˜å…ˆçº§è¶Šé«˜ï¼ˆprio 值越低),任务获得 CPU 的机会越多
+- 默认优先级 (normal_prio)
+ - normal_prio 一般ç‰äºŽ static_prio,但在æŸäº›æƒ…况下(如 real-time 调度)å¯èƒ½ä¸åŒ
+
+总的æ¥è¯´ï¼Œä»»åŠ¡çš„nice值决定了static_prio,static_prio决定了load_weight,load_weight决定了vruntime。
+除了static_prio外,load_weight还å¯èƒ½è¢«ä¸‹é¢æƒ…况影å“
+- CFS 组调度(CONFIG_FAIR_GROUP_SCHED):当å¯ç”¨ CFS 组调度时,任务的调度ä¸å†æ˜¯ç‹¬ç«‹çš„,而是å—其所在调度组的影å“
+
+### sched_entity
+从cfs_rq开始,其实sched_entityä¸ä»…å¯ä»¥æ˜¯ä¸€ä¸ªä»»åŠ¡ï¼Œä¹Ÿå¯ä»¥æ˜¯ä¸€ç»„任务,å³è°ƒåº¦ç»„,具体关系如下
+```shell
+cfs_rq (顶层 CFS è¿è¡Œé˜Ÿåˆ—)
+├── rb_root_cached (çº¢é»‘æ ‘ï¼Œç”¨äºŽå˜å‚¨è°ƒåº¦å®žä½“)
+│ ├── struct sched_entity (任务A)
+│ ├── struct sched_entity (任务B)
+│ └── struct sched_entity (调度组)
+│ └── cfs_rq (嵌套的 CFS è¿è¡Œé˜Ÿåˆ—)
+│ ├── rb_root_cached (çº¢é»‘æ ‘ï¼Œç”¨äºŽå˜å‚¨è°ƒåº¦ç»„内的调度实体)
+│ │ ├── struct sched_entity (任务C)
+│ │ └── struct sched_entity (任务D)
+│ └── å…¶ä»–è°ƒåº¦ä¿¡æ¯ (如 min_vruntime ç‰)
+└── å…¶ä»–è°ƒåº¦ä¿¡æ¯ (如 min_vruntime ç‰)
+```
+对于一个sched_entity,结构如下
+```shell
+sched_entity
+├── load_weight (load) # 任务的负载æƒé‡
+├── rb_node (run_node) # çº¢é»‘æ ‘èŠ‚ç‚¹ï¼Œç”¨äºŽç®¡ç†ä»»åŠ¡è°ƒåº¦é¡ºåº
+├── u64 (deadline) # ä»»åŠ¡çš„æˆªæ¢æ—¶é—´
+├── u64 (min_vruntime) # 最å°è™šæ‹Ÿè¿è¡Œæ—¶é—´
+├── list_head (group_node) # 任务组链表节点
+├── unsigned int (on_rq) # 是å¦åœ¨è¿è¡Œé˜Ÿåˆ—ä¸
+├── u64 (exec_start) # 任务上次开始è¿è¡Œçš„æ—¶é—´
+├── u64 (sum_exec_runtime) # 累计执行时间
+├── u64 (prev_sum_exec_runtime) # 上次的累计执行时间
+├── u64 (vruntime) # 虚拟è¿è¡Œæ—¶é—´ï¼Œç”¨äºŽå…¬å¹³è°ƒåº¦
+├── s64 (vlag) # è™šæ‹Ÿæ—¶å»¶æ ‡å¿—
+├── u64 (slice) # 任务的时间片
+├── u64 (nr_migrations) # è¿ç§»æ¬¡æ•°
+├── fair group scheduling (CONFIG_FAIR_GROUP_SCHED)
+│ ├── int (depth) # 调度组层次深度
+│ ├── sched_entity* (parent) # 父调度实体指针
+│ ├── cfs_rq* (cfs_rq) # 所属 CFS è¿è¡Œé˜Ÿåˆ—
+│ ├── cfs_rq* (my_q) # 任务组的 CFS è¿è¡Œé˜Ÿåˆ—
+│ └── unsigned long (runnable_weight) # 任务组的å¯è¿è¡Œæƒé‡
+└── SMP configuration (CONFIG_SMP)
+ └── sched_avg (avg) # å¹³å‡è´Ÿè½½ä¿¡æ¯
+```
+- 当调度实体是一个调度组时,该调度组的 vruntime åæ˜ 的是组内所有任务的综åˆè¡¨çŽ°ï¼Œè°ƒåº¦å™¨å°†æ•´ä¸ªç»„è§†ä¸ºä¸€ä¸ªè°ƒåº¦å®žä½“ï¼Œè®¡ç®—å…¶ vruntime æ¥å†³å®šå®ƒä¸Žå…¶ä»–任务或组的相对调度顺åº
+- è¿™ç§åµŒå¥—å¯ä»¥ç»§ç»ä¸‹åŽ»ï¼Œä¹Ÿå°±æ˜¯è¯´ï¼Œè°ƒåº¦ç»„å†…è¿˜å¯ä»¥åŒ…å«å调度组。调度器在åšä»»åŠ¡é€‰æ‹©æ—¶ï¼Œä¼šæ²¿ç€è¿™æ¡åµŒå¥—路径é€å±‚深入,最终选择一个具体的任务进行执行
+
+
+
+### CFS的整体调度æµç¨‹
+从schedule函数出å‘,看看这一路都ç»åŽ†äº†ä»€ä¹ˆ
+
+这是利用perf对系统进行监控期间得到的数æ®ï¼Œè¿™é‡Œschedule的调用链给出了其ä¸å®Œæ•´çš„调用æµç¨‹
+- schedule() :Linux å†…æ ¸ä¸çš„æ ¸å¿ƒè°ƒåº¦å‡½æ•°ï¼Œç”¨äºŽå°†å½“å‰è¿è¡Œçš„任务切æ¢åˆ°å¦ä¸€ä¸ªå¯è¿è¡Œçš„任务
+- __schedule() 是 schedule() çš„å…·ä½“å®žçŽ°ï¼Œè€Œå…¶ä¸æœ€é‡è¦çš„就是pick_next_task()
+- pick_next_task() 用于从è¿è¡Œé˜Ÿåˆ—䏿Œ‘选下一个任务,选择逻辑ä¾èµ–于当å‰è°ƒåº¦å™¨çš„实现
+ - pick_next_task()ä¸å…¶å®žæ˜¯é __pick_next_task实现
+ - 首先是判æ–当å‰é˜Ÿåˆ—ä»»åŠ¡æ˜¯ä¸æ˜¯éƒ½æ˜¯CFS调度类的,是的è¯å°±ç›´æŽ¥pick_next_task_fair() 从 CFS è°ƒåº¦é˜Ÿåˆ—ä¸æŒ‘选下一个任务
+ - 如果pick_next_task_fair()没有就进入idle
+ - 䏿˜¯çš„è¯å°±è¦è¿›å…¥restart,put_prev_task_balance() 会平衡å‰ä¸€ä¸ªä»»åŠ¡çš„è´Ÿè½½å¹¶å°†å…¶æ”¾å…¥åˆé€‚çš„ä½ç½®
+ - 之åŽé历调度类
+ - éåŽ†ä¼˜å…ˆçº§ä¸Šé¢æåˆ°è¿‡äº†ï¼Œä»Ž__stop_sched_class到__idle_sched_class找到第一个活跃的调度类,利用它的pick_next_task找到下一个任务
+ - åŽé¢ä¸€æ¥è¿™é‡Œæ˜¯å¯ç”¨äº†sched_ext的情况,就先ä¸å±•开说了
+```c
+for_each_active_class(class) {
+ p = class->pick_next_task(rq);
+ if (p) {
+ scx_next_task_picked(rq, p, class);
+ return p;
+ }
+}
+```
+- pick_next_task_fair之ä¸ï¼Œæœ€é‡è¦çš„å°±update_curr(cfs_rq)å’Œpick_next_entity(cfs_rq)
+ - update_curr的代ç 原ç†ä¸Šé¢è¯´è¿‡äº†ï¼Œä½†è¿™è¾¹å› ä¸ºæ˜¯é€‰æ‹©å…·ä½“ä»»åŠ¡ï¼Œæ‰€ä»¥ä¼šæœ‰ä¸€ä¸ªå¾ªçŽ¯ï¼Œä¸æ–pick_next_entity深入调度实体,直到它是一个任务而éžè°ƒåº¦ç»„
+ - 对于新旧调度实体的维护,cfs_rqå°±æ˜¯ä¸€ä¸ªæ ‘ï¼Œæ‰€è°“åµŒå¥—ã€è°ƒåº¦ç»„å¯ä»¥ç†è§£ä¸ºåœ¨æŸä¸ªå¶åèŠ‚ç‚¹ä¸Šå†æ‹“å±•å‡ºä¸ªæ ‘
+ - 找出旧调度实体的å¶åèŠ‚ç‚¹åˆ é™¤
+ - 新调度实体一定隶属å†è¿™ä¸ªæ ‘ä¸ï¼Œæ‰¾åˆ°å¯¹åº”çš„èŠ‚ç‚¹ï¼ˆè°ƒåº¦å®žä½“ï¼‰ï¼ŒåŠ å…¥åˆ°å¯¹åº”çš„cfs_rqçš„çº¢é»‘æ ‘ä¸å³å¯
+- 之åŽå†__schedule()ä¸ï¼Œå°±ä¼šè¿›è¡Œå…·ä½“的上下文切æ¢context_switch
+
+### 上下文切æ¢
+对于上下文切æ¢ï¼Œæ¶‰åŠåœ°å€ç©ºé—´ç‰ä¸€ç³»åˆ—æ“ä½œï¼Œè¿™é‡Œç»™å‡ºå‡ ä¸ªä¸åŒçš„æƒ…况
+1. ç”¨æˆ·çº¿ç¨‹åˆ°å†…æ ¸çº¿ç¨‹
+ - 用户线程å‘起系统调用或å‘ç”Ÿä¸æ–时,从用户æ€åˆ‡æ¢åˆ°å†…æ ¸æ€æ¥æ‰§è¡Œå†…æ ¸ä»£ç
+ - 进入延迟 TLB 模å¼ï¼š 调用 enter_lazy_tlb()ï¼Œæ ‡è®°ä¸ºå»¶è¿Ÿ TLB 刷新模å¼ã€‚è¿™æ˜¯å› ä¸ºå†…æ ¸çº¿ç¨‹ä¸éœ€è¦é¢‘ç¹åˆ‡æ¢é¡µè¡¨ï¼Œæ‰€ä»¥å¯ä»¥å»¶è¿Ÿ TLB åˆ·æ–°ï¼Œç›´åˆ°å¿…è¦æ—¶æ‰æ‰§è¡Œ
+ - ç»“åˆæƒ…况分æžï¼Œç³»ç»Ÿè°ƒç”¨å›žåŽ»è¿˜æ˜¯åœ¨ä¹‹å‰ç”¨æˆ·çŽ¯å¢ƒæ“作,没必è¦åˆ·æ–°
+ - å†…æ ¸çº¿ç¨‹æ²¡æœ‰ç”¨æˆ·åœ°å€ç©ºé—´ï¼Œæ‰€ä»¥è¿™éƒ¨åˆ†æŠŠä¹‹å‰prev的用户地å€ç©ºé—´æš‚å˜ä¸ªï¼Œä¿å˜æŒ‡é’ˆæœ‰æ•ˆæ€§ï¼Œå½“个å ä½çš„
+ - ç”±äºŽä¸æ¶‰åŠè™šæ‹Ÿå†…å˜çš„切æ¢ï¼Œå› æ¤è¿™ä¸ªä¸Šä¸‹æ–‡åˆ‡æ¢å¼€é”€å¯ä»¥è¯´æ˜¯æœ€ä½Žçš„
+
+2. åŒè¿›ç¨‹é—´çš„线程切æ¢
+ - ä¸éœ€è¦åˆ‡æ¢é¡µè¡¨ï¼šåœ°å€ç©ºé—´ç›¸åŒï¼Œnext->mm å’Œ prev->mm 相åŒï¼Œæ„味ç€ä¸¤ä¸ªçº¿ç¨‹å…±äº«åŒä¸€ä¸ª mm_struct,ä¸éœ€è¦è°ƒç”¨ switch_mm() 切æ¢é¡µè¡¨
+ - 切æ¢çº¿ç¨‹çš„上下文: ä¸»è¦æ¶‰åŠå¯„å˜å™¨çжæ€å’Œæ ˆçš„切æ¢ã€‚调用 switch_to() 切æ¢å¯„å˜å™¨å’Œæ ˆï¼Œè¿™äº›éƒ½æ˜¯çº¿ç¨‹çº§çš„
+ - å…¶ä»–çŠ¶æ€æ›´æ–°ï¼š 调用 switch_mm_cid(),更新一些与 CPU 相关的状æ€ï¼ˆå¦‚性能计数器ã€çº¿ç¨‹ä¸Šä¸‹æ–‡ï¼‰
+ - 进程ä¸çº¿ç¨‹å…±äº«è¿›ç¨‹çš„全局资æºï¼Œå¦‚打开的文件æè¿°ç¬¦ã€å…¨å±€å˜é‡ç‰ã€‚è¿™æ„味ç€çº¿ç¨‹åˆ‡æ¢æ—¶ä¸éœ€è¦å¯¹è¿™äº›èµ„æºè¿›è¡Œé‡æ–°åˆ†é…或管ç†ï¼Œå¤§å¤§å‡å°‘了上下文切æ¢çš„夿‚性
+
+3. ä¸åŒè¿›ç¨‹é—´çš„线程切æ¢
+ - 切æ¢å†…å˜åœ°å€ç©ºé—´ï¼š 调用 switch_mm_irqs_off() 切æ¢å†…å˜åœ°å€ç©ºé—´ï¼Œæ›´æ–°é¡µè¡¨ã€‚这是必è¦çš„ï¼Œå› ä¸ºæ–°ä»»åŠ¡çš„åœ°å€ç©ºé—´å’Œæ—§ä»»åŠ¡ä¸åŒ
+ - æ›´æ–° TLB 和内å˜å±éšœï¼š 调用 membarrier_switch_mm() 执行必è¦çš„内å˜å±éšœæ“ä½œï¼Œä»¥ç¡®ä¿å†…å˜è®¿é—®çš„ä¸€è‡´æ€§ã€‚åŒæ—¶è°ƒç”¨ lru_gen_use_mm() 更新新任务的内å˜è®¿é—®ç»Ÿè®¡
+ - 完æˆå¯„å˜å™¨å’Œæ ˆçš„切æ¢ï¼š 调用 switch_to() 切æ¢å¯„å˜å™¨çжæ€å’Œæ ˆ
+ - 这个切æ¢ä¸ä»…å¼€é”€æœ€å¤§ï¼ŒåŒæ—¶å‰¯ä½œç”¨ä¹Ÿå¾ˆå¤§
+ - 缓å˜å¤±æ•ˆï¼šæ¯æ¬¡åˆ‡æ¢è¿›ç¨‹ï¼Œå½“å‰ CPU 缓å˜ï¼ˆL1ã€L2ã€L3 缓å˜ï¼‰ä¸çš„æ•°æ®å¯èƒ½å·²ç»ä¸Žæ–°è¿›ç¨‹æ— å…³ã€‚å› æ¤ï¼Œåœ¨åŠ è½½æ–°è¿›ç¨‹æ—¶ï¼Œ
+ CPU å¯èƒ½éœ€è¦é‡æ–°ä»Žä¸»å˜ä¸èŽ·å–æ•°æ®ã€‚è¿™ä¼šå¯¼è‡´ç¼“å˜æœªå‘½ä¸
+ - 页表切æ¢ï¼šè™šæ‹Ÿå†…å˜çš„åˆ‡æ¢æ¶‰åŠåˆ°é¡µè¡¨çš„åˆ·æ–°ã€‚å› ä¸ºæ¯ä¸ªè¿›ç¨‹éƒ½æœ‰è‡ªå·±çš„地å€ç©ºé—´ï¼Œåˆ‡æ¢è¿›ç¨‹æ—¶ï¼ŒMMU éœ€è¦æ›´æ–°é¡µè¡¨ä»¥åæ˜ æ–°çš„åœ°å€ç©ºé—´ã€‚
+ é¡µè¡¨åˆ‡æ¢æ¶‰åŠåˆ° TLB(Translation Lookaside Bufferï¼‰çš„åˆ·æ–°ï¼Œè¿™ä¼šå¢žåŠ å†…å˜è®¿é—®çš„延迟
+
+
+## 抢å
+### æ—¶é’Ÿä¸æ–
+æ—¶é’Ÿä¸æ–周期性地检查当å‰ä»»åŠ¡æ˜¯å¦æ—¶é—´ç‰‡è€—尽。如果时间片耗尽,会触å‘任务切æ¢
+
+- æ—¶é’Ÿä¸æ–处ç†å‡½æ•°å†…会调用 sched_tick()
+ - 这个函数先å–å‡ºå½“å‰ cpu çš„rq,然åŽå¾—åˆ°è¿™ä¸ªé˜Ÿåˆ—ä¸Šå½“å‰æ£åœ¨è¿è¡Œä¸çš„进程的 task_struct,然åŽè°ƒç”¨è¿™ä¸ª task 的调度类的 task_tick 函数
+- 对于CFSæ¥è¯´ï¼Œå°±æ˜¯task_tick_fair
+```c
+for_each_sched_entity(se) {
+ cfs_rq = cfs_rq_of(se);
+ entity_tick(cfs_rq, se, queued);
+ }
+```
+- æ ¹æ®å½“å‰è¿›ç¨‹çš„ task,找到对应的 sched_entity å’Œ cfs_rq ,调用 entity_tick
+- 在entity_tickä¸
+ - 首先就是update_curr(cfs_rq)
+ - update_load_avg() å’Œ update_cfs_group() 用于更新任务的负载å‡è¡¡ä¿¡æ¯
+ - 虽然这些更新æ“作本身并ä¸ç›´æŽ¥è§¦å‘抢å ,但它们会影å“调度实体的排åºå’Œä¼˜å…ˆçº§è®¡ç®—,从而间接影å“任务抢å 的决ç–
+ - resched_curr() 函数是与抢å 直接相关的æ“作。它会设置当å‰ä»»åŠ¡çš„ TIF_NEED_RESCHED æ ‡å¿—ï¼Œæ ‡è®°å½“å‰ä»»åŠ¡éœ€è¦é‡æ–°è°ƒåº¦
+ - ä½†æ˜¯æ¤æ—¶æ¤åˆ»ï¼Œå¹¶ä¸çœŸçš„æŠ¢å ï¼Œè€Œæ˜¯æ‰“ä¸Šä¸€ä¸ªæ ‡ç¾ TIF_NEED_RESCHED
+```c
+static void
+entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued)
+{
+ /*
+ * Update run-time statistics of the 'current'.
+ */
+ update_curr(cfs_rq);
+
+ /*
+ * Ensure that runnable average is periodically updated.
+ */
+ update_load_avg(cfs_rq, curr, UPDATE_TG);
+ update_cfs_group(curr);
+
+#ifdef CONFIG_SCHED_HRTICK
+ /*
+ * queued ticks are scheduled to match the slice, so don't bother
+ * validating it and just reschedule.
+ */
+ if (queued) {
+ resched_curr(rq_of(cfs_rq));
+ return;
+ }
+ /*
+ * don't let the period tick interfere with the hrtick preemption
+ */
+ if (!sched_feat(DOUBLE_TICK) &&
+ hrtimer_active(&rq_of(cfs_rq)->hrtick_timer))
+ return;
+#endif
+}
+```
+### 高优先级任务被唤醒
+如果一个更高优先级的任务被唤醒(例如一个 I/O 完æˆï¼ŒæŸä¸ªé˜»å¡žçš„进程å˜ä¸ºå¯æ‰§è¡Œçжæ€ï¼‰ï¼Œé‚£ä¹ˆå½“剿£åœ¨è¿è¡Œçš„任务会被抢å ,系统会立刻切æ¢åˆ°é«˜ä¼˜å…ˆçº§ä»»åŠ¡
+- 当一个进程需è¦è¢«å”¤é†’时,try_to_wake_up() æ˜¯å†…æ ¸ç”¨æ¥å”¤é†’任务的主è¦å‡½æ•°
+ - 该函数负责将任务从ä¸å¯æ‰§è¡Œçжæ€ï¼ˆå¦‚ç¡çœ 状æ€ï¼‰è½¬å˜ä¸ºå¯æ‰§è¡Œçжæ€ï¼Œå¹¶å°†å…¶æ”¾å…¥è¿è¡Œé˜Ÿåˆ—ä¸
+ - 更新任务的状æ€ï¼Œå¹¶æ£€æŸ¥å”¤é†’的任务是å¦å¯ä»¥æŠ¢å 当剿£åœ¨è¿è¡Œçš„任务
+- try_to_wake_up() 调用 ttwu_queue å°†è¿™ä¸ªå”¤é†’çš„ä»»åŠ¡æ·»åŠ åˆ°é˜Ÿåˆ—å½“ä¸ï¼Œttwu_queue å†è°ƒç”¨ ttwu_do_activate 激活这个任务
+- 在ttwu_do_activateä¸ï¼Œactivate_task(rq, p, en_flags)是真æ£å®žçŽ°åŠ å…¥é˜Ÿåˆ—çš„ï¼Œä¹‹åŽwakeup_preempt(rq, p, wake_flags)ä¸ä¹Ÿè°ƒç”¨äº†resched_curr()
+
+ç›¸å½“äºŽè¿™è¾¹ä¹Ÿä¸»è¦æ˜¯ç½®ä½æ“作,实际的抢å 也没有å‘生
+
+### 抢å 的时机
+对于用户æ€çš„æŠ¢å æ¥è¯´ï¼Œé€šå¸¸æ˜¯åœ¨æ—¶é’Ÿä¸æ–或者系统调用返回用户æ€å‰è§¦å‘抢å
+- æ—¶é’Ÿä¸æ–
+ - æ—¶é’Ÿä¸æ–è§¦å‘æ—¶è°ƒç”¨ do_IRQ()
+ - 䏿–处ç†åŽæ ¹æ®å½“剿‰§è¡Œçš„任务状æ€å†³å®šä¸‹ä¸€æ¥åŠ¨ä½œ
+ - è¿”å›žç”¨æˆ·æ€æ—¶ï¼Œç”¨ exit_to_usermode_loop(),检查 _TIF_NEED_RESCHED æ ‡å¿—ä½ï¼Œè§¦å‘ schedule() 进行调度
+- 系统调用
+ - ç³»ç»Ÿè°ƒç”¨ç»“æŸæ—¶ä¼šæ£€æŸ¥ _TIF_NEED_RESCHED æ ‡å¿—
+ - 如果需è¦é‡æ–°è°ƒåº¦ï¼Œåˆ™è°ƒç”¨ schedule() 切æ¢ä»»åŠ¡
+
+å¯¹äºŽå†…æ ¸æ€çš„æŠ¢å æ¥è¯´ï¼Œå‘ç”Ÿåœ¨æ‰§è¡Œå†…æ ¸æ€ä»£ç 的过程ä¸ï¼Œé€šå¸¸æ˜¯æŸä¸ªä»»åŠ¡å 用过多 CPU 时间,或者å¦ä¸€ä¸ªé«˜ä¼˜å…ˆçº§ä»»åС唤醒
+- 抢å 的执行点
+ - preempt_enable():如果调用时å‘现 _TIF_NEED_RESCHED æ ‡å¿—å·²ç½®ä½ï¼Œä¼šè§¦å‘抢å
+ - 具体æ¥è¯´æ˜¯preempt_schedule->preempt_schedule_common->__schedule 进行调度
+ - åœ¨å†…æ ¸æ€ä¹Ÿä¼šé‡åˆ°ä¸æ–çš„æƒ…å†µï¼Œå½“ä¸æ–返回的时候,返回的ä»ç„¶æ˜¯å†…æ ¸æ€ï¼Œè¿™ä¸ªæ—¶å€™ä¹Ÿæ˜¯ä¸€ä¸ªæ‰§è¡ŒæŠ¢å 的时机
+ - 䏿–处ç†å®Œæ¯•åŽä¼šæ£€æŸ¥ _TIF_NEED_RESCHED æ ‡å¿—ï¼Œé€šè¿‡ preempt_schedule_irq() 触å‘调度
+
+
+## 总结
+çŽ°åœ¨é‡æ–°è¿”回__schedule()函数,会å‘现有下é¢è¿™ä¿©è¡Œä»£ç æ¥æ¸…é™¤æŠ¢å æ ‡å¿—ä½
+```c
+clear_tsk_need_resched(prev);
+clear_preempt_need_resched();
+```
+æŠ¢å æ ‡å¿—ä½ (_TIF_NEED_RESCHED å’Œ _TIF_PREEMPT_NEED_RESCHED) 在调用 pick_next_task() 之å‰å°±å·²ç»è¢«æ¸…除了
+- æŠ¢å æ ‡å¿—ä½çš„作用:通知调度器需è¦è¿›è¡Œè°ƒåº¦çš„æ ‡å¿—ã€‚å½“ä»»åŠ¡å› ä¸ºæ—¶é—´ç‰‡ç”¨å°½æˆ–æœ‰é«˜ä¼˜å…ˆçº§ä»»åŠ¡å”¤é†’æ—¶ï¼Œè¿™äº›æ ‡å¿—ä½ä¼šè¢«è®¾ç½®ã€‚
+当 __schedule() 被调用时,æ„味ç€ç³»ç»Ÿå·²ç»æ£€æµ‹åˆ°æœ‰è°ƒåº¦éœ€æ±‚ï¼Œæ ‡å¿—ä½çš„作用在这个时候已ç»å®Œæˆã€‚
+
+
+现在返回调度类,在深入讲讲那些基本的æ“作函数都干了什么
+- enqueue_task(rq, task, flags)
+ - å°†ä¸€ä¸ªä»»åŠ¡åŠ å…¥åˆ°è°ƒåº¦å™¨çš„è¿è¡Œé˜Ÿåˆ— (rq) ä¸ï¼Œä½¿å…¶æˆä¸ºå¯è°ƒåº¦çжæ€
+- dequeue_task(rq, task, flags)
+ - 将一个任务从è¿è¡Œé˜Ÿåˆ—ä¸ç§»é™¤ï¼Œä½¿å…¶ä¸å†å‚与调度
+- wakeup_preempt(rq, task, flags)
+ - 通常伴éšçš„任务状æ€çš„æ”¹å˜å’Œå…¥é˜Ÿæ“作
+ - æ ¹æ®å”¤é†’任务的优先级与当å‰ä»»åŠ¡çš„æ¯”è¾ƒï¼Œå†³å®šæ˜¯å¦éœ€è¦æŠ¢å
+ - 如果唤醒任务的优先级更高,则设置 _TIF_NEED_RESCHED æ ‡å¿—ï¼Œè§¦å‘调度
+- pick_next_task(rq)
+ - 从è¿è¡Œé˜Ÿåˆ—ä¸é€‰æ‹©ä¸‹ä¸€ä¸ªè¦æ‰§è¡Œçš„任务
+
+从CPUçš„rq开始,当切æ¢ä»»åŠ¡æ—¶å€™ï¼Œä¸€è·¯éƒ½ç»åŽ†äº†ä»€ä¹ˆ
+1. 调度类的选择和é历
+2. 从对应的调度类ä¸ï¼Œé€‰æ‹©å¯¹åº”的队列进行调度
+3. 对应的调度队列ä¸ï¼Œæ›´æ–°ä¸Šä¸€ä¸ªä»»åŠ¡çš„çŠ¶æ€ï¼Œé€‰å‡ºä¸‹ä¸€ä¸ªè¦è¿è¡Œçš„调度实体,å†åœ¨è°ƒåº¦å®žä½“䏿‰¾åˆ°ä¸‹ä¸€ä¸ªè¿è¡Œçš„任务
+4. 之åŽä¸Šä¸‹æ–‡åˆ‡æ¢
+
+而å‘生上é¢äº‹æƒ…的时机,就是抢å 。
+
+
+
+
diff --git a/Document/sched_ext/README.zh.md b/Document/sched_ext/README.zh.md
new file mode 100644
index 0000000..0cae776
--- /dev/null
+++ b/Document/sched_ext/README.zh.md
@@ -0,0 +1,903 @@
+# eBPF 示例教程:实现 `scx_nest` 调度器
+
+åœ¨ç³»ç»Ÿæ€§èƒ½ä¼˜åŒ–ä¸æ–å‘展的领域ä¸ï¼Œè‡ªå®šä¹‰å’Œæ‰©å±•å†…æ ¸è¡Œä¸ºçš„èƒ½åŠ›æ˜¯éžå¸¸å®è´µçš„ã€‚å®žçŽ°è¿™ä¸€ç›®æ ‡çš„æœ€å¼ºå¤§å·¥å…·ä¹‹ä¸€æ˜¯ eBPF(扩展的 Berkeley 包过滤器)。在本教程ä¸ï¼Œæˆ‘们将探讨 `scx_nest` 调度器的实现,这是一个先进的 eBPF 程åºï¼Œåˆ©ç”¨äº†åœ¨ Linux å†…æ ¸ç‰ˆæœ¬ `6.12` ä¸å¼•入的 `sched_ext` 调度器类。在本指å—ç»“æŸæ—¶ï¼Œæ‚¨å°†äº†è§£å¦‚ä½•æž„å»ºä¸€ä¸ªå¤æ‚çš„è°ƒåº¦å™¨ï¼Œè¯¥è°ƒåº¦å™¨æ ¹æ® CPU æ ¸å¿ƒé¢‘çŽ‡å’Œåˆ©ç”¨çŽ‡åŠ¨æ€è°ƒæ•´ä»»åŠ¡åˆ†é…。
+
+## `sched_ext` 介ç»
+
+`sched_ext` è°ƒåº¦å™¨ç±»æ ‡å¿—ç€ Linux å†…æ ¸è°ƒåº¦èƒ½åŠ›çš„é‡å¤§è¿›æ¥ã€‚ä¸Žä¼ ç»Ÿè°ƒåº¦å™¨ä¸åŒï¼Œ`sched_ext` å…许通过一组 BPF(Berkeley 包过滤器)程åºåЍæ€å®šä¹‰å…¶è¡Œä¸ºã€‚è¿™ç§çµæ´»æ€§ä½¿å¼€å‘人员能够实现针对特定工作负载和系统需求é‡èº«å®šåˆ¶çš„自定义调度算法。
+
+## ç†è§£ `scx_nest` 调度器
+
+### 概述
+
+`scx_nest` è°ƒåº¦å™¨å— Inria Paris 论文《[OS Scheduling with Nest: Keeping Tasks Close Together on Warm Cores](https://hal.inria.fr/hal-03612592/file/paper.pdf)》的å¯å‘。由 Meta Platforms, Inc. å¼€å‘,`scx_nest` 专注于鼓励将任务分é…到基于最近使用模å¼å¯èƒ½ä»¥æ›´é«˜é¢‘率è¿è¡Œçš„ CPU æ ¸å¿ƒä¸Šã€‚è¿™ç§æ–¹æ³•旨在通过确ä¿ä»»åŠ¡åœ¨æœ€æœ‰æ•ˆçš„æ ¸å¿ƒä¸Šæ‰§è¡Œæ¥ä¼˜åŒ–性能。
+
+è¯¥è°ƒåº¦å™¨ä½œä¸ºä¸€ä¸ªå…¨å±€åŠ æƒè™šæ‹Ÿæ—¶é—´ï¼ˆvtime)调度器è¿è¡Œï¼Œç±»ä¼¼äºŽå®Œå…¨å…¬å¹³è°ƒåº¦å™¨ï¼ˆCFSï¼‰ï¼ŒåŒæ—¶åˆ©ç”¨ Nest ç®—æ³•åœ¨ä»»åŠ¡å”¤é†’æ—¶é€‰æ‹©ç©ºé—²æ ¸å¿ƒã€‚è¿™ç§åŒé‡ç–略确ä¿ä»»åŠ¡ä¸ä»…被公平分é…ï¼Œè¿˜è¢«æ”¾ç½®åœ¨èƒ½å¤Ÿæœ€æœ‰æ•ˆæ‰§è¡Œå®ƒä»¬çš„æ ¸å¿ƒä¸Šã€‚
+
+`scx_nest` 旨在优化 CPU 利用率相对较低且å¯ä»¥å—ç›ŠäºŽåœ¨å°‘æ•°æ ¸å¿ƒä¸Šè¿è¡Œçš„工作负载。通过将任务集ä¸åœ¨è¾ƒå°‘çš„æ ¸å¿ƒä¸Šï¼Œè°ƒåº¦å™¨æœ‰åŠ©äºŽä¿æŒè¿™äº›æ ¸å¿ƒçš„高频率,从而æå‡æ€§èƒ½ã€‚ç„¶è€Œï¼Œå¯¹äºŽé‚£äº›åœ¨åˆ†å¸ƒåˆ°å¤šä¸ªæ ¸å¿ƒä»¥é¿å…ç¼“å˜æŠ–åŠ¨æ—¶è¡¨çŽ°æ›´å¥½çš„å·¥ä½œè´Ÿè½½ï¼Œ`scx_nest` å¯èƒ½å¹¶ä¸æ˜¯ç†æƒ³é€‰æ‹©ã€‚评估 `scx_nest` 对特定工作负载的适用性通常需è¦å®žéªŒã€‚
+
+鉴于其设计,`scx_nest` é€‚ç”¨äºŽç”Ÿäº§çŽ¯å¢ƒï¼Œå‰ææ˜¯æ»¡è¶³ç¡¬ä»¶é™åˆ¶ã€‚它在具有统一 L3 ç¼“å˜æ‹“扑的å•个 CCXï¼ˆæ ¸å¿ƒå¤åˆä½“ï¼‰æˆ–å•æ’槽主机上表现最佳。虽然当å‰ç‰ˆæœ¬æœªå®žçŽ°æŠ¢å ,但所有 CPU 共享的调度队列确ä¿é˜Ÿåˆ—å‰ç«¯çš„ä»»åŠ¡èƒ½å¤ŸåŠæ—¶æ‰§è¡Œï¼Œå‰ææ˜¯æœ‰è¶³å¤Ÿçš„ CPU å¯ç”¨ã€‚
+
+## 高级代ç 分æž
+
+`scx_nest` è°ƒåº¦å™¨çš„å®žçŽ°å¤æ‚,涉åŠå„ç§æ•°æ®ç»“æž„ã€æ˜ 射和函数,它们ååŒå·¥ä½œä»¥ç®¡ç†ä»»åŠ¡åˆ†é…å’Œ CPU æ ¸å¿ƒåˆ©ç”¨çŽ‡ã€‚å®Œæ•´çš„æºä»£ç å¯åœ¨ [eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) ä»“åº“ä¸æ‰¾åˆ°ã€‚下é¢ï¼Œæˆ‘们将剖æžè°ƒåº¦å™¨çš„æ ¸å¿ƒç»„件,详细解释æ¯ä¸ªéƒ¨åˆ†ã€‚
+
+### æ ¸å¿ƒæ•°æ®ç»“æž„å’Œæ˜ å°„
+
+#### 任务上下文 (`task_ctx`)
+
+系统ä¸çš„æ¯ä¸ªä»»åŠ¡éƒ½æœ‰ä¸€ä¸ªå…³è”的上下文,用于维护与调度相关的信æ¯ã€‚这个上下文对于基于任务的历å²å’Œå½“å‰çжæ€åšå‡ºæ˜Žæ™ºçš„调度决ç–至关é‡è¦ã€‚
+
+```c
+/* æ¯ä¸ªä»»åŠ¡çš„è°ƒåº¦ä¸Šä¸‹æ–‡ */
+struct task_ctx {
+ /*
+ * 用于计算任务的主掩ç å’Œä¿ç•™æŽ©ç 的临时 cpumask。
+ */
+ struct bpf_cpumask __kptr *tmp_mask;
+
+ /*
+ * 任务观察到其之å‰çš„æ ¸å¿ƒä¸ä¸ºç©ºé—²çš„æ¬¡æ•°ã€‚如果连ç»å‘生 r_impatient 次,
+ * å°†å°è¯•从ä¿ç•™ Nest 或回退 Nest ä¸èŽ·å–ä¸€ä¸ªæ ¸å¿ƒã€‚
+ */
+ u32 prev_misses;
+
+ /*
+ * ä»»åŠ¡â€œé™„åŠ â€çš„æ ¸å¿ƒï¼Œæ„味ç€å®ƒè‡³å°‘连ç»åœ¨è¯¥æ ¸å¿ƒä¸Šæ‰§è¡Œäº†ä¸¤æ¬¡ï¼Œ
+ * 并且在唤醒时首先å°è¯•è¿ç§»åˆ°è¯¥æ ¸å¿ƒã€‚ä»»åŠ¡åªæœ‰åœ¨é™„åŠ æ ¸å¿ƒç©ºé—²ä¸”
+ * 在主 Nest 䏿—¶æ‰ä¼šè¿ç§»åˆ°é™„åŠ æ ¸å¿ƒã€‚
+ */
+ s32 attached_core;
+
+ /*
+ * ä»»åŠ¡ä¸Šæ¬¡æ‰§è¡Œçš„æ ¸å¿ƒã€‚è¿™ç”¨äºŽç¡®å®šä»»åŠ¡æ˜¯å¦åº”è¯¥é™„åŠ åˆ°ä¸‹ä¸€ä¸ª
+ * æ‰§è¡Œçš„æ ¸å¿ƒã€‚
+ */
+ s32 prev_cpu;
+};
+```
+
+`task_ctx` 结构体包å«ä¸€ä¸ªä¸´æ—¶ CPU 掩ç (`tmp_mask`),用于计算任务的主 CPU 集åˆå’Œä¿ç•™ CPU 集åˆã€‚`prev_misses` è®¡æ•°å™¨è·Ÿè¸ªä»»åŠ¡çš„é¦–é€‰æ ¸å¿ƒä¸ä¸ºç©ºé—²çš„æ¬¡æ•°ï¼Œå½±å“è¿ç§»ä»»åŠ¡åˆ°ä¸åŒæ ¸å¿ƒçš„决ç–。`attached_core` 指示任务当å‰ç»‘å®šçš„æ ¸å¿ƒï¼Œç¡®ä¿åœ¨å¯èƒ½çš„æƒ…å†µä¸‹åœ¨é«˜é¢‘çŽ‡æ ¸å¿ƒä¸Šè¿è¡Œã€‚最åŽï¼Œ`prev_cpu` è®°å½•ä»»åŠ¡ä¸Šæ¬¡æ‰§è¡Œçš„æ ¸å¿ƒï¼Œæœ‰åŠ©äºŽç»´æŠ¤ä»»åŠ¡ä¸Žæ ¸å¿ƒçš„äº²å’Œæ€§ã€‚
+
+#### æ¯ CPU 上下文 (`pcpu_ctx`)
+
+æ¯ä¸ª CPU 都有一个关è”的上下文,用于管ç†å®šæ—¶å™¨å’ŒåŽ‹ç¼©çŠ¶æ€ã€‚è¿™ä¸ªä¸Šä¸‹æ–‡æœ‰åŠ©äºŽç¡®å®šä½•æ—¶ç”±äºŽä¸æ´»åŠ¨è€Œå°†æ ¸å¿ƒä»Žä¸» Nest ä¸é™çº§ã€‚
+
+```c
+struct pcpu_ctx {
+ /* 用于从主 Nest ä¸åŽ‹ç¼©æ ¸å¿ƒçš„å®šæ—¶å™¨ã€‚ */
+ struct bpf_timer timer;
+
+ /* 当剿 ¸å¿ƒæ˜¯å¦å·²å®‰æŽ’进行压缩。 */
+ bool scheduled_compaction;
+};
+```
+
+`pcpu_ctx` 结构体包å«ä¸€ä¸ª `bpf_timer`,用于调度压缩事件,以åŠä¸€ä¸ªå¸ƒå°”æ ‡å¿— `scheduled_compaction`,指示是å¦å·²ä¸ºæ ¸å¿ƒå®‰æŽ’了压缩。
+
+#### æ˜ å°„
+
+多个 BPF æ˜ å°„ç”¨äºŽå˜å‚¨ä¸Šä¸‹æ–‡å’Œç®¡ç†å®šæ—¶å™¨ï¼š
+
+```c
+/* 任务å˜å‚¨æ˜ å°„ */
+struct {
+ __uint(type, BPF_MAP_TYPE_TASK_STORAGE);
+ __uint(map_flags, BPF_F_NO_PREALLOC);
+ __type(key, int);
+ __type(value, struct task_ctx);
+} task_ctx_stor SEC(".maps");
+
+/* æ¯ CPU 上下文 */
+struct {
+ __uint(type, BPF_MAP_TYPE_ARRAY);
+ __uint(max_entries, 1024);
+ __type(key, s32);
+ __type(value, struct pcpu_ctx);
+} pcpu_ctxs SEC(".maps");
+
+/* 统计定时器 */
+struct {
+ __uint(type, BPF_MAP_TYPE_ARRAY);
+ __uint(max_entries, 1);
+ __type(key, u32);
+ __type(value, struct stats_timer);
+} stats_timer SEC(".maps");
+```
+
+- **`task_ctx_stor`:** è¯¥æ˜ å°„å˜å‚¨æ¯ä¸ªä»»åŠ¡çš„è°ƒåº¦ä¸Šä¸‹æ–‡ï¼Œä½¿è°ƒåº¦å™¨èƒ½å¤Ÿè®¿é—®å’Œä¿®æ”¹ç‰¹å®šä»»åŠ¡çš„ä¿¡æ¯ã€‚
+- **`pcpu_ctxs`:** ä¸€ä¸ªæ•°ç»„æ˜ å°„ï¼Œä¿å˜æ¯ä¸ª CPU çš„ä¸Šä¸‹æ–‡ï¼Œä½¿è°ƒåº¦å™¨èƒ½å¤Ÿç®¡ç†æ¯ä¸ª CPU 的定时器和压缩状æ€ã€‚
+- **`stats_timer`:** ä¸€ä¸ªå•æ¡ç›®çš„æ•°ç»„æ˜ å°„ï¼Œç”¨äºŽç®¡ç†ç”¨äºŽæ”¶é›†è°ƒåº¦ç»Ÿè®¡ä¿¡æ¯çš„ä¸å¤®å®šæ—¶å™¨ã€‚
+
+æ¤å¤–,调度器维护了主 CPU 掩ç ã€ä¿ç•™ CPU 掩ç ã€å…¶ä»– CPU 掩ç 和空闲 CPU 掩ç ,以åŠç”¨äºŽè·Ÿè¸ªå„ç§è°ƒåº¦å™¨æŒ‡æ ‡çš„ç»Ÿè®¡æ˜ å°„ã€‚
+
+### æ ¸å¿ƒå‡½æ•°
+
+#### `stat_inc`
+
+一个辅助函数,用于递增调度统计数æ®ï¼š
+
+```c
+static __always_inline void stat_inc(u32 idx)
+{
+ u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx);
+ if (cnt_p)
+ (*cnt_p)++;
+}
+```
+
+æ¤å‡½æ•°åœ¨ `stats` æ˜ å°„ä¸æŸ¥æ‰¾ä¸€ä¸ªè®¡æ•°å™¨ï¼Œå¹¶åœ¨è®¡æ•°å™¨å˜åœ¨æ—¶é€’增它。调度器在å„处使用它æ¥è·Ÿè¸ªå„ç§äº‹ä»¶å’Œçжæ€ã€‚
+
+#### `vtime_before`
+
+一个用于比较虚拟时间的实用函数:
+
+```c
+static inline bool vtime_before(u64 a, u64 b)
+{
+ return (s64)(a - b) < 0;
+}
+```
+
+æ¤å‡½æ•°ç¡®å®šè™šæ‹Ÿæ—¶é—´ `a` 是å¦åœ¨ `b` 之å‰ï¼Œæœ‰åŠ©äºŽåŸºäºŽæ—¶é—´çš„è°ƒåº¦å†³ç–。
+
+#### `try_make_core_reserved`
+
+å°è¯•å°†ä¸€ä¸ªæ ¸å¿ƒæå‡ä¸ºä¿ç•™ Nest:
+
+```c
+static __always_inline void
+try_make_core_reserved(s32 cpu, struct bpf_cpumask * reserved, bool promotion)
+{
+ s32 tmp_nr_reserved;
+
+ /*
+ * æ¤æ£€æŸ¥å˜åœ¨ç«žäº‰ï¼Œä½†æ²¡å…³ç³»ã€‚å¦‚æžœæˆ‘ä»¬é”™è¯¯åœ°æœªèƒ½å°†æ ¸å¿ƒæå‡åˆ°ä¿ç•™ï¼Œ
+ * é‚£æ˜¯å› ä¸ºå¦ä¸€ä¸ªä¸Šä¸‹æ–‡åœ¨è¿™ä¸ªå°çª—å£ä¸æ·»åŠ æˆ–ç§»é™¤äº†ä¿ç•™ä¸çš„æ ¸å¿ƒã€‚
+ * 这将在éšåŽçš„唤醒ä¸å¹³è¡¡ã€‚
+ */
+ tmp_nr_reserved = nr_reserved;
+ if (tmp_nr_reserved < r_max) {
+ /*
+ * 这里有å¯èƒ½æš‚时超过 r_max,但éšç€æ›´å¤šæ ¸å¿ƒè¢«é™çº§æˆ–未能
+ * 被æå‡åˆ°ä¿ç•™ Nest,应该会平衡。
+ */
+ __sync_fetch_and_add(&nr_reserved, 1);
+ bpf_cpumask_set_cpu(cpu, reserved);
+ if (promotion)
+ stat_inc(NEST_STAT(PROMOTED_TO_RESERVED));
+ else
+ stat_inc(NEST_STAT(DEMOTED_TO_RESERVED));
+ } else {
+ bpf_cpumask_clear_cpu(cpu, reserved);
+ stat_inc(NEST_STAT(RESERVED_AT_CAPACITY));
+ }
+}
+```
+
+`try_make_core_reserved` 函数å°è¯•将一个 CPU æ ¸å¿ƒæ·»åŠ åˆ°ä¿ç•™æŽ©ç ä¸ã€‚首先检查ä¿ç•™æ ¸å¿ƒçš„æ•°é‡ (`nr_reserved`) 是å¦ä½ŽäºŽå…许的最大值 (`r_max`)。如果是,则递增 `nr_reserved` è®¡æ•°å™¨å¹¶å°†æ ¸å¿ƒæ·»åŠ åˆ°ä¿ç•™æŽ©ç ä¸ã€‚æ ¹æ®æ ¸å¿ƒæ˜¯è¢«æå‡è¿˜æ˜¯é™çº§ï¼Œé€’增相应的统计数æ®ã€‚如果ä¿ç•™å®¹é‡å·²æ»¡ï¼Œåˆ™ä»Žä¿ç•™æŽ©ç 䏿¸…é™¤æ ¸å¿ƒå¹¶æ›´æ–°ç›¸å…³ç»Ÿè®¡æ•°æ®ã€‚
+
+#### `update_attached`
+
+æ ¹æ®æœ€è¿‘çš„æ‰§è¡Œæ›´æ–°ä»»åŠ¡çš„é™„åŠ æ ¸å¿ƒï¼š
+
+```c
+static void update_attached(struct task_ctx *tctx, s32 prev_cpu, s32 new_cpu)
+{
+ if (tctx->prev_cpu == new_cpu)
+ tctx->attached_core = new_cpu;
+ tctx->prev_cpu = prev_cpu;
+}
+```
+
+æ¤å‡½æ•°æ›´æ–°ä»»åŠ¡çš„ `attached_core`。如果任务连ç»åœ¨åŒä¸€æ ¸å¿ƒä¸Šæ‰§è¡Œï¼Œå®ƒä¼šå°†ä»»åŠ¡é™„åŠ åˆ°è¯¥æ ¸å¿ƒã€‚ç„¶åŽæ›´æ–° `prev_cpu` ä»¥åæ˜ 任务最近è¿è¡Œçš„æ ¸å¿ƒã€‚
+
+#### `compact_primary_core`
+
+处ç†ä¸»æ ¸å¿ƒçš„压缩,将其é™çº§åˆ°ä¿ç•™ Nest:
+
+```c
+static int compact_primary_core(void *map, int *key, struct bpf_timer *timer)
+{
+ struct bpf_cpumask *primary, *reserve;
+ s32 cpu = bpf_get_smp_processor_id();
+ struct pcpu_ctx *pcpu_ctx;
+
+ stat_inc(NEST_STAT(CALLBACK_COMPACTED));
+
+ /*
+ * 如果我们到达æ¤å›žè°ƒï¼Œè¿™æ„味ç€å®šæ—¶å™¨å›žè°ƒä»Žæœªè¢«å–消,
+ * å› æ¤éœ€è¦å°†æ ¸å¿ƒä»Žä¸» Nest ä¸é™çº§ã€‚
+ */
+ pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu);
+ if (!pcpu_ctx) {
+ scx_bpf_error("æ— æ³•æŸ¥æ‰¾ pcpu ctx");
+ return 0;
+ }
+ bpf_rcu_read_lock();
+ primary = primary_cpumask;
+ reserve = reserve_cpumask;
+ if (!primary || !reserve) {
+ scx_bpf_error("æ— æ³•æ‰¾åˆ° primary 或 reserve");
+ bpf_rcu_read_unlock();
+ return 0;
+ }
+
+ bpf_cpumask_clear_cpu(cpu, primary);
+ try_make_core_reserved(cpu, reserve, false);
+ bpf_rcu_read_unlock();
+ pcpu_ctx->scheduled_compaction = false;
+ return 0;
+}
+```
+
+当压缩定时器到期时,将调用 `compact_primary_core`。它通过从主掩ç 䏿¸…é™¤å½“å‰ CPU æ ¸å¿ƒå¹¶å°è¯•å°†å…¶æ·»åŠ åˆ°ä¿ç•™æŽ©ç ä¸ï¼Œå°†å½“å‰ CPU æ ¸å¿ƒä»Žä¸» Nest é™çº§åˆ°ä¿ç•™ Nest。这确ä¿äº†ä¸æ´»åŠ¨çš„æ ¸å¿ƒå¾—åˆ°æœ‰æ•ˆç®¡ç†ï¼Œä¿æŒæ€§èƒ½å’Œèµ„æºåˆ©ç”¨ä¹‹é—´çš„平衡。
+
+#### `nest_select_cpu`
+
+在任务唤醒时确定适当的 CPU:
+
+```c
+s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu, u64 wake_flags)
+{
+ struct bpf_cpumask *p_mask, *primary, *reserve;
+ s32 cpu;
+ struct task_ctx *tctx;
+ struct pcpu_ctx *pcpu_ctx;
+ bool direct_to_primary = false, reset_impatient = true;
+
+ tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0);
+ if (!tctx)
+ return -ENOENT;
+
+ bpf_rcu_read_lock();
+ p_mask = tctx->tmp_mask;
+ primary = primary_cpumask;
+ reserve = reserve_cpumask;
+ if (!p_mask || !primary || !reserve) {
+ bpf_rcu_read_unlock();
+ return -ENOENT;
+ }
+
+ tctx->prev_cpu = prev_cpu;
+
+ bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(primary));
+
+ /* 首先å°è¯•åœ¨é™„åŠ æ ¸å¿ƒä¸Šå”¤é†’ä»»åŠ¡ã€‚ */
+ if (bpf_cpumask_test_cpu(tctx->attached_core, cast_mask(p_mask)) &&
+ scx_bpf_test_and_clear_cpu_idle(tctx->attached_core)) {
+ cpu = tctx->attached_core;
+ stat_inc(NEST_STAT(WAKEUP_ATTACHED));
+ goto migrate_primary;
+ }
+
+ /*
+ * 如果之å‰çš„æ ¸å¿ƒåœ¨ä¸»é›†åˆä¸ï¼Œå¹¶ä¸”没有 hypertwin,则å°è¯•留在之å‰çš„æ ¸å¿ƒã€‚
+ * 如果之å‰çš„æ ¸å¿ƒæ˜¯ä»»åŠ¡é™„åŠ çš„æ ¸å¿ƒï¼Œä¸éœ€è¦å†å°è¯•ï¼Œå› ä¸ºæˆ‘ä»¬å·²ç»åœ¨ä¸Šé¢å°è¯•过了。
+ */
+ if (prev_cpu != tctx->attached_core &&
+ bpf_cpumask_test_cpu(prev_cpu, cast_mask(p_mask)) &&
+ scx_bpf_test_and_clear_cpu_idle(prev_cpu)) {
+ cpu = prev_cpu;
+ stat_inc(NEST_STAT(WAKEUP_PREV_PRIMARY));
+ goto migrate_primary;
+ }
+
+ if (find_fully_idle) {
+ /* ç„¶åŽå°è¯•在主集åˆä¸é€‰æ‹©ä»»ä½•å®Œå…¨ç©ºé—²çš„æ ¸å¿ƒã€‚ */
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask),
+ SCX_PICK_IDLE_CORE);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_PRIMARY));
+ goto migrate_primary;
+ }
+ }
+
+ /* ç„¶åŽå°è¯•在主集åˆä¸é€‰æ‹©ä»»ä½•ç©ºé—²çš„æ ¸å¿ƒï¼Œå³ä½¿å…¶ hypertwin æ£åœ¨æ´»åŠ¨ã€‚ */
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_PRIMARY));
+ goto migrate_primary;
+ }
+
+ if (r_impatient > 0 && ++tctx->prev_misses >= r_impatient) {
+ direct_to_primary = true;
+ tctx->prev_misses = 0;
+ stat_inc(NEST_STAT(TASK_IMPATIENT));
+ }
+
+ reset_impatient = false;
+
+ /* ç„¶åŽå°è¯•在ä¿ç•™é›†åˆä¸é€‰æ‹©ä»»ä½•å®Œå…¨ç©ºé—²çš„æ ¸å¿ƒã€‚ */
+ bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(reserve));
+ if (find_fully_idle) {
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask),
+ SCX_PICK_IDLE_CORE);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_RESERVE));
+ goto promote_to_primary;
+ }
+ }
+
+ /* ç„¶åŽå°è¯•在ä¿ç•™é›†åˆä¸é€‰æ‹©ä»»ä½•ç©ºé—²çš„æ ¸å¿ƒï¼Œå³ä½¿å…¶ hypertwin æ£åœ¨æ´»åŠ¨ã€‚ */
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_RESERVE));
+ goto promote_to_primary;
+ }
+
+ /* ç„¶åŽå°è¯•在任务的 cpumask ä¸é€‰æ‹©ä»»ä½•ç©ºé—²çš„æ ¸å¿ƒã€‚ */
+ cpu = scx_bpf_pick_idle_cpu(p->cpus_ptr, 0);
+ if (cpu >= 0) {
+ /*
+ * æˆ‘ä»¬æ‰¾åˆ°äº†ä¸€ä¸ªæ ¸å¿ƒï¼ˆæˆ‘ä»¬è®¤ä¸ºå®ƒä¸åœ¨ä»»ä½• Nest ä¸ï¼‰ã€‚
+ * è¿™æ„å‘³ç€æˆ‘们需è¦å°†è¯¥æ ¸å¿ƒæå‡åˆ°ä¿ç•™ Nest,或者如果由于
+ * 超过 r_impatient 而直接æå‡åˆ°ä¸» Nest。
+ *
+ * 我们必须在这里进行最åŽä¸€æ¬¡æ£€æŸ¥ï¼Œçœ‹çœ‹æ ¸å¿ƒæ˜¯å¦åœ¨ä¸»æŽ©ç 或ä¿ç•™æŽ©ç ä¸ï¼Œ
+ * å› ä¸ºæˆ‘ä»¬å¯èƒ½ä¸Žæ ¸å¿ƒåœ¨å°†ä¸»æŽ©ç å’Œä¿ç•™æŽ©ç 与 p->cpus_ptr 进行 AND
+ * è¿ç®—之间更改状æ€ï¼Œå¹¶ä½¿ç”¨ scx_bpf_pick_idle_cpu() åŽŸåæ€§åœ°ä¿ç•™å®ƒã€‚
+ * 这在上é¢çš„æ£€æŸ¥ä¸æŠ€æœ¯ä¸Šä¹Ÿæ˜¯å¦‚æ¤ï¼Œä½†åœ¨é‚£äº›æƒ…å†µä¸‹æˆ‘ä»¬åªæ˜¯ç›´æŽ¥
+ * å°†æ ¸å¿ƒæ”¾å…¥ä¸»æŽ©ç ä¸ï¼Œå› æ¤é—®é¢˜ä¸å¤§ã€‚在这里,我们è¦ç¡®ä¿ä¸ä¼š
+ * æ„外地将已ç»åœ¨ä¸»æŽ©ç ä¸çš„æ ¸å¿ƒæ”¾å…¥ä¿ç•™ Nest ä¸ã€‚这是ä¸å¤ªå¯èƒ½çš„,
+ * 但我们在应该相对冷路径上进行了检查。
+ */
+ stat_inc(NEST_STAT(WAKEUP_IDLE_OTHER));
+ if (bpf_cpumask_test_cpu(cpu, cast_mask(primary)))
+ goto migrate_primary;
+ else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve)))
+ goto promote_to_primary;
+ else if (direct_to_primary)
+ goto promote_to_primary;
+ else
+ try_make_core_reserved(cpu, reserve, true);
+ bpf_rcu_read_unlock();
+ return cpu;
+ }
+
+ bpf_rcu_read_unlock();
+ return prev_cpu;
+
+promote_to_primary:
+ stat_inc(NEST_STAT(PROMOTED_TO_PRIMARY));
+migrate_primary:
+ if (reset_impatient)
+ tctx->prev_misses = 0;
+ pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu);
+ if (pcpu_ctx) {
+ if (pcpu_ctx->scheduled_compaction) {
+ if (bpf_timer_cancel(&pcpu_ctx->timer) < 0)
+ scx_bpf_error("å–æ¶ˆ pcpu 定时器失败");
+ if (bpf_timer_set_callback(&pcpu_ctx->timer, compact_primary_core))
+ scx_bpf_error("釿–°è®¾ç½® pcpu 定时器回调失败");
+ pcpu_ctx->scheduled_compaction = false;
+ stat_inc(NEST_STAT(CANCELLED_COMPACTION));
+ }
+ } else {
+ scx_bpf_error("查找 pcpu ctx 失败");
+ }
+ bpf_cpumask_set_cpu(cpu, primary);
+ /*
+ * 检查 CPU 是å¦åœ¨ä¿ç•™æŽ©ç ä¸ã€‚如果是,这å¯èƒ½å‘ç”Ÿåœ¨æ ¸å¿ƒåœ¨æˆ‘ä»¬å°è¯•
+ * 将当å‰å”¤é†’任务分é…到其上时被并å‘åœ°åŽ‹ç¼©ã€‚åŒæ ·ï¼Œå¦‚果我们在
+ * 由于超时直接æå‡åˆ°ä¸» Nest,也会å‘ç”Ÿè¿™ç§æƒ…况。
+ *
+ * 我们ä¸å¿…æ‹…å¿ƒä¸Žå…¶ä»–å”¤é†’ä»»åŠ¡çš„ç«žäº‰ï¼Œå› ä¸ºæˆ‘ä»¬å·²ç»é€šè¿‡ï¼ˆæŸç§
+ * å˜ä½“的)scx_bpf_pick_idle_cpu() åŽŸåæ€§åœ°ä¿ç•™äº†è¯¥æ ¸å¿ƒã€‚
+ */
+ if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) {
+ __sync_sub_and_fetch(&nr_reserved, 1);
+ bpf_cpumask_clear_cpu(cpu, reserve);
+ }
+ bpf_rcu_read_unlock();
+ update_attached(tctx, prev_cpu, cpu);
+ scx_bpf_dispatch(p, SCX_DSQ_LOCAL, slice_ns, 0);
+ return cpu;
+}
+```
+
+`nest_select_cpu` 函数是 `scx_nest` è°ƒåº¦å™¨çš„æ ¸å¿ƒã€‚å½“ä»»åŠ¡å”¤é†’æ—¶ï¼Œæ¤å‡½æ•°ç¡®å®šå…¶æ‰§è¡Œæœ€åˆé€‚çš„ CPU æ ¸å¿ƒã€‚è¯¥å‡½æ•°éµå¾ªä¸€ç³»åˆ—检查,以确ä¿ä»»åŠ¡è¢«æ”¾ç½®åœ¨é«˜é¢‘çŽ‡ã€ç©ºé—²çš„æ ¸å¿ƒä¸Šï¼Œä»Žè€Œæå‡æ•ˆçŽ‡å’Œæ€§èƒ½ã€‚
+
+最åˆï¼Œå®ƒä»Ž `task_ctx_stor` æ˜ å°„ä¸æ£€ç´¢ä»»åŠ¡çš„ä¸Šä¸‹æ–‡ã€‚ç„¶åŽï¼Œå®ƒé”å®šè¯»æ‹·è´æ›´æ–°ï¼ˆRCU)é”,以安全地访问主掩ç å’Œä¿ç•™æŽ©ç 。调度器首先å°è¯•å°†ä»»åŠ¡æ”¾ç½®åœ¨å…¶é™„åŠ æ ¸å¿ƒä¸Šï¼Œç¡®ä¿æ ¸å¿ƒäº²å’Œæ€§ã€‚å¦‚æžœé™„åŠ æ ¸å¿ƒä¸ç©ºé—²ï¼Œå®ƒä¼šå°è¯•å…ˆå‰çš„æ ¸å¿ƒã€‚æ ¹æ®å„ç§æ¡ä»¶ï¼ŒåŒ…括任务的急èºç¨‹åº¦ (`r_impatient`) 和主 Nest åŠä¿ç•™ Nest ä¸ç©ºé—²æ ¸å¿ƒçš„å¯ç”¨æ€§ï¼Œè°ƒåº¦å™¨å†³å®šæ˜¯å¦è¿ç§»ä»»åŠ¡ã€å°†æ ¸å¿ƒæå‡åˆ°ä¸» Nestï¼Œæˆ–å°†æ ¸å¿ƒé™çº§åˆ°ä¿ç•™ Nest。
+
+在整个过程ä¸ï¼Œè°ƒåº¦å™¨æ›´æ–°ç›¸å…³ç»Ÿè®¡æ•°æ®ï¼Œä»¥æä¾›å¯¹å…¶æ“作的è§è§£ã€‚使用 RCU é”ç¡®ä¿è°ƒåº¦å™¨çš„å†³ç–æ˜¯åœ¨ä¸å¹²æ‰°å…¶ä»–并呿“作的情况下安全åšå‡ºçš„。
+
+#### `nest_enqueue`
+
+处ç†å°†ä»»åŠ¡å…¥é˜Ÿåˆ°è°ƒåº¦é˜Ÿåˆ—ï¼š
+
+```c
+void BPF_STRUCT_OPS(nest_enqueue, struct task_struct *p, u64 enq_flags)
+{
+ struct task_ctx *tctx;
+ u64 vtime = p->scx.dsq_vtime;
+
+ tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0);
+ if (!tctx) {
+ scx_bpf_error("æ— æ³•æ‰¾åˆ°ä»»åŠ¡ä¸Šä¸‹æ–‡");
+ return;
+ }
+
+ /*
+ * 将空闲任务的预算é™åˆ¶ä¸ºä¸€ä¸ªåˆ‡ç‰‡ã€‚
+ */
+ if (vtime_before(vtime, vtime_now - slice_ns))
+ vtime = vtime_now - slice_ns;
+
+ scx_bpf_dispatch_vtime(p, FALLBACK_DSQ_ID, slice_ns, vtime, enq_flags);
+}
+```
+
+`nest_enqueue` 函数管ç†ä»»åŠ¡çš„å…¥é˜Ÿï¼Œè°ƒæ•´å…¶è™šæ‹Ÿæ—¶é—´ (`vtime`) 以确ä¿å…¬å¹³æ€§å¹¶é˜²æ¢ä»»åŠ¡åœ¨ç©ºé—²æ—¶ç§¯ç´¯è¿‡å¤šçš„æ‰§è¡Œé¢„ç®—ã€‚å¦‚æžœä»»åŠ¡çš„ `vtime` 低于æŸä¸ªé˜ˆå€¼ï¼Œå®ƒå°†è¢«è°ƒæ•´ä»¥ä¿æŒè°ƒåº¦å™¨å†…部的平衡。
+
+#### `nest_dispatch`
+
+管ç†å°†ä»»åŠ¡åˆ†æ´¾åˆ° CPU æ ¸å¿ƒï¼š
+
+```c
+void BPF_STRUCT_OPS(nest_dispatch, s32 cpu, struct task_struct *prev)
+{
+ struct pcpu_ctx *pcpu_ctx;
+ struct bpf_cpumask *primary, *reserve;
+ s32 key = cpu;
+ bool in_primary;
+
+ primary = primary_cpumask;
+ reserve = reserve_cpumask;
+ if (!primary || !reserve) {
+ scx_bpf_error("没有主或ä¿ç•™ cpumask");
+ return;
+ }
+
+ pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key);
+ if (!pcpu_ctx) {
+ scx_bpf_error("查找 pcpu ctx 失败");
+ return;
+ }
+
+ if (!scx_bpf_consume(FALLBACK_DSQ_ID)) {
+ in_primary = bpf_cpumask_test_cpu(cpu, cast_mask(primary));
+
+ if (prev && (prev->scx.flags & SCX_TASK_QUEUED) && in_primary) {
+ scx_bpf_dispatch(prev, SCX_DSQ_LOCAL, slice_ns, 0);
+ return;
+ }
+
+ stat_inc(NEST_STAT(NOT_CONSUMED));
+ if (in_primary) {
+ /*
+ * 如果主集åˆä¸çš„å‰ä¸€ä¸ªä»»åŠ¡æ£åœ¨æ»äº¡ï¼Œç«‹å³é™çº§ä¸»æ ¸å¿ƒã€‚
+ *
+ * 注æ„,我们选择ä¸åŽ‹ç¼©æŽ©ç ä¸çš„“第一个†CPU,以鼓励至少ä¿ç•™ä¸€ä¸ªæ ¸å¿ƒåœ¨ Nest ä¸ã€‚
+ * 最好检查是å¦ä»…å‰©ä¸€ä¸ªæ ¸å¿ƒåœ¨ Nest ä¸ï¼Œä½† BPF ç›®å‰æ²¡æœ‰ç”¨äºŽæŸ¥è¯¢
+ * cpumask æƒé‡çš„å†…æ ¸å‡½æ•°ã€‚
+ */
+ if ((prev && prev->__state == TASK_DEAD) &&
+ (cpu != bpf_cpumask_first(cast_mask(primary)))) {
+ stat_inc(NEST_STAT(EAGERLY_COMPACTED));
+ bpf_cpumask_clear_cpu(cpu, primary);
+ try_make_core_reserved(cpu, reserve, false);
+ } else {
+ pcpu_ctx->scheduled_compaction = true;
+ /*
+ * æ ¸å¿ƒä¸å†è¢«ä½¿ç”¨ã€‚设置定时器以在 p_remove ä¸ç§»é™¤æ ¸å¿ƒ
+ * å¦‚æžœåœ¨é‚£æ—¶ä»æœªä½¿ç”¨ã€‚
+ */
+ bpf_timer_start(&pcpu_ctx->timer, p_remove_ns,
+ BPF_F_TIMER_CPU_PIN);
+ stat_inc(NEST_STAT(SCHEDULED_COMPACTION));
+ }
+ }
+ return;
+ }
+ stat_inc(NEST_STAT(CONSUMED));
+}
+```
+
+`nest_dispatch` 函数负责将任务分派到 CPU æ ¸å¿ƒã€‚å®ƒé¦–å…ˆæ£€æŸ¥å›žé€€è°ƒåº¦é˜Ÿåˆ— (`FALLBACK_DSQ_ID`) 䏿˜¯å¦æœ‰å¯ç”¨ä»»åŠ¡ã€‚å¦‚æžœæ²¡æœ‰ä»»åŠ¡è¢«æ¶ˆè€—ï¼Œå®ƒä¼šè¯„ä¼° CPU 上的å‰ä¸€ä¸ªä»»åŠ¡æ˜¯å¦å·²ç»æ»äº¡ã€‚如果是,并且 CPU ä¸åœ¨ä¸»æŽ©ç ä¸çš„第一个ä½ç½®ï¼Œè°ƒåº¦å™¨å°†æ ¸å¿ƒé™çº§åˆ°ä¿ç•™ Nest。å¦åˆ™ï¼Œå®ƒä¼šä¸ºæ ¸å¿ƒå®‰æŽ’一个压缩定时器,以便在指定时间åŽå¯èƒ½é™çº§è¯¥æ ¸å¿ƒã€‚如果从回退队列æˆåŠŸæ¶ˆè€—äº†ä¸€ä¸ªä»»åŠ¡ï¼Œå®ƒä¼šé€’å¢žç›¸åº”çš„ç»Ÿè®¡æ•°æ®ã€‚
+
+#### `nest_running`
+
+当任务开始è¿è¡Œæ—¶æ›´æ–°å…¨å±€è™šæ‹Ÿæ—¶é—´ï¼š
+
+```c
+void BPF_STRUCT_OPS(nest_running, struct task_struct *p)
+{
+ /*
+ * 全局虚拟时间在任务开始执行时总是å‘å‰æŽ¨è¿›ã€‚
+ * 测试和更新å¯ä»¥ä»Žå¤šä¸ª CPU åŒæ—¶æ‰§è¡Œï¼Œå› æ¤å˜åœ¨ç«žäº‰ã€‚
+ * ä»»ä½•é”™è¯¯éƒ½åº”è¯¥æ˜¯å¯æŽ§ä¸”æš‚æ—¶çš„ã€‚æˆ‘ä»¬å°±è¿™æ ·å¤„ç†ã€‚
+ */
+ if (vtime_before(vtime_now, p->scx.dsq_vtime))
+ vtime_now = p->scx.dsq_vtime;
+}
+```
+
+`nest_running` 函数确ä¿å…¨å±€è™šæ‹Ÿæ—¶é—´ (`vtime_now`) 在任务开始执行时å‘å‰æŽ¨è¿›ã€‚è¿™ä¸€æœºåˆ¶æœ‰åŠ©äºŽç»´æŠ¤è°ƒåº¦å™¨æ“作的公平性和时间一致性。
+
+#### `nest_stopping`
+
+处ç†ä»»åŠ¡åœæ¢è¿è¡Œï¼Œè°ƒæ•´å…¶è™šæ‹Ÿæ—¶é—´ï¼š
+
+```c
+void BPF_STRUCT_OPS(nest_stopping, struct task_struct *p, bool runnable)
+{
+ /* 按æƒé‡çš„倒数和费用缩放执行时间 */
+ p->scx.dsq_vtime += (slice_ns - p->scx.slice) * 100 / p->scx.weight;
+}
+```
+
+å½“ä»»åŠ¡åœæ¢è¿è¡Œæ—¶ï¼Œ`nest_stopping` æ ¹æ®å…¶æ‰§è¡Œåˆ‡ç‰‡å’Œæƒé‡è°ƒæ•´å…¶è™šæ‹Ÿæ—¶é—´ã€‚这一调整确ä¿ä»»åŠ¡åœ¨è°ƒåº¦å™¨çš„è™šæ‹Ÿæ—¶é—´è®¡ç®—ä¸å¾—åˆ°å…¬å¹³è€ƒè™‘ï¼Œä¿æŒå¹³è¡¡å¹¶é˜²æ¢ä»»ä½•å•ä¸ªä»»åŠ¡åž„æ– CPU 资æºã€‚
+
+#### `nest_init_task`
+
+åˆå§‹åŒ–新任务的上下文:
+
+```c
+s32 BPF_STRUCT_OPS(nest_init_task, struct task_struct *p,
+ struct scx_init_task_args *args)
+{
+ struct task_ctx *tctx;
+ struct bpf_cpumask *cpumask;
+
+ /*
+ * @p 是新的。确ä¿å…¶ task_ctx å¯ç”¨ã€‚
+ * 我们å¯ä»¥åœ¨æ¤å‡½æ•°ä¸ä¼‘çœ ï¼Œä»¥ä¸‹å†…å®¹å°†è‡ªåŠ¨ä½¿ç”¨ GFP_KERNEL。
+ */
+ tctx = bpf_task_storage_get(&task_ctx_stor, p, 0,
+ BPF_LOCAL_STORAGE_GET_F_CREATE);
+ if (!tctx)
+ return -ENOMEM;
+
+ cpumask = bpf_cpumask_create();
+ if (!cpumask)
+ return -ENOMEM;
+
+ cpumask = bpf_kptr_xchg(&tctx->tmp_mask, cpumask);
+ if (cpumask)
+ bpf_cpumask_release(cpumask);
+
+ tctx->attached_core = -1;
+ tctx->prev_cpu = -1;
+
+ return 0;
+}
+```
+
+`nest_init_task` 函数为新任务åˆå§‹åŒ–调度上下文。它通过从 `task_ctx_stor` æ˜ å°„ä¸æ£€ç´¢ä»»åŠ¡çš„ä¸Šä¸‹æ–‡æ¥ç¡®ä¿ä»»åŠ¡çš„ä¸Šä¸‹æ–‡å¯ç”¨ï¼Œåˆ›å»ºä¸€ä¸ªæ–°çš„ `bpf_cpumask` 进行临时计算,并为 `attached_core` å’Œ `prev_cpu` 设置åˆå§‹å€¼ã€‚
+
+#### `nest_enable`
+
+通过设置任务的虚拟时间å¯ç”¨è°ƒåº¦ï¼š
+
+```c
+void BPF_STRUCT_OPS(nest_enable, struct task_struct *p)
+{
+ p->scx.dsq_vtime = vtime_now;
+}
+```
+
+`nest_enable` 函数通过将任务的虚拟时间 (`dsq_vtime`) åˆå§‹åŒ–为当å‰çš„全局虚拟时间 (`vtime_now`) æ¥æ¿€æ´»ä»»åŠ¡çš„è°ƒåº¦ã€‚è¿™ç¡®ä¿äº†ä»»åŠ¡çš„è°ƒåº¦çŠ¶æ€ä¸Žè°ƒåº¦å™¨çš„è™šæ‹Ÿæ—¶é—´åŒæ¥ã€‚
+
+#### `stats_timerfn`
+
+处ç†å®šæœŸçš„ç»Ÿè®¡ä¿¡æ¯æ”¶é›†ï¼š
+
+```c
+static int stats_timerfn(void *map, int *key, struct bpf_timer *timer)
+{
+ s32 cpu;
+ struct bpf_cpumask *primary, *reserve;
+ const struct cpumask *idle;
+ stats_primary_mask = 0;
+ stats_reserved_mask = 0;
+ stats_other_mask = 0;
+ stats_idle_mask = 0;
+ long err;
+
+ bpf_rcu_read_lock();
+ primary = primary_cpumask;
+ reserve = reserve_cpumask;
+ if (!primary || !reserve) {
+ bpf_rcu_read_unlock();
+ scx_bpf_error("查找主或ä¿ç•™å¤±è´¥");
+ return 0;
+ }
+
+ idle = scx_bpf_get_idle_cpumask();
+ bpf_for(cpu, 0, nr_cpus) {
+ if (bpf_cpumask_test_cpu(cpu, cast_mask(primary)))
+ stats_primary_mask |= (1ULL << cpu);
+ else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve)))
+ stats_reserved_mask |= (1ULL << cpu);
+ else
+ stats_other_mask |= (1ULL << cpu);
+
+ if (bpf_cpumask_test_cpu(cpu, idle))
+ stats_idle_mask |= (1ULL << cpu);
+ }
+ bpf_rcu_read_unlock();
+ scx_bpf_put_idle_cpumask(idle);
+
+ err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0);
+ if (err)
+ scx_bpf_error("å¯åŠ¨ç»Ÿè®¡å®šæ—¶å™¨å¤±è´¥");
+
+ return 0;
+}
+```
+
+`stats_timerfn` 函数由ä¸å¤®å®šæ—¶å™¨å®šæœŸè°ƒç”¨ï¼Œç”¨äºŽæ”¶é›†å’Œæ›´æ–°è°ƒåº¦ç»Ÿè®¡ä¿¡æ¯ã€‚å®ƒæ•æ‰å½“å‰ CPU æ ¸å¿ƒçš„çŠ¶æ€ï¼Œå°†å®ƒä»¬åˆ†ç±»åˆ°ä¸»ã€ä¿ç•™ã€å…¶ä»–和空闲掩ç ä¸ã€‚è¿™äº›ä¿¡æ¯æä¾›äº†è°ƒåº¦å™¨å¦‚ä½•ç®¡ç† CPU 资æºå’Œä»»åŠ¡åˆ†é…的洞察。在收集统计信æ¯åŽï¼Œè¯¥å‡½æ•°é‡æ–°å¯åŠ¨å®šæ—¶å™¨ä»¥ç¡®ä¿æŒç»ç›‘控。
+
+#### `nest_init`
+
+åˆå§‹åŒ– `scx_nest` 调度器:
+
+```c
+s32 BPF_STRUCT_OPS_SLEEPABLE(nest_init)
+{
+ struct bpf_cpumask *cpumask;
+ s32 cpu;
+ int err;
+ struct bpf_timer *timer;
+ u32 key = 0;
+
+ err = scx_bpf_create_dsq(FALLBACK_DSQ_ID, NUMA_NO_NODE);
+ if (err) {
+ scx_bpf_error("创建回退 DSQ 失败");
+ return err;
+ }
+
+ cpumask = bpf_cpumask_create();
+ if (!cpumask)
+ return -ENOMEM;
+ bpf_cpumask_clear(cpumask);
+ cpumask = bpf_kptr_xchg(&primary_cpumask, cpumask);
+ if (cpumask)
+ bpf_cpumask_release(cpumask);
+
+ cpumask = bpf_cpumask_create();
+ if (!cpumask)
+ return -ENOMEM;
+
+ bpf_cpumask_clear(cpumask);
+ cpumask = bpf_kptr_xchg(&reserve_cpumask, cpumask);
+ if (cpumask)
+ bpf_cpumask_release(cpumask);
+
+ bpf_for(cpu, 0, nr_cpus) {
+ s32 key = cpu;
+ struct pcpu_ctx *ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key);
+
+ if (!ctx) {
+ scx_bpf_error("查找 pcpu_ctx 失败");
+ return -ENOENT;
+ }
+ ctx->scheduled_compaction = false;
+ if (bpf_timer_init(&ctx->timer, &pcpu_ctxs, CLOCK_BOOTTIME)) {
+ scx_bpf_error("åˆå§‹åŒ– pcpu 定时器失败");
+ return -EINVAL;
+ }
+ err = bpf_timer_set_callback(&ctx->timer, compact_primary_core);
+ if (err) {
+ scx_bpf_error("设置 pcpu 定时器回调失败");
+ return -EINVAL;
+ }
+ }
+
+ timer = bpf_map_lookup_elem(&stats_timer, &key);
+ if (!timer) {
+ scx_bpf_error("查找ä¸å¤®å®šæ—¶å™¨å¤±è´¥");
+ return -ESRCH;
+ }
+ bpf_timer_init(timer, &stats_timer, CLOCK_BOOTTIME);
+ bpf_timer_set_callback(timer, stats_timerfn);
+ err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0);
+ if (err)
+ scx_bpf_error("å¯åŠ¨ç»Ÿè®¡å®šæ—¶å™¨å¤±è´¥");
+
+ return err;
+}
+```
+
+`nest_init` 函数在系统åˆå§‹åŒ–期间设置 `scx_nest` 调度器。它创建了一个回退调度队列 (`FALLBACK_DSQ_ID`) å¹¶åˆå§‹åŒ–了主掩ç å’Œä¿ç•™æŽ©ç 。对于æ¯ä¸ª CPU,它从 `pcpu_ctxs` æ˜ å°„ä¸æ£€ç´¢æ¯ CPU 上下文,åˆå§‹åŒ–压缩定时器,并将回调设置为 `compact_primary_core`。æ¤å¤–,它åˆå§‹åŒ–å¹¶å¯åЍä¸å¤®ç»Ÿè®¡å®šæ—¶å™¨ (`stats_timer`) åŠå…¶å›žè°ƒå‡½æ•° `stats_timerfn`,确ä¿è°ƒåº¦å™¨ç»Ÿè®¡ä¿¡æ¯çš„æŒç»ç›‘控。
+
+#### `nest_exit`
+
+在调度器退出时进行清ç†ï¼š
+
+```c
+void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei)
+{
+ UEI_RECORD(uei, ei);
+}
+```
+
+`nest_exit` 函数记录退出信æ¯å¹¶åœ¨è°ƒåº¦å™¨è¢«ç§»é™¤æˆ–ç³»ç»Ÿå…³é—æ—¶æ‰§è¡Œä»»ä½•å¿…è¦çš„æ¸…ç†æ“ä½œã€‚è¿™ç¡®ä¿æ‰€æœ‰èµ„æºå¾—åˆ°é€‚å½“é‡Šæ”¾ï¼Œç³»ç»Ÿä¿æŒç¨³å®šã€‚
+
+#### `SCX_OPS_DEFINE`
+
+为 `scx_nest` 调度器定义æ“作结构:
+
+```c
+SCX_OPS_DEFINE(nest_ops,
+ .select_cpu = (void *)nest_select_cpu,
+ .enqueue = (void *)nest_enqueue,
+ .dispatch = (void *)nest_dispatch,
+ .running = (void *)nest_running,
+ .stopping = (void *)nest_stopping,
+ .init_task = (void *)nest_init_task,
+ .enable = (void *)nest_enable,
+ .init = (void *)nest_init,
+ .exit = (void *)nest_exit,
+ .flags = 0,
+ .name = "nest");
+```
+
+`SCX_OPS_DEFINE` å®å°†è°ƒåº¦å™¨çš„æ‰€æœ‰å‡½æ•°ç»‘定到 `nest_ops` 结构ä¸ï¼Œ`sched_ext` 框架使用该结构与调度器进行接å£ã€‚这确ä¿è°ƒåº¦å™¨çš„æ“ä½œåœ¨ä»»åŠ¡è°ƒåº¦äº‹ä»¶æœŸé—´è¢«æ£ç¡®æ˜ 射和调用。
+
+### åˆå§‹åŒ–和清ç†
+
+适当的åˆå§‹åŒ–和清ç†å¯¹äºŽè°ƒåº¦å™¨çš„稳定性和性能至关é‡è¦ã€‚
+
+#### `nest_init` 函数
+
+`nest_init` 函数负责在系统åˆå§‹åŒ–期间设置调度器。其æ“作如下:
+
+1. **创建回退调度队列:**
+ - 调用 `scx_bpf_create_dsq` 创建回退调度队列 (`FALLBACK_DSQ_ID`)。如果失败,记录错误并退出。
+
+2. **åˆå§‹åŒ–主掩ç å’Œä¿ç•™æŽ©ç :**
+ - 创建并清除一个新的 `bpf_cpumask` 作为主掩ç 。
+ - 将新创建的掩ç 与现有的 `primary_cpumask` 交æ¢ã€‚如果å˜åœ¨æ—§æŽ©ç ,则释放它。
+ - 对ä¿ç•™æŽ©ç é‡å¤ç›¸åŒçš„过程。
+
+3. **åˆå§‹åŒ–æ¯ CPU 上下文:**
+ - 对于æ¯ä¸ª CPU,从 `pcpu_ctxs` æ˜ å°„ä¸æ£€ç´¢æ¯ CPU 上下文。
+ - å°† `scheduled_compaction` æ ‡å¿—åˆå§‹åŒ–为 `false`。
+ - 使用 `bpf_timer_init` åˆå§‹åŒ–定时器,并使用 `bpf_timer_set_callback` 将回调设置为 `compact_primary_core`。
+ - 如果任何æ¥éª¤å¤±è´¥ï¼Œè®°å½•错误并退出。
+
+4. **åˆå§‹åŒ–å¹¶å¯åŠ¨ç»Ÿè®¡å®šæ—¶å™¨ï¼š**
+ - 从 `stats_timer` æ˜ å°„ä¸æ£€ç´¢ä¸å¤®ç»Ÿè®¡å®šæ—¶å™¨ã€‚
+ - åˆå§‹åŒ–定时器并将其回调设置为 `stats_timerfn`。
+ - 以 `sampling_cadence_ns - 5000` 纳秒的延迟å¯åŠ¨å®šæ—¶å™¨ã€‚
+ - 如果å¯åŠ¨å®šæ—¶å™¨å¤±è´¥ï¼Œè®°å½•é”™è¯¯ã€‚
+
+5. **返回:**
+ - 函数返回定时器åˆå§‹åŒ–的结果,指示æˆåŠŸæˆ–å¤±è´¥ã€‚
+
+这一åˆå§‹åŒ–过程确ä¿è°ƒåº¦å™¨çš„æ‰€æœ‰å¿…è¦ç»„件(包括 CPU 掩ç ã€å®šæ—¶å™¨å’Œè°ƒåº¦é˜Ÿåˆ—)都已æ£ç¡®è®¾ç½®ã€‚
+
+#### `nest_exit` 函数
+
+`nest_exit` å‡½æ•°åœ¨è°ƒåº¦å™¨è¢«ç§»é™¤æˆ–ç³»ç»Ÿå…³é—æ—¶å¤„ç†æ¸…ç†å·¥ä½œï¼š
+
+```c
+void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei)
+{
+ UEI_RECORD(uei, ei);
+}
+```
+
+æ¤å‡½æ•°é€šè¿‡ `UEI_RECORD` å®è®°å½•退出信æ¯ï¼Œç¡®ä¿æ‰§è¡Œä»»ä½•å¿…è¦çš„æ¸…ç†æ“ä½œã€‚è¿™å¯¹äºŽä¿æŒç³»ç»Ÿç¨³å®šæ€§å’Œé˜²æ¢èµ„æºæ³„æ¼è‡³å…³é‡è¦ã€‚
+
+### 最终调度器定义
+
+`SCX_OPS_DEFINE` å®å°†è°ƒåº¦å™¨çš„æ‰€æœ‰å‡½æ•°ç»‘定到å•一结构ä¸ï¼Œä¾› `sched_ext` 框架使用:
+
+```c
+SCX_OPS_DEFINE(nest_ops,
+ .select_cpu = (void *)nest_select_cpu,
+ .enqueue = (void *)nest_enqueue,
+ .dispatch = (void *)nest_dispatch,
+ .running = (void *)nest_running,
+ .stopping = (void *)nest_stopping,
+ .init_task = (void *)nest_init_task,
+ .enable = (void *)nest_enable,
+ .init = (void *)nest_init,
+ .exit = (void *)nest_exit,
+ .flags = 0,
+ .name = "nest");
+```
+
+æ¤ç»“构体 `nest_ops` 有效地将调度器的æ“作注册到 `sched_ext` 框架,确ä¿è°ƒåº¦å™¨åœ¨å„ç§è°ƒåº¦äº‹ä»¶å’Œç³»ç»Ÿçжæ€ä¸‹åšå‡ºé€‚当å“应。
+
+## 编译和执行
+
+è¦ç¼–译和è¿è¡Œ `scx_nest` 调度器,请按照以下æ¥éª¤æ“作:
+
+**编译代ç :**
+
+使用 `make` 构建调度器。确ä¿å·²å®‰è£…å¿…è¦çš„æž„å»ºå·¥å…·å’Œå†…æ ¸å¤´æ–‡ä»¶ã€‚
+
+```bash
+make
+```
+
+**è¿è¡Œè°ƒåº¦å™¨ï¼š**
+
+执行编译åŽçš„è°ƒåº¦å™¨äºŒè¿›åˆ¶æ–‡ä»¶ã€‚æ ¹æ®ç³»ç»Ÿé…置和æƒé™ï¼Œæ‚¨å¯èƒ½éœ€è¦ä»¥æå‡çš„æƒé™è¿è¡Œæ¤å‘½ä»¤ã€‚
+
+```bash
+./scx_nest
+```
+
+### 示例输出
+
+è¿è¡Œè°ƒåº¦å™¨åŽï¼Œæ‚¨åº”该会看到类似以下的输出:
+
+```
+# ./scx_nest
+
+唤醒统计
+------------
+WAKEUP_ATTACHED=150
+WAKEUP_PREV_PRIMARY=61
+WAKEUP_FULLY_IDLE_PRIMARY=0
+WAKEUP_ANY_IDLE_PRIMARY=103
+WAKEUP_FULLY_IDLE_RESERVE=0
+WAKEUP_ANY_IDLE_RESERVE=216
+WAKEUP_IDLE_OTHER=11
+
+
+Nest 统计
+----------
+TASK_IMPATIENT=67
+PROMOTED_TO_PRIMARY=217
+PROMOTED_TO_RESERVED=8
+DEMOTED_TO_RESERVED=212
+RESERVED_AT_CAPACITY=6
+SCHEDULED_COMPACTION=525
+CANCELLED_COMPACTION=314
+EAGERLY_COMPACTED=8
+CALLBACK_COMPACTED=208
+
+
+消耗统计
+-------------
+CONSUMED=166
+NOT_CONSUMED=667
+
+
+
+掩ç
+-----
+PRIMARY ( 0): | -------------------------------------------------------------------------------------------------------------------------------- |
+RESERVED (10): | ***-*--*--------------------------------------------------------***-*--*-------------------------------------------------------- |
+OTHER (128): | ******************************************************************************************************************************** |
+IDLE (16): | ********--------------------------------------------------------********-------------------------------------------------------- |
+
+
+^C退出:已从用户空间注销
+```
+
+æ¤è¾“出æä¾›äº†æœ‰å…³ä»»åС唤醒ã€Nest æ“ä½œã€æ¶ˆè€—率和 CPU 掩ç 状æ€çš„å…¨é¢ç»Ÿè®¡ä¿¡æ¯ã€‚它显示了调度器如何管ç†ä»»åŠ¡å’Œ CPU æ ¸å¿ƒï¼Œå±•ç¤ºäº† `scx_nest` ç®—æ³•åœ¨ä¿æŒé«˜é¢‘çŽ‡æ ¸å¿ƒåˆ©ç”¨çŽ‡å’Œé«˜æ•ˆä»»åŠ¡åˆ†é…æ–¹é¢çš„æœ‰æ•ˆæ€§ã€‚
+
+## 总结与行动呼å
+
+在本教程ä¸ï¼Œæˆ‘们深入探讨了 `scx_nest` 调度器的实现,这是一个先进的 eBPF 程åºï¼ŒåŸºäºŽæ ¸å¿ƒé¢‘率和利用率定制 CPU 调度以优化性能。通过利用 `sched_ext` 框架,`scx_nest` 展示了 eBPF 如何动æ€å®šä¹‰è°ƒåº¦è¡Œä¸ºï¼Œæä¾›è¶…è¶Šä¼ ç»Ÿè°ƒåº¦å™¨çš„çµæ´»æ€§å’ŒæŽ§åˆ¶åŠ›ã€‚
+
+ä¸»è¦æ”¶èŽ·åŒ…æ‹¬ï¼š
+
+- ç†è§£ `sched_ext` è°ƒåº¦å™¨ç±»çš„çµæ´»æ€§å’Œå¼ºå¤§åŠŸèƒ½ã€‚
+- 探索支撑 `scx_nest` è°ƒåº¦å™¨çš„å¤æ‚æ•°æ®ç»“æž„å’Œæ˜ å°„ã€‚
+- 分æžç®¡ç†ä»»åŠ¡åˆ†é…ã€æ ¸å¿ƒåŽ‹ç¼©å’Œç»Ÿè®¡ä¿¡æ¯æ”¶é›†çš„æ ¸å¿ƒå‡½æ•°ã€‚
+- å¦ä¹ 如何编译和执行调度器,并通过详细统计信æ¯è§‚察其影å“。
+
+`scx_nest` 调度器是一个æžå¥½çš„例å,展示了如何利用先进的 eBPF ç¼–ç¨‹ä»¥çµæ´»å’ŒåЍæ€çš„æ–¹å¼å®žçް夿‚的系统功能。
+
+如果您想深入了解 eBPF 并探索更多高级示例,请访问我们的教程仓库 [https://github.com/eunomia-bpf/bpf-developer-tutorial](https://github.com/eunomia-bpf/bpf-developer-tutorial) 或查看我们的网站 [https://eunomia.dev/tutorials/](https://eunomia.dev/tutorials/)。
+
+## å‚考文献
+
+`scx_nest` 调度器的原始æºä»£ç å¯åœ¨ [sched-ext/scx](https://github.com/sched-ext/scx) ä»“åº“ä¸æ‰¾åˆ°ã€‚
+
+å¯ä»¥å¢žå¼ºæ‚¨ç†è§£çš„其他资æºåŒ…括:
+
+- **Linux å†…æ ¸æ–‡æ¡£:** [Scheduler Ext 文档](https://www.kernel.org/doc/html/next/scheduler/sched-ext.html)
+- **å†…æ ¸æºæ ‘:** [Linux å†…æ ¸ `sched_ext` 工具](https://github.com/torvalds/linux/tree/master/tools/sched_ext)
+- **eBPF 官方文档:** [https://ebpf.io/docs/](https://ebpf.io/docs/)
+- **libbpf 文档:** [https://github.com/libbpf/libbpf](https://github.com/libbpf/libbpf)
+
+欢迎探索这些资æºï¼Œæ‰©å±•æ‚¨çš„çŸ¥è¯†ï¼Œç»§ç»æ·±å…¥å¦ä¹ 高级 eBPF 编程的旅程。
\ No newline at end of file
diff --git a/Document/sched_ext/img.png b/Document/sched_ext/img.png
new file mode 100644
index 0000000..71dc234
Binary files /dev/null and b/Document/sched_ext/img.png differ
diff --git a/Document/sched_ext/normal_cpu10.txt b/Document/sched_ext/normal_cpu10.txt
new file mode 100644
index 0000000..6da4a37
--- /dev/null
+++ b/Document/sched_ext/normal_cpu10.txt
@@ -0,0 +1,68 @@
+1us,4us,16us,64us,256us,1ms,4ms,4ms+
+0,210,844,1170,177,185,199,373
+1,260,1091,1741,217,242,281,553
+2,309,1306,2295,242,303,365,747
+2,374,1512,2813,303,340,457,934
+2,399,1594,3024,327,353,482,1180
+2,493,1734,3192,350,360,509,1373
+2,540,1824,3326,384,371,526,1538
+2,603,1912,3456,409,386,550,1679
+2,615,1970,3566,432,400,584,1850
+2,683,2107,3730,461,421,625,2096
+2,720,2194,3895,490,431,653,2295
+2,771,2296,4070,522,450,678,2473
+3,819,2433,4266,540,463,699,2683
+3,866,2538,4383,562,469,717,2807
+3,900,2616,4530,592,482,743,2925
+3,938,2712,4684,614,497,765,3125
+3,955,2790,4830,651,514,798,3318
+3,1007,2897,4986,690,535,832,3531
+3,1055,3006,5149,728,549,858,3720
+4,1126,3112,5247,755,569,893,3863
+4,1157,3188,5411,776,587,921,3972
+4,1209,3283,5561,802,610,948,4153
+4,1251,3379,5750,834,636,976,4350
+4,1293,3470,5905,851,649,1007,4540
+4,1346,3561,6083,874,659,1033,4729
+4,1454,3719,6212,898,673,1115,4947
+4,1494,3795,6341,925,684,1129,5076
+4,1534,3888,6466,949,695,1159,5169
+4,1579,3984,6616,962,711,1174,5274
+4,1620,4074,6721,982,725,1196,5410
+4,1675,4166,6882,1005,736,1213,5519
+4,1743,4270,7063,1043,754,1243,5726
+5,1787,4372,7234,1068,772,1280,5907
+5,1834,4495,7390,1104,802,1327,6078
+6,1868,4563,7528,1113,807,1338,6181
+6,1907,4658,7684,1140,820,1374,6351
+6,1950,4742,7831,1160,831,1393,6467
+6,2000,4833,7958,1175,845,1410,6595
+6,2058,4926,8108,1191,855,1422,6710
+6,2112,5035,8298,1220,868,1458,6916
+6,2149,5108,8434,1235,877,1469,7023
+9,2189,5185,8544,1256,885,1479,7105
+9,2234,5261,8669,1281,897,1506,7243
+9,2258,5335,8787,1305,906,1520,7353
+9,2287,5404,8927,1321,913,1538,7472
+9,2326,5482,9072,1353,921,1566,7604
+9,2361,5563,9227,1376,940,1594,7772
+9,2394,5627,9363,1397,951,1611,7856
+9,2429,5736,9522,1424,961,1636,8023
+9,2470,5825,9680,1439,971,1660,8159
+9,2516,5909,9808,1462,984,1687,8296
+9,2557,5994,9971,1484,997,1724,8437
+9,2585,6059,10111,1504,1007,1744,8547
+9,2624,6139,10245,1523,1015,1761,8642
+9,2656,6221,10359,1550,1030,1794,8757
+9,2678,6281,10494,1576,1039,1807,8862
+10,2702,6397,10637,1606,1052,1823,8995
+10,2755,6490,10817,1644,1074,1853,9138
+10,2770,6559,10934,1663,1086,1877,9272
+10,2809,6655,11095,1684,1103,1901,9372
+10,2903,6913,11334,1772,1168,1981,9807
+10,2942,6995,11472,1792,1181,1999,9930
+12,2991,7114,11747,1815,1193,2024,10096
+12,3004,7212,11931,1837,1206,2045,10218
+12,3012,7239,12077,1845,1212,2048,10229
+12,3071,7361,12436,1861,1232,2078,10282
+12,3120,7424,12662,1871,1235,2088,10296
diff --git a/Document/sched_ext/normal_cpu30.txt b/Document/sched_ext/normal_cpu30.txt
new file mode 100644
index 0000000..e20ed72
--- /dev/null
+++ b/Document/sched_ext/normal_cpu30.txt
@@ -0,0 +1,69 @@
+1us,4us,16us,64us,256us,1ms,4ms,4ms+
+0,66,245,815,52,49,67,79
+0,193,631,2136,106,95,166,235
+0,295,936,2918,162,158,278,425
+0,477,1215,3448,206,188,330,571
+0,601,1558,3481,218,204,390,2924
+0,606,1698,3506,231,209,415,4600
+0,1814,2320,3562,296,260,526,7681
+0,2566,2842,3612,360,329,611,10304
+0,2574,3069,3636,381,339,644,12197
+0,2583,3209,3648,384,346,664,14004
+0,4271,4126,3694,521,423,753,18010
+0,5144,4548,3742,534,469,866,20787
+0,5731,5071,3771,592,511,963,23429
+0,6469,5531,3816,633,533,1071,26286
+0,7209,6093,3851,694,564,1184,29238
+0,7873,6613,3898,753,608,1252,31946
+0,8469,7219,3936,809,631,1340,34529
+0,9239,7799,3970,866,666,1454,37348
+0,9943,8277,4008,928,717,1592,39955
+0,10709,8768,4046,993,744,1676,42835
+0,11404,9276,4095,1045,793,1758,45525
+0,12245,9821,4139,1117,842,1910,48234
+0,13020,10300,4178,1166,866,2010,50892
+0,13859,10855,4231,1242,915,2112,53634
+0,14424,11336,4261,1272,929,2166,56240
+0,15154,11779,4306,1324,963,2250,58844
+0,15876,12190,4339,1373,1017,2303,61504
+0,16607,12659,4388,1423,1058,2357,64144
+0,17356,13144,4419,1451,1092,2502,66670
+0,18159,13693,4477,1518,1156,2585,69368
+0,18639,14253,4506,1552,1193,2664,71973
+0,19201,14658,4560,1570,1246,2811,74426
+0,19428,15322,4630,1624,1317,2901,76884
+0,19844,15882,4669,1689,1370,3070,79171
+0,20489,16388,4725,1747,1430,3207,81779
+0,21062,16784,4767,1781,1483,3282,84375
+0,21801,17255,4801,1838,1507,3368,87048
+0,21850,17820,4864,1872,1602,3556,88933
+0,22372,18259,4895,1894,1696,3669,91243
+0,22717,18846,4933,1922,1744,3832,93545
+0,23083,19379,4965,1950,1817,3919,95914
+0,23791,19858,5010,1974,1861,4109,98497
+0,23813,20457,5057,2012,1915,4284,100409
+0,23848,21037,5118,2064,2009,4459,102170
+0,24397,21582,5181,2133,2078,4562,104685
+0,25119,22066,5223,2173,2098,4701,107362
+0,25503,22625,5263,2207,2181,4891,109683
+0,25543,23158,5317,2242,2265,5175,111411
+0,25616,23663,5356,2281,2370,5418,113071
+0,26268,24175,5409,2322,2505,5560,115561
+0,26783,24620,5446,2356,2568,5647,118013
+0,27224,25002,5484,2395,2631,5700,120440
+0,27513,25524,5537,2415,2678,5849,122842
+0,28084,25960,5583,2444,2712,5951,125509
+0,28794,26301,5616,2475,2738,6046,128321
+0,29449,26700,5656,2514,2780,6117,131016
+0,30154,27142,5694,2569,2807,6161,133776
+0,30727,27630,5751,2607,2855,6372,136199
+0,31277,28020,5788,2642,2912,6462,138532
+0,31949,28577,5827,2691,2936,6606,141038
+0,32133,29130,5884,2725,3014,6700,143137
+1,32195,29713,5932,2800,3146,6871,144946
+1,32417,30307,5970,2825,3238,7072,146981
+1,32921,31062,6038,2919,3357,7310,149492
+1,33031,31206,6416,2966,3366,7319,149506
+1,33196,31480,7059,3037,3448,7406,149675
+1,33230,31540,7433,3077,3455,7411,149689
+1,33391,31688,7901,3099,3464,7426,149703
\ No newline at end of file
diff --git a/Document/sched_ext/sched_ext.md b/Document/sched_ext/sched_ext.md
new file mode 100644
index 0000000..52bbb07
--- /dev/null
+++ b/Document/sched_ext/sched_ext.md
@@ -0,0 +1,789 @@
+## sched_ext介ç»
+sched_ext å·²ç»åœ¨ Linux 6.12 å†…æ ¸ä¸åˆå¹¶ï¼Œsched_ext å…许通过 BPF(Berkeley Packet Filter)编写自定义调度ç–略,
+使得调度器的行为å¯ä»¥çµæ´»è°ƒæ•´ã€‚è¿™ä¸€æ‰©å±•ä½¿å¾—å†…æ ¸å¯ä»¥åЍæ€åœ°åŠ è½½å’Œå¸è½½è°ƒåº¦ç®—æ³•ï¼Œä»Žè€Œæ— éœ€ä¿®æ”¹å†…æ ¸ä»£ç å³å¯å®žçްä¸åŒçš„调度ç–略。
+
+sched_ext 的引入æ„味ç€å¯ä»¥ä½¿ç”¨ BPF 程åºåœ¨ç”¨æˆ·ç©ºé—´å®žçްå„ç§è°ƒåº¦ç®—法,并通过 struct sched_ext_ops æ¥å®šä¹‰è°ƒåº¦è¡Œä¸ºã€‚
+è¿™ç§æ–¹å¼ä½¿å¾—å¼€å‘者å¯ä»¥åˆ›å»ºæ›´çµæ´»å’Œé«˜æ•ˆçš„调度ç–略。
+例如,调度器å¯ä»¥åЍæ€åˆ†é…任务到 CPUã€åˆ›å»ºè‡ªå®šä¹‰çš„调度队列(DSQ),甚至å¯ä»¥æ ¹æ®ä¸åŒçš„应用场景为任务分é…优先级
+
+通过 sched_ext,开å‘者å¯ä»¥æ›´å¥½åœ°æŽ§åˆ¶ä»»åŠ¡çš„è°ƒåº¦è¡Œä¸ºï¼Œä¾‹å¦‚è°ƒä¼˜å®žæ—¶ç³»ç»Ÿçš„æ€§èƒ½ã€å®žçŽ°å¤šçº§ä¼˜å…ˆçº§è°ƒåº¦ç–略或特殊的 CPU 负载平衡算法。
+æ¤æ¬¡åˆå¹¶ä¹Ÿæ ‡å¿—ç€è°ƒåº¦ç–略的一个é‡è¦è½¬å˜ï¼Œå³ä»Žä¼ ç»Ÿçš„å†…æ ¸æ¨¡å—实现转å‘ç”¨æˆ·æ€ BPF 实现,使得调度ç–略的开å‘å’Œè¿ä»£å˜å¾—æ›´åŠ å¿«é€Ÿå’Œå®‰å…¨
+
+官方的GitHub库在这里
+https://github.com/sched-ext/scx/tree/main
+
+在本次介ç»ä¹‹å‰ï¼Œæœ€å¥½å¯¹Linux调度器的架构有一定的了解,
+这里分别是对task_struct的介ç»https://zhuanlan.zhihu.com/p/1114115706
+和对Linux调度器的介ç»https://zhuanlan.zhihu.com/p/1583765020
+
+
+## sched_ext相关组件
+总的æ¥è¯´ï¼ŒSCX机制涉åŠçš„ä»£ç æ–‡ä»¶ä¸»è¦åœ¨ä¸‰ä¸ªåœ°æ–¹
+- include/linux/sched/ext.h
+ - å†…æ ¸ä¸Žç”¨æˆ·çš„æŽ¥å£æ–‡ä»¶, 定义了ç»å¤§å¤šæ•°çš„函数接å£
+- kernel/sched/ext.c
+ - å†…æ ¸æ‹“å±•è°ƒåº¦å™¨æ ¸å¿ƒä»£ç
+- tools/sched_ext
+ - 实现的 SCX 调度器的例å
+
+### sched_ext整体架构
+DEFINE_SCHED_CLASSæ˜¯å†…æ ¸å®žçŽ°è°ƒåº¦ç±»æ—¶å€™ç”¨åˆ°çš„å®ï¼Œç±»æ¯”å¯ä»¥æƒ³æˆæ˜¯å¯¹sched_class这个虚类的具体实现,常è§çš„cfsã€rtã€dl调度器实现都用到了DEFINE_SCHED_CLASS,
+而extå°±æ˜¯å†…æ ¸æœ€æ–°åŠ å…¥çš„â€œæ‰©å±•è°ƒåº¦å™¨â€
+```c
+DEFINE_SCHED_CLASS(ext) = {
+ .enqueue_task = enqueue_task_scx, // å°†ä»»åŠ¡åŠ å…¥è°ƒåº¦é˜Ÿåˆ—ã€‚
+ .dequeue_task = dequeue_task_scx, // 从调度队列ä¸ç§»é™¤ä»»åŠ¡ã€‚
+ .yield_task = yield_task_scx, // 当å‰ä»»åŠ¡è®©å‡º CPU。
+ .yield_to_task = yield_to_task_scx, // 让出 CPU 给特定任务。
+
+ .wakeup_preempt = wakeup_preempt_scx, // 唤醒任务时的抢å 逻辑。
+
+ .balance = balance_scx, // è´Ÿè½½å‡è¡¡æ“作。
+ .pick_task = pick_task_scx, // 选择下一个è¦è¿è¡Œçš„任务。
+
+ .put_prev_task = put_prev_task_scx, // 将当å‰ä»»åŠ¡åˆ‡æ¢å‡º CPU。
+ .set_next_task = set_next_task_scx, // 设置è¦è¿è¡Œçš„下一个任务。
+
+#ifdef CONFIG_SMP
+ .select_task_rq = select_task_rq_scx, // 在多处ç†å™¨ç³»ç»Ÿä¸é€‰æ‹©ä»»åŠ¡è¿è¡Œé˜Ÿåˆ—。
+ .task_woken = task_woken_scx, // 当任务被唤醒时调用。
+ .set_cpus_allowed = set_cpus_allowed_scx, // 设置任务å¯ä»¥è¿è¡Œçš„ CPU 集。
+
+ .rq_online = rq_online_scx, // è¿è¡Œé˜Ÿåˆ—上线时的处ç†ã€‚
+ .rq_offline = rq_offline_scx, // è¿è¡Œé˜Ÿåˆ—下线时的处ç†ã€‚
+#endif
+
+ .task_tick = task_tick_scx, // 定时器周期内的任务更新。
+
+ .switching_to = switching_to_scx, // 切æ¢åˆ°æ–°çš„调度类时调用。
+ .switched_from = switched_from_scx, // 从当å‰è°ƒåº¦ç±»åˆ‡æ¢èµ°æ—¶è°ƒç”¨ã€‚
+ .switched_to = switched_to_scx, // 切æ¢åˆ°å½“å‰è°ƒåº¦ç±»æ—¶è°ƒç”¨ã€‚
+ .reweight_task = reweight_task_scx, // 调整任务的æƒé‡ï¼ˆä¼˜å…ˆçº§ï¼‰ã€‚
+ .prio_changed = prio_changed_scx, // 任务的优先级å‘生å˜åŒ–时调用。
+
+ .update_curr = update_curr_scx, // 更新当å‰ä»»åŠ¡çš„è¿è¡Œçжæ€ã€‚
+
+#ifdef CONFIG_UCLAMP_TASK
+ .uclamp_enabled = 1, // å¯ç”¨ä»»åŠ¡çš„ Uclamp 支æŒï¼ˆç”¨æˆ·ç©ºé—´çš„ CPU 频率é™åˆ¶ï¼‰ã€‚
+#endif
+};
+```
+上é¢çš„一系列调度类ä¸çš„æˆå‘˜å‡½æ•°ï¼Œéƒ½å¯ä»¥åˆ©ç”¨sched_ext实现用户æ€çš„自定义,具体æ¥è¯´ï¼Œåœ¨sched_ext 的设计架构ä¸,
+ä»»æ„一个对结构体struct sched_ext_ops 的实现都å¯ä»¥è¢«è½½å…¥å†…æ ¸ä½œä¸ºè°ƒåº¦å™¨ï¼Œè¯¥ç»“æž„ä½“ä½äºŽ include/linux/sched/ext.h ä¸
+
+```c
+struct sched_ext_ops {
+ s32 (*select_cpu)(struct task_struct *p, s32 prev_cpu, u64 wake_flags); // Selects the target CPU for a waking task.
+ void (*enqueue)(struct task_struct *p, u64 enq_flags); // Adds a task to the BPF scheduler's queue.
+ void (*dequeue)(struct task_struct *p, u64 deq_flags); // Removes a task from the BPF scheduler's queue.
+ void (*dispatch)(s32 cpu, struct task_struct *prev); // Dispatches tasks or consumes dispatch queues when a CPU is idle.
+ void (*tick)(struct task_struct *p); // Periodic callback for task scheduling based on timer ticks.
+ bool (*yield)(struct task_struct *from, struct task_struct *to); // Handles task yielding to another task or general yielding.
+ void (*cpu_acquire)(s32 cpu, struct scx_cpu_acquire_args *args); // Called when a CPU becomes available to the scheduler.
+ void (*cpu_release)(s32 cpu, struct scx_cpu_release_args *args); // Called when a CPU is released from the scheduler.
+ s32 (*init_task)(struct task_struct *p, struct scx_init_task_args *args); // Initializes a task for BPF scheduling.
+ void (*exit_task)(struct task_struct *p, struct scx_exit_task_args *args); // Cleans up after a task exits.
+ void (*enable)(struct task_struct *p); // Enables BPF scheduling for a task.
+ void (*disable)(struct task_struct *p); // Disables BPF scheduling for a task.
+
+ ...
+
+ void (*cpu_online)(s32 cpu); // Called when a CPU becomes online.
+ void (*cpu_offline)(s32 cpu); // Called when a CPU goes offline.
+ s32 (*init)(void); // Initializes the BPF scheduler.
+ void (*exit)(struct scx_exit_info *info); // Cleans up the BPF scheduler on exit.
+ u64 flags; // Scheduler flags that define behavior.
+
+ ...
+
+ char name[SCX_OPS_NAME_LEN]; // Name of the BPF scheduler.
+};
+```
+对于对于 scx 机制而言, å”¯ä¸€å¿…é¡»çš„å—æ®µåªæœ‰.name å—æ®µ, å¹¶è¦æ±‚æ˜¯ä¸€ä¸ªåˆæ³•çš„ BPF 对象åç§°, 而其余所有的 operation 凿˜¯å¯é€‰çš„ï¼Œå†…æ ¸ä¸æœ‰é»˜è®¤å®žçŽ°ï¼Œ
+对应的默认实现就是DEFINE_SCHED_CLASS(ext)ä¸å¯¹åº”的函数
+
+## sched_extä¸Žå†…æ ¸çš„äº¤äº’
+先从整体的æ¥çœ‹ï¼Œåœ¨ç®¡ç†task的范围æ¥çœ‹ï¼Œåœ¨ä¸Šé¢çš„sched_ext的调度类定义ä¸ï¼Œæœ‰ä¸ªflags,当flags设置为SCX_OPS_SWITCH_PARTIAL时候,
+æ¤æ—¶è°ƒåº¦çš„任务进为仅é™äºŽ SCHED_EXT 类型的任务,å¦åˆ™æ‰€æœ‰ SCHED_NORMALã€SCHED_BATCHã€SCHED_IDLE å’Œ SCHED_EXT 任务都由 sched_ext 调度。
+相当于把原æ¥cfs的管辖范围的任务都挪用到sched_ext里了
+
+sched_ext的整体架构如下所示
+
+
+### local DSQå’Œglobal DSQ
+åŒå…¶ä»–调度器类似,在CPUçš„è¿è¡Œé˜Ÿåˆ—rqä¸ä¹Ÿæœ‰ä¸ªsched_extçš„è¿è¡Œé˜Ÿåˆ—scx_rq,但之åŽçš„部分,对比cfs的架构,è¦ç®€å•的多,在sched_extä¸çœŸæ£è´Ÿè´£ç»´æŠ¤è°ƒåº¦é˜Ÿåˆ—的,
+是scx_dispatch_q的结构
+```c
+ * A dispatch queue (DSQ) can be either a FIFO or p->scx.dsq_vtime ordered
+ * queue. A built-in DSQ is always a FIFO. The built-in local DSQs are used to
+ * buffer between the scheduler core and the BPF scheduler. See the
+ * documentation for more details.
+ */
+struct scx_dispatch_q {
+ raw_spinlock_t lock;
+ struct list_head list; /* tasks in dispatch order */
+ struct rb_root priq; /* used to order by p->scx.dsq_vtime */
+ u32 nr;
+ u32 seq; /* used by BPF iter */
+ u64 id;
+ struct rhash_head hash_node;
+ struct llist_node free_node;
+ struct rcu_head rcu;
+};
+```
+这个结构也很简å•,最é‡è¦çš„就个list_head,它å˜çš„æ˜¯ä¸‹ä¸€ä¸ªè¦æŒ‡å‘的任务,相当于一个链表维护了è¿è¡Œé˜Ÿåˆ—,是一个FIFO结构,这个结构是per-CPU的,
+相当于是个local DSQ,与之对应的,全局也有一个global DSQ
+```c
+/*
+ * Dispatch queues.
+ *
+ * The global DSQ (%SCX_DSQ_GLOBAL) is split per-node for scalability. This is
+ * to avoid live-locking in bypass mode where all tasks are dispatched to
+ * %SCX_DSQ_GLOBAL and all CPUs consume from it. If per-node split isn't
+ * sufficient, it can be further split.
+ */
+static struct scx_dispatch_q **global_dsqs;
+```
+- 全局调度队列(Global DSQï¼‰ç”¨äºŽå˜æ”¾æ‰€æœ‰å¾…调度的任务。所有 CPU 都å¯ä»¥ä»Žè¿™ä¸ªé˜Ÿåˆ—ä¸èŽ·å–ä»»åŠ¡æ¥æ‰§è¡Œ
+- 为了æé«˜å¯æ‰©å±•性并防æ¢åœ¨ç»•过模å¼ï¼ˆbypass mode)下å‘生活é”ï¼Œå°†å…¨å±€è°ƒåº¦é˜Ÿåˆ—æŒ‰èŠ‚ç‚¹æ‹†åˆ†ã€‚è¿™ç§æ‹†åˆ†æœ‰åŠ©äºŽé¿å…所有任务都排入åŒä¸€ä¸ªé˜Ÿåˆ—导致的竞争问题
+- 多个按节点划分的global DSQ。这些队列为ä¸åŒçš„节点分é…独立的任务队列,å‡å°‘了竞争,æé«˜äº†è°ƒåº¦çš„并呿€§èƒ½
+
+### task_structä¸çš„sched_ext_entity
+æ¯ä¸ªè°ƒåº¦ç±»éƒ½æœ‰ä¸ªè°ƒåº¦å®žä½“æ¥ç²¾ç¡®åˆ°ä¸ªä½“任务进行调度,在sched_extä¸å°±æ˜¯sched_ext_entity
+```c
+struct sched_ext_entity {
+ struct scx_dispatch_q *dsq; // 任务所属的调度队列(DSQ)。
+ struct scx_dsq_list_node dsq_list; // dsq_list 用于维护任务在这DSQ队列ä¸çš„ä½ç½®
+ struct rb_node dsq_priq; // 按虚拟时间(vtime)排åºçš„çº¢é»‘æ ‘èŠ‚ç‚¹ã€‚
+ u32 dsq_seq; // DSQ 的调度åºåˆ—å·ã€‚
+ u32 dsq_flags; // DSQ é”ä¿æŠ¤çš„æ ‡å¿—ä½ã€‚
+ u32 flags; // è¿è¡Œé˜Ÿåˆ—(RQ)é”ä¿æŠ¤çš„æ ‡å¿—ä½ã€‚
+ u32 weight; // 任务的æƒé‡ï¼Œç”¨äºŽä¼˜å…ˆçº§è®¡ç®—。
+ s32 sticky_cpu; // å好 CPU,表示任务倾å‘于在哪个 CPU 上执行。
+ s32 holding_cpu; // 当å‰ä»»åŠ¡å®žé™…å 用的 CPU。
+ u32 kf_mask; // 特殊调用æ“作的掩ç 。
+ struct task_struct *kf_tasks[2]; // 与调用æ“作相关的任务指针。
+ atomic_long_t ops_state; // æ“作状æ€çš„原åå˜é‡ã€‚
+
+ struct list_head runnable_node; // ç”¨äºŽå°†ä»»åŠ¡åŠ å…¥åˆ°è¿è¡Œé˜Ÿåˆ—çš„å¯è¿è¡Œä»»åŠ¡é“¾è¡¨ä¸ã€‚è¿è¡Œé˜Ÿåˆ—(runqueue, rq)是一个 CPU 级别的结构,用于管ç†å½“å‰å¯ä»¥è°ƒåº¦çš„任务
+ unsigned long runnable_at; // 任务å˜ä¸ºå¯è¿è¡Œçжæ€çš„æ—¶é—´ã€‚
+
+#ifdef CONFIG_SCHED_CORE
+ u64 core_sched_at; // æ ¸å¿ƒè°ƒåº¦çš„æ—¶é—´æˆ³ï¼Œç”¨äºŽä¼˜å…ˆçº§æ¯”è¾ƒã€‚
+#endif
+ u64 ddsp_dsq_id; // 延迟调度时的 DSQ ID。
+ u64 ddsp_enq_flags; // å»¶è¿Ÿè°ƒåº¦æ—¶çš„å…¥é˜Ÿæ ‡å¿—ã€‚
+
+ /* BPF 调度器å¯ä¿®æ”¹çš„å—æ®µ */
+
+ u64 slice; // 任务的è¿è¡Œé¢„算(时间片),以纳秒为å•ä½ï¼Œè‡ªåЍ递å‡ã€‚
+
+ u64 dsq_vtime; // 在 DSQ çš„ vtime 优先级队列ä¸çš„æŽ’åºå€¼ã€‚
+
+ bool disallow; // æ‹’ç»å°†ä»»åŠ¡åˆ‡æ¢åˆ° SCHED_EXT ç–ç•¥çš„æ ‡å¿—ã€‚
+
+ /* 冷嗿®µ */
+#ifdef CONFIG_EXT_GROUP_SCHED
+ struct cgroup *cgrp_moving_from; // æ£åœ¨è¿ç§»çš„ cgroup。
+#endif
+ struct list_head tasks_node; // 链表节点,用于任务的管ç†ï¼ˆå¿…须是最åŽä¸€ä¸ªå—段)。
+};
+```
+介ç»åŸºæœ¬éƒ½åœ¨æ³¨é‡Šé‡Œäº†ï¼Œè¦æ³¨æ„çš„å°±æ˜¯å‡ ä¸ªlist_node,分别scx_dsq_list_node dsq_list记录任务在DSQçš„ä½ç½®ï¼Œ
+还有list_head runnable_node用于记录rq当å‰è¿è¡Œçš„任务,方便schedule时候的æ“作
+
+剩下的æ“作éšç€å…¶ä¸å‡½æ•°çš„è®²è§£å†æ¥è¯´æ˜Ž
+
+### é‡è¦å‡½æ•°
+之åŽä¸ºäº†æ–¹ä¾¿ï¼Œsched_ext都简写为scx
+#### pick_task_scx
+从__pick_next_task进入æ¥çœ‹
+```c
+for_each_active_class(class) {
+ if (class->pick_next_task) {
+ p = class->pick_next_task(rq, prev);
+ if (p)
+ return p;
+ } else {
+ p = class->pick_task(rq);
+ if (p) {
+ put_prev_set_next_task(rq, prev, p);
+ return p;
+ }
+ }
+ }
+```
+在é历调度类时候,å¯ä»¥å‘现scx就在cfs的下é¢
+```c
+#define SCHED_DATA \
+ STRUCT_ALIGN(); \
+ __sched_class_highest = .; \
+ *(__stop_sched_class) \
+ *(__dl_sched_class) \
+ *(__rt_sched_class) \
+ *(__fair_sched_class) \
+ *(__ext_sched_class) \
+ *(__idle_sched_class) \
+ __sched_class_lowest = .;
+```
+在上é¢å·²ç»è®²è¿‡äº†ï¼Œå½“自定义的scx未设置flag时候,cfs的任务都会进入scxçš„é˜Ÿåˆ—ï¼Œæ¤æ—¶å½“é历到__fair_sched_class会å‘现cfs队列是空的,进一æ¥å°±ä¼šåˆ°scx调度类,
+scx的pick_task就是pick_task_scx
+```c
+static struct task_struct *pick_task_scx(struct rq *rq)
+{
+ struct task_struct *prev = rq->curr;
+ struct task_struct *p;
+
+ if ((rq->scx.flags & SCX_RQ_BAL_KEEP) &&
+ prev->sched_class == &ext_sched_class) {
+ p = prev;
+ if (!p->scx.slice)
+ p->scx.slice = SCX_SLICE_DFL;
+ } else {
+ p = first_local_task(rq);
+ if (!p)
+ return NULL;
+
+ if (unlikely(!p->scx.slice)) {
+ if (!scx_rq_bypassing(rq) && !scx_warned_zero_slice) {
+ printk_deferred(KERN_WARNING "sched_ext: %s[%d] has zero slice in %s()\n",
+ p->comm, p->pid, __func__);
+ scx_warned_zero_slice = true;
+ }
+ p->scx.slice = SCX_SLICE_DFL;
+ }
+ }
+
+ return p;
+}
+```
+```shell
+获å–当剿£åœ¨è¿è¡Œçš„任务(prev = rq->curr)
+ │
+ ├── 检查是å¦ç»§ç»è¿è¡Œå½“å‰ä»»åŠ¡ï¼ˆrq->scx.flags & SCX_RQ_BAL_KEEP 且 prev->sched_class == &ext_sched_class)
+ │ │
+ │ ├── 是:将 p 设置为 prev,并检查时间片(p->scx.slice)
+ │ │ │
+ │ │ ├── 如果时间片为零,则é‡ç½®ä¸ºé»˜è®¤æ—¶é—´ç‰‡ï¼ˆSCX_SLICE_DFL)
+ │ │ │
+ │ │ └── 返回 p
+ │ │
+ │ └── å¦ï¼šä»Žæœ¬åœ° DSQ ä¸èŽ·å–第一个任务(p = first_local_task(rq))
+ │ │
+ │ ├── 如果 p 为 NULL,则返回 NULLï¼ˆæ— å¯è°ƒåº¦ä»»åŠ¡ï¼‰
+ │ │
+ │ └── 检查时间片(p->scx.slice)
+ │ │
+ │ ├── 如果时间片为零,å‘出è¦å‘Šå¹¶é‡ç½®ä¸ºé»˜è®¤æ—¶é—´ç‰‡ï¼ˆSCX_SLICE_DFL)
+ │ │
+ │ └── 返回 p
+ │
+返回选ä¸çš„任务(p)
+```
+
+#### consume_global_dsq
+å¯ä»¥çœ‹åˆ°pick_task_fairä¸å¹¶æ²¡æœ‰æ¶‰åŠå…±äº«DSQ的任务,而负责将任务在DSQ间转移的,有下é¢è¿™äº›å‡½æ•°
+```c
+static bool consume_global_dsq(struct rq *rq)
+{
+ int node = cpu_to_node(cpu_of(rq));
+
+ return consume_dispatch_q(rq, global_dsqs[node]);
+}
+```
+这个函数ä¸ï¼Œæ ¸å¿ƒçš„实现的consume_dispatch_q,consume_dispatch_q 函数的主è¦ç›®çš„æ˜¯ä»Žç»™å®šçš„调度队列(dsq)ä¸å°è¯•消费一个任务并将其分é…到指定的è¿è¡Œé˜Ÿåˆ—(rq),
+在consume_dispatch_qä¸ï¼Œä¼šå°è¯•å°†global DSQä¸çš„任务都放到rqä¸ï¼Œç›´åˆ°æˆåŠŸæ”¾ä¸Šä¸€ä¸ªä»»åŠ¡ä¸ºæ¢ï¼Œç›¸å½“于这个和上é¢é‚£ä¸ªé…åˆä½¿ç”¨ï¼Œ
+å½“è®¾è®¡è°ƒåº¦å™¨ä¸æ–¹ä¾¿ç›´æŽ¥é€‰æ‹©CPU分å±ä»»åŠ¡æ—¶å€™ï¼Œå¯ä»¥éƒ½å°†ä»»åŠ¡åˆ†é…到global DSQ,之åŽä¿è¯åœ¨æ¯æ¬¡çœŸæ£è°ƒåº¦å‰éƒ½åˆ©ç”¨è¿™ä¸ªconsume_global_dsq让系统自己分é…任务给具体CPU的队列
+```c
+static bool consume_dispatch_q(struct rq *rq, struct scx_dispatch_q *dsq)
+{
+ struct task_struct *p;
+retry:
+ /*
+ * The caller can't expect to successfully consume a task if the task's
+ * addition to @dsq isn't guaranteed to be visible somehow. Test
+ * @dsq->list without locking and skip if it seems empty.
+ */
+ if (list_empty(&dsq->list))
+ return false;
+
+ raw_spin_lock(&dsq->lock);
+
+ // é历dsqä¸çš„任务p
+ nldsq_for_each_task(p, dsq) {
+ struct rq *task_rq = task_rq(p);// 找到当å‰ä»»åŠ¡çš„æ‰€åœ¨çš„rq
+
+ if (rq == task_rq) { // 如果på·²ç»åœ¨ç›®æ ‡rq上
+ task_unlink_from_dsq(p, dsq); // 把任务直接从dsq上扔掉
+ move_local_task_to_local_dsq(p, 0, dsq, rq);// 把pç§»åŠ¨åˆ°ç›®æ ‡rqçš„dsq上
+ raw_spin_unlock(&dsq->lock);
+ return true;
+ }
+
+ if (task_can_run_on_remote_rq(p, rq, false)) { // 如果任务ä¸åœ¨ç›®æ ‡è¿è¡Œé˜Ÿåˆ—上,检查它是å¦å¯ä»¥åœ¨è¿œç¨‹è¿è¡Œé˜Ÿåˆ—上执行
+ if (likely(consume_remote_task(rq, p, dsq, task_rq)))
+ return true;
+ goto retry;
+ }
+ }
+
+ raw_spin_unlock(&dsq->lock);
+ return false;
+}
+```
+
+```c
+static bool consume_remote_task(struct rq *this_rq, struct task_struct *p,
+ struct scx_dispatch_q *dsq, struct rq *src_rq)
+{
+ raw_spin_rq_unlock(this_rq);
+
+ if (unlink_dsq_and_lock_src_rq(p, dsq, src_rq)) { // 从调度队列(dsq)ä¸è§£é™¤ä»»åŠ¡ p 的链接
+ move_remote_task_to_local_dsq(p, 0, src_rq, this_rq); // 将任务从æºè¿è¡Œé˜Ÿåˆ—(src_rq)移动到本地è¿è¡Œé˜Ÿåˆ—(this_rq)
+ return true;
+ } else {
+ raw_spin_rq_unlock(src_rq);
+ raw_spin_rq_lock(this_rq);
+ return false;
+ }
+}
+```
+```c
+static void move_remote_task_to_local_dsq(struct task_struct *p, u64 enq_flags,
+ struct rq *src_rq, struct rq *dst_rq)
+{
+ lockdep_assert_rq_held(src_rq);
+
+ /* the following marks @p MIGRATING which excludes dequeue */
+ deactivate_task(src_rq, p, 0);// è¿™é‡Œæ ¸å¿ƒå°±ä¸ªdequeue_task(rq,p,flags),将任务p在æºrqä¸ç§»é™¤
+ set_task_cpu(p, cpu_of(dst_rq));// 设置task的CPU
+ p->scx.sticky_cpu = cpu_of(dst_rq);
+
+ raw_spin_rq_unlock(src_rq);
+ raw_spin_rq_lock(dst_rq);
+
+ /*
+ * We want to pass scx-specific enq_flags but activate_task() will
+ * truncate the upper 32 bit. As we own @rq, we can pass them through
+ * @rq->scx.extra_enq_flags instead.
+ */
+ WARN_ON_ONCE(!cpumask_test_cpu(cpu_of(dst_rq), p->cpus_ptr));
+ WARN_ON_ONCE(dst_rq->scx.extra_enq_flags);
+ dst_rq->scx.extra_enq_flags = enq_flags;
+ activate_task(dst_rq, p, 0);// å¯¹åº”çš„ï¼Œè¿™é‡Œçš„æ ¸å¿ƒå°±ä¸ªequeue_task(rq,p,flags),将任务pæ”¾åˆ°ç›®æ ‡çš„rq
+ dst_rq->scx.extra_enq_flags = 0;
+}
+```
+总结一下,是个这æµç¨‹
+```c
+consume_global_dsq
+|
+|-- 调用 consume_dispatch_q (ç›®æ ‡ï¼šglobal_dsqs[node]) // å°è¯•从全局调度队列获å–任务
+ |
+ |-- consume_dispatch_q
+ |
+ |-- 检查 dsq 是å¦ä¸ºç©º
+ | |
+ | |-- 如果为空,返回 false // æ²¡æœ‰ä»»åŠ¡å¯æ¶ˆè´¹
+ |
+ |
+ |-- é历 dsq ä¸çš„任务 p (nldsq_for_each_task)
+ |
+ |-- 检查任务 p 是å¦å·²ç»åœ¨ç›®æ ‡ rq 上
+ | |
+ | |-- 如果是,将任务从 dsq ä¸ç§»é™¤ï¼Œå¹¶ç§»åŠ¨åˆ° rq 的本地 DSQ
+ | | |
+ | | |-- 调用 task_unlink_from_dsq // 解除任务与 dsq 的链接
+ | | |-- 调用 move_local_task_to_local_dsq // 移动任务到本地队列
+ | |
+ | |-- 释放é”并返回 true // æˆåŠŸæ¶ˆè´¹ä¸€ä¸ªä»»åŠ¡
+ |
+ |-- 如果任务 p ä¸åœ¨ç›®æ ‡ rq 上,检查是å¦å¯ä»¥åœ¨ç›®æ ‡ rq è¿è¡Œ (task_can_run_on_remote_rq)
+ |
+ |-- 如果å¯ä»¥ï¼Œè°ƒç”¨ consume_remote_task // å°è¯•å°†ä»»åŠ¡ä»Žæº rq è¿ç§»åˆ°ç›®æ ‡ rq
+ | |
+ | |-- é‡Šæ”¾ç›®æ ‡ rq é”,å°è¯•èŽ·å–æº rq çš„é” (unlink_dsq_and_lock_src_rq)
+ | |
+ | |-- 如果æˆåŠŸè§£é™¤ä»»åŠ¡ä¸Ž dsq 的链接
+ | | |
+ | | |-- 调用 move_remote_task_to_local_dsq // å°†ä»»åŠ¡ä»Žæº rq ç§»åŠ¨åˆ°ç›®æ ‡ rq
+ | | |
+ | | |-- deactivate_task // ä»Žæº rq 移除任务
+ | | |-- set_task_cpu // 更新任务的 CPU 设置
+ | | |-- activate_task // å°†ä»»åŠ¡æ·»åŠ åˆ°ç›®æ ‡ rq
+ | |
+ | |-- 返回 true 表示æˆåŠŸæ¶ˆè´¹ä¸€ä¸ªä»»åŠ¡
+ |
+ |-- å¦‚æžœå¤±è´¥ï¼Œé‡æ–°å°è¯• (goto retry)
+ |
+ |-- é历结æŸä¸”未找到åˆé€‚的任务 // æ‰€æœ‰ä»»åŠ¡éƒ½æ— æ³•è¿ç§»
+ |
+ |-- 释放é”并返回 false // 任务消费失败
+```
+
+
+#### scx_bpf_dispatch
+用于将任务分派到指定调度队列(DSQ)的函数。这个函数å¯ä»¥åœ¨ä¸åŒçš„回调函数ä¸ä½¿ç”¨ï¼Œ
+包括 ops.enqueue()ã€ops.select_cpu() å’Œ ops.dispatch()。它的主è¦åŠŸèƒ½æ˜¯å°†ä¸€ä¸ªä»»åŠ¡æ”¾å…¥æŒ‡å®šçš„ FIFO 队列,并设置任务的时间片
+```c
+__bpf_kfunc void scx_bpf_dispatch(struct task_struct *p, u64 dsq_id, u64 slice,
+ u64 enq_flags)
+{
+ if (!scx_dispatch_preamble(p, enq_flags))
+ return;
+
+ if (slice)
+ p->scx.slice = slice;
+ else
+ p->scx.slice = p->scx.slice ?: 1;
+
+ scx_dispatch_commit(p, dsq_id, enq_flags);
+}
+```
+- 首先调用 scx_dispatch_preamble æ£€æŸ¥æ˜¯å¦æ»¡è¶³åˆ†æ´¾æ¡ä»¶ã€‚å¦‚æžœä¸æ»¡è¶³ï¼Œå‡½æ•°ä¼šç›´æŽ¥è¿”回,ä¸è¿›è¡Œä»»åŠ¡åˆ†æ´¾
+- 设置任务的时间片 (slice)
+ - 如果æä¾›çš„ slice 值ä¸ä¸ºé›¶ï¼Œåˆ™å°†ä»»åŠ¡çš„æ—¶é—´ç‰‡è®¾ç½®ä¸ºè¯¥å€¼ã€‚
+ - 如果 slice ä¸ºé›¶ï¼Œåˆ™ä¿æŒå½“å‰çš„å‰©ä½™æ—¶é—´ç‰‡ã€‚å¦‚æžœå½“å‰æ—¶é—´ç‰‡ä¹Ÿä¸ºé›¶ï¼Œå°†å…¶è®¾ç½®ä¸º 1,确ä¿ä»»åŠ¡æœ‰æ—¶é—´ç‰‡å¯ç”¨
+- æäº¤ä»»åŠ¡åˆ°æŒ‡å®šçš„ DSQ (scx_dispatch_commit)
+
+之åŽå®žé™…的任务分派由scx_dispatch_commit完æˆ
+```c
+static void scx_dispatch_commit(struct task_struct *p, u64 dsq_id, u64 enq_flags)
+{
+ struct scx_dsp_ctx *dspc = this_cpu_ptr(scx_dsp_ctx);
+ struct task_struct *ddsp_task;
+
+ ddsp_task = __this_cpu_read(direct_dispatch_task);
+ if (ddsp_task) {
+ mark_direct_dispatch(ddsp_task, p, dsq_id, enq_flags);
+ return;
+ }
+
+ if (unlikely(dspc->cursor >= scx_dsp_max_batch)) {
+ scx_ops_error("dispatch buffer overflow");
+ return;
+ }
+
+ dspc->buf[dspc->cursor++] = (struct scx_dsp_buf_ent){
+ .task = p,
+ .qseq = atomic_long_read(&p->scx.ops_state) & SCX_OPSS_QSEQ_MASK,
+ .dsq_id = dsq_id,
+ .enq_flags = enq_flags,
+ };
+}
+```
+åœ¨å…¶ä¸æ¶‰åŠäº†scx_dsp_ctx,它主è¦å˜å‚¨äº†å½“å‰è¿è¡Œé˜Ÿåˆ—的分派状æ€å’Œä»»åŠ¡è°ƒåº¦ä¿¡æ¯ï¼Œè¦è¡¥å……的是这个是per-CPUçš„
+```c
+struct scx_dsp_ctx {
+ struct rq *rq; // å…³è”çš„è¿è¡Œé˜Ÿåˆ—(runqueueï¼‰ï¼Œè¡¨ç¤ºä»»åŠ¡è°ƒåº¦çš„ç›®æ ‡é˜Ÿåˆ—ã€‚
+ u32 cursor; // åˆ†æ´¾ç¼“å†²åŒºçš„å½“å‰æŒ‡é’ˆï¼ŒæŒ‡å‘缓冲区ä¸ä¸‹ä¸€ä¸ªå¯ç”¨çš„æ¡ç›®ã€‚
+ u32 nr_tasks; // 当å‰è°ƒåº¦ä¸Šä¸‹æ–‡ä¸éœ€è¦åˆ†æ´¾çš„任务数é‡ã€‚
+ struct scx_dsp_buf_ent buf[]; // 分派缓冲区的数组,用于å˜å‚¨ä»»åŠ¡åˆ†æ´¾ä¿¡æ¯ã€‚
+};
+```
+回到上é¢çš„scx_dispatch_commit,它会检查是å¦å˜åœ¨ç›´æŽ¥åˆ†æ´¾çš„任务,检查是å¦å˜åœ¨ç›´æŽ¥åˆ†æ´¾çš„任务则调用 mark_direct_dispatch。
+
+ä¹‹åŽæ‰æ˜¯ä¸»è¦éƒ¨åˆ†ï¼Œæ£€æŸ¥ç¼“冲区,如果未满就将任务 p çš„ä¿¡æ¯æ·»åŠ åˆ°åˆ†æ´¾ç¼“å†²åŒºï¼ˆdspc->buf)ä¸ï¼Œå¹¶æ›´æ–° cursor 指针
+
+对于被压到bufferçš„ä»»åŠ¡ï¼Œä¹‹åŽæ˜¯é€šè¿‡finish_dispatch å’Œ flush_dispatch_buf å‡½æ•°æŠŠä»»åŠ¡å…·ä½“åŠ å…¥é˜Ÿåˆ—çš„
+```c
+static void flush_dispatch_buf(struct rq *rq)
+{
+ struct scx_dsp_ctx *dspc = this_cpu_ptr(scx_dsp_ctx);
+ u32 u;
+
+ for (u = 0; u < dspc->cursor; u++) {
+ struct scx_dsp_buf_ent *ent = &dspc->buf[u];
+
+ finish_dispatch(rq, ent->task, ent->qseq, ent->dsq_id,
+ ent->enq_flags);
+ }
+
+ dspc->nr_tasks += dspc->cursor;
+ dspc->cursor = 0;
+}
+```
+é历bufferä¸çš„任务,利用finish_dispatch将任务具体分派到队列ä¸ï¼Œfinish_dispatchä¸ä¼šæ ¹æ®ä»»åŠ¡çš„çŠ¶æ€è¿›è¡Œä¸€äº›åˆ¤æ–或预处ç†ï¼Œ
+ä¹‹åŽæ ¹æ®DSQçš„id,用dispatch_to_local_dsq分派到CPU本地队列或者用dispatch_enqueueå°†ä»»åŠ¡åŠ å…¥åˆ°å…¨å±€é˜Ÿåˆ—
+
+#### scx_bpf_consume
+ 用于从指定的调度队列(DSQï¼‰ä¸æ¶ˆè´¹ä»»åŠ¡ï¼Œå¹¶å°è¯•å°†å…¶åˆ†æ´¾åˆ°å½“å‰ CPU çš„è¿è¡Œé˜Ÿåˆ—
+
+这里第一æ¥å°±æ˜¯ä¸Šé¢æåˆ°çš„,先清空buffer,把里é¢ä»»åŠ¡éƒ½åˆ†æ´¾å‡ºåŽ»ï¼Œä¹‹åŽæ ¹æ®è¿™ä¸ªDSQçš„id找到DSQ,将DSQ的任务æ¬åˆ°CPUçš„rqä¸
+```c
+__bpf_kfunc bool scx_bpf_consume(u64 dsq_id)
+{
+ struct scx_dsp_ctx *dspc = this_cpu_ptr(scx_dsp_ctx);
+ struct scx_dispatch_q *dsq;
+
+ if (!scx_kf_allowed(SCX_KF_DISPATCH))
+ return false;
+
+ flush_dispatch_buf(dspc->rq);
+
+ dsq = find_user_dsq(dsq_id);
+ if (unlikely(!dsq)) {
+ scx_ops_error("invalid DSQ ID 0x%016llx", dsq_id);
+ return false;
+ }
+
+ if (consume_dispatch_q(dspc->rq, dsq)) {
+ /*
+ * A successfully consumed task can be dequeued before it starts
+ * running while the CPU is trying to migrate other dispatched
+ * tasks. Bump nr_tasks to tell balance_scx() to retry on empty
+ * local DSQ.
+ */
+ dspc->nr_tasks++;
+ return true;
+ } else {
+ return false;
+ }
+}
+```
+
+#### scx_bpf_kick_cpu
+ scx_bpf_kick_cpu å‡½æ•°çš„ä½œç”¨æ˜¯è§¦å‘æŸä¸ª CPU 釿–°è°ƒåº¦ï¼ˆrescheduling)。这个函数å¯ä»¥ç”¨äºŽå”¤é†’一个空闲的 CPU 或者让一个忙碌的 CPU 釿–°è¿›è¡Œä»»åŠ¡è°ƒåº¦ã€‚
+调用æ¤å‡½æ•°ä¼šå°†å®žé™…çš„è°ƒåº¦è§¦å‘æ“ä½œé€šè¿‡ä¸æ–工作(irq workï¼‰å¼‚æ¥æ‰§è¡Œï¼Œä»¥é¿å…é”的问题。
+```c
+__bpf_kfunc void scx_bpf_kick_cpu(s32 cpu, u64 flags)
+{
+ struct rq *this_rq;
+ unsigned long irq_flags;
+
+ if (!ops_cpu_valid(cpu, NULL))
+ return;
+
+ local_irq_save(irq_flags);
+
+ this_rq = this_rq();
+
+ /*
+ * While bypassing for PM ops, IRQ handling may not be online which can
+ * lead to irq_work_queue() malfunction such as infinite busy wait for
+ * IRQ status update. Suppress kicking.
+ */
+ // 如果当å‰è¿è¡Œé˜Ÿåˆ—处于绕过模å¼ï¼ˆscx_rq_bypassing),跳过调度触å‘
+ // å› ä¸ºåœ¨ç»•è¿‡æ¨¡å¼ä¸‹å¯èƒ½ä¸é€‚åˆè¿›è¡Œ IRQ æ“作,å¯èƒ½å¯¼è‡´ irq_work_queue 出现问题
+ if (scx_rq_bypassing(this_rq))
+ goto out;
+
+ /*
+ * Actual kicking is bounced to kick_cpus_irq_workfn() to avoid nesting
+ * rq locks. We can probably be smarter and avoid bouncing if called
+ * from ops which don't hold a rq lock.
+ */
+ // 处ç†ç©ºé—² CPU 的调度请求
+ if (flags & SCX_KICK_IDLE) {
+ struct rq *target_rq = cpu_rq(cpu);
+
+ if (unlikely(flags & (SCX_KICK_PREEMPT | SCX_KICK_WAIT)))
+ scx_ops_error("PREEMPT/WAIT cannot be used with SCX_KICK_IDLE");
+
+ if (raw_spin_rq_trylock(target_rq)) {
+ if (can_skip_idle_kick(target_rq)) {
+ raw_spin_rq_unlock(target_rq);
+ goto out;
+ }
+ raw_spin_rq_unlock(target_rq);
+ }
+ cpumask_set_cpu(cpu, this_rq->scx.cpus_to_kick_if_idle);// 将该 CPU æ·»åŠ åˆ° this_rq->scx.cpus_to_kick_if_idle 掩ç ä¸ï¼Œè¡¨ç¤ºéœ€è¦å”¤é†’空闲 CPU
+ } else {// 处ç†éžç©ºé—²çš„调度请求
+ cpumask_set_cpu(cpu, this_rq->scx.cpus_to_kick);// å¦‚æžœæ ‡å¿—ä¸åŒ…å« SCX_KICK_IDLEï¼Œå°†ç›®æ ‡ CPU æ·»åŠ åˆ° this_rq->scx.cpus_to_kick 掩ç ä¸
+
+ if (flags & SCX_KICK_PREEMPT)// å¦‚æžœåŒ…å« SCX_KICK_PREEMPT æ ‡å¿—ï¼Œå°†ç›®æ ‡ CPU æ·»åŠ åˆ° cpus_to_preempt,表示需è¦è§¦å‘抢å 调度
+ cpumask_set_cpu(cpu, this_rq->scx.cpus_to_preempt);
+ if (flags & SCX_KICK_WAIT)// å¦‚æžœåŒ…å« SCX_KICK_WAIT æ ‡å¿—ï¼Œå°†ç›®æ ‡ CPU æ·»åŠ åˆ° cpus_to_wait,表示需è¦ç‰å¾…完æˆ
+ cpumask_set_cpu(cpu, this_rq->scx.cpus_to_wait);
+ }
+
+ irq_work_queue(&this_rq->scx.kick_cpus_irq_work);
+out:
+ local_irq_restore(irq_flags);
+}
+```
+
+## æ ‡å¿—ä½
+1. scx_exit_kindï¼šç”¨äºŽåœ¨è°ƒåº¦å™¨ä¸æ ‡è®°ä¸åŒçš„退出æ¡ä»¶ï¼Œä»¥ä¾¿è°ƒåº¦å™¨å¯ä»¥æ ¹æ®ä¸åŒçš„é€€å‡ºåŽŸå› è¿›è¡Œç›¸åº”çš„å¤„ç†æˆ–错误报告
+```c
+enum scx_exit_kind {
+ SCX_EXIT_NONE, // 没有退出状æ€ï¼Œè¡¨ç¤ºè°ƒåº¦å™¨æ²¡æœ‰å‘生退出或终æ¢ã€‚
+ SCX_EXIT_DONE, // æ£å¸¸é€€å‡ºï¼Œè¡¨ç¤ºè°ƒåº¦å™¨æ“作已ç»å®Œæˆã€‚
+
+ SCX_EXIT_UNREG = 64, // 用户空间å‘起的调度器注销请求。
+ SCX_EXIT_UNREG_BPF, // ç”± BPF 触å‘的调度器注销。
+ SCX_EXIT_UNREG_KERN, // å†…æ ¸å‘起的调度器注销æ“作。
+ SCX_EXIT_SYSRQ, // ç”± SysRq 键盘命令 'S' 触å‘的调度器退出。
+
+ SCX_EXIT_ERROR = 1024, // è¿è¡Œæ—¶å‘生错误,具体的错误信æ¯ä¼šåŒ…å«åœ¨é”™è¯¯æ¶ˆæ¯ä¸ã€‚
+ SCX_EXIT_ERROR_BPF, // 通过调用 scx_bpf_error() 触å‘çš„è¿è¡Œæ—¶é”™è¯¯ã€‚
+ SCX_EXIT_ERROR_STALL, // 看门狗检测到有任务å¡ä½ï¼Œå¯¼è‡´è°ƒåº¦å™¨è¶…时退出。
+};
+```
+2. scx_ops_flags:调度类ä¸çš„flag,调度器的选项,用于控制调度行为ã€ä»»åŠ¡çš„ç®¡ç†æ–¹å¼ä»¥åŠç³»ç»Ÿèµ„æºçš„调度ç–ç•¥
+```c
+/* sched_ext_ops.flags */
+enum scx_ops_flags {
+ /*
+ * SCX_OPS_KEEP_BUILTIN_IDLE: ä¿ç•™å†…置的空闲状æ€è·Ÿè¸ªï¼Œå³ä½¿å®žçŽ°äº† ops.update_idle()。
+ */
+ SCX_OPS_KEEP_BUILTIN_IDLE = 1LLU << 0,
+
+ /*
+ * SCX_OPS_ENQ_LAST: 默认情况下,当没有其他任务å¯è¿è¡Œæ—¶ï¼Œè°ƒåº¦æ ¸å¿ƒä¼šç»§ç»è¿è¡Œ
+ * 当å‰ä»»åŠ¡ï¼Œå³ä½¿æ—¶é—´ç‰‡å·²è€—å°½ã€‚å¦‚æžœè®¾ç½®äº†æ¤æ ‡å¿—,这些任务将以 %SCX_ENQ_LAST æ ‡å¿—
+ * 的方å¼ä¼ 递给 ops.enqueue()ï¼Œç”¨äºŽé‡æ–°è°ƒåº¦ã€‚
+ */
+ SCX_OPS_ENQ_LAST = 1LLU << 1,
+
+ /*
+ * SCX_OPS_ENQ_EXITING: 当任务å³å°†é€€å‡ºæ—¶ï¼Œå³ä½¿è®¾ç½®äº† PF_EXITING,它å¯èƒ½ä»ä¼šè¢«è°ƒåº¦ã€‚
+ * 如果调度器ä¾èµ–于 PID 查找(例如 bpf_task_from_pid()),而 BPF è°ƒåº¦å™¨æ— æ³•æ‰¾åˆ°è¯¥ä»»åŠ¡ï¼Œ
+ * å¯èƒ½ä¼šå¯¼è‡´ä»»åŠ¡ä¸¢å¤±æˆ– RCU çš„å»¶è¿Ÿã€‚è®¾ç½®æ¤æ ‡å¿—å¯ä»¥å¤„ç†æ¤é—®é¢˜ï¼Œå°†æœªæ‰¾åˆ°çš„任务自动
+ * åŠ å…¥åˆ°æœ¬åœ° DSQ。
+ */
+ SCX_OPS_ENQ_EXITING = 1LLU << 2,
+
+ /*
+ * SCX_OPS_SWITCH_PARTIAL: å¦‚æžœè®¾ç½®äº†æ¤æ ‡å¿—,仅具有 SCHED_EXT ç–略的任务æ‰ä¼šé™„åŠ åˆ°
+ * sched_ext 调度器。å¦åˆ™ï¼ŒSCHED_NORMAL 任务也将包å«åœ¨å†…。
+ */
+ SCX_OPS_SWITCH_PARTIAL = 1LLU << 3,
+
+ /*
+ * SCX_OPS_HAS_CGROUP_WEIGHT: æ”¯æŒ CPU cgroup æƒé‡è®¾ç½®ï¼ˆå¦‚ cpu.weight)。
+ */
+ SCX_OPS_HAS_CGROUP_WEIGHT = 1LLU << 16,
+
+ /*
+ * SCX_OPS_ALL_FLAGS: åŒ…å«æ‰€æœ‰çš„æ ‡å¿—ä½ç»„åˆï¼Œæ–¹ä¾¿è¿›è¡Œæ•´ä½“æ“作的设置和检查。
+ */
+ SCX_OPS_ALL_FLAGS = SCX_OPS_KEEP_BUILTIN_IDLE |
+ SCX_OPS_ENQ_LAST |
+ SCX_OPS_ENQ_EXITING |
+ SCX_OPS_SWITCH_PARTIAL |
+ SCX_OPS_HAS_CGROUP_WEIGHT,
+};
+```
+3. scx_wake_flagsï¼šå”¤é†’æ ‡å¿—æä¾›äº†ä¸åŒçš„任务唤醒情境信æ¯ï¼Œå¸®åŠ©è°ƒåº¦å™¨æ ¹æ®ä¸åŒçš„å”¤é†’æ¥æºåšå‡ºè°ƒåº¦å†³ç–
+```c
+enum scx_wake_flags {
+ SCX_WAKE_FORK = WF_FORK, // å½“ä»»åŠ¡å› ä¸º fork æ“ä½œè¢«å”¤é†’æ—¶ä½¿ç”¨çš„æ ‡å¿—ã€‚
+ SCX_WAKE_TTWU = WF_TTWU, // 用于表示任务在 TTWU(Try To Wake Upï¼‰æ—¶çš„å”¤é†’æ ‡å¿—ã€‚
+ SCX_WAKE_SYNC = WF_SYNC, // è¡¨ç¤ºåŒæ¥å”¤é†’çš„æ ‡å¿—ã€‚
+};
+```
+
+4. scx_enq_flagsï¼šå…¥é˜Ÿæ ‡å¿—ä½
+```c
+enum scx_enq_flags {
+ /* expose select ENQUEUE_* flags as enums */
+ SCX_ENQ_WAKEUP = ENQUEUE_WAKEUP, // è¡¨ç¤ºä»»åŠ¡å› å”¤é†’äº‹ä»¶è€Œè¢«åŠ å…¥é˜Ÿåˆ—ã€‚
+ SCX_ENQ_HEAD = ENQUEUE_HEAD, // 将任务æ’入队列的头部。
+ SCX_ENQ_CPU_SELECTED = ENQUEUE_RQ_SELECTED, // 指示任务已选择一个特定的 CPU。
+
+ /* high 32bits are SCX specific */
+
+ /*
+ * SCX_ENQ_PREEMPT: 当调用 scx_bpf_dispatch() 并将本地 DSQ ä½œä¸ºç›®æ ‡æ—¶ï¼Œ
+ * è®¾ç½®æ¤æ ‡å¿—ä¼šè§¦å‘æŠ¢å 。当å‰ä»»åŠ¡çš„æ—¶é—´ç‰‡å°†è¢«æ¸…é›¶ï¼Œå¹¶ä¸”ä¼šå¼ºåˆ¶ CPU 进入调度路径。
+ * æ¤æ ‡å¿—éšå« SCX_ENQ_HEAD。
+ */
+ SCX_ENQ_PREEMPT = 1LLU << 32,
+
+ /*
+ * SCX_ENQ_REENQ: 当任务先å‰å·²è¢«åŠ å…¥åˆ°å½“å‰ CPU çš„ SCX_DSQ_LOCAL 并被
+ * bpf_scx_reenqueue_local() ç§»é™¤æ—¶ä½¿ç”¨ã€‚å¦‚æžœæ¤æ“作在 ->cpu_release() 回调
+ * 䏿‰§è¡Œï¼Œå¹¶ä¸”ä»»åŠ¡å†æ¬¡é€šè¿‡å½“å‰çš„ ->enqueue() åŠ å…¥åˆ° SCX_LOCAL_DSQ,
+ * 则任务ä¸ä¼šç«‹å³è¢«è°ƒåº¦ï¼Œç›´åˆ°ä¸‹ä¸€æ¬¡ ->cpu_acquire() 回调被调用。
+ */
+ SCX_ENQ_REENQ = 1LLU << 40,
+
+ /*
+ * SCX_ENQ_LAST: 当队列ä¸å”¯ä¸€çš„ä»»åŠ¡è¢«åŠ å…¥æ—¶è®¾ç½®æ¤æ ‡å¿—。默认情况下,ext æ ¸å¿ƒ
+ * ä¼šç»§ç»æ‰§è¡Œè¿™äº›ä»»åŠ¡ï¼Œä½†å¦‚æžœæŒ‡å®šäº† SCX_OPS_ENQ_LASTï¼Œè¿™äº›ä»»åŠ¡ä¼šè¢«æ ‡è®°ä¸º
+ * SCX_ENQ_LASTï¼Œå¹¶ä¼ é€’ç»™ ops.enqueue()。BPF 调度器需è¦è´Ÿè´£è§¦å‘åŽç»çš„调度事件,
+ * å¦åˆ™æ‰§è¡Œå¯èƒ½ä¼šåœæ»žã€‚
+ */
+ SCX_ENQ_LAST = 1LLU << 41,
+
+ /* high 8 bits are internal */
+ __SCX_ENQ_INTERNAL_MASK = 0xffLLU << 56, // å†…éƒ¨ä½¿ç”¨çš„é«˜ä½æŽ©ç 。
+
+ SCX_ENQ_CLEAR_OPSS = 1LLU << 56, // 清除 ops 状æ€ã€‚
+ SCX_ENQ_DSQ_PRIQ = 1LLU << 57, // ä»»åŠ¡è¢«åŠ å…¥åˆ°ä¼˜å…ˆé˜Ÿåˆ—ã€‚
+};
+```
+5. scx_deq_flagsï¼šå‡ºé˜Ÿæ ‡å¿—ä½
+```c
+enum scx_deq_flags {
+ /* expose select DEQUEUE_* flags as enums */
+ SCX_DEQ_SLEEP = DEQUEUE_SLEEP, // ä»»åŠ¡å› ç¡çœ 事件被移出队列。
+
+ /* high 32bits are SCX specific */
+
+ /*
+ * SCX_DEQ_CORE_SCHED_EXEC: 当通用的 core-sched 层决定执行任务时,
+ * å³ä½¿ä»»åŠ¡å°šæœªè¢«åˆ†æ´¾ï¼Œä¹Ÿä¼šä»Ž BPF 侧将任务移出队列。
+ */
+ SCX_DEQ_CORE_SCHED_EXEC = 1LLU << 32,
+};
+```
+6. scx_ent_flagsè°ƒåº¦å®žä½“æ ‡å¿—ä½ï¼Œå’Œscx_task_state任务状æ€
+```c
+/* scx_entity.flags */
+enum scx_ent_flags {
+ SCX_TASK_QUEUED = 1 << 0, // 任务在 sched_ext çš„è¿è¡Œé˜Ÿåˆ—ä¸ã€‚
+ SCX_TASK_RESET_RUNNABLE_AT = 1 << 2, // 需è¦é‡ç½® runnable_at 时间戳。
+ SCX_TASK_DEQD_FOR_SLEEP = 1 << 3, // 任务最åŽä¸€æ¬¡å‡ºé˜Ÿæ˜¯å› 为进入 SLEEP 状æ€ã€‚
+
+ SCX_TASK_STATE_SHIFT = 8, // 用于å˜å‚¨ä»»åŠ¡çŠ¶æ€çš„ä½ç§»é‡ï¼Œä½ 8 å’Œ 9 用æ¥è¡¨ç¤ºä»»åŠ¡çŠ¶æ€ã€‚
+ SCX_TASK_STATE_BITS = 2, // 用于任务状æ€çš„使•°ï¼ˆ2 ä½ï¼‰ã€‚
+ SCX_TASK_STATE_MASK = ((1 << SCX_TASK_STATE_BITS) - 1) << SCX_TASK_STATE_SHIFT, // 用于æå–任务状æ€çš„æŽ©ç 。
+
+ SCX_TASK_CURSOR = 1 << 31, // 用作è¿ä»£å…‰æ ‡ï¼Œä¸è¡¨ç¤ºä¸€ä¸ªå®žé™…的任务。
+};
+
+/* scx_entity.flags & SCX_TASK_STATE_MASK */
+enum scx_task_state {
+ SCX_TASK_NONE, // ops.init_task() 尚未被调用。
+ SCX_TASK_INIT, // ops.init_task() æˆåŠŸï¼Œä½†ä»»åŠ¡å¯ä»¥è¢«å–消。
+ SCX_TASK_READY, // 任务已完全åˆå§‹åŒ–,但尚未进入 sched_ext。
+ SCX_TASK_ENABLED, // 任务已完全åˆå§‹åŒ–并在 sched_ext ä¸ã€‚
+
+ SCX_TASK_NR_STATES, // çŠ¶æ€æ€»æ•°ï¼Œç”¨äºŽè®¡æ•°å’Œè¾¹ç•Œæ£€æŸ¥ã€‚
+};
+```
+7. scx_dsq_id_flags:DSQçš„idçš„flagå’Œidæ ¼å¼
+```c
+/*
+ * DSQ (dispatch queue) IDs are 64bit of the format:
+ *
+ * Bits: [63] [62 .. 0]
+ * [ B] [ ID ]
+ *
+ * B: 1 for IDs for built-in DSQs, 0 for ops-created user DSQs
+ * ID: 63-bit ID
+ *
+ * Built-in IDs:
+ *
+ * Bits: [63] [62] [61..32] [31 .. 0]
+ * [ 1] [ L] [ R ] [ V ]
+ *
+ * 1: 1 for built-in DSQs.
+ * L: 1 for LOCAL_ON DSQ IDs, 0 for others
+ * V: For LOCAL_ON DSQ IDs, a CPU number. For others, a pre-defined value.
+ */
+enum scx_dsq_id_flags {
+ SCX_DSQ_FLAG_BUILTIN = 1LLU << 63, // æ ‡è®°ä¸ºå†…ç½®çš„ DSQ ID
+ SCX_DSQ_FLAG_LOCAL_ON = 1LLU << 62, // æ ‡è®°ä¸º LOCAL_ON 类型的 DSQ
+
+ SCX_DSQ_INVALID = SCX_DSQ_FLAG_BUILTIN | 0, // æ— æ•ˆçš„ DSQ ID
+ SCX_DSQ_GLOBAL = SCX_DSQ_FLAG_BUILTIN | 1, // 全局 DSQ
+ SCX_DSQ_LOCAL = SCX_DSQ_FLAG_BUILTIN | 2, // 本地 DSQ
+ SCX_DSQ_LOCAL_ON = SCX_DSQ_FLAG_BUILTIN | SCX_DSQ_FLAG_LOCAL_ON, // 本地 CPU 特定的 DSQ
+ SCX_DSQ_LOCAL_CPU_MASK = 0xffffffffLLU, // 用于æå– CPU ç¼–å·çš„æŽ©ç
+};
+```
+
+
diff --git a/Document/sched_ext/scx_cpu10.txt b/Document/sched_ext/scx_cpu10.txt
new file mode 100644
index 0000000..6cf0c5f
--- /dev/null
+++ b/Document/sched_ext/scx_cpu10.txt
@@ -0,0 +1,71 @@
+1us,4us,16us,64us,256us,1ms,4ms,4ms+
+0,183,895,1423,118,111,147,397
+0,204,1074,2218,374,205,208,568
+0,213,1167,2619,630,268,263,759
+0,218,1222,2779,818,458,382,1106
+0,222,1282,2998,929,519,404,1335
+0,226,1310,3094,1033,570,418,1523
+0,231,1390,3276,1190,585,428,1628
+0,233,1440,3426,1293,614,445,1789
+0,234,1503,3563,1441,632,470,1939
+0,237,1552,3726,1547,650,481,2117
+0,239,1587,3908,1664,669,500,2309
+0,245,1668,4057,1816,682,514,2462
+0,248,1758,4274,2001,704,520,2633
+0,250,1797,4422,2082,727,532,2782
+0,256,1882,4558,2289,755,543,2938
+0,261,1961,4755,2450,776,558,3091
+0,267,2041,4919,2651,803,578,3283
+0,275,2100,5073,2792,821,591,3406
+0,290,2188,5296,2917,837,600,3570
+0,298,2257,5443,3039,860,616,3709
+0,301,2306,5584,3156,876,624,3903
+0,304,2373,5788,3256,904,640,4086
+0,310,2476,6003,3412,928,665,4327
+0,315,2551,6150,3577,943,679,4465
+0,335,2633,6292,3724,982,691,4622
+0,347,2704,6428,3849,1009,704,4755
+0,352,2780,6579,3956,1029,717,4897
+0,360,2840,6726,4048,1049,728,5040
+0,367,2919,6852,4167,1081,745,5202
+0,374,2993,6960,4266,1122,759,5329
+0,384,3048,7125,4343,1157,770,5553
+0,392,3118,7282,4468,1177,776,5672
+0,413,3209,7437,4628,1206,787,5869
+0,417,3255,7566,4715,1220,794,5969
+0,420,3325,7738,4841,1239,804,6151
+0,429,3394,7909,5061,1318,818,6348
+0,442,3466,8071,5154,1349,835,6529
+0,451,3555,8242,5243,1379,841,6655
+0,459,3617,8435,5417,1401,860,6857
+0,463,3686,8551,5535,1420,862,7007
+0,471,3741,8718,5641,1441,887,7175
+0,477,3820,8869,5778,1474,909,7338
+0,488,3927,9009,5976,1507,929,7509
+0,493,3990,9180,6114,1535,942,7653
+0,496,4038,9314,6259,1549,952,7817
+0,501,4106,9478,6411,1580,960,7957
+0,509,4174,9625,6596,1611,972,8141
+0,511,4211,9757,6749,1631,979,8288
+0,513,4282,9948,6899,1696,1047,8495
+0,520,4345,10100,7028,1717,1055,8610
+0,525,4425,10287,7165,1744,1062,8785
+0,534,4536,10614,7361,1804,1098,8881
+0,552,4691,10965,7480,1838,1123,9062
+0,562,4856,11193,7651,1869,1135,9236
+0,573,5086,11445,7866,1906,1152,9549
+0,579,5313,11698,8026,1951,1165,9838
+0,588,5516,12015,8242,2016,1193,10104
+0,594,5634,12230,8371,2041,1211,10278
+0,603,5763,12409,8549,2069,1225,10493
+0,606,5837,12627,8677,2099,1241,10665
+0,616,5925,12841,8845,2119,1252,10832
+0,620,5997,12955,8978,2136,1265,10927
+0,627,6155,13257,9181,2163,1275,11125
+0,639,6209,13417,9374,2180,1283,11155
+0,642,6251,13554,9713,2194,1287,11171
+0,651,6296,13793,10115,2209,1295,11246
+0,658,6346,13889,10314,2213,1301,11289
+0,663,6389,13956,10490,2235,1309,11330
+0,670,6438,14097,10673,2262,1317,11388
+0,677,6495,14166,10890,2298,1335,11435
diff --git a/Document/sched_ext/scx_cpu10_mask.txt b/Document/sched_ext/scx_cpu10_mask.txt
new file mode 100644
index 0000000..1d9cbc1
--- /dev/null
+++ b/Document/sched_ext/scx_cpu10_mask.txt
@@ -0,0 +1,208 @@
+Masks
+----------------------------------------
+PRIMARY ( 0): | ---------------- |
+RESERVED ( 0): | ---------------- |
+OTHER ( 0): | ---------------- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY ( 0): | ---------------- |
+RESERVED ( 0): | ---------------- |
+OTHER ( 0): | ---------------- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY ( 9): | -****-**-*---**- { |
+RESERVED ( 6): | *----*--*-***--- { |
+OTHER ( 1): | ---------------* { |
+IDLE ( 4): | *----*----*----* { |
+Masks
+----------------------------------------
+PRIMARY ( 9): | -****-**-*---**-H { |
+RESERVED ( 6): | *----*--*-***---H { |
+OTHER ( 1): | ---------------*H { |
+IDLE ( 4): | *----*----*----*H { |
+Masks
+----------------------------------------
+PRIMARY (16): | **************** { |
+RESERVED ( 0): | ---------------- { |
+OTHER ( 0): | ---------------- { |
+IDLE ( 0): | ---------------- { |
+Masks
+----------------------------------------
+PRIMARY (16): | ****************
+ { |
+RESERVED ( 0): | ----------------
+ { |
+OTHER ( 0): | ----------------
+ { |
+IDLE ( 0): | ----------------
+ { |
+Masks
+----------------------------------------
+PRIMARY (16): | **************** { |
+RESERVED ( 0): | ---------------- { |
+OTHER ( 0): | ---------------- { |
+IDLE ( 0): | ---------------- { |
+Masks
+----------------------------------------
+PRIMARY (16): | **************** ( { |
+RESERVED ( 0): | ---------------- ( { |
+OTHER ( 0): | ---------------- ( { |
+IDLE ( 0): | ---------------- ( { |
+Masks
+----------------------------------------
+PRIMARY (16): | **************** : { |
+RESERVED ( 0): | ---------------- : { |
+OTHER ( 0): | ---------------- : { |
+IDLE ( 0): | ---------------- : { |
+Masks
+----------------------------------------
+PRIMARY (16): | **************** D { |
+RESERVED ( 0): | ---------------- D { |
+OTHER ( 0): | ---------------- D { |
+IDLE ( 0): | ---------------- D { |
+Masks
+----------------------------------------
+PRIMARY (14): | -**********-****xN { |
+RESERVED ( 2): | *----------*----xN { |
+OTHER ( 0): | ----------------xN { |
+IDLE ( 0): | ----------------xN { |
+Masks
+----------------------------------------
+PRIMARY (14): | -**********-****X_ { |
+RESERVED ( 2): | *----------*----X_ { |
+OTHER ( 0): | ----------------X_ { |
+IDLE ( 0): | ----------------X_ { |
+Masks
+----------------------------------------
+PRIMARY (10): | *-*-***---*-**** g { |
+RESERVED ( 6): | -*-*---***-*---- g { |
+OTHER ( 0): | ---------------- g { |
+IDLE ( 3): | ---*-----*--*--- g { |
+Masks
+----------------------------------------
+PRIMARY (10): | *-*-***---*-**** x { |
+RESERVED ( 6): | -*-*---***-*---- x { |
+OTHER ( 0): | ---------------- x { |
+IDLE ( 3): | ---*-----*--*--- x { |
+Masks
+----------------------------------------
+PRIMARY (12): | **-****--**-****P { |
+RESERVED ( 4): | --*----**--*----P { |
+OTHER ( 0): | ----------------P { |
+IDLE ( 3): | --*-*------*----P { |
+Masks
+----------------------------------------
+PRIMARY (12): | **-****--**-**** { |
+RESERVED ( 4): | --*----**--*---- { |
+OTHER ( 0): | ---------------- { |
+IDLE ( 3): | --*-*------*---- { |
+Masks
+----------------------------------------
+PRIMARY (14): | **-**********-**8 { |
+RESERVED ( 2): | --*----------*--8 { |
+OTHER ( 0): | ----------------8 { |
+IDLE ( 0): | ----------------8 { |
+Masks
+----------------------------------------
+PRIMARY (14): | **-**********-**è° { |
+RESERVED ( 2): | --*----------*--è° { |
+OTHER ( 0): | ----------------è° { |
+IDLE ( 0): | ----------------è° { |
+Masks
+----------------------------------------
+PRIMARY (14): | -************-**X { |
+RESERVED ( 2): | *------------*--X { |
+OTHER ( 0): | ----------------X { |
+IDLE ( 0): | ----------------X { |
+Masks
+----------------------------------------
+PRIMARY (14): | -************-**0Ã { |
+RESERVED ( 2): | *------------*--0Ã { |
+OTHER ( 0): | ----------------0Ã { |
+IDLE ( 0): | ----------------0Ã { |
+Masks
+----------------------------------------
+PRIMARY (10): | **-***-**-*-**--@Ñ { |
+RESERVED ( 6): | --*---*--*-*--**@Ñ { |
+OTHER ( 0): | ----------------@Ñ { |
+IDLE ( 5): | --*---*----*--**@Ñ { |
+Masks
+----------------------------------------
+PRIMARY (10): | **-***-**-*-**--Pß { |
+RESERVED ( 6): | --*---*--*-*--**Pß { |
+OTHER ( 0): | ----------------Pß { |
+IDLE ( 5): | --*---*----*--**Pß { |
+Masks
+----------------------------------------
+PRIMARY (10): | **---***-*-***-* { |
+RESERVED ( 6): | --***---*-*---*- { |
+OTHER ( 0): | ---------------- { |
+IDLE ( 4): | --*-*---*-*----- { |
+Masks
+----------------------------------------
+PRIMARY (10): | **---***-*-***-* { |
+RESERVED ( 6): | --***---*-*---*- { |
+OTHER ( 0): | ---------------- { |
+IDLE ( 4): | --*-*---*-*----- { |
+Masks
+----------------------------------------
+PRIMARY (12): | -*-**-********-*H { |
+RESERVED ( 4): | *-*--*--------*-H { |
+OTHER ( 0): | ----------------H { |
+IDLE ( 3): | --*--*--------*-H { |
+Masks
+----------------------------------------
+PRIMARY (12): | -*-**-********-* { |
+RESERVED ( 4): | *-*--*--------*- { |
+OTHER ( 0): | ---------------- { |
+IDLE ( 3): | --*--*--------*- { |
+Masks
+----------------------------------------
+PRIMARY (15): | -*************** { |
+RESERVED ( 1): | *--------------- { |
+OTHER ( 0): | ---------------- { |
+IDLE ( 0): | ---------------- { |
+Masks
+----------------------------------------
+PRIMARY (15): | -***************p( { |
+RESERVED ( 1): | *---------------p( { |
+OTHER ( 0): | ----------------p( { |
+IDLE ( 0): | ----------------p( { |
+Masks
+----------------------------------------
+PRIMARY (15): | **-************* 6 { |
+RESERVED ( 1): | --*------------- 6 { |
+OTHER ( 0): | ---------------- 6 { |
+IDLE ( 0): | ---------------- 6 { |
+Masks
+----------------------------------------
+PRIMARY (15): | **-************* A { |
+RESERVED ( 1): | --*------------- A { |
+OTHER ( 0): | ---------------- A { |
+IDLE ( 0): | ---------------- A { |
+Masks
+----------------------------------------
+PRIMARY (12): | -**-***-***-****s |
+RESERVED ( 4): | *--*---*---*----s |
+OTHER ( 0): | ----------------s |
+IDLE ( 5): | **-*---*-*------s |
+Masks
+----------------------------------------
+PRIMARY (12): | -**-***-***-**** |
+RESERVED ( 4): | *--*---*---*---- |
+OTHER ( 0): | ---------------- |
+IDLE ( 5): | **-*---*-*------ |
+Masks
+----------------------------------------
+PRIMARY ( 7): | -*-----****-*--* |
+RESERVED ( 8): | *-*****----*-*-- |
+OTHER ( 1): | --------------*- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY ( 7): | -*-----****-*--* |
+RESERVED ( 8): | *-*****----*-*-- |
+OTHER ( 1): | --------------*- |
+IDLE ( 0): | ---------------- |
diff --git a/Document/sched_ext/scx_cpu30.txt b/Document/sched_ext/scx_cpu30.txt
new file mode 100644
index 0000000..3500dd0
--- /dev/null
+++ b/Document/sched_ext/scx_cpu30.txt
@@ -0,0 +1,66 @@
+1us,4us,16us,64us,256us,1ms,4ms,4ms+
+1,160,638,1315,162,145,196,317
+1,196,917,2040,463,283,303,595
+1,200,985,2241,615,408,413,1191
+1,206,1041,2396,818,669,557,1712
+1,208,1126,2551,1044,970,739,2246
+1,210,1171,2695,1246,1208,861,2709
+1,217,1232,2893,1450,1462,990,3230
+1,219,1267,3009,1569,1662,1108,3707
+1,227,1349,3177,1839,2016,1297,4356
+1,231,1388,3306,1973,2187,1392,4860
+1,231,1416,3395,2142,2393,1499,5358
+1,235,1474,3618,2344,2642,1677,5885
+1,238,1523,3711,2469,2795,1755,6395
+1,241,1580,3924,2669,3086,1948,6920
+1,242,1616,4020,2786,3248,2043,7406
+1,244,1668,4145,2981,3510,2204,7957
+1,244,1698,4297,3134,3716,2300,8443
+1,246,1735,4383,3253,3891,2412,8940
+1,249,1802,4582,3471,4111,2573,9489
+1,251,1840,4682,3590,4260,2637,9963
+1,253,1901,4810,3753,4551,2758,10502
+1,257,1951,4966,3889,4747,2866,11034
+1,257,1992,5083,4028,4928,2988,11526
+1,258,2075,5318,4257,5253,3144,12065
+1,259,2094,5376,4336,5415,3201,12519
+1,266,2185,5544,4586,5640,3312,13099
+1,268,2229,5685,4725,5836,3421,13584
+1,270,2306,5772,4849,6073,3557,14116
+1,271,2372,6013,5070,6285,3695,14620
+1,272,2400,6087,5155,6423,3789,15118
+1,274,2476,6283,5419,6760,4000,15662
+1,274,2491,6377,5512,6899,4066,16123
+1,276,2546,6493,5709,7228,4204,16668
+1,285,2605,6694,5969,7410,4340,17182
+1,285,2627,6759,6051,7561,4415,17701
+1,287,2683,6961,6284,7827,4603,18249
+1,290,2706,7076,6383,7953,4708,18734
+1,291,2761,7219,6598,8289,4882,19276
+1,293,2806,7376,6732,8482,4979,19767
+1,295,2852,7469,6879,8729,5083,20215
+1,301,2908,7655,7168,9061,5278,20786
+1,303,2937,7730,7247,9214,5374,21267
+1,305,3039,7936,7534,9591,5578,21840
+1,305,3066,8019,7628,9734,5665,22305
+1,305,3120,8125,7830,10104,5819,22841
+1,307,3179,8292,8069,10518,5991,23326
+1,307,3194,8346,8168,10668,6075,23790
+1,312,3267,8506,8462,11037,6255,24390
+1,313,3293,8593,8546,11174,6331,24892
+1,315,3364,8684,8765,11473,6460,25435
+1,315,3422,8864,8963,11754,6634,25952
+1,315,3448,8918,9058,11897,6745,26425
+1,315,3508,9070,9274,12214,6952,27019
+1,321,3547,9175,9388,12306,7026,27515
+1,323,3590,9294,9630,12673,7205,28060
+1,325,3633,9424,9741,12843,7327,28588
+1,326,3675,9518,9878,13040,7411,29106
+1,329,3742,9691,10157,13415,7662,29623
+1,329,3762,9742,10231,13541,7742,30089
+1,335,3856,9914,10523,13958,7897,30619
+1,337,3909,10022,10668,14164,8004,31126
+1,339,3964,10132,10792,14401,8160,31647
+1,355,4137,10746,11094,14576,8255,31844
+1,365,4213,11115,11397,14638,8285,31966
+1,380,4505,11867,11972,14822,8483,32087
diff --git a/Document/sched_ext/scx_cpu30_mask.txt b/Document/sched_ext/scx_cpu30_mask.txt
new file mode 100644
index 0000000..4e01790
--- /dev/null
+++ b/Document/sched_ext/scx_cpu30_mask.txt
@@ -0,0 +1,204 @@
+Masks
+----------------------------------------
+PRIMARY ( 0): | ----------------0Ò‡:'p |
+RESERVED ( 0): | ----------------0Ò‡:'p |
+OTHER ( 0): | ----------------0Ò‡:'p |
+IDLE ( 0): | ----------------0Ò‡:'p |
+Masks
+----------------------------------------
+PRIMARY ( 0): | ---------------- |
+RESERVED ( 0): | ---------------- |
+OTHER ( 0): | ---------------- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--**XI| b |
+RESERVED ( 3): | ------*-*---*---XI| b |
+OTHER ( 1): | -------------*--XI| b |
+IDLE ( 0): | ----------------XI| b |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--**XI| b |
+RESERVED ( 3): | ------*-*---*---XI| b |
+OTHER ( 1): | -------------*--XI| b |
+IDLE ( 0): | ----------------XI| b |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--**XI| b |
+RESERVED ( 3): | ------*-*---*---XI| b |
+OTHER ( 1): | -------------*--XI| b |
+IDLE ( 0): | ----------------XI| b |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--**XI| b |
+RESERVED ( 3): | ------*-*---*---XI| b |
+OTHER ( 1): | -------------*--XI| b |
+IDLE ( 0): | ----------------XI| b |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--**XI| b |
+RESERVED ( 3): | ------*-*---*---XI| b |
+OTHER ( 1): | -------------*--XI| b |
+IDLE ( 0): | ----------------XI| b |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--**XI| b |
+RESERVED ( 3): | ------*-*---*---XI| b |
+OTHER ( 1): | -------------*--XI| b |
+IDLE ( 0): | ----------------XI| b |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY (12): | ******-*-***--** |
+RESERVED ( 3): | ------*-*---*--- |
+OTHER ( 1): | -------------*-- |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY ( 4): | -----*-*------** |
+RESERVED ( 8): | ----*-*-******-- |
+OTHER ( 4): | ****------------ |
+IDLE ( 0): | ---------------- |
+Masks
+----------------------------------------
+PRIMARY ( 4): | -----*-*------**XI| b |
+RESERVED ( 8): | ----*-*-******--XI| b |
+OTHER ( 4): | ****------------XI| b |
+IDLE ( 0): | ----------------XI| b |
diff --git a/Document/scx-nest.md b/Document/scx-nest.md
new file mode 100644
index 0000000..fc7d197
--- /dev/null
+++ b/Document/scx-nest.md
@@ -0,0 +1,166 @@
+## scx-nest和监测程åºçš„结åˆ
+scx-nest主è¦é€šè¿‡è¿™å‡ 个map和监测程åºäº¤äº’
+
+```c
+struct{
+ __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
+ __uint(max_entries, 1);
+ __type(key, u32);
+ __array(values,struct cpu_bad_guys);
+} cpu_filter_ids SEC(".maps");
+
+struct{
+ __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
+ __uint(max_entries, 1);
+ __type(key, u32);
+ __array(values,struct task_cpu_usage_map);
+} cpu_task_usage_map SEC(".maps");
+
+// 处ç†ç”¨æˆ·æ€ä¼ çš„å¯èƒ½è¢«è¯¯ä¼¤çš„任务å
+struct {
+ __uint(type, BPF_MAP_TYPE_HASH);
+ __uint(max_entries, 1024);
+ __type(key, struct comm_info);
+ __type(value, u32);
+} comm_ignore_map SEC(".maps");
+
+// 处ç†ç”¨æˆ·æ€ä¼ çš„è¦åŽ»ç‰¹åˆ«æ³¨æ„的任务
+struct {
+ __uint(type, BPF_MAP_TYPE_HASH);
+ __uint(max_entries, 1024);
+ __type(key, struct comm_info);
+ __type(value, u32);
+} comm_attention_map SEC(".maps");
+```
+- æ ¸å¿ƒæœºåˆ¶
+ - 在 scx-nest ä¸ï¼Œä»¥ä¸‹ä¸¤ä¸ªç»“构实现了和 CPU ä»»åŠ¡ç›‘æŽ§çš„æ˜ å°„
+ - cpu_filter_ids 对应 thread_occupied_map,用于å˜å‚¨å½“å‰ CPU å 用率较高的线程身份信æ¯
+ - cpu_task_usage_map对应 task_cpu_usage_map,用于å˜å‚¨å½“å‰ CPU å 用率较高的线程的具体信æ¯
+
+当主程åºåŒæ—¶å¯ç”¨ CPU 监测和 SCX-Nest 功能时,å¯ä»¥å®žçŽ°å¯¹é«˜ CPU å 用任务的自动化抑制。具体抑制机制请å‚考 README ä¸çš„原ç†éƒ¨åˆ†ã€‚
+
+### 实验部分
+å®žéªŒç›®æ ‡ï¼šé€šè¿‡å¯¹æ¯”é»˜è®¤è°ƒåº¦å™¨å’Œè‡ªå®šä¹‰è°ƒåº¦æœºåˆ¶ï¼Œåœ¨ä¸åŒ CPU 压力下评估系统性能表现
+
+1. 对照组实验
+ - 实验设计基于默认调度器,使用 stress-ng æ–½åŠ ä¸åŒçº§åˆ«çš„ CPU 压力,测试时间为 30 ç§’
+ - 测试数æ®é‡ç‚¹ï¼šrunqlat æ•°æ®ï¼Œåæ˜ ç³»ç»Ÿçš„è°ƒåº¦åŽ‹åŠ›ï¼Œä»»åŠ¡è°ƒåº¦ç‰å¾…时间越长,调度压力越高,系统å¯èƒ½å¤„于过载状æ€
+
+
+一般负载下,创建 10 个 CPU è´Ÿè½½ä»»åŠ¡ï¼Œæ¯æ¬¡æµ‹è¯•è¿è¡Œæ—¶é—´ä¸º 30 ç§’ï¼Œç¡®ä¿æ•°æ®é‡‡æ ·ç¨³å®šï¼Œæœ€ç»ˆçš„æ•°æ®åœ¨[这里](Document/sched_ext/normal_cpu10.txt),视频是“normal_cpu10"
+```
+stress-ng --cpu 10 --timeout 30
+```
+
+
+
+
+对于输出数æ®ï¼Œé‡ç‚¹å…³æ³¨æœ€åŽå‡ 行
+```
+12,2991,7114,11747,1815,1193,2024,10096
+12,3004,7212,11931,1837,1206,2045,10218
+12,3012,7239,12077,1845,1212,2048,10229
+12,3071,7361,12436,1861,1232,2078,10282
+12,3120,7424,12662,1871,1235,2088,10296
+```
+
+之åŽå¢žåŠ åŽ‹åŠ›ï¼Œåˆ›å»º 30 个 CPU 负载任务,数æ®åœ¨[这里](Document/sched_ext/normal_cpu30.txt),视频是"normal_cpu30"
+```
+1,32921,31062,6038,2919,3357,7310,149492
+1,33031,31206,6416,2966,3366,7319,149506
+1,33196,31480,7059,3037,3448,7406,149675
+1,33230,31540,7433,3077,3455,7411,149689
+1,33391,31688,7901,3099,3464,7426,149703
+```
+2. 实验组部分
+ - 开始进行scx-nestçš„éƒ¨åˆ†ï¼ŒåŒæ ·ä½¿ç”¨ stress-ng æ–½åŠ ä¸åŒçº§åˆ«çš„ CPU 压力,测试时间为 30 ç§’
+
+
+创建 10 个 CPU è´Ÿè½½ä»»åŠ¡ï¼Œæ¯æ¬¡æµ‹è¯•è¿è¡Œæ—¶é—´ä¸º 30 秒,情况[如下](Document/sched_ext/scx_cpu10.txt),视频是â€scx_cpu10"
+```
+0,642,6251,13554,9713,2194,1287,11171
+0,651,6296,13793,10115,2209,1295,11246
+0,658,6346,13889,10314,2213,1301,11289
+0,663,6389,13956,10490,2235,1309,11330
+0,670,6438,14097,10673,2262,1317,11388
+0,677,6495,14166,10890,2298,1335,11435
+```
+
+30 个 CPU 负载任务的情况[如下](Document/sched_ext/scx_cpu30.txt),视频是“scx_cpu30â€
+```
+1,329,3762,9742,10231,13541,7742,30089
+1,335,3856,9914,10523,13958,7897,30619
+1,337,3909,10022,10668,14164,8004,31126
+1,339,3964,10132,10792,14401,8160,31647
+1,355,4137,10746,11094,14576,8255,31844
+1,365,4213,11115,11397,14638,8285,31966
+1,380,4505,11867,11972,14822,8483,32087
+```
+
+3. 实验结果
+对比ä¸ç‰åŽ‹åŠ›ä¹‹ä¸‹çš„è°ƒåº¦æƒ…å†µ
+```
+ 1us,4us,16us,64us,256us,1ms,4ms,4ms+
+默认 12,3120,7424,12662,1871,1235,2088,10296
+nest 0,677,6495,14166,10890,2298,1335,11435
+```
+直接从数æ®ä¸Šæ¥çœ‹çš„è¯ï¼Œscx-nest在ä¸ç‰åŽ‹åŠ›ä¹‹ä¸‹ï¼Œæ•´ä½“è¡¨çŽ°ä¸å¦‚默认的CFS调度器,但值得注æ„的是,
+对这两行按行统计和
+- 12+3120+7424+12662+1871+1235+2088+10296=38508
+- 0+677+6495+14166+10890+2298+1335+11435=46706
+
+考虑到我的设计æ€è·¯ï¼Œå¯¹äºŽâ€œå任务â€å°½å¯èƒ½å»¶è¿Ÿè°ƒåº¦åŒæ—¶æ—¶é—´ç‰‡åˆ†é…å‡åŠï¼Œä½¿å¾—调度器的整体æµé‡å˜å¤§ï¼Œ
+而统计runqlat时候是把“å任务â€çš„调度延迟算进去的,所以整体上æ¥çœ‹scx-nest仿˜¯æœ‰ä¼˜åŠ¿çš„
+
+而对于高压情况,上é¢çš„ä¼˜åŠ¿å°±æ›´åŠ æ˜Žæ˜¾äº†
+```
+ 1us,4us,16us,64us,256us,1ms,4ms,4ms+
+默认 1,33391,31688,7901,3099,3464,7426,149703
+nest 1,380,4505,11867,11972,14822,8483,32087
+```
+å†ä¸åŠ åŒºåˆ†çš„é»˜è®¤è°ƒåº¦ä¸‹ï¼Œåœ¨4ms延迟之上的任务到了近15w,而有了区分的调度å¯ä»¥ä½¿å¾—4mså»¶è¿Ÿä¹‹ä¸Šçš„ä»»åŠ¡åªæœ‰3.2w,
+å¯ä»¥çœ‹åˆ°éšç€åŽ‹åŠ›ä¸Šå‡åˆ°3å€
+
+4ms延迟之上的任务对于nestæ¥è¯´å³ä¾¿ç»´æŒçº¿æ€§å¢žé•¿ï¼Œè€Œå¯¹äºŽé»˜è®¤çš„CFS调度器,
+增长形势å¯èƒ½æ˜¯æŒ‡æ•°å¢žé•¿ï¼Œæ‰€ä»¥åŸºäºŽç›‘控的scx-nest调度器明显由于默认的调度器,
+对异常任务实现了自动化抑制
+
+## 坿’拔的调度器
+å¯ä»¥çœ‹åˆ°åˆšæ‰çš„map䏿œ‰comm_ignore_mapå’Œcomm_attention_map,这两个mapåˆ†åˆ«æ˜¯è¿™æ ·å¯¹åº”çš„
+- comm_ignore_map —— ignore.txt
+- comm_attention_map —— attention.txt
+
+分别是仓库ä¸çš„两个文件,打开ignore.txtå¯ä»¥çœ‹åˆ°
+```
+code
+Compositor
+gnome-shell
+scx_spy
+cpptools
+llvmpipe-0
+kworker
+```
+å¯ä»¥ç†è§£ä¸ºç”¨æˆ·æ€å®šä¹‰çš„“白åå•â€ï¼Œå¯¹äºŽè¿™äº›åå—的任务å¯ä»¥æ”¾ä»»å®ƒä»¬å 用cpu
+
+åŒæ ·çš„attention.txt 则是“黑åå•â€ï¼Œå¯¹äºŽå…¶ä¸çš„ä»»åŠ¡ï¼Œåªæœ‰æœ‰äº†å°±ç›´æŽ¥æŠ‘制
+
+有了这俩个文件,用户å¯ä»¥éžå¸¸æ–¹ä¾¿è‡ªå®šä¹‰å¯¹ç‰¹å®šä»»åŠ¡çš„è°ƒåº¦ï¼ŒåŒæ—¶æˆ‘的程åºä¹Ÿå¯ä»¥ä½œä¸ºä¸€ä¸ªæ’件,
+å¦‚æžœä½ æœ‰æ›´åŠ é«˜çº§çš„ä»»åŠ¡åˆ’åˆ†ç–略,å¯ä»¥æŠŠåˆ’分的任务放到这两个文件ä¸ï¼Œè¿™ä¸ªè°ƒåº¦å™¨å¯ä»¥å¸®ä½ æŠ‘åˆ¶æˆ–ä¿æŒè¿™äº›ä»»åŠ¡çš„è¿è¡Œ
+
+具体实验在链接的“attention_mapâ€
+
+å¯ä»¥çœ‹åˆ°çŽ°åœ¨attention.txtä¸åŠ å…¥stress-ngçš„åå—
+
+
+
+
+为了ä¿è¯å®žéªŒçš„å…¬æ£æ€§ï¼ŒæŠŠåŽç»é«˜cpuå 用率任务判æ–的逻辑注释了,然åŽç¼–译,最高压力下测试
+
+
+
+
+
+
+å¯ä»¥çœ‹åˆ°ï¼Œæ²¡äº†ä¸€äº›åˆ«çš„干扰,åªé’ˆå¯¹stress-ng的抑制效果éžå¸¸å¥½ï¼Œæœ‰äº†æœ€ç²¾ç¡®çš„定ä½ï¼Œæ‰€ä»¥å»¶è¿Ÿæƒ…况是最好的
+
+所以å³ä¾¿ä½œä¸ºä¸€ä¸ªå·¥å…·æ¥çœ‹ï¼Œè¿™ä¸ªæ”¹è¿›åŽçš„调度器有很高的实用价值
\ No newline at end of file
diff --git a/Document/task_kmem_count.png b/Document/task_kmem_count.png
new file mode 100644
index 0000000..935498e
Binary files /dev/null and b/Document/task_kmem_count.png differ
diff --git a/Document/task_slab_count.png b/Document/task_slab_count.png
new file mode 100644
index 0000000..b79ce2b
Binary files /dev/null and b/Document/task_slab_count.png differ
diff --git a/Document/task_slab_count_xorg.png b/Document/task_slab_count_xorg.png
new file mode 100644
index 0000000..13cfda4
Binary files /dev/null and b/Document/task_slab_count_xorg.png differ
diff --git a/Document/task_total_cpu.png b/Document/task_total_cpu.png
new file mode 100644
index 0000000..16414ae
Binary files /dev/null and b/Document/task_total_cpu.png differ
diff --git a/Document/task_vmem_count.png b/Document/task_vmem_count.png
new file mode 100644
index 0000000..1c24ad0
Binary files /dev/null and b/Document/task_vmem_count.png differ
diff --git "a/Document/\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/Document/\347\216\257\345\242\203\346\220\255\345\273\272.md"
new file mode 100644
index 0000000..7aee0d5
--- /dev/null
+++ "b/Document/\347\216\257\345\242\203\346\220\255\345\273\272.md"
@@ -0,0 +1,243 @@
+## 环境æå»º
+本项目å¯ä»¥ä»Žä»“库ä¸çœ‹åˆ°ï¼Œåˆ†åˆ«æœ‰mainå’Œscx分支,建立在两个环境ä¸
+
+### main分支
+main分支是最开始在实机上写的代ç ,具体版本和环境é…置如下
+1. 系统åŠå†…æ ¸ç‰ˆæœ¬
+```shell
+root@ne0-System:~# lsb_release -a
+No LSB modules are available.
+Distributor ID: Ubuntu
+Description: Ubuntu 22.04.5 LTS
+Release: 22.04
+Codename: jammy
+```
+```shell
+root@ne0-System:~# uname -r
+6.8.0-48-generic
+```
+2. LLVM工具链和rust工具链
+```shell
+root@ne0-System:~# clang --version
+Ubuntu clang version 14.0.0-1ubuntu1.1
+Target: x86_64-pc-linux-gnu
+Thread model: posix
+InstalledDir: /usr/bin
+```
+```shell
+(base) ne0@ne0-System:~$ rustup show
+Default host: x86_64-unknown-linux-gnu
+rustup home: /home/ne0/.rustup
+
+stable-x86_64-unknown-linux-gnu (default)
+rustc 1.79.0 (129f3b996 2024-06-10)
+```
+```shell
+(base) ne0@ne0-System:~$ cargo --version
+cargo 1.79.0 (ffa9cf99a 2024-06-03)
+```
+
+3. 环境é…ç½®
+
+这里åªè¯´ä¸€ä¸‹é‡è¦çš„å‡ ä¸ªæºæ–‡ä»¶çš„安装,具体放的路径å¯ä»¥ç›´æŽ¥åœ¨Makefile里看到,如果想改直接改就行了
+- libbpf安装
+ - 建议从æºç 编译安装,https://github.com/libbpf/libbpf.git
+```shell
+$ cd src
+$ make
+```
+- bpftool安装
+ - åŒæ ·å»ºè®®ä»Žæºç 编译安装,https://github.com/libbpf/bpftool.git
+ - 具体构建安装的æµç¨‹åœ¨å®˜ç½‘这里都有
+
+- blazesym安装
+ - 从官方编译安装,https://github.com/libbpf/blazesym.git
+```shell
+git clone https://github.com/libbpf/blazesym.git
+cd blazesym
+cargo build --release
+```
+- 之åŽåˆ° blazesym/capi文件夹下
+```shell
+cargo build --release
+```
+- 最终能在target/release文件夹下看到这些就算æˆåŠŸ
+```shell
+(base) ne0@ne0-System:~/sys_competition/start/blazesym/target/release$ ls
+build examples libblazesym_c.a libblazesym_c.rlib libblazesym.d
+deps incremental libblazesym_c.d libblazesym_c.so libblazesym.rlib
+```
+
+
+### scx分支
+scxåˆ†æ”¯æ˜¯æ‰æœ‰sched_ext,由于sched_ext是9æœˆä»½åˆšå‡ºçš„ï¼Œåªæœ‰æœ€æ–°çš„å†…æ ¸æ‰å…·å¤‡è¿™ä¸ªåŠŸèƒ½ï¼Œæ‰€ä»¥æˆ‘æ˜¯åœ¨è™šæ‹Ÿæœºä¸Šï¼Œ
+用的6.12çš„å†…æ ¸å†™çš„ï¼Œä¸ºäº†ä¸å½±å“实机的其他事情,sched_ext都是在虚拟机上跑的,环境é…置多了一些其他æ¥éª¤
+
+- 首先è¦è¯´æ˜Žçš„æ˜¯ï¼Œsched_extè¿™ä¸ªåŠŸèƒ½å…·ä½“ä½ çš„å†…æ ¸æ”¯ä¸æ”¯æŒï¼Œå¯ä»¥è¿™æ ·æ£€æŸ¥
+```shell
+root@ne0-System:~# zgrep -E "CONFIG_BPF|CONFIG_BPF_EVENTS|CONFIG_BPF_JIT|CONFIG_BPF_SYSCALL|CONFIG_DEBUG_INFO_BTF|CONFIG_FTRACE|CONFIG_SCHED_CLASS_EXT" /boot/config-$(uname -r)
+CONFIG_BPF=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_JIT=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+CONFIG_BPF_JIT_DEFAULT_ON=y
+CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
+# CONFIG_BPF_PRELOAD is not set
+CONFIG_BPF_LSM=y
+CONFIG_BPF_STREAM_PARSER=y
+CONFIG_DEBUG_INFO_BTF=y
+CONFIG_DEBUG_INFO_BTF_MODULES=y
+CONFIG_FTRACE=y
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_BPF_EVENTS=y
+CONFIG_BPF_KPROBE_OVERRIDE=y
+CONFIG_FTRACE_MCOUNT_RECORD=y
+CONFIG_FTRACE_MCOUNT_USE_CC=y
+# CONFIG_FTRACE_RECORD_RECURSION is not set
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_FTRACE_SORT_STARTUP_TEST is not set
+```
+- 上é¢è¾“出是我实机的输出,对于sched_ext,需è¦ä»¥ä¸‹è¿™äº›é…ç½®
+```shell
+CONFIG_BPF=y
+CONFIG_SCHED_CLASS_EXT=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_JIT=y
+CONFIG_DEBUG_INFO_BTF=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+CONFIG_BPF_JIT_DEFAULT_ON=y
+CONFIG_PAHOLE_HAS_SPLIT_BTF=y
+CONFIG_PAHOLE_HAS_BTF_TAG=y
+```
+- å¯¹äºŽæˆ‘è™šæ‹Ÿæœºçš„è¾“å‡ºï¼Œæ˜¯è¿™æ ·çš„
+```shell
+ne1@ne1-virtual-machine:~$ zgrep -E "CONFIG_BPF|CONFIG_BPF_EVENTS|CONFIG_BPF_JIT|CONFIG_BPF_SYSCALL|CONFIG_DEBUG_INFO_BTF|CONFIG_FTRACE|CONFIG_SCHED_CLASS_EXT" /boot/config-$(uname -r)
+CONFIG_BPF=y
+CONFIG_BPF_SYSCALL=y
+CONFIG_BPF_JIT=y
+CONFIG_BPF_JIT_ALWAYS_ON=y
+CONFIG_BPF_JIT_DEFAULT_ON=y
+CONFIG_BPF_UNPRIV_DEFAULT_OFF=y
+# CONFIG_BPF_PRELOAD is not set
+CONFIG_BPF_LSM=y
+CONFIG_SCHED_CLASS_EXT=y
+CONFIG_BPF_STREAM_PARSER=y
+CONFIG_DEBUG_INFO_BTF=y
+CONFIG_DEBUG_INFO_BTF_MODULES=y
+CONFIG_FTRACE=y
+CONFIG_FTRACE_SYSCALLS=y
+CONFIG_BPF_EVENTS=y
+CONFIG_BPF_KPROBE_OVERRIDE=y
+CONFIG_FTRACE_MCOUNT_RECORD=y
+CONFIG_FTRACE_MCOUNT_USE_CC=y
+```
+- ä¸‹é¢æŠŠå†…æ ¸å’Œç³»ç»Ÿç‰ˆæœ¬ï¼Œè¿˜æœ‰å·¥å…·é“¾ç‰ˆæœ¬éƒ½è¡¥å……ä¸€ä¸‹
+```shell
+ne1@ne1-virtual-machine:~$ lsb_release -a
+No LSB modules are available.
+Distributor ID: Ubuntu
+Description: Ubuntu 24.04.1 LTS
+Release: 24.04
+Codename: noble
+
+ne1@ne1-virtual-machine:~$ uname -r
+6.12.0-061200-generic
+
+ne1@ne1-virtual-machine:~$ clang --version
+Ubuntu clang version 17.0.6 (9ubuntu1)
+Target: x86_64-pc-linux-gnu
+Thread model: posix
+InstalledDir: /usr/lib/llvm-17/bin
+
+ne1@ne1-virtual-machine:~$ rustup show
+Default host: x86_64-unknown-linux-gnu
+rustup home: /home/ne1/.rustup
+
+stable-x86_64-unknown-linux-gnu (default)
+rustc 1.79.0 (129f3b996 2024-06-10)
+
+ne1@ne1-virtual-machine:~$ cargo --version
+cargo 1.75.0
+```
+
+1. 6.12å†…æ ¸çš„é…置和安装
+- sched_ext官方的教程是没用的,官方给的教程ä¸
+```shell
+$ sudo do-release-upgrade -d
+$ sudo add-apt-repository -y --enable-source ppa:canonical-kernel-team/unstable
+$ sudo sed -i "s/^Suites: .*/Suites: plucky/" \
+ /etc/apt/sources.list.d/canonical-kernel-team-ubuntu-unstable-plucky.sources
+$ sudo apt install -y linux-generic-wip
+
+# 到了最åŽè¿™æ¥
+ne1@ne1-virtual-machine:~$ sudo apt install -y linux-generic-wip
+[sudo] password for ne1:
+æ£åœ¨è¯»å–软件包列表... 完æˆ
+æ£åœ¨åˆ†æžè½¯ä»¶åŒ…çš„ä¾èµ–å…³ç³»æ ‘... 完æˆ
+æ£åœ¨è¯»å–状æ€ä¿¡æ¯... 完æˆ
+E: æ— æ³•å®šä½è½¯ä»¶åŒ… linux-generic-wip
+```
+- 去官网 https://launchpad.net/~canonical-kernel-team/+archive/ubuntu/unstable 也找ä¸åˆ°ç›¸å…³çš„
+- 所以我之åŽå…·ä½“æ˜¯è¿™æ ·å®‰è£…çš„
+- 首先去官网下载6.12版本的 https://kernel.ubuntu.com/mainline/v6.12/ ,将
+ linux-headers-6.12.0-061200-genericã€linux-image-unsigned-6.12.0-061200-genericã€linux-modules-6.12.0-061200-genericã€
+ linux-headers-6.12.0-061200这些都安装到本地,之åŽ
+```shell
+sudo dpkg -i linux-headers-6.12.0-061200*.deb linux-image-unsigned-6.12.0-061200-generic_*.deb linux-modules-6.12.0-061200-generic_*.deb
+```
+- 安装完æˆä¹‹åŽé‡å¯
+```shell
+sudo update-grub
+sudo reboot
+```
+- é‡å¯ä¹‹åŽçœ‹å†…æ ¸ç‰ˆæœ¬ï¼Œæ²¡é—®é¢˜çš„è¯å°±æ˜¯æˆ‘这个版本
+```shell
+ne1@ne1-virtual-machine:~$ uname -r
+6.12.0-061200-generic
+```
+
+2. vmlinux.h的创建
+- 对于6.12å†…æ ¸çš„ç³»ç»Ÿï¼Œå¾—è‡ªå·±ç”Ÿæˆvmlinux
+```shell
+bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
+```
+
+3. å…¶ä»–çš„libbpfã€bpftoolä»€ä¹ˆçš„éƒ½å’Œä¸Šé¢æµç¨‹ä¸€æ ·äº†
+
+
+æ— è®ºæ˜¯åªæœ‰ç³»ç»Ÿç›‘测的os_spy或是完整功能的scx_spy,如果编译æˆåŠŸçš„è¯éƒ½åº”该如下
+```shell
+ ______ __ _ __ ___
+ / ____/______ _______/ /_ (_)____ / |/ /_ ______ _____
+ / / / ___/ / / / ___/ __ \/ / ___/ / /|_/ / / / / __ / __ \
+/ /___/ / / /_/ / /__/ / / / / /__ / / / / /_/ / /_/ / /_/ /
+\____/_/ \__, /\___/_/ /_/_/\___/____/_/ /_/\__, /\__, /\____/
+ /____/ /_____/ /____//____/
+Successful to compile os_spy tools:
+Please start your use ~
+```
+
+å¦‚æžœæœ‰äº†è¿™ä¸ªæ ‡å¿—è¯æ˜Žä½ 编译æˆåŠŸäº†ï¼Œcongratulations :)
+
+
+## 视频演示
+在我分æžçš„æ–‡ä»¶å¤¹ä¸ï¼Œæœ‰ä¸ªâ€æ•´ä½“æµç¨‹â€œï¼Œæœ‰å¿…è¦æé†’çš„æ˜¯ï¼Œåœ¨æˆ‘å†™åˆ†æžæ–‡æ¡£æ—¶å€™çš„æ•°æ®æ¥æºçš„å®žæœºï¼Œå› ä¸ºè™šæ‹Ÿæœºå 用资æºè¿‡å¤šï¼Œ
+我笔记本的电脑é…置还è¦å†™æ–‡æ¡£ä¼šå¾ˆä¸æ–¹ä¾¿ï¼Œè€Œå½•视频的都是æºäºŽè™šæ‹Ÿæœºï¼Œå› 为虚拟机上æ‰èƒ½å±•示完整功能,
+所以之åŽå„个监控模å—的介ç»éƒ¨åˆ†ç”¨çš„æ˜¯å®žæœºï¼Œè€Œå®žéªŒéƒ¨åˆ†ç”¨çš„æ˜¯è™šæ‹Ÿæœº
+
+å…ˆæŠŠè¿‡åŽ»çš„æµ‹è¯•æ•°æ®æ¸…空,然åŽé‡æ–°ç¼–译展现整个æµç¨‹
+
+下é¢è¿™æ ·å°±æ˜¯ç¼–译æˆåŠŸ
+
+
+
+ç„¶åŽå…ˆæ•´ä½“演示一下
+```shell
+./scx_spy -c -m -I -n -e -v
+```
+
+
+
+完整监视情况下的文件
+
+
diff --git a/Makefile b/Makefile
index 8427fe6..e667893 100644
--- a/Makefile
+++ b/Makefile
@@ -1,204 +1,3 @@
-## Copyright 2023 The LMP Authors.
-##
-## Licensed under the Apache License, Version 2.0 (the "License");
-## you may not use this file except in compliance with the License.
-## You may obtain a copy of the License at
-##
-## https://github.com/linuxkerneltravel/lmp/blob/develop/LICENSE
-##
-## Unless required by applicable law or agreed to in writing, software
-## distributed under the License is distributed on an "AS IS" BASIS,
-## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-## See the License for the specific language governing permissions and
-## limitations under the License.
-##
-## author: zhangziheng0525@163.com
-##
-## compile the current folder code
-#
-## SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
-#OUTPUT := .output
-#CLANG ?= clang
-#LIBBPF_SRC := $(abspath ../libbpf/src)
-#BPFTOOL_SRC := $(abspath ../bpftool/src)
-#LIBBPF_OBJ := $(abspath $(OUTPUT)/libbpf.a)
-#BPFTOOL_OUTPUT ?= $(abspath $(OUTPUT)/bpftool)
-#BPFTOOL ?= $(BPFTOOL_OUTPUT)/bootstrap/bpftool
-#LIBBLAZESYM_SRC := $(abspath ../blazesym/)
-#LIBBLAZESYM_INC := $(abspath $(LIBBLAZESYM_SRC)/include)
-#LIBBLAZESYM_OBJ := $(abspath $(OUTPUT)/libblazesym.a)
-#ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \
-# | sed 's/arm.*/arm/' \
-# | sed 's/aarch64/arm64/' \
-# | sed 's/ppc64le/powerpc/' \
-# | sed 's/mips.*/mips/' \
-# | sed 's/riscv64/riscv/' \
-# | sed 's/loongarch64/loongarch/')
-#VMLINUX := ../vmlinux/$(ARCH)/vmlinux.h
-## Use our own libbpf API headers and Linux UAPI headers distributed with
-## libbpf to avoid dependency on system-wide headers, which could be missing or
-## outdated
-#INCLUDES := -I$(OUTPUT) -I../../../libbpf/include/uapi -I$(dir $(VMLINUX)) -I$(LIBBLAZESYM_INC) -I./include
-#CFLAGS := -g -Wall
-#ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS)
-#
-#APPS =cpu_stats
-#TARGETS=sys_spy
-#CONTROLLER := cpu_controller
-#
-#SRC_DIR = ./include
-#
-## Get Clang's default includes on this system. We'll explicitly add these dirs
-## to the includes list when compiling with `-target bpf` because otherwise some
-## architecture-specific dirs will be "missing" on some architectures/distros -
-## headers such as asm/types.h, asm/byteorder.h, asm/socket.h, asm/sockios.h,
-## sys/cdefs.h etc. might be missing.
-##
-## Use '-idirafter': Don't interfere with include mechanics except where the
-## build would have failed anyways.
-#CLANG_BPF_SYS_INCLUDES ?= $(shell $(CLANG) -v -E - &1 \
-# | sed -n '/<...> search starts here:/,/End of search list./{ s| \(/.*\)|-idirafter \1|p }')
-#
-#ifeq ($(V),1)
-# Q =
-# msg =
-#else
-# Q = @
-# msg = @printf ' %-8s %s%s\n' \
-# "$(1)" \
-# "$(patsubst $(abspath $(OUTPUT))/%,%,$(2))" \
-# "$(if $(3), $(3))";
-# MAKEFLAGS += --no-print-directory
-#endif
-#
-#define allow-override
-# $(if $(or $(findstring environment,$(origin $(1))),\
-# $(findstring command line,$(origin $(1)))),,\
-# $(eval $(1) = $(2)))
-#endef
-#
-#$(call allow-override,CC,$(CROSS_COMPILE)cc)
-#$(call allow-override,LD,$(CROSS_COMPILE)ld)
-#
-#.PHONY: all
-#all: $(CONTROLLER) $(TARGETS)
-#
-#.PHONY: clean
-#clean:
-# $(call msg,CLEAN)
-# $(Q)rm -rf $(OUTPUT) $(TARGETS) $(CONTROLLER)
-#
-#$(OUTPUT) $(OUTPUT)/libbpf $(BPFTOOL_OUTPUT):
-# $(call msg,MKDIR,$@)
-# $(Q)mkdir -p $@
-#
-## Build libbpf
-#$(LIBBPF_OBJ): $(wildcard $(LIBBPF_SRC)/*.[ch] $(LIBBPF_SRC)/Makefile) | $(OUTPUT)/libbpf
-# $(call msg,LIB,$@)
-# $(Q)$(MAKE) -C $(LIBBPF_SRC) BUILD_STATIC_ONLY=1 \
-# OBJDIR=$(dir $@)/libbpf DESTDIR=$(dir $@) \
-# INCLUDEDIR= LIBDIR= UAPIDIR= \
-# install
-#
-## Build bpftool
-#$(BPFTOOL): | $(BPFTOOL_OUTPUT)
-# $(call msg,BPFTOOL,$@)
-# $(Q)$(MAKE) ARCH= CROSS_COMPILE= OUTPUT=$(BPFTOOL_OUTPUT)/ -C $(BPFTOOL_SRC) bootstrap
-#
-#
-#$(LIBBLAZESYM_SRC)/target/release/libblazesym.a::
-# $(Q)cd $(LIBBLAZESYM_SRC) && $(CARGO) build --release
-#
-#$(LIBBLAZESYM_OBJ): $(LIBBLAZESYM_SRC)/target/release/libblazesym.a | $(OUTPUT)
-# $(call msg,LIB, $@)
-# $(Q)cp $(LIBBLAZESYM_SRC)/target/release/libblazesym.a $@
-#
-## Build BPF code
-#$(OUTPUT)/%.bpf.o: bpf/%.bpf.c $(LIBBPF_OBJ) $(wildcard %.h) $(VMLINUX) | $(OUTPUT) $(BPFTOOL)
-# $(call msg,BPF,$@)
-# $(Q)$(CLANG) -g -O2 -target bpf -D__TARGET_ARCH_$(ARCH) \
-# $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \
-# -c $(filter %.c,$^) -o $(patsubst %.bpf.o,%.tmp.bpf.o,$@)
-# $(Q)$(BPFTOOL) gen object $@ $(patsubst %.bpf.o,%.tmp.bpf.o,$@)
-#
-## Generate BPF skeletons
-#.PHONY: $(APPS)
-#$(APPS): %: $(OUTPUT)/%.bpf.o | $(OUTPUT) $(BPFTOOL)
-# $(call msg,GEN-SKEL,$@)
-# $(Q)$(BPFTOOL) gen skeleton $< > $(OUTPUT)/$@.skel.h
-#
-## Build user-space code
-#$(OUTPUT)/%.o: $(SRC_DIR)/%.c | $(OUTPUT)
-# $(call msg,CC,$@)
-# $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
-#
-#$(OUTPUT)/%.o: $(CONTROLLER).c | $(OUTPUT)
-# $(call msg,CC,$@)
-# $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
-#
-#$(OUTPUT)/$(TARGETS).o: $(TARGETS).c $(APPS) | $(OUTPUT)
-# $(call msg,CC,$@)
-# $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@
-#
-## Build application binary
-#$(CONTROLLER): %: $(OUTPUT)/%.o $(COMMON_OBJ) $(LIBBPF_OBJ) | $(OUTPUT)
-# $(call msg,BINARY,$@)
-# $(Q)$(CC) $^ $(ALL_LDFLAGS) -lstdc++ -lelf -lz -o $@
-#
-#$(TARGETS): %: $(OUTPUT)/%.o $(COMMON_OBJ) $(LIBBPF_OBJ) | $(OUTPUT)
-# $(call msg,BINARY,$@)
-# $(Q)$(CC) $(CFLAGS) $^ $(ALL_LDFLAGS) -lstdc++ -lelf -lz -o $@
-#
-#SUCCESS_MESSAGE:
-# @echo "\e[38;2;255;0;0m __ __ \e[0m"
-# @echo "\e[38;2;255;128;0m _________ __ __ _ ______ _/ /______/ /_ ___ _____\e[0m"
-# @echo "\e[38;2;255;255;0m / ___/ __ \/ / / / | | /| / / __ / __/ ___/ __ \/ _ \/ ___/\e[0m"
-# @echo "\e[38;2;128;255;0m/ /__/ /_/ / /_/ / | |/ |/ / /_/ / /_/ /__/ / / / __/ / \e[0m"
-# @echo "\e[38;2;0;255;0m\___/ .___/\__,_/ |__/|__/\__,_/\__/\___/_/ /_/\___/_/ \e[0m"
-# @echo "\e[38;2;0;255;128m /_/ \e[0m"
-# @echo "\e[38;2;0;255;255mSuccessful to compile cpu_watcher tools: \e[0m"
-# @echo "\e[38;2;0;255;255mPlease start your use ~ \e[0m"
-#
-#
-#all: $(TARGETS) SUCCESS_MESSAGE
-#
-#
-## delete failed targets
-#.DELETE_ON_ERROR:
-#
-## keep intermediate (.skel.h, .bpf.o, etc) targets
-#.SECONDARY:
-#
-#.PHONY: generate_cmake
-#generate_cmake:
-# @echo "cmake_minimum_required(VERSION 3.10)" > CMakeLists.txt
-# @echo "project(cpu_watcher VERSION 1.0)" >> CMakeLists.txt
-# @echo "set(CMAKE_C_STANDARD 11)" >> CMakeLists.txt
-# @echo "set(CMAKE_C_FLAGS \"$(CFLAGS)\")" >> CMakeLists.txt
-# @echo "" >> CMakeLists.txt
-#
-# # 包å«ç›®å½•
-# @echo "include_directories(" >> CMakeLists.txt
-# @for dir in $(INCLUDES); do \
-# echo " $$dir" >> CMakeLists.txt; \
-# done
-# @echo ")" >> CMakeLists.txt
-# @echo "" >> CMakeLists.txt
-#
-# # æºæ–‡ä»¶
-# @echo "set(SOURCE_FILES" >> CMakeLists.txt
-# @for src in $(wildcard *.c src/*.c); do \
-# echo " $$src" >> CMakeLists.txt; \
-# done
-# @echo ")" >> CMakeLists.txt
-# @echo "" >> CMakeLists.txt
-#
-# # 坿‰§è¡Œæ–‡ä»¶å’Œé“¾æŽ¥åº“
-# @echo "add_executable(cpu_watcher \$$\{SOURCE_FILES\})" >> CMakeLists.txt
-# @echo "target_link_libraries(cpu_watcher ${LIBS} -lelf -lz -lstdc++)" >> CMakeLists.txt
-# @echo "CMakeLists.txt generated successfully."
-
-
OUTPUT := .output
CLANG ?= clang
LIBBPF_SRC := $(abspath ../libbpf/src)
@@ -218,12 +17,12 @@ ARCH ?= $(shell uname -m | sed 's/x86_64/x86/' \
| sed 's/loongarch64/loongarch/')
VMLINUX := ../vmlinux/$(ARCH)/vmlinux.h
-INCLUDES := -I$(OUTPUT) -I../../../libbpf/include/uapi -I$(dir $(VMLINUX)) -I$(LIBBLAZESYM_INC) -I./include
+INCLUDES := -I$(OUTPUT) -I../../../libbpf/include/uapi -I$(dir $(VMLINUX)) -I$(LIBBLAZESYM_INC) -I./include -Iinclude/
CFLAGS := -g -Wall
ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS)
-APPS = cpu_stats mm_stats mm_leak io_stats net_stats
-TARGETS = os_spy
+APPS = scx_nest
+TARGETS = scx_plug
CONTROLLER := cpu_controller
SRC_DIR = ./include
@@ -340,7 +139,7 @@ SUCCESS_MESSAGE:
@echo "\033[38;2;128;255;0m/ /___/ / / /_/ / /__/ / / / / /__ / / / / /_/ / /_/ / /_/ / \033[0m"
@echo "\033[38;2;0;255;0m\____/_/ \__, /\___/_/ /_/_/\___/____/_/ /_/\__, /\__, /\____/ \033[0m"
@echo "\033[38;2;0;255;128m /____/ /_____/ /____//____/ \033[0m"
- @echo "\033[38;2;0;255;255mSuccessful to compile cpu_watcher tools: \033[0m"
+ @echo "\033[38;2;0;255;255mSuccessful to compile scx_spy tools: \033[0m"
@echo "\033[38;2;0;255;255mPlease start your use ~ \033[0m"
# delete failed targets
diff --git a/README.md b/README.md
index eeb976e..4385b17 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,59 @@
-到最åŽåœ¨å†™è¯¦ç»†æ–‡æ¡£
+## scx-plug å¯çƒæ’拔的调度器
+关于这部分程åºçš„åŽŸç†æ€§è§£æžè¯·çœ‹ https://gitlab.eduxiji.net/T202410701994230/project2608126-270009 çš„scx分支,
+在里é¢çš„ scx-nest部分有过详细的解æžï¼Œè¿™é‡Œåªä»‹ç»scx-plug用法
+
+scx-plug部分的环境é…置和scx分支的环境é…置相åŒ
+
+本项目调度器的架构å‚考自 https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/45-scx-nest ,
+整体逻辑设计和本项目的scx分支设计差ä¸å¤šï¼ŒåŒæ—¶åœ¨æ¤åŸºç¡€ä¸ŠåŠ å…¥äº†ä¸€äº›å’Œç”¨æˆ·æ€äº¤äº’的部分
+
+```
+concerned/ # 关注的文件目录
+├── comm_attention.txt # éœ€è¦æŠ‘åˆ¶çš„ä»»åŠ¡å
+├── comm_ignore.txt # 需è¦ä¿æŠ¤çš„任务å,é¿å…å—ç–略影å“
+├── id_attention.txt # éœ€è¦æŠ‘åˆ¶çš„ä»»åŠ¡idï¼Œæ ¹æ®è®¾ç½®å¯åŒæ—¶è¡¨ç¤ºpidå’Œtgid
+└── id_ignore.txt # 需è¦ä¿æŠ¤çš„任务idï¼Œæ ¹æ®è®¾ç½®å¯åŒæ—¶è¡¨ç¤ºpidå’Œtgid
+```
+支æŒåœ¨è°ƒåº¦å™¨è¿è¡Œä¹‹åŽå†™å…¥ï¼Œåœ¨è°ƒåº¦å™¨è¿è¡Œå…¶é—´ï¼Œå¯ä»¥åŒæ—¶è¿è¡Œä»»ä½•其他系统监测程åºï¼ŒæŠŠé—®é¢˜çº¿ç¨‹çš„åå—æˆ–id写入上述文件,
+这个scx-plugå¯ä»¥è§†ä¸ºä¸€ä¸ªå³æ’å³ç”¨çš„æ’ä»¶
+
+## 基于æ¤çš„二次开å‘
+在主程åºä¸ï¼Œæˆ‘留出了一个部分方便需è¦çš„人æ¥è¿›è¡ŒäºŒæ¬¡å¼€å‘,在`scx_plug.c`ä¸ï¼Œåœ¨`static int attach_scx_skel()`部分,
+å¯ä»¥çœ‹åˆ°æˆ‘注释了一部分示例的代ç ,
+```c
+ // 下é¢è¿™é‡Œæ˜¯æ¼”示,对于别的满足filter_inner_map æ ¼å¼çš„map都能放入fliter_map,
+ // ä½ å¯ä»¥å¾ˆè½»æ¾çš„æŠŠä½ 的代ç èžåˆåœ¨æˆ‘这里,把è¦å¤„ç†çš„pidæ•´åˆæ•´ä¸ªæˆ‘è¿™ä¸ªæ ¼å¼çš„map,然åŽåƒä¸‹é¢è¿™æ ·ä¼ è¿›æ¥
+
+ // struct filter_inner_map {
+ // __uint(type, BPF_MAP_TYPE_HASH);
+ // __uint(max_entries, 102400);
+ // __type(key, u32);
+ // __type(value, u32);
+ // } template_map SEC(".maps");
+
+ // int cpu_fd = bpf_map__fd(cpu_skel->maps.thread_occupied_map);
+ // if(cpu_fd < 0){
+ // fprintf(stderr, "Failed to get thread_occupied_map map fd\n");
+ // return -1;
+ // }
+ // int scx_fd;
+ // struct bpf_map *map = bpf_object__find_map_by_name(scx_skel->obj, "fliter_map");
+ // if (!map) {
+ // fprintf(stderr, "Failed to find fliter_map\n");
+ // return -1;
+ // }
+ // scx_fd = bpf_map__fd(map);
+ // if(scx_fd < 0){
+ // fprintf(stderr, "Failed to get fliter_map fd\n");
+ // return -1;
+ // }
+
+ // int ret = bpf_map_update_elem(scx_fd, &zero, &cpu_fd, BPF_ANY);
+ // if(ret < 0){
+ // fprintf(stderr, "Failed to update cpu_filter_ids map\n");
+ // return -1;
+ // }
+```
+对于任何满足filter_inner_map类型的ebpf_map,å¯ä»¥ç›´æŽ¥æ’入到我预留好的fliter_mapä¸ï¼Œå®žçŽ°è‡ªåŠ¨åŒ–çš„ç›‘æŽ§æŠ‘åˆ¶ï¼Œ
+æ’入方å¼å°±åœ¨ä¸Šé¢çš„示例ä¸
+
diff --git a/bpf/cpu_stats.bpf.c b/bpf/cpu_stats.bpf.c
deleted file mode 100644
index f61c7b0..0000000
--- a/bpf/cpu_stats.bpf.c
+++ /dev/null
@@ -1,1243 +0,0 @@
-//
-// Created by ne0 on 24-10-30.
-//
-#include "vmlinux.h"
-#include
-#include
-#include
-#include"cpu_event.h"
-
-
-
-char LICENSE[] SEC("license") = "Dual BSD/GPL";
-
-#define HALF_SECOND (500 * MSEC)
-
-const u32 zero = 0;
-const u32 one = 1;
-
-static volatile bool init_cpus_num = false;
-static volatile u32 nr_cpus;
-
-struct cpu_usage_times{
- u64 last_idle_time;//åªè®°å½•cpu上一次闲置的时间
- u64 last_softirq_time;
- u64 last_irq_time;
- u64 last_clear_time;
-
- u64 usr_times;
- u64 kernel_times;
- u64 idle_times;
- u64 io_wait_times;
- u64 irq_times;
- u64 softirq_times;
-};
-
-struct cpu_idle_args{
- unsigned short common_type; // offset: 0, size: 2
- unsigned char common_flags; // offset: 2, size: 1
- unsigned char common_preempt_count; // offset: 3, size: 1
- int common_pid; // offset: 4, size: 4
- u32 state; // offset: 8, size: 4
- u32 cpu_id; // offset: 12, size: 4
-};
-
-
-
-//static struct hash_table template_table;
-
-// æ ˆå›žæº¯çš„
-DEFINE_BPF_MAP(stack_traces_map,BPF_MAP_TYPE_STACK_TRACE,2048,u32,(MAX_STACK_DEPTH*sizeof(u64)));
-DEFINE_BPF_MAP(task_trace_data_map,BPF_MAP_TYPE_HASH,1024,u32,struct task_trace_event);
-
-// åˆå§‹åŒ–çš„hash_table的模æ¿ï¼Œåœ¨ç”¨æˆ·æ€å®šä¹‰
-// DEFINE_BPF_MAP(hash_table_model_map,BPF_MAP_TYPE_ARRAY,1,u32,struct hash_table);
-
-// 用æ¥ä¼ 递一些用户空间的数æ®
-DEFINE_BPF_MAP(cpu_usr_map,BPF_MAP_TYPE_ARRAY,16,u32,u32);
-
-// 统计cpu的使用状æ€çš„map
-DEFINE_BPF_MAP(cpu_usage_percent_map,BPF_MAP_TYPE_ARRAY,MAX_CPU_NR,u32,struct cpu_usage_stats);
-DEFINE_BPF_MAP(cpu_usage_times_map,BPF_MAP_TYPE_ARRAY,MAX_CPU_NR,u32,struct cpu_usage_times);
-
-// å‡ ä¸ªEMA控制å—çš„
-DEFINE_BPF_MAP(cpu_ema_ctrl_map,BPF_MAP_TYPE_ARRAY,4,u32,struct ema_para);
-
-
-// task
-DEFINE_BPF_MAP(task_cpu_usage_map,BPF_MAP_TYPE_HASH,MAX_ENTRIES,u32,struct task_cpu_usage);
-DEFINE_BPF_MAP(process_map,BPF_MAP_TYPE_HASH,MAX_PROCESS_ENTRIES,u32,struct process_struct);
-
-//DEFINE_BPF_MAP(process_kids_map,BPF_MAP_TYPE_HASH,MAX_PROCESS_ENTRIES,u32,struct hash_table);
-
-DEFINE_BPF_MAP(thread_occupied_map,BPF_MAP_TYPE_HASH,512,u32,u32);
-DEFINE_BPF_MAP(process_occupied_map,BPF_MAP_TYPE_HASH,256,u32,u32);
-//DEFINE_BPF_MAP(occupied_list,BPF_MAP_TYPE_ARRAY,2,u32,struct data_list);
-
-// 任务延迟计数统计
-// 对数增长,8个区间
-DEFINE_BPF_MAP(runqlat_map,BPF_MAP_TYPE_ARRAY,MAX_LATENCY_BUCKETS,u32,u32);
-
-// çŽ¯å½¢ç¼“å†²åŒºä¼ é€’æ•°æ®
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 256 * 1024); // 环形缓冲区大å°ä¸º 256 KB
-} cpu_usage_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 512 * 1024); // 环形缓冲区大å°ä¸º 128 KB
-} task_occupied_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 512 * 1024); // 环形缓冲区大å°ä¸º 64 KB
-} process_occupied_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 32 * 1024); // 环形缓冲区大å°ä¸º 32 KB
-} runqlat_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 512 * 1024);
-} task_backtrace_buffer SEC(".maps");
-
-static inline struct ema_para *get_ema_para(ema_get_flags flag){
- struct ema_para *para;
- para = bpf_map_lookup_elem(&cpu_ema_ctrl_map,&flag);
- if(!para)
- return NULL;
- return para;
-}
-
-// static inline struct time_window *get_latency_window(void){
-// struct time_window *window;
-// window = bpf_map_lookup_elem(&latency_window_map,&window_key);
-// if(!window)
-// return NULL;
-// return window;
-// }
-
-static struct task_info_simple init_task_info(struct task_struct *p,u32 cpu_id){
- struct task_info_simple info = {
- .comm = {},
- .pid = BPF_CORE_READ(p,pid),
- .tgid = BPF_CORE_READ(p,tgid),
- .cpu_id = cpu_id
- };
- bpf_probe_read_kernel_str(info.comm, sizeof(info.comm), BPF_CORE_READ(p, comm));
-
- return info;
-}
-
-static int perf_task_backtrace(u32 pid){
- u64 now = bpf_ktime_get_ns();
- struct task_trace_event *task;
- if(pid == 0)
- return 0;
- task = bpf_map_lookup_elem(&task_trace_data_map,&pid);
- if(!task)
- return 0;
-
- struct task_trace_event *buff = bpf_ringbuf_reserve(&task_backtrace_buffer,sizeof(struct task_trace_event),0);
- if(!buff){
- bpf_printk("backtrace buff allocate failed\n");
- return 0;
- }
- memset(buff,0,sizeof(struct task_trace_event));
- buff->pid = pid;
- bpf_probe_read_str(buff->comm,sizeof(task->comm),task->comm);
- buff->kstack_sz = task->kstack_sz;
- buff->ustack_sz = task->ustack_sz;
- for(int j=0;j task->kstack_sz)
- break;
- buff->k_stack[j] = task->k_stack[j];
- }
- for(int j=0;j task->ustack_sz)
- break;
- buff->u_stack[j] = task->u_stack[j];
- }
- bpf_ringbuf_submit(buff, 0);
-
- return 0;
-}
-
-// static int update_data_list(u32 list_id,u32 id,u32 operation){
-// //bpf_printk("task occupied id is %u",id);
-// if(id == 0)
-// return 0;
-// if(list_id == 0 || list_id == 1){
-// // operation 0 delete, 1 insert
-// if(operation == 0){
-// struct data_list *list = bpf_map_lookup_elem(&occupied_list,&list_id);
-// if(!list){
-// // struct data_list _list = {};
-// // bpf_map_update_elem(&occupied_list,&list_id,&_list,BPF_ANY);
-// bpf_printk("data list not init\n");
-// return 0;
-// }
-// for(int i=0;i<50;i++){
-// if(list->list[i] == id)
-// {
-// list->list[i] = 0;
-// bpf_map_update_elem(&occupied_list,&list_id,list,BPF_ANY);
-// break;
-// }
-// }
-// }
-// else if(operation == 1){
-// struct data_list *list = bpf_map_lookup_elem(&occupied_list,&list_id);
-// if(!list){
-// // struct data_list _list = {};
-// // bpf_map_update_elem(&occupied_list,&list_id,&_list,BPF_ANY);
-// // list = bpf_map_lookup_elem(&occupied_list,&list_id);
-// // if(!list)
-// bpf_printk("data list not init\n");
-// return 0;
-// }
-// for(int i=0;i<50;i++){
-// if(list->list[i] == 0){
-// list->list[i] = id;
-// //bpf_printk("task occupied id is %u",id);
-// bpf_map_update_elem(&occupied_list,&list_id,list,BPF_ANY);
-// break;
-// }
-// }
-// }
-// else{
-// bpf_printk("data_list operations id error\n");
-// }
-// }
-// else{
-// bpf_printk("data_list id error\n");
-// }
-// return 0;
-// }
-
-// static int hash_table_insert(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key);
-// if(hash_index >= HASH_TABLE_SIZE)
-// return (unsigned int)-1;
-// unsigned int count = table->counts[hash_index];
-// if(hash_table_lookup(table,key,false) == key){
-// return 1;// 防æ¢é‡å¤æ’å…¥
-// }
-
-// // bpf_printk("task id is %u",key);
-// if (count < MAX_COLLISIONS) {
-// table->hash_node[hash_index][count] = key;
-// table->counts[hash_index]++;
-// if(hash_index > table->last_valid_index)
-// table->last_valid_index = hash_index;
-// } else {
-// return -1;
-// }
-// //bpf_printk("task id is %u",key);
-// return 0;
-// }
-
-static int init_process(u32 tgid,u32 pid) {
- struct process_struct ps;
- //hash_table_init(&ps.kids);
- // struct hash_table *table = bpf_map_lookup_elem(&hash_table_model_map,&zero);
- // if(!table)
- // return -1;
-
- //bpf_probe_read_kernel(&template_table,sizeof(template_table),table);
-
- //int res = bpf_map_update_elem(&process_kids_map,&tgid,table,BPF_ANY);
- //int res = bpf_map_update_elem(&process_kids_map,&tgid,&template_table,BPF_ANY);
- // if(res < 0){
- // bpf_printk("process %u kids map init failed,error code is %i",tgid,res);
- // }
-
- // table = bpf_map_lookup_elem(&process_kids_map,&tgid);
- // if(!table)
- // {
- // bpf_printk("process %u kids map init failed",tgid);
- // return -1;
- // }
-
- ps.tgid = tgid;
- ps.kids_length = 1;
- //hash_table_insert(table,pid);
- if(tgid != pid)
- {
- //hash_table_insert(table,tgid);
- ps.kids_length = 2;
- }
- //bpf_map_update_elem(&process_kids_map,&tgid,table,BPF_ANY);
- bpf_map_update_elem(&process_map,&tgid,&ps,BPF_ANY);
- return 0;
-}
-
-
-static void insert_pid_to_process(u32 tgid,u32 pid){
- if(tgid == 0)
- return;
- struct process_struct *ps = bpf_map_lookup_elem(&process_map,&tgid);
- if(!ps){
- init_process(tgid,pid);
- }
- else{
- ps->kids_length += 1;
- bpf_map_update_elem(&process_map,&tgid,ps,BPF_ANY);
- }
-}
-
-SEC("raw_tp/sched_wakeup")
-int BPF_PROG(handle_sched_wakeup, struct task_struct *p)
-{
- u32 pid = BPF_CORE_READ(p,pid);
- if(pid == 0)
- return 0;
- u32 tgid = BPF_CORE_READ(p,tgid);
- u32 cpu_id = bpf_get_smp_processor_id();
- struct task_cpu_usage *task_use = bpf_map_lookup_elem(&task_cpu_usage_map,&pid);
- if(!task_use){
- struct task_info_simple info = init_task_info(p,cpu_id);
- struct task_cpu_usage init_task;
- memset(&init_task,0,sizeof(struct task_cpu_usage));
- init_task.task_info = info;
- init_task.last_enqeue_time = bpf_ktime_get_ns();
- bpf_map_update_elem(&task_cpu_usage_map, &pid, &init_task, BPF_ANY);
- insert_pid_to_process(tgid,pid);
- }
- else{
- task_use->last_enqeue_time = bpf_ktime_get_ns();
- bpf_map_update_elem(&task_cpu_usage_map,&pid,task_use,BPF_ANY);
- }
-
- return 0;
-}
-
-SEC("raw_tp/sched_wakeup_new")
-int BPF_PROG(handle_sched_wakeup_new, struct task_struct *p){
- u32 pid = BPF_CORE_READ(p,pid);
- if(pid == 0)
- return 0;
- u32 tgid = BPF_CORE_READ(p,tgid);
- u32 cpu_id = bpf_get_smp_processor_id();
- struct task_cpu_usage *task_use = bpf_map_lookup_elem(&task_cpu_usage_map,&pid);
- if(!task_use){
- struct task_info_simple info = init_task_info(p,cpu_id);
- struct task_cpu_usage init_task;
- memset(&init_task,0,sizeof(struct task_cpu_usage));
- init_task.task_info = info;
- init_task.last_enqeue_time = bpf_ktime_get_ns();
- bpf_map_update_elem(&task_cpu_usage_map, &pid, &init_task, BPF_ANY);
-
- insert_pid_to_process(tgid,pid);
- }
- else{
- task_use->last_enqeue_time = bpf_ktime_get_ns();
- bpf_map_update_elem(&task_cpu_usage_map,&pid,task_use,BPF_ANY);
- }
-
- return 0;
-}
-
-SEC("tracepoint/sched/sched_process_fork")
-int handle_task_create(struct trace_event_raw_sched_process_fork *ctx){
- u32 pid_new = ctx->child_pid;
- u32 cpu_id = bpf_get_smp_processor_id();
- struct task_cpu_usage *tk = bpf_map_lookup_elem(&task_cpu_usage_map,&pid_new);
- if(!tk){
- struct task_cpu_usage init_task;
- memset(&init_task,0,sizeof(struct task_cpu_usage));
- struct task_info_simple info = {
- .pid = pid_new,
- .cpu_id = cpu_id
- };
- bpf_probe_read_kernel_str(info.comm,sizeof(ctx->child_comm),ctx->child_comm);
- init_task.task_info = info;
- bpf_map_update_elem(&task_cpu_usage_map,&pid_new,&init_task,BPF_ANY);
- }
- return 0;
-}
-
-SEC("tracepoint/sched/sched_process_exit")
-int BPF_PROG(handle_task_exit){
- u64 pid_tgid = bpf_get_current_pid_tgid();
- u32 pid = pid_tgid & 0xFFFFFFFF;
- u32 tgid = pid_tgid >> 32;
- if(pid == 0 || tgid == 0)
- return 0;
-
- bpf_map_delete_elem(&task_cpu_usage_map,&pid);
- struct process_struct *ps = bpf_map_lookup_elem(&process_map,&tgid);
- if(ps != NULL){
- if(ps->kids_length > 0)
- ps->kids_length -= 1;
-
- u32 *in = bpf_map_lookup_elem(&thread_occupied_map,&pid);
- if(in != NULL){
- bpf_map_delete_elem(&thread_occupied_map,&pid);
- //update_data_list(zero,pid,zero);
- }
-
- bpf_map_delete_elem(&task_trace_data_map,&pid);
-
- if(ps!=NULL && ps->kids_length == 0)
- {
- bpf_map_delete_elem(&process_map,&tgid);
- //bpf_map_delete_elem(&process_kids_map,&tgid);
-
- // if(bpf_map_lookup_elem(&process_occupied_map,&zero)!= NULL)
- // {
- // struct hash_table *table = bpf_map_lookup_elem(&process_occupied_map,&zero);
- // if(!table)
- // {
- // bpf_printk("process_occupied_map is not init\n");
- // return 0;
- // }
- // if(hash_table_delete(table,tgid) == 0)
- // {
- // bpf_map_update_elem(&process_occu pied_map,&zero,table,BPF_ANY);
- // update_data_list(one,tgid,zero);
- // }
- // }
- in = bpf_map_lookup_elem(&process_occupied_map,&tgid);
- if(in != NULL){
- bpf_map_delete_elem(&process_occupied_map,&tgid);
- //update_data_list(one,tgid,zero);
- }
- }
- // else
- // bpf_map_update_elem(&process_map,&tgid,ps,BPF_ANY);
- }
- return 0;
-}
-
-static int task_concerned_update(struct task_cpu_usage *task_usage, u32 threshold){
- u32 value = task_usage->total_time_ns * 100 / HALF_SECOND;
- //bpf_printk("total percent is %u",value);
- //bpf_printk("task id is %u",task_usage->task_info.pid);
- u32 pid = task_usage->task_info.pid;
- u64 now = bpf_ktime_get_ns();
- if(task_usage->last_clear_time == 0)
- {
- task_usage->last_clear_time = now;
- bpf_map_update_elem(&task_cpu_usage_map,&pid,task_usage,BPF_ANY);
- return 0;
- }
- if(!task_usage->already_output && value >= threshold && now - task_usage->last_clear_time < HALF_SECOND)
- {
- bpf_map_update_elem(&thread_occupied_map,&pid,&pid,BPF_ANY);
-
- struct task_cpu_usage *buff = bpf_ringbuf_reserve(&task_occupied_buffer,sizeof(struct task_cpu_usage),0);
- if(!buff){
- bpf_printk("the task_cpu buffer is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct task_cpu_usage));
- buff->task_info = task_usage->task_info;
- u64 delta = (now - task_usage->last_clear_time)*10 / HALF_SECOND;
- buff->total_percent = task_usage->total_time_ns * 100 * delta/ HALF_SECOND;
- buff->kernel_percent = task_usage->kernel_time_ns / task_usage->total_time_ns;
- buff->user_percent = task_usage->user_time_ns / task_usage->total_time_ns;
- bpf_ringbuf_submit(buff,0);
-
- task_usage->already_output = true;
- //bpf_map_update_elem(&task_cpu_usage_map,&pid,task_usage,BPF_ANY);
-
- if(task_usage->last_trace_time == 0 || now - task_usage->last_trace_time > 10 * HALF_SECOND)// 间隔至少5s
- {
- perf_task_backtrace(pid);
- task_usage->last_trace_time = now;
- }
- bpf_map_update_elem(&task_cpu_usage_map,&pid,task_usage,BPF_ANY);
- }
- else{
- if(now - task_usage->last_clear_time > HALF_SECOND)
- {
- if(task_usage->already_output == false)
- bpf_map_delete_elem(&thread_occupied_map,&pid);
- task_usage->last_clear_time = now;
- task_usage->total_time_ns = 0;
- task_usage->user_time_ns = 0;
- task_usage->kernel_time_ns = 0;
- task_usage->already_output = false;
- bpf_map_update_elem(&task_cpu_usage_map,&pid,task_usage,BPF_ANY);
- }
- }
- return 0;
-}
-
-static int process_concerned_update(struct process_struct *ps, u32 threshold){
- //bpf_printk("process %u total use time is %lu \n",ps->tgid,ps->total_use_time);
- u32 value = ps->total_use_time * 100 / HALF_SECOND;
- u64 now = bpf_ktime_get_ns();
- u32 tgid = ps->tgid;
- if(ps->last_clear_time == 0){
- ps->last_clear_time = now;
- bpf_map_update_elem(&process_map,&tgid,ps,BPF_ANY);
- return 0;
- }
- if(!ps->already_output && value >= threshold && now - ps->last_clear_time < HALF_SECOND)
- {
- bpf_map_update_elem(&process_occupied_map,&tgid,&tgid,BPF_ANY);
-
- struct process_struct *buff = bpf_ringbuf_reserve(&process_occupied_buffer,sizeof(struct process_struct),0);
- if(!buff){
- bpf_printk("process_cpu buffer is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct process_struct));
- u64 delta = (now - ps->last_clear_time) * 10 / HALF_SECOND;
- buff->tgid = tgid;
- buff->kids_length = ps->kids_length;
- buff->total_use_percent = ps->total_use_time * 100 * delta / HALF_SECOND;
- bpf_ringbuf_submit(buff,0);
-
- ps->already_output = true;
- bpf_map_update_elem(&process_map,&tgid,ps,BPF_ANY);
- }
- else{
- if(now - ps->last_clear_time > HALF_SECOND)
- {
- if(ps->already_output == false)
- bpf_map_delete_elem(&process_occupied_map,&tgid);
- ps->last_clear_time = now;
- ps->total_use_time = 0;
- ps->already_output = false;
- bpf_map_update_elem(&process_map,&tgid,ps,BPF_ANY);
- }
- }
- return 0;
-}
-
-static int process_update_runtime(u32 tgid,u64 delta,bool reset, u64 last_cpu_clear){
- if(tgid == 0)
- return 0;
- struct process_struct *ps = bpf_map_lookup_elem(&process_map,&tgid);
- if(!ps){
- init_process(tgid,tgid);
- ps = bpf_map_lookup_elem(&process_map,&tgid);
- if(!ps)
- return -1;
- }
- // 防æ¢å¤šä¸ªçº¿ç¨‹è®©åŒä¸€ä¸ªè¿›ç¨‹æ¸…ç†
- ps->tgid = tgid;
- if(reset == true && ps->last_total_clear < last_cpu_clear)
- {
- ps->total_use_time = 0;
- ps->last_total_clear = bpf_ktime_get_ns();
- }
- ps->total_use_time += delta;
- //bpf_printk("process %u total use time is %lu \n",tgid,ps->total_use_time);
- bpf_map_update_elem(&process_map,&tgid,ps,BPF_ANY);
- process_concerned_update(ps,10);
-
- return 0;
-}
-
-SEC("tracepoint/sched/sched_switch")
-int record_task_switch(struct trace_event_raw_sched_switch *ctx)
-{
- // 使用 BPF_CORE_READ æ¥è¯»å–ä»»åŠ¡ç»“æž„å—æ®µ
- u32 prev_pid = ctx->prev_pid;
- u32 next_pid = ctx->next_pid;
- u32 cpu_id = bpf_get_smp_processor_id();
- u64 now = bpf_ktime_get_ns();
-
- struct cpu_usage_times *cpu_usage ;
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if (cpu_usage == NULL) {
- struct cpu_usage_times init_cpu = {};
- bpf_map_update_elem(&cpu_usage_times_map, &cpu_id, &init_cpu, BPF_ANY);
-
- struct cpu_usage_stats init_stats = {
- .cpu_id = cpu_id,
- .total_times = HALF_SECOND
- };
- bpf_map_update_elem(&cpu_usage_percent_map, &cpu_id, &init_stats, BPF_ANY);
- }
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if (cpu_usage == NULL) return -1;
-
- // 检查 idle 进程
- /*if (prev_pid == 0) {
- if(cpu_usage->last_idle_time != 0)
- cpu_usage->idle_times += now - cpu_usage->last_idle_time;
- } else*/
- if(prev_pid != 0){
- struct task_cpu_usage *pre_usage = bpf_map_lookup_elem(&task_cpu_usage_map, &prev_pid);
- if (!pre_usage) {
- struct task_cpu_usage init_task;
- memset(&init_task,0,sizeof(struct task_cpu_usage));
- struct task_info_simple info = {
- .pid = prev_pid,
- .cpu_id = cpu_id
- };
- bpf_probe_read_kernel_str(info.comm,sizeof(ctx->prev_comm),ctx->prev_comm);
- init_task.task_info = info;
- init_task.last_clear_time = now;
- init_task.last_run_time = now;
- bpf_map_update_elem(&task_cpu_usage_map, &prev_pid, &init_task, BPF_ANY);
- } else {
- pre_usage->task_info.pid = prev_pid;
- if (pre_usage->last_run_time != 0) {
- u64 delta = now - pre_usage->last_run_time;
- if (pre_usage->in_kernel) {
- pre_usage->kernel_time_ns += delta;
- cpu_usage->kernel_times += delta;
- } else {
- pre_usage->user_time_ns += delta;
- cpu_usage->usr_times += delta;
- }
- pre_usage->total_time_ns += delta;
- task_concerned_update(pre_usage,5);
-
- if(pre_usage->task_info.tgid != 0){
- u32 tgid = pre_usage->task_info.tgid;
- process_update_runtime(tgid,delta,false,cpu_usage->last_clear_time);
- }
- }
- pre_usage->last_run_time = now;
- bpf_map_update_elem(&task_cpu_usage_map, &prev_pid, pre_usage, BPF_ANY);
-
- }
- //bpf_printk("cpu %u kernel time is %u \n",cpu_id,cpu_usage->kernel_times);
- }
-
- /*if (next_pid == 0) {
- cpu_usage->last_idle_time = now;
- } else*/
- if(next_pid != 0){
- struct task_cpu_usage *next_usage = bpf_map_lookup_elem(&task_cpu_usage_map, &next_pid);
- if (!next_usage) {
- struct task_cpu_usage init_task;
- memset(&init_task,0,sizeof(struct task_cpu_usage));
- struct task_info_simple info = {
- .pid = next_pid,
- .cpu_id = cpu_id
- };
- bpf_probe_read_kernel_str(info.comm,sizeof(ctx->next_comm),ctx->next_comm);
- init_task.task_info = info;
- init_task.last_clear_time = now;
- init_task.last_run_time = now;
- bpf_map_update_elem(&task_cpu_usage_map, &next_pid, &init_task, BPF_ANY);
- } else {
- next_usage->task_info.pid = next_pid;
-
- u64 latency_bucket = now - next_usage->last_enqeue_time;
- next_usage->wait_time = latency_bucket;
-
- latency_bucket /= USEC;
- u32 bucket;
- if(latency_bucket == 0)
- bucket = 0;
- else if(latency_bucket < 5)
- bucket = 1;
- else if(latency_bucket < 17)
- bucket = 2;
- else if(latency_bucket < 65)
- bucket = 3;
- else if(latency_bucket < 257)
- bucket = 4;
- else if(latency_bucket < 1000)
- bucket = 5;
- else if(latency_bucket < 4000)
- bucket = 6;
- else
- bucket = 7;
- u32 *latency = bpf_map_lookup_elem(&runqlat_map,&bucket);
- if(!latency){
- bpf_map_update_elem(&runqlat_map,&bucket,&one,BPF_ANY);
- }else{
- *latency = *latency + 1;
- bpf_map_update_elem(&runqlat_map,&bucket,latency,BPF_ANY);
- }
-
- if(next_usage->last_run_time < cpu_usage->last_clear_time){
- // 任务这边的数æ®åœ¨æ–°çš„æ—¶é—´çª—å£å†…清零
- next_usage->total_time_ns = 0;
- next_usage->kernel_time_ns = 0;
- next_usage->user_time_ns = 0;
- if(next_usage->task_info.tgid != 0)
- process_update_runtime(next_usage->task_info.tgid,0,true,cpu_usage->last_clear_time);
- }
-
- next_usage->last_run_time = now;
- bpf_map_update_elem(&task_cpu_usage_map, &next_pid, next_usage, BPF_ANY);
- }
- }
-
- bpf_map_update_elem(&cpu_usage_times_map,&cpu_id,cpu_usage,BPF_ANY);
- return 0;
-}
-
-SEC("tracepoint/sched/sched_switch")
-int record_backtrace(struct trace_event_raw_sched_switch *ctx)
-{
- u32 pid = ctx->prev_pid;
- //bpf_printk("current pid is %u",pid);
- if(pid == 0 || bpf_map_lookup_elem(&thread_occupied_map,&pid) == NULL)
- return 0;
-
- int stack_id = bpf_get_stackid(ctx,&stack_traces_map,BPF_F_REUSE_STACKID);
- if(stack_id < 0){
- bpf_printk("get stack error, error code is %i",stack_id);
- return 0;
- }
-
- struct task_trace_event *trace = bpf_map_lookup_elem(&task_trace_data_map,&pid);
- if(!trace){
- struct task_trace_event init;
- init.pid = pid;
- struct task_cpu_usage *task = bpf_map_lookup_elem(&task_cpu_usage_map,&pid);
- if(task != NULL){
- bpf_probe_read_kernel_str(init.comm,sizeof(task->task_info.comm),task->task_info.comm);
- }
- init.kstack_sz = 0;
- init.ustack_sz = 0;
- bpf_map_update_elem(&task_trace_data_map,&pid,&init,BPF_ANY);
- }
- else{
- struct task_cpu_usage *use = bpf_map_lookup_elem(&task_cpu_usage_map,&pid);
- // if(!use || use->already_backtrace)
- // return 0;
- }
- trace = bpf_map_lookup_elem(&task_trace_data_map,&pid);
- if(!trace)
- {
- bpf_printk("backtrace struct init failed\n");
- return 0;
- }
-
- // 获å–å†…æ ¸æ ˆå›žæº¯
- // trace->kstack_sz = bpf_get_stackid(ctx,&stack_traces_map,BPF_F_REUSE_STACKID);
- // if(trace->kstack_sz >= 0){
- // u64 *k_stack_data = bpf_map_lookup_elem(&stack_traces_map,&trace->kstack_sz);
- // if(k_stack_data){
- // bpf_probe_read_kernel(&trace->k_stack,sizeof(trace->k_stack),k_stack_data);
- // }
- // }
- trace->kstack_sz = stack_id;
- u64 *k_stack_data = (u64 *)(stack_id * sizeof(u64));
- if (k_stack_data) {
- //bpf_printk("k_stack_data exist\n");
- bpf_probe_read_kernel(&trace->k_stack, sizeof(trace->k_stack), k_stack_data);
- }
-
- // 获å–ç”¨æˆ·æ ˆå›žæº¯
- // trace->ustack_sz = bpf_get_stackid(ctx,&stack_traces_map,BPF_F_USER_STACK | BPF_F_REUSE_STACKID);
- // if(trace->ustack_sz >= 0){
- // u64 *u_stack_data = bpf_map_lookup_elem(&stack_traces_map, &trace->ustack_sz);
- // if(u_stack_data){
- // bpf_probe_read_kernel(&trace->u_stack,sizeof(trace->u_stack),u_stack_data);
- // }
- // }
- int u_stack_id = bpf_get_stackid(ctx, &stack_traces_map, BPF_F_USER_STACK | BPF_F_REUSE_STACKID);
- if (u_stack_id >= 0) {
- trace->ustack_sz = u_stack_id;
- u64 *u_stack_data = (u64 *)(u_stack_id * sizeof(u64));
- if (u_stack_data) {
- //bpf_printk("u_stack_data exist\n");
- bpf_probe_read_kernel(&trace->u_stack, sizeof(trace->u_stack), u_stack_data);
- }
- }
-
- bpf_map_update_elem(&task_trace_data_map,&pid,trace,BPF_ANY);
-
- return 0;
-}
-
-static int cpu_init(u32 cpu_id){
- struct cpu_usage_times* cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if(!cpu_usage)
- return 0;
- struct cpu_usage_times init_cpu = {};
- bpf_map_update_elem(&cpu_usage_times_map, &cpu_id, &init_cpu, BPF_ANY);
-
- struct cpu_usage_stats init_stats = {
- .cpu_id = cpu_id,
- .total_times = HALF_SECOND
- };
- bpf_map_update_elem(&cpu_usage_percent_map, &cpu_id, &init_stats, BPF_ANY);
- return 0;
-}
-
-// 闲置时间统计
-SEC("tracepoint/power/cpu_idle")
-int record_cpu_idle(struct cpu_idle_args *ctx){
- u32 cpu_id = ctx->cpu_id;
- u32 state = ctx->state;
-
- u64 now = bpf_ktime_get_ns();
-
- struct cpu_usage_times *cpu_usage ;
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if (cpu_usage == NULL) {
- struct cpu_usage_times init_cpu = {};
- bpf_map_update_elem(&cpu_usage_times_map, &cpu_id, &init_cpu, BPF_ANY);
-
- struct cpu_usage_stats init_stats = {
- .cpu_id = cpu_id,
- .total_times = HALF_SECOND
- };
- bpf_map_update_elem(&cpu_usage_percent_map, &cpu_id, &init_stats, BPF_ANY);
- return 0;
- }
- // cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- // if (cpu_usage == NULL) return -1;
-
- // æ¯”è¾ƒç¥žå¥‡ï¼Œåœ¨æ— ç¬¦å·32ä½é‡Œç”¨-1表示从空闲状æ€é€€å‡ºï¼Œä¸‹é¢é“¾æŽ¥ä¸å¯ä»¥çœ‹åˆ°
- // https://android.googlesource.com/kernel/common/+/refs/heads/android-gs-pantah-5.10-android13-qpr2/samples/bpf/cpustat_kern.c
- if(state == (u32)(-1)){
- if(cpu_usage->last_idle_time == 0)
- return 0;
- cpu_usage->idle_times += now - cpu_usage->last_idle_time;
- }else{
- cpu_usage->last_idle_time = now;
- }
- bpf_map_update_elem(&cpu_usage_times_map, &cpu_id, cpu_usage, BPF_ANY);
-}
-
-
-// ä»»åŠ¡è¿›å…¥å†…æ ¸æ€
-SEC("tracepoint/raw_syscalls/sys_enter")
-int BPF_PROG(trace_sys_enter){
- struct task_struct *task = (struct task_struct *)bpf_get_current_task();
- u32 pid = BPF_CORE_READ(task, pid);
- u32 tgid = BPF_CORE_READ(task,tgid);
- if(pid == 0)
- return 0;
-
- struct task_cpu_usage *usage = bpf_map_lookup_elem(&task_cpu_usage_map, &pid);
- if(!usage){
- u32 cpu_id = bpf_get_smp_processor_id();
- struct task_info_simple info = init_task_info(task,cpu_id);
-
- // 相当于这里是没有åˆå§‹åŒ–last_run_timeçš„
- struct task_cpu_usage init_usage = {
- .task_info = info,
- .in_kernel = true
- };
-
- bpf_map_update_elem(&task_cpu_usage_map, &pid, &init_usage, BPF_ANY);
- }
- else{
- if(usage->task_info.tgid == 0)
- {
- usage->task_info.tgid = tgid;
- insert_pid_to_process(tgid,pid);
- }
- usage->in_kernel = true;
- bpf_map_update_elem(&task_cpu_usage_map, &pid, usage, BPF_ANY);
- }
- return 0;
-}
-
-// ä»»åŠ¡é€€å‡ºå†…æ ¸æ€
-SEC("tracepoint/raw_syscalls/sys_exit")
-int BPF_PROG(trace_sys_exit){
- struct task_struct *task = (struct task_struct *)bpf_get_current_task();
- u32 pid = BPF_CORE_READ(task, pid);
- u32 tgid = BPF_CORE_READ(task,tgid);
- if(pid == 0)
- return 0;
-
- struct task_cpu_usage *usage = bpf_map_lookup_elem(&task_cpu_usage_map, &pid);
- if(!usage){
- u32 cpu_id = bpf_get_smp_processor_id();
- struct task_info_simple info = init_task_info(task,cpu_id);
-
- // 相当于这里是没有åˆå§‹åŒ–last_run_timeçš„
- struct task_cpu_usage init_usage = {
- .task_info = info,
- .in_kernel = false
- };
-
- bpf_map_update_elem(&task_cpu_usage_map, &pid, &init_usage, BPF_ANY);
- }
- else{
- if(usage->task_info.tgid == 0)
- {
- usage->task_info.tgid = tgid;
- insert_pid_to_process(tgid,pid);
- }
- usage->in_kernel = false;
- bpf_map_update_elem(&task_cpu_usage_map, &pid, usage, BPF_ANY);
- }
- return 0;
-}
-
-// è½¯ä¸æ–
-SEC("tracepoint/irq/softirq_entry")
-int BPF_PROG(trace_cpu_softirq_entry){
- u32 cpu_id = bpf_get_smp_processor_id();
-
- struct cpu_usage_times *cpu_usage ;
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if (cpu_usage == NULL) {
- cpu_init(cpu_id);
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if(cpu_usage == NULL) return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- cpu_usage->last_softirq_time = now;
- bpf_map_update_elem(&cpu_usage_times_map,&cpu_id,cpu_usage,BPF_ANY);
- return 0;
-}
-
-SEC("tracepoint/irq/softirq_exit")
-int BPF_PROG(trace_cpu_softirq_exit){
- u32 cpu_id = bpf_get_smp_processor_id();
-
- struct cpu_usage_times *cpu_usage ;
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if (cpu_usage == NULL) {
- cpu_init(cpu_id);
- return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- cpu_usage->softirq_times += now - cpu_usage->last_softirq_time;
- bpf_map_update_elem(&cpu_usage_times_map,&cpu_id,cpu_usage,BPF_ANY);
- return 0;
-}
-
-//ç¡¬ä¸æ–
-SEC("tracepoint/irq/irq_handler_entry")
-int BPF_PROG(trace_cpu_irq_entry){
- u32 cpu_id = bpf_get_smp_processor_id();
-
- struct cpu_usage_times *cpu_usage ;
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if (cpu_usage == NULL) {
- cpu_init(cpu_id);
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if(cpu_usage == NULL) return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- cpu_usage->last_irq_time = now;
- bpf_map_update_elem(&cpu_usage_times_map,&cpu_id,cpu_usage,BPF_ANY);
- return 0;
-}
-
-SEC("tracepoint/irq/irq_handler_exit")
-int BPF_PROG(trace_cpu_irq_exit){
- u32 cpu_id = bpf_get_smp_processor_id();
-
- struct cpu_usage_times *cpu_usage ;
- cpu_usage = bpf_map_lookup_elem(&cpu_usage_times_map, &cpu_id);
- if (cpu_usage == NULL) {
- cpu_init(cpu_id);
- return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- cpu_usage->irq_times += now - cpu_usage->last_irq_time;
- bpf_map_update_elem(&cpu_usage_times_map,&cpu_id,cpu_usage,BPF_ANY);
- return 0;
-}
-
-static int __update_percpu_usage_percent(u32 cpu_id,struct cpu_usage_times *data,struct cpu_usage_stats *stats){
- if(data == NULL || stats == NULL)
- return -1;
-
- stats->cpu_id = cpu_id;
- // 利用emaæ¥æ›´æ–°æ•°æ®ï¼Œä¿ç•™2ä½å°æ•°
- if(stats->idle_percent == 0 && stats->kernel_percent == 0 && stats->user_percent == 0){
- stats->user_percent = data->usr_times * 100 / HALF_SECOND;
- stats->kernel_percent = data->kernel_times * 100 / HALF_SECOND;
- stats->idle_percent = data->idle_times *100 / HALF_SECOND;
- stats->softirq_percent = data->softirq_times*100 / HALF_SECOND;
- stats->irq_percent = data->irq_times*100 / HALF_SECOND;
- }
- else{
- stats->user_percent = stats->user_percent * 60/100 + data->usr_times * 40 / HALF_SECOND;
- stats->kernel_percent = stats->kernel_percent*60/100 + data->kernel_times *40/HALF_SECOND;
- stats->idle_percent = stats->idle_percent*60/100 + data->idle_times*40/HALF_SECOND;
- //stats->idle_percent = data->idle_times *100 / HALF_SECOND;
- stats->softirq_percent = stats->softirq_percent*60/100 + data->softirq_times*40 / HALF_SECOND;
- stats->irq_percent = stats->idle_percent*60/100 + data->irq_times*40 / HALF_SECOND;
- }
- bpf_map_update_elem(&cpu_usage_percent_map,&cpu_id,stats,BPF_ANY);
-
- // æ¸…é›¶ï¼ŒåŠ å…¥ä¸‹ä¸€è½®
- data->idle_times = 0;
- data->kernel_times = 0;
- data->usr_times = 0;
- data->idle_times = 0;
- data->softirq_times = 0;
-
- bpf_map_update_elem(&cpu_usage_times_map,&cpu_id,data,BPF_ANY);
-
- // 将统计数æ®å†™å…¥çŽ¯å½¢ç¼“å†²åŒº
- struct cpu_usage_stats *ringbuf_data;
- ringbuf_data = bpf_ringbuf_reserve(&cpu_usage_buffer, sizeof(struct cpu_usage_stats), 0);
- if (!ringbuf_data) {
- //__builtin_memcpy(ringbuf_data, stats, sizeof(struct cpu_usage_stats));
- bpf_printk("Ring buffer reserve failed\n");
- return -1;
- }
- else{
- memset(ringbuf_data, 0, sizeof(struct cpu_usage_stats));
- ringbuf_data->cpu_id = stats->cpu_id;
- ringbuf_data->idle_percent = stats->idle_percent;
- ringbuf_data->kernel_percent = stats->kernel_percent;
- ringbuf_data->user_percent = stats->user_percent;
- bpf_ringbuf_submit(ringbuf_data, 0);
- }
- //bpf_printk("CPU ID: %u\n", stats->cpu_id);
- // bpf_printk("User Time: %u\n", stats->user_percent);
- // bpf_printk("Kernel Time: %u\n", stats->kernel_percent);
- //bpf_printk("Kernel Time: %u\n", data->kernel_times);
-
- return 0;
-}
-
-
-static int update_cpu_usage_percent(void){
- u32 cur_id;
- u32 cpu_id;
- struct cpu_usage_times *data;
- int res;
- u64 now = bpf_ktime_get_ns();
-
- for(cpu_id = 0;cpu_id < 128 && cpu_id < nr_cpus;cpu_id++){
- cur_id = cpu_id;
- data = bpf_map_lookup_elem(&cpu_usage_times_map,&cur_id);
- if(data != NULL){
- //bpf_printk("current cpu is %u\n", cur_id);
- struct cpu_usage_stats *stats ;
- stats = bpf_map_lookup_elem(&cpu_usage_percent_map,&cur_id);
- if(!stats){
- struct cpu_usage_stats init_stats = {
- .cpu_id = cur_id,
- .total_times = HALF_SECOND
- };
- bpf_map_update_elem(&cpu_usage_percent_map,&cur_id,&init_stats,BPF_ANY);
- stats = bpf_map_lookup_elem(&cpu_usage_percent_map,&cur_id);
- if(!stats) return -1;
- }
- data->last_clear_time = now;
- res = __update_percpu_usage_percent(cur_id,data,stats);
- //bpf_map_update_elem(&cpu_usage_percent_map,&cur_id,stats,BPF_ANY);
- //bpf_map_update_elem(&cpu_usage_times_map,&cur_id,data,BPF_ANY);
- if(res<0) return res;
- //bpf_map_update_elem(&cpu_usage_percent_map,&cur_id,stats,BPF_ANY);
- //bpf_map_update_elem(&cpu_usage_times_map,&cur_id,data,BPF_ANY);
- }
- else
- {
- bpf_printk("data not found for cpu %u\n", cur_id);
- continue;
- }
- }
-
- return 0;
-}
-
-// static int perf_update_task_concerd(void){
-// //struct hash_table *table = bpf_map_lookup_elem(&thread_occupied_map,&zero);
-// u64 now = bpf_ktime_get_ns();
-// // if(!table)
-// // return -1;
-// struct task_cpu_usage *task;
-// u32 flag = 0,index = 0;
-// //u32 flag = hash_table_foreach(table,0);
-// //u32 count = 0;
-// struct data_list *list = bpf_map_lookup_elem(&occupied_list,&zero);
-// if(!list)
-// return 0;
-// for(index = 0;index<50;index++)
-// {
-// if(list->list[index] == 0)
-// continue;
-// flag = list->list[index];
-// //bpf_printk("current task is %u",flag);
-// // if(count > 128*6)
-// // return -2;
-// // count++;
-// task = bpf_map_lookup_elem(&task_cpu_usage_map,&flag);
-// if(task != NULL){
-// if(task->last_run_time == 0)
-// continue;
-// if(task->last_run_time < now - (2*HALF_SECOND))
-// {
-// // åˆ é™¤è¿‡æ—¶çš„å…ƒç´
-// //hash_table_delete(table,flag);
-// bpf_map_delete_elem(&thread_occupied_map,&flag);
-// list->list[index] = 0;
-// }
-// else{
-// task->already_backtrace = false;
-// task->total_percent = task->total_time_ns * 100/ HALF_SECOND;
-// task->kernel_percent = task->kernel_time_ns * 100/task->total_time_ns;
-// task->user_percent = task->user_time_ns * 100/task->total_time_ns;
-// if(task->total_percent > 5){
-// struct task_cpu_usage *buff = bpf_ringbuf_reserve(&task_occupied_buffer,sizeof(struct task_cpu_usage),0);
-// if(!buff){
-// bpf_printk("task ringbuff reserve failed\n");
-// }
-// else{
-// memset(buff,0,sizeof(struct task_cpu_usage));
-// bpf_probe_read_kernel_str(buff->task_info.comm,sizeof(task->task_info.comm),task->task_info.comm);
-// buff->task_info.pid = task->task_info.pid;
-// buff->total_percent = task->total_percent > 100 ? 99:task->total_percent;
-// buff->kernel_percent = task->kernel_percent > 100 ? 99:task->kernel_percent;
-// buff->user_percent = task->user_percent > 100 ? 99:task->user_percent;
-// bpf_ringbuf_submit(buff,0);
-// }
-// }else{
-// // åˆ é™¤é˜ˆå€¼ä¸è¾¾æ ‡çš„å…ƒç´
-// //hash_table_delete(table,flag);
-// bpf_map_delete_elem(&thread_occupied_map,&flag);
-// list->list[index] = 0;
-// }
-// bpf_map_update_elem(&task_cpu_usage_map,&flag,task,BPF_ANY);
-// }
-// }
-// u32 _flag = flag;
-// //flag = hash_table_foreach(table,_flag);
-// }
-// //bpf_map_update_elem(&thread_occupied_map,&zero,table,BPF_ANY);
-// bpf_map_update_elem(&occupied_list,&zero,list,BPF_ANY);
-// return 0;
-// }
-
-// static int perf_update_process_concerd(void){
-// //struct hash_table *table = bpf_map_lookup_elem(&process_occupied_map,&zero);
-// u64 now = bpf_ktime_get_ns();
-// // if(!table)
-// // return -1;
-// struct process_struct *ps;
-// u32 flag = 0,index = 0;
-// //u32 flag = hash_table_foreach(table,0);
-// //u32 count = 0;
-// struct data_list *list = bpf_map_lookup_elem(&occupied_list,&one);
-// if(!list)
-// return 0;
-// for(index = 0;index<50;index++)
-// {
-// if(list->list[index] == 0)
-// continue;
-// flag = list->list[index];
-// //bpf_printk("current process is %u",flag);
-// // if(count > 128*6)
-// // return -2;
-// // count++;
-// ps = bpf_map_lookup_elem(&process_map,&flag);
-// if(ps != NULL){
-// if(ps->total_use_time == 0)
-// continue;
-// if(ps->last_total_clear < now - (2*HALF_SECOND))
-// {
-// // åˆ é™¤è¿‡æ—¶çš„å…ƒç´
-// //hash_table_delete(&table,flag);
-// bpf_map_delete_elem(&process_occupied_map,&flag);
-// list->list[index] = 0;
-// }
-// else{
-// ps->total_use_percent = ps->total_use_time *100 / HALF_SECOND;
-// if(ps->total_use_percent > 10){
-// struct process_struct *buff = bpf_ringbuf_reserve(&process_occupied_buffer,sizeof(struct process_struct),0);
-// if(!buff){
-// bpf_printk("ps ringbuff reserve failed\n");
-// }
-// else{
-// memset(buff,0,sizeof(struct process_struct));
-// buff->kids_length = ps->kids_length;
-// buff->tgid = ps->tgid;
-// buff->total_use_percent = ps->total_use_percent;
-// bpf_ringbuf_submit(buff,0);
-// }
-// }else{
-// // åˆ é™¤é˜ˆå€¼ä¸è¾¾æ ‡çš„å…ƒç´
-// //hash_table_delete(&table,flag);
-// bpf_map_delete_elem(&process_occupied_map,&flag);
-// list->list[index] = 0;
-// }
-// bpf_map_update_elem(&process_map,&flag,ps,BPF_ANY);
-// }
-// }
-// u32 _flag = flag;
-// //flag = hash_table_foreach(table,_flag);
-// }
-// //bpf_map_update_elem(&process_occupied_map,&zero,table,BPF_ANY);
-// bpf_map_update_elem(&occupied_list,&one,list,BPF_ANY);
-// return 0;
-// }
-
-static int perf_runqlat(void){
- struct runqlat_perf_data *buff = bpf_ringbuf_reserve(&runqlat_buffer,sizeof(struct runqlat_perf_data),0);
- if(!buff)
- {
- bpf_printk("runqlat ringbuff reserve failed\n");
- return 0;
- }
- memset(buff,0,sizeof(struct runqlat_perf_data));
- for(u32 index=0;indexdata[index] = 0;
- else
- buff->data[index] = *size;
- }
- bpf_ringbuf_submit(buff,0);
-
- return 0;
-}
-
-SEC("perf_event")
-int handle_cpu_event(struct bpf_perf_event_data *ctx){
- if(!init_cpus_num){
- u32 *nr_cpus_ptr;
- nr_cpus_ptr = bpf_map_lookup_elem(&cpu_usr_map,&zero);
- if(!nr_cpus_ptr){
- bpf_printk("get cpu nums error\n");
- return -1;
- }
- nr_cpus = *nr_cpus_ptr;
- init_cpus_num = true;
- }
- int res = update_cpu_usage_percent();
- if(res < 0)
- bpf_printk("update error\n");
- return 0;
-}
-
-// SEC("perf_event")
-// int handle_task_usage_event(struct bpf_perf_event_data *ctx){
-// int res = perf_update_task_concerd();
-// //bpf_printk("task perf finish");
-// if(res == -1)
-// bpf_printk("the task_occupied_map is not init\n");
-// else if(res == -2)
-// bpf_printk("out of index, there may be exist infinit loop\n");
-// return 0;
-// }
-
-// SEC("perf_event")
-// int handle_process_stat_event(struct bpf_perf_event_data *ctx){
-// int res = perf_update_process_concerd();
-// //bpf_printk("task perf finish");
-// if(res == -1)
-// bpf_printk("the process_occupied_map is not init\n");
-// else if(res == -2)
-// bpf_printk("out of index, there may be exist infinit loop\n");
-// return 0;
-// }
-
-SEC("perf_event")
-int handle_sys_latency_event(struct bpf_perf_event_data *ctx){
- perf_runqlat();
- return 0;
-}
-
-// SEC("perf_event")
-// int handle_task_backtrace_event(struct bpf_perf_event_data *ctx){
-// perf_task_backtrace();
-// return 0;
-// }
\ No newline at end of file
diff --git a/bpf/io_stats.bpf.c b/bpf/io_stats.bpf.c
deleted file mode 100644
index 7a44ae3..0000000
--- a/bpf/io_stats.bpf.c
+++ /dev/null
@@ -1,353 +0,0 @@
-#include "vmlinux.h"
-#include
-#include
-#include
-
-#include "io_event.h"
-
-char LICENSE[] SEC("license") = "Dual BSD/GPL";
-
-
-static const u32 one = 1;
-static const u32 zero = 0;
-
-struct trace_event_raw_block_rq_issue {
- unsigned short common_type;
- unsigned char common_flags;
- unsigned char common_preempt_count;
- int common_pid;
-
- dev_t dev; // offset: 8, size: 4
- u32 __padding; // 用于对é½åˆ°åç§»é‡ 16
- sector_t sector; // offset: 16, size: 8
- unsigned int nr_sector; // offset: 24, size: 4
- unsigned int bytes; // offset: 28, size: 4
- char rwbs[8]; // offset: 32, size: 8
- char comm[16]; // offset: 40, size: 16
- int __data_loc_cmd; // offset: 56, size: 4
-};
-
-// 类似runqlat统计
-DEFINE_BPF_MAP(io_wait_count_map,BPF_MAP_TYPE_ARRAY,8,u32,u32);
-DEFINE_BPF_MAP(io_wait_map,BPF_MAP_TYPE_HASH,MAX_ENTRIES,u32,u64);
-
-DEFINE_BPF_MAP(io_task_stats_map,BPF_MAP_TYPE_HASH,MAX_ENTRIES,u32,struct io_task_stats);
-DEFINE_BPF_MAP(io_process_stats_map,BPF_MAP_TYPE_HASH,4096,u32,struct io_process_stats);
-
-DEFINE_BPF_MAP(io_threhold_map,BPF_MAP_TYPE_ARRAY,2,u32,struct io_stats_threhold);
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 128 * 1024); // 环形缓冲区大å°ä¸º 256 KB
-} io_wait_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 512 * 1024); // 环形缓冲区大å°ä¸º 256 KB
-} io_task_stats_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 512 * 1024); // 环形缓冲区大å°ä¸º 256 KB
-} io_process_stats_buffer SEC(".maps");
-
-static int io_update_wait_map_count(u64 wait_time) {
- u64 latency_bucket = wait_time / USEC;
-
- u32 bucket;
- if(latency_bucket == 0)
- bucket = 0;
- else if(latency_bucket < 5)
- bucket = 1;
- else if(latency_bucket < 17)
- bucket = 2;
- else if(latency_bucket < 65)
- bucket = 3;
- else if(latency_bucket < 257)
- bucket = 4;
- else if(latency_bucket < 1000)
- bucket = 5;
- else if(latency_bucket < 4000)
- bucket = 6;
- else
- bucket = 7;
-
- u32 *count = bpf_map_lookup_elem(&io_wait_count_map,&bucket);
- if(!count){
- bpf_map_update_elem(&io_wait_count_map,&bucket,&one,BPF_ANY);
- }
- else{
- *count = *count + 1;
- bpf_map_update_elem(&io_wait_count_map,&bucket,count,BPF_ANY);
- }
- return 0;
-}
-
-// 请求开始时间
-SEC("tracepoint/block/block_rq_issue")
-int io_trace_rq_issue(struct trace_event_raw_block_rq_issue *ctx) {
- u32 dev = ctx->dev;
- u64 now = bpf_ktime_get_ns();
-
- bpf_map_update_elem(&io_wait_map,&dev,&now,BPF_ANY);
- return 0;
-}
-
-// è¯·æ±‚ç»“æŸæ—¶é—´
-SEC("tracepoint/block/block_rq_complete")
-int io_trace_rq_complete(struct trace_event_raw_block_rq_completion *ctx) {
- u32 dev = ctx->dev;
- u64 *time = bpf_map_lookup_elem(&io_wait_map,&dev);
- if(!time)
- return 0;
- u64 now = bpf_ktime_get_ns();
- u64 wait = now - *time;
-
- io_update_wait_map_count(wait);
- bpf_map_delete_elem(&io_wait_map,&dev);
- return 0;
-}
-
-SEC("perf_event")
-int handle_io_wait_event(struct bpf_perf_event_data *ctx) {
- struct io_wait_perf_data *buff = bpf_ringbuf_reserve(&io_wait_buffer,sizeof(struct io_wait_perf_data),0);
- if(!buff){
- bpf_printk("io_wait_count buffer is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct io_wait_perf_data));
-
- for(u32 i = 0; i<8;i++){
- u32 index = i;
- u32 *data = bpf_map_lookup_elem(&io_wait_count_map,&index);
- if(!data){
- buff->count_list[i] = 0;
- }
- else{
- buff->count_list[i] = *data;
- }
- }
- bpf_ringbuf_submit(buff, 0);
-
- return 0;
-}
-
-static int io_task_compare_and_commit(struct io_task_stats *task) {
- struct io_stats_threhold *threhold = bpf_map_lookup_elem(&io_threhold_map,&zero);
- if(!threhold){
- bpf_printk("io_threhold map is not init\n");
- return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- if(task->last_clear_time + threhold->time_window < now){
- task->read_count = 0;
- task->write_count = 0;
- task->last_clear_time = now;
- task->already_output = 0;
- //bpf_printk("current pid is %u",task->info.pid);
- bpf_map_update_elem(&io_task_stats_map,&task->info.pid,task,BPF_ANY);
- return 0;
- }
-
- if(task->read_count >= threhold->read_count || task->write_count >= threhold->write_count){
- if(task->already_output != 0)
- {
- return 0;// 这个周期内以åŠè¾“出过了
- }
-
- struct io_task_stats *buff = bpf_ringbuf_reserve(&io_task_stats_buffer, sizeof(struct io_task_stats), 0);
- if(!buff){
- bpf_printk("task_io_stats_buff is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct io_task_stats));
- buff->info.pid = task->info.pid;
- buff->info.tgid = task->info.tgid;
- bpf_probe_read_str(buff->info.comm,sizeof(task->info.comm),task->info.comm);
- buff->read_count = task->read_count;
- buff->write_count = task->write_count;
-
- // æ¯•ç«Ÿåœ¨åˆšè¶…å°±æˆªè‡³äº†ï¼Œæ‰€ä»¥æ ¹æ®å‰©ä½™çš„time_windowæ—¶é—´æ¥ä¹˜ä¸ªæ¯”例
- u64 time_spare = task->last_clear_time + threhold->time_window - now;
- time_spare = time_spare * 100 / threhold->time_window;
- time_spare = (u32)time_spare;
- if(time_spare > 10)
- {
- buff->write_count *= (time_spare / 10);
- buff->read_count *= (time_spare / 10);
- }
- bpf_ringbuf_submit(buff,0);
-
- task->already_output = 1;
- bpf_map_update_elem(&io_task_stats_map,&task->info.pid,task,BPF_ANY);
- }
- return 0;
-}
-
-
-static int io_process_compare_and_commit(struct io_process_stats *process) {
- struct io_stats_threhold *threhold = bpf_map_lookup_elem(&io_threhold_map,&one);
- if(!threhold){
- bpf_printk("io_threhold map is not init\n");
- return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- if(process->last_clear_time + threhold->time_window < now){
- process->read_count = 0;
- process->write_count = 0;
- process->last_clear_time = now;
- process->already_output = 0;
- bpf_map_update_elem(&io_process_stats_map,&process->tgid,process,BPF_ANY);
- return 0;
- }
-
- if(process->read_count >= threhold->read_count || process->write_count >= threhold->write_count){
- if(process->already_output != 0)
- return 0;
- struct io_process_stats *buff = bpf_ringbuf_reserve(&io_process_stats_buffer, sizeof(struct io_process_stats), 0);
- if(!buff){
- bpf_printk("process_io_stats_buff is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct io_process_stats));
- buff->tgid = process->tgid;
- buff->read_count = process->read_count;
- buff->write_count = process->write_count;
- bpf_ringbuf_submit(buff,0);
- process->already_output = 1;
- bpf_map_update_elem(&io_process_stats_map,&process->tgid,process,BPF_ANY);
- }
- return 0;
-}
-
-SEC("tracepoint/syscalls/sys_enter_read")
-int io_trace_enter_read(struct trace_event_raw_sys_enter *ctx) {
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct io_task_stats *task = bpf_map_lookup_elem(&io_task_stats_map,&pid);
- if(!task){
- struct io_task_stats init_task;
- memset(&init_task,0,sizeof(struct io_task_stats));
- // struct task_info_simple info = {
- // .pid = pid,
- // .tgid = tgid
- // };
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- //init_task.info = info;
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- init_task.last_clear_time = now;
- init_task.read_count = 1;
- init_task.write_count = 0;
- bpf_map_update_elem(&io_task_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->read_count += 1;
- if(task->info.pid == 0)
- {
- task->info.pid = pid;
- task->info.tgid = tgid;
- }
- bpf_map_update_elem(&io_task_stats_map,&pid,task,BPF_ANY);
- io_task_compare_and_commit(task);
- }
-
- struct io_process_stats *process = bpf_map_lookup_elem(&io_process_stats_map,&tgid);
- if(!process){
- struct io_process_stats init_process;
- memset(&init_process,0,sizeof(struct io_process_stats));
- init_process.tgid = tgid;
- init_process.last_clear_time = now;
- init_process.read_count = 1;
- init_process.write_count = 0;
- bpf_map_update_elem(&io_process_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->read_count += 1;
- bpf_map_update_elem(&io_process_stats_map,&tgid,process,BPF_ANY);
- io_process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-SEC("tracepoint/syscalls/sys_enter_write")
-int io_trace_enter_write(struct trace_event_raw_sys_enter *ctx) {
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct io_task_stats *task = bpf_map_lookup_elem(&io_task_stats_map,&pid);
- if(!task){
- struct io_task_stats init_task;
- memset(&init_task,0,sizeof(struct io_task_stats));
- // struct task_info_simple info = {
- // .pid = pid,
- // .tgid = tgid
- // };
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- // init_task.info = info;
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- init_task.last_clear_time = now;
- init_task.write_count = 1;
- init_task.read_count = 0;
- bpf_map_update_elem(&io_task_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->write_count += 1;
- if(task->info.pid == 0)
- {
- task->info.pid = pid;
- task->info.tgid = tgid;
- }
- bpf_map_update_elem(&io_task_stats_map,&pid,task,BPF_ANY);
- io_task_compare_and_commit(task);
- }
-
- struct io_process_stats *process = bpf_map_lookup_elem(&io_process_stats_map,&tgid);
- if(!process){
- struct io_process_stats init_process;
- memset(&init_process,0,sizeof(struct io_process_stats));
- init_process.tgid = tgid;
- init_process.last_clear_time = now;
- init_process.write_count = 1;
- init_process.read_count = 0;
- bpf_map_update_elem(&io_process_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->write_count += 1;
- bpf_map_update_elem(&io_process_stats_map,&tgid,process,BPF_ANY);
- io_process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-
-SEC("tracepoint/sched/sched_process_exit")
-int BPF_PROG(handle_io_task_exit){
- u64 pid_tgid = bpf_get_current_pid_tgid();
- u32 pid = pid_tgid & 0xFFFFFFFF;
- u32 tgid = pid_tgid >> 32;
- if(pid == 0 || tgid == 0)
- return 0;
-
- if(bpf_map_lookup_elem(&io_task_stats_map,&pid) != NULL)
- bpf_map_delete_elem(&io_task_stats_map,&pid);
-}
-
-
-
diff --git a/bpf/mm_leak.bpf.c b/bpf/mm_leak.bpf.c
deleted file mode 100644
index f119c85..0000000
--- a/bpf/mm_leak.bpf.c
+++ /dev/null
@@ -1,378 +0,0 @@
-#include "vmlinux.h"
-#include
-#include
-#include
-#include "mm_event.h"
-
-const volatile u64 sample_rate = 2;
-const volatile size_t page_size = 4096;
-
-const volatile u64 stack_flags = 0;
-
-
-char LICENSE[] SEC("license") = "Dual BSD/GPL";
-
-// æ¯ä¸ªtask分é…的内å˜å¤§å°ï¼Œpid——size
-DEFINE_BPF_MAP(sizes,BPF_MAP_TYPE_HASH,10240,u32,u64);
-// 分é…的内å˜å—的信æ¯ï¼Œaddress——info
-DEFINE_BPF_MAP(allocs,BPF_MAP_TYPE_HASH,100000,u64,struct alloc_info);
-//
-DEFINE_BPF_MAP(combined_allocs,BPF_MAP_TYPE_HASH,10240,u64,union combined_alloc_info);
-// taskçš„ç”¨æˆ·æ€æŒ‡é’ˆå˜é‡
-DEFINE_BPF_MAP(memptrs,BPF_MAP_TYPE_HASH,10240,u64,u64);
-// æ ˆå›žæº¯ä¿¡æ¯
-struct {
- __uint(type, BPF_MAP_TYPE_STACK_TRACE);
- __type(key, u32);
- __type(value, 128 * sizeof(u64));
- __uint(max_entries,10240);
-} stack_traces SEC(".maps");
-
-// struct {
-// __uint(type, BPF_MAP_TYPE_STACK_TRACE);
-// __type(key, u32);
-// __type(value, 128 * sizeof(u64));
-// __uint(max_entries,10240);
-// } stack_traces_usr SEC(".maps");
-
-static __always_inline void *
-bpf_map_lookup_or_try_init(void *map, const void *key, const void *init)
-{
- void *val;
- long err;
-
- val = bpf_map_lookup_elem(map, key);
- if (val)
- return val;
-
- err = bpf_map_update_elem(map, key, init, BPF_NOEXIST);
- if (err && err < 0)
- return 0;
-
- return bpf_map_lookup_elem(map, key);
-}
-
-static union combined_alloc_info initial_cinfo;
-
-// 当å‘生内å˜åˆ†é…æ—¶ï¼Œé€šè¿‡å¢žåŠ å †æ ˆå¯¹åº”çš„å†…å˜åˆ†é…ä¿¡æ¯ï¼ˆå†…å˜å¤§å°å’Œåˆ†é…次数)
-static void update_statistics_add(u64 stack_id, u64 sz)
-{
- // 查找或åˆå§‹åŒ–一个è”åˆä½“ combined_alloc_info 结构体
- // è¯¥ç»“æž„ä½“åŒ…å«æ€»å†…å˜å¤§å° (total_size) å’Œåˆ†é…æ¬¡æ•° (number_of_allocs)
- // 如果 stack_id 对应的记录ä¸å˜åœ¨ï¼Œåˆ™åˆå§‹åŒ–为 initial_cinfo
- union combined_alloc_info *existing_cinfo;
- existing_cinfo = bpf_map_lookup_or_try_init(&combined_allocs, &stack_id, &initial_cinfo);
-
- if (!existing_cinfo)
- return;
-
- // è¿™é‡Œçš„å¢žåŠ å’Œä¸‹é¢çš„å‡å°‘ï¼Œè¿™æ ·çš„æž„å»ºä¸ªunionä¹‹åŽæ“作都是为了ä¿è¯åŽŸåæ“ä½œå’Œå®‰å…¨æ€§
-
- // 构建一个增é‡çš„ combined_alloc_info 结构体
- // 增é‡çš„ total_size 为当å‰åˆ†é…的内å˜å¤§å° (sz),
- // 增é‡çš„ number_of_allocs 为 1,表示本次分é…
- const union combined_alloc_info incremental_cinfo = {
- .total_size = sz, // 增é‡å†…å˜å¤§å°
- .number_of_allocs = 1 // 增é‡å†…å˜åˆ†é…次数
- };
-
- // 这里使用 __sync_fetch_and_add æ¥ä¿è¯å¤šçº¿ç¨‹çŽ¯å¢ƒä¸çš„åŽŸåæ“ä½œ
- __sync_fetch_and_add(&existing_cinfo->bits, incremental_cinfo.bits);
-}
-
-// 当å‘生内å˜é‡Šæ”¾æ—¶ï¼Œé€šè¿‡å‡å°‘å †æ ˆå¯¹åº”çš„å†…å˜åˆ†é…ä¿¡æ¯ï¼ˆå†…å˜å¤§å°å’Œåˆ†é…次数)
-static void update_statistics_del(u64 stack_id, u64 sz)
-{
- // 查找 stack_id 对应的记录
- union combined_alloc_info *existing_cinfo;
- existing_cinfo = bpf_map_lookup_elem(&combined_allocs, &stack_id);
-
- if (!existing_cinfo) {
- bpf_printk("failed to lookup combined allocs\n");
- return;
- }
-
- // 构建一个å‡å°‘çš„ combined_alloc_info 结构体
- // å‡å°‘çš„ total_size 为当å‰é‡Šæ”¾çš„内å˜å¤§å° (sz),
- // å‡å°‘çš„ number_of_allocs 为 1,表示本次释放
- const union combined_alloc_info decremental_cinfo = {
- .total_size = sz, // å‡å°‘内å˜å¤§å°
- .number_of_allocs = 1 // å‡å°‘内å˜åˆ†é…次数
- };
-
- // 使用 __sync_fetch_and_sub æ¥è¿›è¡ŒåŽŸå凿³•æ“作
- __sync_fetch_and_sub(&existing_cinfo->bits, decremental_cinfo.bits);
-}
-
-// 在内å˜åˆ†é…进入时被调用,记录当å‰task分é…的内å˜å¤§å°
-static int gen_alloc_enter(u64 size)
-{
- if (sample_rate > 1) {
- if (bpf_ktime_get_ns() % sample_rate != 0)
- return 0;
- }
-
- u32 pid = bpf_get_current_pid_tgid() >> 32;
- bpf_map_update_elem(&sizes,&pid,&size,BPF_ANY);
-
- return 0;
-}
-
-// 在内å˜åˆ†é…退出时被调用,记录被分é…çš„å†…å˜æœ¬èº«çš„ä¿¡æ¯ï¼Œæ¯”å¦‚å¯¹åº”çš„å †æ ˆid,大å°ï¼Œåˆ†é…æ—¶é—´
-static int gen_alloc_exit2(void *ctx, u64 address)
-{
- u32 pid = bpf_get_current_pid_tgid() >> 32;
- struct alloc_info info;
-
- u64* size = bpf_map_lookup_elem(&sizes, &pid);
- if (!size)
- return 0; // missed alloc entry
-
- __builtin_memset(&info, 0, sizeof(info));
-
- info.size = *size;
- bpf_map_delete_elem(&sizes, &pid);
-
- if (address != 0) {
- info.timestamp_ns = bpf_ktime_get_ns();
-
- //info.stack_id = bpf_get_stackid(ctx, &stack_traces, stack_flags);
- // info.stack_id = bpf_get_stackid(ctx, &stack_traces, 0 | BPF_F_FAST_STACK_CMP | BPF_F_USER_STACK);
- info.stack_id = bpf_get_stackid(ctx, &stack_traces, 0 | BPF_F_FAST_STACK_CMP);
-
- int res = bpf_map_update_elem(&allocs, &address, &info, BPF_ANY);
- if(res != 0)
- {
- bpf_printk("allocs update failed, error code is %i\n",res);
- }
-
- update_statistics_add(info.stack_id, info.size);
- //update_statistics_add(info.stack_id_usr,info.size);
- }
-
- return 0;
-}
-
-static int gen_alloc_exit(struct pt_regs *ctx) {
- return gen_alloc_exit2(ctx, PT_REGS_RC(ctx));
-}
-
-// 内å˜é‡Šæ”¾æ—¶å€™æ¸…ç†ç›¸å…³çš„内å˜å—的记录
-static int gen_free_enter(const void *address)
-{
- const u64 addr = (u64)address;
-
- const struct alloc_info *info = bpf_map_lookup_elem(&allocs, &addr);
- if (!info)
- return 0;
-
- bpf_map_delete_elem(&allocs, &addr);
- update_statistics_del(info->stack_id, info->size);
-
- return 0;
-}
-
-SEC("uprobe")
-int BPF_KPROBE(malloc_enter, u64 size)
-{
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(malloc_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(free_enter, void *address)
-{
- return gen_free_enter(address);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(calloc_enter, u64 nmemb, u64 size)
-{
- return gen_alloc_enter(nmemb * size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(calloc_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(realloc_enter, void *ptr, u64 size)
-{
- gen_free_enter(ptr);
-
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(realloc_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(mmap_enter, void *address, u64 size)
-{
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(mmap_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(munmap_enter, void *address)
-{
- return gen_free_enter(address);
-}
-
-// 记录用户æ€å†…å˜åˆ†é…ä¿¡æ¯
-SEC("uprobe")
-int BPF_KPROBE(posix_memalign_enter, void **memptr, size_t alignment, size_t size)
-{
- // å°†ä¼ å…¥çš„ memptr(指å‘内å˜çš„æŒ‡é’ˆï¼‰è½¬æ¢ä¸º 64 使— ç¬¦å·æ•´æ•°ç±»åž‹
- const u64 memptr64 = (u64)(size_t)memptr;
- const u64 pid = bpf_get_current_pid_tgid() >> 32;
- bpf_map_update_elem(&memptrs, &pid, &memptr64, BPF_ANY);
-
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(posix_memalign_exit)
-{
- const u64 pid = bpf_get_current_pid_tgid() >> 32;
- u64 *memptr64;
- void *addr;
-
- // 清ç†ç”¨æˆ·æ€çš„内å˜ä¿¡æ¯
- memptr64 = bpf_map_lookup_elem(&memptrs, &pid);
- if (!memptr64)
- return 0;
-
- bpf_map_delete_elem(&memptrs, &pid);
-
- if (bpf_probe_read_user(&addr, sizeof(void*), (void*)(size_t)*memptr64))
- return 0;
-
- const u64 addr64 = (u64)(size_t)addr;
-
- return gen_alloc_exit2(ctx, addr64);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(aligned_alloc_enter, size_t alignment, size_t size)
-{
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(aligned_alloc_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(valloc_enter, size_t size)
-{
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(valloc_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(memalign_enter, size_t alignment, size_t size)
-{
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(memalign_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("uprobe")
-int BPF_KPROBE(pvalloc_enter, size_t size)
-{
- return gen_alloc_enter(size);
-}
-
-SEC("uretprobe")
-int BPF_KRETPROBE(pvalloc_exit)
-{
- return gen_alloc_exit(ctx);
-}
-
-SEC("tracepoint/kmem/kmalloc")
-int memleak__kmalloc(struct trace_event_raw_kmalloc *ctx){
- const void *ptr = BPF_CORE_READ(ctx, ptr);
- u64 bytes_alloc = BPF_CORE_READ(ctx, bytes_alloc);
-
- gen_alloc_enter(bytes_alloc);
-
- return gen_alloc_exit2(ctx, (u64)ptr);
-}
-
-SEC("tracepoint/kmem/kfree")
-int memleak__kfree(struct trace_event_raw_kfree *ctx){
- const void *ptr = BPF_CORE_READ(ctx, ptr);
-
- return gen_free_enter(ptr);
-}
-
-SEC("tracepoint/kmem/kmem_cache_alloc")
-int memleak__kmem_cache_alloc_node(struct trace_event_raw_kmem_cache_alloc *ctx){
- const void *ptr = BPF_CORE_READ(ctx, ptr);
- u64 bytes_alloc = BPF_CORE_READ(ctx, bytes_alloc);
-
- gen_alloc_enter(bytes_alloc);
-
- return gen_alloc_exit2(ctx, (u64)ptr);
-}
-
-SEC("tracepoint/kmem/kmem_cache_free")
-int memleak__kmem_cache_free(struct trace_event_raw_kmem_cache_free *ctx){
- const void *ptr = BPF_CORE_READ(ctx, ptr);
-
- return gen_free_enter(ptr);
-}
-
-SEC("tracepoint/kmem/mm_page_alloc")
-int memleak__mm_page_alloc(struct trace_event_raw_mm_page_alloc *ctx){
- gen_alloc_enter(page_size << ctx->order);
-
- return gen_alloc_exit2(ctx, ctx->pfn);
-}
-
-SEC("tracepoint/kmem/mm_page_free")
-int memleak__mm_page_free(struct trace_event_raw_mm_page_free *ctx)
-{
- return gen_free_enter((void *)ctx->pfn);
-}
-
-SEC("tracepoint/percpu/percpu_alloc_percpu")
-int memleak__percpu_alloc_percpu(struct trace_event_raw_percpu_alloc_percpu *ctx)
-{
- gen_alloc_enter(ctx->bytes_alloc);
-
- return gen_alloc_exit2(ctx, (u64)(ctx->ptr));
-}
-
-SEC("tracepoint/percpu/percpu_free_percpu")
-int memleak__percpu_free_percpu(struct trace_event_raw_percpu_free_percpu *ctx)
-{
- return gen_free_enter(ctx->ptr);
-}
\ No newline at end of file
diff --git a/bpf/mm_stats.bpf.c b/bpf/mm_stats.bpf.c
deleted file mode 100644
index 1d0c2cb..0000000
--- a/bpf/mm_stats.bpf.c
+++ /dev/null
@@ -1,638 +0,0 @@
-#include "vmlinux.h"
-#include
-#include
-#include
-
-#include "mm_event.h"
-
-char LICENSE[] SEC("license") = "Dual BSD/GPL";
-
-// 统计整体数æ®çš„map
-DEFINE_BPF_MAP(task_mm_stats_map,BPF_MAP_TYPE_HASH,MAX_ENTRIES,u32,struct task_mm_stats);
-DEFINE_BPF_MAP(process_mm_stats_map,BPF_MAP_TYPE_HASH,4096,u32,struct process_mm_stats);
-
-// 统计超出阈值数æ®çš„map
-// 通过计算哈希值之åŽï¼Œä»¥å“ˆå¸Œå€¼ä¸ºå¥ï¼Œå˜pid或tgid,首个数å—表示当å‰bucketæœ‰å‡ ä¸ªæœ‰æ•ˆçš„pid
-DEFINE_BPF_MAP(task_mm_occupied_list,BPF_MAP_TYPE_ARRAY,GLOBAL_HASH_SIZE,u32,struct data_store);
-DEFINE_BPF_MAP(process_mm_occupied_list,BPF_MAP_TYPE_ARRAY,GLOBAL_HASH_SIZE,u32,struct data_store);
-
-// 用户æ€ä¼ 递阈值上æ¥ï¼Œä¸€ä¸ªå˜task的,一个å˜processçš„
-DEFINE_BPF_MAP(threhold_map,BPF_MAP_TYPE_ARRAY,2,u32,struct mm_threhold);
-
-// çŽ¯å½¢ç¼“å†²åŒºä¼ é€’æ•°æ®
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 256 * 1024);
-} task_mm_stats_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 128 * 1024);
-} process_mm_stats_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 256 * 1024);
-} oom_event_buffer SEC(".maps");
-
-static const u32 zero = 0;
-static const u32 one = 1;
-
-SEC("kprobe/oom_kill_process")
-int BPF_KPROBE(oom_kill_process, struct oom_control *oc, const char *message)
-{
- struct oom_event *buff;
- buff = bpf_ringbuf_reserve(&oom_event_buffer, sizeof(struct oom_event), 0);
- if(!buff){
- bpf_printk("the oom_event_buff is full\n");
- return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- buff->kill_time = now;
-
- struct task_struct *task;
- bpf_probe_read(&task, sizeof(task), &oc->chosen);
- bpf_probe_read(&buff->killed_id, sizeof(buff->killed_id), &task->pid);
-
- // 获å–被æ€è¿›ç¨‹çš„命令å (comm)
- bpf_probe_read(&buff->comm, sizeof(buff->comm), &task->comm);
-
- buff->trigger_id = bpf_get_current_pid_tgid() & 0xFFFFFFFF;
- bpf_ringbuf_submit(buff, 0);
-
- return 0;
-}
-
-static u32 get_hash_index(u32 id){
- return id % GLOBAL_HASH_SIZE;
-}
-
-static int task_compare_and_commit(struct task_mm_stats *task){
- struct mm_threhold *threhold = bpf_map_lookup_elem(&threhold_map,&zero);
- if(!threhold){
- bpf_printk("mm_threhold map is not init\n");
- return 0;
- }
-
- //bpf_printk("the current pid is %u\n",task->info.pid);
-
- u64 now = bpf_ktime_get_ns();
- if(task->last_clear_time + threhold->time_window < now){
- task->kmem_count = 0;
- task->vmem_count = 0;
- task->slab_count = 0;
- task->last_clear_time = now;
- task->already_output = 0;
- bpf_map_update_elem(&task_mm_stats_map,&task->info.pid,task,BPF_ANY);
- return 0;
- }
-
- if(task->kmem_count >= threhold->kmem_threhold || task->slab_count >= threhold->slab_threhold || task->vmem_count >= threhold->vmem_threhold){
- if(task->already_output != 0)
- return 0;
- struct task_mm_stats *buff = bpf_ringbuf_reserve(&task_mm_stats_buffer, sizeof(struct task_mm_stats), 0);
- if(!buff){
- bpf_printk("task_mm_stats_buff is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct task_mm_stats));
- buff->info.pid = task->info.pid;
- buff->info.tgid = task->info.tgid;
- bpf_probe_read_str(buff->info.comm,sizeof(task->info.comm),task->info.comm);
- buff->kmem_count = task->kmem_count;
- buff->slab_count = task->slab_count;
- buff->vmem_count = task->vmem_count;
- bpf_ringbuf_submit(buff,0);
-
- task->already_output = 1;
- bpf_map_update_elem(&task_mm_stats_map,&task->info.pid,task,BPF_ANY);
- }
- return 0;
-}
-
-static int process_compare_and_commit(struct process_mm_stats *process){
- struct mm_threhold *threhold = bpf_map_lookup_elem(&threhold_map,&one);
- if(!threhold){
- bpf_printk("mm_threhold map is not init\n");
- return 0;
- }
-
- u64 now = bpf_ktime_get_ns();
- if(process->last_clear_time + threhold->time_window < now){
- process->kmem_count = 0;
- process->vmem_count = 0;
- process->slab_count = 0;
- process->last_clear_time = now;
- process->already_output = 0;
- bpf_map_update_elem(&process_mm_stats_map,&process->tgid,process,BPF_ANY);
- return 0;
- }
-
- if(process->kmem_count >= threhold->kmem_threhold || process->slab_count >= threhold->slab_threhold || process->vmem_count >= threhold->vmem_threhold){
- if(process->already_output != 0)
- return 0;
- struct process_mm_stats *buff = bpf_ringbuf_reserve(&process_mm_stats_buffer, sizeof(struct process_mm_stats), 0);
- if(!buff){
- bpf_printk("process_mm_stats_buff is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct process_mm_stats));
- buff->tgid = process->tgid;
- buff->kmem_count = process->kmem_count;
- buff->slab_count = process->slab_count;
- buff->vmem_count = process->vmem_count;
- bpf_ringbuf_submit(buff,0);
-
- process->already_output = 1;
- bpf_map_update_elem(&process_mm_stats_map,&process->tgid,process,BPF_ANY);
- }
- return 0;
-}
-
-// operation 0 is insert, 1 is delete
-static int update_mm_hash_map(u32 map_index,u32 hash_index,u32 value,u32 operation){
- if(map_index == 0){
- struct data_store *task = bpf_map_lookup_elem(&task_mm_occupied_list,&hash_index);
- if(operation == 0){
- if(!task){
- struct data_store data;
- data.list[0] = 1;
- data.list[1] = value;
- bpf_map_update_elem(&task_mm_occupied_list,&hash_index,&data,BPF_ANY);
- }
- else{
- if(task->list[0] < GLOBAL_HASH_BUCKET_SIZE){
- task->list[0] += 1;
- u32 i = task->list[0];
- task->list[i] = value;
- bpf_map_update_elem(&task_mm_occupied_list,&hash_index,task,BPF_ANY);
- }
- else{
- bpf_printk("The mm hash_list hash bucket is full\n");
- return -1;
- }
- }
- }
- else if(operation == 1){
- if(!task){
- struct data_store data;
- data.list[0] = 0;
- bpf_map_update_elem(&task_mm_occupied_list,&hash_index,&data,BPF_ANY);
- }
- else{
- if(task->list[0] > 0){
- u32 fin = task->list[0];
- for(u32 i=1;i fin)
- break;
- if(task->list[i] == value){
- // 和最åŽä¸€ä¸ªæœ‰æ•ˆå€¼äº¤æ¢
- task->list[i] = task->list[fin];
- task->list[0] -= 1;
- break;
- }
- }
- }
- bpf_map_update_elem(&task_mm_occupied_list,&hash_index,task,BPF_ANY);
- }
- }
- else{
- bpf_printk("mm hash_list operation index is invalid \n");
- }
- }else if(map_index == 1){
- struct data_store *process = bpf_map_lookup_elem(&process_mm_occupied_list,&hash_index);
- if(operation == 0){
- if(!process){
- struct data_store data;
- data.list[0] = 1;
- data.list[1] = value;
- bpf_map_update_elem(&process_mm_occupied_list,&hash_index,&data,BPF_ANY);
- }
- else{
- if(process->list[0] < GLOBAL_HASH_BUCKET_SIZE){
- process->list[0] += 1;
- u32 i = process->list[0];
- process->list[i] = value;
- bpf_map_update_elem(&process_mm_occupied_list,&hash_index,process,BPF_ANY);
- }
- else{
- bpf_printk("The mm hash_list hash bucket is full\n");
- return -1;
- }
- }
- }
- else if(operation == 1){
- if(!process){
- struct data_store data;
- data.list[0] = 0;
- bpf_map_update_elem(&process_mm_occupied_list,&hash_index,&data,BPF_ANY);
- }
- else{
- if(process->list[0] > 0){
- u32 fin = process->list[0];
- for(u32 i=1;i fin)
- break;
- if(process->list[i] == value){
- // 和最åŽä¸€ä¸ªæœ‰æ•ˆå€¼äº¤æ¢
- process->list[i] = process->list[fin];
- process->list[0] -= 1;
- break;
- }
- }
- }
- bpf_map_update_elem(&process_mm_occupied_list,&hash_index,process,BPF_ANY);
- }
- }
- else{
- bpf_printk("mm hash_list operation index is invalid \n");
- }
- }else{
- bpf_printk("mm hash_map map_index is invalid \n");
- }
-
- return 0;
-}
-
-// SEC("raw_tp/sched_wakeup_new")
-// int BPF_PROG(mm_sched_wakeup_new, struct task_struct *p){
-// u32 pid = BPF_CORE_READ(p,pid);
-// if(pid == 0)
-// return 0;
-// u32 tgid = BPF_CORE_READ(p,tgid);
-// u32 cpu_id = bpf_get_smp_processor_id();
-// struct task_mm_stats *task_use = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
-// if(!task_use){
-// struct task_info_simple info = init_task_info(p,cpu_id);
-// struct task_mm_stats init_task = {
-// .task_info = info
-// };
-// bpf_map_update_elem(&task_mm_stats_map, &pid, &init_task, BPF_ANY);
-// }
-
-// return 0;
-// }
-
-// SEC("raw_tp/sched_wakeup")
-// int BPF_PROG(mm_sched_wakeup, struct task_struct *p)
-// {
-// u32 pid = BPF_CORE_READ(p,pid);
-// if(pid == 0)
-// return 0;
-// u32 tgid = BPF_CORE_READ(p,tgid);
-// u32 cpu_id = bpf_get_smp_processor_id();
-// struct task_mm_stats *task_use = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
-// if(!task_use){
-// struct task_info_simple info = init_task_info(p,cpu_id);
-// struct task_mm_stats init_task = {
-// .task_info = info,
-// };
-// bpf_map_update_elem(&task_mm_stats_map, &pid, &init_task, BPF_ANY);
-// }
-// else{
-// if(task_use->task_info.tgid == 0 || task_use->task_info.pid == 0)
-// {
-// task_use->task_info.tgid = tgid;
-// task_use->task_info.pid = pid;
-// bpf_map_update_elem(&task_mm_stats_map,&pid,task_use,BPF_ANY);
-// }
-// }
-
-// return 0;
-// }
-
-// SEC("tracepoint/sched/sched_process_fork")
-// int mm_task_create(struct trace_event_raw_sched_process_fork *ctx){
-// u32 pid_new = ctx->child_pid;
-// u32 cpu_id = bpf_get_smp_processor_id();
-// struct task_cpu_usage *tk = bpf_map_lookup_elem(&task_cpu_usage_map,&pid_new);
-// if(!tk){
-// struct task_info_simple info = {
-// .pid = pid_new,
-// .cpu_id = cpu_id
-// };
-// bpf_probe_read_kernel_str(info.comm,sizeof(ctx->child_comm),ctx->child_comm);
-// struct task_cpu_usage init_task = {
-// .task_info = info,
-// .in_kernel = false
-// };
-// bpf_map_update_elem(&task_cpu_usage_map,&pid_new,&init_task,BPF_ANY);
-// }
-// return 0;
-// }
-
-static struct task_mm_stats init_task_mm(u32 pid,u32 tgid){
- struct task_info_simple info = {
- .pid = pid,
- .tgid = tgid
- };
- struct task_mm_stats init_task;
- init_task.info = info;
- return init_task;
-}
-
-SEC("tracepoint/kmem/kmalloc")
-int trace_kmalloc(struct trace_event_raw_kmem_alloc *ctx){
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct task_mm_stats *task = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
- if(!task){
- struct task_mm_stats init_task;
- memset(&init_task, 0, sizeof(struct task_mm_stats));
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- init_task.kmem_count = 1;
- init_task.last_clear_time = now;
- bpf_map_update_elem(&task_mm_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->kmem_count += 1;
- bpf_map_update_elem(&task_mm_stats_map,&pid,task,BPF_ANY);
- task_compare_and_commit(task);
- }
-
- struct process_mm_stats *process = bpf_map_lookup_elem(&process_mm_stats_map,&tgid);
- if(!process){
- struct process_mm_stats init_process = {
- .tgid = tgid,
- .kmem_count = 1,
- .last_clear_time = now,
- .vmem_count = 0,
- .slab_count = 0
- };
-
- bpf_map_update_elem(&process_mm_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->kmem_count += 1;
- bpf_map_update_elem(&process_mm_stats_map,&tgid,process,BPF_ANY);
- process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-SEC("tracepoint/kmem/kfree")
-int trace_kfree(struct trace_event_raw_kmem_kfree *ctx){
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct task_mm_stats *task = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
- if(!task){
- struct task_mm_stats init_task;
- memset(&init_task, 0, sizeof(struct task_mm_stats));
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- init_task.kmem_count = 1;
- init_task.last_clear_time = now;
- bpf_map_update_elem(&task_mm_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->kmem_count += 1;
- bpf_map_update_elem(&task_mm_stats_map,&pid,task,BPF_ANY);
- task_compare_and_commit(task);
- }
-
- struct process_mm_stats *process = bpf_map_lookup_elem(&process_mm_stats_map,&tgid);
- if(!process){
- struct process_mm_stats init_process = {
- .tgid = tgid,
- .kmem_count = 1,
- .last_clear_time = now,
- .vmem_count = 0,
- .slab_count = 0
- };
- bpf_map_update_elem(&process_mm_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->kmem_count += 1;
- bpf_map_update_elem(&process_mm_stats_map,&tgid,process,BPF_ANY);
- process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-SEC("tracepoint/kmem/mm_page_alloc")
-int BPF_PROG(trace_page_alloc){
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct task_mm_stats *task = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
- if(!task){
- struct task_mm_stats init_task;
- memset(&init_task, 0, sizeof(struct task_mm_stats));
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- init_task.vmem_count = 1;
- init_task.last_clear_time = now;
- bpf_map_update_elem(&task_mm_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->vmem_count += 1;
- bpf_map_update_elem(&task_mm_stats_map,&pid,task,BPF_ANY);
- task_compare_and_commit(task);
- }
-
- struct process_mm_stats *process = bpf_map_lookup_elem(&process_mm_stats_map,&tgid);
- if(!process){
- struct process_mm_stats init_process = {
- .tgid = tgid,
- .kmem_count = 0,
- .last_clear_time = now,
- .vmem_count = 1,
- .slab_count = 0
- };
- bpf_map_update_elem(&process_mm_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->vmem_count += 1;
- bpf_map_update_elem(&process_mm_stats_map,&tgid,process,BPF_ANY);
- process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-SEC("tracepoint/kmem/mm_page_free")
-int BPF_PROG(trace_page_free){
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct task_mm_stats *task = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
- if(!task){
- struct task_mm_stats init_task;
- memset(&init_task, 0, sizeof(struct task_mm_stats));
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- init_task.vmem_count = 1;
- init_task.last_clear_time = now;
- bpf_map_update_elem(&task_mm_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->vmem_count += 1;
- bpf_map_update_elem(&task_mm_stats_map,&pid,task,BPF_ANY);
- task_compare_and_commit(task);
- }
-
- struct process_mm_stats *process = bpf_map_lookup_elem(&process_mm_stats_map,&tgid);
- if(!process){
- struct process_mm_stats init_process = {
- .tgid = tgid,
- .kmem_count = 0,
- .last_clear_time = now,
- .vmem_count = 1,
- .slab_count = 0
- };
- bpf_map_update_elem(&process_mm_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->vmem_count += 1;
- bpf_map_update_elem(&process_mm_stats_map,&tgid,process,BPF_ANY);
- process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-SEC("tracepoint/kmem/kmem_cache_alloc")
-int BPF_PROG(trace_cache_alloc){
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct task_mm_stats *task = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
- if(!task){
- struct task_mm_stats init_task;
- memset(&init_task, 0, sizeof(struct task_mm_stats));
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- init_task.slab_count = 1;
- init_task.last_clear_time = now;
- bpf_map_update_elem(&task_mm_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->slab_count += 1;
- bpf_map_update_elem(&task_mm_stats_map,&pid,task,BPF_ANY);
- task_compare_and_commit(task);
- }
-
- struct process_mm_stats *process = bpf_map_lookup_elem(&process_mm_stats_map,&tgid);
- if(!process){
- struct process_mm_stats init_process = {
- .tgid = tgid,
- .kmem_count = 0,
- .last_clear_time = now,
- .vmem_count = 0,
- .slab_count = 1
- };
- bpf_map_update_elem(&process_mm_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->slab_count += 1;
- bpf_map_update_elem(&process_mm_stats_map,&tgid,process,BPF_ANY);
- process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-
-SEC("tracepoint/kmem/kmem_cache_free")
-int BPF_PROG(trace_cache_free){
- u64 id = bpf_get_current_pid_tgid();
- u32 tgid = id >> 32;
- u32 pid = id & 0xFFFFFFFF;
- u64 now = bpf_ktime_get_ns();
-
- if(pid == 0)
- return 0;
-
- struct task_mm_stats *task = bpf_map_lookup_elem(&task_mm_stats_map,&pid);
- if(!task){
- struct task_mm_stats init_task;
- memset(&init_task, 0, sizeof(struct task_mm_stats));
- init_task.info.pid = pid;
- init_task.info.tgid = tgid;
- bpf_get_current_comm(init_task.info.comm,sizeof(init_task.info.comm));
- init_task.slab_count = 1;
- init_task.last_clear_time = now;
- bpf_map_update_elem(&task_mm_stats_map,&pid,&init_task,BPF_ANY);
- }
- else{
- task->slab_count += 1;
- bpf_map_update_elem(&task_mm_stats_map,&pid,task,BPF_ANY);
- task_compare_and_commit(task);
- }
-
- struct process_mm_stats *process = bpf_map_lookup_elem(&process_mm_stats_map,&tgid);
- if(!process){
- struct process_mm_stats init_process = {
- .tgid = tgid,
- .kmem_count = 0,
- .last_clear_time = now,
- .vmem_count = 0,
- .slab_count = 1
- };
- bpf_map_update_elem(&process_mm_stats_map,&tgid,&init_process,BPF_ANY);
- }
- else{
- process->slab_count += 1;
- bpf_map_update_elem(&process_mm_stats_map,&tgid,process,BPF_ANY);
- process_compare_and_commit(process);
- }
-
- return 0;
-}
-
-SEC("tracepoint/sched/sched_process_exit")
-int BPF_PROG(handle_mm_task_exit){
- u64 pid_tgid = bpf_get_current_pid_tgid();
- u32 pid = pid_tgid & 0xFFFFFFFF;
- u32 tgid = pid_tgid >> 32;
- if(pid == 0 || tgid == 0)
- return 0;
-
- if(bpf_map_lookup_elem(&task_mm_stats_map,&pid) != NULL){
- bpf_map_delete_elem(&task_mm_stats_map,&pid);
- }
-
- // if(bpf_map_lookup_elem(&process_map,&tgid) == NULL && bpf_map_lookup_elem(&process_kids_map,&tgid) == NULL){
- // bpf_map_delete_elem(&process_mm_stats_map,&tgid);
- // }
- return 0;
-}
-
-
-
diff --git a/bpf/net_stats.bpf.c b/bpf/net_stats.bpf.c
deleted file mode 100644
index d1d9d71..0000000
--- a/bpf/net_stats.bpf.c
+++ /dev/null
@@ -1,559 +0,0 @@
-#include "vmlinux.h"
-#include
-#include
-#include
-#include
-
-#include "net_event.h"
-
-char LICENSE[] SEC("license") = "Dual BSD/GPL";
-
-static u32 target_tgid = 0;
-
-const u32 zero = 0;
-
-static u64 tcptop_send_threhold = 5 * 1024;// 5kB
-static u64 tcptop_recv_threhold = 10 * 1024;// 10kB
-
-static u32 filiter_id = 0;
-
-DEFINE_BPF_MAP(net_latency_start,BPF_MAP_TYPE_HASH,4096,struct sock *,struct task_public_info);
-DEFINE_BPF_MAP(tcprtt_map,BPF_MAP_TYPE_ARRAY,1,u32,struct tcprtt_perf_data);
-
-// tcp_top的map
-DEFINE_BPF_MAP(ipv4_top_map,BPF_MAP_TYPE_HASH,1024,struct ipv4_key_t,struct recv_send_bytes);
-DEFINE_BPF_MAP(ipv6_top_map,BPF_MAP_TYPE_HASH,1024,struct ipv6_key_t,struct recv_send_bytes);
-DEFINE_BPF_MAP(top_sock_store,BPF_MAP_TYPE_HASH,1024,u32,struct sock *);
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 512 * 1024);
-} net_latency_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 128 * 1024);
-} tcprtt_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 1024 * 1024);
-} tcptop_buffer SEC(".maps");
-
-struct {
- __uint(type, BPF_MAP_TYPE_RINGBUF);
- __uint(max_entries, 1024 * 1024);
-} tcpretrans_buffer SEC(".maps");
-
-static int net_trace_connect(struct sock *sk)
-{
- u64 pid_tgid = bpf_get_current_pid_tgid();
- u32 pid = pid_tgid & 0xFFFFFFFF;
- u32 tgid = pid_tgid >> 32;
- u64 now = bpf_ktime_get_ns();
-
- // if(tgid == 0 || tgid != target_tgid)
- // return 0;
-
- if(tgid == 0)
- return 0;
-
- struct task_public_info info = {
- .pid = pid,
- .tgid = tgid,
- .time = now
- };
- bpf_get_current_comm(&info.comm,sizeof(info.comm));
-
- bpf_map_update_elem(&net_latency_start,&sk,&info,BPF_ANY);
- return 0;
-}
-
-static int handle_tcp_rcv_state_process(struct sock *sk)
-{
- struct task_public_info *info;
- struct tcp_net_latency *latency;
- u64 delta;
- u64 now;
-
- if(BPF_CORE_READ(sk, __sk_common.skc_state) != TCP_SYN_SENT)
- return 0;
-
- info = bpf_map_lookup_elem(&net_latency_start,&sk);
- if(!info)
- return 0;
-
- now = bpf_ktime_get_ns();
- delta = now - info->time;
-
- latency = bpf_ringbuf_reserve(&net_latency_buffer,sizeof(struct tcp_net_latency),0);
- if(!latency){
- bpf_printk("the net latency buffer is full\n");
- return 0;
- }
- memset(latency,0,sizeof(struct tcp_net_latency));
- latency->delta = delta;
- latency->tgid = info->pid;
- bpf_probe_read_kernel_str(latency->comm,sizeof(info->comm),info->comm);
- latency->ts = now;
- latency->lport = BPF_CORE_READ(sk, __sk_common.skc_num);
- latency->dport = BPF_CORE_READ(sk, __sk_common.skc_dport);
- latency->af = BPF_CORE_READ(sk, __sk_common.skc_family);
-
- if(latency->af == AF_INET){
- latency->src_addr.saddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_rcv_saddr);
- latency->dst_addr.daddr_v4 = BPF_CORE_READ(sk, __sk_common.skc_daddr);
- }
- else{
- BPF_CORE_READ_INTO(&latency->src_addr.saddr_v6,sk,__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
- BPF_CORE_READ_INTO(&latency->dst_addr.daddr_v6,sk,__sk_common.skc_v6_daddr.in6_u.u6_addr32);
- }
- bpf_ringbuf_submit(latency,0);
-
- return 0;
-}
-
-static int tcp_top_ringbuff_send(struct recv_send_bytes *bytes,struct ipv4_key_t *ip4, struct ipv6_key_t *ip6){
- if(!ip4 && !ip6 || !bytes)
- return 0;
-
- u64 now = bpf_ktime_get_ns();
- if((now - bytes->last_output) < 1000 * MSEC)
- return 0;
- u64 send = bytes->send;
- u64 recv = bytes->recv;
- if(send < tcptop_send_threhold && recv < tcptop_recv_threhold)
- return 0;
-
- struct tcp_top_perf_data *buff = bpf_ringbuf_reserve(&tcptop_buffer,sizeof(struct tcp_top_perf_data),0);
- if(!buff){
- bpf_printk("the tcptop buffer is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct tcp_top_perf_data));
- buff->send = send;
- buff->recv = recv;
- if(ip4 != NULL){
- bpf_probe_read_str(buff->comm,sizeof(buff->comm),ip4->comm);
- buff->af = AF_INET;
- buff->pid = ip4->pid;
- buff->dport = ip4->dport;
- buff->lport = ip4->lport;
- buff->dst_addr.daddr_v4 = ip4->daddr;
- buff->src_addr.saddr_v4 = ip4->saddr;
- bpf_ringbuf_submit(buff,0);
-
- bytes->last_output = now;
- bpf_map_update_elem(&ipv4_top_map,ip4,bytes,BPF_ANY);
- }
- else if(ip6 != NULL){
- bpf_probe_read_str(buff->comm,sizeof(buff->comm),ip6->comm);
- buff->af = AF_INET6;
- buff->pid = ip6->pid;
- buff->dport = ip6->dport;
- buff->lport = ip6->lport;
- bpf_probe_read(&buff->dst_addr.daddr_v6, sizeof(buff->dst_addr.daddr_v6), &ip6->daddr);
- bpf_probe_read(&buff->src_addr.saddr_v6, sizeof(buff->src_addr.saddr_v6), &ip6->saddr);
-
- bpf_ringbuf_submit(buff,0);
-
- bytes->last_output = now;
- bpf_map_update_elem(&ipv6_top_map,ip6,bytes,BPF_ANY);
- }
- return 0;
-}
-
-static int tcp_top_sendstat(struct sock *sk, int size) {
- //u32 pid = bpf_get_current_pid_tgid() >> 32;
- u32 pid = bpf_get_current_pid_tgid() & 0xFFFFFFFF;
- u16 family = 0, dport = 0;
- u64 now = bpf_ktime_get_ns();
-
- BPF_CORE_READ_INTO(&family,sk,__sk_common.skc_family);
-
- if (family == AF_INET){
- struct ipv4_key_t key;
- memset(&key,0,sizeof(struct ipv4_key_t));
- key.pid = pid;
- bpf_get_current_comm(&key.comm,sizeof(key.comm));
- BPF_CORE_READ_INTO(&key.saddr,sk,__sk_common.skc_rcv_saddr);
- BPF_CORE_READ_INTO(&key.daddr,sk,__sk_common.skc_daddr);
- BPF_CORE_READ_INTO(&key.lport,sk,__sk_common.skc_num);
- BPF_CORE_READ_INTO(&dport,sk,__sk_common.skc_dport);
- key.dport = bpf_ntohs(dport);
-
- struct recv_send_bytes *by = bpf_map_lookup_elem(&ipv4_top_map,&key);
- if(!by){
- struct recv_send_bytes init = {
- .send = size,
- .recv = 0,
- .last_output = now
- };
- bpf_map_update_elem(&ipv4_top_map,&key,&init,BPF_ANY);
-
- tcp_top_ringbuff_send(&init,&key,NULL);
- }
- else{
- by->send += size;
- bpf_map_update_elem(&ipv4_top_map,&key,by,BPF_ANY);
-
- tcp_top_ringbuff_send(by,&key,NULL);
- }
- }
- else if(family == AF_INET6){
- struct ipv6_key_t key;
- memset(&key,0,sizeof(struct ipv6_key_t));
- key.pid = pid;
- bpf_get_current_comm(&key.comm,sizeof(key.comm));
- BPF_CORE_READ_INTO(&key.saddr,sk,__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
- BPF_CORE_READ_INTO(&key.daddr,sk,__sk_common.skc_v6_daddr.in6_u.u6_addr32);
- BPF_CORE_READ_INTO(&key.lport,sk,__sk_common.skc_num);
- BPF_CORE_READ_INTO(&dport,sk,__sk_common.skc_dport);
- key.dport = bpf_ntohs(dport);
-
- struct recv_send_bytes *by = bpf_map_lookup_elem(&ipv6_top_map,&key);
- if(!by){
- struct recv_send_bytes init = {
- .send = size,
- .recv = 0,
- .last_output = now
- };
- bpf_map_update_elem(&ipv6_top_map,&key,&init,BPF_ANY);
-
- tcp_top_ringbuff_send(&init,NULL,&key);
- }
- else{
- by->send += size;
- bpf_map_update_elem(&ipv6_top_map,&key,by,BPF_ANY);
-
- tcp_top_ringbuff_send(by,NULL,&key);
- }
- }
- return 0;
-}
-
-static int tcp_kprobe_retrans_event(struct sock *sk, struct sk_buff *skb, u32 type){
- if(!sk)
- return 0;
-
- //u32 pid = bpf_get_current_pid_tgid() >> 32;
- u32 pid = bpf_get_current_pid_tgid() & 0xFFFFFFFF;
- if(pid == filiter_id)
- return 0;
-
- u64 now = bpf_ktime_get_ns();
- // struct tcp_skb_cb *tcb = (struct tcp_skb_cb *)skb->cb;
- // u32 seq = skb ? tcb->seq : 0;
- u32 seq;
- struct tcp_skb_cb tcb;
- if (skb) {
- bpf_probe_read_kernel(&tcb, sizeof(tcb), skb->cb);
- seq = tcb.seq;
- } else {
- seq = 0;
- }
- // u16 family = sk->__sk_common.skc_family;
- // u16 lport = sk->__sk_common.skc_num;
- // u16 dport = bpf_ntohs(sk->__sk_common.skc_dport);
- // u8 state = sk->__sk_common.skc_state;
- u16 family,lport,dport;
- u8 state;
- bpf_probe_read_kernel(&family, sizeof(family), &sk->__sk_common.skc_family);
- bpf_probe_read_kernel(&lport, sizeof(lport), &sk->__sk_common.skc_num);
- bpf_probe_read_kernel(&dport, sizeof(dport), &sk->__sk_common.skc_dport);
- bpf_probe_read_kernel(&state, sizeof(state), &sk->__sk_common.skc_state);
-
- char comm[TASK_COMM_LEN];
- bpf_get_current_comm(&comm, sizeof(comm));
-
- if(family != AF_INET && family != AF_INET6)
- return 0;
- struct tcp_resubmit *buff = bpf_ringbuf_reserve(&tcpretrans_buffer,sizeof(struct tcp_resubmit),0);
- if(!buff){
- bpf_printk("the tcp_retrans buffer is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct tcp_resubmit));
- buff->pid = pid;
- buff->dport = dport;
- buff->lport = lport;
- buff->seq = seq;
- buff->state = state;
- buff->type = type;
- buff->occur = now;
- bpf_probe_read_str(buff->comm,sizeof(comm),comm);
-
- switch(family){
- case AF_INET:{
- buff->af = AF_INET;
- u32 daddr,saddr;
- bpf_probe_read_kernel(&daddr,sizeof(daddr),&sk->__sk_common.skc_daddr);
- bpf_probe_read_kernel(&saddr,sizeof(saddr),&sk->__sk_common.skc_rcv_saddr);
- buff->src_addr.saddr_v4 = saddr;
- buff->dst_addr.daddr_v4 = daddr;
- // buff->dst_addr.daddr_v4 = sk->__sk_common.skc_daddr;
- // buff->src_addr.saddr_v4 = sk->__sk_common.skc_rcv_saddr;
- bpf_ringbuf_submit(buff,0);
- break;
- }
- case AF_INET6:{
- buff->af = AF_INET6;
- bpf_probe_read_kernel(&buff->src_addr.saddr_v6, sizeof(buff->src_addr.saddr_v6), &sk->__sk_common.skc_v6_rcv_saddr);
- bpf_probe_read_kernel(&buff->dst_addr.daddr_v6,sizeof(buff->dst_addr.daddr_v6),&sk->__sk_common.skc_v6_daddr);
- bpf_ringbuf_submit(buff,0);
- break;
- }
- default:
- bpf_ringbuf_discard(buff, 0);
- return 0;
- }
-
- return 0;
-}
-
-
-// é‡ä¼ 事件追踪
-SEC("tracepoint/tcp/tcp_retransmit_skb")
-int trace_retransmit(struct tcp_retransmit_skb_event *ctx) {
- struct sk_buff *skb = (struct sk_buff *)ctx->skbaddr;
- struct sock *sk = (struct sock *)ctx->skaddr;
- return tcp_kprobe_retrans_event(sk,skb,RETRANSMIT);
-}
-
-// // TLP 事件追踪
-// SEC("kprobe/tcp_send_loss_probe")
-// int trace_tlp(struct pt_regs *ctx, struct sock *sk) {
-// return tcp_kprobe_retrans_event(sk,NULL,TLP);
-// }
-
-// 下é¢ä¿©å¤„ç†tcptop
-SEC("kprobe/tcp_sendmsg")
-int BPF_KPROBE(top_tcp_send_entry, struct sock *sk){
- //u32 pid = bpf_get_current_pid_tgid() >> 32;
- u32 pid = bpf_get_current_pid_tgid() & 0xFFFFFFFF;
- bpf_map_update_elem(&top_sock_store,&pid,&sk,BPF_ANY);
- return 0;
-}
-
-SEC("kretprobe/tcp_sendmsg")
-int BPF_KRETPROBE(top_tcp_send_ret, int ret){
- //u32 pid = bpf_get_current_pid_tgid() >> 32;
- u32 pid = bpf_get_current_pid_tgid() & 0xFFFFFFFF;
- struct sock **sockpp = bpf_map_lookup_elem(&top_sock_store, &pid);
- if (!sockpp)
- return 0;
-
- struct sock *sk = *sockpp;
- if (ret > 0) {
- tcp_top_sendstat(sk, ret);
- }
-
- bpf_map_delete_elem(&top_sock_store, &pid);
-
- return 0;
-}
-
-// SEC("kprobe/tcp_sendpage")
-// int BPF_KPROBE(top_tcp_sendpage_entry, struct sock *sk, struct page *page, int offset, size_t size)
-// {
-// u32 pid = bpf_get_current_pid_tgid() >> 32;
-// bpf_map_update_elem(&top_sock_store,&pid,&sk,BPF_ANY);
-// return 0;
-// }
-
-// SEC("kretprobe/tcp_sendpage")
-// int BPF_KRETPROBE(top_tcp_sendpage_ret, int ret){
-// u32 pid = bpf_get_current_pid_tgid() >> 32;
-// struct sock **sockpp = bpf_map_lookup_elem(&top_sock_store, &pid);
-// if (!sockpp)
-// return 0;
-
-// struct sock *sk = *sockpp;
-// if (ret > 0) {
-// tcp_top_sendstat(sk, ret);
-// }
-
-// bpf_map_delete_elem(&top_sock_store, &pid);
-
-// return 0;
-// }
-
-SEC("kprobe/tcp_cleanup_rbuf")
-int BPF_KPROBE(top_tcp_recv_entry, struct sock *sk, int copied){
- if (copied <= 0)
- return 0;
-
- //u32 pid = bpf_get_current_pid_tgid() >> 32;
- u32 pid = bpf_get_current_pid_tgid() & 0xFFFFFFFF;
- u16 family = 0, dport = 0;
- u64 now = bpf_ktime_get_ns();
-
- BPF_CORE_READ_INTO(&family,sk,__sk_common.skc_family);
-
- if (family == AF_INET){
- struct ipv4_key_t key;
- memset(&key,0,sizeof(struct ipv4_key_t));
- key.pid = pid;
- bpf_get_current_comm(&key.comm,sizeof(key.comm));
- BPF_CORE_READ_INTO(&key.saddr,sk,__sk_common.skc_rcv_saddr);
- BPF_CORE_READ_INTO(&key.daddr,sk,__sk_common.skc_daddr);
- BPF_CORE_READ_INTO(&key.lport,sk,__sk_common.skc_num);
- BPF_CORE_READ_INTO(&dport,sk,__sk_common.skc_dport);
- key.dport = bpf_ntohs(dport);
-
- struct recv_send_bytes *by = bpf_map_lookup_elem(&ipv4_top_map,&key);
- if(!by){
- struct recv_send_bytes init = {
- .send = 0,
- .recv = copied,
- .last_output = now
- };
- bpf_map_update_elem(&ipv4_top_map,&key,&init,BPF_ANY);
-
- tcp_top_ringbuff_send(&init,&key,NULL);
- }
- else{
- by->recv += copied;
- bpf_map_update_elem(&ipv4_top_map,&key,by,BPF_ANY);
-
- tcp_top_ringbuff_send(by,&key,NULL);
- }
- }
- else if(family == AF_INET6){
- struct ipv6_key_t key;
- memset(&key,0,sizeof(struct ipv6_key_t));
- key.pid = pid;
- bpf_get_current_comm(&key.comm,sizeof(key.comm));
- BPF_CORE_READ_INTO(&key.saddr,sk,__sk_common.skc_v6_rcv_saddr.in6_u.u6_addr32);
- BPF_CORE_READ_INTO(&key.daddr,sk,__sk_common.skc_v6_daddr.in6_u.u6_addr32);
- BPF_CORE_READ_INTO(&key.lport,sk,__sk_common.skc_num);
- BPF_CORE_READ_INTO(&dport,sk,__sk_common.skc_dport);
- key.dport = bpf_ntohs(dport);
-
- struct recv_send_bytes *by = bpf_map_lookup_elem(&ipv6_top_map,&key);
- if(!by){
- struct recv_send_bytes init = {
- .send = 0,
- .recv = copied,
- .last_output = now
- };
- bpf_map_update_elem(&ipv6_top_map,&key,&init,BPF_ANY);
-
- tcp_top_ringbuff_send(&init,NULL,&key);
- }
- else{
- by->recv += copied;
- bpf_map_update_elem(&ipv6_top_map,&key,by,BPF_ANY);
-
- tcp_top_ringbuff_send(by,NULL,&key);
- }
- }
- return 0;
-}
-
-SEC("kprobe/tcp_v4_connect")
-int BPF_KPROBE(tcp_v4_connect, struct sock *sk)
-{
- return net_trace_connect(sk);
-}
-
-SEC("kprobe/tcp_v6_connect")
-int BPF_KPROBE(tcp_v6_connect, struct sock *sk)
-{
- return net_trace_connect(sk);
-}
-
-SEC("kprobe/tcp_rcv_state_process")
-int BPF_KPROBE(tcp_rcv_state_process, struct sock *sk)
-{
- return handle_tcp_rcv_state_process(sk);
-}
-
-SEC("fentry/tcp_v4_connect")
-int BPF_PROG(fentry_tcp_v4_connect, struct sock *sk)
-{
- return net_trace_connect(sk);
-}
-
-SEC("fentry/tcp_v6_connect")
-int BPF_PROG(fentry_tcp_v6_connect, struct sock *sk)
-{
- return net_trace_connect(sk);
-}
-
-SEC("fentry/tcp_rcv_state_process")
-int BPF_PROG(fentry_tcp_rcv_state_process, struct sock *sk)
-{
- return handle_tcp_rcv_state_process(sk);
-}
-
-SEC("fentry/tcp_rcv_established")
-int BPF_PROG(tcprtt,struct sock *sk)
-{
- const struct inet_sock *inet = (struct inet_sock *)(sk);
- struct tcp_sock *ts;
- u32 srtt;
-
- struct tcprtt_perf_data *data = bpf_map_lookup_elem(&tcprtt_map,&zero);
- if(!data){
- // bpf_printk("the tcprtt map not init\n");
- // return 0;
- struct tcprtt_perf_data init;
- memset(&init,0,sizeof(struct tcprtt_perf_data));
- bpf_map_update_elem(&tcprtt_map,&zero,&init,BPF_ANY);
-
- data = bpf_map_lookup_elem(&tcprtt_map,&zero);
- if(!data)
- return 0;
- }
- ts = (struct tcp_sock *)(sk);
- srtt = BPF_CORE_READ(ts, srtt_us) >> 3; // å°† srtt 从纳秒转æ¢ä¸ºå¾®ç§’
-
- srtt /= 1000; // 转ms
-
- u32 index;
- if(srtt <= 0)
- index = 0;
- else if(srtt < 5)
- index = 1;
- else if(srtt < 17)
- index = 2;
- else if(srtt < 33)
- index = 3;
- else if(srtt < 65)
- index = 4;
- else if(srtt < 129)
- index = 5;
- else if(srtt < 257)
- index = 6;
- else
- index = 7;
-
- data->data[index] += 1;
- bpf_map_update_elem(&tcprtt_map,&zero,data,BPF_ANY);
-
- return 0;
-}
-
-SEC("perf_event")
-int handle_tcprtt_event(struct bpf_perf_event_data *ctx){
- struct tcprtt_perf_data *src = bpf_map_lookup_elem(&tcprtt_map,&zero);
- if(!src){
- bpf_printk("the tcprtt map is not init\n");
- return 0;
- }
-
- struct tcprtt_perf_data *buff = bpf_ringbuf_reserve(&tcprtt_buffer,sizeof(struct tcprtt_perf_data),0);
- if(!buff){
- bpf_printk("the tcprtt buffer is full\n");
- return 0;
- }
- memset(buff,0,sizeof(struct tcprtt_perf_data));
-
- for(int i = 0;i<8;i++){
- buff->data[i] = src->data[i];
- }
- bpf_ringbuf_submit(buff, 0);
-
- return 0;
-}
\ No newline at end of file
diff --git a/bpf/scx_nest.bpf.c b/bpf/scx_nest.bpf.c
new file mode 100644
index 0000000..933e29f
--- /dev/null
+++ b/bpf/scx_nest.bpf.c
@@ -0,0 +1,884 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * As described in [0], a Nest scheduler which encourages task placement on
+ * cores that are likely to be running at higher frequency, based upon recent usage.
+ *
+ * [0]: https://hal.inria.fr/hal-03612592/file/paper.pdf
+ *
+ * It operates as a global weighted vtime scheduler (similarly to CFS), while
+ * using the Nest algorithm to choose idle cores at wakup time.
+ *
+ * It also demonstrates the following niceties.
+ *
+ * - More robust task placement policies.
+ * - Termination notification for userspace.
+ *
+ * While rather simple, this scheduler should work reasonably well on CPUs with
+ * a uniform L3 cache topology. While preemption is not implemented, the fact
+ * that the scheduling queue is shared across all CPUs means that whatever is
+ * at the front of the queue is likely to be executed fairly quickly given
+ * enough number of CPUs.
+ *
+ * Copyright (c) 2023 Meta Platforms, Inc. and affiliates.
+ * Copyright (c) 2023 David Vernet
+ * Copyright (c) 2023 Tejun Heo
+ */
+#include
+
+#include "scx_nest.h"
+
+#define TASK_DEAD 0x00000080
+
+char _license[] SEC("license") = "Dual BSD/GPL";
+
+enum {
+ FALLBACK_DSQ_ID = 0,// é»˜è®¤è°ƒåº¦é˜Ÿåˆ—çš„æ ‡è¯†ç¬¦ã€‚
+ MSEC_PER_SEC = 1000LLU,// æ¯ç§’包å«çš„æ¯«ç§’数。
+ USEC_PER_MSEC = 1000LLU,// æ¯æ¯«ç§’包å«çš„微秒数。
+ NSEC_PER_USEC = 1000LLU,// æ¯å¾®ç§’包å«çš„纳秒数。
+ NSEC_PER_MSEC = USEC_PER_MSEC * NSEC_PER_USEC,// æ¯æ¯«ç§’包å«çš„纳秒数。
+ USEC_PER_SEC = USEC_PER_MSEC * MSEC_PER_SEC,// æ¯ç§’包å«çš„微秒数。
+ NSEC_PER_SEC = NSEC_PER_USEC * USEC_PER_SEC,// æ¯ç§’包å«çš„纳秒数。
+};
+
+// 定义了一个å®ï¼Œç”¨äºŽè¡¨ç¤ºç³»ç»Ÿå¯åŠ¨æ—¶é—´ç±»åž‹çš„æ—¶é’Ÿ
+#define CLOCK_BOOTTIME 7 // CLOCK_BOOTTIME æ˜¯ä¸€ä¸ªå†…æ ¸æ—¶é’Ÿæºï¼Œè¡¨ç¤ºä»Žç³»ç»Ÿå¯åŠ¨åˆ°å½“å‰çš„æŒ‚é’Ÿæ—¶é—´ï¼ˆåŒ…æ‹¬ä¼‘çœ æ—¶é—´ï¼‰
+#define NUMA_NO_NODE -1 // NUMAèŠ‚ç‚¹æ ‡è¯†ï¼Œ-1表示任务未绑定到任何NUMA节点
+#define COMPARE_COMM_LEN 6 // 用于比较的任务åç§°å‰ç¼€çš„
+
+// 常é‡å®šä¹‰ï¼Œé€šå¸¸ç”¨äºŽè°ƒåº¦å™¨ä¸çš„å„ç§è¶…æ—¶å’Œé™åˆ¶
+const volatile u64 p_remove_ns = 2 * NSEC_PER_MSEC;// Primary nest的移除时间阈值,å•ä½ä¸ºçº³ç§’
+//const volatile u64 p_remove_ns = 4 * NSEC_PER_MSEC;// è¿™é‡Œæ ¹æ®å®žéªŒæ”¹æˆäº†4ms
+const volatile u64 r_max = 5; // Reserve nestçš„æœ€å¤§æ ¸å¿ƒæ•°é‡
+const volatile u64 r_impatient = 2; // 任务切æ¢çš„å®¹å¿æ¬¡æ•°é˜ˆå€¼
+const volatile u64 slice_ns = SCX_SLICE_DFL; // 默认时间片长度,具体值通过其他å®å®šä¹‰æˆ–é…ç½®
+const volatile bool find_fully_idle = false; // 是å¦å¯ç”¨å¯»æ‰¾å®Œå…¨ç©ºé—²æ ¸å¿ƒçš„ç–略,false表示ä¸å¯ç”¨
+const volatile u64 sampling_cadence_ns = 1 * NSEC_PER_SEC; // é‡‡æ ·é—´éš”æ—¶é—´ï¼Œå•ä½ä¸ºçº³ç§’
+const volatile u64 r_depth = 5; // Reserve nestçš„æœç´¢æ·±åº¦é™åˆ¶
+const volatile bool filter_by_tgid = false;
+
+
+// 用于统计信æ¯è·Ÿè¸ªã€‚这些值å¯èƒ½ä¼šæœ‰æ»žåŽ
+u64 stats_primary_mask, stats_reserved_mask, stats_other_mask, stats_idle_mask;
+
+// ç”¨äºŽå†…éƒ¨è·Ÿè¸ªçš„é™æ€å˜é‡
+static s32 nr_reserved;// 当å‰reserve nestä¸çš„æ ¸å¿ƒæ•°é‡
+
+// 当å‰çš„虚拟时间戳,用于时间管ç†å’Œè°ƒåº¦å™¨é€»è¾‘
+static u64 vtime_now;
+
+// å†…æ ¸ä¸è‡ªå®šä¹‰çš„事件,用于æŸäº›å†…部状æ€è·Ÿè¸ªæˆ–记录日志
+UEI_DEFINE(uei);
+
+// 外部å˜é‡ï¼Œè¡¨ç¤ºå†…æ ¸é…ç½®ä¸è®¾ç½®çš„æ¯ç§’è°ƒåº¦æ—¶é’Ÿæ»´ç”æ•°ï¼ˆé€šå¸¸ä¸Žç³»ç»Ÿå®šæ—¶å™¨é¢‘率相关)
+extern unsigned long CONFIG_HZ __kconfig;// CONFIG_HZ 表示系统的调度时钟频率,通常为100ã€250或1000
+
+/* Per-task scheduling context */
+struct task_ctx {
+ /*
+ * 一个临时的 CPU 掩ç ,用于计算任务的 primary å’Œ reserve mask。
+ * 它å¯èƒ½å˜å‚¨ä»»åС当å‰å¯ç”¨æ ¸å¿ƒçš„集åˆã€‚
+ */
+ struct bpf_cpumask __kptr *tmp_mask;
+
+ /*
+ * 记录任务观察到其上次è¿è¡Œæ ¸å¿ƒä¸ç©ºé—²çš„æ¬¡æ•°ã€‚
+ * 如果连ç»å‘生 `r_impatient` 次,将å°è¯•从 Reserve Nest 或 Fallback Nest åˆ†é…æ ¸å¿ƒã€‚
+ */
+ u32 prev_misses;
+
+ /*
+ * ä»»åŠ¡â€œé™„åŠ â€çš„æ ¸å¿ƒï¼šæœ€è¿‘连ç»ä¸¤æ¬¡ä»¥ä¸Šè¿è¡Œçš„æ ¸å¿ƒã€‚
+ * 唤醒时,任务会首先å°è¯•è¿ç§»åˆ°è¿™ä¸ªæ ¸å¿ƒã€‚
+ * åªæœ‰å½“æ ¸å¿ƒç©ºé—²ä¸”å±žäºŽ Primary Nest 时,任务æ‰ä¼šè¿ç§»åˆ°è¯¥æ ¸å¿ƒã€‚
+ */
+ s32 attached_core;
+
+ /*
+ * 任务最åŽä¸€æ¬¡è¿è¡Œçš„æ ¸å¿ƒã€‚
+ * 用于决定任务是å¦éœ€è¦é™„åŠ åˆ°ä¸‹ä¸€æ¬¡è¿è¡Œçš„æ ¸å¿ƒã€‚
+ */
+ s32 prev_cpu;
+};
+
+// 任务的 CPU 使用情况,å’Œcpu_eventé‚£è¾¹ä¸€æ ·,这边引入是方便动æ€è°ƒèŠ‚æ—¶é—´ç‰‡
+struct task_info_simple{
+ u32 pid;
+ u32 tgid;
+ u32 cpu_id;
+ char comm[TASK_COMM_LEN];
+};
+
+// 任务的调度上下文 (task_ctx)
+struct {
+ __uint(type, BPF_MAP_TYPE_TASK_STORAGE);
+ __uint(map_flags, BPF_F_NO_PREALLOC);
+ __type(key, int);
+ __type(value, struct task_ctx);
+} task_ctx_stor SEC(".maps");
+
+// æ¯ä¸ªç‰©ç†æ ¸å¿ƒçš„上下文信æ¯ï¼Œä¸»è¦ä¸Žæ ¸å¿ƒçš„压缩(compaction)状æ€ç›¸å…³
+struct pcpu_ctx {
+ /*
+ * å®šæ—¶å™¨ï¼Œç”¨äºŽåœ¨æ ¸å¿ƒä»Ž Primary Nest ä¸ç§»é™¤æ—¶æ‰§è¡ŒåŽ‹ç¼©æ“作。
+ */
+ struct bpf_timer timer;
+
+ /*
+ * è¡¨ç¤ºå½“å‰æ ¸å¿ƒæ˜¯å¦å·²è¢«å®‰æŽ’进行压缩。
+ */
+ bool scheduled_compaction;
+};
+
+struct {
+ __uint(type, BPF_MAP_TYPE_ARRAY);
+ __uint(max_entries, 1024);
+ __type(key, s32);
+ __type(value, struct pcpu_ctx);
+} pcpu_ctxs SEC(".maps");
+
+struct stats_timer {
+ // 统计定时器,用于全局统计信æ¯
+ struct bpf_timer timer;
+};
+
+struct {
+ __uint(type, BPF_MAP_TYPE_ARRAY);
+ __uint(max_entries, 1);
+ __type(key, u32);
+ __type(value, struct stats_timer);
+} stats_timer SEC(".maps");
+
+/*-----------------å’Œcpu_statsäº¤äº’æ¥æŠ‘åˆ¶å¼‚å¸¸task-----------------------*/
+struct filter_inner_map {
+ __uint(type, BPF_MAP_TYPE_HASH);
+ __uint(max_entries, 102400);
+ __type(key, u32);
+ __type(value, u32);
+} template_map SEC(".maps");
+
+
+struct{
+ __uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
+ __uint(max_entries, 1);
+ __type(key, u32);
+ __array(values,struct filter_inner_map);
+} fliter_map SEC(".maps");
+
+
+// 处ç†ç”¨æˆ·æ€ä¼ çš„å¯èƒ½è¢«è¯¯ä¼¤çš„任务å
+struct {
+ __uint(type, BPF_MAP_TYPE_HASH);
+ __uint(max_entries, 1024);
+ __type(key, struct comm_info);
+ __type(value, u32);
+} comm_ignore_map SEC(".maps");
+
+// 处ç†ç”¨æˆ·æ€ä¼ çš„è¦åŽ»ç‰¹åˆ«æ³¨æ„的任务
+struct {
+ __uint(type, BPF_MAP_TYPE_HASH);
+ __uint(max_entries, 1024);
+ __type(key, struct comm_info);
+ __type(value, u32);
+} comm_attention_map SEC(".maps");
+
+// 处ç†ç”¨æˆ·æ€ä¼ çš„å¯èƒ½è¢«è¯¯ä¼¤çš„任务pid or tgid
+struct {
+ __uint(type, BPF_MAP_TYPE_HASH);
+ __uint(max_entries, 1024);
+ __type(key, u32);
+ __type(value, u32);
+} id_ignore_map SEC(".maps");
+
+// 处ç†ç”¨æˆ·æ€ä¼ çš„è¦åŽ»ç‰¹åˆ«æ³¨æ„的任务pid or tgid
+struct {
+ __uint(type, BPF_MAP_TYPE_HASH);
+ __uint(max_entries, 1024);
+ __type(key, u32);
+ __type(value, u32);
+} id_attention_map SEC(".maps");
+
+struct {
+ __uint(type, BPF_MAP_TYPE_RINGBUF);
+ __uint(max_entries, 512 * 1024);
+} cpu_mask_buffer SEC(".maps");
+
+const volatile u32 nr_cpus = 1; /* !0 for veristat, set during init. */
+
+private(NESTS) struct bpf_cpumask __kptr *primary_cpumask;// 表示 Primary Nest ä¸å¯ç”¨çš„æ ¸å¿ƒé›†åˆ
+private(NESTS) struct bpf_cpumask __kptr *reserve_cpumask;// 表示 Reserve Nest ä¸çš„æ ¸å¿ƒé›†åˆ
+
+// 对于æ¯ä¸ªæ ¸å¿ƒï¼Œè®°å½•è¿è¡Œæ—¶çš„é‡è¦ç»Ÿè®¡ä¿¡æ¯ï¼Œå¦‚æ ¸å¿ƒè¿ç§»ã€é™çº§ã€æå‡å’Œå®¹é‡é™åˆ¶ç‰è¡Œä¸º
+// æ¯ä¸ªé”®ä»£è¡¨ä¸€ç§ç»Ÿè®¡äº‹ä»¶ï¼Œä¾‹å¦‚ PROMOTED_TO_RESERVED è¡¨ç¤ºæ ¸å¿ƒè¢«æå‡åˆ° Reserve Nest
+// æ¯ä¸ªå€¼ä»£è¡¨è¯¥äº‹ä»¶å‘生的次数
+// 通过 stat_inc è°ƒç”¨ï¼ŒåŠ¨æ€æ›´æ–°ç»Ÿè®¡è®¡æ•°ï¼Œç”¨äºŽåˆ†æžå’Œä¼˜åŒ–调度ç–ç•¥
+struct {
+ __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
+ __uint(key_size, sizeof(u32));
+ __uint(value_size, sizeof(u64));
+ __uint(max_entries, NEST_STAT(NR));
+} stats SEC(".maps");
+
+
+static __always_inline void stat_inc(u32 idx)
+{
+ u64 *cnt_p = bpf_map_lookup_elem(&stats, &idx);
+ if (cnt_p)
+ (*cnt_p)++;
+}
+
+// 比较两个虚拟时间 a å’Œ bï¼Œåˆ¤æ– a æ˜¯å¦æ—©äºŽ b
+static inline bool vtime_before(u64 a, u64 b)
+{
+ return (s64)(a - b) < 0;
+}
+
+// è¯•å›¾å°†æŒ‡å®šæ ¸å¿ƒï¼ˆcpuï¼‰æ ‡è®°ä¸º Reserve æ ¸å¿ƒ
+static __always_inline void
+try_make_core_reserved(s32 cpu, struct bpf_cpumask * reserved, bool promotion)
+{
+ s32 tmp_nr_reserved;
+
+ /*
+ * 这个检查å¯èƒ½ä¼šäº§ç”Ÿç«žäº‰æ¡ä»¶ï¼Œä½†é—®é¢˜ä¸å¤§ã€‚如果我们错误地
+ * æœªèƒ½å°†æ ¸å¿ƒæå‡åˆ° Reserve Nestï¼Œæ˜¯å› ä¸ºåœ¨è¿™ä¸ªå°çª—å£ä¸
+ * å¦ä¸€ä¸ªä¸Šä¸‹æ–‡æ·»åŠ æˆ–ç§»é™¤äº† Reserve æ ¸å¿ƒã€‚è¿™ç§æƒ…况会在åŽç»
+ * 唤醒ä¸è¢«å¹³è¡¡ã€‚
+ */
+ tmp_nr_reserved = nr_reserved;
+ // æ ¹æ®å½“å‰ Reserve æ ¸å¿ƒæ•°é‡ï¼ˆnr_reservedï¼‰åˆ¤æ–æ˜¯å¦å¯ä»¥å°†æ ¸å¿ƒåŠ å…¥ Reserve Nest
+ // 如果å…è®¸ï¼Œå°†å…¶æ ‡è®°ä¸º Reserve 并更新统计信æ¯ï¼›å¦åˆ™ï¼Œè®°å½•达容é‡é™åˆ¶çš„æƒ…况
+ if (tmp_nr_reserved < r_max) {
+ /*
+ * 这里å¯èƒ½ä¼šçŸæ—¶é—´è¶…过 r_max çš„é™åˆ¶ï¼Œä½†éšç€æ›´å¤šæ ¸å¿ƒè¢«é™çº§
+ * 或未能被æå‡åˆ° Reserve Nestï¼Œè¿™ç§æƒ…况会被平衡。
+ */
+ __sync_fetch_and_add(&nr_reserved, 1);// 原åå¢žåŠ Reserve æ ¸å¿ƒè®¡æ•°
+ bpf_cpumask_set_cpu(cpu, reserved);// å°†æŒ‡å®šçš„æ ¸å¿ƒåŠ å…¥ Reserve 掩ç
+ if (promotion)
+ stat_inc(NEST_STAT(PROMOTED_TO_RESERVED));// ç»Ÿè®¡æ ¸å¿ƒè¢«æå‡æ¬¡æ•°
+ else
+ stat_inc(NEST_STAT(DEMOTED_TO_RESERVED)); // ç»Ÿè®¡æ ¸å¿ƒè¢«é™çº§æ¬¡æ•°
+ } else {
+ bpf_cpumask_clear_cpu(cpu, reserved);// 如果 Reserve å·²æ»¡ï¼Œæ¸…é™¤è¯¥æ ¸å¿ƒ
+ stat_inc(NEST_STAT(RESERVED_AT_CAPACITY));// 统计 Reserve 达容é‡é™åˆ¶çš„æ¬¡æ•°
+ }
+}
+
+// 更新任务上下文(task_ctx)ä¸çš„æ ¸å¿ƒç»‘定信æ¯
+// å¦‚æžœä»»åŠ¡çš„å½“å‰æ ¸å¿ƒï¼ˆnew_cpu)与之å‰çš„æ ¸å¿ƒï¼ˆprev_cpu)相åŒï¼Œåˆ™å°†è¯¥æ ¸å¿ƒè®¾ç½®ä¸ºä»»åŠ¡çš„é™„åŠ æ ¸å¿ƒï¼ˆattached_coreï¼‰ï¼Œä»¥ä¼˜åŒ–æ ¸å¿ƒå¤ç”¨
+static void update_attached(struct task_ctx *tctx, s32 prev_cpu, s32 new_cpu)
+{
+ if (tctx->prev_cpu == new_cpu)
+ tctx->attached_core = new_cpu;// å¦‚æžœä»»åŠ¡çš„ä¸Šä¸€æ¬¡æ ¸å¿ƒä¸Žå½“å‰æ ¸å¿ƒç›¸åŒï¼Œåˆ™é™„åŠ åˆ°å½“å‰æ ¸å¿ƒ
+ tctx->prev_cpu = prev_cpu;// æ›´æ–°ä»»åŠ¡çš„ä¸Šä¸€æ¬¡æ ¸å¿ƒè®°å½•
+}
+
+// 执行 Primary Nest çš„æ ¸å¿ƒåŽ‹ç¼©æ“ä½œï¼Œå°†å½“å‰æ ¸å¿ƒä»Ž Primary Nest é™çº§åˆ° Reserve Nest
+// å½“æ ¸å¿ƒé•¿æ—¶é—´æœªä½¿ç”¨æ—¶ï¼ˆç”±å®šæ—¶å™¨è§¦å‘),调用该函数进行压缩
+static int compact_primary_core(void *map, int *key, struct bpf_timer *timer)
+{
+ struct bpf_cpumask *primary, *reserve;
+ s32 cpu = bpf_get_smp_processor_id();
+ struct pcpu_ctx *pcpu_ctx;
+
+ stat_inc(NEST_STAT(CALLBACK_COMPACTED));// å¢žåŠ åŽ‹ç¼©æ“作的回调次数
+
+ /*
+ * å¦‚æžœè¿›å…¥äº†è¿™ä¸ªå›žè°ƒï¼Œè¯´æ˜Žå®šæ—¶å™¨çš„å›žè°ƒæœªè¢«å–æ¶ˆï¼Œå› æ¤æ ¸å¿ƒéœ€è¦
+ * 从 Primary Nest é™çº§ã€‚
+ */
+ pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu);// æŸ¥æ‰¾å½“å‰æ ¸å¿ƒçš„上下文
+ if (!pcpu_ctx) {
+ scx_bpf_error("Couldn't lookup pcpu ctx");// 如果上下文为空,记录错误并退出
+ return 0;
+ }
+ bpf_rcu_read_lock();// åŠ é”ä»¥ä¿æŠ¤è®¿é—®
+ primary = primary_cpumask; // èŽ·å– Primary Nest çš„æ ¸å¿ƒæŽ©ç
+ reserve = reserve_cpumask; // èŽ·å– Reserve Nest çš„æ ¸å¿ƒæŽ©ç
+ if (!primary || !reserve) {
+ scx_bpf_error("Couldn't find primary or reserve");// 如果任何一个掩ç 为空,记录错误并退出
+ bpf_rcu_read_unlock();
+ return 0;
+ }
+
+ // 将当剿 ¸å¿ƒä»Ž Primary Nest 移除
+ bpf_cpumask_clear_cpu(cpu, primary);
+ // å°è¯•å°†æ ¸å¿ƒé™çº§åˆ° Reserve Nest
+ try_make_core_reserved(cpu, reserve, false);
+ bpf_rcu_read_unlock();// è§£é”
+
+ // æ›´æ–°æ ¸å¿ƒä¸Šä¸‹æ–‡çš„åŽ‹ç¼©çŠ¶æ€
+ pcpu_ctx->scheduled_compaction = false;
+ return 0;
+}
+
+// 对于处ç†è¿‡äº†ï¼Œç›¸å½“于dispatch了,就return 0,å¦åˆ™return 1交给æ£å¸¸è°ƒåº¦
+static int operate_bad_guys(struct task_struct *p,u64 enq_flags){
+ // å¯¹äºŽå†…æ ¸ä»»åŠ¡ç›´æŽ¥è·³äº†ï¼Œæ€•å½±å“出问题
+ if(p->flags & PF_KTHREAD)
+ return 1;
+ struct comm_info name;
+ bpf_probe_read_kernel_str(name.comm,sizeof(p->comm),p->comm);
+
+ u32 pid = p->pid;
+ u32 tgid = p->tgid;
+
+ // 跳过误伤åå•çš„
+ u32 *ident = bpf_map_lookup_elem(&comm_ignore_map,&name);
+ if(ident){
+ return 1;
+ }
+
+ u32 *ident_id;
+
+ ident = bpf_map_lookup_elem(&id_ignore_map,&pid);
+ if(ident){
+ return 1;
+ }
+ if(filter_by_tgid){
+ ident = bpf_map_lookup_elem(&id_ignore_map,&tgid);
+ if(ident){
+ return 1;
+ }
+ }
+
+ // 对特别关注的问题任务控制调度
+ ident = bpf_map_lookup_elem(&comm_attention_map,&name);
+ ident_id = bpf_map_lookup_elem(&id_attention_map,&pid);
+ u32 *ident_tgid = NULL;
+ if(filter_by_tgid){
+ ident_tgid = bpf_map_lookup_elem(&id_attention_map,&tgid);
+ }
+ if(ident || ident_id || ident_tgid){
+ u64 vtime = p->scx.dsq_vtime;// 获å–任务的虚拟时间
+ if (vtime_before(vtime, vtime_now - slice_ns))
+ vtime = vtime_now - slice_ns;
+ scx_bpf_dispatch_vtime(p, FALLBACK_DSQ_ID, slice_ns/2, vtime,
+ enq_flags);
+ return 0;
+ }
+
+ u32 zero = 0;
+ struct filter_inner_map *bad_guy = bpf_map_lookup_elem(&fliter_map,&zero);
+ if(bad_guy){
+ ident = bpf_map_lookup_elem(bad_guy,&pid);
+ if(ident){
+ u64 vtime = p->scx.dsq_vtime;// 获å–任务的虚拟时间
+ if (vtime_before(vtime, vtime_now - slice_ns))
+ vtime = vtime_now - slice_ns;
+ scx_bpf_dispatch_vtime(p, FALLBACK_DSQ_ID, slice_ns/2, vtime,
+ enq_flags);
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+s32 BPF_STRUCT_OPS(nest_select_cpu, struct task_struct *p, s32 prev_cpu,
+ u64 wake_flags)
+{
+ struct bpf_cpumask *p_mask, *primary, *reserve;
+ s32 cpu;
+ struct task_ctx *tctx;
+ struct pcpu_ctx *pcpu_ctx;
+ bool direct_to_primary = false, reset_impatient = true;
+
+ // åˆå§‹åŒ–和上下文获å–
+ tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0);
+ if (!tctx)
+ return -ENOENT;
+
+ // èŽ·å– Primary å’Œ Reserve Nest çš„æ ¸å¿ƒæŽ©ç ,用于åŽç»çš„æ ¸å¿ƒé€‰æ‹©
+ bpf_rcu_read_lock();
+ p_mask = tctx->tmp_mask;
+ primary = primary_cpumask;
+ reserve = reserve_cpumask;
+ if (!p_mask || !primary || !reserve) {
+ bpf_rcu_read_unlock();
+ return -ENOENT;
+ }
+
+ tctx->prev_cpu = prev_cpu;
+
+ bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(primary));
+
+ /* First try to wake the task on its attached core. */
+ // å¦‚æžœä»»åŠ¡é™„åŠ çš„æ ¸å¿ƒï¼ˆattached_core)处于空闲状æ€ï¼Œç›´æŽ¥é€‰æ‹©è¯¥æ ¸å¿ƒ
+ if (bpf_cpumask_test_cpu(tctx->attached_core, cast_mask(p_mask)) &&
+ scx_bpf_test_and_clear_cpu_idle(tctx->attached_core)) {
+ cpu = tctx->attached_core;
+ stat_inc(NEST_STAT(WAKEUP_ATTACHED));
+ goto migrate_primary;
+ }
+
+ /*
+ * Try to stay on the previous core if it's in the primary set, and
+ * there's no hypertwin. If the previous core is the core the task is
+ * attached to, don't bother as we already just tried that above.
+ */
+ // å°è¯•å¤ç”¨ä»»åŠ¡çš„ä¸Šæ¬¡æ ¸å¿ƒï¼ˆprev_cpu)
+ // å¦‚æžœä»»åŠ¡çš„ä¸Šæ¬¡æ ¸å¿ƒï¼ˆprev_cpu)ä¸ç‰äºŽé™„åŠ æ ¸å¿ƒï¼Œå¹¶ä¸”ç©ºé—²ï¼Œåˆ™é€‰æ‹©ä¸Šæ¬¡æ ¸å¿ƒ
+ if (prev_cpu != tctx->attached_core &&
+ bpf_cpumask_test_cpu(prev_cpu, cast_mask(p_mask)) &&
+ scx_bpf_test_and_clear_cpu_idle(prev_cpu)) {
+ cpu = prev_cpu;
+ stat_inc(NEST_STAT(WAKEUP_PREV_PRIMARY));
+ goto migrate_primary;
+ }
+
+ // Primary Nest ä¸å¯»æ‰¾ç©ºé—²æ ¸å¿ƒ
+ // 如果å¯ç”¨äº†å¯»æ‰¾å®Œå…¨ç©ºé—²æ ¸å¿ƒçš„ç–略,优先选择 Primary Nest ä¸å®Œå…¨ç©ºé—²çš„æ ¸å¿ƒ
+ if (find_fully_idle) {
+ /* Then try any fully idle core in primary. */
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask),
+ SCX_PICK_IDLE_CORE);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_PRIMARY));
+ goto migrate_primary;
+ }
+ }
+
+ /* Then try _any_ idle core in primary, even if its hypertwin is active. */
+ // å¦‚æžœæœªæ‰¾åˆ°å®Œå…¨ç©ºé—²æ ¸å¿ƒï¼Œåˆ™é€‰æ‹©ä»»æ„ç©ºé—²æ ¸å¿ƒ
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_PRIMARY));
+ goto migrate_primary;
+ }
+
+ // r_impatient 用于控制任务切æ¢çš„å®¹å¿æ¬¡æ•°
+ // å¦‚æžœä»»åŠ¡è¿žç» r_impatient 次未能分é…到 Primary Nest ä¸çš„æ ¸å¿ƒï¼Œåˆ™è®¤ä¸ºä»»åŠ¡å˜å¾— "ä¸è€çƒ¦"
+ // prev_misses è®°å½•ä»»åŠ¡è¿žç»æœªèƒ½åˆ†é…到 Primary Nest ä¸çš„æ ¸å¿ƒçš„æ¬¡æ•°,记录任务未分é…到åˆé€‚æ ¸å¿ƒçš„è¿žç»å¤±è´¥æ¬¡æ•°
+ if (r_impatient > 0 && ++tctx->prev_misses >= r_impatient) {
+ direct_to_primary = true;// 设置 direct_to_primary = true,表示任务在下一æ¥ä¼šç›´æŽ¥é€‰æ‹© Primary Nest çš„æ ¸å¿ƒ
+ tctx->prev_misses = 0;
+ stat_inc(NEST_STAT(TASK_IMPATIENT));// 统计一次 "任务ä¸è€çƒ¦" 事件(TASK_IMPATIENT)
+ }
+
+ reset_impatient = false;
+
+ /* Then try any fully idle core in reserve. */
+ // 如果 Primary Nest 䏿²¡æœ‰åˆé€‚çš„æ ¸å¿ƒï¼Œåˆ™è½¬å‘ Reserve Nest
+ bpf_cpumask_and(p_mask, p->cpus_ptr, cast_mask(reserve));
+ if (find_fully_idle) {
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask),
+ SCX_PICK_IDLE_CORE);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_FULLY_IDLE_RESERVE));
+ goto promote_to_primary;
+ }
+ }
+
+ /* Then try _any_ idle core in reserve, even if its hypertwin is active. */
+ // å¦‚æžœæ²¡æœ‰å®Œå…¨ç©ºé—²æ ¸å¿ƒï¼Œé€‰æ‹© Reserve Nest ä¸ä»»æ„ç©ºé—²æ ¸å¿ƒ
+ cpu = scx_bpf_pick_idle_cpu(cast_mask(p_mask), 0);
+ if (cpu >= 0) {
+ stat_inc(NEST_STAT(WAKEUP_ANY_IDLE_RESERVE));
+ goto promote_to_primary;// å¦‚æžœæ‰¾åˆ°æ ¸å¿ƒï¼Œåˆ™å°†å…¶æå‡åˆ° Primary Nest
+ }
+
+ /* Then try _any_ idle core in the task's cpumask. */
+ // 在任务å…许的 CPU 集åˆä¸å¯»æ‰¾ç©ºé—²æ ¸å¿ƒ
+ // 如果 Primary å’Œ Reserve Nest 都没有å¯ç”¨æ ¸å¿ƒï¼Œåˆ™å°è¯•任务å…许的 CPU 集åˆï¼ˆp->cpus_ptr)
+ cpu = scx_bpf_pick_idle_cpu(p->cpus_ptr, 0);// 从任务å…许的 CPU 集åˆä¸é€‰æ‹©ä»»æ„ç©ºé—²æ ¸å¿ƒ
+ if (cpu >= 0) {
+ /*
+ * We found a core that (we didn't _think_) is in any nest.
+ * This means that we need to either promote the core to the
+ * reserve nest, or if we're going direct to primary due to
+ * r_impatient being exceeded, promote directly to primary.
+ *
+ * We have to do one final check here to see if the core is in
+ * the primary or reserved cpumask because we could potentially
+ * race with the core changing states between AND'ing the
+ * primary and reserve masks with p->cpus_ptr above, and
+ * atomically reserving it from the idle mask with
+ * scx_bpf_pick_idle_cpu(). This is also technically true of
+ * the checks above, but in all of those cases we just put the
+ * core directly into the primary mask so it's not really that
+ * big of a problem. Here, we want to make sure that we don't
+ * accidentally put a core into the reserve nest that was e.g.
+ * already in the primary nest. This is unlikely, but we check
+ * for it on what should be a relatively cold path regardless.
+ */
+ stat_inc(NEST_STAT(WAKEUP_IDLE_OTHER));
+ if (bpf_cpumask_test_cpu(cpu, cast_mask(primary)))// å¦‚æžœæ ¸å¿ƒå±žäºŽ Primary Nest,直接è¿ç§»
+ goto migrate_primary;
+ else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve)))// å¦‚æžœæ ¸å¿ƒå±žäºŽ Reserve Nest,æå‡åˆ° Primary Nest
+ goto promote_to_primary;
+ else if (direct_to_primary)// 当任务连ç»r_impatient次未分é…到Primary Nestçš„æ ¸å¿ƒï¼Œå°±ä¼šç›´æŽ¥è¿›å…¥promote_to_primary路径
+ goto promote_to_primary;
+ else
+ try_make_core_reserved(cpu, reserve, true);// 如果ä¸å±žäºŽä»»ä½• Nestï¼Œå°†å…¶æ ‡è®°ä¸º Reserve æ ¸å¿ƒ
+ bpf_rcu_read_unlock();
+ return cpu;
+ }
+
+ bpf_rcu_read_unlock();
+ return prev_cpu;
+
+
+// promote_to_primary å’Œ migrate_primary æ˜¯å¤„ç†æ ¸å¿ƒçжæ€è°ƒæ•´çš„两个关键路径
+// åˆ†åˆ«å®žçŽ°æ ¸å¿ƒä»Ž Reserve æå‡åˆ° Primary 和直接è¿ç§»åˆ° Primary
+// promote_to_primary就多了个统计PROMOTED_TO_PRIMARY æå‡äº‹ä»¶
+promote_to_primary:
+ stat_inc(NEST_STAT(PROMOTED_TO_PRIMARY));
+migrate_primary:// 直接è¿ç§»åˆ° Primary
+ // 如果 reset_impatient 为真(任务在 Reserve Nest 未达到 r_impatient 阈值时分é…åˆ°æ ¸å¿ƒï¼‰
+ // 则é‡ç½® prev_misses è®¡æ•°ï¼Œè¡¨ç¤ºä»»åŠ¡åˆ†é…æˆåŠŸï¼Œç»“æŸå½“å‰è¿žç»å¤±è´¥çжæ€
+ if (reset_impatient)
+ tctx->prev_misses = 0;
+ pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &cpu);
+ // å¦‚æžœæ ¸å¿ƒå·²è¢«æ ‡è®°ä¸ºå³å°†ä»Ž Primary Nest 移除(scheduled_compaction ä¸ºçœŸï¼‰ï¼Œåˆ™å–æ¶ˆå¯¹åº”çš„åŽ‹ç¼©å®šæ—¶å™¨ï¼Œé˜²æ¢æ ¸å¿ƒè¢«é”™è¯¯ç§»é™¤
+ if (pcpu_ctx) {
+ if (pcpu_ctx->scheduled_compaction) {
+ // å¦‚æžœæ ¸å¿ƒè¢«æ ‡è®°ä¸ºå³å°†è¢«åŽ‹ç¼©ï¼Œä»Ž Primary Nest ç§»é™¤ï¼Œåˆ™å–æ¶ˆå®šæ—¶å™¨
+ // æ ¸å¿ƒè¢«åŽ‹ç¼©ï¼ˆcompaction),指的是将Primary Nest ä¸é•¿æ—¶é—´æœªä½¿ç”¨æˆ–ä½Žä¼˜å…ˆçº§çš„æ ¸å¿ƒç§»å‡º Primary Nest,并将其é™çº§åˆ° Reserve Nest 或其他状æ€
+ if (bpf_timer_cancel(&pcpu_ctx->timer) < 0)
+ scx_bpf_error("Failed to cancel pcpu timer");
+ // 釿–°è®¾ç½®æ ¸å¿ƒåŽ‹ç¼©çš„å›žè°ƒå‡½æ•°
+ if (bpf_timer_set_callback(&pcpu_ctx->timer, compact_primary_core))
+ scx_bpf_error("Failed to re-arm pcpu timer");
+ // æ ‡è®°æ ¸å¿ƒä¸å†å¤„于压缩计划ä¸
+ pcpu_ctx->scheduled_compaction = false;
+ // è®°å½•ç»Ÿè®¡äº‹ä»¶ï¼šåŽ‹ç¼©å®šæ—¶å™¨è¢«å–æ¶ˆ
+ stat_inc(NEST_STAT(CANCELLED_COMPACTION));
+ }
+ } else {
+ scx_bpf_error("Failed to lookup pcpu ctx");
+ }
+ // æ ‡è®°æ ¸å¿ƒä¸º Primary æˆå‘˜
+ bpf_cpumask_set_cpu(cpu, primary);
+ /*
+ * Check to see whether the CPU is in the reserved nest. This can
+ * happen if the core is compacted concurrently with us trying to place
+ * the currently-waking task onto it. Similarly, this is the expected
+ * state of the core if we found the core in the reserve nest and are
+ * promoting it.
+ *
+ * We don't have to worry about racing with any other waking task here
+ * because we've atomically reserved the core with (some variant of)
+ * scx_bpf_pick_idle_cpu().
+ */
+ // // å¦‚æžœæ ¸å¿ƒåŒæ—¶å˜åœ¨äºŽ Reserve Nest,则更新 Reserve 状æ€,从 Reserve Nest ä¸ç§»é™¤æ ¸å¿ƒ
+ if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve))) {
+ __sync_sub_and_fetch(&nr_reserved, 1);
+ bpf_cpumask_clear_cpu(cpu, reserve);
+ }
+ bpf_rcu_read_unlock();
+ // 调用 update_attached æ›´æ–°ä»»åŠ¡çš„é™„åŠ æ ¸å¿ƒï¼ˆattached_core)和å‰ä¸€æ¬¡è¿è¡Œæ ¸å¿ƒï¼ˆprev_cpu),为下一次调度åšå‡†å¤‡
+ update_attached(tctx, prev_cpu, cpu);
+ //scx_bpf_dispatch(p, SCX_DSQ_LOCAL, slice_ns, 0);
+
+ // 开始过滤特殊任务
+ int ret = operate_bad_guys(p,0);
+ if(ret == 1)
+ scx_bpf_dispatch(p, SCX_DSQ_LOCAL_ON | cpu , slice_ns, 0);
+ //scx_bpf_dispatch(p, SCX_DSQ_LOCAL_ON | cpu , slice_ns, 0);
+ return cpu;
+}
+
+void BPF_STRUCT_OPS(nest_enqueue, struct task_struct *p, u64 enq_flags)
+{
+ struct task_ctx *tctx;
+ u64 vtime = p->scx.dsq_vtime;// 获å–任务的虚拟时间
+
+ tctx = bpf_task_storage_get(&task_ctx_stor, p, 0, 0);
+ if (!tctx) {
+ scx_bpf_error("Unable to find task ctx");
+ return;
+ }
+
+ /*
+ * é™åˆ¶ä»»åŠ¡çš„è™šæ‹Ÿæ—¶é—´ç´¯è®¡ã€‚
+ * 如果任务已ç»é•¿æ—¶é—´æœªè¢«è°ƒåº¦ï¼Œè™šæ‹Ÿæ—¶é—´ä¸åº”超过一个 slice。
+ */
+ // è¿™æ ·å¯ä»¥é™åˆ¶ä»»åŠ¡ç§¯ç´¯è¿‡å¤šæœªä½¿ç”¨çš„é¢„ç®—ï¼Œé¿å…长时间未调度的任务çªç„¶æŠ¢å å¤§é‡ CPU æ—¶é—´
+ if (vtime_before(vtime, vtime_now - slice_ns))
+ vtime = vtime_now - slice_ns;
+
+ // 开始过滤特殊任务
+ int ret = operate_bad_guys(p,enq_flags);
+ if(ret == 1)
+ scx_bpf_dispatch_vtime(p, FALLBACK_DSQ_ID, slice_ns, vtime,
+ enq_flags);
+}
+
+// 消耗在global dsq的任务
+void BPF_STRUCT_OPS(nest_dispatch, s32 cpu, struct task_struct *prev)
+{
+ struct pcpu_ctx *pcpu_ctx;
+ struct bpf_cpumask *primary, *reserve;
+ s32 key = cpu;
+ bool in_primary;
+
+ primary = primary_cpumask;
+ reserve = reserve_cpumask;
+ if (!primary || !reserve) {
+ scx_bpf_error("No primary or reserve cpumask");
+ return;
+ }
+
+ pcpu_ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key);
+ if (!pcpu_ctx) {
+ scx_bpf_error("Failed to lookup pcpu ctx");
+ return;
+ }
+
+ // 如果队列ä¸çš„任务被消耗完了,å³scx_bpf_consume(FALLBACK_DSQ_ID) 返回 false
+ if (!scx_bpf_consume(FALLBACK_DSQ_ID)) {
+ // 使用 bpf_cpumask_test_cpu æ£€æµ‹å½“å‰æ ¸å¿ƒæ˜¯å¦ä»ç„¶å±žäºŽ Primary Nest
+ in_primary = bpf_cpumask_test_cpu(cpu, cast_mask(primary));
+
+ // 如果上一个任务(prev)ä»ç„¶åœ¨ä»»åŠ¡é˜Ÿåˆ—ä¸ï¼ˆSCX_TASK_QUEUEDï¼‰ï¼Œå¹¶ä¸”å½“å‰æ ¸å¿ƒå±žäºŽ Primary Nestï¼Œåˆ™é‡æ–°æ´¾å‘该任务
+ // é¿å…æ ¸å¿ƒè¿›å…¥ç©ºé—²çŠ¶æ€ï¼Œç¡®ä¿èµ„æºè¢«å……分利用
+ // 这里逻辑总感觉有些问题,如果prev所在的cpuçš„scx_rqä¸ä¸ºå½“å‰cpu,直接分派到当å‰cpuçš„scx_rqä¸ä¼šå‡ºé—®é¢˜å—
+ if (prev && (prev->scx.flags & SCX_TASK_QUEUED) && in_primary) {
+ scx_bpf_dispatch(prev, SCX_DSQ_LOCAL, slice_ns, 0);
+ return;
+ }
+
+ // 如果当å‰ä»»åŠ¡é˜Ÿåˆ—æ²¡æœ‰ä»»åŠ¡è¢«æ¶ˆè´¹ï¼Œè®°å½•ä¸€æ¬¡ NOT_CONSUMED 事件,便于åŽç»åˆ†æžå’Œä¼˜åŒ–
+ stat_inc(NEST_STAT(NOT_CONSUMED));
+ if (in_primary) { // å¦‚æžœæ ¸å¿ƒåœ¨ Primary Nest
+ /*
+ * Immediately demote a primary core if the previous
+ * task on it is dying
+ *
+ * Note that we elect to not compact the "first" CPU in
+ * the mask so as to encourage at least one core to
+ * remain in the nest. It would be better to check for
+ * whether there is only one core remaining in the
+ * nest, but BPF doesn't yet have a kfunc for querying
+ * cpumask weight.
+ */
+ /*
+ * 如果上一个任务已ç»ç»“æŸï¼Œåˆ™ç«‹å³åŽ‹ç¼©æ ¸å¿ƒã€‚
+ * 但ä¿è¯è‡³å°‘æœ‰ä¸€ä¸ªæ ¸å¿ƒä¿ç•™åœ¨ Primary Nest。
+ */
+ if ((prev && prev->__state == TASK_DEAD) &&
+ (cpu != bpf_cpumask_first(cast_mask(primary)))) {
+ // ç«‹å³é™çº§æ ¸å¿ƒåˆ° Reserve Nest
+ stat_inc(NEST_STAT(EAGERLY_COMPACTED));// 统计急切压缩事件
+ bpf_cpumask_clear_cpu(cpu, primary);// 从 Primary Nest ä¸ç§»é™¤æ ¸å¿ƒ
+ try_make_core_reserved(cpu, reserve, false);// é™çº§æ ¸å¿ƒåˆ° Reserve Nest
+ } else {
+ // å»¶è¿ŸåŽ‹ç¼©æ ¸å¿ƒ
+ pcpu_ctx->scheduled_compaction = true;// æ ‡è®°æ ¸å¿ƒéœ€è¦åŽ‹ç¼©
+ /*
+ * The core isn't being used anymore. Set a
+ * timer to remove the core from the nest in
+ * p_remove if it's still unused by that point.
+ */
+ /*
+ * è®¾ç½®åŽ‹ç¼©å®šæ—¶å™¨ï¼Œåœ¨æŒ‡å®šæ—¶é—´åŽæ£€æŸ¥æ ¸å¿ƒæ˜¯å¦ä»ç„¶æœªè¢«ä½¿ç”¨ã€‚
+ */
+ bpf_timer_start(&pcpu_ctx->timer, p_remove_ns,
+ BPF_F_TIMER_CPU_PIN);
+ stat_inc(NEST_STAT(SCHEDULED_COMPACTION));
+ }
+ }
+ return;
+ }
+ stat_inc(NEST_STAT(CONSUMED));
+}
+
+// 更新全局虚拟时间(vtime_now)以确ä¿è™šæ‹Ÿæ—¶é—´å§‹ç»ˆå‘å‰æŽ¨è¿›
+// 在任务开始è¿è¡Œæ—¶è°ƒç”¨ï¼Œç”¨äºŽåŒæ¥ä»»åŠ¡çš„è™šæ‹Ÿæ—¶é—´åˆ°å…¨å±€è™šæ‹Ÿæ—¶é—´
+void BPF_STRUCT_OPS(nest_running, struct task_struct *p)
+{
+ /*
+ * Global vtime always progresses forward as tasks start executing. The
+ * test and update can be performed concurrently from multiple CPUs and
+ * thus racy. Any error should be contained and temporary. Let's just
+ * live with it.
+ */
+ if (vtime_before(vtime_now, p->scx.dsq_vtime))
+ vtime_now = p->scx.dsq_vtime;
+}
+
+// å½“ä»»åŠ¡åœæ¢è¿è¡Œæ—¶è°ƒç”¨ï¼Œæ ¹æ®ä»»åŠ¡çš„æƒé‡å’Œå‰©ä½™æ—¶é—´ç‰‡æ›´æ–°ä»»åŠ¡çš„è™šæ‹Ÿæ—¶é—´
+void BPF_STRUCT_OPS(nest_stopping, struct task_struct *p, bool runnable)
+{
+ /* scale the execution time by the inverse of the weight and charge */
+ p->scx.dsq_vtime += (slice_ns - p->scx.slice) * 100 / p->scx.weight;
+}
+
+// åˆå§‹åŒ–新任务(task_struct)的调度上下文
+s32 BPF_STRUCT_OPS(nest_init_task, struct task_struct *p,
+ struct scx_init_task_args *args)
+{
+ struct task_ctx *tctx;
+ struct bpf_cpumask *cpumask;
+
+ /*
+ * @p is new. Let's ensure that its task_ctx is available. We can sleep
+ * in this function and the following will automatically use GFP_KERNEL.
+ */
+ tctx = bpf_task_storage_get(&task_ctx_stor, p, 0,
+ BPF_LOCAL_STORAGE_GET_F_CREATE);
+ if (!tctx)
+ return -ENOMEM;
+
+ cpumask = bpf_cpumask_create();
+ if (!cpumask)
+ return -ENOMEM;
+
+ cpumask = bpf_kptr_xchg(&tctx->tmp_mask, cpumask);
+ if (cpumask)
+ bpf_cpumask_release(cpumask);
+
+ tctx->attached_core = -1;
+ tctx->prev_cpu = -1;
+
+ return 0;
+}
+
+void BPF_STRUCT_OPS(nest_enable, struct task_struct *p)
+{
+ p->scx.dsq_vtime = vtime_now;
+}
+
+// 通过定时器周期性调用æ¤å‡½æ•°ï¼Œæ›´æ–°ç»Ÿè®¡æ•°æ®
+static int stats_timerfn(void *map, int *key, struct bpf_timer *timer)
+{
+ s32 cpu;
+ struct bpf_cpumask *primary, *reserve;
+ const struct cpumask *idle;
+ stats_primary_mask = 0;
+ stats_reserved_mask = 0;
+ stats_other_mask = 0;
+ stats_idle_mask = 0;
+ long err;
+
+ bpf_rcu_read_lock();
+ primary = primary_cpumask;
+ reserve = reserve_cpumask;
+ if (!primary || !reserve) {
+ bpf_rcu_read_unlock();
+ scx_bpf_error("Failed to lookup primary or reserve");
+ return 0;
+ }
+
+ idle = scx_bpf_get_idle_cpumask();
+ bpf_for(cpu, 0, nr_cpus) {
+ if (bpf_cpumask_test_cpu(cpu, cast_mask(primary)))
+ stats_primary_mask |= (1ULL << cpu);
+ else if (bpf_cpumask_test_cpu(cpu, cast_mask(reserve)))
+ stats_reserved_mask |= (1ULL << cpu);
+ else
+ stats_other_mask |= (1ULL << cpu);
+
+ if (bpf_cpumask_test_cpu(cpu, idle))
+ stats_idle_mask |= (1ULL << cpu);
+ }
+ bpf_rcu_read_unlock();
+ scx_bpf_put_idle_cpumask(idle);
+
+ err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0);
+ if (err)
+ scx_bpf_error("Failed to arm stats timer");
+
+ return 0;
+}
+
+s32 BPF_STRUCT_OPS_SLEEPABLE(nest_init)
+{
+ struct bpf_cpumask *cpumask;
+ s32 cpu;
+ int err;
+ struct bpf_timer *timer;
+ u32 key = 0;
+
+ err = scx_bpf_create_dsq(FALLBACK_DSQ_ID, NUMA_NO_NODE);
+ if (err) {
+ scx_bpf_error("Failed to create fallback DSQ");
+ return err;
+ }
+
+ cpumask = bpf_cpumask_create();
+ if (!cpumask)
+ return -ENOMEM;
+ bpf_cpumask_clear(cpumask);
+ cpumask = bpf_kptr_xchg(&primary_cpumask, cpumask);
+ if (cpumask)
+ bpf_cpumask_release(cpumask);
+
+ cpumask = bpf_cpumask_create();
+ if (!cpumask)
+ return -ENOMEM;
+
+ bpf_cpumask_clear(cpumask);
+ cpumask = bpf_kptr_xchg(&reserve_cpumask, cpumask);
+ if (cpumask)
+ bpf_cpumask_release(cpumask);
+
+ bpf_for(cpu, 0, nr_cpus) {
+ s32 key = cpu;
+ struct pcpu_ctx *ctx = bpf_map_lookup_elem(&pcpu_ctxs, &key);
+
+ if (!ctx) {
+ scx_bpf_error("Failed to lookup pcpu_ctx");
+ return -ENOENT;
+ }
+ ctx->scheduled_compaction = false;
+ if (bpf_timer_init(&ctx->timer, &pcpu_ctxs, CLOCK_BOOTTIME)) {
+ scx_bpf_error("Failed to initialize pcpu timer");
+ return -EINVAL;
+ }
+ err = bpf_timer_set_callback(&ctx->timer, compact_primary_core);
+ if (err) {
+ scx_bpf_error("Failed to set pcpu timer callback");
+ return -EINVAL;
+ }
+ }
+
+ timer = bpf_map_lookup_elem(&stats_timer, &key);
+ if (!timer) {
+ scx_bpf_error("Failed to lookup central timer");
+ return -ESRCH;
+ }
+ bpf_timer_init(timer, &stats_timer, CLOCK_BOOTTIME);
+ bpf_timer_set_callback(timer, stats_timerfn);
+ err = bpf_timer_start(timer, sampling_cadence_ns - 5000, 0);
+ if (err)
+ scx_bpf_error("Failed to arm stats timer");
+
+ return err;
+}
+
+void BPF_STRUCT_OPS(nest_exit, struct scx_exit_info *ei)
+{
+ UEI_RECORD(uei, ei);
+}
+
+SEC("perf_event")
+int handle_cpu_mask_event(struct bpf_perf_event_data *ctx){
+ struct cpu_mask_data *buff = bpf_ringbuf_reserve(&cpu_mask_buffer,sizeof(struct cpu_mask_data),0);
+ if(!buff){
+ bpf_printk("cpu mask ringbuf reserve failed\n");
+ return 0;
+ }
+ buff->stats_primary_mask = stats_primary_mask;
+ buff->stats_reserved_mask = stats_reserved_mask;
+ buff->stats_other_mask = stats_other_mask;
+ buff->stats_idle_mask = stats_idle_mask;
+ bpf_ringbuf_submit(buff,0);
+ return 0;
+}
+
+SCX_OPS_DEFINE(nest_ops,
+ .select_cpu = (void *)nest_select_cpu,
+ .enqueue = (void *)nest_enqueue,
+ .dispatch = (void *)nest_dispatch,
+ .running = (void *)nest_running,
+ .stopping = (void *)nest_stopping,
+ .init_task = (void *)nest_init_task,
+ .enable = (void *)nest_enable,
+ .init = (void *)nest_init,
+ .exit = (void *)nest_exit,
+ .flags = 0,
+ .name = "nest");
+
diff --git a/concerned/comm_attention.txt b/concerned/comm_attention.txt
new file mode 100644
index 0000000..d73c482
--- /dev/null
+++ b/concerned/comm_attention.txt
@@ -0,0 +1 @@
+stress-ngstress-ng
diff --git a/concerned/comm_ignore.txt b/concerned/comm_ignore.txt
new file mode 100644
index 0000000..bcb8423
--- /dev/null
+++ b/concerned/comm_ignore.txt
@@ -0,0 +1,7 @@
+code
+Compositor
+gnome-shell
+scx_spy
+cpptools
+llvmpipe-0
+kworker
\ No newline at end of file
diff --git a/visualize/run/oom_event b/concerned/id_attention.txt
similarity index 100%
rename from visualize/run/oom_event
rename to concerned/id_attention.txt
diff --git a/concerned/id_ignore.txt b/concerned/id_ignore.txt
new file mode 100644
index 0000000..e69de29
diff --git a/cpu_controller b/cpu_controller
index 05952b8..622695f 100755
Binary files a/cpu_controller and b/cpu_controller differ
diff --git a/docs/cpu_wacther_vis_guide.md b/docs/cpu_wacther_vis_guide.md
deleted file mode 100644
index a20f821..0000000
--- a/docs/cpu_wacther_vis_guide.md
+++ /dev/null
@@ -1,168 +0,0 @@
-# cpu_wactherçš„å¯è§†åŒ–
-
-## 1.é…置环境
-
-在使用cpu_watcherå¯è§†åŒ–之å‰ï¼Œè¯·å…ˆé…ç½®dockerã€go的环境,具体é…置方法å¯å‚考:
-
-### 1.1 docker
-
-å…ˆå‚考该链接进行docker-desktop的安装:
-
-* [在 Ubuntu 上安装 Docker Desktop |Docker 文档](https://docs.docker.com/desktop/install/ubuntu/#install-docker-desktop)
-
-在准备å¯åЍdocker-desktop时,å¯èƒ½é‡åˆ°æ‰“ä¸å¼€docker-desktop的情况,如下所示:
-
-
-
-è¿™æ˜¯å› ä¸ºè™šæ‹Ÿæœºæš‚æ—¶ä¸æ”¯æŒè™šæ‹ŸåŒ–,å¯ä»¥å…ˆå…³é—è™šæ‹Ÿæœºï¼Œé‡æ–°ç¼–辑虚拟机设置,开å¯è™šæ‹ŸåŒ–引擎的两个选项,å†å¼€æœºé…ç½®kvmï¼›
-
-* [在 Linux 上安装 Docker Desktop |Docker 文档](https://docs.docker.com/desktop/install/linux-install/)
-
-
-
-### 1.2 go环境:
-
-本å¯è§†åŒ–功能对goçš„ç‰ˆæœ¬æœ‰è¦æ±‚,请安装go1.19+版本,具体安装æµç¨‹å¯å‚考如下链接:
-
-* [go:快速å‡çº§Goç‰ˆæœ¬ï¼Œæˆ‘å‡ åˆ†é’Ÿå°±è§£å†³äº†_go å‡çº§ç‰ˆæœ¬-CSDNåšå®¢](https://blog.csdn.net/m0_37482190/article/details/128673828)
-
-## 2.使用cpuwatcher å¯è§†åŒ–
-
-* 首先先进入lmp目录下的lmp/eBPF_Supermarket/CPU_Subsystem/cpu_watcher文件夹
-
- ```BASH
- cd lmp/eBPF_Supermarket/CPU_Subsystem/cpu_watcher
- ```
-
- 在该目录下 进行make编译
-
- ```bash
- make -j 20
- ```
-
-* 在lmp目录下的eBPF_Visualization/eBPF_prometheus文件夹下
-
-* 执行`make`指令,编译å¯è§†åŒ–çš„goè¯è¨€å·¥å…·
-
- 在执行makeæŒ‡ä»¤æ—¶ï¼Œå¦‚æžœå‡ºçŽ°å¦‚ä¸‹æŠ¥é”™ï¼Œæ˜¯å› ä¸ºgo包管ç†ä»£ç†ç½‘倿— 法访问`proxy.golang.org`
-
- ```bash
- go: golang.org/x/exp@v0.0.0-20190731235908-ec7cb31e5a56: Get "https://proxy.golang.org/golang.org/x/exp/@v/v0.0.0-20190731235908-ec7cb31e5a56.mod": dial tcp 172.217.160.113:443: i/o timeout
- ```
-
- åªéœ€è¦æ¢ä¸€ä¸ªå›½å†…能访问的2代ç†åœ°å€å³å¯
-
- ```bash
- go env -w GOPROXY=https://goproxy.cn
- ```
-
-* 执行`make start_service`指令,é…置下载docker镜åƒå¹¶å¯åЍgrafanaå’ŒprometheusæœåŠ¡
-
-* 执行如下指令开始采集数æ®ä»¥åŠç›¸å…³å¤„ç†ï¼š
-
- ```bash
- ./data-visual collect /home/zhang/lmp/eBPF_Supermarket/CPU_Subsystem/cpu_watcher/cpu_watcher -s
- ```
-
-* 在网页打开网å€ï¼šhttp://192.168.159.128:8090/metrics æ¤å¤„为`localhost:8090/metrics`,便å¯ä»¥çœ‹åˆ°æš´éœ²åœ¨http网页ä¸çš„æ•°æ®ï¼›
-
- 
-
-* 在网页打开网å€ï¼šhttp://192.168.159.128:3000/ å³å¯è¿›å…¥grafanaæœåŠ¡ï¼Œä½¿ç”¨åˆå§‹å¯†ç 登录(user:admin pswd: admin)进入管ç†ç•Œé¢ï¼š
-
- - 点击ã€Home-Connection-Add new connection】,选择Prometheus,建立与PrometheusæœåŠ¡å™¨çš„è¿žæŽ¥ï¼š
-
- 
-
- 这个172.17.0.1表示docker0网桥的 IPv4 地å€ã€‚在 Docker ä¸ï¼Œé€šå¸¸ä¼šå°†docker0的第一个 IP 地å€åˆ†é…ç»™Dockerä¸»æœºè‡ªèº«ã€‚å› æ¤ï¼Œ172.17.0.1是 Docker主机上Docker守护进程的 IP 地å€ï¼Œæ‰€ä»¥åœ¨Grafanaæ•°æ®æºè¿™å—设置æˆ[http://172.17.0.1:9090](http://172.17.0.1:9090/) ,然åŽç‚¹å‡»ä¸‹é¢çš„ã€Save & test】按钮
-
-- 进入å¯è§†åŒ–é…置界é¢ï¼š
-
- 
- 
-
-- 在下方处进行如图所示的é…置,点击Run querieså³å¯ä»¥å¯è§†åŒ–的方å¼ç›‘控avg_delayå—æ®µçš„æ•°æ®ï¼š
-
- 
-
-## 3.cpu_watcherå„å工具å¯è§†åŒ–输出
-
-本次å¯è§†åŒ–è¾“å‡ºæ ·ä¾‹ï¼Œæ˜¯åœ¨å¯¹æ¯”ç³»ç»Ÿæ£å¸¸è¿è¡Œå’Œé«˜è´Ÿè½½è¿è¡Œæ—¶æœ¬å·¥å…·çš„使用情况,使用stressåŠ åŽ‹å·¥å…·å¯¹cpu进行æŒç»5minçš„åŠ åŽ‹
-
-```bash
-stress --cpu 8 --timeout 300s
-```
-
-### 3.1 cpu_watcher -s
-
-**ã€irq Time】å¯è§†åŒ–输出结果**
-
-
-
-**ã€softirq Time】å¯è§†åŒ–输出结果**
-
-
-**ã€cswch】å¯è§†åŒ–输出结果**
-
-
-**ã€proc】å¯è§†åŒ–输出结果**
-
-
-
-**ã€Kthread】å¯è§†åŒ–输出结果**
-
-
-
-**ã€idle】å¯è§†åŒ–输出结果**
-
-
-
-**ã€sys】å¯è§†åŒ–输出结果**
-
-
-
-**ã€sysc】å¯è§†åŒ–输出结果**
-
-
-
-**ã€utime】å¯è§†åŒ–输出结果**
-
-
-
-**ã€cpu处于ä¸åŒçжæ€å¯¹æ¯”图】å¯è§†åŒ–输出结果**
-
-
-
-### 3.2 cpu_watcher -c
-
-**ã€cs_delay】å¯è§†åŒ–输出结果**
-
-
-
-### 3.3 cpu_watcher -d
-
-**ã€schedule_delay】å¯è§†åŒ–输出结果**
-
-ã€max_delay】
-
-
-
-ã€avg_delay】
-
-
-
-ã€min_delay】
-
-
-
-### 3.4 cpu_watcher -p
-
-**ã€preempt】å¯è§†åŒ–输出结果**
-
-
-
-## 3.5 cpu_watcher -S
-
-**ã€syscall_delay】å¯è§†åŒ–输出结果**
-
-
\ No newline at end of file
diff --git a/docs/image/image-20240411132742107.png b/docs/image/image-20240411132742107.png
deleted file mode 100644
index dcfb6ad..0000000
Binary files a/docs/image/image-20240411132742107.png and /dev/null differ
diff --git a/docs/image/image-20240411132807253.png b/docs/image/image-20240411132807253.png
deleted file mode 100644
index 941b900..0000000
Binary files a/docs/image/image-20240411132807253.png and /dev/null differ
diff --git a/docs/image/image-20240411132842070.png b/docs/image/image-20240411132842070.png
deleted file mode 100644
index 1c32506..0000000
Binary files a/docs/image/image-20240411132842070.png and /dev/null differ
diff --git a/docs/image/image-20240411132914396.png b/docs/image/image-20240411132914396.png
deleted file mode 100644
index 7d156c2..0000000
Binary files a/docs/image/image-20240411132914396.png and /dev/null differ
diff --git a/docs/image/image-20240411133505763.png b/docs/image/image-20240411133505763.png
deleted file mode 100644
index 109b29e..0000000
Binary files a/docs/image/image-20240411133505763.png and /dev/null differ
diff --git a/docs/image/image-20240411133841698.png b/docs/image/image-20240411133841698.png
deleted file mode 100644
index 84279fb..0000000
Binary files a/docs/image/image-20240411133841698.png and /dev/null differ
diff --git a/docs/image/image-20240411135159178.png b/docs/image/image-20240411135159178.png
deleted file mode 100644
index ad7c565..0000000
Binary files a/docs/image/image-20240411135159178.png and /dev/null differ
diff --git a/docs/image/image-20240411135335523.png b/docs/image/image-20240411135335523.png
deleted file mode 100644
index 5c46cc2..0000000
Binary files a/docs/image/image-20240411135335523.png and /dev/null differ
diff --git a/docs/image/image-20240411142421440.png b/docs/image/image-20240411142421440.png
deleted file mode 100644
index b308e32..0000000
Binary files a/docs/image/image-20240411142421440.png and /dev/null differ
diff --git a/docs/image/image-20240411144331888.png b/docs/image/image-20240411144331888.png
deleted file mode 100644
index 6e174c2..0000000
Binary files a/docs/image/image-20240411144331888.png and /dev/null differ
diff --git a/docs/image/image-20240411160509242.png b/docs/image/image-20240411160509242.png
deleted file mode 100644
index bc7a81d..0000000
Binary files a/docs/image/image-20240411160509242.png and /dev/null differ
diff --git a/docs/image/image-20240411170250839.png b/docs/image/image-20240411170250839.png
deleted file mode 100644
index 5b6bdc7..0000000
Binary files a/docs/image/image-20240411170250839.png and /dev/null differ
diff --git a/docs/image/image-20240411170311182.png b/docs/image/image-20240411170311182.png
deleted file mode 100644
index a900381..0000000
Binary files a/docs/image/image-20240411170311182.png and /dev/null differ
diff --git a/docs/image/image1.png b/docs/image/image1.png
deleted file mode 100644
index b0c02f4..0000000
Binary files a/docs/image/image1.png and /dev/null differ
diff --git a/docs/image/image10.png b/docs/image/image10.png
deleted file mode 100644
index 8c4a4bf..0000000
Binary files a/docs/image/image10.png and /dev/null differ
diff --git a/docs/image/image11.png b/docs/image/image11.png
deleted file mode 100644
index dc04b23..0000000
Binary files a/docs/image/image11.png and /dev/null differ
diff --git a/docs/image/image12.png b/docs/image/image12.png
deleted file mode 100644
index bfb87ed..0000000
Binary files a/docs/image/image12.png and /dev/null differ
diff --git a/docs/image/image13.png b/docs/image/image13.png
deleted file mode 100644
index 566fd1c..0000000
Binary files a/docs/image/image13.png and /dev/null differ
diff --git a/docs/image/image2.png b/docs/image/image2.png
deleted file mode 100644
index 140a97b..0000000
Binary files a/docs/image/image2.png and /dev/null differ
diff --git a/docs/image/image3.png b/docs/image/image3.png
deleted file mode 100644
index 52db1de..0000000
Binary files a/docs/image/image3.png and /dev/null differ
diff --git a/docs/image/image4.5.png b/docs/image/image4.5.png
deleted file mode 100644
index 40aef3a..0000000
Binary files a/docs/image/image4.5.png and /dev/null differ
diff --git a/docs/image/image4.png b/docs/image/image4.png
deleted file mode 100644
index d186d22..0000000
Binary files a/docs/image/image4.png and /dev/null differ
diff --git a/docs/image/image5.png b/docs/image/image5.png
deleted file mode 100644
index 48f6a4a..0000000
Binary files a/docs/image/image5.png and /dev/null differ
diff --git a/docs/image/image6.png b/docs/image/image6.png
deleted file mode 100644
index 77baa78..0000000
Binary files a/docs/image/image6.png and /dev/null differ
diff --git a/docs/image/image7.png b/docs/image/image7.png
deleted file mode 100644
index cbf0a59..0000000
Binary files a/docs/image/image7.png and /dev/null differ
diff --git a/docs/image/image8.png b/docs/image/image8.png
deleted file mode 100644
index 23c5d49..0000000
Binary files a/docs/image/image8.png and /dev/null differ
diff --git a/docs/image/image9.png b/docs/image/image9.png
deleted file mode 100644
index e0b384f..0000000
Binary files a/docs/image/image9.png and /dev/null differ
diff --git a/docs/image/image_mq.png b/docs/image/image_mq.png
deleted file mode 100644
index 1dae1df..0000000
Binary files a/docs/image/image_mq.png and /dev/null differ
diff --git a/docs/libbpf_sar.md b/docs/libbpf_sar.md
deleted file mode 100644
index 4944fc2..0000000
--- a/docs/libbpf_sar.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# libbpf_sar功能介ç»ï¼š
-
-libbpf_sar是cpu_watcher工具ä¸çš„一个å工具,通过cpu_watcher -s使用;
-
-## 1.åº”ç”¨åœºæ™¯åŠæ„义
-
-libbpf_sar是一个基于eBPF的按照指定时间间隔(默认为1s)æ¥ç»Ÿè®¡ç‰¹å®šäº‹ä»¶å‘生次数和特定事件å 用CPU时间的工具。使用它å¯ä»¥å¸®åŠ©æ‚¨æŸ¥çœ‹äº‹ä»¶å‘生速率和CPU资æºåˆ©ç”¨çŽ‡ï¼Œå¹¶æä¾›CPU负载画åƒä»¥å‰–æžè´Ÿè½½çš„æ¥æºåŠå…¶å 用比例。
-
-ä¸Žä¼ ç»Ÿå·¥å…·ç›¸æ¯”ï¼Œlibbpf_sarå¯æä¾›æ›´ä¸ºç»†è‡´çš„æŒ‡æ ‡ï¼Œå¦‚ï¼š
-
-* 1.å¯æŠŠå†…æ ¸æ€æ—¶é—´å‰–æžä¸ºå†…æ ¸çº¿ç¨‹æ‰§è¡Œæ—¶é—´sar和进程系统调用时间
-
-* 2.部分linuxå‘行版å¯èƒ½ç”±äºŽå†…æ ¸ç¼–è¯‘é€‰é¡¹ç¡®å®žè€Œä¸èƒ½è®°å½•irq时间,本工具å¯ä»¥å¼¥è¡¥è¿™ä¸€ç¼ºé™·ï¼Œå¹¶ä¸”ä¸éœ€è¦å¯¹å†…æ ¸åšå‡ºä»»ä½•更改,å¯åŠ¨æ€æ£€æµ‹
-
-3.å¯é™„åŠ åˆ°æŒ‡å®šè¿›ç¨‹ä¸Šï¼Œå¯¹è¯¥è¿›ç¨‹å 用的CPU资æºè¿›è¡Œå®žæ—¶ç›‘测
-
-## 2.æ€§èƒ½å‚æ•°åŠè§‚测æ„义
-
-在 Linux ä¸ï¼Œä¸Ž CPU 相关的状æ€å¯ä»¥åˆ†ä¸ºå¾ˆå¤šç±»ï¼Œå¦‚用户æ€ã€ç³»ç»Ÿè°ƒç”¨ã€ç¡¬ä¸æ–以åŠè½¯ä¸æ–ç‰ï¼ŒåŒæ—¶è¿˜æœ‰ä¸€äº›å†…æ ¸çº¿ç¨‹æ‰§è¡Œçš„çŠ¶æ€ï¼Œå¦‚ kthread,idle 进程。
-
-åŒæ—¶ï¼Œä¹Ÿæœ‰ä¸€äº›å¯¹ CPU 相当é‡è¦çš„事件,如新进程创建,进程切æ¢è®¡æ•°ï¼Œè¿è¡Œé˜Ÿ 列长度ç‰ï¼Œå¯¹è¿™äº›ç»†åˆ†äº‹ä»¶è¿›è¡Œå‡†ç¡®çš„监测,有利于我们剖æžå‡º CPU è´Ÿè½½æ ¹æºï¼Œ 并定ä½å‡ºæ€§èƒ½ç“¶é¢ˆã€‚
-
-libbpf_sarä¸»è¦æ˜¯å¯¹ CPU 上的关键事件æä¾›çš„具体信æ¯å‚数与å«ä¹‰å¦‚表3-6所示:
-
-libbpf_sar 实例采集信æ¯åŠå«ä¹‰
-
-| **æ€§èƒ½æŒ‡æ ‡** | **å«ä¹‰** |
-| ------------ | -------------------------------- |
-| Proc | 新创建的进程数 |
-| Cswch | 进程切æ¢è®¡æ•° |
-| runqlen | è¿è¡Œé˜Ÿåˆ—长度 |
-| irqTime | ç¡¬ä¸æ–æ—¶é—´ |
-| Softirq | è½¯ä¸æ–æ—¶é—´ |
-| Idle | Idle 进程è¿è¡Œæ—¶é—´ |
-| Sysc | åŠ ä¸Šå†…æ ¸çº¿ç¨‹è¿è¡Œæ—¶é—´çš„ç³»ç»Ÿæ€æ—¶é—´ |
-| Utime | ç”¨æˆ·æ€æ‰§è¡Œæ—¶é—´ |
-| sys | 系统调用执行时间 |
-
-本实例采集到的信æ¯å°†ç³»ç»Ÿçš„ CPU 进行了精准分类,并且也统计了关键事件的触å‘é¢‘çŽ‡ï¼Œå¯¹äºŽç³»ç»Ÿçš„æ€§èƒ½åˆ†æžæœ‰é‡è¦çš„æ„ä¹‰
-
-## 3.è¾“å‡ºæ ¼å¼ï¼š
-
-```bash
- time proc/s cswch/s irqTime/us softirq/us idle/ms kthread/us sysc/ms utime/ms sys/ms
-15:55:43 48 1389 1646 8866 6811 3243 688 717 691
-15:55:44 31 1089 1587 7375 6759 1868 659 707 660
-15:55:45 47 1613 1685 8885 6792 3268 796 828 799
-15:55:46 0 2133 5938 7797 7643 8106 8 20 17
-15:55:47 1 3182 5128 14279 6644 4883 314 363 319
-15:55:48 0 1815 1773 11329 6753 4286 282 313 287
-15:55:49 31 1249 1605 9859 6752 4442 545 585 549
-15:55:50 47 1601 1712 11348 6765 6249 210 242 216
-15:55:51 0 1238 10591 12709 6802 13896 238 262 252
-15:55:52 0 1145 1658 10000 6863 4593 308 333 313
-15:55:53 0 1317 1587 9090 6798 4699 383 414 387
-15:55:54 31 1254 1531 9570 6755 4252 381 414 385
-15:55:55 47 1547 1624 10985 6769 6516 344 373 350
-15:55:56 0 1064 2187 9892 6851 4585 189 212 194
-```
-
-* proc/s 列的数æ®è¡¨ç¤º CPU æ¯ç§’新创建的进程数;
-* cswch/s 列的数æ®è¡¨ç¤º CPU æ¯ç§’进程切æ¢çš„æ•°é‡ï¼›
-* runqlen 列的数æ®è¡¨ç¤º CPU è¿è¡Œé˜Ÿåˆ—的长度;
-* irqTime/us 列的数æ®è¡¨ç¤º CPU 处ç†ç¡¬ä¸æ–的时间,以 us 计时;
-* softirq/s 列的数æ®è¡¨ç¤º CPU æ¯ç§’处ç†è½¯ä¸æ–的时间,以 us 计时;
-* idle/ms 列的数æ®è¡¨ç¤º 系统处于空闲æ€çš„æ—¶é—´ï¼›
-* kthread/us 列的数æ®è¡¨ç¤ºç³»ç»Ÿä¸å†…æ ¸çº¿ç¨‹æ‰§è¡Œçš„æ—¶é—´ï¼›
-
-* sysc/ms 表示系统ä¸å†…æ ¸çº¿ç¨‹å¤–åŠ ç³»ç»Ÿè°ƒç”¨å¤„ç†çš„æ€»æ—¶é—´ï¼›
-* utime/ms è¡¨ç¤ºè¿›ç¨‹åœ¨ç”¨æˆ·æ€æ‰§è¡Œçš„æ€»æ—¶é—´ï¼›
-* sys/ms 表示系统调用执行的总时间。
-
-äº‹ä»¶çš„ç»Ÿè®¡æ–¹å¼æ˜¯å¯¹æ¯ä¸ªCPUåˆ†å¼€ç»Ÿè®¡ç„¶åŽæ±‚å’Œï¼Œå› æ¤æœ‰çš„项的å 用时间å¯èƒ½è¶…过1s。所有事件å 用时间的和应当为1s * 总CPUæ ¸æ•°ã€‚ç”±äºŽæŠ€æœ¯é—®é¢˜ï¼Œè¾“å‡ºçš„ç¬¬ä¸€é¡¹å¯èƒ½å差较大,å¯ä»¥ä¸äºˆç†ä¼šã€‚按Ctrl+C本程åºå°†åœæ¢ç»Ÿè®¡ï¼Œå¹¶è¾“出在程åºè¿è¡Œçš„æ—¶é—´æ®µå†…å„表项的平å‡å€¼æŒ‰ç…§2sçš„é‡‡æ ·é¢‘çŽ‡æ˜¾ç¤ºå„事件的CPUå ç”¨çŽ‡ã€‚æ•°æ®æ˜¯å¸¦é¢œè‰²çš„,è“色表示CPUå æ¯”å°äºŽ30%ï¼Œç»¿è‰²è¡¨ç¤ºå æ¯”大于30%å°äºŽ60%ï¼Œçº¢è‰²è¡¨ç¤ºå æ¯”大于60%。
-
-
-
-## 4.æ•°æ®å¯è§†åŒ–
-
-
-
-
\ No newline at end of file
diff --git a/docs/mq_delay.md b/docs/mq_delay.md
deleted file mode 100644
index cfcc1ba..0000000
--- a/docs/mq_delay.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# mq_delay
-
-为了对进程间通过消æ¯é˜Ÿåˆ—通信时,å‘逿¶ˆæ¯ã€æŽ¥æ‰‹æ¶ˆæ¯ä»¥åŠå¤„于ç‰å¾…çŠ¶æ€æ‰€ç”¨æ—¶é—´è¿›è¡Œç›‘测,cpuwatcher工具增添mq_delay工具。
-
-
-
-以上是å‘é€è¿›ç¨‹å‘é€ï¼ŒæŽ¥æ”¶è¿›ç¨‹æŽ¥æ”¶çš„具体过程。本工具通过跟踪å•个的消æ¯å—(struct msg_msg结构体)æ¥ç›‘测å‘逿—¶å»¶ã€æŽ¥æ”¶æ—¶å»¶ä»¥åŠç‰å¾…时延。
-
-## 跟踪消æ¯å—过程:
-
-å‘é€è¿‡ç¨‹
-
-* 用户程åºå°†è¦å‘é€çš„æ¶ˆæ¯é€šè¿‡mq_send()函数或mq_timedsend()函数å‘é€ï¼Œmq_send/mq_timedsend函数调用mq_timedsendç³»ç»Ÿè°ƒç”¨åœ¨å†…æ ¸å®žçŽ°å…·ä½“çš„å‘é€å®žçŽ°ï¼Œæ¤æ—¶å°†æŒ‡å‘ç”¨æˆ·æ€æ¶ˆæ¯ç¼“冲区的指针u_msg_pträ¼ å…¥å†…æ ¸æ€ï¼Œæ¤å¤„我们第一次追踪到消æ¯å—。
-* 在mq_timedsend 系统调用ä¸ï¼Œä¼šè°ƒç”¨do_mq_timedsend()å†…æ ¸å‡½æ•°è¿›è¡Œå‘逿¶ˆæ¯çš„æ“ä½œï¼Œæ¤å¤„å°†u_msg_ptræŒ‡é’ˆä½œä¸ºä¼ å‚ä¼ å…¥do_mq_timedsend()函数;
-* 在do_mq_timedsend()函数ä¸ï¼Œé€šè¿‡load_msg()函数将消æ¯ä»Žç”¨æˆ·ç©ºé—´åŠ è½½åˆ°å†…æ ¸ä¸ï¼Œè¿™é‡Œå°†u_msg_ptræŒ‡é’ˆä½œä¸ºä¼ å‚ï¼›
-* load_msg()函数ä¸ï¼Œé€šè¿‡copy_from_user()函数将u_msg_ptr指针指å‘的用户空间信æ¯å¤åˆ¶åˆ°åˆ†é…çš„å†…æ ¸ç©ºé—´msgï¼Œå¹¶è¿”å›žä¸€ä¸ªæŒ‡å‘æ¶ˆæ¯å—æ‰€åœ¨å†…æ ¸ç©ºé—´çš„æŒ‡é’ˆmsg_ptrï¼Œæ¤æ—¶æˆ‘ä»¬ä¾¿åœ¨å†…æ ¸ä¸è·Ÿè¸ªåˆ°äº†å…·ä½“的消æ¯å—实体,åŽç»æ“作都是围绕这个消æ¯å—指针展开的,包括接收程åºä¹Ÿæ˜¯å¯¹æ¤æŒ‡é’ˆè¿›è¡Œcopy_to_useræ“作;
-
-接å—过程
-
-* 用户程åºé€šè¿‡mq_receive()或mq_timedreceive()函数,从消æ¯é˜Ÿåˆ—ä¸æŽ¥æ”¶æ¶ˆæ¯ï¼Œmq_receive()或mq_timedreceive()函数调用mq_timedreceiveç³»ç»Ÿè°ƒç”¨åœ¨å†…æ ¸ä¸å®žçŽ°å…·ä½“çš„æŽ¥æ”¶å®žçŽ°ï¼Œæ¤æ—¶å°†æŒ‡å‘用户æ€ç¼“冲区的指针u_msg_pträ¼ å…¥å†…æ ¸ï¼Œè¿™é‡Œæ˜¯æˆ‘ä»¬æœ¬æ¬¡è·Ÿè¸ªæœ€åŽä¸€æ¬¡é‡åˆ°æ¶ˆæ¯å—。
-* mq_timedreceive系统调用通过do_mq_timedreceive()å‡½æ•°æ‰¾åˆ°è¦æŽ¥æ”¶çš„æ¶ˆæ¯å—ï¼Œå¹¶å°†å…¶ä¼ å…¥u_msg_ptr所指å‘的用户空间
-* do_mq_timedreceive()函数如果ç‰åˆ°è¦æŽ¥æ”¶çš„æ¶ˆæ¯å—,会通过store_msg()函数将消æ¯å—(å‘逿—¶msg_ptr所指å‘的消æ¯å—)å˜å‚¨è‡³u_msg_ptr所指å‘çš„ç”¨æˆ·ç©ºé—´ã€‚æ‰€ä»¥æ¤æ—¶ï¼Œæˆ‘们在接收消æ¯çš„å†…æ ¸å¤„ç†å‡½æ•°ä¸è¿½è¸ªåˆ°äº†å…·ä½“的消æ¯å—。
-
-æ¤å¤„è¿˜å¯æ‹“展一些功能:
-
-* 对于å‘逿¶ˆæ¯å—时,是å¦ä¸Šç‰å¾…队列,ç‰å¾…了多久?
-* 对于接收消æ¯å—时,是å¦ä¸Šç‰å¾…队列,ç‰å¾…了多久?
-* 对于处于éžé˜»å¡žçжæ€çš„进程,是å¦å¯ä»¥è¯†åˆ«åˆ°ï¼Œå¹¶åŠæ—¶ç»Ÿè®¡å‡ºæ¥ï¼Ÿ
-
-## 挂载点:
-
-å‘é€è¿‡ç¨‹ï¼š
-
-| 类型 | åç§° |
-| --------- | -------------- |
-| kprobe | do_mq_timesend |
-| kprobe | load_msg |
-| kretprobe | load_msg |
-| kretprobe | do_mq_timesend |
-
-接收过程:
-
-| 类型 | åç§° |
-| --------- | ----------------- |
-| kprobe | do_mq_timereceive |
-| kprobe | store_msg |
-| kretprobe | store_msg |
-| kretprobe | do_mq_timereceive |
-
-输出效果
-
-```c
-Time: 22:12:39
------------------------------------------------------------------------------------------------------------------------
-Mqdes: 3 msg_len: 1152 msg_prio: 50
-SND_PID: 20945 SND_enter_time: 131725037824711 SND_exit_time: 131725037867085
-RCV_PID: 20984 RCV_enter_time: 131726555726321 RCV_exit_time: 131726555872719
--------------------------------------------------------------------------------
-SND_Delay/ms: 0.04 RCV_Delay/ms: 0.15 Delay/ms: 1518.04801
------------------------------------------------------------------------------------------------------------------------
-
-
-
-Time: 22:12:44
------------------------------------------------------------------------------------------------------------------------
-Mqdes: 3 msg_len: 1152 msg_prio: 50
-SND_PID: 21007 SND_enter_time: 131730008219660 SND_exit_time: 131730008614901
-RCV_PID: 21035 RCV_enter_time: 131731465676396 RCV_exit_time: 131731465758821
--------------------------------------------------------------------------------
-SND_Delay/ms: 0.40 RCV_Delay/ms: 0.08 Delay/ms: 1457.53916
------------------------------------------------------------------------------------------------------------------------
-
-
-
-Time: 22:12:48
------------------------------------------------------------------------------------------------------------------------
-Mqdes: 3 msg_len: 1152 msg_prio: 50
-SND_PID: 21069 SND_enter_time: 131733828139276 SND_exit_time: 131733828195905
-RCV_PID: 21098 RCV_enter_time: 131735705540405 RCV_exit_time: 131735705924036
--------------------------------------------------------------------------------
-SND_Delay/ms: 0.06 RCV_Delay/ms: 0.38 Delay/ms: 1877.78476
------------------------------------------------------------------------------------------------------------------------
-```
-
-
-
-
-
-
-
-
-
diff --git a/docs/preempt_time.md b/docs/preempt_time.md
deleted file mode 100644
index e35aaf2..0000000
--- a/docs/preempt_time.md
+++ /dev/null
@@ -1,44 +0,0 @@
-## preempt_time工具介ç»
-
-​ preempt_time,ç»Ÿè®¡æ¯æ¬¡ç³»ç»Ÿä¸æŠ¢å 调度所用的时间。
-
-### 原ç†åˆ†æž
-
-​ 使用 btf raw tracepointç›‘æŽ§å†…æ ¸ä¸çš„æ¯æ¬¡è°ƒåº¦äº‹ä»¶ï¼š
-
-```c
-SEC("tp_btf/sched_switch")
-```
-
-​ btf raw tracepoint 跟常规 raw tracepoint 有一个 最主è¦çš„区别是: btf 版本å¯ä»¥ç›´æŽ¥åœ¨ ebpf 程åºä¸è®¿é—®å†…æ ¸å†…å˜ï¼Œ ä¸éœ€è¦åƒå¸¸è§„ raw tracepoint ä¸€æ ·éœ€è¦å€ŸåŠ©ç±»ä¼¼ `bpf_core_read` 或 `bpf_probe_read_kernel` è¿™æ · 的辅助函数æ‰èƒ½è®¿é—®å†…æ ¸å†…å˜ã€‚
-
-```c
-int BPF_PROG(sched_switch, bool preempt, struct task_struct *prev, struct task_struct *next)
-```
-
-​ 该事件为我们æä¾›äº†å…³äºŽæŠ¢å çš„å‚æ•°preempt,我们å¯ä»¥é€šè¿‡åˆ¤æ–preempt的值æ¥å†³å®šæ˜¯å¦è®°å½•本次调度信æ¯ã€‚
-
-​ å¦ä¸€æŒ‚载点为kprobe:finish_task_switchï¼Œå³æœ¬æ¬¡è°ƒåº¦åˆ‡æ¢å®Œæˆè¿›è¡Œæ”¶å°¾å·¥ä½œçš„å‡½æ•°ï¼Œåœ¨æ¤æ—¶é€šè¿‡ebpf map与之å‰è®°å½•的调度信æ¯åšå·®ï¼Œå³å¯å¾—到本次抢å 调度的时间:
-
-```c
-SEC("kprobe/finish_task_switch")
-```
-
-### 输出效果
-
-å¯ä»¥èŽ·å–到抢å 进程的`pid`与进程å,以åŠè¢«æŠ¢å 进程的`pid`ï¼Œå’Œæœ¬æ¬¡æŠ¢å æ—¶é—´ï¼Œå•ä½çº³ç§’
-
-```
-COMM prev_pid next_pid duration_ns
-node 14221 2589 3014
-kworker/u256:1 15144 13516 1277
-node 14221 2589 3115
-kworker/u256:1 15144 13516 1125
-kworker/u256:1 15144 13516 974
-node 14221 2589 2560
-kworker/u256:1 15144 13516 1132
-node 14221 2589 2717
-kworker/u256:1 15144 13516 1206
-kworker/u256:1 15144 13516 1131
-node 14221 2589 3355
-```
diff --git a/docs/schedule_delay.md b/docs/schedule_delay.md
deleted file mode 100644
index 563cfec..0000000
--- a/docs/schedule_delay.md
+++ /dev/null
@@ -1,57 +0,0 @@
-## schedule_delay工具介ç»
-
-​ schedule_delay工具å¯ä»¥æ£€æµ‹è¯¥ç³»ç»Ÿå½“å‰çš„调度延迟。å³ä»Žä¸€ä¸ªä»»åС具备è¿è¡Œçš„æ¡ä»¶ï¼Œåˆ°çœŸæ£æ‰§è¡Œï¼ˆèŽ·å¾— CPU 的执行æƒï¼‰çš„这段时间。
-
-​ å®žæ—¶è§‚æµ‹è¯¥æŒ‡æ ‡å¯ä»¥å¸®åŠ©æˆ‘ä»¬äº†è§£åˆ°å½“å‰æ“作系统的负载。
-
-### 原ç†åˆ†æž
-
-​ åªéœ€è€ƒè™‘ï¼Œåœ¨ä½•æ—¶ä¸€ä¸ªä»»åŠ¡ä¼šè¢«åŠ å…¥è¿è¡Œé˜Ÿåˆ—ç‰å¾…è¿è¡Œã€‚å†…æ ¸æä¾›äº†ä¸¤ä¸ªå‡½æ•°å®žçŽ°è¿™ä¸ªåŠŸèƒ½ï¼š
-
-- 新建的进程通过调用`wake_up_new_task`ï¼Œå°†æ–°åˆ›å»ºçš„ä»»åŠ¡åŠ å…¥runqueueç‰å¾…调度。
-- 进程从ç¡çœ 状æ€è¢«å”¤é†’时触å‘,调用`ttwu_do_wakeup`函数,进入runqueueç‰å¾…调度。
-
-​ å…³äºŽè¿™ä¸¤ä¸ªå‡½æ•°ï¼Œå†…æ ¸æä¾›äº†ä¸¤ä¸ªå¯¹åº”çš„`tracepoint`:
-
-| å†…æ ¸å‡½æ•° | 对应`tracepoint` |
-| :--------------: | :--------------------: |
-| wake_up_new_task | sched:sched_wakeup_new |
-| ttwu_do_wakeup | sched:sched_wakeup |
-
-​ 在触å‘到这两个tracepoint的时候,记录这个进程的信æ¯å’Œè¿›å…¥è¿è¡Œé˜Ÿåˆ—的时间。
-
-​ 除æ¤ä¹‹å¤–,我们还应该考虑到,当一个进程**被迫离开cpu**时,其状æ€ä¾ç„¶æ˜¯`TASK_RUNNING`,所以在schedule时,我们还è¦åšå‡ºåˆ¤æ–,决定该进程是å¦è¦è¢«è®°å½•。
-
-| å†…æ ¸å‡½æ•° | 对应`tracepoint` |
-| :------: | :----------------: |
-| schedule | sched:sched_switch |
-
-​ 在触å‘到这个tracepointæ—¶ï¼Œè®°å½•æ¤æ—¶å³å°†è¦å 用cpu的进程信æ¯ï¼Œé€šè¿‡ebpf map记录的进入è¿è¡Œé˜Ÿåˆ—的时间作差,å³è°ƒåº¦å»¶è¿Ÿã€‚在这里还需è¦åˆ¤æ–上一个进程是å¦è¦è¢«è®°å½•。
-
-```c
- if(prev_state == TASK_RUNNING)//判æ–退出cpu进程的状æ€
-```
-
-​ 最åŽè¦æ³¨æ„的是,为了é¿å…map溢出,我们还需è¦åœ¨è¿›ç¨‹é€€å‡ºçš„æ—¶å€™ï¼Œåˆ 除mapä¸è®°å½•的数æ®ã€‚
-
-| å†…æ ¸å‡½æ•° | 对应`tracepoint` |
-| :------: | :----------------------: |
-| do_exit | sched:sched_process_exit |
-
-### 输出效果
-
-​ 我们å¯ä»¥æ£€æµ‹åˆ°ç³»ç»Ÿä»ŽåŠ è½½ebpf程åºåˆ°å½“å‰çš„å¹³å‡ã€æœ€å¤§ã€æœ€å°è°ƒåº¦æ—¶å»¶ï¼š
-
-```
- TIME avg_delay/μs max_delay/μs min_delay/μs
-17:31:28 35.005000 97.663000 9.399000
-17:31:29 326.518000 12618.465000 7.994000
-17:31:30 455.837000 217053.545000 6.462000
-17:31:31 422.582000 217053.545000 6.462000
-17:31:32 382.627000 217053.545000 6.462000
-17:31:33 360.499000 217053.545000 6.462000
-17:31:34 364.805000 217053.545000 6.462000
-17:31:35 362.039000 217053.545000 6.462000
-17:31:36 373.751000 217053.545000 6.462000
-```
-
diff --git a/include/bpf-compat/gnu/stubs.h b/include/bpf-compat/gnu/stubs.h
new file mode 100644
index 0000000..ad7d139
--- /dev/null
+++ b/include/bpf-compat/gnu/stubs.h
@@ -0,0 +1,11 @@
+/*
+ * Dummy gnu/stubs.h. clang can end up including /usr/include/gnu/stubs.h when
+ * compiling BPF files although its content doesn't play any role. The file in
+ * turn includes stubs-64.h or stubs-32.h depending on whether __x86_64__ is
+ * defined. When compiling a BPF source, __x86_64__ isn't set and thus
+ * stubs-32.h is selected. However, the file is not there if the system doesn't
+ * have 32bit glibc devel package installed leading to a build failure.
+ *
+ * The problem is worked around by making this file available in the include
+ * search paths before the system one when building BPF.
+ */
diff --git a/include/cpu_event.h b/include/cpu_event.h
deleted file mode 100644
index 6947b58..0000000
--- a/include/cpu_event.h
+++ /dev/null
@@ -1,188 +0,0 @@
-//
-// Created by ne0 on 24-10-30.
-//
-
-#ifndef CPU_EVENT_H
-#define CPU_EVENT_H
-
-#include "sys_event.h"
-
-
-#define MAX_CPU_NR 64
-#define SYSCALL_MIN_TIME 1E7
-#define MAX_SYSCALL_COUNT 100
-
-#define MAX_KIDS_NUM 100
-
-#define MAX_LATENCY_BUCKETS 8 // 延迟分为 8 个区间
-
-typedef enum {
- UPDATE_USER_TIME = (1 << 0), // æ›´æ–°ç”¨æˆ·æ€æ—¶é—´
- UPDATE_KERNEL_TIME = (1 << 1), // æ›´æ–°ç³»ç»Ÿæ€æ—¶é—´
- UPDATE_IDLE_TIME = (1 << 2), // 更新空闲时间
- UPDATE_IOWAIT_TIME = (1 << 3), // æ›´æ–° I/O ç‰å¾…æ—¶é—´
- UPDATE_IRQ_TIME = (1 << 4), // æ›´æ–°ç¡¬ä¸æ–æ—¶é—´
- UPDATE_SOFTIRQ_TIME = (1 << 5), // æ›´æ–°è½¯ä¸æ–æ—¶é—´
- UPDATE_RQ_LENGTH = (1 << 6), // æ›´æ–°è¿è¡Œé˜Ÿåˆ—长度
-
- UPDATE_ALL = UPDATE_USER_TIME | UPDATE_KERNEL_TIME | UPDATE_IDLE_TIME |
- UPDATE_IOWAIT_TIME | UPDATE_IRQ_TIME | UPDATE_SOFTIRQ_TIME | UPDATE_RQ_LENGTH
-} cpu_usage_update_flags;
-
-typedef enum {
- GET_LATENCY_EMA = (1 << 0),
- GET_USAGE_EMA = (1 << 1),
- GET_TASK_CSW_EMA = (1 << 2),
- GET_TASK_PREEMPT_EMA = (1 << 3),
-} ema_get_flags;
-
-
-// 调度延迟部分
-// cpu上的任务延迟计数
-// struct cpu_latency_stats {
-// u32 cpu_id;
-// u64 total_latency; // 累积延迟总和
-// u64 total_count; // 总计数
-// u32 avg_latency; // æ¯ä¸ª CPU 的平å‡è°ƒåº¦å»¶è¿Ÿ
-
-// u64 latency_buckets[MAX_LATENCY_BUCKETS]; // æ¯ä¸ªå»¶è¿ŸåŒºé—´çš„计数
-// };
-
-// 系统的任务延迟计数
-struct system_latency_stats {
- u64 total_latency; // 系统总的延迟总和
- u64 total_count; // 系统总任务数
- u32 avg_latency; // 系统的平å‡è°ƒåº¦å»¶è¿Ÿ
-
- u64 latency_buckets[MAX_LATENCY_BUCKETS]; // 系统的ä¸åŒå»¶è¿ŸåŒºé—´çš„计数
-};
-
-struct time_window latency_bk_window;
-struct ema_para latency_ema;
-
-// cpu整体使用情况
-struct cpu_usage_stats {
- u32 cpu_id; // CPU ID
- u32 user_percent; // ç”¨æˆ·æ€æ—¶é—´å 比,放大 1000 å€
- u32 kernel_percent; // å†…æ ¸æ€æ—¶é—´å 比
- u32 idle_percent; // ç©ºé—²æ—¶é—´å æ¯”
- u32 iowait_percent; // I/O ç‰å¾…æ—¶é—´å æ¯”
- u32 irq_percent; // ç¡¬ä¸æ–æ—¶é—´å æ¯”
- u32 softirq_percent; // è½¯ä¸æ–æ—¶é—´å æ¯”
-
- u64 total_times; // kernel+usr+idle,计算时候用的
-
- u32 rq_length; // 当å‰è¿è¡Œé˜Ÿåˆ—长度
-};
-
-// 系统整体的cpu使用情况
-struct sys_cpu_usage_stats{
- u32 user_percent; // ç”¨æˆ·æ€æ—¶é—´å 比,放大 1000 å€
- u32 kernel_percent; // å†…æ ¸æ€æ—¶é—´å 比
- u32 idle_percent; // ç©ºé—²æ—¶é—´å æ¯”
- u32 iowait_percent; // I/O ç‰å¾…æ—¶é—´å æ¯”
- u32 irq_percent; // ç¡¬ä¸æ–æ—¶é—´å æ¯”
- u32 softirq_percent; // è½¯ä¸æ–æ—¶é—´å æ¯”
-
- u32 rq_length; // è¿è¡Œé˜Ÿåˆ—å¹³å‡é•¿åº¦
-};
-
-// 采用emaæ¥æ›´æ–°usageæ•°æ®ï¼Œtask的和sys的一起
-struct ema_para usage_ema;
-
-
-struct process_struct{
- u32 tgid;
- //struct hash_table kids;
- u32 kids_length;
- bool already_output;
-
- u64 last_total_clear;
- u64 last_lock_clear;
-
- u64 total_use_time;
- u64 lock_time;
- u64 last_clear_time;
-
- u32 total_use_percent;
-};
-
-// 接下æ¥éƒ½æ˜¯task级
-
-struct latency_num {
- u32 pre_size;// å…ˆå‰çš„统计数æ®,方便ema,在å‘ç”¨æˆ·ç©ºé—´ä¼ æ•°æ®æ—¶å€™å˜ç´¢å¼•
- u32 size;
-};
-
-struct runqlat_perf_data{
- u32 data[8];
-};
-
-// 任务的cpu使用率
-// 把cpu使用率高的任务,排除掉idle之åŽï¼Œå…³æ³¨èµ·æ¥åšæ ˆå›žæº¯
-struct task_cpu_usage {
- struct task_info_simple task_info;
-
- //bool already_backtrace;
- bool in_kernel;
- bool in_process;
- bool already_output;
-
- u64 user_time_ns;
- u64 kernel_time_ns;
- u64 total_time_ns;
- u64 last_run_time;
- u64 last_enqeue_time;
-
- u64 wait_time;
- u64 last_clear_time;
- u64 last_trace_time;
-
- u32 user_percent;
- u32 kernel_percent;
- u32 total_percent;
-};
-
-// 上下文切æ¢
-struct task_context_switch {
- struct task_info_simple task_info;
-
- u32 total_switches; // æ€»ä¸Šä¸‹æ–‡åˆ‡æ¢æ•°é‡
- u32 voluntary_switches; // 自愿上下文切æ¢çš„æ•°é‡
- u32 involuntary_switches; // éžè‡ªæ„¿ï¼ˆæŠ¢å )上下文切æ¢çš„æ•°é‡
-};
-
-struct ema_para task_csw_ema;
-
-struct task_preempt{
- struct task_info_simple task_info;
-
- u32 preempt_count; // 抢å 别人的次数
- u32 was_preempted_count; // 被抢å 的次数
-};
-
-struct ema_para task_preempt_ema;
-
-// 由于é”事件本身比较耗性能,所以用æ¡ä»¶ç¼–译
-#ifdef ENABLE_LOCK_MONITORING
-struct lock_event {
- struct task_info_simple task_info;
- u64 lock_address; // é”的内å˜åœ°å€ï¼Œç”¨äºŽåŒºåˆ†ä¸åŒçš„é”
- u64 contention_start; // 争用开始时间戳(纳秒)
- u64 contention_delay; // é”争用的延迟时间(纳秒)
- u32 contention_count; // é”的争用次数
-};
-
-// é”争用的控制å—
-struct lock_ctrl {
- struct ema_para lock_ema;
-
- u32 sampling_rate; // é‡‡æ ·çŽ‡ï¼ˆ0-100),表示百分比
- u64 contention_threshold; // é”争用的延迟阈值(以纳秒为å•ä½ï¼‰ï¼Œä½ŽäºŽæ¤å€¼çš„事件将被忽略
-};
-
-#endif // ENABLE_LOCK_MONITORING
-
-
-
-#endif //CPU_EVENT_H
diff --git a/include/cpu_event_helper.h b/include/cpu_event_helper.h
deleted file mode 100644
index ff987da..0000000
--- a/include/cpu_event_helper.h
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Created by ne0 on 24-10-30.
-//
-
-#ifndef CPU_EVENT_HELPER_H
-#define CPU_EVENT_HELPER_H
-
-#include
-#include "cpu_event.h"
-
-#endif //CPU_EVENT_HELPER_H
diff --git a/include/env.h b/include/env.h
index 5b150c9..7c1abe9 100644
--- a/include/env.h
+++ b/include/env.h
@@ -7,84 +7,65 @@
#include // æä¾›å¸ƒå°”类型支æŒ
#include // æä¾›å—符串处ç†å‡½æ•°ï¼Œå¦‚ memset ç‰
-
-struct env {
- int interval; // procæ•°æ®å»¶è¿Ÿ
- bool cpu_data;
- bool io_data;
- bool mm_data;
- bool net_data;
- bool visualize;// 是å¦å¯è§†åŒ–
- bool std_output;// 终端输出
+struct scx_env {
+ __u64 p_remove_ns; // -d: å»¶è¿Ÿç§»é™¤æ ¸å¿ƒçš„æ—¶é—´ï¼ˆçº³ç§’ï¼‰
+ __u64 r_max; // -m: å¤‡ç”¨å·¢æœ€å¤§æ ¸å¿ƒæ•°
+ __u64 r_impatient; // -i: å¤±è´¥æ¬¡æ•°ï¼Œè§¦å‘æ‰©å±•
+ __u64 slice_ns; // -s: 时间片长度(纳秒)
+ bool find_fully_idle; // -I: 是å¦ä¼˜å…ˆæŸ¥æ‰¾å®Œå…¨ç©ºé—²æ ¸å¿ƒ
+ bool verbose; // -v: 是å¦è¾“出调试信æ¯
};
-const char argp_args_doc[] =
-"Monitor various kernel subsystems\n"
-"\n"
-"USAGE: monitor [-h] [-i INTERVAL] [-c] [-m] [-n] [-v] [-s]\n"
-"\n"
-"EXAMPLES:\n"
-"./monitor -i 2 -c\n"
-" Monitor CPU statistics every 2 seconds\n"
-"./monitor -i 5 -m -n\n"
-" Monitor memory and network statistics every 5 seconds\n"
-"./monitor -v\n"
-" Visualize the data in a graphical interface\n"
-"./monitor -i 1 -s\n"
-" Output statistics to the terminal every second\n"
-"\n"
-"DEFAULTS:\n"
-"Interval: 1 second\n"
-"CPU, IO, and Memory monitoring are off by default\n"
-"Network monitoring is on by default\n"
-"Visualization is off by default, and data is output to the terminal\n";
+// 定义 sched_ext 傿•°çš„交互函数
+void interactive_sched_ext_config(struct scx_env *sched_env) {
+ char input[64];
+ printf("\nEntering sched_ext configuration mode. Leave input empty to use defaults.\n");
-static const struct argp_option argp_options[] = {
- // name/longopt:str, key/shortopt:int, arg:str, flags:int, doc:str
- {"interval", 'i', "INTERVAL", 0, "Set the monitoring interval in seconds (default: 1)"},
- {"cpu", 'c', NULL, 0, "Enable CPU monitoring"},
- {"io", 'I', NULL, 0, "Enable IO monitoring"},
- {"memory", 'm', NULL, 0, "Enable memory monitoring"},
- {"network", 'n', NULL, 0, "Enable network monitoring"},
- {"visualize", 'v', NULL, 0, "Enable data visualization"},
- {"stdout", 's', NULL, 0, "Output data to the terminal (stdout)"},
- {NULL, 0, NULL, 0, NULL}
-};
+ // 输入延迟移除时间
+ printf("Enter delay before removing an idle core (us) [default: %llu]: ", sched_env->p_remove_ns / 1000);
+ if (fgets(input, sizeof(input), stdin) && input[0] != '\n') {
+ sched_env->p_remove_ns = strtoull(input, NULL, 0) * 1000;
+ }
+
+ // è¾“å…¥å¤‡ç”¨å·¢æœ€å¤§æ ¸å¿ƒæ•°
+ printf("Enter maximum number of cores in reserve nest [default: %llu]: ", sched_env->r_max);
+ if (fgets(input, sizeof(input), stdin) && input[0] != '\n') {
+ sched_env->r_max = strtoull(input, NULL, 0);
+ }
+
+ // 输入失败次数
+ printf("Enter number of successive placement failures tolerated [default: %llu]: ", sched_env->r_impatient);
+ if (fgets(input, sizeof(input), stdin) && input[0] != '\n') {
+ sched_env->r_impatient = strtoull(input, NULL, 0);
+ }
+
+ // 输入时间片长度
+ printf("Enter slice duration (us) [default: %llu]: ", sched_env->slice_ns / 1000);
+ if (fgets(input, sizeof(input), stdin) && input[0] != '\n') {
+ sched_env->slice_ns = strtoull(input, NULL, 0) * 1000;
+ }
-static error_t parse_arg(int key, char *arg, struct argp_state *state) {
- struct env *env = state->input;
+ // æ˜¯å¦æŸ¥æ‰¾å®Œå…¨ç©ºé—²æ ¸å¿ƒ
+ printf("Enable finding fully idle cores? (y/n) [default: %s]: ", sched_env->find_fully_idle ? "y" : "n");
+ if (fgets(input, sizeof(input), stdin) && input[0] != '\n') {
+ sched_env->find_fully_idle = (input[0] == 'y' || input[0] == 'Y');
+ }
- switch (key) {
- case 'i': // Set interval
- env->interval = atoi(arg);
- break;
- case 'c': // Enable CPU monitoring
- env->cpu_data = true;
- break;
- case 'I': // Enable IO monitoring
- env->io_data = true;
- break;
- case 'm': // Enable memory monitoring
- env->mm_data = true;
- break;
- case 'n': // Enable network monitoring
- env->net_data = true;
- break;
- case 'v': // Enable visualization
- env->visualize = true;
- break;
- case 's': // Output to stdout
- env->std_output = true;
- break;
- case ARGP_KEY_ARG:
- case ARGP_KEY_END:
- break;
- default:
- return ARGP_ERR_UNKNOWN;
+ // 是å¦å¯ç”¨è°ƒè¯•模å¼
+ printf("Enable verbose mode? (y/n) [default: %s]: ", sched_env->verbose ? "y" : "n");
+ if (fgets(input, sizeof(input), stdin) && input[0] != '\n') {
+ sched_env->verbose = (input[0] == 'y' || input[0] == 'Y');
}
+ printf("\nSched_ext configuration complete:\n");
+ printf(" Delay (ns): %llu\n", sched_env->p_remove_ns);
+ printf(" Reserve max cores: %llu\n", sched_env->r_max);
+ printf(" Impatient iterations: %llu\n", sched_env->r_impatient);
+ printf(" Slice duration (ns): %llu\n", sched_env->slice_ns);
+ printf(" Find fully idle cores: %s\n", sched_env->find_fully_idle ? "Enabled" : "Disabled");
+ printf(" Verbose mode: %s\n", sched_env->verbose ? "Enabled" : "Disabled");
+
return 0;
}
-
#endif
\ No newline at end of file
diff --git a/include/hash_table.h b/include/hash_table.h
deleted file mode 100644
index ec593e3..0000000
--- a/include/hash_table.h
+++ /dev/null
@@ -1,546 +0,0 @@
-#ifndef HASH_TABLE_H
-#define HASH_TABLE_H
-
-#define HASH_TABLE_SIZE 128
-#define MAX_COLLISIONS 4
-//#define HASH_TABLE_VALUE_SIZE (HASH_TABLE_SIZE * sizeof(unsigned int)) + (HASH_TABLE_SIZE * MAX_COLLISIONS * sizeof(unsigned int))
-#define HASH_LIST_LENGTH (HASH_TABLE_SIZE * MAX_COLLISIONS)
-
-struct hash_table{
- unsigned int hash_node[HASH_TABLE_SIZE][MAX_COLLISIONS];
- //unsigned int hash_node[HASH_LIST_LENGTH];
- //unsigned int collisions[HASH_TABLE_SIZE * MAX_COLLISIONS];
- unsigned int counts[HASH_TABLE_SIZE];// 记录æ¯ä¸ªå†²çªæ¡¶ä¸çš„å…ƒç´ æ•°é‡
- unsigned int last_valid_index;
- unsigned int padding; // å¡«å……å—æ®µï¼Œç¡®ä¿æ€»å¤§å°ä¸º2568å—节
-};
-
-static void hash_table_init(struct hash_table *table) {
- table->last_valid_index = 0;
- for (int i = 0; i < HASH_TABLE_SIZE; i++) {
- table->counts[i] = 0;
- for (int j = 0; j < MAX_COLLISIONS; j++) {
- table->hash_node[i][j] = (unsigned int)-1;
- }
- }
-}
-
-// static void hash_table_init(struct hash_table *table) {
-// #pragma unroll
-// for (int i = 0; i < HASH_TABLE_SIZE; i++) {
-// table->counts[i] = 0;
-// //#pragma unroll
-// // for (int j = 0; j < MAX_COLLISIONS; j++) {
-// // table->hash_node[i][j] = (unsigned int)-1; // 使用 -1 表示空值
-// // }
-// }
-// for(int i = 0;i < HASH_TABLE_SIZE * MAX_COLLISIONS;i++)
-// table->hash_node[i] = (unsigned int)-1;
-// }
-
-
-
-static unsigned int hash_func(unsigned int key) {
- return key % HASH_TABLE_SIZE;
-}
-
-static unsigned int hash_table_lookup(struct hash_table *table, unsigned int key, bool create) {
- unsigned int hash_index = hash_func(key); // 计算哈希索引
- if(hash_index >= HASH_TABLE_SIZE)
- return (unsigned int)-1;
-
- // 首先检查 `hash_node` 䏿˜¯å¦å·²ç»å˜å‚¨äº†æ¤ key
- // if (table->hash_node[hash_index] == key) {
- // return table->hash_node[hash_index];
- // }
-
- for (int i = 0; i < table->counts[hash_index] && i < MAX_COLLISIONS; i++) {
- if (table->hash_node[hash_index][i] == key) {
- return table->hash_node[hash_index][i];
- }
- }
-
- if (create && table->counts[hash_index] < MAX_COLLISIONS) {
- // 如果找ä¸åˆ°ä¸”éœ€è¦æ’入新值
- table->hash_node[hash_index][table->counts[hash_index]] = key;
- table->counts[hash_index]++;
- if(hash_index > table->last_valid_index)
- table->last_valid_index = hash_index;
- return table->hash_node[hash_index][table->counts[hash_index] - 1];
- }
-
- return (unsigned int)-1; // æœªæ‰¾åˆ°ä¸”ä¸æ’å…¥
-}
-
-// static unsigned int hash_table_lookup(struct hash_table *table, unsigned int key, bool create) {
-// unsigned int hash_index = hash_func(key); // 计算哈希索引
-// unsigned int start_index = hash_index * MAX_COLLISIONS; // 计算起始ä½ç½®
-
-// if(hash_index >= HASH_TABLE_SIZE)
-// return (unsigned int)-1;
-// unsigned int count = table->counts[hash_index]; // 当剿¡¶ä¸çš„å…ƒç´ æ•°é‡
-
-// // é历冲çªé“¾ï¼ŒæŸ¥æ‰¾æŒ‡å®šçš„é”®
-// for (unsigned int i = 0; i < count && i < MAX_COLLISIONS; i++) {
-// unsigned int idx = start_index + i;
-// if(idx >= HASH_TABLE_SIZE * MAX_COLLISIONS)
-// return (unsigned int)-1;
-
-// if (table->hash_node[idx] == key) {
-// return table->hash_node[idx]; // 找到返回
-// }
-// }
-
-// // 如果未找到并且å…许创建新的æ¡ç›®
-// if (create && count < MAX_COLLISIONS) {
-// unsigned int new_index = start_index + count;
-// if(new_index >= HASH_TABLE_SIZE * MAX_COLLISIONS)
-// return (unsigned int)-1;
-
-// table->hash_node[new_index] = key; // æ’入新值
-// table->counts[hash_index]++; // æ›´æ–°å…ƒç´ æ•°é‡
-// if (hash_index > table->last_valid_index) {
-// table->last_valid_index = hash_index; // æ›´æ–°æœ€åŽæœ‰æ•ˆç´¢å¼•
-// }
-// return table->hash_node[new_index]; // 返回æ’入的值
-// }
-
-// return (unsigned int)-1; // æœªæ‰¾åˆ°ä¸”ä¸æ’å…¥
-// }
-
-
-// static int hash_table_insert(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key);
-// if(hash_index >= HASH_TABLE_SIZE)
-// return (unsigned int)-1;
-// unsigned int count = table->counts[hash_index];
-// if(hash_table_lookup(table,key,false) == key){
-// return 1;// 防æ¢é‡å¤æ’å…¥
-// }
-
-// if (count < MAX_COLLISIONS) {
-// table->hash_node[hash_index][count] = key;
-// table->counts[hash_index]++;
-// if(hash_index > table->last_valid_index)
-// table->last_valid_index = hash_index;
-// } else {
-// return -1;
-// }
-// return 0;
-// }
-
-// static int hash_table_insert(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key);
-// if (hash_index >= HASH_TABLE_SIZE)
-// return -1;
-
-// unsigned int start_index = hash_index * MAX_COLLISIONS;
-// unsigned int count = table->counts[hash_index];
-
-// // 查找是å¦å·²ç»å˜åœ¨ï¼Œé˜²æ¢é‡å¤æ’å…¥
-// if (hash_table_lookup(table, key, false) == key) {
-// return 1; // 防æ¢é‡å¤æ’å…¥
-// }
-
-// // å¦‚æžœå½“å‰æ¡¶çš„冲çªé“¾æœªæ»¡ï¼Œåˆ™æ’入新值
-// if (count < MAX_COLLISIONS) {
-// unsigned int new_index = start_index + count;
-// if(new_index >= HASH_TABLE_SIZE * MAX_COLLISIONS)
-// return (unsigned int)-1;
-
-// table->hash_node[new_index] = key; // æ’入新值
-// table->counts[hash_index]++; // æ›´æ–°å…ƒç´ æ•°é‡
-
-// // æ›´æ–°æœ€åŽæœ‰æ•ˆç´¢å¼•
-// if (hash_index > table->last_valid_index) {
-// table->last_valid_index = hash_index;
-// }
-// } else {
-// return -1; // 冲çªé“¾å·²æ»¡ï¼Œæ— 法æ’å…¥
-// }
-
-// return 0; // æˆåŠŸæ’å…¥
-// }
-
-
-
-// åˆ é™¤é”®å€¼å¯¹
-// static int hash_table_delete(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key); // 计算哈希索引
-// if(hash_index >= HASH_TABLE_SIZE)
-// return -1;
-// for (int i = 0; i < table->counts[hash_index] && i < MAX_COLLISIONS; i++) {
-// if (table->hash_node[hash_index][i] == key) {
-// // 将最åŽä¸€ä¸ªå…ƒç´ ç§»åŠ¨åˆ°è¢«åˆ é™¤çš„ä½ç½®ï¼Œä»¥ä¿æŒè¿žç»æ€§
-// // table->hash_node[hash_index][i] = table->hash_node[hash_index][table->counts[hash_index] - 1];
-// // table->hash_node[hash_index][table->counts[hash_index] - 1] = (unsigned int)-1;
-// // table->counts[hash_index]--;
-
-// // if (hash_index == table->last_valid_index && table->counts[hash_index] == 0) {
-// // while (table->last_valid_index > 0 && table->counts[table->last_valid_index] == 0) {
-// // table->last_valid_index--;
-// // }
-// // }
-// // return 0;// æˆåŠŸåˆ é™¤
-// if (table->counts[hash_index] > 0 && table->counts[hash_index] <= MAX_COLLISIONS){
-// table->hash_node[hash_index][i] = table->hash_node[hash_index][table->counts[hash_index] - 1];
-// table->hash_node[hash_index][table->counts[hash_index] - 1] = (unsigned int)-1;
-// table->counts[hash_index]--;
-
-// // 检查 table->last_valid_index çš„åˆæ³•性
-// if (hash_index == table->last_valid_index && table->counts[hash_index] == 0) {
-// while (table->last_valid_index > 0 && table->counts[table->last_valid_index] == 0) {
-// table->last_valid_index--;
-// }
-// }
-// return 0; // æˆåŠŸåˆ é™¤
-// }
-// else{
-// return -1;
-// }
-// }
-// }
-// return 1;// 没找到
-// }
-
-static int hash_table_delete(struct hash_table *table, unsigned int key) {
- unsigned int hash_index = hash_func(key); // 计算哈希索引
-
- // 检查 hash_index çš„åˆæ³•性
- if (hash_index >= HASH_TABLE_SIZE)
- return -1;
-
- // èŽ·å– counts[hash_index] 的值
- int count = table->counts[hash_index];
-
- // 检查 counts[hash_index] 是å¦åœ¨åˆæ³•范围内
- // å› ä¸ºè¦åˆ 除,所以count一定è¦å¤§äºŽ0
- if (count <= 0 || count > MAX_COLLISIONS)
- return -1;
-
- // é历哈希链表
- #pragma unroll
- for (int i = 0; i < MAX_COLLISIONS; i++) {
- if (i >= count)
- break;
-
- // 检查 i 的范围
- if (i < 0 || i >= MAX_COLLISIONS)
- return -1;
-
- if (table->hash_node[hash_index][i] == key) {
- // 在使用 counts[hash_index] - 1 之å‰ï¼Œå†æ¬¡æ£€æŸ¥
- if (count <= 0 || count > MAX_COLLISIONS)
- return -1;
-
- int last_index = count - 1;
-
- // 检查 last_index 的范围
- if (last_index < 0 || last_index >= MAX_COLLISIONS)
- return -1;
-
- // 将最åŽä¸€ä¸ªå…ƒç´ ç§»åŠ¨åˆ°è¢«åˆ é™¤çš„ä½ç½®ï¼Œä»¥ä¿æŒè¿žç»æ€§
- table->hash_node[hash_index][i] = table->hash_node[hash_index][last_index];
- table->hash_node[hash_index][last_index] = (unsigned int)-1;
- table->counts[hash_index]--;
-
- // 更新 count 的值
- count = table->counts[hash_index];
-
- // æ›´æ–° last_valid_index
- // if (hash_index == table->last_valid_index && count == 0) {
- // while (table->last_valid_index > 0 && table->counts[table->last_valid_index] == 0) {
- // table->last_valid_index--;
- // }
- // }
- if (hash_index == table->last_valid_index && count == 0) {
- if (table->last_valid_index > 0 && table->last_valid_index < HASH_TABLE_SIZE) {
- // 使用固定次数的循环,展开循环以满足验è¯å™¨çš„è¦æ±‚
- #pragma unroll
- for (int idx = 0; idx < HASH_TABLE_SIZE; idx++) {
- if (table->last_valid_index == 0)
- break;
-
- // 检查 last_valid_index çš„åˆæ³•性
- if (table->last_valid_index <= 0 || table->last_valid_index > HASH_TABLE_SIZE)
- break;
-
- // 检查 counts æ•°ç»„è®¿é—®çš„åˆæ³•性
- if (table->last_valid_index >= HASH_TABLE_SIZE)
- break;
-
- if (table->counts[table->last_valid_index] != 0)
- break;
-
- table->last_valid_index--;
- }
- }
- }
-
- return 0; // æˆåŠŸåˆ é™¤
- }
- }
- return 1; // 没找到
-}
-
-// static int hash_table_delete(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key); // 计算哈希索引
-
-// // 检查 hash_index çš„åˆæ³•性
-// if (hash_index >= HASH_TABLE_SIZE) {
-// return -1;
-// }
-
-// // èŽ·å–æ¡¶ä¸å…ƒç´ æ•°é‡
-// int count = table->counts[hash_index];
-
-// // 检查 count 是å¦åœ¨åˆæ³•范围内
-// if (count <= 0 || count > MAX_COLLISIONS) {
-// return -1;
-// }
-
-// // è®¡ç®—å½“å‰æ¡¶çš„èµ·å§‹ä½ç½®
-// unsigned int start_index = hash_index * MAX_COLLISIONS;
-
-// // éåŽ†å“ˆå¸Œé“¾è¡¨ä»¥æŸ¥æ‰¾å¾…åˆ é™¤çš„å…ƒç´
-// #pragma unroll
-// for (int i = 0; i < MAX_COLLISIONS; i++) {
-// if (i >= count) {
-// break; // æ²¡æœ‰æ›´å¤šå…ƒç´ å¯é历
-// }
-
-// unsigned int current_index = start_index + i;
-
-// if (table->hash_node[current_index] == key) {
-// // 在使用 counts[hash_index] - 1 之å‰ï¼Œå†æ¬¡æ£€æŸ¥
-// if (count <= 0 || count > MAX_COLLISIONS) {
-// return -1;
-// }
-
-// int last_index = count - 1;
-// unsigned int last_elem_index = start_index + last_index;
-
-// // 检查 last_index 的范围
-// if (last_index < 0 || last_elem_index >= HASH_TABLE_SIZE * MAX_COLLISIONS) {
-// return -1;
-// }
-
-// // 将最åŽä¸€ä¸ªå…ƒç´ ç§»åŠ¨åˆ°è¢«åˆ é™¤çš„ä½ç½®ï¼Œä»¥ä¿æŒè¿žç»æ€§
-// table->hash_node[current_index] = table->hash_node[last_elem_index];
-// table->hash_node[last_elem_index] = (unsigned int)-1; // 清空最åŽä¸€ä¸ªå…ƒç´
-// table->counts[hash_index]--;
-
-// // 更新 count 的值
-// count = table->counts[hash_index];
-
-// // æ›´æ–° last_valid_index
-// if (hash_index == table->last_valid_index && count == 0) {
-// if (table->last_valid_index > 0 && table->last_valid_index < HASH_TABLE_SIZE) {
-// // 使用固定次数的循环,以满足验è¯å™¨çš„è¦æ±‚
-// #pragma unroll
-// for (int idx = 0; idx < HASH_TABLE_SIZE; idx++) {
-// if (table->last_valid_index == 0) {
-// break;
-// }
-
-// // 检查 last_valid_index çš„åˆæ³•性
-// if (table->last_valid_index <= 0 || table->last_valid_index >= HASH_TABLE_SIZE) {
-// break;
-// }
-
-// if (table->counts[table->last_valid_index] != 0) {
-// break;
-// }
-
-// table->last_valid_index--;
-// }
-// }
-// }
-
-// return 0; // æˆåŠŸåˆ é™¤
-// }
-// }
-
-// return 1; // 没找到
-// }
-
-
-
-// 返回key之åŽçš„ä¸‹ä¸€ä¸ªæœ‰æ•ˆå…ƒç´ ï¼Œé历用,返回(unsigned int)-1表示到尾巴了
-// static unsigned int hash_table_foreach(struct hash_table *table,unsigned int key){
-// unsigned int hash_index = hash_func(key);
-// if(hash_index >= HASH_TABLE_SIZE)
-// return (unsigned int)-1;
-// bool found = false;
-
-// for (unsigned int i = hash_index; i <= table->last_valid_index && i < HASH_TABLE_SIZE; i++) {
-// for (unsigned int j = 0; j < table->counts[i] && jhash_node[i][j];
-// }
-// if (table->hash_node[i][j] == key) {
-// found = true;
-// }
-// }
-// }
-// return (unsigned int)-1;
-// }
-
-// static unsigned int hash_table_foreach(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key);
-// if (hash_index >= HASH_TABLE_SIZE)
-// return (unsigned int)-1;
-// int found = 0;
-
-// #pragma unroll
-// for (int i = 0; i < HASH_TABLE_SIZE - hash_index; i++) {
-// unsigned int idx = hash_index + i;
-// if (idx >= HASH_TABLE_SIZE || idx > table->last_valid_index)
-// return (unsigned int)-1;
-
-// // if ((void *)&table->counts[idx] + sizeof(unsigned int) > (void *)table + HASH_TABLE_VALUE_SIZE)
-// // return (unsigned int)-1;
-
-// if (idx * sizeof(unsigned int) >= HASH_TABLE_VALUE_SIZE)
-// return (unsigned int)-1;
-
-// unsigned int count = table->counts[idx];
-
-// if (count == 0)
-// continue;
-
-// if (count > MAX_COLLISIONS)
-// count = MAX_COLLISIONS;
-
-// #pragma unroll
-// for (unsigned int j = 0; j < MAX_COLLISIONS; j++) {
-// if (j >= count || j>=MAX_COLLISIONS)
-// break;
-
-// // if (idx >= HASH_TABLE_SIZE)
-// // return (unsigned int)-1;
-// if ((idx * MAX_COLLISIONS + j) * sizeof(unsigned int) >= HASH_TABLE_VALUE_SIZE)
-// return (unsigned int)-1;
-
-// //unsigned int *data = table->hash_node[idx];
-
-// if (found) {
-// if(j < MAX_COLLISIONS && jhash_node[idx][j];
-// break;
-// }
-
-// if (table->hash_node[idx][j] == key) {
-// found = 1;
-// }
-// }
-// }
-// return (unsigned int)-1;
-// }
-
-
-// static unsigned int hash_table_foreach(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key);
-// if (hash_index >= HASH_TABLE_SIZE)
-// return (unsigned int)-1; // æ£€æŸ¥å“ˆå¸Œç´¢å¼•çš„åˆæ³•性
-
-// int found = 0; // æ ‡è®°æ˜¯å¦æ‰¾åˆ° key
-// unsigned int max_index = (table->last_valid_index + 1) * MAX_COLLISIONS;
-
-// unsigned int current_index=0,value=(unsigned int)-1;
-
-// #pragma unroll
-// for (unsigned int i = hash_index * MAX_COLLISIONS; i < max_index && i < 512; i++) {
-// // ä½¿ç”¨å–æ¨¡æ“作æ¥ç¡®ä¿ç´¢å¼•åœ¨åˆæ³•范围内
-// //unsigned int current_index = i % (HASH_TABLE_SIZE * MAX_COLLISIONS);
-// current_index = i;
-
-// // æå‰ç»“æŸé历,如果当å‰ç´¢å¼•超过了最大有效索引
-// if (current_index >= max_index)
-// return (unsigned int)-1;
-
-// current_index &= (HASH_LIST_LENGTH - 1); // 强制é™åˆ¶åœ¨ [0, 511]
-// // if(current_index >= HASH_TABLE_SIZE * MAX_COLLISIONS)
-// // return (unsigned int)-1;
-// if(current_index < 512){
-// value = table->hash_node[current_index];
-// if (found && value != (unsigned int)-1) {
-// return value;
-// }
-
-// // 检查当å‰å€¼æ˜¯å¦ç‰äºŽ key
-// if (value == key) {
-// found = 1; // æ ‡è®°å·²æ‰¾åˆ° key
-// }
-// }
-// else
-// {
-// return (unsigned int)-1;
-// }
-// //value = table->hash_node[current_index];
-// // if(i >= HASH_TABLE_SIZE * MAX_COLLISIONS)
-// // return (unsigned int)-1;
-// // unsigned int value = table->hash_node[i];
-
-// // å¦‚æžœæ‰¾åˆ°ä¹‹å‰æ ‡è®°çš„ key,返回找到的下一个有效值
-// // if (found && value != (unsigned int)-1) {
-// // return value;
-// // }
-
-// // // 检查当å‰å€¼æ˜¯å¦ç‰äºŽ key
-// // if (value == key) {
-// // found = 1; // æ ‡è®°å·²æ‰¾åˆ° key
-// // }
-// }
-
-// return (unsigned int)-1; // 未找到下一个有效元ç´
-// }
-
-// static unsigned int hash_table_foreach(struct hash_table *table, unsigned int key) {
-// unsigned int hash_index = hash_func(key);
-// if (hash_index >= HASH_TABLE_SIZE)
-// return (unsigned int)-1;
-
-// if(table->last_valid_index >= HASH_TABLE_SIZE)
-// table->last_valid_index = HASH_TABLE_SIZE - 1;
-// unsigned int max_index = (table->last_valid_index + 1) * MAX_COLLISIONS;
-// if(max_index > HASH_LIST_LENGTH)
-// max_index = HASH_LIST_LENGTH;
-// unsigned int current_index = hash_index * MAX_COLLISIONS; // 从 key 的哈希槽起始ä½ç½®å¼€å§‹
-// unsigned int value = (unsigned int)-1;
-// int found = 0; // æ ‡è®°æ˜¯å¦æ‰¾åˆ°å½“å‰ key
-
-// //#pragma unroll
-// for (unsigned int i = current_index; i < HASH_LIST_LENGTH; i++) {
-// if(i >= max_index)
-// return (unsigned int)-1;
-// // 强制é™åˆ¶ current_index 的范围
-// //current_index = i & (HASH_LIST_LENGTH - 1);
-// current_index = i;
-
-// // 检查å移是å¦åˆæ³•,é¿å…越界访问
-// // unsigned int offset = current_index * sizeof(unsigned int);
-// // if (offset + sizeof(unsigned int) > sizeof(table->hash_node))
-// // return (unsigned int)-1;
-
-// value = table->hash_node[current_index];
-
-// if (found && value != (unsigned int)-1) {
-// // 找到下一个有效值,返回
-// return value;
-// }
-
-// if (value == key) {
-// // æ ‡è®°æ‰¾åˆ° key
-// found = 1;
-// }
-// }
-
-// return (unsigned int)-1; // 未找到下一个有效值
-// }
-
-
-
-
-
-#endif // HASH_TABLE_H
\ No newline at end of file
diff --git a/include/io_event.h b/include/io_event.h
deleted file mode 100644
index 6f7964e..0000000
--- a/include/io_event.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef IO_EVENT_H
-#define IO_EVENT_H
-#include "sys_event.h"
-
-struct io_wait_perf_data {
- u32 count_list[8];
-};
-
-struct io_task_stats {
- struct task_info_simple info;
- u32 read_count;
- u32 write_count;
-
- u64 last_clear_time;
- u32 already_output;// 防æ¢ä¸€ä¸ªå‘¨æœŸå†…多次输出
-};
-
-struct io_process_stats {
- u32 tgid;
- u32 read_count;
- u32 write_count;
-
- u64 last_clear_time;
- u32 already_output;// 防æ¢ä¸€ä¸ªå‘¨æœŸå†…多次输出
-};
-
-struct io_stats_threhold {
- u32 read_count;
- u32 write_count;
-
- u64 time_window;
-};
-
-#endif //CPU_EVENT_H
\ No newline at end of file
diff --git a/include/mm_event.h b/include/mm_event.h
deleted file mode 100644
index 6580d76..0000000
--- a/include/mm_event.h
+++ /dev/null
@@ -1,113 +0,0 @@
-#ifndef MM_EVENT_H
-#define MM_EVENT_H
-
-#include "sys_event.h"
-
-#define ALLOCS_MAX_ENTRIES 100000
-#define COMBINED_ALLOCS_MAX_ENTRIES 10240
-#define PERF_MAX_STACK_DEPTH 128
-
-#define __PT_PARM1_REG di
-#define __PT_PARM2_REG si
-#define __PT_PARM3_REG dx
-#define __PT_PARM4_REG cx
-#define __PT_PARM5_REG r8
-#define __PT_PARM6_REG r9
-/*
- * Syscall uses r10 for PARM4. See arch/x86/entry/entry_64.S:entry_SYSCALL_64
- * comments in Linux sources. And refer to syscall(2) manpage.
- */
-#define __PT_PARM1_SYSCALL_REG __PT_PARM1_REG
-#define __PT_PARM2_SYSCALL_REG __PT_PARM2_REG
-#define __PT_PARM3_SYSCALL_REG __PT_PARM3_REG
-#define __PT_PARM4_SYSCALL_REG r10
-#define __PT_PARM5_SYSCALL_REG __PT_PARM5_REG
-#define __PT_PARM6_SYSCALL_REG __PT_PARM6_REG
-
-#define __PT_RET_REG sp
-#define __PT_FP_REG bp
-#define __PT_RC_REG ax
-#define __PT_SP_REG sp
-#define __PT_IP_REG ip
-
-#define __PT_REGS_CAST(x) (x)
-
-#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->__PT_RC_REG)
-
-/*
-1. 内å˜åˆ†é…çƒç‚¹
-- ç›‘æµ‹å…·ä½“çš„å†…æ ¸å‡½æ•°æˆ–æ¨¡å—ä¸é¢‘ç¹çš„内å˜åˆ†é…æ“作,确定哪些代ç 路径导致内å˜åŽ‹åŠ›å‡é«˜
-- 通过挂载在 kmallocã€kfree ç‰å†…æ ¸å†…å˜åˆ†é…函数上,å¯ä»¥è¿½è¸ªåˆ†é…内å˜çš„è°ƒç”¨æ ˆï¼Œæ‰¾åˆ°å†…å˜åŽ‹åŠ›çš„ä¸»è¦æ¥æº
-2. 分é…失败的情况
-3. å†…æ ¸å¯¹è±¡ç¼“å˜ï¼ˆSLAB 分é…器)压力
-4. é¡µå›žæ”¶ä¸Žé¡µé¢æŠ–åŠ¨
-- 通过监控 try_to_free_pagesã€shrink_node ç‰å‡½æ•°çš„æ‰§è¡Œï¼Œå¯ä»¥è¯„估页回收的频率和效率,以åŠå¯èƒ½çš„æŠ–动现象
-5. 内å˜å›žæ”¶å’Œ OOM(Out-Of-Memory)事件
-- 当系统å°è¯•回收内å˜å¤±è´¥æ—¶ï¼Œå¯èƒ½ä¼šè§¦å‘ OOM Killer æ€æ»æŸäº›è¿›ç¨‹ã€‚监控 OOM äº‹ä»¶æœ‰åŠ©äºŽäº†è§£å“ªäº›è¿›ç¨‹å› å†…å˜åŽ‹åŠ›è€Œè¢«ç»ˆæ¢
-6. NUMA 节点的内å˜åŽ‹åŠ›
-- 在 NUMA 系统ä¸ï¼ŒæŸäº›èŠ‚ç‚¹å¯èƒ½é¢ä¸´è¾ƒé«˜çš„内å˜åŽ‹åŠ›è€Œå¯¼è‡´å†…å˜åˆ†é…失败。监控ä¸åŒ NUMA 节点的内å˜åˆ†é…和回收情况,有助于了解节点级别的内å˜åŽ‹åŠ›
-*/
-
-struct mm_threhold {
- u32 kmem_threhold;
- u32 vmem_threhold;
- u32 slab_threhold;
-
- u64 time_window;
-};
-
-struct task_mm_stats {
- struct task_info_simple info;
-
- u64 last_clear_time;
-
- u32 kmem_count;
- u32 vmem_count;
- u32 slab_count;
-
- u32 already_output;
-};
-
-struct process_mm_stats {
- u32 tgid;
-
- u32 kmem_count;
- u32 vmem_count;
- u32 slab_count;
-
- u64 last_clear_time;
-
- u32 already_output;
-};
-
-struct oom_event{
- u32 trigger_id;// è§¦å‘ OOM 的进程 PID
- u32 killed_id;// 被 OOM æ€æ»çš„进程 PID
- char comm[TASK_COMM_LEN];// è¢«æ€æ»è¿›ç¨‹çš„命令å
- u64 kill_time;
-};
-
-struct alloc_info {
- u64 size;
- u64 timestamp_ns;
- int stack_id;
- //int stack_id_usr;
-};
-
-struct allocation
-{
- int stack_id;
- u64 size;
- u64 count;
-};
-
-union combined_alloc_info {
- // 结构体作为ä½åŸŸå˜åœ¨,分别å 用 40 ä½å’Œ 24 ä½
- struct {
- u64 total_size : 40;// 40ä½ï¼Œè¡¨ç¤ºæ€»å†…å˜å¤§å°
- u64 number_of_allocs : 24;// 24ä½ï¼Œè¡¨ç¤ºå†…å˜åˆ†é…次数
- };
- u64 bits;// 一个 64 ä½å˜é‡ï¼Œå°†æ€»å†…å˜å¤§å°å’Œåˆ†é…æ¬¡æ•°ç»„åˆæˆä¸€ä¸ª 64 使•°å—
-};
-
-#endif //CPU_EVENT_H
\ No newline at end of file
diff --git a/include/net_event.h b/include/net_event.h
deleted file mode 100644
index a59d74c..0000000
--- a/include/net_event.h
+++ /dev/null
@@ -1,138 +0,0 @@
-#ifndef NET_EVENT_H
-#define NET_EVENT_H
-
-#include "sys_event.h"
-
-#define AF_INET 2
-#define AF_INET6 10
-#define INET6_ADDRSTRLEN 46
-
-#define RETRANSMIT 1
-#define TLP 2
-
-// tcp状æ€
-// enum {
-// TCP_ESTABLISHED = 1,
-// TCP_SYN_SENT,
-// TCP_SYN_RECV,
-// TCP_FIN_WAIT1,
-// TCP_FIN_WAIT2,
-// TCP_TIME_WAIT,
-// TCP_CLOSE,
-// TCP_CLOSE_WAIT,
-// TCP_LAST_ACK,
-// TCP_LISTEN,
-// TCP_CLOSING, /* Now a valid state */
-// TCP_NEW_SYN_RECV,
-// TCP_BOUND_INACTIVE, /* Pseudo-state for inet_diag */
-
-// TCP_MAX_STATES /* Leave at the end! */
-// };
-struct tcp_retransmit_skb_event {
- unsigned short common_type; // é€šç”¨å—æ®µ: 事件类型
- unsigned char common_flags; // é€šç”¨å—æ®µ: æ ‡å¿—ä½
- unsigned char common_preempt_count; // é€šç”¨å—æ®µ: 抢å 计数
- int common_pid; // é€šç”¨å—æ®µ: 当å‰è¿›ç¨‹ PID
-
- const void *skbaddr; // sk_buff 地å€
- const void *skaddr; // 套接å—地å€
-
- int state; // TCP 状æ€
- __u16 sport; // æºç«¯å£å·
- __u16 dport; // ç›®æ ‡ç«¯å£å·
- __u16 family; // åœ°å€æ—
-
- __u8 saddr[4]; // IPv4 æºåœ°å€
- __u8 daddr[4]; // IPv4 ç›®æ ‡åœ°å€
- __u8 saddr_v6[16]; // IPv6 æºåœ°å€
- __u8 daddr_v6[16]; // IPv6 ç›®æ ‡åœ°å€
-};
-
-struct tcp_net_latency {
- union {
- u32 saddr_v4;
- __u8 saddr_v6[16];
- } src_addr;
- union {
- u32 daddr_v4;
- __u8 daddr_v6[16];
- } dst_addr;
- char comm[TASK_COMM_LEN];
- u64 delta; // ç‰å¾…æ—¶é—´
- u64 ts; // 事件å‘生时间
- u32 tgid;
- int af; // åœ°å€æ—类型
- __u16 lport;// 本地端å£å·
- __u16 dport;// ç›®æ ‡ç«¯å£å·
-};
-
-struct tcprtt_perf_data {
- u32 data[8];
-};
-
-struct ipv4_key_t {
- u32 pid;
- char comm[TASK_COMM_LEN];
- u32 saddr;
- u32 daddr;
- __u16 lport;
- __u16 dport;
-};
-
-struct ipv6_key_t {
- unsigned __int128 saddr;
- unsigned __int128 daddr;
- u32 pid;
- char comm[TASK_COMM_LEN];
- __u16 lport;
- __u16 dport;
-};
-
-struct recv_send_bytes {
- u64 recv;
- u64 send;
-
- u64 last_output;// é¿å…åŒä¸€ä¸ªé‡å¤å¤šæ¬¡å‘é€ï¼ŒåŒä¸€ä¸ªæ¯ç§’å‘é€ä¸€æ¬¡
-};
-
-// 实现tcpretrans的结构
-struct tcp_resubmit {
- union {
- u32 saddr_v4;
- __u8 saddr_v6[16];
- } src_addr;
- union {
- u32 daddr_v4;
- __u8 daddr_v6[16];
- } dst_addr;
- char comm[TASK_COMM_LEN];
- int af; // åœ°å€æ—类型
- u16 lport;// 本地端å£å·
- u16 dport;// ç›®æ ‡ç«¯å£å·
- u32 pid;
-
- u32 seq; // åºåˆ—å·
- u64 state; // tcp状æ€
- u64 type; // 事件类型
- u64 occur; // å‘生时间
-};
-
-struct tcp_top_perf_data {
- union {
- u32 saddr_v4;
- __u8 saddr_v6[16];
- } src_addr;
- union {
- u32 daddr_v4;
- __u8 daddr_v6[16];
- } dst_addr;
- char comm[TASK_COMM_LEN];
- u64 send; //
- u64 recv; //
- u32 pid;
- int af; // åœ°å€æ—类型
- __u16 lport;// 本地端å£å·
- __u16 dport;// ç›®æ ‡ç«¯å£å·
-};
-
-#endif
\ No newline at end of file
diff --git a/include/proc_data.h b/include/proc_data.h
index 1ccfbb1..a15856d 100644
--- a/include/proc_data.h
+++ b/include/proc_data.h
@@ -45,105 +45,6 @@ int lookup_txt_file(char *txt_file_path, const char *name, FILE **txt_file) {
return 0; // æˆåŠŸ
}
-// // 创建文件夹,如果文件夹已å˜åœ¨åˆ™ä¸åšä»»ä½•æ“作
-// int create_folder(const char *folder_path) {
-// struct stat st = {0};
-
-// if (stat(folder_path, &st) == -1) {
-// if (mkdir(folder_path, 0755) == -1) {
-// perror("Failed to create folder");
-// return -1;
-// } else {
-// printf("Created folder: %s\n", folder_path);
-// }
-// } else {
-// printf("Folder already exists: %s\n", folder_path);
-// }
-
-// return 0;
-// }
-
-// // 创建 CSV 文件,并返回文件指针
-// FILE* create_csv_in_folder(const char *folder_path, const char *csv_name) {
-// char file_path[MAX_PATH_LEN];
-
-// // æž„é€ æ–‡ä»¶çš„å®Œæ•´è·¯å¾„
-// if (snprintf(file_path, sizeof(file_path), "%s/%s.csv", folder_path, csv_name) >= sizeof(file_path)) {
-// fprintf(stderr, "File path too long: %s/%s.csv\n", folder_path, csv_name);
-// return NULL;
-// }
-
-// // 创建 CSV 文件
-// FILE *csv_file = fopen(file_path, "w");
-// if (csv_file == NULL) {
-// perror("Failed to create CSV file");
-// return NULL;
-// }
-
-// printf("Created CSV file: %s\n", file_path);
-// return csv_file;
-// }
-
-// // 创建下一个 run[i] 文件夹,并返回其路径
-// int create_run_folder(const char *base_dir, char *run_folder_path, size_t size) {
-// char visualize_path[MAX_PATH_LEN];
-// snprintf(visualize_path, sizeof(visualize_path), "%s/visualize", base_dir);
-
-// // 创建 "visualize" 文件夹
-// if (create_folder(visualize_path) != 0) {
-// return -1;
-// }
-
-// // 查找现有的 run[i] 文件夹,找到最大的 i
-// DIR *dir = opendir(visualize_path);
-// if (dir == NULL) {
-// perror("opendir failed");
-// return -1;
-// }
-
-// struct dirent *entry;
-// int max_run = 0;
-
-// while ((entry = readdir(dir)) != NULL) {
-// if (strncmp(entry->d_name, "run", 3) == 0) {
-// int num = atoi(entry->d_name + 3); // èŽ·å– run åŽçš„æ•°å—部分
-// if (num > max_run) {
-// max_run = num;
-// }
-// }
-// }
-
-// closedir(dir);
-
-// // 创建下一个 run[i] 文件夹
-// int next_run = max_run + 1;
-// snprintf(run_folder_path, size, "%s/run%d", visualize_path, next_run);
-
-// if (create_folder(run_folder_path) != 0) {
-// return -1;
-// }
-
-// return 0;
-// }
-
-// // 创建 CSV 文件并返回其路径
-// int visual_create_run_file(char *csv_folder_path, const char *csv_names[], int num_csv_names, FILE *csv_files[]) {
-// // 创建下一个 run[i] 文件夹
-// if (create_run_folder(csv_folder_path, csv_folder_path, MAX_PATH_LEN) != 0) {
-// return -1;
-// }
-
-// // 为æ¯ä¸ª CSV å称创建文件
-// for (int i = 0; i < num_csv_names; i++) {
-// csv_files[i] = create_csv_in_folder(csv_folder_path, csv_names[i]);
-// if (csv_files[i] == NULL) {
-// return -1;
-// }
-// }
-
-// return 0;
-// }
-
// 辅助函数:检查目录是å¦å˜åœ¨ï¼Œå¦‚æžœä¸å˜åœ¨åˆ™åˆ›å»º
int ensure_directory_exists(const char *path) {
struct stat st;
@@ -197,645 +98,4 @@ int visual_create_run_file(char *csv_folder_path, const char *csv_names[], int n
return 0;
}
-
-
-/*---------------------IO部分----------------------------------*/
-#define MAX_DEVICES 256
-#define DEVICE_NAME_LEN 32
-#define DEFAULT_SECTOR_SIZE 512 // 默认扇区大å°ï¼Œå¯æ ¹æ®éœ€è¦è°ƒæ•´
-#define MAX_IO_RESULTS 256
-
-
-// 设备的统计信æ¯ç»“构体
-typedef struct {
- char name[DEVICE_NAME_LEN];
- unsigned long reads_completed;
- unsigned long writes_completed;
- unsigned long sectors_read;
- unsigned long sectors_written;
- unsigned long time_spent_reading;
- unsigned long time_spent_writing;
- unsigned long weighted_time_IO;
- unsigned long time_spent_doing_IO; // æ·»åŠ å—æ®µç”¨äºŽiowait计算
-} DiskStats;
-
-// 读写速率和IOPS的结果结构体
-typedef struct {
- char device[DEVICE_NAME_LEN];
- double read_MB_per_sec;
- double write_MB_per_sec;
- unsigned long IOPS;
- double avg_iowait_ms; // 平凿¯æ¬¡IOç‰å¾…时间(毫秒)
-} DiskIO;
-
-// DiskStats库的上下文结构体
-typedef struct {
- DiskStats previous[MAX_DEVICES];
- int device_count_prev;
-} DiskStatsContext;
-
-// 内部辅助函数:检查设备是å¦éœ€è¦ç›‘控
-static int is_monitored_device(const char* device) {
- // 这里åªç›‘控以 "sd", "nvme", "vd", "mmcblk" 开头的设备
- const char* prefixes[] = {"sd", "nvme", "vd", "mmcblk"};
- int num_prefixes = sizeof(prefixes) / sizeof(prefixes[0]);
- for (int i = 0; i < num_prefixes; i++) {
- size_t len = strlen(prefixes[i]);
- if (strncmp(device, prefixes[i], len) == 0) {
- return 1;
- }
- }
- return 0;
-}
-
-// åˆå§‹åŒ–上下文
-DiskStatsContext* diskstats_init() {
- DiskStatsContext* context = (DiskStatsContext*)malloc(sizeof(DiskStatsContext));
- if (!context) {
- perror("malloc");
- return NULL;
- }
- memset(context->previous, 0, sizeof(context->previous));
- context->device_count_prev = 0;
- return context;
-}
-
-// 清ç†ä¸Šä¸‹æ–‡
-void diskstats_cleanup(DiskStatsContext* context) {
- if (context) {
- free(context);
- }
-}
-
-// 读å–å¹¶è§£æž /proc/diskstats
-int diskstats_read(DiskStatsContext* context, DiskStats* current, int max_devices) {
- if (!context || !current) {
- return -1;
- }
-
- FILE *fp = fopen("/proc/diskstats", "r");
- if (!fp) {
- perror("fopen");
- return -1;
- }
-
- char line[256];
- int count = 0;
- while (fgets(line, sizeof(line), fp) && count < max_devices) {
- unsigned int major, minor;
- char device[DEVICE_NAME_LEN];
- unsigned long fields[11];
- int parsed = sscanf(line,
- "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu",
- &major, &minor, device,
- &fields[0], &fields[1], &fields[2], &fields[3],
- &fields[4], &fields[5], &fields[6], &fields[7],
- &fields[8], &fields[9]);
- if (parsed < 13) {
- continue; // 跳过ä¸å®Œæ•´çš„行
- }
-
- // 过滤ä¸éœ€è¦çš„设备
- if (!is_monitored_device(device)) {
- continue;
- }
-
- // 填充结构体
- strncpy(current[count].name, device, DEVICE_NAME_LEN - 1);
- current[count].name[DEVICE_NAME_LEN - 1] = '\0'; // ç¡®ä¿å—符串终æ¢
- current[count].reads_completed = fields[0];
- current[count].writes_completed = fields[4];
- current[count].sectors_read = fields[2];
- current[count].sectors_written = fields[6];
- current[count].time_spent_reading = fields[3];
- current[count].time_spent_writing = fields[7];
- current[count].weighted_time_IO = fields[9];
- current[count].time_spent_doing_IO = fields[8]; // å¯¹åº”å—æ®µ13
- count++;
- }
-
- fclose(fp);
- return count;
-}
-
-// 计算读写速率ã€IOPS å’Œ iowait
-int diskstats_calculate(const DiskStats* prev, int device_count_prev,
- const DiskStats* current, int device_count_current,
- unsigned int interval_sec, DiskIO* io_results, int max_results) {
- if (!prev || !current || !io_results) {
- return -1;
- }
-
- int result_count = 0;
-
- for (int i = 0; i < device_count_current && result_count < max_results; i++) {
- const DiskStats* curr = ¤t[i];
- // 查找å‰ä¸€æ¬¡çš„相åŒè®¾å¤‡
- const DiskStats* prev_dev = NULL;
- for (int j = 0; j < device_count_prev; j++) {
- if (strcmp(curr->name, prev[j].name) == 0) {
- prev_dev = &prev[j];
- break;
- }
- }
-
- if (prev_dev) {
- unsigned long read_diff = curr->sectors_read - prev_dev->sectors_read;
- unsigned long write_diff = curr->sectors_written - prev_dev->sectors_written;
- unsigned long reads_completed_diff = curr->reads_completed - prev_dev->reads_completed;
- unsigned long writes_completed_diff = curr->writes_completed - prev_dev->writes_completed;
- unsigned long time_spent_doing_IO_diff = curr->time_spent_doing_IO - prev_dev->time_spent_doing_IO;
- unsigned long weighted_time_IO_diff = curr->weighted_time_IO - prev_dev->weighted_time_IO;
-
- // 动æ€èŽ·å–æ‰‡åŒºå¤§å°
- char sector_path[64];
- snprintf(sector_path, sizeof(sector_path), "/sys/block/%s/queue/hw_sector_size", curr->name);
- FILE *fp = fopen(sector_path, "r");
- unsigned int sector_size = DEFAULT_SECTOR_SIZE;
- if (fp) {
- if (fscanf(fp, "%u", §or_size) != 1) {
- sector_size = DEFAULT_SECTOR_SIZE;
- }
- fclose(fp);
- }
-
- double read_MB_per_sec = ((double)(read_diff * sector_size) / (1024.0 * 1024.0)) / interval_sec;
- double write_MB_per_sec = ((double)(write_diff * sector_size) / (1024.0 * 1024.0)) / interval_sec;
- unsigned long IOPS = (reads_completed_diff + writes_completed_diff) / interval_sec;
-
- double iowait_ms = 0.0;
- unsigned long total_IOs = reads_completed_diff + writes_completed_diff;
- if (total_IOs > 0) {
- iowait_ms = ((double)(weighted_time_IO_diff - time_spent_doing_IO_diff)) / total_IOs;
- }
-
- strncpy(io_results[result_count].device, curr->name, DEVICE_NAME_LEN - 1);
- io_results[result_count].device[DEVICE_NAME_LEN - 1] = '\0';
- io_results[result_count].read_MB_per_sec = read_MB_per_sec;
- io_results[result_count].write_MB_per_sec = write_MB_per_sec;
- io_results[result_count].IOPS = IOPS;
- io_results[result_count].avg_iowait_ms = iowait_ms;
-
- result_count++;
- }
- }
-
- return result_count;
-}
-
-// 打å°DiskIO结果,包括iowait
-void diskstats_print(const DiskIO* io_results, int io_count, FILE* stream) {
- if (!io_results || io_count <= 0 || !stream) {
- return;
- }
-
- fprintf(stream, "Disk IO Statistics\n");
- fprintf(stream, "---------------------------------------------------------------------\n");
- fprintf(stream, "%-10s %-12s %-12s %-10s %-12s\n", "Device", "Read(MB/s)", "Write(MB/s)", "IOPS", "iowait(ms)");
- fprintf(stream, "---------------------------------------------------------------------\n");
- for (int i = 0; i < io_count; i++) {
- fprintf(stream, "%-10s %-12.2f %-12.2f %-10lu %-12.2f\n",
- io_results[i].device,
- io_results[i].read_MB_per_sec,
- io_results[i].write_MB_per_sec,
- io_results[i].IOPS,
- io_results[i].avg_iowait_ms);
- }
- fprintf(stream, "---------------------------------------------------------------------\n\n");
-}
-
-/**
- * @brief 处ç†ä¸€æ¬¡I/O统计更新并打å°ç»“æžœ
- *
- * @param context 上下文指针
- * @param current 当å‰ç»Ÿè®¡æ•°æ®æ•°ç»„
- * @param device_count_prev å‰ä¸€æ¬¡çš„设备数é‡
- * @param interval_sec 时间间隔(秒)
- * @return int æˆåŠŸæ—¶è¿”å›žæ–°çš„è®¾å¤‡æ•°é‡ï¼Œå¤±è´¥æ—¶è¿”回-1
- */
-int process_disk_stats(DiskStatsContext* context, DiskStats* current, int* device_count_prev, unsigned int interval_sec) {
- DiskStats new_stats[MAX_DEVICES];
- int device_count_current = diskstats_read(context, new_stats, MAX_DEVICES);
- if (device_count_current < 0) {
- fprintf(stderr, "Failed to read /proc/diskstats.\n");
- return -1;
- }
-
- DiskIO io_results[MAX_IO_RESULTS];
- int io_count = diskstats_calculate(current, *device_count_prev,
- new_stats, device_count_current,
- interval_sec, io_results, MAX_IO_RESULTS);
- if (io_count < 0) {
- fprintf(stderr, "Failed to calculate disk IO statistics.\n");
- return -1;
- }
-
- // 打å°ç»“果,包括iowait
- diskstats_print(io_results, io_count, stdout);
-
- // æ›´æ–°å‰ä¸€æ¬¡çš„统计数æ®
- *device_count_prev = device_count_current;
- memcpy(current, new_stats, sizeof(DiskStats) * device_count_current);
-
- return 0;
-}
-
-/*-------------------------------网络部分----------------------------------------*/
-const char *proc_net_save = "/home/ne0/sys_competition/start/cpu_watcher/visualize/proc";
-FILE *proc_net_file = NULL;
-FILE *sys_net_file = NULL;
-
-// 网络接å£ç»Ÿè®¡ç»“构体
-typedef struct {
- char name[32];
- unsigned long long bytes_recv;
- unsigned long long packets_recv;
- unsigned long long errs_recv;
- unsigned long long drop_recv;
- unsigned long long bytes_sent;
- unsigned long long packets_sent;
- unsigned long long errs_sent;
- unsigned long long drop_sent;
-} NetDevStats;
-
-static inline void safe_fclose(FILE *fp) {
- if (fp) {
- fclose(fp);
- }
-}
-
-// åˆå§‹åŒ– CSV 文件
-void init_proc_net_csv_file() {
- char file_path[256];
- snprintf(file_path, sizeof(file_path), "%s/net.csv", proc_net_save);
-
- // 检查文件是å¦å˜åœ¨
- bool write_header = (access(file_path, F_OK) != 0);
-
- // 在这里打开文件,é¿å…é‡å¤æ‰“å¼€
- sys_net_file = fopen("/proc/net/dev", "r");
- if (!sys_net_file) {
- perror("fopen");
- exit(EXIT_FAILURE);
- }
-
- // æ‰“å¼€æ–‡ä»¶ï¼ˆè¿½åŠ æ¨¡å¼ï¼‰
- proc_net_file = fopen(file_path, "a");
- if (proc_net_file == NULL) {
- perror("Error opening CSV file");
- exit(EXIT_FAILURE);
- }
-
- // å¦‚æžœæ–‡ä»¶æ˜¯æ–°å»ºçš„ï¼Œå†™å…¥æ ‡é¢˜
- if (write_header) {
- fprintf(proc_net_file, "Interface,Bytes Received,Packets Received,Errs Rcv,Drops Rcv,"
- "Bytes Sent,Packets Sent,Errs Sent,Drops Sent\n");
- fflush(proc_net_file);
- }
-}
-
-void close_proc_net_csv_file() {
- if (proc_net_file != NULL) {
- fclose(proc_net_file);
- proc_net_file = NULL;
- }
-
- if(sys_net_file != NULL){
- fclose(sys_net_file);
- sys_net_file = NULL;
- }
-}
-
-// 写入数æ®åˆ° CSV 文件
-void append_to_csv(const char *data) {
- if (proc_net_file == NULL) {
- fprintf(stderr, "Error: CSV file is not initialized\n");
- exit(EXIT_FAILURE);
- }
- fprintf(proc_net_file, "%s", data);
- //fflush(proc_net_file);
-}
-
-// è¯»å– /proc/net/dev 文件,解æžç½‘络接å£çš„统计信æ¯
-int read_net_dev(NetDevStats **stats, int *count) {
- // FILE *fp = fopen("/proc/net/dev", "r");
- // if (!fp) {
- // perror("fopen");
- // return -1;
- // }
-
- char line[512];
- int line_num = 0;
- int dev_index = 0;
- int max_devs = MAX_DEVICES;
- NetDevStats *dev_stats = malloc(max_devs * sizeof(NetDevStats));
- if (!dev_stats) {
- perror("malloc");
- fclose(sys_net_file);
- return -1;
- }
-
- while (fgets(line, sizeof(line), sys_net_file)) {
- line_num++;
- // 跳过å‰ä¸¤è¡Œæ ‡é¢˜
- if (line_num <= 2)
- continue;
-
- // è§£æžæ¯ä¸€è¡Œ
- char iface[32];
- unsigned long long bytes_recv, packets_recv, errs_recv, drop_recv;
- unsigned long long bytes_sent, packets_sent, errs_sent, drop_sent;
- // æ ¼å¼å‚考 /proc/net/dev
- // eth0: bytes packets errs drop fifo frame compressed multicast bytes packets errs drop fifo colls carrier compressed
- int scanned = sscanf(line, " %31[^:]: %llu %llu %llu %llu %*u %*u %*u %*u %llu %llu %llu %llu %*u %*u %*u %*u",
- iface, &bytes_recv, &packets_recv, &errs_recv, &drop_recv,
- &bytes_sent, &packets_sent, &errs_sent, &drop_sent);
- if (scanned != 9)
- continue; // è§£æžå¤±è´¥ï¼Œè·³è¿‡
-
- // 如果超过当å‰åˆ†é…的大å°ï¼Œé‡æ–°åˆ†é…
- if (dev_index >= max_devs) {
- max_devs *= 2;
- NetDevStats *temp = realloc(dev_stats, max_devs * sizeof(NetDevStats));
- if (!temp) {
- perror("realloc");
- free(dev_stats);
- fclose(sys_net_file);
- return -1;
- }
- dev_stats = temp;
- }
-
- // 填充结构体
- strncpy(dev_stats[dev_index].name, iface, sizeof(dev_stats[dev_index].name) - 1);
- dev_stats[dev_index].name[sizeof(dev_stats[dev_index].name) - 1] = '\0'; // ç¡®ä¿å—符串终æ¢
- dev_stats[dev_index].bytes_recv = bytes_recv;
- dev_stats[dev_index].packets_recv = packets_recv;
- dev_stats[dev_index].errs_recv = errs_recv;
- dev_stats[dev_index].drop_recv = drop_recv;
- dev_stats[dev_index].bytes_sent = bytes_sent;
- dev_stats[dev_index].packets_sent = packets_sent;
- dev_stats[dev_index].errs_sent = errs_sent;
- dev_stats[dev_index].drop_sent = drop_sent;
-
- // 调试输出
- // printf("Parsed Interface: %s | Bytes Received: %llu | Packets Received: %llu | Errs Rcv: %llu | Drops Rcv: %llu | Bytes Sent: %llu | Packets Sent: %llu | Errs Sent: %llu | Drops Sent: %llu\n",
- // dev_stats[dev_index].name,
- // dev_stats[dev_index].bytes_recv,
- // dev_stats[dev_index].packets_recv,
- // dev_stats[dev_index].errs_recv,
- // dev_stats[dev_index].drop_recv,
- // dev_stats[dev_index].bytes_sent,
- // dev_stats[dev_index].packets_sent,
- // dev_stats[dev_index].errs_sent,
- // dev_stats[dev_index].drop_sent);
-
- dev_index++;
- }
-
- //fclose(fp);
- *stats = dev_stats;
- *count = dev_index;
- return 0;
-}
-
-
-// è¯»å– /proc/net/tcp 文件,统计当å‰TCP连接数
-int read_net_tcp(int *tcp_count) {
- FILE *fp = fopen("/proc/net/tcp", "r");
- if (!fp) {
- perror("fopen");
- return -1;
- }
-
- char line[512];
- int line_num = 0;
- int count = 0;
-
- while (fgets(line, sizeof(line), fp)) {
- line_num++;
- // è·³è¿‡ç¬¬ä¸€è¡Œæ ‡é¢˜
- if (line_num == 1)
- continue;
-
- // æ¯ä¸€è¡Œä»£è¡¨ä¸€ä¸ªTCP连接,简å•统计行数
- count++;
- }
-
- fclose(fp);
- *tcp_count = count;
- return 0;
-}
-
-// è¯»å– /proc/net/udp å’Œ /proc/net/udp6 文件,统计当å‰UDP连接数
-int read_net_udp(int *udp_count) {
- FILE *fp = fopen("/proc/net/udp", "r");
- if (!fp) {
- perror("fopen");
- return -1;
- }
-
- char line[512];
- int line_num = 0;
- int count = 0;
-
- while (fgets(line, sizeof(line), fp)) {
- line_num++;
- // è·³è¿‡ç¬¬ä¸€è¡Œæ ‡é¢˜
- if (line_num == 1)
- continue;
-
- // æ¯ä¸€è¡Œä»£è¡¨ä¸€ä¸ªUDP连接,简å•统计行数
- count++;
- }
-
- fclose(fp);
-
- // åŒæ ·è¯»å– /proc/net/udp6
- fp = fopen("/proc/net/udp6", "r");
- if (!fp) {
- perror("fopen");
- return -1;
- }
-
- line_num = 0;
- while (fgets(line, sizeof(line), fp)) {
- line_num++;
- if (line_num == 1)
- continue;
- count++;
- }
-
- fclose(fp);
- *udp_count = count;
- return 0;
-}
-
-// 打å°ç½‘络接å£çš„统计信æ¯
-void print_net_dev_stats(NetDevStats *stats, int count,bool visualize) {
- printf("\n=== Network Interface Statistics ===\n");
- printf("%-10s %-15s %-15s %-10s %-10s %-15s %-15s %-10s %-10s\n",
- "Interface", "Bytes Received", "Packets Received", "Errs Rcv", "Drops Rcv",
- "Bytes Sent", "Packets Sent", "Errs Sent", "Drops Sent");
- // 准备 CSV æ•°æ®å—符串
- char csv_data[4096] = {0};
- for (int i = 0; i < count; i++) {
- printf("%-10s %-15llu %-15llu %-10llu %-10llu %-15llu %-15llu %-10llu %-10llu\n",
- stats[i].name,
- stats[i].bytes_recv,
- stats[i].packets_recv,
- stats[i].errs_recv,
- stats[i].drop_recv,
- stats[i].bytes_sent,
- stats[i].packets_sent,
- stats[i].errs_sent,
- stats[i].drop_sent);
- if(visualize){
- char line[512];
- snprintf(line, sizeof(line), "%s,%llu,%llu,%llu,%llu,%llu,%llu,%llu,%llu\n",
- stats[i].name,
- stats[i].bytes_recv,
- stats[i].packets_recv,
- stats[i].errs_recv,
- stats[i].drop_recv,
- stats[i].bytes_sent,
- stats[i].packets_sent,
- stats[i].errs_sent,
- stats[i].drop_sent);
- strcat(csv_data, line);
- }
- }
- // 如果需è¦å†™å…¥ CSV 文件
- if (visualize && proc_net_file != NULL) {
- append_to_csv(csv_data); // è¿½åŠ æ•°æ®åˆ°å…¨å±€ CSV 文件
- }
-}
-
-// 打å°å½“å‰TCP连接数
-void print_tcp_count(int tcp_count) {
- printf("\n=== TCP Connections ===\n");
- printf("Total TCP Connections: %d\n", tcp_count);
-}
-
-// 打å°å½“å‰UDP连接数
-void print_udp_count(int udp_count) {
- printf("\n=== UDP Connections ===\n");
- printf("Total UDP Connections: %d\n", udp_count);
-}
-
-// 释放网络接å£ç»Ÿè®¡ç»“构的内å˜
-void free_net_dev_stats(NetDevStats *stats) {
- if (stats)
- free(stats);
-}
-
-// 监控网络
-int monitor_network(bool visualize) {
- NetDevStats *dev_stats = NULL;
- int dev_count = 0;
- int tcp_count = 0;
- int udp_count = 0;
-
- if(visualize)
- init_proc_net_csv_file();
-
- // 读å–网络接å£ç»Ÿè®¡
- if (read_net_dev(&dev_stats, &dev_count) != 0) {
- fprintf(stderr, "Failed to read /proc/net/dev.\n");
- return -1;
- }
-
- // 读å–TCP连接数
- if (read_net_tcp(&tcp_count) != 0) {
- fprintf(stderr, "Failed to read /proc/net/tcp.\n");
- free_net_dev_stats(dev_stats);
- return -1;
- }
-
- // 读å–UDP连接数
- if (read_net_udp(&udp_count) != 0) {
- fprintf(stderr, "Failed to read /proc/net/udp.\n");
- free_net_dev_stats(dev_stats);
- return -1;
- }
-
- // 打å°ç»Ÿè®¡ä¿¡æ¯
- print_net_dev_stats(dev_stats, dev_count,visualize);
- print_tcp_count(tcp_count);
- print_udp_count(udp_count);
-
- // 释放分é…的内å˜
- free_net_dev_stats(dev_stats);
-
- return 0;
-}
-
-
-/*------------------------------mm部分----------------------------------------*/
-#define MEMINFO_PATH "/proc/meminfo"
-#define MM_INTERVAL 1 // 定时读å–的间隔时间(秒)
-
-FILE *open_meminfo() {
- FILE *file = fopen(MEMINFO_PATH, "r");
- if (!file) {
- perror("Failed to open /proc/meminfo");
- exit(EXIT_FAILURE);
- }
- return file;
-}
-
-void read_meminfo(FILE *file) {
- rewind(file);
-
- char key[256];
- unsigned long value;
- unsigned long mem_total = 0, mem_free = 0, mem_available = 0, buffers = 0, cached = 0;
- unsigned long swap_total = 0, swap_free = 0, committed_as = 0, commit_limit = 0;
-
- while (fscanf(file, "%255[^:]: %lu kB\n", key, &value) == 2) {
- if (strcmp(key, "MemTotal") == 0) {
- mem_total = value;
- } else if (strcmp(key, "MemFree") == 0) {
- mem_free = value;
- } else if (strcmp(key, "MemAvailable") == 0) {
- mem_available = value;
- } else if (strcmp(key, "Buffers") == 0) {
- buffers = value;
- } else if (strcmp(key, "Cached") == 0) {
- cached = value;
- } else if (strcmp(key, "SwapTotal") == 0) {
- swap_total = value;
- } else if (strcmp(key, "SwapFree") == 0) {
- swap_free = value;
- } else if (strcmp(key, "Committed_AS") == 0) {
- committed_as = value;
- } else if (strcmp(key, "CommitLimit") == 0) {
- commit_limit = value;
- }
- }
-
- unsigned long used_memory = mem_total - mem_free;
- unsigned long used_swap = swap_total - swap_free;
- double used_memory_percent = (mem_total > 0) ? (100.0 * used_memory / mem_total) : 0.0;
- double available_memory_percent = (mem_total > 0) ? (100.0 * mem_available / mem_total) : 0.0;
- double used_swap_percent = (swap_total > 0) ? (100.0 * used_swap / swap_total) : 0.0;
- double commit_percent = (commit_limit > 0) ? (100.0 * committed_as / commit_limit) : 0.0;
-
- printf("\n--- Memory Usage ---\n");
- printf("Total Memory: %lu kB\n", mem_total);
- printf("Used Memory: %lu kB (%.2f%%)\n", used_memory, used_memory_percent);
- printf("Available Memory: %lu kB (%.2f%%)\n", mem_available, available_memory_percent);
- printf("Buffers: %lu kB\n", buffers);
- printf("Cached: %lu kB\n", cached);
-
- printf("\n--- Swap Memory ---\n");
- printf("Total Swap: %lu kB\n", swap_total);
- printf("Used Swap: %lu kB (%.2f%%)\n", used_swap, used_swap_percent);
-
- printf("\n--- Memory Commitment ---\n");
- printf("Commit Limit: %lu kB\n", commit_limit);
- printf("Committed AS: %lu kB (%.2f%%)\n", committed_as, commit_percent);
-}
-
-
#endif
\ No newline at end of file
diff --git a/include/scx/common.bpf.h b/include/scx/common.bpf.h
new file mode 100644
index 0000000..225f61f
--- /dev/null
+++ b/include/scx/common.bpf.h
@@ -0,0 +1,427 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
+ * Copyright (c) 2022 Tejun Heo
+ * Copyright (c) 2022 David Vernet
+ */
+#ifndef __SCX_COMMON_BPF_H
+#define __SCX_COMMON_BPF_H
+
+#ifdef LSP
+#define __bpf__
+#include "../vmlinux/vmlinux.h"
+#else
+#include "vmlinux.h"
+#endif
+
+#include
+#include
+#include
+#include "user_exit_info.h"
+
+#define PF_WQ_WORKER 0x00000020 /* I'm a workqueue worker */
+#define PF_KTHREAD 0x00200000 /* I am a kernel thread */
+#define PF_EXITING 0x00000004
+#define CLOCK_MONOTONIC 1
+
+/*
+ * Earlier versions of clang/pahole lost upper 32bits in 64bit enums which can
+ * lead to really confusing misbehaviors. Let's trigger a build failure.
+ */
+static inline void ___vmlinux_h_sanity_check___(void)
+{
+ _Static_assert(SCX_DSQ_FLAG_BUILTIN,
+ "bpftool generated vmlinux.h is missing high bits for 64bit enums, upgrade clang and pahole");
+}
+
+s32 scx_bpf_create_dsq(u64 dsq_id, s32 node) __ksym;
+s32 scx_bpf_select_cpu_dfl(struct task_struct *p, s32 prev_cpu, u64 wake_flags, bool *is_idle) __ksym;
+void scx_bpf_dispatch(struct task_struct *p, u64 dsq_id, u64 slice, u64 enq_flags) __ksym;
+void scx_bpf_dispatch_vtime(struct task_struct *p, u64 dsq_id, u64 slice, u64 vtime, u64 enq_flags) __ksym;
+u32 scx_bpf_dispatch_nr_slots(void) __ksym;
+void scx_bpf_dispatch_cancel(void) __ksym;
+bool scx_bpf_consume(u64 dsq_id) __ksym;
+void scx_bpf_dispatch_from_dsq_set_slice(struct bpf_iter_scx_dsq *it__iter, u64 slice) __ksym;
+void scx_bpf_dispatch_from_dsq_set_vtime(struct bpf_iter_scx_dsq *it__iter, u64 vtime) __ksym;
+bool scx_bpf_dispatch_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __ksym __weak;
+bool scx_bpf_dispatch_vtime_from_dsq(struct bpf_iter_scx_dsq *it__iter, struct task_struct *p, u64 dsq_id, u64 enq_flags) __ksym __weak;
+u32 scx_bpf_reenqueue_local(void) __ksym;
+void scx_bpf_kick_cpu(s32 cpu, u64 flags) __ksym;
+s32 scx_bpf_dsq_nr_queued(u64 dsq_id) __ksym;
+void scx_bpf_destroy_dsq(u64 dsq_id) __ksym;
+int bpf_iter_scx_dsq_new(struct bpf_iter_scx_dsq *it, u64 dsq_id, u64 flags) __ksym __weak;
+struct task_struct *bpf_iter_scx_dsq_next(struct bpf_iter_scx_dsq *it) __ksym __weak;
+void bpf_iter_scx_dsq_destroy(struct bpf_iter_scx_dsq *it) __ksym __weak;
+void scx_bpf_exit_bstr(s64 exit_code, char *fmt, unsigned long long *data, u32 data__sz) __ksym __weak;
+void scx_bpf_error_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym;
+void scx_bpf_dump_bstr(char *fmt, unsigned long long *data, u32 data_len) __ksym __weak;
+u32 scx_bpf_cpuperf_cap(s32 cpu) __ksym __weak;
+u32 scx_bpf_cpuperf_cur(s32 cpu) __ksym __weak;
+void scx_bpf_cpuperf_set(s32 cpu, u32 perf) __ksym __weak;
+u32 scx_bpf_nr_cpu_ids(void) __ksym __weak;
+const struct cpumask *scx_bpf_get_possible_cpumask(void) __ksym __weak;
+const struct cpumask *scx_bpf_get_online_cpumask(void) __ksym __weak;
+void scx_bpf_put_cpumask(const struct cpumask *cpumask) __ksym __weak;
+const struct cpumask *scx_bpf_get_idle_cpumask(void) __ksym;
+const struct cpumask *scx_bpf_get_idle_smtmask(void) __ksym;
+void scx_bpf_put_idle_cpumask(const struct cpumask *cpumask) __ksym;
+bool scx_bpf_test_and_clear_cpu_idle(s32 cpu) __ksym;
+s32 scx_bpf_pick_idle_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym;
+s32 scx_bpf_pick_any_cpu(const cpumask_t *cpus_allowed, u64 flags) __ksym;
+bool scx_bpf_task_running(const struct task_struct *p) __ksym;
+s32 scx_bpf_task_cpu(const struct task_struct *p) __ksym;
+struct rq *scx_bpf_cpu_rq(s32 cpu) __ksym;
+struct cgroup *scx_bpf_task_cgroup(struct task_struct *p) __ksym;
+
+/*
+ * Use the following as @it__iter when calling
+ * scx_bpf_dispatch[_vtime]_from_dsq() from within bpf_for_each() loops.
+ */
+#define BPF_FOR_EACH_ITER (&___it)
+
+static inline __attribute__((format(printf, 1, 2)))
+void ___scx_bpf_bstr_format_checker(const char *fmt, ...) {}
+
+/*
+ * Helper macro for initializing the fmt and variadic argument inputs to both
+ * bstr exit kfuncs. Callers to this function should use ___fmt and ___param to
+ * refer to the initialized list of inputs to the bstr kfunc.
+ */
+#define scx_bpf_bstr_preamble(fmt, args...) \
+ static char ___fmt[] = fmt; \
+ /* \
+ * Note that __param[] must have at least one \
+ * element to keep the verifier happy. \
+ */ \
+ unsigned long long ___param[___bpf_narg(args) ?: 1] = {}; \
+ \
+ _Pragma("GCC diagnostic push") \
+ _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \
+ ___bpf_fill(___param, args); \
+ _Pragma("GCC diagnostic pop") \
+
+/*
+ * scx_bpf_exit() wraps the scx_bpf_exit_bstr() kfunc with variadic arguments
+ * instead of an array of u64. Using this macro will cause the scheduler to
+ * exit cleanly with the specified exit code being passed to user space.
+ */
+#define scx_bpf_exit(code, fmt, args...) \
+({ \
+ scx_bpf_bstr_preamble(fmt, args) \
+ scx_bpf_exit_bstr(code, ___fmt, ___param, sizeof(___param)); \
+ ___scx_bpf_bstr_format_checker(fmt, ##args); \
+})
+
+/*
+ * scx_bpf_error() wraps the scx_bpf_error_bstr() kfunc with variadic arguments
+ * instead of an array of u64. Invoking this macro will cause the scheduler to
+ * exit in an erroneous state, with diagnostic information being passed to the
+ * user.
+ */
+#define scx_bpf_error(fmt, args...) \
+({ \
+ scx_bpf_bstr_preamble(fmt, args) \
+ scx_bpf_error_bstr(___fmt, ___param, sizeof(___param)); \
+ ___scx_bpf_bstr_format_checker(fmt, ##args); \
+})
+
+/*
+ * scx_bpf_dump() wraps the scx_bpf_dump_bstr() kfunc with variadic arguments
+ * instead of an array of u64. To be used from ops.dump() and friends.
+ */
+#define scx_bpf_dump(fmt, args...) \
+({ \
+ scx_bpf_bstr_preamble(fmt, args) \
+ scx_bpf_dump_bstr(___fmt, ___param, sizeof(___param)); \
+ ___scx_bpf_bstr_format_checker(fmt, ##args); \
+})
+
+#define BPF_STRUCT_OPS(name, args...) \
+SEC("struct_ops/"#name) \
+BPF_PROG(name, ##args)
+
+#define BPF_STRUCT_OPS_SLEEPABLE(name, args...) \
+SEC("struct_ops.s/"#name) \
+BPF_PROG(name, ##args)
+
+/**
+ * RESIZABLE_ARRAY - Generates annotations for an array that may be resized
+ * @elfsec: the data section of the BPF program in which to place the array
+ * @arr: the name of the array
+ *
+ * libbpf has an API for setting map value sizes. Since data sections (i.e.
+ * bss, data, rodata) themselves are maps, a data section can be resized. If
+ * a data section has an array as its last element, the BTF info for that
+ * array will be adjusted so that length of the array is extended to meet the
+ * new length of the data section. This macro annotates an array to have an
+ * element count of one with the assumption that this array can be resized
+ * within the userspace program. It also annotates the section specifier so
+ * this array exists in a custom sub data section which can be resized
+ * independently.
+ *
+ * See RESIZE_ARRAY() for the userspace convenience macro for resizing an
+ * array declared with RESIZABLE_ARRAY().
+ */
+#define RESIZABLE_ARRAY(elfsec, arr) arr[1] SEC("."#elfsec"."#arr)
+
+/**
+ * MEMBER_VPTR - Obtain the verified pointer to a struct or array member
+ * @base: struct or array to index
+ * @member: dereferenced member (e.g. .field, [idx0][idx1], .field[idx0] ...)
+ *
+ * The verifier often gets confused by the instruction sequence the compiler
+ * generates for indexing struct fields or arrays. This macro forces the
+ * compiler to generate a code sequence which first calculates the byte offset,
+ * checks it against the struct or array size and add that byte offset to
+ * generate the pointer to the member to help the verifier.
+ *
+ * Ideally, we want to abort if the calculated offset is out-of-bounds. However,
+ * BPF currently doesn't support abort, so evaluate to %NULL instead. The caller
+ * must check for %NULL and take appropriate action to appease the verifier. To
+ * avoid confusing the verifier, it's best to check for %NULL and dereference
+ * immediately.
+ *
+ * vptr = MEMBER_VPTR(my_array, [i][j]);
+ * if (!vptr)
+ * return error;
+ * *vptr = new_value;
+ *
+ * sizeof(@base) should encompass the memory area to be accessed and thus can't
+ * be a pointer to the area. Use `MEMBER_VPTR(*ptr, .member)` instead of
+ * `MEMBER_VPTR(ptr, ->member)`.
+ */
+#define MEMBER_VPTR(base, member) (typeof((base) member) *) \
+({ \
+ u64 __base = (u64)&(base); \
+ u64 __addr = (u64)&((base) member) - __base; \
+ _Static_assert(sizeof(base) >= sizeof((base) member), \
+ "@base is smaller than @member, is @base a pointer?"); \
+ asm volatile ( \
+ "if %0 <= %[max] goto +2\n" \
+ "%0 = 0\n" \
+ "goto +1\n" \
+ "%0 += %1\n" \
+ : "+r"(__addr) \
+ : "r"(__base), \
+ [max]"i"(sizeof(base) - sizeof((base) member))); \
+ __addr; \
+})
+
+/**
+ * ARRAY_ELEM_PTR - Obtain the verified pointer to an array element
+ * @arr: array to index into
+ * @i: array index
+ * @n: number of elements in array
+ *
+ * Similar to MEMBER_VPTR() but is intended for use with arrays where the
+ * element count needs to be explicit.
+ * It can be used in cases where a global array is defined with an initial
+ * size but is intended to be be resized before loading the BPF program.
+ * Without this version of the macro, MEMBER_VPTR() will use the compile time
+ * size of the array to compute the max, which will result in rejection by
+ * the verifier.
+ */
+#define ARRAY_ELEM_PTR(arr, i, n) (typeof(arr[i]) *) \
+({ \
+ u64 __base = (u64)arr; \
+ u64 __addr = (u64)&(arr[i]) - __base; \
+ asm volatile ( \
+ "if %0 <= %[max] goto +2\n" \
+ "%0 = 0\n" \
+ "goto +1\n" \
+ "%0 += %1\n" \
+ : "+r"(__addr) \
+ : "r"(__base), \
+ [max]"r"(sizeof(arr[0]) * ((n) - 1))); \
+ __addr; \
+})
+
+
+/*
+ * BPF declarations and helpers
+ */
+
+/* list and rbtree */
+#define __contains(name, node) __attribute__((btf_decl_tag("contains:" #name ":" #node)))
+#define private(name) SEC(".data." #name) __hidden __attribute__((aligned(8)))
+
+void *bpf_obj_new_impl(__u64 local_type_id, void *meta) __ksym;
+void bpf_obj_drop_impl(void *kptr, void *meta) __ksym;
+
+#define bpf_obj_new(type) ((type *)bpf_obj_new_impl(bpf_core_type_id_local(type), NULL))
+#define bpf_obj_drop(kptr) bpf_obj_drop_impl(kptr, NULL)
+
+void bpf_list_push_front(struct bpf_list_head *head, struct bpf_list_node *node) __ksym;
+void bpf_list_push_back(struct bpf_list_head *head, struct bpf_list_node *node) __ksym;
+struct bpf_list_node *bpf_list_pop_front(struct bpf_list_head *head) __ksym;
+struct bpf_list_node *bpf_list_pop_back(struct bpf_list_head *head) __ksym;
+struct bpf_rb_node *bpf_rbtree_remove(struct bpf_rb_root *root,
+ struct bpf_rb_node *node) __ksym;
+int bpf_rbtree_add_impl(struct bpf_rb_root *root, struct bpf_rb_node *node,
+ bool (less)(struct bpf_rb_node *a, const struct bpf_rb_node *b),
+ void *meta, __u64 off) __ksym;
+#define bpf_rbtree_add(head, node, less) bpf_rbtree_add_impl(head, node, less, NULL, 0)
+
+struct bpf_rb_node *bpf_rbtree_first(struct bpf_rb_root *root) __ksym;
+
+void *bpf_refcount_acquire_impl(void *kptr, void *meta) __ksym;
+#define bpf_refcount_acquire(kptr) bpf_refcount_acquire_impl(kptr, NULL)
+
+/* task */
+struct task_struct *bpf_task_from_pid(s32 pid) __ksym;
+struct task_struct *bpf_task_acquire(struct task_struct *p) __ksym;
+void bpf_task_release(struct task_struct *p) __ksym;
+
+/* cgroup */
+struct cgroup *bpf_cgroup_ancestor(struct cgroup *cgrp, int level) __ksym;
+void bpf_cgroup_release(struct cgroup *cgrp) __ksym;
+struct cgroup *bpf_cgroup_from_id(u64 cgid) __ksym;
+
+/* css iteration */
+struct bpf_iter_css;
+struct cgroup_subsys_state;
+extern int bpf_iter_css_new(struct bpf_iter_css *it,
+ struct cgroup_subsys_state *start,
+ unsigned int flags) __weak __ksym;
+extern struct cgroup_subsys_state *
+bpf_iter_css_next(struct bpf_iter_css *it) __weak __ksym;
+extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym;
+
+/* cpumask */
+struct bpf_cpumask *bpf_cpumask_create(void) __ksym;
+struct bpf_cpumask *bpf_cpumask_acquire(struct bpf_cpumask *cpumask) __ksym;
+void bpf_cpumask_release(struct bpf_cpumask *cpumask) __ksym;
+u32 bpf_cpumask_first(const struct cpumask *cpumask) __ksym;
+u32 bpf_cpumask_first_zero(const struct cpumask *cpumask) __ksym;
+void bpf_cpumask_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym;
+void bpf_cpumask_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym;
+bool bpf_cpumask_test_cpu(u32 cpu, const struct cpumask *cpumask) __ksym;
+bool bpf_cpumask_test_and_set_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym;
+bool bpf_cpumask_test_and_clear_cpu(u32 cpu, struct bpf_cpumask *cpumask) __ksym;
+void bpf_cpumask_setall(struct bpf_cpumask *cpumask) __ksym;
+void bpf_cpumask_clear(struct bpf_cpumask *cpumask) __ksym;
+bool bpf_cpumask_and(struct bpf_cpumask *dst, const struct cpumask *src1,
+ const struct cpumask *src2) __ksym;
+void bpf_cpumask_or(struct bpf_cpumask *dst, const struct cpumask *src1,
+ const struct cpumask *src2) __ksym;
+void bpf_cpumask_xor(struct bpf_cpumask *dst, const struct cpumask *src1,
+ const struct cpumask *src2) __ksym;
+bool bpf_cpumask_equal(const struct cpumask *src1, const struct cpumask *src2) __ksym;
+bool bpf_cpumask_intersects(const struct cpumask *src1, const struct cpumask *src2) __ksym;
+bool bpf_cpumask_subset(const struct cpumask *src1, const struct cpumask *src2) __ksym;
+bool bpf_cpumask_empty(const struct cpumask *cpumask) __ksym;
+bool bpf_cpumask_full(const struct cpumask *cpumask) __ksym;
+void bpf_cpumask_copy(struct bpf_cpumask *dst, const struct cpumask *src) __ksym;
+u32 bpf_cpumask_any_distribute(const struct cpumask *cpumask) __ksym;
+u32 bpf_cpumask_any_and_distribute(const struct cpumask *src1,
+ const struct cpumask *src2) __ksym;
+u32 bpf_cpumask_weight(const struct cpumask *cpumask) __ksym;
+
+/*
+ * Access a cpumask in read-only mode (typically to check bits).
+ */
+const struct cpumask *cast_mask(struct bpf_cpumask *mask)
+{
+ return (const struct cpumask *)mask;
+}
+
+/* rcu */
+void bpf_rcu_read_lock(void) __ksym;
+void bpf_rcu_read_unlock(void) __ksym;
+
+
+/*
+ * Other helpers
+ */
+
+/* useful compiler attributes */
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+#define __maybe_unused __attribute__((__unused__))
+
+/*
+ * READ/WRITE_ONCE() are from kernel (include/asm-generic/rwonce.h). They
+ * prevent compiler from caching, redoing or reordering reads or writes.
+ */
+typedef __u8 __attribute__((__may_alias__)) __u8_alias_t;
+typedef __u16 __attribute__((__may_alias__)) __u16_alias_t;
+typedef __u32 __attribute__((__may_alias__)) __u32_alias_t;
+typedef __u64 __attribute__((__may_alias__)) __u64_alias_t;
+
+static __always_inline void __read_once_size(const volatile void *p, void *res, int size)
+{
+ switch (size) {
+ case 1: *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break;
+ case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break;
+ case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break;
+ case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break;
+ default:
+ barrier();
+ __builtin_memcpy((void *)res, (const void *)p, size);
+ barrier();
+ }
+}
+
+static __always_inline void __write_once_size(volatile void *p, void *res, int size)
+{
+ switch (size) {
+ case 1: *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break;
+ case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break;
+ case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break;
+ case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break;
+ default:
+ barrier();
+ __builtin_memcpy((void *)p, (const void *)res, size);
+ barrier();
+ }
+}
+
+#define READ_ONCE(x) \
+({ \
+ union { typeof(x) __val; char __c[1]; } __u = \
+ { .__c = { 0 } }; \
+ __read_once_size(&(x), __u.__c, sizeof(x)); \
+ __u.__val; \
+})
+
+#define WRITE_ONCE(x, val) \
+({ \
+ union { typeof(x) __val; char __c[1]; } __u = \
+ { .__val = (val) }; \
+ __write_once_size(&(x), __u.__c, sizeof(x)); \
+ __u.__val; \
+})
+
+/*
+ * log2_u32 - Compute the base 2 logarithm of a 32-bit exponential value.
+ * @v: The value for which we're computing the base 2 logarithm.
+ */
+static inline u32 log2_u32(u32 v)
+{
+ u32 r;
+ u32 shift;
+
+ r = (v > 0xFFFF) << 4; v >>= r;
+ shift = (v > 0xFF) << 3; v >>= shift; r |= shift;
+ shift = (v > 0xF) << 2; v >>= shift; r |= shift;
+ shift = (v > 0x3) << 1; v >>= shift; r |= shift;
+ r |= (v >> 1);
+ return r;
+}
+
+/*
+ * log2_u64 - Compute the base 2 logarithm of a 64-bit exponential value.
+ * @v: The value for which we're computing the base 2 logarithm.
+ */
+static inline u32 log2_u64(u64 v)
+{
+ u32 hi = v >> 32;
+ if (hi)
+ return log2_u32(hi) + 32 + 1;
+ else
+ return log2_u32(v) + 1;
+}
+
+#include "compat.bpf.h"
+
+#endif /* __SCX_COMMON_BPF_H */
diff --git a/include/scx/common.h b/include/scx/common.h
new file mode 100644
index 0000000..5b0f901
--- /dev/null
+++ b/include/scx/common.h
@@ -0,0 +1,75 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2023 Meta Platforms, Inc. and affiliates.
+ * Copyright (c) 2023 Tejun Heo
+ * Copyright (c) 2023 David Vernet
+ */
+#ifndef __SCHED_EXT_COMMON_H
+#define __SCHED_EXT_COMMON_H
+
+#ifdef __KERNEL__
+#error "Should not be included by BPF programs"
+#endif
+
+#include
+#include
+#include
+#include
+#include
+
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+typedef uint64_t u64;
+typedef int8_t s8;
+typedef int16_t s16;
+typedef int32_t s32;
+typedef int64_t s64;
+
+#define SCX_BUG(__fmt, ...) \
+ do { \
+ fprintf(stderr, "[SCX_BUG] %s:%d", __FILE__, __LINE__); \
+ if (errno) \
+ fprintf(stderr, " (%s)\n", strerror(errno)); \
+ else \
+ fprintf(stderr, "\n"); \
+ fprintf(stderr, __fmt __VA_OPT__(,) __VA_ARGS__); \
+ fprintf(stderr, "\n"); \
+ \
+ exit(EXIT_FAILURE); \
+ } while (0)
+
+#define SCX_BUG_ON(__cond, __fmt, ...) \
+ do { \
+ if (__cond) \
+ SCX_BUG((__fmt) __VA_OPT__(,) __VA_ARGS__); \
+ } while (0)
+
+/**
+ * RESIZE_ARRAY - Convenience macro for resizing a BPF array
+ * @__skel: the skeleton containing the array
+ * @elfsec: the data section of the BPF program in which the array exists
+ * @arr: the name of the array
+ * @n: the desired array element count
+ *
+ * For BPF arrays declared with RESIZABLE_ARRAY(), this macro performs two
+ * operations. It resizes the map which corresponds to the custom data
+ * section that contains the target array. As a side effect, the BTF info for
+ * the array is adjusted so that the array length is sized to cover the new
+ * data section size. The second operation is reassigning the skeleton pointer
+ * for that custom data section so that it points to the newly memory mapped
+ * region.
+ */
+#define RESIZE_ARRAY(__skel, elfsec, arr, n) \
+ do { \
+ size_t __sz; \
+ bpf_map__set_value_size((__skel)->maps.elfsec##_##arr, \
+ sizeof((__skel)->elfsec##_##arr->arr[0]) * (n)); \
+ (__skel)->elfsec##_##arr = \
+ bpf_map__initial_value((__skel)->maps.elfsec##_##arr, &__sz); \
+ } while (0)
+
+#include "user_exit_info.h"
+#include "compat.h"
+
+#endif /* __SCHED_EXT_COMMON_H */
diff --git a/include/scx/compat.bpf.h b/include/scx/compat.bpf.h
new file mode 100644
index 0000000..e5afe9e
--- /dev/null
+++ b/include/scx/compat.bpf.h
@@ -0,0 +1,47 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2024 Meta Platforms, Inc. and affiliates.
+ * Copyright (c) 2024 Tejun Heo
+ * Copyright (c) 2024 David Vernet
+ */
+#ifndef __SCX_COMPAT_BPF_H
+#define __SCX_COMPAT_BPF_H
+
+#define __COMPAT_ENUM_OR_ZERO(__type, __ent) \
+({ \
+ __type __ret = 0; \
+ if (bpf_core_enum_value_exists(__type, __ent)) \
+ __ret = __ent; \
+ __ret; \
+})
+
+/* v6.12: 819513666966 ("sched_ext: Add cgroup support") */
+#define __COMPAT_scx_bpf_task_cgroup(p) \
+ (bpf_ksym_exists(scx_bpf_task_cgroup) ? \
+ scx_bpf_task_cgroup((p)) : NULL)
+
+/* v6.12: 4c30f5ce4f7a ("sched_ext: Implement scx_bpf_dispatch[_vtime]_from_dsq()") */
+#define __COMPAT_scx_bpf_dispatch_from_dsq_set_slice(it, slice) \
+ (bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_slice) ? \
+ scx_bpf_dispatch_from_dsq_set_slice((it), (slice)) : (void)0)
+#define __COMPAT_scx_bpf_dispatch_from_dsq_set_vtime(it, vtime) \
+ (bpf_ksym_exists(scx_bpf_dispatch_from_dsq_set_vtime) ? \
+ scx_bpf_dispatch_from_dsq_set_vtime((it), (vtime)) : (void)0)
+#define __COMPAT_scx_bpf_dispatch_from_dsq(it, p, dsq_id, enq_flags) \
+ (bpf_ksym_exists(scx_bpf_dispatch_from_dsq) ? \
+ scx_bpf_dispatch_from_dsq((it), (p), (dsq_id), (enq_flags)) : false)
+#define __COMPAT_scx_bpf_dispatch_vtime_from_dsq(it, p, dsq_id, enq_flags) \
+ (bpf_ksym_exists(scx_bpf_dispatch_vtime_from_dsq) ? \
+ scx_bpf_dispatch_vtime_from_dsq((it), (p), (dsq_id), (enq_flags)) : false)
+
+/*
+ * Define sched_ext_ops. This may be expanded to define multiple variants for
+ * backward compatibility. See compat.h::SCX_OPS_LOAD/ATTACH().
+ */
+#define SCX_OPS_DEFINE(__name, ...) \
+ SEC(".struct_ops.link") \
+ struct sched_ext_ops __name = { \
+ __VA_ARGS__, \
+ };
+
+#endif /* __SCX_COMPAT_BPF_H */
diff --git a/include/scx/compat.h b/include/scx/compat.h
new file mode 100644
index 0000000..cc56ff9
--- /dev/null
+++ b/include/scx/compat.h
@@ -0,0 +1,186 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2024 Meta Platforms, Inc. and affiliates.
+ * Copyright (c) 2024 Tejun Heo
+ * Copyright (c) 2024 David Vernet
+ */
+#ifndef __SCX_COMPAT_H
+#define __SCX_COMPAT_H
+
+#include
+#include
+#include
+#include
+
+struct btf *__COMPAT_vmlinux_btf __attribute__((weak));
+
+static inline void __COMPAT_load_vmlinux_btf(void)
+{
+ if (!__COMPAT_vmlinux_btf) {
+ __COMPAT_vmlinux_btf = btf__load_vmlinux_btf();
+ SCX_BUG_ON(!__COMPAT_vmlinux_btf, "btf__load_vmlinux_btf()");
+ }
+}
+
+static inline bool __COMPAT_read_enum(const char *type, const char *name, u64 *v)
+{
+ const struct btf_type *t;
+ const char *n;
+ s32 tid;
+ int i;
+
+ __COMPAT_load_vmlinux_btf();
+
+ tid = btf__find_by_name(__COMPAT_vmlinux_btf, type);
+ if (tid < 0)
+ return false;
+
+ t = btf__type_by_id(__COMPAT_vmlinux_btf, tid);
+ SCX_BUG_ON(!t, "btf__type_by_id(%d)", tid);
+
+ if (btf_is_enum(t)) {
+ struct btf_enum *e = btf_enum(t);
+
+ for (i = 0; i < BTF_INFO_VLEN(t->info); i++) {
+ n = btf__name_by_offset(__COMPAT_vmlinux_btf, e[i].name_off);
+ SCX_BUG_ON(!n, "btf__name_by_offset()");
+ if (!strcmp(n, name)) {
+ *v = e[i].val;
+ return true;
+ }
+ }
+ } else if (btf_is_enum64(t)) {
+ struct btf_enum64 *e = btf_enum64(t);
+
+ for (i = 0; i < BTF_INFO_VLEN(t->info); i++) {
+ n = btf__name_by_offset(__COMPAT_vmlinux_btf, e[i].name_off);
+ SCX_BUG_ON(!n, "btf__name_by_offset()");
+ if (!strcmp(n, name)) {
+ *v = btf_enum64_value(&e[i]);
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+#define __COMPAT_ENUM_OR_ZERO(__type, __ent) \
+({ \
+ u64 __val = 0; \
+ __COMPAT_read_enum(__type, __ent, &__val); \
+ __val; \
+})
+
+static inline bool __COMPAT_has_ksym(const char *ksym)
+{
+ __COMPAT_load_vmlinux_btf();
+ return btf__find_by_name(__COMPAT_vmlinux_btf, ksym) >= 0;
+}
+
+static inline bool __COMPAT_struct_has_field(const char *type, const char *field)
+{
+ const struct btf_type *t;
+ const struct btf_member *m;
+ const char *n;
+ s32 tid;
+ int i;
+
+ __COMPAT_load_vmlinux_btf();
+ tid = btf__find_by_name_kind(__COMPAT_vmlinux_btf, type, BTF_KIND_STRUCT);
+ if (tid < 0)
+ return false;
+
+ t = btf__type_by_id(__COMPAT_vmlinux_btf, tid);
+ SCX_BUG_ON(!t, "btf__type_by_id(%d)", tid);
+
+ m = btf_members(t);
+
+ for (i = 0; i < BTF_INFO_VLEN(t->info); i++) {
+ n = btf__name_by_offset(__COMPAT_vmlinux_btf, m[i].name_off);
+ SCX_BUG_ON(!n, "btf__name_by_offset()");
+ if (!strcmp(n, field))
+ return true;
+ }
+
+ return false;
+}
+
+#define SCX_OPS_SWITCH_PARTIAL \
+ __COMPAT_ENUM_OR_ZERO("scx_ops_flags", "SCX_OPS_SWITCH_PARTIAL")
+
+static inline long scx_hotplug_seq(void)
+{
+ int fd;
+ char buf[32];
+ ssize_t len;
+ long val;
+
+ fd = open("/sys/kernel/sched_ext/hotplug_seq", O_RDONLY);
+ if (fd < 0)
+ return -ENOENT;
+
+ len = read(fd, buf, sizeof(buf) - 1);
+ SCX_BUG_ON(len <= 0, "read failed (%ld)", len);
+ buf[len] = 0;
+ close(fd);
+
+ val = strtoul(buf, NULL, 10);
+ SCX_BUG_ON(val < 0, "invalid num hotplug events: %lu", val);
+
+ return val;
+}
+
+/*
+ * struct sched_ext_ops can change over time. If compat.bpf.h::SCX_OPS_DEFINE()
+ * is used to define ops and compat.h::SCX_OPS_LOAD/ATTACH() are used to load
+ * and attach it, backward compatibility is automatically maintained where
+ * reasonable.
+ *
+ * ec7e3b0463e1 ("implement-ops") in https://github.com/sched-ext/sched_ext is
+ * the current minimum required kernel version.
+ */
+#define SCX_OPS_OPEN(__ops_name, __scx_name) ({ \
+ struct __scx_name *__skel; \
+ \
+ SCX_BUG_ON(!__COMPAT_struct_has_field("sched_ext_ops", "dump"), \
+ "sched_ext_ops.dump() missing, kernel too old?"); \
+ \
+ __skel = __scx_name##__open(); \
+ SCX_BUG_ON(!__skel, "Could not open " #__scx_name); \
+ __skel->struct_ops.__ops_name->hotplug_seq = scx_hotplug_seq(); \
+ __skel; \
+})
+
+#define SCX_OPS_LOAD(__skel, __ops_name, __scx_name, __uei_name) ({ \
+ UEI_SET_SIZE(__skel, __ops_name, __uei_name); \
+ SCX_BUG_ON(__scx_name##__load((__skel)), "Failed to load skel"); \
+})
+
+/*
+ * New versions of bpftool now emit additional link placeholders for BPF maps,
+ * and set up BPF skeleton in such a way that libbpf will auto-attach BPF maps
+ * automatically, assumming libbpf is recent enough (v1.5+). Old libbpf will do
+ * nothing with those links and won't attempt to auto-attach maps.
+ *
+ * To maintain compatibility with older libbpf while avoiding trying to attach
+ * twice, disable the autoattach feature on newer libbpf.
+ */
+#if LIBBPF_MAJOR_VERSION > 1 || \
+ (LIBBPF_MAJOR_VERSION == 1 && LIBBPF_MINOR_VERSION >= 5)
+#define __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name) \
+ bpf_map__set_autoattach((__skel)->maps.__ops_name, false)
+#else
+#define __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name) do {} while (0)
+#endif
+
+#define SCX_OPS_ATTACH(__skel, __ops_name, __scx_name) ({ \
+ struct bpf_link *__link; \
+ __SCX_OPS_DISABLE_AUTOATTACH(__skel, __ops_name); \
+ SCX_BUG_ON(__scx_name##__attach((__skel)), "Failed to attach skel"); \
+ __link = bpf_map__attach_struct_ops((__skel)->maps.__ops_name); \
+ SCX_BUG_ON(!__link, "Failed to attach struct_ops"); \
+ __link; \
+})
+
+#endif /* __SCX_COMPAT_H */
diff --git a/include/scx/user_exit_info.h b/include/scx/user_exit_info.h
new file mode 100644
index 0000000..8ce2734
--- /dev/null
+++ b/include/scx/user_exit_info.h
@@ -0,0 +1,115 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Define struct user_exit_info which is shared between BPF and userspace parts
+ * to communicate exit status and other information.
+ *
+ * Copyright (c) 2022 Meta Platforms, Inc. and affiliates.
+ * Copyright (c) 2022 Tejun Heo
+ * Copyright (c) 2022 David Vernet
+ */
+#ifndef __USER_EXIT_INFO_H
+#define __USER_EXIT_INFO_H
+
+enum uei_sizes {
+ UEI_REASON_LEN = 128,
+ UEI_MSG_LEN = 1024,
+ UEI_DUMP_DFL_LEN = 32768,
+};
+
+struct user_exit_info {
+ int kind;
+ s64 exit_code;
+ char reason[UEI_REASON_LEN];
+ char msg[UEI_MSG_LEN];
+};
+
+#ifdef __bpf__
+
+#ifdef LSP
+#include "../vmlinux/vmlinux.h"
+#else
+#include "vmlinux.h"
+#endif
+#include
+
+#define UEI_DEFINE(__name) \
+ char RESIZABLE_ARRAY(data, __name##_dump); \
+ const volatile u32 __name##_dump_len; \
+ struct user_exit_info __name SEC(".data")
+
+#define UEI_RECORD(__uei_name, __ei) ({ \
+ bpf_probe_read_kernel_str(__uei_name.reason, \
+ sizeof(__uei_name.reason), (__ei)->reason); \
+ bpf_probe_read_kernel_str(__uei_name.msg, \
+ sizeof(__uei_name.msg), (__ei)->msg); \
+ bpf_probe_read_kernel_str(__uei_name##_dump, \
+ __uei_name##_dump_len, (__ei)->dump); \
+ if (bpf_core_field_exists((__ei)->exit_code)) \
+ __uei_name.exit_code = (__ei)->exit_code; \
+ /* use __sync to force memory barrier */ \
+ __sync_val_compare_and_swap(&__uei_name.kind, __uei_name.kind, \
+ (__ei)->kind); \
+})
+
+#else /* !__bpf__ */
+
+#include
+#include
+
+/* no need to call the following explicitly if SCX_OPS_LOAD() is used */
+#define UEI_SET_SIZE(__skel, __ops_name, __uei_name) ({ \
+ u32 __len = (__skel)->struct_ops.__ops_name->exit_dump_len ?: UEI_DUMP_DFL_LEN; \
+ (__skel)->rodata->__uei_name##_dump_len = __len; \
+ RESIZE_ARRAY((__skel), data, __uei_name##_dump, __len); \
+})
+
+#define UEI_EXITED(__skel, __uei_name) ({ \
+ /* use __sync to force memory barrier */ \
+ __sync_val_compare_and_swap(&(__skel)->data->__uei_name.kind, -1, -1); \
+})
+
+#define UEI_REPORT(__skel, __uei_name) ({ \
+ struct user_exit_info *__uei = &(__skel)->data->__uei_name; \
+ char *__uei_dump = (__skel)->data_##__uei_name##_dump->__uei_name##_dump; \
+ if (__uei_dump[0] != '\0') { \
+ fputs("\nDEBUG DUMP\n", stderr); \
+ fputs("================================================================================\n\n", stderr); \
+ fputs(__uei_dump, stderr); \
+ fputs("\n================================================================================\n\n", stderr); \
+ } \
+ fprintf(stderr, "EXIT: %s", __uei->reason); \
+ if (__uei->msg[0] != '\0') \
+ fprintf(stderr, " (%s)", __uei->msg); \
+ fputs("\n", stderr); \
+ __uei->exit_code; \
+})
+
+/*
+ * We can't import vmlinux.h while compiling user C code. Let's duplicate
+ * scx_exit_code definition.
+ */
+enum scx_exit_code {
+ /* Reasons */
+ SCX_ECODE_RSN_HOTPLUG = 1LLU << 32,
+
+ /* Actions */
+ SCX_ECODE_ACT_RESTART = 1LLU << 48,
+};
+
+enum uei_ecode_mask {
+ UEI_ECODE_USER_MASK = ((1LLU << 32) - 1),
+ UEI_ECODE_SYS_RSN_MASK = ((1LLU << 16) - 1) << 32,
+ UEI_ECODE_SYS_ACT_MASK = ((1LLU << 16) - 1) << 48,
+};
+
+/*
+ * These macro interpret the ecode returned from UEI_REPORT().
+ */
+#define UEI_ECODE_USER(__ecode) ((__ecode) & UEI_ECODE_USER_MASK)
+#define UEI_ECODE_SYS_RSN(__ecode) ((__ecode) & UEI_ECODE_SYS_RSN_MASK)
+#define UEI_ECODE_SYS_ACT(__ecode) ((__ecode) & UEI_ECODE_SYS_ACT_MASK)
+
+#define UEI_ECODE_RESTART(__ecode) (UEI_ECODE_SYS_ACT((__ecode)) == SCX_ECODE_ACT_RESTART)
+
+#endif /* __bpf__ */
+#endif /* __USER_EXIT_INFO_H */
diff --git a/include/scx_nest.h b/include/scx_nest.h
new file mode 100644
index 0000000..0323fb2
--- /dev/null
+++ b/include/scx_nest.h
@@ -0,0 +1,30 @@
+#ifndef __SCX_NEST_H
+#define __SCX_NEST_H
+
+struct comm_info {
+ char comm[16];
+};
+
+// å®˜æ–¹çš„è¾“å‡ºå› ä¸ºå’Œå†…æ ¸çš„bss段有è”系,容易出问题,这里改æˆç”¨perfæ¥è¾“出
+struct cpu_mask_data {
+ u64 stats_primary_mask;
+ u64 stats_reserved_mask;
+ u64 stats_other_mask;
+ u64 stats_idle_mask;
+};
+
+enum nest_stat_group {
+ STAT_GRP_WAKEUP,
+ STAT_GRP_NEST,
+ STAT_GRP_CONSUME,
+};
+
+#define NEST_STAT(__stat) BPFSTAT_##__stat
+#define NEST_ST(__stat, __grp, __desc) NEST_STAT(__stat),
+enum nest_stat_idx {
+#include "scx_nest_stats_table.h"
+ NEST_ST(NR, 0, 0)
+};
+#undef NEST_ST
+
+#endif /* __SCX_NEST_H */
diff --git a/include/scx_nest_stats_table.h b/include/scx_nest_stats_table.h
new file mode 100644
index 0000000..6625f70
--- /dev/null
+++ b/include/scx_nest_stats_table.h
@@ -0,0 +1,20 @@
+NEST_ST(WAKEUP_ATTACHED, STAT_GRP_WAKEUP, "Attached CPU was idle, and in primary nest")
+NEST_ST(WAKEUP_PREV_PRIMARY, STAT_GRP_WAKEUP, "Previous CPU was idle, and in primary nest")
+NEST_ST(WAKEUP_FULLY_IDLE_PRIMARY, STAT_GRP_WAKEUP, "Woken up to fully idle primary nest core")
+NEST_ST(WAKEUP_ANY_IDLE_PRIMARY, STAT_GRP_WAKEUP, "Woken up to idle logical primary nest core")
+NEST_ST(WAKEUP_FULLY_IDLE_RESERVE, STAT_GRP_WAKEUP, "Woken up to fully idle reserve nest core")
+NEST_ST(WAKEUP_ANY_IDLE_RESERVE, STAT_GRP_WAKEUP, "Woken up to idle logical reserve nest core")
+NEST_ST(WAKEUP_IDLE_OTHER, STAT_GRP_WAKEUP, "Woken to any idle logical core in p->cpus_ptr")
+
+NEST_ST(TASK_IMPATIENT, STAT_GRP_NEST, "A task was found to be impatient")
+NEST_ST(PROMOTED_TO_PRIMARY, STAT_GRP_NEST, "A core was promoted into the primary nest")
+NEST_ST(PROMOTED_TO_RESERVED, STAT_GRP_NEST, "A core was promoted into the reserve nest")
+NEST_ST(DEMOTED_TO_RESERVED, STAT_GRP_NEST, "A core was demoted into the reserve nest")
+NEST_ST(RESERVED_AT_CAPACITY, STAT_GRP_NEST, "Reserved nest was at capacity")
+NEST_ST(SCHEDULED_COMPACTION, STAT_GRP_NEST, "Scheduled a primary core to be compacted")
+NEST_ST(CANCELLED_COMPACTION, STAT_GRP_NEST, "Cancelled a primary core from being compacted at task wakeup time")
+NEST_ST(EAGERLY_COMPACTED, STAT_GRP_NEST, "A core was compacted in ops.dispatch()")
+NEST_ST(CALLBACK_COMPACTED, STAT_GRP_NEST, "A core was compacted in the scheduled timer callback")
+
+NEST_ST(CONSUMED, STAT_GRP_CONSUME, "A task was consumed from the global DSQ")
+NEST_ST(NOT_CONSUMED, STAT_GRP_CONSUME, "There was no task in the global DSQ")
diff --git a/include/sys_event.h b/include/sys_event.h
index 244831e..64daf78 100644
--- a/include/sys_event.h
+++ b/include/sys_event.h
@@ -4,10 +4,12 @@
#include
#include
+#include
#define TASK_COMM_LEN 16
-typedef unsigned long long u64;
+//typedef unsigned long long u64;
+typedef uint64_t u64;
typedef unsigned int u32;
typedef __u16 u16;
typedef __u8 u8;
diff --git a/io_spy b/io_spy
deleted file mode 100755
index f589a40..0000000
Binary files a/io_spy and /dev/null differ
diff --git a/io_spy.c b/io_spy.c
deleted file mode 100644
index 0e3af4e..0000000
--- a/io_spy.c
+++ /dev/null
@@ -1,284 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "io_event.h"
-#include "io_stats.skel.h"
-
-#include "proc_data.h"
-
-#define MAX_IO_RESULTS 256
-
-static u32 zero = 0;
-static u32 one = 1;
-
-/*---------------------------IOä¿¡æ¯---------------------------------*/
-struct ring_buffer *rb_io_task_stats, *rb_io_process_stats, *rb_io_wait;
-struct io_stats_bpf *io_skel = NULL;
-struct bpf_link *link_io_wait = NULL;
-DiskStatsContext* context = NULL;
-DiskStats current[MAX_DEVICES];
-
-static int handle_io_task_stats_event(void *ctx,void *data, size_t data_sz){
- struct io_task_stats *event = (struct io_task_stats *)data;
-
- printf(" PID: %u\n", event->info.pid);
- printf(" Command: %s\n", event->info.comm);
- printf(" read_count: %u\n", event->read_count);
- printf(" write_count: %u\n", event->write_count);
-
- return 0;
-}
-
-static int handle_io_process_stats_event(void *ctx,void *data, size_t data_sz){
- struct io_process_stats *event = (struct io_process_stats *)data;
-
- printf(" tgid: %u\n", event->tgid);
- printf(" read_count: %u\n", event->read_count);
- printf(" write_count: %u\n", event->write_count);
-
- return 0;
-}
-
-static int handle_iowait_perf_event(void *ctx,void *data, size_t data_sz){
- struct io_wait_perf_data *event = (struct io_wait_perf_data *)data;
-
- for(int i=0;i<8;i++){
- switch(i)
- {
- case 0:
- printf("wait less than 1us: %u\n",event->count_list[i]);
- continue;
- case 1:
- printf("wait less than 4us: %u\n",event->count_list[i]);
- continue;
- case 2:
- printf("wait less than 16us: %u\n",event->count_list[i]);
- continue;
- case 3:
- printf("wait less than 64us: %u\n",event->count_list[i]);
- continue;
- case 4:
- printf("wait less than 256us: %u\n",event->count_list[i]);
- continue;
- case 5:
- printf("wait less than 1ms: %u\n",event->count_list[i]);
- continue;
- case 6:
- printf("wait less than 4ms: %u\n",event->count_list[i]);
- continue;
- case 7:
- printf("wait large than 4ms: %u\n",event->count_list[i]);
- continue;
- default:
- continue;
- }
- }
-
- return 0;
-}
-
-static int create_perf_event(u32 period_ms) {
- struct perf_event_attr attr = {
- .type = PERF_TYPE_SOFTWARE, // 使用软件事件类型
- .config = PERF_COUNT_SW_CPU_CLOCK, // 使用 CPU æ—¶é’Ÿä½œä¸ºè§¦å‘æº
- .size = sizeof(struct perf_event_attr),
- .sample_period = period_ms * 1000000ULL, // 设置为毫秒级的间隔
- .freq = 0, // 使用固定间隔,而éžé¢‘率
- .wakeup_events = 1, // æ¯æ¬¡è§¦å‘事件
- };
-
- // 对所有 CPU 和进程创建事件
- int fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
- if (fd < 0) {
- perror("perf_event_open");
- return -1;
- }
- return fd;
-}
-
-static struct bpf_link* attach_perf_event_to_program(struct bpf_program *prog, u32 period_ms) {
- // 创建 perf event
- int perf_fd = create_perf_event(period_ms);
- if (perf_fd < 0) {
- fprintf(stderr, "Failed to create perf_event\n");
- return NULL;
- }
-
- // å°† perf event é™„åŠ åˆ°æŒ‡å®šçš„ BPF 程åº
- struct bpf_link *link = bpf_program__attach_perf_event(prog, perf_fd);
- if (!link) {
- fprintf(stderr, "Failed to attach perf_event to BPF program: %s\n", strerror(errno));
- close(perf_fd);
- return NULL;
- }
-
- return link;
-}
-
-static int attach_io_skel(struct io_stats_bpf *skel){
- int ret;
-
- ret = io_stats_bpf__load(skel);
- if(ret){
- fprintf(stderr, "failed to load io_stats skel\n");
- return ret;
- }
-
- ret = io_stats_bpf__attach(skel);
- if(ret){
- fprintf(stderr, "failed to attach io_stats bpf program(s)\n");
-
- return -1;
- }
-
- link_io_wait = attach_perf_event_to_program(skel->progs.handle_io_wait_event,500);
- if(!link_io_wait){
- return -1;
- }
- skel->links.handle_io_wait_event = link_io_wait;
-
- rb_io_task_stats = ring_buffer__new(bpf_map__fd(skel->maps.io_task_stats_buffer),handle_io_task_stats_event,NULL,NULL);
- rb_io_process_stats = ring_buffer__new(bpf_map__fd(skel->maps.io_process_stats_buffer),handle_io_process_stats_event,NULL,NULL);
- rb_io_wait = ring_buffer__new(bpf_map__fd(skel->maps.io_wait_buffer),handle_iowait_perf_event,NULL,NULL);
-
- int threhold_fd = bpf_map__fd(skel->maps.io_threhold_map);
- struct io_stats_threhold task = {
- .read_count = 50,
- .write_count = 50,
- .time_window = (1000 * MSEC)
- };
- struct io_stats_threhold process = {
- .read_count = 100,
- .write_count = 100,
- .time_window = (1000 * MSEC)
- };
-
- if(bpf_map_update_elem(threhold_fd,&zero,&task,BPF_ANY) != 0){
- printf("io_threhold map update error\n");
- return -1;
- }
-
- if(bpf_map_update_elem(threhold_fd,&one,&process,BPF_ANY) != 0){
- printf("io_threhold map update error\n");
- return -1;
- }
-
- return 0;
-}
-
-unsigned int io_parse_arguments(int argc, char *argv[]) {
- unsigned int interval = 1; // 默认1秒
- if (argc == 2) {
- interval = atoi(argv[1]);
- if (interval == 0) {
- fprintf(stderr, "Invalid interval. Using default 1 second.\n");
- interval = 1;
- }
- }
- return interval;
-}
-
-int io_initialize_monitoring(unsigned int interval) {
- // åˆå§‹åŒ–上下文
- context = diskstats_init();
- if (!context) {
- fprintf(stderr, "Failed to initialize DiskStatsContext.\n");
- return -1;
- }
-
- // 读å–åˆå§‹ç»Ÿè®¡æ•°æ®
- int device_count_prev = diskstats_read(context, current, MAX_DEVICES);
- if (device_count_prev < 0) {
- fprintf(stderr, "Failed to read /proc/diskstats.\n");
- diskstats_cleanup(context);
- return -1;
- }
-
- context->device_count_prev = device_count_prev;
- return 0;
-}
-
-static void io_resource_clean(){
- if(rb_io_task_stats)
- ring_buffer__free(rb_io_task_stats);
- if(rb_io_process_stats)
- ring_buffer__free(rb_io_process_stats);
- if(rb_io_wait)
- ring_buffer__free(rb_io_wait);
- io_stats_bpf__destroy(io_skel);
-}
-
-static int io_ring_buffer_poll(){
- int ret;
- ret = ring_buffer__poll(rb_io_task_stats,200);
- if(ret<0)
- {
- fprintf(stderr, "Error polling io task stat ring buffer: %d\n", ret);
- return ret;
- }
- ret = ring_buffer__poll(rb_io_process_stats,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling io process stat ring buffer: %d\n", ret);
- return ret;
- }
- ret = ring_buffer__poll(rb_io_wait,600);
- if(ret<0)
- {
- fprintf(stderr, "Error polling io wait ring buffer: %d\n", ret);
- return ret;
- }
-
- return 0;
-}
-
-int main(int argc, char *argv[]) {
- int ret = 0;
-
- io_skel = io_stats_bpf__open();
- if(!io_skel){
- fprintf(stderr, "failed to open io_stats skel\n");
- ret = 1;
-
- goto cleanup;
- }
-
- ret = attach_io_skel(io_skel);
- if(ret != 0)
- goto cleanup;
-
- unsigned int interval = io_parse_arguments(argc, argv);
-
- if (io_initialize_monitoring(interval) != 0) {
- fprintf(stderr, "Initialization failed.\n");
- ret = 1;
- goto cleanup;
- }
-
- while (1) {
- //sleep(interval);
- usleep(USEC * 100);
- ret = io_ring_buffer_poll();
- if(ret != 0)
- goto cleanup;
- if (process_disk_stats(context, current, &context->device_count_prev, interval) != 0) {
- goto cleanup;
- }
- }
-
-
-cleanup:
- io_resource_clean();
- diskstats_cleanup(context);
- return 0;
-}
diff --git a/mm_spy b/mm_spy
deleted file mode 100755
index 16b4b92..0000000
Binary files a/mm_spy and /dev/null differ
diff --git a/mm_spy.c b/mm_spy.c
deleted file mode 100644
index 575ab12..0000000
--- a/mm_spy.c
+++ /dev/null
@@ -1,687 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-
-#include "mm_event.h"
-
-#include "mm_stats.skel.h"
-#include "mm_leak.skel.h"
-#include "blazesym.h"
-
-#define KERN_STACKID_FLAGS (0 | BPF_F_FAST_STACK_CMP)
-#define USER_STACKID_FLAGS (0 | BPF_F_FAST_STACK_CMP | BPF_F_USER_STACK)
-
-#define __ATTACH_UPROBE(skel, sym_name, prog_name, is_retprobe) \
- do { \
- LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts, \
- .func_name = #sym_name, \
- .retprobe = is_retprobe); \
- skel->links.prog_name = bpf_program__attach_uprobe_opts( \
- skel->progs.prog_name, \
- trace_pid, /* No specific PID */ \
- "/lib/x86_64-linux-gnu/libc.so.6", /* No specific object */ \
- 0, \
- &uprobe_opts); \
- } while (false)
-
-#define __CHECK_PROGRAM(skel, prog_name) \
- do { \
- if (!skel->links.prog_name) { \
- perror("no program attached for " #prog_name); \
- return -errno; \
- } \
- } while (false)
-
-#define __ATTACH_UPROBE_CHECKED(skel, sym_name, prog_name, is_retprobe) \
- do { \
- __ATTACH_UPROBE(skel, sym_name, prog_name, is_retprobe); \
- __CHECK_PROGRAM(skel, prog_name); \
- } while (false)
-
-#define ATTACH_UPROBE(skel, sym_name, prog_name) __ATTACH_UPROBE(skel, sym_name, prog_name, false)
-#define ATTACH_URETPROBE(skel, sym_name, prog_name) __ATTACH_UPROBE(skel, sym_name, prog_name, true)
-#define ATTACH_UPROBE_CHECKED(skel, sym_name, prog_name) __ATTACH_UPROBE_CHECKED(skel, sym_name, prog_name, false)
-#define ATTACH_URETPROBE_CHECKED(skel, sym_name, prog_name) __ATTACH_UPROBE_CHECKED(skel, sym_name, prog_name, true)
-
-static u32 zero = 0;
-static u32 one = 1;
-
-/*-----------------------这些都是内å˜çš„-------------------------------------*/
-static u64 trace_pid = 0;
-int leak_allocs_fd;
-int leak_stack_traces_fd;
-
-static struct blaze_symbolizer *mm_symbolizer;
-static struct allocation *allocs;
-struct ring_buffer *rb_oom, *rb_task_mm, *rb_process_mm;
-
-static u64 *stack;
-
-static int attach_leak_uprobes(struct mm_leak_bpf *skel);
-static int print_outstanding_allocs(int allocs_fd, int stack_traces_fd);
-static int print_stack_frames(struct allocation *allocs, u64 nr_allocs, int stack_traces_fd);
-
-static int handle_oom_event(void *ctx,void *data, size_t data_sz);
-static int handle_task_mm_stats_event(void *ctx,void *data, size_t data_sz);
-static int handle_process_mm_stats_event(void *ctx,void *data, size_t data_sz);
-
-
-static int attach_leak_skel(struct mm_leak_bpf *skel);
-static int attach_mm_stats_skel(struct mm_stats_bpf *skel);
-static int mm_ring_buffer_poll();
-void ring_buffer_destroy();
-
-int main(){
- int ret = 0;
- struct mm_leak_bpf *leak_skel = NULL;
- struct mm_stats_bpf *mm_skel = NULL;
-
- leak_skel = mm_leak_bpf__open();
- if(!leak_skel){
- fprintf(stderr, "failed to open mm_leak skel\n");
- ret = 1;
-
- goto cleanup;
- }
-
- mm_skel = mm_stats_bpf__open();
- if(!mm_skel){
- fprintf(stderr, "failed to open mm_stats skel\n");
- ret = 1;
-
- goto cleanup;
- }
-
- ret = attach_leak_skel(leak_skel);
- if(ret != 0)
- goto cleanup;
-
- ret = attach_mm_stats_skel(mm_skel);
- if(ret != 0)
- goto cleanup;
-
- while(1){
- print_outstanding_allocs(leak_allocs_fd,leak_stack_traces_fd);
- //sleep(1);
- ret = mm_ring_buffer_poll();
- if(ret < 0)
- break;
- }
-
-cleanup:
- ring_buffer_destroy();
-
- blaze_symbolizer_free(mm_symbolizer);
- mm_leak_bpf__destroy(leak_skel);
- mm_stats_bpf__destroy(mm_skel);
-
- return ret;
-}
-
-void ring_buffer_destroy(){
- if(rb_oom)
- ring_buffer__free(rb_oom);
- if(rb_task_mm)
- ring_buffer__free(rb_task_mm);
- if(rb_process_mm)
- ring_buffer__free(rb_process_mm);
-}
-
-static int handle_oom_event(void *ctx,void *data, size_t data_sz){
- struct oom_event *event = (struct oom_event *)data;
-
- // 将时间戳转æ¢ä¸ºå¯è¯»æ ¼å¼
- time_t kill_time_sec = event->kill_time / 1000000000;
- long kill_time_nsec = event->kill_time % 1000000000;
-
- struct tm *tm_info = localtime(&kill_time_sec);
- char time_buffer[64];
- strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%d %H:%M:%S", tm_info);
-
- printf("[%s.%09ld] OOM Event:\n", time_buffer, kill_time_nsec);
- printf(" Trigger PID: %u\n", event->trigger_id);
- printf(" Killed PID: %u\n", event->killed_id);
- printf(" Command: %s\n", event->comm);
- printf(" Kill Time: %llu ns\n\n", event->kill_time);
-
- return 0;
-}
-
-static int handle_task_mm_stats_event(void *ctx,void *data, size_t data_sz){
- struct task_mm_stats *event = (struct task_mm_stats *)data;
-
- printf(" PID: %u\n", event->info.pid);
- printf(" Command: %s\n", event->info.comm);
- printf(" kmem_count: %u\n", event->kmem_count);
- printf(" vmem_count: %u\n", event->vmem_count);
- printf(" slab_count: %u\n\n", event->slab_count);
-
- return 0;
-}
-
-static int handle_process_mm_stats_event(void *ctx,void *data, size_t data_sz){
- struct process_mm_stats *event = (struct process_mm_stats *)data;
-
- printf(" process tgid: %u\n", event->tgid);
- printf(" kmem_count: %u\n", event->kmem_count);
- printf(" vmem_count: %u\n", event->vmem_count);
- printf(" slab_count: %u\n\n", event->slab_count);
-
- return 0;
-}
-
-static int attach_leak_skel(struct mm_leak_bpf *skel){
- int ret;
-
- allocs = calloc(ALLOCS_MAX_ENTRIES, sizeof(*allocs));
- if (!allocs) {
- fprintf(stderr, "failed to allocate array\n");
- ret = -ENOMEM;
-
- return ret;
- }
-
- stack = calloc(PERF_MAX_STACK_DEPTH, sizeof(*stack));
- if (!stack) {
- fprintf(stderr, "failed to allocate stack array\n");
- ret = -ENOMEM;
-
- return ret;
- }
-
- ret = mm_leak_bpf__load(skel);
- if(ret){
- fprintf(stderr, "failed to load mm_leak skel\n");
-
- return -1;
- }
-
- leak_allocs_fd = bpf_map__fd(skel->maps.allocs);
- leak_stack_traces_fd = bpf_map__fd(skel->maps.stack_traces);
-
- ret = attach_leak_uprobes(skel);
- if(ret){
- fprintf(stderr, "failed to attach mm_leak uprobes\n");
-
- return -1;
- }
-
-
- ret = mm_leak_bpf__attach(skel);
- if (ret) {
- fprintf(stderr, "failed to attach bpf program(s)\n");
-
- return -1;
- }
-
- mm_symbolizer = blaze_symbolizer_new();
- if(!mm_symbolizer){
- printf("Failed to initialize symbolizer\n");
- ret = -1;
-
- return ret;
- }
-
- return 0;
-}
-
-static int attach_mm_stats_skel(struct mm_stats_bpf *skel){
- int ret,map_fd;
-
- ret = mm_stats_bpf__load(skel);
- if(ret){
- fprintf(stderr, "failed to load mm_leak skel\n");
- return -1;
- }
-
- ret = mm_stats_bpf__attach(skel);
- if (ret) {
- fprintf(stderr, "failed to attach mm_stats bpf program(s)\n");
-
- return -1;
- }
-
- rb_oom = ring_buffer__new(bpf_map__fd(skel->maps.oom_event_buffer),handle_oom_event,NULL,NULL);
- if(!rb_oom){
- fprintf(stderr, "Failed to create oom ring buffer\n");
- return -1;
- }
-
- rb_task_mm = ring_buffer__new(bpf_map__fd(skel->maps.task_mm_stats_buffer),handle_task_mm_stats_event,NULL,NULL);
- if(!rb_task_mm){
- fprintf(stderr, "Failed to create task mm stats ring buffer\n");
- return -1;
- }
-
- rb_process_mm = ring_buffer__new(bpf_map__fd(skel->maps.process_mm_stats_buffer),handle_process_mm_stats_event,NULL,NULL);
- if(!rb_process_mm){
- fprintf(stderr, "Failed to create task mm stats ring buffer\n");
- return -1;
- }
-
- struct mm_threhold threhold_task = {
- .kmem_threhold = 500,
- .slab_threhold = 500,
- .vmem_threhold = 500,
- .time_window = MSEC * 1000 // 1ç§’
- };
-
- struct mm_threhold threhold_process = {
- .kmem_threhold = 1000,
- .slab_threhold = 1000,
- .vmem_threhold = 1000,
- .time_window = MSEC * 1000 // 1ç§’
- };
-
- map_fd = bpf_map__fd(skel->maps.threhold_map);
- if(bpf_map_update_elem(map_fd,&zero,&threhold_task,BPF_ANY) != 0){
- perror("Failed to update mm_threhold map\n");
- return -1;
- }
-
- if(bpf_map_update_elem(map_fd,&one,&threhold_process,BPF_ANY) != 0){
- perror("Failed to update mm_threhold map\n");
- return -1;
- }
-
- return 0;
-}
-
-static int mm_ring_buffer_poll(){
- int err;
-
- err = ring_buffer__poll(rb_oom,500);
- if(err < 0)
- {
- fprintf(stderr, "Error polling oom ring buffer: %d\n", err);
- return err;
- }
-
- err = ring_buffer__poll(rb_task_mm,500);
- if(err < 0)
- {
- fprintf(stderr, "Error polling task mm stats ring buffer: %d\n", err);
- return err;
- }
-
- err = ring_buffer__poll(rb_process_mm,500);
- if(err < 0)
- {
- fprintf(stderr, "Error polling process mm stats ring buffer: %d\n", err);
- return err;
- }
-
- return 0;
-}
-
-int print_outstanding_combined_allocs(u64 combined_allocs_fd, u64 stack_traces_fd){
-
- for (u64 prev_key = 0, curr_key = 0;; prev_key = curr_key){
- if (bpf_map_get_next_key(combined_allocs_fd,&prev_key,&curr_key))
- {
- if (errno == ENOENT)
- {
- break; // no more keys, done!
- }
- perror("map get next key failed!");
-
- return -errno;
- }
-
- union combined_alloc_info cinfo;
- memset(&cinfo, 0, sizeof(cinfo));
-
- if (bpf_map_lookup_elem(combined_allocs_fd,&curr_key,&cinfo))
- {
- if (errno == ENOENT)
- {
- continue;
- }
-
- perror("map lookup failed!");
- return -errno;
- }
-
- if (bpf_map_lookup_elem(stack_traces_fd,&curr_key,stack))
- {
- perror("failed to lookup stack traces!");
- return -errno;
- }
-
- printf("stack_id=0x%llx with outstanding allocations: total_size=%llu nr_allocs=%llu\n",
- curr_key, (u64)cinfo.total_size, (u64)cinfo.number_of_allocs);
-
- int stack_sz = 0;
- for (int i = 0; i < 128; i++)
- {
- if (stack[i] == 0)
- {
- break;
- }
- stack_sz++;
- // printf("[%3d] 0x%llx\n", i, g_stacks[i]);
- }
-
- print_stack_frames_by_blazesym(stack,stack_sz);
- }
- return 0;
-}
-
-
-int alloc_size_compare(const void *a, const void *b)
-{
- const struct allocation *x = (struct allocation *)a;
- const struct allocation *y = (struct allocation *)b;
-
- // descending order
-
- if (x->size > y->size)
- return -1;
-
- if (x->size < y->size)
- return 1;
-
- return 0;
-}
-
-static int print_outstanding_allocs(int allocs_fd, int stack_traces_fd){
- //const u64 allocs_key_size = bpf_map__key_size(skel->maps.allocs);
-
- u64 t = time(NULL);
- struct tm *tm = localtime(&t);// 获å–当剿—¶é—´ï¼Œç”¨äºŽè¾“出时的时间戳
- u64 nr_allocs = 0;// 计数器用æ¥è®°å½•找到的分é…ä¿¡æ¯çš„æ•°é‡
-
- //é历 allocs map,prev_key å’Œ curr_key 用æ¥åœ¨ BPF map ä¸è¿ä»£æŸ¥æ‰¾å…ƒç´
- for (u64 prev_key = 0, curr_key = 0;; prev_key = curr_key)
- {
- struct alloc_info alloc_info = {};
- memset(&alloc_info, 0, sizeof(alloc_info));
- // 获å–下一个 allocs map ä¸çš„键,直到é历完所有键,如果返回 ENOENT 错误,表示没有更多的键,å¯ä»¥é€€å‡ºå¾ªçޝ
- if (bpf_map_get_next_key(allocs_fd,&prev_key,&curr_key))
- {
- if (errno == ENOENT)
- {
- break; // no more keys, done
- }
-
- perror("map get next key error");
-
- return -errno;
- }
-
- // 使用 bpf_map__lookup_elem() 查找当å‰é”®å¯¹åº”的值,如果å‘生 ENOENT 错误,表示当å‰é”®æ²¡æœ‰å¯¹åº”值,跳过该键
- if (bpf_map_lookup_elem(allocs_fd,&curr_key,&alloc_info))
- {
- if (errno == ENOENT)
- continue;
-
- perror("map lookup error");
-
- return -errno;
- }
-
- // è¿‡æ»¤æŽ‰æ— æ•ˆçš„æ ˆ
- if (alloc_info.stack_id < 0)
- {
- continue;
- }
-
- bool stack_exists = false;
-
- // é历已å˜å‚¨çš„ allocs 数组(内å˜åˆ†é…ä¿¡æ¯çš„集åˆï¼‰å¹¶æŸ¥æ‰¾ç›¸åŒçš„ stack_id
- // 如果找到了相åŒçš„å †æ ˆ ID(æ„味ç€åŒä¸€ä¸ªå †æ ˆè¿›è¡Œäº†å¤šæ¬¡åˆ†é…),就将 alloc_info.size ç´¯åŠ åˆ°å·²å˜åœ¨çš„分é…ä¸ï¼Œä¸”å°† count å¢žåŠ 1
-
- for (u64 i = 0; !stack_exists && i < nr_allocs; ++i)
- {
- struct allocation *alloc = &allocs[i];
-
- if (alloc->stack_id == alloc_info.stack_id)
- {
- alloc->size += alloc_info.size;
- alloc->count++;
-
- stack_exists = true;
- break;
- }
- }
-
-
- if (stack_exists)
- continue;
-
- // 如果没有找到相åŒçš„å †æ ˆ IDï¼Œè¯´æ˜Žè¿™æ˜¯ä¸€ä¸ªæ–°çš„å †æ ˆåˆ†é…,创建一个新的 allocation ç»“æž„ä½“ï¼Œå¹¶å°†å…¶æ·»åŠ åˆ° allocs 数组ä¸
- struct allocation alloc = {
- .stack_id = alloc_info.stack_id ,
- .size = alloc_info.size,
- .count = 1,
- };
-
- // 将新创建的 allocation 结构体å¤åˆ¶åˆ° allocs 数组ä¸ï¼Œå¹¶å¢žåŠ nr_allocs
- memcpy(&allocs[nr_allocs], &alloc, sizeof(alloc));
- nr_allocs++;
- }
-
- // 使用 qsort() 函数按内å˜å¤§å°é™åºæŽ’列 allocs 数组
- //qsort(allocs, nr_allocs, sizeof(allocs[0]), alloc_size_compare);
- if (nr_allocs > 0) {
- qsort(allocs, nr_allocs, sizeof(allocs[0]), alloc_size_compare);
- }
-
- printf("[%d:%d:%d] Top %zu stacks with outstanding allocations:\n",
- tm->tm_hour, tm->tm_min, tm->tm_sec, nr_allocs);
-
- for (size_t i = 0; i < nr_allocs; i++)
- {
- if (bpf_map_lookup_elem(stack_traces_fd,&allocs[i].stack_id,stack))
- {
- perror("failed to lookup stack traces!");
- return -errno;
- }
- }
-
- print_stack_frames(allocs, nr_allocs, stack_traces_fd);
- for (size_t i = 0; i < nr_allocs; i++) {
- allocs[i].stack_id = 0;
- }
-
- return 0;
-}
-
-void print_stack_frames_by_blazesym(u64 *stack, int stack_sz)
-{
- struct blaze_syms *result;
- struct blaze_sym *sym;
-
- if(trace_pid == 0){
- struct blaze_symbolize_src_kernel src = {
- .type_size = sizeof(src)
- };
- result = blaze_symbolize_kernel_abs_addrs(mm_symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- }
- else{
- struct blaze_symbolize_src_process src = {
- .type_size = sizeof(src),
- .pid = trace_pid,
- };
- result = blaze_symbolize_process_abs_addrs(mm_symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- }
-
- // 获å–符å·ä¿¡æ¯
- //printf("Stack depth: %d\n", stack_sz);
-
- if (!result) {
- perror("Failed to symbolize stack addresses");
- return;
- }
-
- // æ‰“å°æ ˆå›žæº¯ä¿¡æ¯
- for (size_t j = 0; j < result->cnt; ++j) {
- //printf("inlined count: %d\n", result->syms[j].inlined_cnt);
-
- const uint64_t addr = stack[j];
-
- if (addr == 0)
- break;
-
- sym = &result->syms[j];
-
- if (sym->name == NULL) {
- printf("No symbol found for address <0x%lx>\n", addr);
- continue;
- }
-
- // æ‰“å°æ¯ä¸ªæ ˆå¸§çš„函数å和地å€
- printf("\t%zu [<%016lx>] %s + 0x%lx\n", j, addr, sym->name, sym->offset);
-
- // æ‰“å°æºä»£ç ä½ç½®ï¼ˆæ–‡ä»¶ã€è¡Œå·ç‰ï¼‰
- if (sym->code_info.file != NULL) {
- printf("\t\tSource: %s:%d:%d\n", sym->code_info.file, sym->code_info.line, sym->code_info.column);
- }
-
- // 如果å˜åœ¨å†…è”函数,打å°å†…è”函数信æ¯
- if (sym->inlined_cnt > 0) {
- for (size_t k = 0; k < sym->inlined_cnt; ++k) {
- const struct blaze_symbolize_inlined_fn *inlined = &sym->inlined[k];
- printf("\t\tInlined function: %s\n", inlined->name);
- if (inlined->code_info.file != NULL) {
- printf("\t\t\tSource: %s:%d:%d\n", inlined->code_info.file, inlined->code_info.line, inlined->code_info.column);
- }
- }
- }
- }
-
- blaze_syms_free(result);
-}
-
-int print_stack_frames(struct allocation *allocs, u64 nr_allocs, int stack_traces_fd)
-{
- for (u64 i = 0; i < nr_allocs; ++i){
- const struct allocation *alloc = &allocs[i];
- printf("%zu bytes in %zu allocations from stack\n", alloc->size, alloc->count);
-
- if (bpf_map_lookup_elem(stack_traces_fd, &alloc->stack_id, stack)) {
- if (errno == ENOENT)
- continue;
-
- perror("failed to lookup stack trace");
-
- return -errno;
- }
-
- print_stack_frames_by_blazesym(stack,nr_allocs);
- }
-}
-
-
-static void print_frame(const char *name, u64 input_addr, u64 addr, u64 offset, const blaze_symbolize_code_info *code_info)
-{
- // If we have an input address we have a new symbol.
- if (input_addr != 0)
- {
- printf("%016lx: %s @ 0x%lx+0x%lx", input_addr, name, addr, offset);
- if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL)
- {
- printf(" %s/%s:%u\n", code_info->dir, code_info->file, code_info->line);
- }
- else if (code_info != NULL && code_info->file != NULL)
- {
- printf(" %s:%u\n", code_info->file, code_info->line);
- }
- else
- {
- printf("\n");
- }
- }
- else
- {
- printf("%16s %s", "", name);
- if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL)
- {
- printf("@ %s/%s:%u [inlined]\n", code_info->dir, code_info->file, code_info->line);
- }
- else if (code_info != NULL && code_info->file != NULL)
- {
- printf("@ %s:%u [inlined]\n", code_info->file, code_info->line);
- }
- else
- {
- printf("[inlined]\n");
- }
- }
-}
-
-
-static int attach_leak_uprobes(struct mm_leak_bpf *skel){
- ATTACH_UPROBE_CHECKED(skel, malloc, malloc_enter);
- ATTACH_URETPROBE_CHECKED(skel, malloc, malloc_exit);
-
- ATTACH_UPROBE_CHECKED(skel, calloc, calloc_enter);
- ATTACH_URETPROBE_CHECKED(skel, calloc, calloc_exit);
-
- ATTACH_UPROBE_CHECKED(skel, realloc, realloc_enter);
- ATTACH_URETPROBE_CHECKED(skel, realloc, realloc_exit);
-
- ATTACH_UPROBE_CHECKED(skel, mmap, mmap_enter);
- ATTACH_URETPROBE_CHECKED(skel, mmap, mmap_exit);
-
- ATTACH_UPROBE_CHECKED(skel, posix_memalign, posix_memalign_enter);
- ATTACH_URETPROBE_CHECKED(skel, posix_memalign, posix_memalign_exit);
-
- ATTACH_UPROBE_CHECKED(skel, memalign, memalign_enter);
- ATTACH_URETPROBE_CHECKED(skel, memalign, memalign_exit);
-
- ATTACH_UPROBE_CHECKED(skel, free, free_enter);
- ATTACH_UPROBE_CHECKED(skel, munmap, munmap_enter);
-
- // the following probes are intentinally allowed to fail attachment
-
- // deprecated in libc.so bionic
- ATTACH_UPROBE(skel, valloc, valloc_enter);
- ATTACH_URETPROBE(skel, valloc, valloc_exit);
-
- // deprecated in libc.so bionic
- ATTACH_UPROBE(skel, pvalloc, pvalloc_enter);
- ATTACH_URETPROBE(skel, pvalloc, pvalloc_exit);
-
- // added in C11
- ATTACH_UPROBE(skel, aligned_alloc, aligned_alloc_enter);
- ATTACH_URETPROBE(skel, aligned_alloc, aligned_alloc_exit);
-
- return 0;
-}
-
-// void print_stack_frame_by_blazesym(size_t frame, uint64_t addr, const blaze_sym_info *sym)
-// {
-// if (!sym)
-// printf("\t%zu [<%016lx>] <%s>\n", frame, addr, "null sym");
-// else if (sym->obj_file_name && strlen(sym->obj_file_name))
-// printf("\t%zu [<%016lx>] %s+0x%lx %s\n", frame, addr, sym->name, addr - sym->addr, sym->obj_file_name);
-// else
-// printf("\t%zu [<%016lx>] %s+0x%lx\n", frame, addr, sym->name, addr - sym->addr);
-// }
-
-// void disable_kernel_tracepoints(struct mm_leak_bpf *skel)
-// {
-// bpf_program__set_autoload(skel->progs.memleak__kmalloc, false);
-// bpf_program__set_autoload(skel->progs.memleak__kfree, false);
-// bpf_program__set_autoload(skel->progs.memleak__kmem_cache_alloc_node, false);
-// bpf_program__set_autoload(skel->progs.memleak__kmem_cache_free, false);
-// bpf_program__set_autoload(skel->progs.memleak__mm_page_alloc, false);
-// bpf_program__set_autoload(skel->progs.memleak__mm_page_free, false);
-// bpf_program__set_autoload(skel->progs.memleak__percpu_alloc_percpu, false);
-// bpf_program__set_autoload(skel->progs.memleak__percpu_free_percpu, false);
-// }
\ No newline at end of file
diff --git a/net_spy b/net_spy
deleted file mode 100755
index 340cbab..0000000
Binary files a/net_spy and /dev/null differ
diff --git a/net_spy.c b/net_spy.c
deleted file mode 100644
index f234cc0..0000000
--- a/net_spy.c
+++ /dev/null
@@ -1,898 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "proc_data.h"
-#include "net_event.h"
-#include "net_stats.skel.h"
-
-#define MAX_CSV_FILES 10
-
-static char csv_folder_path[MAX_PATH_LEN];
-
-const char *net_csv_names[] = {
- "net_latency",
- "tcprtt",
- "tcptop",
- "tcpretrans"
- };
-
-FILE *net_csv_files[MAX_CSV_FILES];
-
-volatile sig_atomic_t stop = 0;
-
-struct ring_buffer *rb_net_latency = NULL;
-struct ring_buffer *rb_tcprtt = NULL;
-struct ring_buffer *rb_tcptop = NULL;
-struct ring_buffer *rb_tcpretrans = NULL;
-struct net_stats_bpf *net_skel = NULL;
-struct sysinfo sys_data;
-static time_t boot_time; // 系统å¯åŠ¨æ—¶é—´
-struct bpf_link *link_to_tcprtt = NULL;
-
-
-static int handle_net_latency_event(void *ctx, void *data, size_t data_sz);
-static int handle_usr_tcprtt_event(void *ctx, void *data, size_t data_sz);
-static int handle_usr_tcptop_event(void *ctx, void *data, size_t data_sz);
-static int handle_usr_tcpretrans_event(void *ctx, void *data, size_t data_sz);
-static bool fentry_try_attach(int id);
-static bool fentry_can_attach(const char* name, const char* mod);
-static int attach_net_skel(struct net_stats_bpf *skel);
-void net_resource_clean();
-static int net_ring_buffer_poll();
-static int init_time();// åˆå§‹åŒ–ç³»ç»Ÿå½“å‰æ—¶é—´
-
-// ä¿¡å·å¤„ç†å‡½æ•°ï¼Œç”¨äºŽä¼˜é›…地退出程åº
-void net_handle_sigint(int sig) {
- stop = 1;
-}
-
-enum {
- TCP_ESTABLISHED = 1,
- TCP_SYN_SENT = 2,
- TCP_SYN_RECV = 3,
- TCP_FIN_WAIT1 = 4,
- TCP_FIN_WAIT2 = 5,
- TCP_TIME_WAIT = 6,
- TCP_CLOSE = 7,
- TCP_CLOSE_WAIT = 8,
- TCP_LAST_ACK = 9,
- TCP_LISTEN = 10,
- TCP_CLOSING = 11,
- TCP_NEW_SYN_RECV = 12,
- TCP_MAX_STATES = 13,
-};
-
-static int create_perf_event(u32 period_ms) {
- struct perf_event_attr attr = {
- .type = PERF_TYPE_SOFTWARE, // 使用软件事件类型
- .config = PERF_COUNT_SW_CPU_CLOCK, // 使用 CPU æ—¶é’Ÿä½œä¸ºè§¦å‘æº
- .size = sizeof(struct perf_event_attr),
- .sample_period = period_ms * 1000000ULL, // 设置为毫秒级的间隔
- .freq = 0, // 使用固定间隔,而éžé¢‘率
- .wakeup_events = 1, // æ¯æ¬¡è§¦å‘事件
- };
-
- // 对所有 CPU 和进程创建事件
- int fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
- if (fd < 0) {
- perror("perf_event_open");
- return -1;
- }
- return fd;
-}
-
-static struct bpf_link* attach_perf_event_to_program(struct bpf_program *prog, u32 period_ms) {
- // 创建 perf event
- int perf_fd = create_perf_event(period_ms);
- if (perf_fd < 0) {
- fprintf(stderr, "Failed to create perf_event\n");
- return NULL;
- }
-
- // å°† perf event é™„åŠ åˆ°æŒ‡å®šçš„ BPF 程åº
- struct bpf_link *link = bpf_program__attach_perf_event(prog, perf_fd);
- if (!link) {
- fprintf(stderr, "Failed to attach perf_event to BPF program: %s\n", strerror(errno));
- close(perf_fd);
- return NULL;
- }
-
- return link;
-}
-
-static int net_create_csv(){
- int ret;
- int num_csv_names = sizeof(net_csv_names) / sizeof(net_csv_names[0]);
-
- for(int i=0;iprogs.fentry_tcp_v4_connect,0,"tcp_v4_connect");
- bpf_program__set_attach_target(skel->progs.fentry_tcp_v6_connect,0,"tcp_v6_connect");
- bpf_program__set_attach_target(skel->progs.fentry_tcp_rcv_state_process,0,"tcp_rcv_state_process");
-
- bpf_program__set_autoload(skel->progs.fentry_tcp_v4_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_v6_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_rcv_state_process,false);
- }
- else{
- bpf_program__set_autoload(skel->progs.fentry_tcp_v4_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_v6_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_rcv_state_process,false);
- }
-
- ret = net_stats_bpf__load(skel);
- if(ret){
- fprintf(stderr, "failed to load net_stats skel\n");
- return ret;
- }
-
- ret = net_stats_bpf__attach(skel);
- if(ret){
- fprintf(stderr, "failed to attach net_stats bpf program(s)\n");
-
- return ret;
- }
-
- link_to_tcprtt = attach_perf_event_to_program(skel->progs.handle_tcprtt_event,500);
- if(!link_to_tcprtt){
- return -1;
- }
- skel->links.handle_tcprtt_event = link_to_tcprtt;
-
- rb_net_latency = ring_buffer__new(bpf_map__fd(skel->maps.net_latency_buffer),handle_net_latency_event,NULL,NULL);
- rb_tcprtt = ring_buffer__new(bpf_map__fd(skel->maps.tcprtt_buffer),handle_usr_tcprtt_event,NULL,NULL);
- rb_tcptop = ring_buffer__new(bpf_map__fd(skel->maps.tcptop_buffer),handle_usr_tcptop_event,NULL,NULL);
- rb_tcpretrans = ring_buffer__new(bpf_map__fd(skel->maps.tcpretrans_buffer),handle_usr_tcpretrans_event,NULL,NULL);
-
- return 0;
-}
-
-static int net_ring_buffer_poll(){
- int ret;
- ret = ring_buffer__poll(rb_net_latency,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling net latency ring buffer: %d\n", ret);
- return ret;
- }
-
- ret = ring_buffer__poll(rb_tcprtt,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling tcprtt ring buffer: %d\n", ret);
- return ret;
- }
-
- ret = ring_buffer__poll(rb_tcptop,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling tcptop ring buffer: %d\n", ret);
- return ret;
- }
-
- ret = ring_buffer__poll(rb_tcpretrans,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling tcpretrans ring buffer: %d\n", ret);
- return ret;
- }
-
- return 0;
-}
-
-void net_resource_clean(){
- if(rb_net_latency)
- ring_buffer__free(rb_net_latency);
- if(rb_tcprtt)
- ring_buffer__free(rb_tcprtt);
- if(rb_tcptop)
- ring_buffer__free(rb_tcptop);
- if(rb_tcpretrans)
- ring_buffer__free(rb_tcpretrans);
-
- for(int i=0;iaf == AF_INET) {
- // IPv4 地å€
- struct in_addr saddr, daddr;
- saddr.s_addr = event->src_addr.saddr_v4;
- daddr.s_addr = event->dst_addr.daddr_v4;
-
- // 将网络å—节åºçš„地å€è½¬æ¢ä¸ºå—符串
- if (inet_ntop(AF_INET, &saddr, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv4 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str));
- }
-
- if (inet_ntop(AF_INET, &daddr, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv4 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str));
- }
- }
- else if (event->af == AF_INET6) {
- // IPv6 地å€
- if (inet_ntop(AF_INET6, event->src_addr.saddr_v6, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv6 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str));
- }
-
- if (inet_ntop(AF_INET6, event->dst_addr.daddr_v6, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv6 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str));
- }
- }
- else {
- // æœªçŸ¥çš„åœ°å€æ—
- strncpy(saddr_str, "Unknown AF", sizeof(saddr_str));
- strncpy(daddr_str, "Unknown AF", sizeof(daddr_str));
- }
-
- // æ ¼å¼åŒ–时间戳
- // 将纳秒转æ¢ä¸ºç§’和纳秒
- time_t relative_sec = event->ts / 1000000000;
- long relative_nsec = event->ts % 1000000000;
-
- // 计算ç»å¯¹æ—¶é—´
- time_t absolute_sec = boot_time + relative_sec;
- long absolute_nsec = relative_nsec;
-
- // å°†ç»å¯¹æ—¶é—´è½¬æ¢ä¸ºæœ¬åœ°æ—¶é—´
- struct tm tm_info;
- if (localtime_r(&absolute_sec, &tm_info) == NULL) {
- perror("localtime_r failed");
- return 0;
- }
-
-
- // æ ¼å¼åŒ–æ—¶é—´å—符串
- char time_buf[64];
- if (strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &tm_info) == 0) {
- fprintf(stderr, "strftime returned 0");
- strncpy(time_buf, "Unknown Time", sizeof(time_buf));
- }
-
- // 打å°äº‹ä»¶ä¿¡æ¯
- printf("[%s.%09ld] TGID: %u Comm: %s | TCP Connect Delay: %llu us | %s:%u -> %s:%u\n",
- time_buf,
- absolute_nsec,
- event->tgid,
- event->comm,
- (unsigned long long)event->delta,
- saddr_str,
- ntohs(event->lport),
- daddr_str,
- ntohs(event->dport));
-
- // 将事件信æ¯å†™å…¥ CSV 文件
- if (!net_csv_files[0]) {
- fprintf(stderr, "net_csv_files[0] is NULL. Cannot write to CSV\n");
- return -1;
- }
-
- int fd = fileno(net_csv_files[0]);
- if (fd == -1) {
- perror("fileno failed");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed");
- return -1;
- }
-
- // 如果文件为空,写入表头
- // if (st.st_size == 0) {
- // fprintf(net_csv_files[0], "Timestamp,Source_IP,Source_Port,Destination_IP,Destination_Port,PID,Comm,Delay_us\n");
- // fflush(net_csv_files[0]);
- // }
- if (st.st_size == 0) {
- fprintf(net_csv_files[0], "Timestamp,PID,Comm,Delay_us\n");
- fflush(net_csv_files[0]);
- }
-
- // fprintf(net_csv_files[0], "%s.%09ld,%s,%u,%s,%u,%u,%.16s,%llu\n",
- // time_buf,
- // absolute_nsec,
- // saddr_str,
- // ntohs(event->lport),
- // daddr_str,
- // ntohs(event->dport),
- // event->tgid,
- // event->comm,
- // (unsigned long long)event->delta);
- fprintf(net_csv_files[0], "%s.%09ld,%u,%.16s,%llu\n",
- time_buf,
- absolute_nsec,
- event->tgid,
- event->comm,
- (unsigned long long)event->delta);
-
- return 0; // 返回 0 表示继ç»å¤„ç†å…¶ä»–事件
-}
-
-static int handle_usr_tcprtt_event(void *ctx, void *data, size_t data_sz){
- struct tcprtt_perf_data *event = (struct tcprtt_perf_data *)data;
-
- for(int i=0;i<8;i++){
- switch(i){
- case 0:
- printf("wait less than 1ms: %u\n",event->data[i]);
- continue;
- case 1:
- printf("wait less than 4ms: %u\n",event->data[i]);
- continue;
- case 2:
- printf("wait less than 16ms: %u\n",event->data[i]);
- continue;
- case 3:
- printf("wait less than 32ms: %u\n",event->data[i]);
- continue;
- case 4:
- printf("wait less than 64ms: %u\n",event->data[i]);
- continue;
- case 5:
- printf("wait less than 128ms: %u\n",event->data[i]);
- continue;
- case 6:
- printf("wait less than 256ms: %u\n",event->data[i]);
- continue;
- case 7:
- printf("wait more than 256ms: %u\n",event->data[i]);
- continue;
- default:
- continue;
- }
- }
- printf("\n");
-
- // 写入到 CSV 文件
- if (net_csv_files[1]) {
- // èŽ·å–æ–‡ä»¶æè¿°ç¬¦ä»¥æ£€æŸ¥æ–‡ä»¶å¤§å°
- int fd = fileno(net_csv_files[1]);
- if (fd == -1) {
- perror("fileno failed for net_csv_files[1]");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed for net_csv_files[1]");
- return -1;
- }
-
- // 如果文件为空,写入表头
- if (st.st_size == 0) {
- fprintf(net_csv_files[1],
- "1ms,4ms,16ms,32ms,64ms,128ms,256ms,256ms+\n");
- fflush(net_csv_files[1]);
- }
-
- // 写入事件数æ®
- fprintf(net_csv_files[1], "%u,%u,%u,%u,%u,%u,%u,%u\n",
- event->data[0], event->data[1], event->data[2],
- event->data[3], event->data[4], event->data[5],
- event->data[6], event->data[7]);
- } else {
- fprintf(stderr, "net_csv_files[1] is NULL. Cannot write to CSV\n");
- }
-
-
- return 0;
-}
-
-static int handle_usr_tcptop_event(void *ctx, void *data, size_t data_sz)
-{
- // 检查数æ®å¤§å°æ˜¯å¦ç¬¦åˆé¢„期
- if (data_sz < sizeof(struct tcp_top_perf_data)) {
- fprintf(stderr, "Received data size (%zu) is smaller than expected (%zu)\n", data_sz, sizeof(struct tcp_top_perf_data));
- return 0;
- }
-
- // å°†æ•°æ®æŒ‡é’ˆè½¬æ¢ä¸ºç»“构体指针
- struct tcp_top_perf_data *event = (struct tcp_top_perf_data *)data;
-
- // 定义缓冲区用于å˜å‚¨IP地å€å—符串
- char saddr_str[INET6_ADDRSTRLEN] = {0};
- char daddr_str[INET6_ADDRSTRLEN] = {0};
-
- // æ ¹æ®åœ°å€æ—è½¬æ¢æºåœ°å€
- if (event->af == AF_INET) {
- struct in_addr saddr;
- saddr.s_addr = event->src_addr.saddr_v4;
- if (inet_ntop(AF_INET, &saddr, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv4 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->src_addr.saddr_v6, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv6 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(saddr_str, "Unknown AF", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
-
- // æ ¹æ®åœ°å€æ—转æ¢ç›®æ ‡åœ°å€
- if (event->af == AF_INET) {
- struct in_addr daddr;
- daddr.s_addr = event->dst_addr.daddr_v4;
- if (inet_ntop(AF_INET, &daddr, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv4 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->dst_addr.daddr_v6, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv6 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(daddr_str, "Unknown AF", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
-
- // 将端å£å·ä»Žç½‘络å—节åºè½¬æ¢ä¸ºä¸»æœºå—节åº
- u16 lport = ntohs(event->lport);
- u16 dport = ntohs(event->dport);
-
- // 获å–当剿—¶é—´æˆ³
- time_t now = time(NULL);
- struct tm tm_info;
- char time_buf[64];
- localtime_r(&now, &tm_info);
- strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &tm_info);
-
- // 打å°äº‹ä»¶ä¿¡æ¯
- printf("[%s] PID: %u | Comm: %s | Sent: %llu bytes | Received: %llu bytes | %s:%u -> %s:%u\n",
- time_buf,
- event->pid,
- event->comm,
- (unsigned long long)event->send,
- (unsigned long long)event->recv,
- saddr_str,
- lport,
- daddr_str,
- dport);
-
- // 写入到 CSV 文件
- if (net_csv_files[2]) {
- // èŽ·å–æ–‡ä»¶æè¿°ç¬¦ä»¥æ£€æŸ¥æ–‡ä»¶å¤§å°
- int fd = fileno(net_csv_files[2]);
- if (fd == -1) {
- perror("fileno failed for net_csv_files[2]");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed for net_csv_files[2]");
- return -1;
- }
-
- // 如果文件为空,写入表头
- if (st.st_size == 0) {
- // fprintf(net_csv_files[2],
- // "Timestamp,PID,Comm,Source_IP,Source_Port,Destination_IP,Destination_Port,Sent_Bytes,Received_Bytes\n");
- fprintf(net_csv_files[2],
- "Timestamp,PID,Comm,Sent_Bytes,Received_Bytes\n");
- fflush(net_csv_files[2]);
- }
-
- // 写入事件数æ®
- // fprintf(net_csv_files[2], "%s,%u,%s,%s,%u,%s,%u,%llu,%llu\n",
- // time_buf,
- // event->pid,
- // event->comm,
- // saddr_str,
- // lport,
- // daddr_str,
- // dport,
- // (unsigned long long)event->send,
- // (unsigned long long)event->recv);
- fprintf(net_csv_files[2], "%s,%u,%s,%llu,%llu\n",
- time_buf,
- event->pid,
- event->comm,
- (unsigned long long)event->send,
- (unsigned long long)event->recv);
-
- } else {
- fprintf(stderr, "net_csv_files[2] is NULL. Cannot write to CSV\n");
- }
-
- return 0;
-}
-
-const char* tcp_state_to_string(u64 state) {
- switch (state) {
- case TCP_ESTABLISHED:
- return "ESTABLISHED";
- case TCP_SYN_SENT:
- return "SYN_SENT";
- case TCP_SYN_RECV:
- return "SYN_RECV";
- case TCP_FIN_WAIT1:
- return "FIN_WAIT1";
- case TCP_FIN_WAIT2:
- return "FIN_WAIT2";
- case TCP_TIME_WAIT:
- return "TIME_WAIT";
- case TCP_CLOSE:
- return "CLOSE";
- case TCP_CLOSE_WAIT:
- return "CLOSE_WAIT";
- case TCP_LAST_ACK:
- return "LAST_ACK";
- case TCP_LISTEN:
- return "LISTEN";
- case TCP_CLOSING:
- return "CLOSING";
- case TCP_NEW_SYN_RECV:
- return "NEW_SYN_RECV";
- case TCP_MAX_STATES:
- return "MAX_STATES";
- default:
- return "UNKNOWN";
- }
-}
-
-static int handle_usr_tcpretrans_event(void *ctx, void *data, size_t data_sz) {
- // 检查数æ®å¤§å°æ˜¯å¦ç¬¦åˆé¢„期
- if (data_sz < sizeof(struct tcp_resubmit)) {
- fprintf(stderr, "Received data size (%zu) is smaller than expected (%zu)\n", data_sz, sizeof(struct tcp_resubmit));
- return 0;
- }
-
- // å°†æ•°æ®æŒ‡é’ˆè½¬æ¢ä¸ºç»“构体指针
- struct tcp_resubmit *event = (struct tcp_resubmit *)data;
-
- // 定义缓冲区用于å˜å‚¨IP地å€å—符串
- char saddr_str[INET6_ADDRSTRLEN] = {0};
- char daddr_str[INET6_ADDRSTRLEN] = {0};
-
- // æ ¹æ®åœ°å€æ—è½¬æ¢æºåœ°å€
- if (event->af == AF_INET) {
- struct in_addr saddr;
- saddr.s_addr = event->src_addr.saddr_v4;
- if (inet_ntop(AF_INET, &saddr, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv4 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->src_addr.saddr_v6, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv6 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(saddr_str, "Unknown AF", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
-
- // æ ¹æ®åœ°å€æ—转æ¢ç›®æ ‡åœ°å€
- if (event->af == AF_INET) {
- struct in_addr daddr;
- daddr.s_addr = event->dst_addr.daddr_v4;
- if (inet_ntop(AF_INET, &daddr, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv4 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->dst_addr.daddr_v6, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv6 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(daddr_str, "Unknown AF", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
-
- // 将端å£å·ä»Žç½‘络å—节åºè½¬æ¢ä¸ºä¸»æœºå—节åº
- u16 lport = ntohs(event->lport);
- u16 dport = ntohs(event->dport);
-
- // æ ¼å¼åŒ–时间戳
- // 将纳秒转æ¢ä¸ºç§’和纳秒
- time_t relative_sec = event->occur / 1000000000;
- long relative_nsec = event->occur % 1000000000;
-
- // 计算ç»å¯¹æ—¶é—´
- time_t absolute_sec = boot_time + relative_sec;
- long absolute_nsec = relative_nsec;
-
- // å°†ç»å¯¹æ—¶é—´è½¬æ¢ä¸ºæœ¬åœ°æ—¶é—´
- struct tm tm_info;
- if (localtime_r(&absolute_sec, &tm_info) == NULL) {
- perror("localtime_r failed");
- return 0;
- }
-
-
- // æ ¼å¼åŒ–æ—¶é—´å—符串
- char time_buf[64];
- if (strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &tm_info) == 0) {
- fprintf(stderr, "strftime returned 0");
- strncpy(time_buf, "Unknown Time", sizeof(time_buf));
- }
-
- // 打å°äº‹ä»¶ä¿¡æ¯
- printf("[%s] PID: %u | Comm: %s | Seq: %u | State: %s | Event Type: %llu | %s:%u -> %s:%u\n",
- time_buf,
- event->pid,
- event->comm,
- event->seq,
- tcp_state_to_string(event->state), // 输出状æ€çš„å—符形å¼
- event->type,
- saddr_str,
- lport,
- daddr_str,
- dport);
-
- // 写入到 CSV 文件
- if (net_csv_files[3]) { // 对应é‡ä¼ 事件的 CSV 文件
- int fd = fileno(net_csv_files[3]);
- if (fd == -1) {
- perror("fileno failed for net_csv_files[3]");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed for net_csv_files[3]");
- return -1;
- }
-
- // 如果文件为空,写入表头
- if (st.st_size == 0) {
- // fprintf(net_csv_files[3],
- // "Timestamp,PID,Comm,Seq,State,Event_Type,Source_IP,Source_Port,Destination_IP,Destination_Port\n");
- fprintf(net_csv_files[3],
- "Timestamp,PID,Comm,State,Event_Type,Source_IP,Source_Port,Destination_IP,Destination_Port\n");
- fflush(net_csv_files[3]);
- }
-
- // 写入事件数æ®
- // fprintf(net_csv_files[3], "%s.%09ld,%u,%s,%u,%s,%llu,%s,%u,%s,%u\n",
- // time_buf,
- // absolute_nsec,
- // event->pid,
- // event->comm,
- // event->seq,
- // tcp_state_to_string(event->state),
- // event->type,
- // saddr_str,
- // lport,
- // daddr_str,
- // dport);
- fprintf(net_csv_files[3], "%s.%09ld,%u,%s,%s,%llu,%s,%u,%s,%u\n",
- time_buf,
- absolute_nsec,
- event->pid,
- event->comm,
- tcp_state_to_string(event->state),
- event->type,
- saddr_str,
- lport,
- daddr_str,
- dport);
- } else {
- fprintf(stderr, "net_csv_files[3] is NULL. Cannot write to CSV\n");
- }
-
- return 0;
-}
-
-static bool fentry_try_attach(int id) {
- int prog_fd, attach_fd;
- char error[4096] = {0};
- struct bpf_insn insns[] = {
- {.code = BPF_ALU64 | BPF_MOV | BPF_K, .dst_reg = BPF_REG_0, .imm = 0},
- {.code = BPF_JMP | BPF_EXIT},
- };
- LIBBPF_OPTS(bpf_prog_load_opts, opts,
- .expected_attach_type = BPF_TRACE_FENTRY, .attach_btf_id = id,
- .log_buf = error, .log_size = sizeof(error), );
-
- prog_fd = bpf_prog_load(BPF_PROG_TYPE_TRACING, "fentry_attach", "GPL", insns,
- sizeof(insns) / sizeof(struct bpf_insn), &opts);
- if (prog_fd < 0) {
- fprintf(stderr, "bpf_prog_load failed: %s\n", strerror(errno));
- return false;
- }
-
- attach_fd = bpf_raw_tracepoint_open(NULL, prog_fd);
- if (attach_fd < 0) {
- fprintf(stderr, "bpf_raw_tracepoint_open failed: %s\n", strerror(errno));
- close(prog_fd);
- return false;
- }
-
- close(attach_fd);
- close(prog_fd);
- return true;
-}
-
-static bool fentry_can_attach(const char* name, const char* mod) {
- struct btf *btf, *vmlinux_btf, *module_btf = NULL;
- int err, id;
-
- vmlinux_btf = btf__load_vmlinux_btf();
- err = libbpf_get_error(vmlinux_btf);
- if (err) {
- fprintf(stderr, "Failed to load vmlinux BTF\n");
- return false;
- }
-
- btf = vmlinux_btf;
-
- if (mod) {
- module_btf = btf__load_module_btf(mod, vmlinux_btf);
- err = libbpf_get_error(module_btf);
- if (!err)
- btf = module_btf;
- else
- fprintf(stderr, "Failed to load module BTF for module %s\n", mod);
- }
-
- id = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC);
-
- btf__free(module_btf);
- btf__free(vmlinux_btf);
-
- if (id <= 0) {
- fprintf(stderr, "Function %s not found in BTF\n", name);
- return false;
- }
-
- return fentry_try_attach(id);
-}
diff --git a/os_spy b/os_spy
deleted file mode 100755
index 798ff54..0000000
Binary files a/os_spy and /dev/null differ
diff --git a/os_spy.c b/os_spy.c
deleted file mode 100644
index 7482c12..0000000
--- a/os_spy.c
+++ /dev/null
@@ -1,2674 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "env.h"
-#include "proc_data.h"
-#include "cpu_event.h"
-#include "io_event.h"
-#include "net_event.h"
-#include "mm_event.h"
-#include "blazesym.h"
-#include "hash_table.h"
-
-#include "cpu_stats.skel.h"
-#include "io_stats.skel.h"
-#include "mm_stats.skel.h"
-#include "mm_leak.skel.h"
-#include "net_stats.skel.h"
-
-/*----------------------å…±åŒéƒ¨åˆ†---------------------------------*/
-static const struct argp argp = {
- argp_options,
- parse_arg,
- NULL,
- argp_args_doc
-};
-
-static struct env env_data = {
- .interval = 1,
- .cpu_data = false,
- .io_data = false,
- .mm_data = false,
- .net_data = false,
- .visualize = false,
- .std_output = true
-};
-
-#define MAX_CSV_FILES 10
-static char csv_folder_path[MAX_PATH_LEN];
-
-static char visualize_proc_path[MAX_PATH_LEN];// 把ä¸é€‚åˆæ”¾åˆ°promthes的都放到这个文件夹
-
-volatile sig_atomic_t stop = 0;
-
-static time_t boot_time; // 系统å¯åŠ¨æ—¶é—´
-
-static u32 zero = 0;
-static u32 one = 1;
-static int create_perf_event(u32 period_ms);
-static struct bpf_link* attach_perf_event_to_program(struct bpf_program *prog, u32 period_ms);
-
-static int init_time();// åˆå§‹åŒ–ç³»ç»Ÿå½“å‰æ—¶é—´
-static int get_proc_path();
-
-
-// ä¿¡å·å¤„ç†å‡½æ•°ï¼Œç”¨äºŽä¼˜é›…地退出程åº
-void handle_sigint(int sig) {
- stop = 1;
-}
-
-/*----------------------网络部分----------------------------------*/
-// å’Œå¯è§†åŒ–有关的
-const char *net_csv_names[] = {
- "net_latency",
- "tcprtt",
- "tcptop",
- "tcpretrans"
- };
-
-FILE *net_csv_files[MAX_CSV_FILES];
-
-struct ring_buffer *rb_net_latency = NULL;
-struct ring_buffer *rb_tcprtt = NULL;
-struct ring_buffer *rb_tcptop = NULL;
-struct ring_buffer *rb_tcpretrans = NULL;
-struct net_stats_bpf *net_skel = NULL;
-struct sysinfo sys_data;
-struct bpf_link *link_to_tcprtt = NULL;
-
-static int net_create_csv();
-
-static int handle_net_latency_event(void *ctx, void *data, size_t data_sz);
-static int handle_usr_tcprtt_event(void *ctx, void *data, size_t data_sz);
-static int handle_usr_tcptop_event(void *ctx, void *data, size_t data_sz);
-static int handle_usr_tcpretrans_event(void *ctx, void *data, size_t data_sz);
-static bool fentry_try_attach(int id);
-static bool fentry_can_attach(const char* name, const char* mod);
-static int attach_net_skel(struct net_stats_bpf *skel);
-void net_resource_clean();
-static int net_ring_buffer_poll();
-
-enum {
- TCP_ESTABLISHED = 1,
- TCP_SYN_SENT = 2,
- TCP_SYN_RECV = 3,
- TCP_FIN_WAIT1 = 4,
- TCP_FIN_WAIT2 = 5,
- TCP_TIME_WAIT = 6,
- TCP_CLOSE = 7,
- TCP_CLOSE_WAIT = 8,
- TCP_LAST_ACK = 9,
- TCP_LISTEN = 10,
- TCP_CLOSING = 11,
- TCP_NEW_SYN_RECV = 12,
- TCP_MAX_STATES = 13,
-};
-
-
-/*--------------------------io部分-----------------------------------*/
-#define MAX_IO_RESULTS 256
-struct ring_buffer *rb_io_task_stats, *rb_io_process_stats, *rb_io_wait;
-struct io_stats_bpf *io_skel = NULL;
-struct bpf_link *link_io_wait = NULL;
-DiskStatsContext* context = NULL;
-DiskStats current[MAX_DEVICES];
-
-// å’Œå¯è§†åŒ–有关的
-const char *io_csv_names[] = {
- "io_task_stats",
- "io_process_stats",
- "iowait_perf",
- };
-
-FILE *io_csv_files[MAX_CSV_FILES];
-
-static int io_create_csv();
-
-static int handle_io_task_stats_event(void *ctx,void *data, size_t data_sz);
-static int handle_io_process_stats_event(void *ctx,void *data, size_t data_sz);
-static int handle_iowait_perf_event(void *ctx,void *data, size_t data_sz);
-static int attach_io_skel(struct io_stats_bpf *skel);
-int io_initialize_monitoring(unsigned int interval);
-static void io_resource_clean();
-static int io_ring_buffer_poll();
-
-
-/*----------------------------mm部分--------------------------------------*/
-static u64 trace_pid = 0;
-int leak_allocs_fd;
-int leak_stack_traces_fd;
-
-FILE *mm_file = NULL;
-
-// å’Œå¯è§†åŒ–有关的
-const char *mm_csv_names[] = {
- "oom_event",
- "task_mm_stats",
- "process_mm_stats",
- };
-
-const char mm_stack[] = "mm_alloc";
-FILE *mm_alloc_stack = NULL;
-
-int get_mm_txt();
-
-FILE *mm_csv_files[MAX_CSV_FILES];
-static int mm_create_csv();
-
-static struct blaze_symbolizer *mm_symbolizer;
-static struct allocation *allocs;
-struct ring_buffer *rb_oom, *rb_task_mm, *rb_process_mm;
-
-struct mm_leak_bpf *leak_skel = NULL;
-struct mm_stats_bpf *mm_skel = NULL;
-
-static u64 *stack;
-
-static int attach_leak_uprobes(struct mm_leak_bpf *skel);
-static int print_outstanding_allocs(int allocs_fd, int stack_traces_fd);
-static int print_stack_frames(struct allocation *allocs, u64 nr_allocs, int stack_traces_fd);
-
-static int handle_oom_event(void *ctx,void *data, size_t data_sz);
-static int handle_task_mm_stats_event(void *ctx,void *data, size_t data_sz);
-static int handle_process_mm_stats_event(void *ctx,void *data, size_t data_sz);
-
-
-static int attach_leak_skel(struct mm_leak_bpf *skel);
-static int attach_mm_stats_skel(struct mm_stats_bpf *skel);
-static int mm_ring_buffer_poll();
-static void mm_resource_clean();
-
-
-/*---------------------------cpu部分---------------------------------------*/
-struct ring_buffer *rb_cpu = NULL;
-struct ring_buffer *rb_task = NULL;
-struct ring_buffer *rb_process = NULL;
-struct ring_buffer *rb_runqlat = NULL;
-struct ring_buffer *rb_backtrace = NULL;
-struct cpu_stats_bpf *cpu_skel = NULL;
-
-const char *cpu_csv_names[] = {
- "cpu_usage",
- "task_usage",
- "process_stat",
- "runqlat",
- };
-
-const char cpu_stack[] = "task_backtrace";
-FILE *cpu_task_stack = NULL;
-
-int get_cpu_txt();
-
-FILE *cpu_csv_files[MAX_CSV_FILES];
-static int cpu_create_csv();
-
-static struct blaze_symbolizer *cpu_symbolizer;
-static int init_cpu_symbolizer();
-static void free_cpu_symbolizer();
-
-static void cpu_print_frame(const char *name, uintptr_t input_addr, uintptr_t addr, uint64_t offset, const blaze_symbolize_code_info* code_info);
-static void cpu_show_stack_trace(uint64_t *stack, int stack_sz, pid_t pid);
-static int handle_usr_task_cpu_backtrace_event(void *ctx,void *data, size_t data_sz);
-static int handle_cpu_usage_event(void *ctx,void *data, size_t data_sz);
-static int handle_usr_task_usage_event(void *ctx,void *data, size_t data_sz);
-static int handle_use_process_stat_event(void *ctx,void *data, size_t data_sz);
-static int handle_usr_runqlat_event(void *ctx,void *data, size_t data_sz);
-
-static int attach_cpu_skel(struct cpu_stats_bpf *skel);
-static int cpu_ring_buffer_poll();
-static void cpu_resource_clean();
-
-
-int main(int argc, char **argv){
- int ret;
- // Parse command line arguments
- argp_parse(&argp, argc, argv, 0, NULL, &env_data);
- // 注册信å·å¤„ç†å™¨ï¼Œæ•获Ctrl-C (SIGINT)
- signal(SIGINT, handle_sigint);
-
- ret = init_time();
- if(ret != 0)
- goto cleanup;
-
- ret = get_proc_path();
- if(ret != 0)
- goto cleanup;
-
- if(env_data.cpu_data){
- if(env_data.visualize){
- ret = cpu_create_csv();
- if(ret != 0)
- goto cleanup;
- ret = get_cpu_txt();
- if(ret != 0)
- goto cleanup;
- }
- ret = attach_cpu_skel(cpu_skel);
- if(ret != 0)
- goto cleanup;
- }
-
- if(env_data.net_data){
- if(env_data.visualize){
- ret = net_create_csv();
- if(ret != 0)
- goto cleanup;
- }
- net_skel = net_stats_bpf__open();
- if(!net_skel){
- fprintf(stderr, "failed to open net_stats skel\n");
- ret = 1;
-
- goto cleanup;
- }
-
- ret = attach_net_skel(net_skel);
- if(ret != 0)
- goto cleanup;
- }
-
- if(env_data.io_data){
- if(env_data.visualize){
- ret = io_create_csv();
- if(ret != 0)
- goto cleanup;
- }
- io_skel = io_stats_bpf__open();
- if(!io_skel){
- fprintf(stderr, "failed to open io_stats skel\n");
- ret = 1;
-
- goto cleanup;
- }
- ret = attach_io_skel(io_skel);
- if(ret != 0)
- goto cleanup;
-
- if (io_initialize_monitoring(1) != 0) {
- fprintf(stderr, "Initialization failed.\n");
- ret = 1;
- goto cleanup;
- }
- }
-
- if(env_data.mm_data){
- mm_file = open_meminfo();
- if(env_data.visualize){
- ret = mm_create_csv();
- if(ret != 0)
- goto cleanup;
- ret = get_mm_txt();
- if(ret != 0)
- goto cleanup;
- }
-
- leak_skel = mm_leak_bpf__open();
- if(!leak_skel){
- fprintf(stderr, "failed to open mm_leak skel\n");
- ret = 1;
-
- goto cleanup;
- }
-
- mm_skel = mm_stats_bpf__open();
- if(!mm_skel){
- fprintf(stderr, "failed to open mm_stats skel\n");
- ret = 1;
-
- goto cleanup;
- }
-
- ret = attach_leak_skel(leak_skel);
- if(ret != 0)
- goto cleanup;
-
- ret = attach_mm_stats_skel(mm_skel);
- if(ret != 0)
- goto cleanup;
- }
-
- while(1){
- if(env_data.net_data){
- if (monitor_network(env_data.visualize) != 0) {
- fprintf(stderr, "An error occurred during network monitoring.\n");
- }
- ret = net_ring_buffer_poll();
- if(ret != 0)
- goto cleanup;
- }
- if(env_data.io_data){
- ret = io_ring_buffer_poll();
- if(ret != 0)
- goto cleanup;
- if (process_disk_stats(context, current, &context->device_count_prev, 1) != 0) {
- goto cleanup;
- }
- }
- if(env_data.mm_data){
- read_meminfo(mm_file);
- print_outstanding_allocs(leak_allocs_fd,leak_stack_traces_fd);
- ret = mm_ring_buffer_poll();
- if(ret < 0)
- goto cleanup;
- }
- if(env_data.cpu_data){
- ret = cpu_ring_buffer_poll();
- if(ret < 0)
- goto cleanup;
- }
- }
-
-
-cleanup:
- cpu_resource_clean();
- net_resource_clean();
- io_resource_clean();
- mm_resource_clean();
-
- return ret;
-}
-
-
-/*-----------------------------å…±åŒéƒ¨åˆ†---------------------------------------*/
-static int get_proc_path() {
- // 获å–当å‰å·¥ä½œç›®å½•
- if (getcwd(visualize_proc_path, sizeof(visualize_proc_path)) == NULL) {
- perror("getcwd failed");
- return 1;
- }
-
- // 拼接 "visualize/proc" 文件夹到路径
- strncat(visualize_proc_path, "/visualize/proc", sizeof(visualize_proc_path) - strlen(visualize_proc_path) - 1);
-
- // 检查 "visualize/proc" 文件夹是å¦å˜åœ¨
- struct stat st;
- if (stat(visualize_proc_path, &st) == 0) {
- if (!S_ISDIR(st.st_mode)) {
- fprintf(stderr, "Error: %s exists but is not a directory\n", visualize_proc_path);
- return 1;
- }
- } else {
- // 文件夹ä¸å˜åœ¨ï¼Œå°è¯•创建
- if (mkdir(visualize_proc_path, 0755) != 0) {
- perror("mkdir failed");
- return 1;
- }
- }
-
- return 0;
-}
-
-static int create_perf_event(u32 period_ms) {
- struct perf_event_attr attr = {
- .type = PERF_TYPE_SOFTWARE, // 使用软件事件类型
- .config = PERF_COUNT_SW_CPU_CLOCK, // 使用 CPU æ—¶é’Ÿä½œä¸ºè§¦å‘æº
- .size = sizeof(struct perf_event_attr),
- .sample_period = period_ms * 1000000ULL, // 设置为毫秒级的间隔
- .freq = 0, // 使用固定间隔,而éžé¢‘率
- .wakeup_events = 1, // æ¯æ¬¡è§¦å‘事件
- };
-
- // 对所有 CPU 和进程创建事件
- int fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
- if (fd < 0) {
- perror("perf_event_open");
- return -1;
- }
- return fd;
-}
-
-static struct bpf_link* attach_perf_event_to_program(struct bpf_program *prog, u32 period_ms) {
- // 创建 perf event
- int perf_fd = create_perf_event(period_ms);
- if (perf_fd < 0) {
- fprintf(stderr, "Failed to create perf_event\n");
- return NULL;
- }
-
- // å°† perf event é™„åŠ åˆ°æŒ‡å®šçš„ BPF 程åº
- struct bpf_link *link = bpf_program__attach_perf_event(prog, perf_fd);
- if (!link) {
- fprintf(stderr, "Failed to attach perf_event to BPF program: %s\n", strerror(errno));
- close(perf_fd);
- return NULL;
- }
-
- return link;
-}
-
-static int init_time(){
-
- if(sysinfo(&sys_data) != 0){
- perror("sysinfo get failed\n");
- return 1;
- }
-
- time_t now = time(NULL);
- if (now == ((time_t) -1)) {
- perror("current time get failed\n");
- return 1;
- }
-
- boot_time = now - sys_data.uptime;
-
- return 0;
-}
-
-/*-----------------------------------------网络部分----------------------------------*/
-static int net_create_csv(){
- int ret;
- int num_csv_names = sizeof(net_csv_names) / sizeof(net_csv_names[0]);
-
- for(int i=0;iprogs.fentry_tcp_v4_connect,0,"tcp_v4_connect");
- bpf_program__set_attach_target(skel->progs.fentry_tcp_v6_connect,0,"tcp_v6_connect");
- bpf_program__set_attach_target(skel->progs.fentry_tcp_rcv_state_process,0,"tcp_rcv_state_process");
-
- bpf_program__set_autoload(skel->progs.fentry_tcp_v4_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_v6_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_rcv_state_process,false);
- }
- else{
- bpf_program__set_autoload(skel->progs.fentry_tcp_v4_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_v6_connect,false);
- bpf_program__set_autoload(skel->progs.fentry_tcp_rcv_state_process,false);
- }
-
- ret = net_stats_bpf__load(skel);
- if(ret){
- fprintf(stderr, "failed to load net_stats skel\n");
- return ret;
- }
-
- ret = net_stats_bpf__attach(skel);
- if(ret){
- fprintf(stderr, "failed to attach net_stats bpf program(s)\n");
-
- return ret;
- }
-
- link_to_tcprtt = attach_perf_event_to_program(skel->progs.handle_tcprtt_event,500);
- if(!link_to_tcprtt){
- return -1;
- }
- skel->links.handle_tcprtt_event = link_to_tcprtt;
-
- rb_net_latency = ring_buffer__new(bpf_map__fd(skel->maps.net_latency_buffer),handle_net_latency_event,NULL,NULL);
- rb_tcprtt = ring_buffer__new(bpf_map__fd(skel->maps.tcprtt_buffer),handle_usr_tcprtt_event,NULL,NULL);
- rb_tcptop = ring_buffer__new(bpf_map__fd(skel->maps.tcptop_buffer),handle_usr_tcptop_event,NULL,NULL);
- rb_tcpretrans = ring_buffer__new(bpf_map__fd(skel->maps.tcpretrans_buffer),handle_usr_tcpretrans_event,NULL,NULL);
-
- return 0;
-}
-
-static int net_ring_buffer_poll(){
- int ret;
- ret = ring_buffer__poll(rb_net_latency,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling net latency ring buffer: %d\n", ret);
- return ret;
- }
-
- ret = ring_buffer__poll(rb_tcprtt,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling tcprtt ring buffer: %d\n", ret);
- return ret;
- }
-
- ret = ring_buffer__poll(rb_tcptop,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling tcptop ring buffer: %d\n", ret);
- return ret;
- }
-
- ret = ring_buffer__poll(rb_tcpretrans,200);
- if(ret < 0)
- {
- fprintf(stderr, "Error polling tcpretrans ring buffer: %d\n", ret);
- return ret;
- }
-
- return 0;
-}
-
-void net_resource_clean(){
- if(rb_net_latency)
- ring_buffer__free(rb_net_latency);
- if(rb_tcprtt)
- ring_buffer__free(rb_tcprtt);
- if(rb_tcptop)
- ring_buffer__free(rb_tcptop);
- if(rb_tcpretrans)
- ring_buffer__free(rb_tcpretrans);
-
- for(int i=0;iaf == AF_INET) {
- // IPv4 地å€
- struct in_addr saddr, daddr;
- saddr.s_addr = event->src_addr.saddr_v4;
- daddr.s_addr = event->dst_addr.daddr_v4;
-
- // 将网络å—节åºçš„地å€è½¬æ¢ä¸ºå—符串
- if (inet_ntop(AF_INET, &saddr, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv4 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str));
- }
-
- if (inet_ntop(AF_INET, &daddr, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv4 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str));
- }
- }
- else if (event->af == AF_INET6) {
- // IPv6 地å€
- if (inet_ntop(AF_INET6, event->src_addr.saddr_v6, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv6 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str));
- }
-
- if (inet_ntop(AF_INET6, event->dst_addr.daddr_v6, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv6 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str));
- }
- }
- else {
- // æœªçŸ¥çš„åœ°å€æ—
- strncpy(saddr_str, "Unknown AF", sizeof(saddr_str));
- strncpy(daddr_str, "Unknown AF", sizeof(daddr_str));
- }
-
- // æ ¼å¼åŒ–时间戳
- // 将纳秒转æ¢ä¸ºç§’和纳秒
- time_t relative_sec = event->ts / 1000000000;
- long relative_nsec = event->ts % 1000000000;
-
- // 计算ç»å¯¹æ—¶é—´
- time_t absolute_sec = boot_time + relative_sec;
- long absolute_nsec = relative_nsec;
-
- // å°†ç»å¯¹æ—¶é—´è½¬æ¢ä¸ºæœ¬åœ°æ—¶é—´
- struct tm tm_info;
- if (localtime_r(&absolute_sec, &tm_info) == NULL) {
- perror("localtime_r failed");
- return 0;
- }
-
-
- // æ ¼å¼åŒ–æ—¶é—´å—符串
- char time_buf[64];
- if (strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &tm_info) == 0) {
- fprintf(stderr, "strftime returned 0");
- strncpy(time_buf, "Unknown Time", sizeof(time_buf));
- }
-
- if(env_data.std_output){
- printf("[%s.%09ld] TGID: %u Comm: %s | TCP Connect Delay: %llu us | %s:%u -> %s:%u\n",
- time_buf,
- absolute_nsec,
- event->tgid,
- event->comm,
- (unsigned long long)event->delta,
- saddr_str,
- ntohs(event->lport),
- daddr_str,
- ntohs(event->dport));
- }
-
- // 打å°äº‹ä»¶ä¿¡æ¯
- // printf("[%s.%09ld] TGID: %u Comm: %s | TCP Connect Delay: %llu us | %s:%u -> %s:%u\n",
- // time_buf,
- // absolute_nsec,
- // event->tgid,
- // event->comm,
- // (unsigned long long)event->delta,
- // saddr_str,
- // ntohs(event->lport),
- // daddr_str,
- // ntohs(event->dport));
-
- // 将事件信æ¯å†™å…¥ CSV 文件
- if(!env_data.visualize)
- return 0;
-
- if (!net_csv_files[0]) {
- fprintf(stderr, "net_csv_files[0] is NULL. Cannot write to CSV\n");
- return -1;
- }
-
- int fd = fileno(net_csv_files[0]);
- if (fd == -1) {
- perror("fileno failed");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed");
- return -1;
- }
-
- if (st.st_size == 0) {
- fprintf(net_csv_files[0], "Timestamp,PID,Comm,Delay_us\n");
- fflush(net_csv_files[0]);
- }
-
- fprintf(net_csv_files[0], "%s.%09ld,%u,%.16s,%llu\n",
- time_buf,
- absolute_nsec,
- event->tgid,
- event->comm,
- (unsigned long long)event->delta);
-
- return 0; // 返回 0 表示继ç»å¤„ç†å…¶ä»–事件
-}
-
-static int handle_usr_tcprtt_event(void *ctx, void *data, size_t data_sz){
- struct tcprtt_perf_data *event = (struct tcprtt_perf_data *)data;
-
- if(env_data.std_output){
- for(int i=0;i<8;i++){
- switch(i){
- case 0:
- printf("wait less than 1ms: %u\n",event->data[i]);
- continue;
- case 1:
- printf("wait less than 4ms: %u\n",event->data[i]);
- continue;
- case 2:
- printf("wait less than 16ms: %u\n",event->data[i]);
- continue;
- case 3:
- printf("wait less than 32ms: %u\n",event->data[i]);
- continue;
- case 4:
- printf("wait less than 64ms: %u\n",event->data[i]);
- continue;
- case 5:
- printf("wait less than 128ms: %u\n",event->data[i]);
- continue;
- case 6:
- printf("wait less than 256ms: %u\n",event->data[i]);
- continue;
- case 7:
- printf("wait more than 256ms: %u\n",event->data[i]);
- continue;
- default:
- continue;
- }
- }
- }
- printf("\n");
-
- // 写入到 CSV 文件
- if(!env_data.visualize)
- return 0;
- if (net_csv_files[1]) {
- // èŽ·å–æ–‡ä»¶æè¿°ç¬¦ä»¥æ£€æŸ¥æ–‡ä»¶å¤§å°
- int fd = fileno(net_csv_files[1]);
- if (fd == -1) {
- perror("fileno failed for net_csv_files[1]");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed for net_csv_files[1]");
- return -1;
- }
-
- // 如果文件为空,写入表头
- if (st.st_size == 0) {
- fprintf(net_csv_files[1],
- "1ms,4ms,16ms,32ms,64ms,128ms,256ms,256ms+\n");
- fflush(net_csv_files[1]);
- }
-
- // 写入事件数æ®
- fprintf(net_csv_files[1], "%u,%u,%u,%u,%u,%u,%u,%u\n",
- event->data[0], event->data[1], event->data[2],
- event->data[3], event->data[4], event->data[5],
- event->data[6], event->data[7]);
- } else {
- fprintf(stderr, "net_csv_files[1] is NULL. Cannot write to CSV\n");
- }
-
-
- return 0;
-}
-
-static int handle_usr_tcptop_event(void *ctx, void *data, size_t data_sz)
-{
- // 检查数æ®å¤§å°æ˜¯å¦ç¬¦åˆé¢„期
- if (data_sz < sizeof(struct tcp_top_perf_data)) {
- fprintf(stderr, "Received data size (%zu) is smaller than expected (%zu)\n", data_sz, sizeof(struct tcp_top_perf_data));
- return 0;
- }
-
- // å°†æ•°æ®æŒ‡é’ˆè½¬æ¢ä¸ºç»“构体指针
- struct tcp_top_perf_data *event = (struct tcp_top_perf_data *)data;
-
- // 定义缓冲区用于å˜å‚¨IP地å€å—符串
- char saddr_str[INET6_ADDRSTRLEN] = {0};
- char daddr_str[INET6_ADDRSTRLEN] = {0};
-
- // æ ¹æ®åœ°å€æ—è½¬æ¢æºåœ°å€
- if (event->af == AF_INET) {
- struct in_addr saddr;
- saddr.s_addr = event->src_addr.saddr_v4;
- if (inet_ntop(AF_INET, &saddr, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv4 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->src_addr.saddr_v6, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv6 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(saddr_str, "Unknown AF", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
-
- // æ ¹æ®åœ°å€æ—转æ¢ç›®æ ‡åœ°å€
- if (event->af == AF_INET) {
- struct in_addr daddr;
- daddr.s_addr = event->dst_addr.daddr_v4;
- if (inet_ntop(AF_INET, &daddr, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv4 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->dst_addr.daddr_v6, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv6 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(daddr_str, "Unknown AF", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
-
- // 将端å£å·ä»Žç½‘络å—节åºè½¬æ¢ä¸ºä¸»æœºå—节åº
- u16 lport = ntohs(event->lport);
- u16 dport = ntohs(event->dport);
-
- // 获å–当剿—¶é—´æˆ³
- time_t now = time(NULL);
- struct tm tm_info;
- char time_buf[64];
- localtime_r(&now, &tm_info);
- strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &tm_info);
-
- // 打å°äº‹ä»¶ä¿¡æ¯
- if(env_data.std_output){
- printf("[%s] PID: %u | Comm: %s | Sent: %llu bytes | Received: %llu bytes | %s:%u -> %s:%u\n",
- time_buf,
- event->pid,
- event->comm,
- (unsigned long long)event->send,
- (unsigned long long)event->recv,
- saddr_str,
- lport,
- daddr_str,
- dport);
- }
-
- if(!env_data.visualize)
- return 0;
- // 写入到 CSV 文件
- if (net_csv_files[2]) {
- // èŽ·å–æ–‡ä»¶æè¿°ç¬¦ä»¥æ£€æŸ¥æ–‡ä»¶å¤§å°
- int fd = fileno(net_csv_files[2]);
- if (fd == -1) {
- perror("fileno failed for net_csv_files[2]");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed for net_csv_files[2]");
- return -1;
- }
-
- // 如果文件为空,写入表头
- if (st.st_size == 0) {
- // fprintf(net_csv_files[2],
- // "Timestamp,PID,Comm,Source_IP,Source_Port,Destination_IP,Destination_Port,Sent_Bytes,Received_Bytes\n");
- fprintf(net_csv_files[2],
- "Timestamp,PID,Comm,Sent_Bytes,Received_Bytes\n");
- fflush(net_csv_files[2]);
- }
-
- fprintf(net_csv_files[2], "%s,%u,%s,%llu,%llu\n",
- time_buf,
- event->pid,
- event->comm,
- (unsigned long long)event->send,
- (unsigned long long)event->recv);
-
- } else {
- fprintf(stderr, "net_csv_files[2] is NULL. Cannot write to CSV\n");
- }
-
- return 0;
-}
-
-const char* tcp_state_to_string(u64 state) {
- switch (state) {
- case TCP_ESTABLISHED:
- return "ESTABLISHED";
- case TCP_SYN_SENT:
- return "SYN_SENT";
- case TCP_SYN_RECV:
- return "SYN_RECV";
- case TCP_FIN_WAIT1:
- return "FIN_WAIT1";
- case TCP_FIN_WAIT2:
- return "FIN_WAIT2";
- case TCP_TIME_WAIT:
- return "TIME_WAIT";
- case TCP_CLOSE:
- return "CLOSE";
- case TCP_CLOSE_WAIT:
- return "CLOSE_WAIT";
- case TCP_LAST_ACK:
- return "LAST_ACK";
- case TCP_LISTEN:
- return "LISTEN";
- case TCP_CLOSING:
- return "CLOSING";
- case TCP_NEW_SYN_RECV:
- return "NEW_SYN_RECV";
- case TCP_MAX_STATES:
- return "MAX_STATES";
- default:
- return "UNKNOWN";
- }
-}
-
-static int handle_usr_tcpretrans_event(void *ctx, void *data, size_t data_sz) {
- // 检查数æ®å¤§å°æ˜¯å¦ç¬¦åˆé¢„期
- if (data_sz < sizeof(struct tcp_resubmit)) {
- fprintf(stderr, "Received data size (%zu) is smaller than expected (%zu)\n", data_sz, sizeof(struct tcp_resubmit));
- return 0;
- }
-
- // å°†æ•°æ®æŒ‡é’ˆè½¬æ¢ä¸ºç»“构体指针
- struct tcp_resubmit *event = (struct tcp_resubmit *)data;
-
- // 定义缓冲区用于å˜å‚¨IP地å€å—符串
- char saddr_str[INET6_ADDRSTRLEN] = {0};
- char daddr_str[INET6_ADDRSTRLEN] = {0};
-
- // æ ¹æ®åœ°å€æ—è½¬æ¢æºåœ°å€
- if (event->af == AF_INET) {
- struct in_addr saddr;
- saddr.s_addr = event->src_addr.saddr_v4;
- if (inet_ntop(AF_INET, &saddr, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv4 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->src_addr.saddr_v6, saddr_str, sizeof(saddr_str)) == NULL) {
- perror("inet_ntop IPv6 source address failed");
- strncpy(saddr_str, "Unknown", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(saddr_str, "Unknown AF", sizeof(saddr_str)-1);
- saddr_str[sizeof(saddr_str)-1] = '\0';
- }
-
- // æ ¹æ®åœ°å€æ—转æ¢ç›®æ ‡åœ°å€
- if (event->af == AF_INET) {
- struct in_addr daddr;
- daddr.s_addr = event->dst_addr.daddr_v4;
- if (inet_ntop(AF_INET, &daddr, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv4 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else if (event->af == AF_INET6) {
- if (inet_ntop(AF_INET6, event->dst_addr.daddr_v6, daddr_str, sizeof(daddr_str)) == NULL) {
- perror("inet_ntop IPv6 destination address failed");
- strncpy(daddr_str, "Unknown", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
- }
- else {
- strncpy(daddr_str, "Unknown AF", sizeof(daddr_str)-1);
- daddr_str[sizeof(daddr_str)-1] = '\0';
- }
-
- // 将端å£å·ä»Žç½‘络å—节åºè½¬æ¢ä¸ºä¸»æœºå—节åº
- u16 lport = ntohs(event->lport);
- u16 dport = ntohs(event->dport);
-
- // æ ¼å¼åŒ–时间戳
- // 将纳秒转æ¢ä¸ºç§’和纳秒
- time_t relative_sec = event->occur / 1000000000;
- long relative_nsec = event->occur % 1000000000;
-
- // 计算ç»å¯¹æ—¶é—´
- time_t absolute_sec = boot_time + relative_sec;
- long absolute_nsec = relative_nsec;
-
- // å°†ç»å¯¹æ—¶é—´è½¬æ¢ä¸ºæœ¬åœ°æ—¶é—´
- struct tm tm_info;
- if (localtime_r(&absolute_sec, &tm_info) == NULL) {
- perror("localtime_r failed");
- return 0;
- }
-
-
- // æ ¼å¼åŒ–æ—¶é—´å—符串
- char time_buf[64];
- if (strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &tm_info) == 0) {
- fprintf(stderr, "strftime returned 0");
- strncpy(time_buf, "Unknown Time", sizeof(time_buf));
- }
-
- // 打å°äº‹ä»¶ä¿¡æ¯
- if(env_data.std_output){
- printf("[%s] PID: %u | Comm: %s | Seq: %u | State: %s | Event Type: %llu | %s:%u -> %s:%u\n",
- time_buf,
- event->pid,
- event->comm,
- event->seq,
- tcp_state_to_string(event->state), // 输出状æ€çš„å—符形å¼
- event->type,
- saddr_str,
- lport,
- daddr_str,
- dport);
- }
-
- if(!env_data.visualize)
- return 0;
- // 写入到 CSV 文件
- if (net_csv_files[3]) { // 对应é‡ä¼ 事件的 CSV 文件
- int fd = fileno(net_csv_files[3]);
- if (fd == -1) {
- perror("fileno failed for net_csv_files[3]");
- return -1;
- }
-
- struct stat st;
- if (fstat(fd, &st) == -1) {
- perror("fstat failed for net_csv_files[3]");
- return -1;
- }
-
- // 如果文件为空,写入表头
- if (st.st_size == 0) {
- // fprintf(net_csv_files[3],
- // "Timestamp,PID,Comm,Seq,State,Event_Type,Source_IP,Source_Port,Destination_IP,Destination_Port\n");
- fprintf(net_csv_files[3],
- "Timestamp,PID,Comm,State,Event_Type,Source_IP,Source_Port,Destination_IP,Destination_Port\n");
- fflush(net_csv_files[3]);
- }
-
- fprintf(net_csv_files[3], "%s.%09ld,%u,%s,%s,%llu,%s,%u,%s,%u\n",
- time_buf,
- absolute_nsec,
- event->pid,
- event->comm,
- tcp_state_to_string(event->state),
- event->type,
- saddr_str,
- lport,
- daddr_str,
- dport);
- } else {
- fprintf(stderr, "net_csv_files[3] is NULL. Cannot write to CSV\n");
- }
-
- return 0;
-}
-
-
-static bool fentry_try_attach(int id) {
- int prog_fd, attach_fd;
- char error[4096] = {0};
- struct bpf_insn insns[] = {
- {.code = BPF_ALU64 | BPF_MOV | BPF_K, .dst_reg = BPF_REG_0, .imm = 0},
- {.code = BPF_JMP | BPF_EXIT},
- };
- LIBBPF_OPTS(bpf_prog_load_opts, opts,
- .expected_attach_type = BPF_TRACE_FENTRY, .attach_btf_id = id,
- .log_buf = error, .log_size = sizeof(error), );
-
- prog_fd = bpf_prog_load(BPF_PROG_TYPE_TRACING, "fentry_attach", "GPL", insns,
- sizeof(insns) / sizeof(struct bpf_insn), &opts);
- if (prog_fd < 0) {
- fprintf(stderr, "bpf_prog_load failed: %s\n", strerror(errno));
- return false;
- }
-
- attach_fd = bpf_raw_tracepoint_open(NULL, prog_fd);
- if (attach_fd < 0) {
- fprintf(stderr, "bpf_raw_tracepoint_open failed: %s\n", strerror(errno));
- close(prog_fd);
- return false;
- }
-
- close(attach_fd);
- close(prog_fd);
- return true;
-}
-
-static bool fentry_can_attach(const char* name, const char* mod) {
- struct btf *btf, *vmlinux_btf, *module_btf = NULL;
- int err, id;
-
- vmlinux_btf = btf__load_vmlinux_btf();
- err = libbpf_get_error(vmlinux_btf);
- if (err) {
- fprintf(stderr, "Failed to load vmlinux BTF\n");
- return false;
- }
-
- btf = vmlinux_btf;
-
- if (mod) {
- module_btf = btf__load_module_btf(mod, vmlinux_btf);
- err = libbpf_get_error(module_btf);
- if (!err)
- btf = module_btf;
- else
- fprintf(stderr, "Failed to load module BTF for module %s\n", mod);
- }
-
- id = btf__find_by_name_kind(btf, name, BTF_KIND_FUNC);
-
- btf__free(module_btf);
- btf__free(vmlinux_btf);
-
- if (id <= 0) {
- fprintf(stderr, "Function %s not found in BTF\n", name);
- return false;
- }
-
- return fentry_try_attach(id);
-}
-
-/*--------------------------io部分-----------------------------------*/
-static int io_create_csv(){
- int ret;
- int num_csv_names = sizeof(io_csv_names) / sizeof(io_csv_names[0]);
-
- for(int i=0;iinfo.pid);
- printf(" Command: %s\n", event->info.comm);
- printf(" read_count: %u\n", event->read_count);
- printf(" write_count: %u\n", event->write_count);
- }
-
- if(!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (io_csv_files[0] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for IO task stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(io_csv_files[0]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(io_csv_files[0], "PID,Command,Read Count,Write Count\n");
- fflush(io_csv_files[0]);
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(io_csv_files[0], "%u,%s,%u,%u\n",
- event->info.pid,
- event->info.comm,
- event->read_count,
- event->write_count);
-
-
- return 0;
-}
-
-static int handle_io_process_stats_event(void *ctx,void *data, size_t data_sz){
- struct io_process_stats *event = (struct io_process_stats *)data;
-
- if(env_data.std_output){
- printf(" tgid: %u\n", event->tgid);
- printf(" read_count: %u\n", event->read_count);
- printf(" write_count: %u\n", event->write_count);
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (io_csv_files[1] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for IO process stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(io_csv_files[1]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(io_csv_files[1], "TGID,Read Count,Write Count\n");
- fflush(io_csv_files[1]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(io_csv_files[1], "%u,%u,%u\n",
- event->tgid,
- event->read_count,
- event->write_count);
-
- return 0;
-}
-
-static int handle_iowait_perf_event(void *ctx,void *data, size_t data_sz){
- struct io_wait_perf_data *event = (struct io_wait_perf_data *)data;
-
- if(env_data.std_output){
- for(int i=0;i<8;i++){
- switch(i)
- {
- case 0:
- printf("wait less than 1us: %u\n",event->count_list[i]);
- continue;
- case 1:
- printf("wait less than 4us: %u\n",event->count_list[i]);
- continue;
- case 2:
- printf("wait less than 16us: %u\n",event->count_list[i]);
- continue;
- case 3:
- printf("wait less than 64us: %u\n",event->count_list[i]);
- continue;
- case 4:
- printf("wait less than 256us: %u\n",event->count_list[i]);
- continue;
- case 5:
- printf("wait less than 1ms: %u\n",event->count_list[i]);
- continue;
- case 6:
- printf("wait less than 4ms: %u\n",event->count_list[i]);
- continue;
- case 7:
- printf("wait large than 4ms: %u\n",event->count_list[i]);
- continue;
- default:
- continue;
- }
- }
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (io_csv_files[2] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for IO wait perf stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(io_csv_files[2]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(io_csv_files[2], "1us,4us,16us,64us,256us,1ms,4ms,4ms+\n");
- fflush(io_csv_files[2]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(io_csv_files[2], "%u,%u,%u,%u,%u,%u,%u,%u\n",
- event->count_list[0],
- event->count_list[1],
- event->count_list[2],
- event->count_list[3],
- event->count_list[4],
- event->count_list[5],
- event->count_list[6],
- event->count_list[7]);
-
-
- return 0;
-}
-
-unsigned int io_parse_arguments(int argc, char *argv[]) {
- unsigned int interval = 1; // 默认1秒
- if (argc == 2) {
- interval = atoi(argv[1]);
- if (interval == 0) {
- fprintf(stderr, "Invalid interval. Using default 1 second.\n");
- interval = 1;
- }
- }
- return interval;
-}
-
-int io_initialize_monitoring(unsigned int interval) {
- // åˆå§‹åŒ–上下文
- context = diskstats_init();
- if (!context) {
- fprintf(stderr, "Failed to initialize DiskStatsContext.\n");
- return -1;
- }
-
- // 读å–åˆå§‹ç»Ÿè®¡æ•°æ®
- int device_count_prev = diskstats_read(context, current, MAX_DEVICES);
- if (device_count_prev < 0) {
- fprintf(stderr, "Failed to read /proc/diskstats.\n");
- diskstats_cleanup(context);
- return -1;
- }
-
- context->device_count_prev = device_count_prev;
- return 0;
-}
-
-static void io_resource_clean(){
- if(rb_io_task_stats)
- ring_buffer__free(rb_io_task_stats);
- if(rb_io_process_stats)
- ring_buffer__free(rb_io_process_stats);
- if(rb_io_wait)
- ring_buffer__free(rb_io_wait);
-
- if(context){
- diskstats_cleanup(context);
- }
-
- for(int i=0;iprogs.handle_io_wait_event,500);
- if(!link_io_wait){
- return -1;
- }
- skel->links.handle_io_wait_event = link_io_wait;
-
- rb_io_task_stats = ring_buffer__new(bpf_map__fd(skel->maps.io_task_stats_buffer),handle_io_task_stats_event,NULL,NULL);
- rb_io_process_stats = ring_buffer__new(bpf_map__fd(skel->maps.io_process_stats_buffer),handle_io_process_stats_event,NULL,NULL);
- rb_io_wait = ring_buffer__new(bpf_map__fd(skel->maps.io_wait_buffer),handle_iowait_perf_event,NULL,NULL);
-
- int threhold_fd = bpf_map__fd(skel->maps.io_threhold_map);
- struct io_stats_threhold task = {
- .read_count = 50,
- .write_count = 50,
- .time_window = (1000 * MSEC)
- };
- struct io_stats_threhold process = {
- .read_count = 100,
- .write_count = 100,
- .time_window = (1000 * MSEC)
- };
-
- if(bpf_map_update_elem(threhold_fd,&zero,&task,BPF_ANY) != 0){
- printf("io_threhold map update error\n");
- return -1;
- }
-
- if(bpf_map_update_elem(threhold_fd,&one,&process,BPF_ANY) != 0){
- printf("io_threhold map update error\n");
- return -1;
- }
-
- return 0;
-}
-
-/*----------------------------mm部分--------------------------------------*/
-static int mm_create_csv(){
- int ret;
- int num_csv_names = sizeof(mm_csv_names) / sizeof(mm_csv_names[0]);
-
- for(int i=0;ikill_time / 1000000000;
- long kill_time_nsec = event->kill_time % 1000000000;
-
- struct tm *tm_info = localtime(&kill_time_sec);
- char time_buffer[64];
- strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%d %H:%M:%S", tm_info);
-
- if(env_data.std_output){
- printf("[%s.%09ld] OOM Event:\n", time_buffer, kill_time_nsec);
- printf(" Trigger PID: %u\n", event->trigger_id);
- printf(" Killed PID: %u\n", event->killed_id);
- printf(" Command: %s\n", event->comm);
- printf(" Kill Time: %llu ns\n\n", event->kill_time);
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (mm_csv_files[0] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for OOM events\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(mm_csv_files[0]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(mm_csv_files[0], "Timestamp,Trigger PID,Killed PID,Command,Kill Time (ns)\n");
- fflush(mm_csv_files[0]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(mm_csv_files[0], "%s.%09ld,%u,%u,%s,%llu\n",
- time_buffer,
- kill_time_nsec,
- event->trigger_id,
- event->killed_id,
- event->comm,
- event->kill_time);
-
- return 0;
-}
-
-static int handle_task_mm_stats_event(void *ctx,void *data, size_t data_sz){
- struct task_mm_stats *event = (struct task_mm_stats *)data;
-
- if(env_data.std_output){
- printf(" PID: %u\n", event->info.pid);
- printf(" Command: %s\n", event->info.comm);
- printf(" kmem_count: %u\n", event->kmem_count);
- printf(" vmem_count: %u\n", event->vmem_count);
- printf(" slab_count: %u\n\n", event->slab_count);
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (mm_csv_files[1] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for task MM stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(mm_csv_files[1]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(mm_csv_files[1], "PID,Command,Kmem Count,Vmem Count,Slab Count\n");
- fflush(mm_csv_files[1]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(mm_csv_files[1], "%u,%s,%u,%u,%u\n",
- event->info.pid,
- event->info.comm,
- event->kmem_count,
- event->vmem_count,
- event->slab_count);
-
-
- return 0;
-}
-
-static int handle_process_mm_stats_event(void *ctx,void *data, size_t data_sz){
- struct process_mm_stats *event = (struct process_mm_stats *)data;
-
- if(env_data.std_output){
- printf(" process tgid: %u\n", event->tgid);
- printf(" kmem_count: %u\n", event->kmem_count);
- printf(" vmem_count: %u\n", event->vmem_count);
- printf(" slab_count: %u\n\n", event->slab_count);
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (mm_csv_files[2] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for process MM stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(mm_csv_files[2]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(mm_csv_files[2], "TGID,Kmem Count,Vmem Count,Slab Count\n");
- fflush(mm_csv_files[2]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(mm_csv_files[2], "%u,%u,%u,%u\n",
- event->tgid,
- event->kmem_count,
- event->vmem_count,
- event->slab_count);
-
- return 0;
-}
-
-static int attach_leak_skel(struct mm_leak_bpf *skel){
- int ret;
-
- allocs = calloc(ALLOCS_MAX_ENTRIES, sizeof(*allocs));
- if (!allocs) {
- fprintf(stderr, "failed to allocate array\n");
- ret = -ENOMEM;
-
- return ret;
- }
-
- stack = calloc(PERF_MAX_STACK_DEPTH, sizeof(*stack));
- if (!stack) {
- fprintf(stderr, "failed to allocate stack array\n");
- ret = -ENOMEM;
-
- return ret;
- }
-
- ret = mm_leak_bpf__load(skel);
- if(ret){
- fprintf(stderr, "failed to load mm_leak skel\n");
-
- return -1;
- }
-
- leak_allocs_fd = bpf_map__fd(skel->maps.allocs);
- leak_stack_traces_fd = bpf_map__fd(skel->maps.stack_traces);
-
- ret = mm_leak_bpf__attach(skel);
- if (ret) {
- fprintf(stderr, "failed to attach bpf program(s)\n");
-
- return -1;
- }
-
- mm_symbolizer = blaze_symbolizer_new();
- if(!mm_symbolizer){
- printf("Failed to initialize symbolizer\n");
- ret = -1;
-
- return ret;
- }
-
- return 0;
-}
-
-static int attach_mm_stats_skel(struct mm_stats_bpf *skel){
- int ret,map_fd;
-
- ret = mm_stats_bpf__load(skel);
- if(ret){
- fprintf(stderr, "failed to load mm_leak skel\n");
- return -1;
- }
-
- ret = mm_stats_bpf__attach(skel);
- if (ret) {
- fprintf(stderr, "failed to attach mm_stats bpf program(s)\n");
-
- return -1;
- }
-
- rb_oom = ring_buffer__new(bpf_map__fd(skel->maps.oom_event_buffer),handle_oom_event,NULL,NULL);
- if(!rb_oom){
- fprintf(stderr, "Failed to create oom ring buffer\n");
- return -1;
- }
-
- rb_task_mm = ring_buffer__new(bpf_map__fd(skel->maps.task_mm_stats_buffer),handle_task_mm_stats_event,NULL,NULL);
- if(!rb_task_mm){
- fprintf(stderr, "Failed to create task mm stats ring buffer\n");
- return -1;
- }
-
- rb_process_mm = ring_buffer__new(bpf_map__fd(skel->maps.process_mm_stats_buffer),handle_process_mm_stats_event,NULL,NULL);
- if(!rb_process_mm){
- fprintf(stderr, "Failed to create task mm stats ring buffer\n");
- return -1;
- }
-
- struct mm_threhold threhold_task = {
- .kmem_threhold = 500,
- .slab_threhold = 500,
- .vmem_threhold = 500,
- .time_window = MSEC * 1000 // 1ç§’
- };
-
- struct mm_threhold threhold_process = {
- .kmem_threhold = 1000,
- .slab_threhold = 1000,
- .vmem_threhold = 1000,
- .time_window = MSEC * 1000 // 1ç§’
- };
-
- map_fd = bpf_map__fd(skel->maps.threhold_map);
- if(bpf_map_update_elem(map_fd,&zero,&threhold_task,BPF_ANY) != 0){
- perror("Failed to update mm_threhold map\n");
- return -1;
- }
-
- if(bpf_map_update_elem(map_fd,&one,&threhold_process,BPF_ANY) != 0){
- perror("Failed to update mm_threhold map\n");
- return -1;
- }
-
- return 0;
-}
-
-static void mm_resource_clean(){
- if(rb_oom)
- ring_buffer__free(rb_oom);
- if(rb_task_mm)
- ring_buffer__free(rb_task_mm);
- if(rb_process_mm)
- ring_buffer__free(rb_process_mm);
-
- if(mm_symbolizer)
- blaze_symbolizer_free(mm_symbolizer);
-
- mm_leak_bpf__destroy(leak_skel);
- mm_stats_bpf__destroy(mm_skel);
-
- for(int i=0;isize > y->size)
- return -1;
-
- if (x->size < y->size)
- return 1;
-
- return 0;
-}
-
-static int print_outstanding_allocs(int allocs_fd, int stack_traces_fd){
- //const u64 allocs_key_size = bpf_map__key_size(skel->maps.allocs);
-
- u64 t = time(NULL);
- struct tm *tm = localtime(&t);// 获å–当剿—¶é—´ï¼Œç”¨äºŽè¾“出时的时间戳
- u64 nr_allocs = 0;// 计数器用æ¥è®°å½•找到的分é…ä¿¡æ¯çš„æ•°é‡
-
- //é历 allocs map,prev_key å’Œ curr_key 用æ¥åœ¨ BPF map ä¸è¿ä»£æŸ¥æ‰¾å…ƒç´
- for (u64 prev_key = 0, curr_key = 0;; prev_key = curr_key)
- {
- struct alloc_info alloc_info = {};
- memset(&alloc_info, 0, sizeof(alloc_info));
- // 获å–下一个 allocs map ä¸çš„键,直到é历完所有键,如果返回 ENOENT 错误,表示没有更多的键,å¯ä»¥é€€å‡ºå¾ªçޝ
- if (bpf_map_get_next_key(allocs_fd,&prev_key,&curr_key))
- {
- if (errno == ENOENT)
- {
- break; // no more keys, done
- }
-
- perror("map get next key error");
-
- return -errno;
- }
-
- // 使用 bpf_map__lookup_elem() 查找当å‰é”®å¯¹åº”的值,如果å‘生 ENOENT 错误,表示当å‰é”®æ²¡æœ‰å¯¹åº”值,跳过该键
- if (bpf_map_lookup_elem(allocs_fd,&curr_key,&alloc_info))
- {
- if (errno == ENOENT)
- continue;
-
- perror("map lookup error");
-
- return -errno;
- }
-
- // è¿‡æ»¤æŽ‰æ— æ•ˆçš„æ ˆ
- if (alloc_info.stack_id < 0)
- {
- continue;
- }
-
- bool stack_exists = false;
-
- // é历已å˜å‚¨çš„ allocs 数组(内å˜åˆ†é…ä¿¡æ¯çš„集åˆï¼‰å¹¶æŸ¥æ‰¾ç›¸åŒçš„ stack_id
- // 如果找到了相åŒçš„å †æ ˆ ID(æ„味ç€åŒä¸€ä¸ªå †æ ˆè¿›è¡Œäº†å¤šæ¬¡åˆ†é…),就将 alloc_info.size ç´¯åŠ åˆ°å·²å˜åœ¨çš„分é…ä¸ï¼Œä¸”å°† count å¢žåŠ 1
-
- for (u64 i = 0; !stack_exists && i < nr_allocs; ++i)
- {
- struct allocation *alloc = &allocs[i];
-
- if (alloc->stack_id == alloc_info.stack_id)
- {
- alloc->size += alloc_info.size;
- alloc->count++;
-
- stack_exists = true;
- break;
- }
- }
-
-
- if (stack_exists)
- continue;
-
- // 如果没有找到相åŒçš„å †æ ˆ IDï¼Œè¯´æ˜Žè¿™æ˜¯ä¸€ä¸ªæ–°çš„å †æ ˆåˆ†é…,创建一个新的 allocation ç»“æž„ä½“ï¼Œå¹¶å°†å…¶æ·»åŠ åˆ° allocs 数组ä¸
- struct allocation alloc = {
- .stack_id = alloc_info.stack_id ,
- .size = alloc_info.size,
- .count = 1,
- };
-
- // 将新创建的 allocation 结构体å¤åˆ¶åˆ° allocs 数组ä¸ï¼Œå¹¶å¢žåŠ nr_allocs
- memcpy(&allocs[nr_allocs], &alloc, sizeof(alloc));
- nr_allocs++;
- }
-
- // 使用 qsort() 函数按内å˜å¤§å°é™åºæŽ’列 allocs 数组
- //qsort(allocs, nr_allocs, sizeof(allocs[0]), alloc_size_compare);
- if (nr_allocs > 0) {
- qsort(allocs, nr_allocs, sizeof(allocs[0]), alloc_size_compare);
- }
-
- printf("[%d:%d:%d] Top %zu stacks with outstanding allocations:\n",
- tm->tm_hour, tm->tm_min, tm->tm_sec, nr_allocs);
-
- for (size_t i = 0; i < nr_allocs; i++)
- {
- if (bpf_map_lookup_elem(stack_traces_fd,&allocs[i].stack_id,stack))
- {
- perror("failed to lookup stack traces!");
- return -errno;
- }
- }
-
- print_stack_frames(allocs, nr_allocs, stack_traces_fd);
- for (size_t i = 0; i < nr_allocs; i++) {
- allocs[i].stack_id = 0;
- }
-
- return 0;
-}
-
-void print_stack_frames_by_blazesym(u64 *stack, int stack_sz)
-{
- struct blaze_syms *result;
- struct blaze_sym *sym;
-
- if(trace_pid == 0){
- struct blaze_symbolize_src_kernel src = {
- .type_size = sizeof(src)
- };
- result = blaze_symbolize_kernel_abs_addrs(mm_symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- }
- else{
- struct blaze_symbolize_src_process src = {
- .type_size = sizeof(src),
- .pid = trace_pid,
- };
- result = blaze_symbolize_process_abs_addrs(mm_symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- }
-
- // 获å–符å·ä¿¡æ¯
- //printf("Stack depth: %d\n", stack_sz);
-
- if (!result) {
- perror("Failed to symbolize stack addresses");
- return;
- }
-
- // æ‰“å°æ ˆå›žæº¯ä¿¡æ¯
- for (size_t j = 0; j < result->cnt; ++j) {
- //printf("inlined count: %d\n", result->syms[j].inlined_cnt);
-
- const uint64_t addr = stack[j];
-
- if (addr == 0)
- break;
-
- sym = &result->syms[j];
-
- if (sym->name == NULL) {
- printf("No symbol found for address <0x%lx>\n", addr);
- if (mm_alloc_stack) {
- fprintf(mm_alloc_stack, "No symbol found for address <0x%lx>\n", addr);
- }
- continue;
- }
-
- // æ‰“å°æ¯ä¸ªæ ˆå¸§çš„函数å和地å€
- printf("\t%zu [<%016lx>] %s + 0x%lx\n", j, addr, sym->name, sym->offset);
- if (mm_alloc_stack) {
- fprintf(mm_alloc_stack, "\t%zu [<%016lx>] %s + 0x%lx\n", j, addr, sym->name, sym->offset);
- }
-
- // æ‰“å°æºä»£ç ä½ç½®ï¼ˆæ–‡ä»¶ã€è¡Œå·ç‰ï¼‰
- if (sym->code_info.file != NULL) {
- printf("\t\tSource: %s:%d:%d\n", sym->code_info.file, sym->code_info.line, sym->code_info.column);
- if (mm_alloc_stack) {
- fprintf(mm_alloc_stack, "\t\tSource: %s:%d:%d\n", sym->code_info.file, sym->code_info.line, sym->code_info.column);
- }
- }
-
- // 如果å˜åœ¨å†…è”函数,打å°å†…è”函数信æ¯
- if (sym->inlined_cnt > 0) {
- for (size_t k = 0; k < sym->inlined_cnt; ++k) {
- const struct blaze_symbolize_inlined_fn *inlined = &sym->inlined[k];
- printf("\t\tInlined function: %s\n", inlined->name);
- if (mm_alloc_stack) {
- fprintf(mm_alloc_stack, "\t\tInlined function: %s\n", inlined->name);
- }
- if (inlined->code_info.file != NULL) {
- printf("\t\t\tSource: %s:%d:%d\n", inlined->code_info.file, inlined->code_info.line, inlined->code_info.column);
- if (mm_alloc_stack) {
- fprintf(mm_alloc_stack, "\t\t\tSource: %s:%d:%d\n", inlined->code_info.file, inlined->code_info.line, inlined->code_info.column);
- }
- }
- }
- }
- }
-
- blaze_syms_free(result);
-}
-
-int print_stack_frames(struct allocation *allocs, u64 nr_allocs, int stack_traces_fd)
-{
- for (u64 i = 0; i < nr_allocs; ++i){
- const struct allocation *alloc = &allocs[i];
- printf("%zu bytes in %zu allocations from stack\n", alloc->size, alloc->count);
-
- if (bpf_map_lookup_elem(stack_traces_fd, &alloc->stack_id, stack)) {
- if (errno == ENOENT)
- continue;
-
- perror("failed to lookup stack trace");
-
- return -errno;
- }
-
- print_stack_frames_by_blazesym(stack,nr_allocs);
- }
-}
-
-
-static void print_frame(const char *name, u64 input_addr, u64 addr, u64 offset, const blaze_symbolize_code_info *code_info)
-{
- // If we have an input address we have a new symbol.
- if (input_addr != 0)
- {
- printf("%016lx: %s @ 0x%lx+0x%lx", input_addr, name, addr, offset);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "%016lx: %s @ 0x%lx+0x%lx", input_addr, name, addr, offset);
- }
-
- if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL)
- {
- printf(" %s/%s:%u\n", code_info->dir, code_info->file, code_info->line);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, " %s/%s:%u\n", code_info->dir, code_info->file, code_info->line);
- }
- }
- else if (code_info != NULL && code_info->file != NULL)
- {
- printf(" %s:%u\n", code_info->file, code_info->line);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, " %s:%u\n", code_info->file, code_info->line);
- }
- }
- else
- {
- printf("\n");
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "\n");
- }
- }
- }
- else
- {
- printf("%16s %s", "", name);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "%16s %s", "", name);
- }
-
- if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL)
- {
- printf("@ %s/%s:%u [inlined]\n", code_info->dir, code_info->file, code_info->line);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "@ %s/%s:%u [inlined]\n", code_info->dir, code_info->file, code_info->line);
- }
- }
- else if (code_info != NULL && code_info->file != NULL)
- {
- printf("@ %s:%u [inlined]\n", code_info->file, code_info->line);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "@ %s:%u [inlined]\n", code_info->file, code_info->line);
- }
- }
- else
- {
- printf("[inlined]\n");
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "[inlined]\n");
- }
- }
- }
-}
-
-/*---------------------------cpu部分---------------------------------------*/
-static int cpu_create_csv(){
- int ret;
- int num_csv_names = sizeof(cpu_csv_names) / sizeof(cpu_csv_names[0]);
-
- for(int i=0;idir != NULL && code_info->file != NULL) {
- printf(" %s/%s:%u\n", code_info->dir, code_info->file, code_info->line);
- } else if (code_info != NULL && code_info->file != NULL) {
- printf(" %s:%u\n", code_info->file, code_info->line);
- } else {
- printf("\n");
- }
- } else {
- printf("%16s %s", "", name);
- if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL) {
- printf("@ %s/%s:%u [inlined]\n", code_info->dir, code_info->file, code_info->line);
- } else if (code_info != NULL && code_info->file != NULL) {
- printf("@ %s:%u [inlined]\n", code_info->file, code_info->line);
- } else {
- printf("[inlined]\n");
- }
- }
-}
-
-// æ‰“å°æ ˆå›žæº¯
-static void cpu_show_stack_trace(uint64_t *stack, int stack_sz, pid_t pid) {
- const struct blaze_syms *syms;
- const struct blaze_sym *sym;
- const struct blaze_symbolize_inlined_fn *inlined;
- int i, j;
-
- assert(sizeof(uintptr_t) == sizeof(uint64_t));
-
- if (pid) {
- // ç”¨æˆ·ç©ºé—´æ ˆå›žæº¯çš„ç¬¦å·è§£æž
- struct blaze_symbolize_src_process src = {
- .type_size = sizeof(src),
- .pid = pid,
- };
- syms = blaze_symbolize_process_abs_addrs(cpu_symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- } else {
- // å†…æ ¸ç©ºé—´æ ˆå›žæº¯çš„ç¬¦å·è§£æž
- struct blaze_symbolize_src_kernel src = {
- .type_size = sizeof(src),
- };
- syms = blaze_symbolize_kernel_abs_addrs(cpu_symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- }
-
- if (syms == NULL) {
- printf(" failed to symbolize addresses: %s\n", blaze_err_str(blaze_err_last()));
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, " failed to symbolize addresses: %s\n", blaze_err_str(blaze_err_last()));
- }
- return;
- }
-
- for (i = 0; i < stack_sz; i++) {
- // æ£€æŸ¥æ ˆåœ°å€æ˜¯å¦ä¸ºæœ‰æ•ˆçš„地å€
- if (stack[i] == 0 || stack[i] == (uintptr_t)-1) {
- continue; // è·³è¿‡æ— æ•ˆçš„æ ˆåœ°å€
- }
-
- if (!syms || syms->cnt <= i || syms->syms[i].name == NULL) {
- printf("%016llx: \n", stack[i]);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "%016llx: \n", stack[i]);
- }
- continue;
- }
-
- sym = &syms->syms[i];
- print_frame(sym->name, stack[i], sym->addr, sym->offset, &sym->code_info);
-
- // 如果有内è”函数,打å°å†…è”符å·ä¿¡æ¯
- for (j = 0; j < sym->inlined_cnt; j++) {
- inlined = &sym->inlined[j];
- print_frame(sym->name, 0, 0, 0, &inlined->code_info);
- }
- }
-
- blaze_syms_free(syms);
-}
-
-static int handle_usr_task_cpu_backtrace_event(void *ctx,void *data, size_t data_sz){
- struct task_trace_event *event = data;
-
- if (event->kstack_sz <= 0 && event->ustack_sz <= 0)
- {
- printf("The stack size is invalid\n");
- return 1;
- }
-
- printf("COMM: %s (pid=%d)\n", event->comm, event->pid);
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "The stack size is invalid\n");
- }
-
- if (event->kstack_sz > 0) {
- printf("Kernel:\n");
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "Kernel:\n");
- }
- cpu_show_stack_trace(event->k_stack, event->kstack_sz / sizeof(uint64_t), 0);
- } else {
- printf("No Kernel Stack\n");
- }
-
- if (event->ustack_sz > 0) {
- printf("Userspace:\n");
- if (cpu_task_stack) {
- fprintf(cpu_task_stack, "Userspace:\n");
- }
- cpu_show_stack_trace(event->u_stack, event->ustack_sz / sizeof(uint64_t), event->pid);
- } else {
- printf("No Userspace Stack\n");
- }
-
- printf("\n");
- return 0;
-}
-
-static int handle_cpu_usage_event(void *ctx,void *data, size_t data_sz){
- struct cpu_usage_stats *stats = data;
- float usr = stats->user_percent/100.0f;
- float kernel = stats->kernel_percent/100.0f;
- float idle = stats->idle_percent/100.0f;
- float softirq = stats->irq_percent/100.0f;
- float irq = stats->irq_percent / 100.0f;
-
- if(env_data.std_output){
- printf("CPU ID: %u\n", stats->cpu_id);
- printf("User Time: %f\n", usr);
- printf("Kernel Time: %f\n", kernel);
- printf("Idle Time: %f\n", idle);
- printf("Irq Time: %f\n",irq);
- printf("Softirq Time: %f\n",softirq);
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (cpu_csv_files[0] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for CPU usage stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(cpu_csv_files[0]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(cpu_csv_files[0], "CPU ID,User Time,Kernel Time,Idle Time,IRQ Time,SoftIRQ Time\n");
- fflush(cpu_csv_files[0]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(cpu_csv_files[0], "%u,%f,%f,%f,%f,%f\n",
- stats->cpu_id,
- usr,
- kernel,
- idle,
- irq,
- softirq);
-
- return 0;
-}
-
-static int handle_usr_task_usage_event(void *ctx,void *data, size_t data_sz){
- struct task_cpu_usage *task = data;
- u32 pid = task->task_info.pid;
- float total_percent = task->total_percent/1.0f;
- float usr_percent = task->user_percent/1.0f;
- float kernel_percent = task->kernel_percent/1.0f;
-
- char comm[TASK_COMM_LEN + 1];
- strncpy(comm,task->task_info.comm,TASK_COMM_LEN);
- comm[TASK_COMM_LEN] = '\0';
-
- if(env_data.std_output){
- printf("pid: %u\n",pid);
- printf("name: %s\n",comm);
- printf("total percent: %f",total_percent);
- printf("kernel percent: %f",kernel_percent);
- printf("usr_percent: %f\n",usr_percent);
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (cpu_csv_files[1] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for user task usage\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(cpu_csv_files[1]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(cpu_csv_files[1], "PID,Name,Total Percent,Kernel Percent,User Percent\n");
- fflush(cpu_csv_files[1]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(cpu_csv_files[1], "%u,%s,%f,%f,%f\n",
- pid,
- comm,
- total_percent,
- kernel_percent,
- usr_percent);
-
- return 0;
-}
-
-static int handle_use_process_stat_event(void *ctx,void *data, size_t data_sz){
- struct process_struct *ps = data;
- u32 tgid = ps->tgid;
- u32 kids_length = ps->kids_length;
- float total_percent = ps->total_use_percent/1.0f;
-
- if(env_data.std_output){
- printf("tgid: %u\n",tgid);
- printf("kids_length: %u\n",kids_length);
- printf("total percent: %f\n",total_percent);
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (cpu_csv_files[2] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for process usage stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(cpu_csv_files[2]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(cpu_csv_files[2], "TGID,Kids Length,Total Percent\n");
- fflush(cpu_csv_files[2]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(cpu_csv_files[2], "%u,%u,%f\n",
- tgid,
- kids_length,
- total_percent);
-
- return 0;
-}
-
-static int handle_usr_runqlat_event(void *ctx,void *data, size_t data_sz){
- struct runqlat_perf_data *late = data;
- for(int i=0;idata[i]);
- break;
- case 1:
- printf("wait less than 4us: %u\n",late->data[i]);
- break;
- case 2:
- printf("wait less than 16us: %u\n",late->data[i]);
- break;
- case 3:
- printf("wait less than 64us: %u\n",late->data[i]);
- break;
- case 4:
- printf("wait less than 256us: %u\n",late->data[i]);
- break;
- case 5:
- printf("wait less than 1ms: %u\n",late->data[i]);
- break;
- case 6:
- printf("wait less than 4ms: %u\n",late->data[i]);
- break;
- case 7:
- printf("wait large than 4ms: %u\n",late->data[i]);
- break;
- default:
- break;
- }
- }
-
- // 如果ä¸éœ€è¦å¯è§†åŒ–,直接返回
- if (!env_data.visualize)
- return 0;
-
- // 检查 CSV 文件是å¦åˆå§‹åŒ–
- if (cpu_csv_files[3] == NULL) {
- fprintf(stderr, "Error: CSV file not initialized for IO wait perf stats\n");
- return -1;
- }
-
- // 检查文件是å¦ä¸ºç©º
- struct stat st;
- if (fstat(fileno(cpu_csv_files[3]), &st) == -1) {
- perror("Error checking file size");
- return -1;
- }
-
- if (st.st_size == 0) {
- // 文件为空,写入列å
- fprintf(cpu_csv_files[3], "1us,4us,16us,64us,256us,1ms,4ms,4ms+\n");
- fflush(cpu_csv_files[3]); // ç¡®ä¿æ•°æ®ç«‹å³å†™å…¥æ–‡ä»¶
- }
-
- // 写入数æ®åˆ° CSV 文件
- fprintf(cpu_csv_files[3], "%u,%u,%u,%u,%u,%u,%u,%u\n",
- late->data[0],
- late->data[1],
- late->data[2],
- late->data[3],
- late->data[4],
- late->data[5],
- late->data[6],
- late->data[7]);
-
-
- return 0;
-}
-
-static int attach_cpu_skel(struct cpu_stats_bpf *skel){
- int err;
-
- if(init_cpu_symbolizer()!=0)
- return -1;
-
- skel = cpu_stats_bpf__open_and_load();
- if (!skel) {
- fprintf(stderr, "Failed to open and load BPF program\n");
- return 1;
- }
-
- int nr_cpu = libbpf_num_possible_cpus();
- if(nr_cpu < 0)
- {
- fprintf(stderr,"libbpf: get cpu nums failed \n");
- }
-
- int map_fd = bpf_map__fd(skel->maps.cpu_usr_map);
- if(bpf_map_update_elem(map_fd,&zero,&nr_cpu,BPF_ANY) != 0){
- perror("Failed to update nr_cpu_map");
- cpu_stats_bpf__destroy(skel);
- return 1;
- }
-
- // struct data_list list = {};
- // map_fd = bpf_map__fd(skel->maps.occupied_list);
- // if(bpf_map_update_elem(map_fd,&zero,&list,BPF_ANY)!=0 || bpf_map_update_elem(map_fd,&one,&list,BPF_ANY)!=0){
- // perror("Failed to init occupied_liss");
- // cpu_stats_bpf__destroy(skel);
- // return 1;
- // }
-
- // struct hash_table table;
- // hash_table_init(&table);
- // map_fd = bpf_map__fd(skel->maps.hash_table_model_map);
- // if(bpf_map_update_elem(map_fd,&zero,&table,BPF_ANY) != 0){
- // perror("Failed to update hash_table_model_map");
- // cpu_stats_bpf__destroy(skel);
- // return 1;
- // }
-
- err = cpu_stats_bpf__attach(skel);
- if (err) {
- fprintf(stderr, "Failed to attach BPF program: %d\n", err);
- return err;
- }
-
- struct bpf_link *link_cpu = attach_perf_event_to_program(skel->progs.handle_cpu_event, 500); // 500 毫秒
- if (!link_cpu) {
- return err;
- }
- skel->links.handle_cpu_event = link_cpu;
-
- // struct bpf_link *link_task = attach_perf_event_to_program(skel->progs.handle_task_usage_event, 500); // 500 毫秒
- // if (!link_task) {
- // return err;
- // }
- // skel->links.handle_task_usage_event = link_task;
-
- // struct bpf_link *link_process = attach_perf_event_to_program(skel->progs.handle_process_stat_event,500);
- // if(!link_process){
- // return err;
- // }
- // skel->links.handle_process_stat_event = link_process;
-
- struct bpf_link *link_runqlat = attach_perf_event_to_program(skel->progs.handle_sys_latency_event,500);
- if(!link_runqlat){
- return err;
- }
- skel->links.handle_sys_latency_event = link_runqlat;
-
- // struct bpf_link *link_backtrace = attach_perf_event_to_program(skel->progs.handle_task_backtrace_event,500);
- // if(!link_backtrace){
- // return err;
- // }
-
- rb_cpu = ring_buffer__new(bpf_map__fd(skel->maps.cpu_usage_buffer), handle_cpu_usage_event, NULL, NULL);
- if (!rb_cpu) {
- fprintf(stderr, "Failed to create ring buffer\n");
- return err;
- }
-
- rb_task = ring_buffer__new(bpf_map__fd(skel->maps.task_occupied_buffer), handle_usr_task_usage_event, NULL, NULL);
- if (!rb_task) {
- fprintf(stderr, "Failed to create ring buffer for task usage\n");
- return err;
- }
-
- rb_process = ring_buffer__new(bpf_map__fd(skel->maps.process_occupied_buffer), handle_use_process_stat_event, NULL, NULL);
- if(!rb_process){
- fprintf(stderr, "Failed to create ring buffer for process stat\n");
- return err;
- }
-
- rb_runqlat = ring_buffer__new(bpf_map__fd(skel->maps.runqlat_buffer), handle_usr_runqlat_event, NULL, NULL);
- if(!rb_runqlat){
- fprintf(stderr, "Failed to create ring buffer for runqlat\n");
- return err;
- }
-
- rb_backtrace = ring_buffer__new(bpf_map__fd(skel->maps.task_backtrace_buffer), handle_usr_task_cpu_backtrace_event, NULL, NULL);
- if(!rb_backtrace){
- fprintf(stderr, "Failed to create ring buffer for cpu task backtrace\n");
- return err;
- }
-
- return 0;
-}
-
-static int cpu_ring_buffer_poll(){
- int err;
- err = ring_buffer__poll(rb_cpu, 600 /* ms */);
- if (err == -EINTR) {
- return err; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- } else if (err < 0) {
- fprintf(stderr, "Error polling CPU usage ring buffer: %d\n", err);
- return err;
- }
-
- err = ring_buffer__poll(rb_task, 600 /* ms */);
- if (err == -EINTR) {
- return err; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- } else if (err < 0) {
- fprintf(stderr, "Error polling task usage ring buffer: %d\n", err);
- return err;
- }
-
- err = ring_buffer__poll(rb_process, 600 /* ms */);
- if (err == -EINTR) {
- return err; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- } else if (err < 0) {
- fprintf(stderr, "Error polling process stat ring buffer: %d\n", err);
- return err;
- }
- err = ring_buffer__poll(rb_runqlat, 600 /* ms */);
- if (err == -EINTR) {
- return err; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- } else if (err < 0) {
- fprintf(stderr, "Error polling process stat ring buffer: %d\n", err);
- return err;
- }
-
- err = ring_buffer__poll(rb_backtrace,600);
- if (err == -EINTR) {
- return err; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- } else if (err < 0) {
- fprintf(stderr, "Error polling process stat ring buffer: %d\n", err);
- return err;
- }
-
- return 0;
-}
-
-
-static void cpu_resource_clean(){
- if (rb_cpu)
- ring_buffer__free(rb_cpu);
- if (rb_task)
- ring_buffer__free(rb_task);
- if (rb_process)
- ring_buffer__free(rb_process);
- if (rb_runqlat)
- ring_buffer__free(rb_runqlat);
-
- for(int i=0;i
+ * Copyright (c) 2023 Tejun Heo
+ */
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "scx_nest.skel.h"
+#include "scx_nest.h"
+#include "env.h"
+
+#define SAMPLING_CADENCE_S 2
+
+static struct scx_env env = {
+ .p_remove_ns = 2000 * 1000, // 默认 2000us 转æ¢ä¸ºçº³ç§’
+ .r_max = 5, // é»˜è®¤æœ€å¤§å¤‡ç”¨æ ¸å¿ƒæ•°
+ .r_impatient = 2, // 默认失败次数
+ .slice_ns = 20000 * 1000, // 默认时间片 20000us 转æ¢ä¸ºçº³ç§’
+ .find_fully_idle = false, // é»˜è®¤ä¸æŸ¥æ‰¾å®Œå…¨ç©ºé—²æ ¸å¿ƒ
+ .verbose = false, // 默认关é—调试信æ¯
+};
+
+static void scx_parse_args(int argc, char **argv) {
+ int opt;
+
+ while ((opt = getopt(argc, argv, "d:m:i:s:Ivh")) != -1) {
+ switch (opt) {
+ case 'd':
+ env.p_remove_ns = strtoull(optarg, NULL, 0) * 1000;
+ break;
+ case 'm':
+ env.r_max = strtoull(optarg, NULL, 0);
+ break;
+ case 'i':
+ env.r_impatient = strtoull(optarg, NULL, 0);
+ break;
+ case 's':
+ env.slice_ns = strtoull(optarg, NULL, 0) * 1000;
+ break;
+ case 'I':
+ env.find_fully_idle = true;
+ break;
+ case 'v':
+ env.verbose = true;
+ break;
+ default:
+ fprintf(stderr, help_fmt, basename(argv[0]));
+ exit(opt != 'h');
+ }
+ }
+}
+
+
+static bool verbose;
+static volatile int exit_req;
+
+static int scx_libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args)
+{
+ if (level == LIBBPF_DEBUG && !verbose)
+ return 0;
+ return vfprintf(stderr, format, args);
+}
+
+static void sigint_handler(int nest)
+{
+ exit_req = 1;
+}
+
+struct nest_stat {
+ const char *label;
+ enum nest_stat_group group;
+ enum nest_stat_idx idx;
+};
+
+#define NEST_ST(__stat, __grp, __desc) { \
+ .label = #__stat, \
+ .group = __grp, \
+ .idx = NEST_STAT(__stat) \
+},
+static struct nest_stat nest_stats[NEST_STAT(NR)] = {
+#include "scx_nest_stats_table.h"
+};
+#undef NEST_ST
+
+static void scx_read_stats(struct scx_nest_bpf *skel, u64 *stats)
+{
+ int nr_cpus = libbpf_num_possible_cpus();
+ u64 cnts[NEST_STAT(NR)][nr_cpus];
+ u32 idx;
+
+ memset(stats, 0, sizeof(stats[0]) * NEST_STAT(NR));
+
+ for (idx = 0; idx < NEST_STAT(NR); idx++) {
+ int ret, cpu;
+
+ ret = bpf_map_lookup_elem(bpf_map__fd(skel->maps.stats),
+ &idx, cnts[idx]);
+ if (ret < 0)
+ continue;
+ for (cpu = 0; cpu < nr_cpus; cpu++)
+ stats[idx] += cnts[idx][cpu];
+ }
+}
+
+static void print_underline(const char *str)
+{
+ char buf[64];
+ size_t len;
+
+ len = strlen(str);
+ memset(buf, '-', len);
+ buf[len] = '\0';
+ printf("\n\n%s\n%s\n", str, buf);
+}
+
+static void scx_print_stat_grp(enum nest_stat_group grp)
+{
+ const char *group;
+
+ switch (grp) {
+ case STAT_GRP_WAKEUP:
+ group = "Wakeup stats";
+ break;
+ case STAT_GRP_NEST:
+ group = "Nest stats";
+ break;
+ case STAT_GRP_CONSUME:
+ group = "Consume stats";
+ break;
+ default:
+ group = "Unknown stats";
+ break;
+ }
+
+ print_underline(group);
+}
+
+static void print_active_nests(const struct scx_nest_bpf *skel)
+{
+ u64 primary = skel->bss->stats_primary_mask;
+ u64 reserved = skel->bss->stats_reserved_mask;
+ u64 other = skel->bss->stats_other_mask;
+ u64 idle = skel->bss->stats_idle_mask;
+ u32 nr_cpus = skel->rodata->nr_cpus, cpu;
+ int idx;
+ char cpus[nr_cpus + 1];
+
+ memset(cpus, 0, nr_cpus + 1);
+ print_underline("Masks");
+ for (idx = 0; idx < 4; idx++) {
+ const char *mask_str;
+ u64 mask, total = 0;
+
+ memset(cpus, '-', nr_cpus);
+ if (idx == 0) {
+ mask_str = "PRIMARY";
+ mask = primary;
+ } else if (idx == 1) {
+ mask_str = "RESERVED";
+ mask = reserved;
+ } else if (idx == 2) {
+ mask_str = "OTHER";
+ mask = other;
+ } else {
+ mask_str = "IDLE";
+ mask = idle;
+ }
+ for (cpu = 0; cpu < nr_cpus; cpu++) {
+ if (mask & (1ULL << cpu)) {
+ cpus[cpu] = '*';
+ total++;
+ }
+ }
+ printf("%-9s(%2" PRIu64 "): | %s |\n", mask_str, total, cpus);
+ }
+}
+
+int main(int argc, char **argv) {
+ struct scx_nest_bpf *skel;
+ struct bpf_link *link;
+ __u64 ecode;
+
+ // åˆå§‹åŒ–调试打å°å‡½æ•°å’Œä¿¡å·å¤„ç†
+ libbpf_set_print(scx_libbpf_print_fn);
+ signal(SIGINT, sigint_handler);
+ signal(SIGTERM, sigint_handler);
+
+ // è§£æžå‘½ä»¤è¡Œå‚æ•°
+ scx_parse_args(argc, argv);
+
+restart:
+ skel = SCX_OPS_OPEN(nest_ops, scx_nest_bpf);
+
+ // åˆå§‹åŒ–åªè¯»æ•°æ®
+ skel->rodata->nr_cpus = libbpf_num_possible_cpus();
+ skel->rodata->sampling_cadence_ns = SAMPLING_CADENCE_S * 1000 * 1000 * 1000;
+ skel->rodata->p_remove_ns = env.p_remove_ns;
+ skel->rodata->r_max = env.r_max;
+ skel->rodata->r_impatient = env.r_impatient;
+ skel->rodata->slice_ns = env.slice_ns;
+ skel->rodata->find_fully_idle = env.find_fully_idle;
+
+ SCX_OPS_LOAD(skel, nest_ops, scx_nest_bpf, uei);
+ link = SCX_OPS_ATTACH(skel, nest_ops, scx_nest_bpf);
+
+ while (!exit_req && !UEI_EXITED(skel, uei)) {
+ u64 stats[NEST_STAT(NR)];
+ enum nest_stat_idx i;
+ enum nest_stat_group last_grp = -1;
+
+ scx_read_stats(skel, stats);
+ for (i = 0; i < NEST_STAT(NR); i++) {
+ struct nest_stat *nest_stat = &nest_stats[i];
+ if (nest_stat->group != last_grp) {
+ scx_print_stat_grp(nest_stat->group);
+ last_grp = nest_stat->group;
+ }
+ printf("%s=%" PRIu64 "\n", nest_stat->label, stats[nest_stat->idx]);
+ }
+ printf("\n");
+ print_active_nests(skel);
+ printf("\n\n\n");
+ fflush(stdout);
+ sleep(SAMPLING_CADENCE_S);
+ }
+
+ bpf_link__destroy(link);
+ ecode = UEI_REPORT(skel, uei);
+ scx_nest_bpf__destroy(skel);
+
+ if (UEI_ECODE_RESTART(ecode))
+ goto restart;
+ return 0;
+}
diff --git a/scx_plug b/scx_plug
new file mode 100755
index 0000000..ca0b09f
Binary files /dev/null and b/scx_plug differ
diff --git a/scx_plug.c b/scx_plug.c
new file mode 100644
index 0000000..7cd910c
--- /dev/null
+++ b/scx_plug.c
@@ -0,0 +1,710 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include // flock
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+
+#include "env.h"
+#include "proc_data.h"
+#include "blazesym.h"
+#include "scx_nest.h"
+
+#include "scx_nest.skel.h"
+
+
+/*----------------------å…±åŒéƒ¨åˆ†---------------------------------*/
+#define MAX_CSV_FILES 10
+static char csv_folder_path[MAX_PATH_LEN];
+
+static char visualize_proc_path[MAX_PATH_LEN];// 把ä¸é€‚åˆæ”¾åˆ°promthes的都放到这个文件夹
+
+volatile sig_atomic_t stop = 0;
+
+static time_t boot_time; // 系统å¯åŠ¨æ—¶é—´
+
+static u32 zero = 0;
+static u32 one = 1;
+static int create_perf_event(u32 period_ms);
+static struct bpf_link* attach_perf_event_to_program(struct bpf_program *prog, u32 period_ms);
+
+//static int init_time();// åˆå§‹åŒ–ç³»ç»Ÿå½“å‰æ—¶é—´
+static int get_proc_path();
+static error_t parse_arg(int key, char *arg, struct argp_state *state);
+
+// ä¿¡å·å¤„ç†å‡½æ•°ï¼Œç”¨äºŽä¼˜é›…地退出程åº
+void handle_sigint(int sig) {
+ stop = 1;
+}
+
+/*-----------------------------------sched_ext部分--------------------------------*/
+//
+
+#define SAMPLING_CADENCE_S 2
+
+struct scx_nest_bpf *scx_skel = NULL;
+struct bpf_link *scx_link = NULL;
+struct bpf_link *link_to_cpu_mask = NULL;
+struct ring_buffer *rb_cpu_mask = NULL;
+u64 ecode;
+
+int cores = 0;// æ ¸å¿ƒæ•°
+
+int concerned_map_fd[4];
+
+FILE *concerned_files[4];
+
+const char *concerned_names[] = {
+ "comm_ignore.txt",
+ "id_ignore.txt",
+ "comm_attention.txt",
+ "id_attention.txt",
+};
+
+// const char ignore_file[] = "./ignore.txt"; // å°å¿ƒscx_nest误伤的任务
+// const char attention_file[] = "./attention.txt";// è¦åŽ»ç‰¹åˆ«æ³¨æ„的任务
+
+const char *sched_txt_names[] = {
+ "active_nests",
+ "nest_stats",
+ };
+
+FILE *sched_txt_files[MAX_CSV_FILES];
+
+static bool verbose;
+static u32 slow_weight = 3;
+static u32 slow_count = 0;
+
+static struct scx_env sched_env = {
+ .p_remove_ns = 2000 * 1000, // 默认 2000us 转æ¢ä¸ºçº³ç§’ 3000(当剿œ€ä½³)
+ .r_max = 5, // é»˜è®¤æœ€å¤§å¤‡ç”¨æ ¸å¿ƒæ•° 8(当剿œ€ä½³)
+ .r_impatient = 2, // 默认失败次数 4(当剿œ€ä½³)
+ .slice_ns = 20000 * 1000, // 默认时间片 20000us 转æ¢ä¸ºçº³ç§’
+ .find_fully_idle = false, // é»˜è®¤ä¸æŸ¥æ‰¾å®Œå…¨ç©ºé—²æ ¸å¿ƒ
+ .verbose = false, // 默认关é—调试信æ¯
+};
+
+struct nest_stat {
+ const char *label;
+ enum nest_stat_group group;
+ enum nest_stat_idx idx;
+};
+
+static int scx_libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args);
+
+#define NEST_ST(__stat, __grp, __desc) { \
+ .label = #__stat, \
+ .group = __grp, \
+ .idx = NEST_STAT(__stat) \
+},
+static struct nest_stat nest_stats[NEST_STAT(NR)] = {
+#include "scx_nest_stats_table.h"
+};
+#undef NEST_ST
+
+static void scx_read_stats(struct scx_nest_bpf *skel, u64 *stats);
+static void print_underline(const char *str);
+static void scx_print_stat_grp(enum nest_stat_group grp);
+static void print_active_nests(const struct scx_nest_bpf *skel);
+
+static int attach_scx_skel();
+static int scx_operation();
+static void scx_resource_clean();
+
+int process_concerned_files(FILE *concerned_files[], int concerned_map_fd[], int num_files);
+
+static int handle_usr_cpu_mask_event(void *ctx, void *data, size_t data_sz);
+
+static int sched_create_txt();
+
+
+
+int main(int argc, char **argv){
+ int ret;
+ signal(SIGINT, handle_sigint);
+ signal(SIGTERM, handle_sigint);
+ interactive_sched_ext_config(&sched_env);
+
+restart:
+ //printf("----------------------------------------\n");
+ ret = get_proc_path();
+ if(ret != 0)
+ goto cleanup;
+
+ ret = sched_create_txt();
+ if(ret != 0)
+ goto cleanup;
+
+ ret = attach_scx_skel();
+ if(ret != 0)
+ goto cleanup;
+
+ while(stop == 0){
+ ret = scx_operation();
+ if(ret != 0)
+ goto cleanup;
+ ret = process_concerned_files(concerned_files,concerned_map_fd,4);
+ if(ret != 0)
+ goto cleanup;
+ sleep(1);
+ }
+
+
+cleanup:
+ scx_resource_clean();
+
+ if(scx_skel && UEI_ECODE_RESTART(ecode))
+ goto restart;
+
+ return ret;
+}
+
+
+/*-----------------------------å…±åŒéƒ¨åˆ†---------------------------------------*/
+static int get_proc_path() {
+ // 获å–当å‰å·¥ä½œç›®å½•
+ if (getcwd(visualize_proc_path, sizeof(visualize_proc_path)) == NULL) {
+ perror("getcwd failed");
+ return 1;
+ }
+
+ // 拼接 "visualize/proc" 文件夹到路径
+ strncat(visualize_proc_path, "/visualize/proc", sizeof(visualize_proc_path) - strlen(visualize_proc_path) - 1);
+
+ // 检查 "visualize/proc" 文件夹是å¦å˜åœ¨
+ struct stat st;
+ if (stat(visualize_proc_path, &st) == 0) {
+ if (!S_ISDIR(st.st_mode)) {
+ fprintf(stderr, "Error: %s exists but is not a directory\n", visualize_proc_path);
+ return 1;
+ }
+ } else {
+ // 文件夹ä¸å˜åœ¨ï¼Œå°è¯•创建
+ if (mkdir(visualize_proc_path, 0755) != 0) {
+ perror("mkdir failed");
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+static int create_perf_event(u32 period_ms) {
+ struct perf_event_attr attr = {
+ .type = PERF_TYPE_SOFTWARE, // 使用软件事件类型
+ .config = PERF_COUNT_SW_CPU_CLOCK, // 使用 CPU æ—¶é’Ÿä½œä¸ºè§¦å‘æº
+ .size = sizeof(struct perf_event_attr),
+ .sample_period = period_ms * 1000000ULL, // 设置为毫秒级的间隔
+ .freq = 0, // 使用固定间隔,而éžé¢‘率
+ .wakeup_events = 1, // æ¯æ¬¡è§¦å‘事件
+ };
+
+ // 对所有 CPU 和进程创建事件
+ int fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
+ if (fd < 0) {
+ perror("perf_event_open");
+ return -1;
+ }
+ return fd;
+}
+
+static struct bpf_link* attach_perf_event_to_program(struct bpf_program *prog, u32 period_ms) {
+ // 创建 perf event
+ int perf_fd = create_perf_event(period_ms);
+ if (perf_fd < 0) {
+ fprintf(stderr, "Failed to create perf_event\n");
+ return NULL;
+ }
+
+ // å°† perf event é™„åŠ åˆ°æŒ‡å®šçš„ BPF 程åº
+ struct bpf_link *link = bpf_program__attach_perf_event(prog, perf_fd);
+ if (!link) {
+ fprintf(stderr, "Failed to attach perf_event to BPF program: %s\n", strerror(errno));
+ close(perf_fd);
+ return NULL;
+ }
+
+ return link;
+}
+
+/*-----------------------------------------sched_ext部分------------------------------*/
+// 函数:将任务ååŠ è½½åˆ° eBPF Map ä¸
+int load_tasks_name_to_map(const char *comm,int map_fd) {
+ struct comm_info info = {};
+ strncpy(info.comm, comm, sizeof(info.comm));
+
+ // 将任务ååŠ è½½åˆ° eBPF Map ä¸
+ if(bpf_map_update_elem(map_fd,&info,&zero,BPF_ANY) != 0){
+ if(errno == EEXIST){
+ return 0;
+ }
+ fprintf(stderr, "Failed to update map %d\n", map_fd);
+ return -1;
+ }
+
+ return 0;
+}
+
+int load_task_id_to_map(u32 id, int map_fd){
+ if(bpf_map_update_elem(map_fd,&id,&zero,BPF_ANY) != 0){
+ if(errno == EEXIST){
+ return 0;
+ }
+ fprintf(stderr, "Failed to update map %d\n", map_fd);
+ return -1;
+ }
+}
+
+static int sched_link_txt_to_FILE(){
+ char filepath[256]; // 用于å˜å‚¨å®Œæ•´æ–‡ä»¶è·¯å¾„
+ for(int i=0;i<4;i++){
+ snprintf(filepath, sizeof(filepath), "./concerned/%s", concerned_names[i]);
+
+ concerned_files[i] = fopen(filepath, "r");
+ if (concerned_files[i] == NULL) {
+ // 打开失败时,打å°é”™è¯¯å¹¶è¿”回 -1
+ perror(filepath);
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static int sched_create_txt() {
+ int ret;
+ int num_txt_names = sizeof(sched_txt_names) / sizeof(sched_txt_names[0]);
+
+ for(int i=0;istats_primary_mask;
+ } else if (idx == 1) {
+ mask_str = "RESERVED";
+ mask = mask_data->stats_reserved_mask;
+ } else if (idx == 2) {
+ mask_str = "OTHER";
+ mask = mask_data->stats_other_mask;
+ } else {
+ mask_str = "IDLE";
+ mask = mask_data->stats_idle_mask;
+ }
+ for (cpu = 0; cpu < cores; cpu++) {
+ if (mask & (1ULL << cpu)) {
+ cpus[cpu] = '*';
+ total++;
+ }
+ }
+ printf("%-9s(%2" PRIu64 "): | %s |\n", mask_str, total, cpus);
+
+ if(visual){
+ fprintf(sched_txt_files[0], "%-9s(%2" PRIu64 "): | %s |\n", mask_str, total, cpus);
+ }
+ }
+
+ if(visual){
+ fflush(sched_txt_files[0]);
+ }
+}
+
+
+int process_concerned_files(FILE *concerned_files[], int concerned_map_fd[], int num_files) {
+ char line[256]; // 用于å˜å‚¨è¯»å–的行数æ®
+ static long last_offsets[4] = {0}; // ä¿å˜ä¸Šæ¬¡è¯»å–到的文件åç§»é‡
+ int ret;
+
+ for (int i = 0; i < num_files; i++) {
+ if (concerned_files[i] == NULL) {
+ fprintf(stderr, "File pointer at index %d is NULL.\n", i);
+ continue;
+ }
+
+ // èŽ·å–æ–‡ä»¶æè¿°ç¬¦
+ int fd = fileno(concerned_files[i]);
+
+ // å°è¯•åŠ è¯»é”
+ if (flock(fd, LOCK_SH) != 0) { // 使用共享é”,å…è®¸å…¶ä»–è¯»å–æ“作
+ fprintf(stderr, "Failed to acquire lock for file %d: %s. Skipping...\n", i, strerror(errno));
+ continue; // å¦‚æžœæ— æ³•åŠ é”,跳过该文件
+ }
+
+ // 将文件指针移动到上次åç§»ä½ç½®
+ fseek(concerned_files[i], last_offsets[i], SEEK_SET);
+
+ // é€è¡Œè¯»å–文件
+ while (fgets(line, sizeof(line), concerned_files[i]) != NULL) {
+ line[strcspn(line, "\n")] = '\0'; // 去除æ¢è¡Œç¬¦
+
+ if (i % 2 == 0) {
+ // 坹嶿•°ç´¢å¼•æ–‡ä»¶åŠ è½½ä»»åŠ¡åç§°
+ ret = load_tasks_name_to_map(line, concerned_map_fd[i]);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to load tasks name to map for file %d.\n", i);
+ flock(fd, LOCK_UN); // 释放é”
+ return -1;
+ }
+ } else {
+ // å¯¹å¥‡æ•°ç´¢å¼•æ–‡ä»¶åŠ è½½ä»»åŠ¡ ID
+ u32 id = atoi(line);
+ ret = load_task_id_to_map(id, concerned_map_fd[i]);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to load tasks id to map for file %d.\n", i);
+ flock(fd, LOCK_UN); // 释放é”
+ return -1;
+ }
+ }
+
+ // 更新文件åç§»é‡
+ last_offsets[i] = ftell(concerned_files[i]);
+ }
+
+ // 释放é”
+ flock(fd, LOCK_UN);
+ }
+
+ return 0; // æˆåŠŸå¤„ç†æ‰€æœ‰æ–‡ä»¶
+}
+
+static int attach_scx_skel()
+{
+ int ret;
+ libbpf_set_print(scx_libbpf_print_fn);
+
+ // 打开concerned的文件
+ ret = sched_link_txt_to_FILE();
+ if(ret != 0){
+ fprintf(stderr, "Failed to link concerned files to FILE\n");
+ return -1;
+ }
+
+ scx_skel = SCX_OPS_OPEN(nest_ops, scx_nest_bpf);
+ if (!scx_skel) {
+ fprintf(stderr, "Failed to open SCX skeleton.\n");
+ return -1;
+ }
+
+ //int cores = 0;
+ if(cores == 0)
+ {
+ FILE *fp = popen("grep -c '^processor' /proc/cpuinfo", "r");
+ if (fp) {
+ fscanf(fp, "%d", &cores);
+ pclose(fp);
+ }
+ }
+ //printf("cores: %d------------------------------------\n", cores);
+ // åˆå§‹åŒ–åªè¯»æ•°æ®
+ //scx_skel->rodata->nr_cpus = libbpf_num_possible_cpus();
+ scx_skel->rodata->nr_cpus = cores;
+ scx_skel->rodata->sampling_cadence_ns = SAMPLING_CADENCE_S * 1000 * 1000 * 1000;
+ scx_skel->rodata->p_remove_ns = sched_env.p_remove_ns;
+ scx_skel->rodata->r_max = sched_env.r_max;
+ scx_skel->rodata->r_impatient = sched_env.r_impatient;
+ scx_skel->rodata->slice_ns = sched_env.slice_ns;
+ scx_skel->rodata->find_fully_idle = sched_env.find_fully_idle;
+
+ SCX_OPS_LOAD(scx_skel, nest_ops, scx_nest_bpf, uei);
+
+ // 下é¢è¿™é‡Œæ˜¯æ¼”示,对于别的满足filter_inner_map æ ¼å¼çš„map都能放入fliter_map,
+ // ä½ å¯ä»¥å¾ˆè½»æ¾çš„æŠŠä½ 的代ç èžåˆåœ¨æˆ‘这里,把è¦å¤„ç†çš„pidæ•´åˆæ•´ä¸ªæˆ‘è¿™ä¸ªæ ¼å¼çš„map,然åŽåƒä¸‹é¢è¿™æ ·ä¼ è¿›æ¥
+
+ // struct filter_inner_map {
+ // __uint(type, BPF_MAP_TYPE_HASH);
+ // __uint(max_entries, 102400);
+ // __type(key, u32);
+ // __type(value, u32);
+ // } template_map SEC(".maps");
+
+ // int cpu_fd = bpf_map__fd(cpu_skel->maps.thread_occupied_map);
+ // if(cpu_fd < 0){
+ // fprintf(stderr, "Failed to get thread_occupied_map map fd\n");
+ // return -1;
+ // }
+ // int scx_fd;
+ // struct bpf_map *map = bpf_object__find_map_by_name(scx_skel->obj, "fliter_map");
+ // if (!map) {
+ // fprintf(stderr, "Failed to find fliter_map\n");
+ // return -1;
+ // }
+ // scx_fd = bpf_map__fd(map);
+ // if(scx_fd < 0){
+ // fprintf(stderr, "Failed to get fliter_map fd\n");
+ // return -1;
+ // }
+
+ // int ret = bpf_map_update_elem(scx_fd, &zero, &cpu_fd, BPF_ANY);
+ // if(ret < 0){
+ // fprintf(stderr, "Failed to update cpu_filter_ids map\n");
+ // return -1;
+ // }
+
+ concerned_map_fd[0] = bpf_map__fd(scx_skel->maps.comm_ignore_map);
+ if(concerned_map_fd[0] < 0){
+ fprintf(stderr, "Failed to get comm_ignore_map map fd\n");
+ return -1;
+ }
+ concerned_map_fd[1] = bpf_map__fd(scx_skel->maps.id_ignore_map);
+ if(concerned_map_fd[1] < 0){
+ fprintf(stderr, "Failed to get id_ignore_map map fd\n");
+ return -1;
+ }
+ concerned_map_fd[2] = bpf_map__fd(scx_skel->maps.comm_attention_map);
+ if(concerned_map_fd[2] < 0){
+ fprintf(stderr, "Failed to get comm_attention_map map fd\n");
+ return -1;
+ }
+ concerned_map_fd[3] = bpf_map__fd(scx_skel->maps.id_attention_map);
+ if(concerned_map_fd[3] < 0){
+ fprintf(stderr, "Failed to get id_attention_map map fd\n");
+ return -1;
+ }
+
+ ret = process_concerned_files(concerned_files, concerned_map_fd, 4);
+ if(ret < 0){
+ fprintf(stderr, "Failed to process concerned files\n");
+ return -1;
+ }
+
+ link_to_cpu_mask = attach_perf_event_to_program(scx_skel->progs.handle_cpu_mask_event,1000);
+ if(!link_to_cpu_mask){
+ return -1;
+ }
+ scx_skel->links.handle_cpu_mask_event = link_to_cpu_mask;
+
+ rb_cpu_mask = ring_buffer__new(bpf_map__fd(scx_skel->maps.cpu_mask_buffer),handle_usr_cpu_mask_event,NULL,NULL);
+
+ scx_link = SCX_OPS_ATTACH(scx_skel, nest_ops, scx_nest_bpf);
+
+ return 0;
+}
+
+static void scx_resource_clean()
+{
+ if(scx_link)
+ bpf_link__destroy(scx_link);
+ if(scx_skel)
+ {
+ ecode = UEI_REPORT(scx_skel, uei);
+ scx_nest_bpf__destroy(scx_skel);
+ }
+ if(rb_cpu_mask)
+ ring_buffer__free(rb_cpu_mask);
+ for(int i=0;igroup != last_grp) {
+ scx_print_stat_grp(nest_stat->group);
+ last_grp = nest_stat->group;
+ }
+ printf("%s=%" PRIu64 "\n", nest_stat->label, stats[nest_stat->idx]);
+ if(visual)
+ fprintf(sched_txt_files[1], "%s=%" PRIu64 "\n", nest_stat->label, stats[nest_stat->idx]);
+
+ }
+ printf("\n");
+ if(visual)
+ {
+ fprintf(sched_txt_files[1], "\n");
+ fflush(sched_txt_files[1]);
+ }
+ slow_count = 0;
+ }
+
+ // print_active_nests(scx_skel);
+ int ret = ring_buffer__poll(rb_cpu_mask, 100);
+ if(ret < 0)
+ return -1;
+
+ printf("\n");
+ fflush(stdout);
+}
+
+static int scx_libbpf_print_fn(enum libbpf_print_level level, const char *format, va_list args)
+{
+ if (level == LIBBPF_DEBUG && !verbose)
+ return 0;
+ return vfprintf(stderr, format, args);
+}
+
+static void scx_read_stats(struct scx_nest_bpf *skel, u64 *stats)
+{
+ int nr_cpus = libbpf_num_possible_cpus();
+ u64 cnts[NEST_STAT(NR)][nr_cpus];
+ u32 idx;
+
+ memset(stats, 0, sizeof(stats[0]) * NEST_STAT(NR));
+
+ for (idx = 0; idx < NEST_STAT(NR); idx++) {
+ int ret, cpu;
+
+ ret = bpf_map_lookup_elem(bpf_map__fd(skel->maps.stats),
+ &idx, cnts[idx]);
+ if (ret < 0)
+ continue;
+ for (cpu = 0; cpu < nr_cpus; cpu++)
+ stats[idx] += cnts[idx][cpu];
+ }
+}
+
+static void print_underline(const char *str)
+{
+ char buf[64];
+ size_t len;
+
+ len = strlen(str);
+ memset(buf, '-', len);
+ buf[len] = '\0';
+ printf("\n\n%s\n%s\n", str, buf);
+}
+
+static void scx_print_stat_grp(enum nest_stat_group grp)
+{
+ const char *group;
+
+ switch (grp) {
+ case STAT_GRP_WAKEUP:
+ group = "Wakeup stats";
+ break;
+ case STAT_GRP_NEST:
+ group = "Nest stats";
+ break;
+ case STAT_GRP_CONSUME:
+ group = "Consume stats";
+ break;
+ default:
+ group = "Unknown stats";
+ break;
+ }
+
+ print_underline(group);
+}
+
+static void print_active_nests(const struct scx_nest_bpf *skel)
+{
+ u64 primary = skel->bss->stats_primary_mask;
+ u64 reserved = skel->bss->stats_reserved_mask;
+ u64 other = skel->bss->stats_other_mask;
+ u64 idle = skel->bss->stats_idle_mask;
+ u32 nr_cpus = skel->rodata->nr_cpus, cpu;
+ int idx;
+ char cpus[nr_cpus + 1];
+
+ memset(cpus, 0, nr_cpus + 1);
+
+ bool visual = sched_txt_files[0] != NULL;
+ // bool visual = false;
+
+ if(visual){
+ fprintf(sched_txt_files[0], "Masks\n");
+ fprintf(sched_txt_files[0], "----------------------------------------\n");
+ }
+
+ print_underline("Masks");
+ for (idx = 0; idx < 4; idx++) {
+ const char *mask_str;
+ u64 mask, total = 0;
+
+ memset(cpus, '-', nr_cpus);
+ if (idx == 0) {
+ mask_str = "PRIMARY";
+ mask = primary;
+ } else if (idx == 1) {
+ mask_str = "RESERVED";
+ mask = reserved;
+ } else if (idx == 2) {
+ mask_str = "OTHER";
+ mask = other;
+ } else {
+ mask_str = "IDLE";
+ mask = idle;
+ }
+ for (cpu = 0; cpu < nr_cpus; cpu++) {
+ if (mask & (1ULL << cpu)) {
+ cpus[cpu] = '*';
+ total++;
+ }
+ }
+ printf("%-9s(%2" PRIu64 "): | %s |\n", mask_str, total, cpus);
+
+ if(visual){
+ fprintf(sched_txt_files[0], "%-9s(%2" PRIu64 "): | %s |\n", mask_str, total, cpus);
+ }
+ }
+
+ if(visual){
+ fflush(sched_txt_files[0]);
+ }
+}
\ No newline at end of file
diff --git a/sys_spy.c b/sys_spy.c
deleted file mode 100644
index 04bc075..0000000
--- a/sys_spy.c
+++ /dev/null
@@ -1,527 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-
-#include "cpu_event.h"
-#include "mm_event.h"
-#include "proc_data.h"
-
-#include "cpu_stats.skel.h"
-#include "mm_stats.skel.h"
-#include "blazesym.h"
-
-// åˆå§‹åŒ–符å·è§£æžå™¨
-static struct blaze_symbolizer *symbolizer;
-
-// åˆå§‹åŒ–符å·è§£æžå™¨
-static int init_symbolizer() {
- symbolizer = blaze_symbolizer_new();
- if (!symbolizer) {
- printf("Failed to initialize symbolizer\n");
- return -1;
- }
- return 0;
-}
-
-// 释放符å·è§£æžå™¨
-static void free_symbolizer() {
- if (symbolizer) {
- blaze_symbolizer_free(symbolizer);
- symbolizer = NULL;
- }
-}
-
-static void print_frame(const char *name, uintptr_t input_addr, uintptr_t addr, uint64_t offset, const blaze_symbolize_code_info* code_info)
-{
- // å¿½ç•¥æ— æ•ˆçš„æ ˆåœ°å€
- if (addr == 0 || addr == (uintptr_t)-1) {
- return;
- }
-
- // If we have an input address we have a new symbol.
- if (input_addr != 0) {
- printf("%016lx: %s @ 0x%lx+0x%lx", input_addr, name, addr, offset);
- if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL) {
- printf(" %s/%s:%u\n", code_info->dir, code_info->file, code_info->line);
- } else if (code_info != NULL && code_info->file != NULL) {
- printf(" %s:%u\n", code_info->file, code_info->line);
- } else {
- printf("\n");
- }
- } else {
- printf("%16s %s", "", name);
- if (code_info != NULL && code_info->dir != NULL && code_info->file != NULL) {
- printf("@ %s/%s:%u [inlined]\n", code_info->dir, code_info->file, code_info->line);
- } else if (code_info != NULL && code_info->file != NULL) {
- printf("@ %s:%u [inlined]\n", code_info->file, code_info->line);
- } else {
- printf("[inlined]\n");
- }
- }
-}
-
-
-// æ‰“å°æ ˆå›žæº¯
-static void show_stack_trace(uint64_t *stack, int stack_sz, pid_t pid) {
- const struct blaze_syms *syms;
- const struct blaze_sym *sym;
- const struct blaze_symbolize_inlined_fn *inlined;
- int i, j;
-
- assert(sizeof(uintptr_t) == sizeof(uint64_t));
-
- if (pid) {
- // ç”¨æˆ·ç©ºé—´æ ˆå›žæº¯çš„ç¬¦å·è§£æž
- struct blaze_symbolize_src_process src = {
- .type_size = sizeof(src),
- .pid = pid,
- };
- syms = blaze_symbolize_process_abs_addrs(symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- } else {
- // å†…æ ¸ç©ºé—´æ ˆå›žæº¯çš„ç¬¦å·è§£æž
- struct blaze_symbolize_src_kernel src = {
- .type_size = sizeof(src),
- };
- syms = blaze_symbolize_kernel_abs_addrs(symbolizer, &src, (const uintptr_t *)stack, stack_sz);
- }
-
- if (syms == NULL) {
- printf(" failed to symbolize addresses: %s\n", blaze_err_str(blaze_err_last()));
- return;
- }
-
- for (i = 0; i < stack_sz; i++) {
- // æ£€æŸ¥æ ˆåœ°å€æ˜¯å¦ä¸ºæœ‰æ•ˆçš„地å€
- if (stack[i] == 0 || stack[i] == (uintptr_t)-1) {
- continue; // è·³è¿‡æ— æ•ˆçš„æ ˆåœ°å€
- }
-
- if (!syms || syms->cnt <= i || syms->syms[i].name == NULL) {
- printf("%016llx: \n", stack[i]);
- continue;
- }
-
- sym = &syms->syms[i];
- print_frame(sym->name, stack[i], sym->addr, sym->offset, &sym->code_info);
-
- // 如果有内è”函数,打å°å†…è”符å·ä¿¡æ¯
- for (j = 0; j < sym->inlined_cnt; j++) {
- inlined = &sym->inlined[j];
- print_frame(sym->name, 0, 0, 0, &inlined->code_info);
- }
- }
-
- blaze_syms_free(syms);
-}
-
-static int handle_usr_task_cpu_backtrace_event(void *ctx,void *data, size_t data_sz){
- struct task_trace_event *event = data;
-
- if (event->kstack_sz <= 0 && event->ustack_sz <= 0)
- {
- printf("The stack size is invalid\n");
- return 1;
- }
-
- printf("COMM: %s (pid=%d)\n", event->comm, event->pid);
-
- if (event->kstack_sz > 0) {
- printf("Kernel:\n");
- show_stack_trace(event->k_stack, event->kstack_sz / sizeof(uint64_t), 0);
- } else {
- printf("No Kernel Stack\n");
- }
-
- if (event->ustack_sz > 0) {
- printf("Userspace:\n");
- show_stack_trace(event->u_stack, event->ustack_sz / sizeof(uint64_t), event->pid);
- } else {
- printf("No Userspace Stack\n");
- }
-
- printf("\n");
- return 0;
-}
-
-static int handle_cpu_usage_event(void *ctx,void *data, size_t data_sz){
- struct cpu_usage_stats *stats = data;
- float usr = stats->user_percent/100.0f;
- float kernel = stats->kernel_percent/100.0f;
- float idle = stats->idle_percent/100.0f;
- float softirq = stats->irq_percent/100.0f;
- float irq = stats->irq_percent / 100.0f;
-
- printf("CPU ID: %u\n", stats->cpu_id);
- printf("User Time: %f\n", usr);
- printf("Kernel Time: %f\n", kernel);
- printf("Idle Time: %f\n", idle);
- printf("Irq Time: %f\n",irq);
- printf("Softirq Time: %f\n",softirq);
-
- return 0;
-}
-
-static int handle_usr_task_usage_event(void *ctx,void *data, size_t data_sz){
- struct task_cpu_usage *task = data;
- u32 pid = task->task_info.pid;
- float total_percent = task->total_percent/1.0f;
- float usr_percent = task->user_percent/1.0f;
- float kernel_pericent = task->kernel_percent/1.0f;
-
- char comm[TASK_COMM_LEN + 1];
- strncpy(comm,task->task_info.comm,TASK_COMM_LEN);
- comm[TASK_COMM_LEN] = '\0';
-
- printf("pid: %u\n",pid);
- printf("name: %s\n",comm);
- printf("total percent: %f",total_percent);
- printf("kernel percent: %f",kernel_pericent);
- printf("usr_percent: %f\n",usr_percent);
-
- return 0;
-}
-
-static int handle_use_process_stat_event(void *ctx,void *data, size_t data_sz){
- struct process_struct *ps = data;
- u32 tgid = ps->tgid;
- u32 kis_length = ps->kids_length;
- float total_percent = ps->total_use_percent/1.0f;
-
- printf("tgid: %u\n",tgid);
- printf("kids_length: %u\n",kis_length);
- printf("total percent: %f\n",total_percent);
-}
-
-static int handle_usr_runqlat_event(void *ctx,void *data, size_t data_sz){
- struct latency_num *late = data;
- switch (late->pre_size)
- {
- case 0:
- printf("wait less than 1us: %u\n",late->size);
- break;
- case 1:
- printf("wait less than 4us: %u\n",late->size);
- break;
- case 2:
- printf("wait less than 16us: %u\n",late->size);
- break;
- case 3:
- printf("wait less than 64us: %u\n",late->size);
- break;
- case 4:
- printf("wait less than 256us: %u\n",late->size);
- break;
- case 5:
- printf("wait less than 1ms: %u\n",late->size);
- break;
- case 6:
- printf("wait less than 4ms: %u\n",late->size);
- break;
- case 7:
- printf("wait large than 4ms: %u\n",late->size);
- break;
- default:
- break;
- }
-}
-
-static int create_perf_event(u32 period_ms) {
- struct perf_event_attr attr = {
- .type = PERF_TYPE_SOFTWARE, // 使用软件事件类型
- .config = PERF_COUNT_SW_CPU_CLOCK, // 使用 CPU æ—¶é’Ÿä½œä¸ºè§¦å‘æº
- .size = sizeof(struct perf_event_attr),
- .sample_period = period_ms * 1000000ULL, // 设置为毫秒级的间隔
- .freq = 0, // 使用固定间隔,而éžé¢‘率
- .wakeup_events = 1, // æ¯æ¬¡è§¦å‘事件
- };
-
- // 对所有 CPU 和进程创建事件
- int fd = syscall(__NR_perf_event_open, &attr, -1, 0, -1, 0);
- if (fd < 0) {
- perror("perf_event_open");
- return -1;
- }
- return fd;
-}
-
-static struct bpf_link* attach_perf_event_to_program(struct bpf_program *prog, u32 period_ms) {
- // 创建 perf event
- int perf_fd = create_perf_event(period_ms);
- if (perf_fd < 0) {
- fprintf(stderr, "Failed to create perf_event\n");
- return NULL;
- }
-
- // å°† perf event é™„åŠ åˆ°æŒ‡å®šçš„ BPF 程åº
- struct bpf_link *link = bpf_program__attach_perf_event(prog, perf_fd);
- if (!link) {
- fprintf(stderr, "Failed to attach perf_event to BPF program: %s\n", strerror(errno));
- close(perf_fd);
- return NULL;
- }
-
- return link;
-}
-
-
-static void handle_lost_events(void *ctx, int cpu, __u64 lost_cnt) {
- fprintf(stderr, "Lost %llu events on CPU %d\n", lost_cnt, cpu);
-}
-
-/*
-// 用于从 CPU ä¿¡æ¯èŽ·å– CPU æ ¸å¿ƒæ•°
-static int get_cpu_count() {
- FILE *fp = fopen("/proc/cpuinfo", "r");
- if (fp == NULL) {
- perror("fopen");
- return -1;
- }
-
- int cpu_count = 0;
- char line[256];
- while (fgets(line, sizeof(line), fp)) {
- if (strncmp(line, "processor", 9) == 0) {
- cpu_count++;
- }
- }
- fclose(fp);
-
- return cpu_count;/
-}*/
-
-int main(int argc, char **argv){
- struct ring_buffer *rb_cpu = NULL;
- struct ring_buffer *rb_task = NULL;
- struct ring_buffer *rb_process = NULL;
- struct ring_buffer *rb_runqlat = NULL;
- struct ring_buffer *rb_backtrace = NULL;
- struct cpu_stats_bpf *skel;
-
- if(init_symbolizer()!=0)
- return -1;
-
- int err = 0;
- FILE *file = open_meminfo();
-
- skel = cpu_stats_bpf__open_and_load();
- if (!skel) {
- fprintf(stderr, "Failed to open and load BPF program\n");
- return 1;
- }
-
- int nr_cpu = libbpf_num_possible_cpus();
- if(nr_cpu < 0)
- {
- fprintf(stderr,"libbpf: get cpu nums failed \n");
- }
-
- int map_fd = bpf_map__fd(skel->maps.cpu_usr_map);
- u32 key = 0;
- if(bpf_map_update_elem(map_fd,&key,&nr_cpu,BPF_ANY) != 0){
- perror("Failed to update nr_cpu_map");
- cpu_stats_bpf__destroy(skel);
- return 1;
- }
-
- u32 one = 1;
- struct data_list list = {};
- map_fd = bpf_map__fd(skel->maps.occupied_list);
- if(bpf_map_update_elem(map_fd,&key,&list,BPF_ANY)!=0 || bpf_map_update_elem(map_fd,&one,&list,BPF_ANY)!=0){
- perror("Failed to init occupied_liss");
- cpu_stats_bpf__destroy(skel);
- return 1;
- }
-
- struct hash_table table;
- hash_table_init(&table);
- map_fd = bpf_map__fd(skel->maps.hash_table_model_map);
- if(bpf_map_update_elem(map_fd,&key,&table,BPF_ANY) != 0){
- perror("Failed to update hash_table_model_map");
- cpu_stats_bpf__destroy(skel);
- return 1;
- }
- // map_fd = bpf_map__fd(skel->maps.process_occupied_map);
- // if(bpf_map_update_elem(map_fd,&key,&table,BPF_ANY) != 0){
- // perror("Failed to update hash_table_model_map");
- // cpu_stats_bpf__destroy(skel);
- // return 1;
- // }
- // map_fd = bpf_map__fd(skel->maps.thread_occupied_map);
- // if(bpf_map_update_elem(map_fd,&key,&table,BPF_ANY) != 0){
- // perror("Failed to update hash_table_model_map");
- // cpu_stats_bpf__destroy(skel);
- // return 1;
- // }
-
- err = cpu_stats_bpf__attach(skel);
- if (err) {
- fprintf(stderr, "Failed to attach BPF program: %d\n", err);
- goto cleanup;
- }
-
- struct bpf_link *link_cpu = attach_perf_event_to_program(skel->progs.handle_cpu_event, 500); // 500 毫秒
- if (!link_cpu) {
- goto cleanup;
- }
- skel->links.handle_cpu_event = link_cpu;
-
- struct bpf_link *link_task = attach_perf_event_to_program(skel->progs.handle_task_usage_event, 500); // 500 毫秒
- if (!link_task) {
- goto cleanup;
- }
- skel->links.handle_task_usage_event = link_task;
-
- struct bpf_link *link_process = attach_perf_event_to_program(skel->progs.handle_process_stat_event,500);
- if(!link_process){
- goto cleanup;
- }
- skel->links.handle_process_stat_event = link_process;
-
- struct bpf_link *link_runqlat = attach_perf_event_to_program(skel->progs.handle_sys_latency_event,500);
- if(!link_runqlat){
- goto cleanup;
- }
- skel->links.handle_sys_latency_event = link_runqlat;
-
- struct bpf_link *link_backtrace = attach_perf_event_to_program(skel->progs.handle_task_backtrace_event,500);
- if(!link_backtrace){
- goto cleanup;
- }
-
- /*int perf_fd_cpu_usage,perf_fd_task_usage;
- // 2. 创建定时 perf_eventï¼Œæ¯ 500 毫秒触å‘
- perf_fd_cpu_usage = create_perf_event(500); // 500 毫秒
- if (perf_fd_cpu_usage < 0) {
- fprintf(stderr, "Failed to create perf_event\n");
- goto cleanup;
- }
-
- perf_fd_task_usage = create_perf_event(500);
- if(perf_fd_task_usage < 0){
- fprintf(stderr, "Failed to create perf_event\n");
- goto cleanup;
- }
-
- err = cpu_stats_bpf__attach(skel);
- if (err) {
- fprintf(stderr, "Failed to attach BPF program: %d\n", err);
- goto cleanup;
- }
-
- struct bpf_link *link_cpu_usage = bpf_program__attach_perf_event(skel->progs.handle_cpu_event, perf_fd_cpu_usage);
- if (!link_cpu_usage) {
- fprintf(stderr, "Failed to attach perf_event to BPF program: %s\n", strerror(errno));
- goto cleanup;
- }
- skel->links.handle_cpu_event = link_cpu_usage;
-
- struct bpf_link *link_task_usage = bpf_program__attach_perf_event(skel->progs.handle_task_usage_event, perf_fd_task_usage);
- if (!link_task_usage) {
- fprintf(stderr, "Failed to attach perf_event to handle_task_usage_event: %s\n", strerror(errno));
- goto cleanup;
- }
- skel->links.handle_task_usage_event = link_task_usage;*/
-
- rb_cpu = ring_buffer__new(bpf_map__fd(skel->maps.cpu_usage_buffer), handle_cpu_usage_event, NULL, NULL);
- if (!rb_cpu) {
- fprintf(stderr, "Failed to create ring buffer\n");
- goto cleanup;
- }
-
- rb_task = ring_buffer__new(bpf_map__fd(skel->maps.task_occupied_buffer), handle_usr_task_usage_event, NULL, NULL);
- if (!rb_task) {
- fprintf(stderr, "Failed to create ring buffer for task usage\n");
- goto cleanup;
- }
-
- rb_process = ring_buffer__new(bpf_map__fd(skel->maps.process_occupied_buffer), handle_use_process_stat_event, NULL, NULL);
- if(!rb_process){
- fprintf(stderr, "Failed to create ring buffer for process stat\n");
- goto cleanup;
- }
-
- rb_runqlat = ring_buffer__new(bpf_map__fd(skel->maps.runqlat_buffer), handle_usr_runqlat_event, NULL, NULL);
- if(!rb_runqlat){
- fprintf(stderr, "Failed to create ring buffer for runqlat\n");
- goto cleanup;
- }
-
- rb_backtrace = ring_buffer__new(bpf_map__fd(skel->maps.task_backtrace_buffer), handle_usr_task_cpu_backtrace_event, NULL, NULL);
- if(!rb_backtrace){
- fprintf(stderr, "Failed to create ring buffer for cpu task backtrace\n");
- goto cleanup;
- }
-
-
- printf("Monitoring CPU usage... Press Ctrl+C to stop.\n");
-
- while (1) {
- // err = ring_buffer__poll(rb_cpu, 600 /* ms */);
- // if (err == -EINTR) {
- // break; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- // } else if (err < 0) {
- // fprintf(stderr, "Error polling CPU usage ring buffer: %d\n", err);
- // break;
- // }
-
- // err = ring_buffer__poll(rb_task, 600 /* ms */);
- // if (err == -EINTR) {
- // break; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- // } else if (err < 0) {
- // fprintf(stderr, "Error polling task usage ring buffer: %d\n", err);
- // break;
- // }
-
- // err = ring_buffer__poll(rb_process, 600 /* ms */);
- // if (err == -EINTR) {
- // break; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- // } else if (err < 0) {
- // fprintf(stderr, "Error polling process stat ring buffer: %d\n", err);
- // break;
- // }
- // err = ring_buffer__poll(rb_runqlat, 600 /* ms */);
- // if (err == -EINTR) {
- // break; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- // } else if (err < 0) {
- // fprintf(stderr, "Error polling process stat ring buffer: %d\n", err);
- // break;
- // }
-
- err = ring_buffer__poll(rb_backtrace,600);
- if (err == -EINTR) {
- break; // æ•æ‰åˆ°é€€å‡ºä¿¡å·æ—¶åœæ¢
- } else if (err < 0) {
- fprintf(stderr, "Error polling process stat ring buffer: %d\n", err);
- break;
- }
- //read_meminfo(file);
- }
-
-cleanup:
- if (rb_cpu)
- ring_buffer__free(rb_cpu);
- if (rb_task)
- ring_buffer__free(rb_task);
- if (rb_process)
- ring_buffer__free(rb_process);
- if (rb_runqlat)
- ring_buffer__free(rb_runqlat);
- cpu_stats_bpf__destroy(skel);
- fclose(file);
- free_symbolizer();
- return err < 0 ? -err : 0;
-}
\ No newline at end of file
diff --git a/sys_spy b/test
similarity index 50%
rename from sys_spy
rename to test
index 05952b8..6272af4 100755
Binary files a/sys_spy and b/test differ
diff --git a/test.c b/test.c
new file mode 100644
index 0000000..df29249
--- /dev/null
+++ b/test.c
@@ -0,0 +1,51 @@
+#include
+#include
+#include
+#include