vmfs-tools/0000755000000000000000000000000011733555664010074 5ustar vmfs-tools/imager/0000755000000000000000000000000011733555664011340 5ustar vmfs-tools/imager/manifest.mk0000644000000000000000000000003111733303644013456 0ustar imager_OPTIONS := noinst vmfs-tools/imager/imager.c0000644000000000000000000002374111733555434012752 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * An image file consists of a header followed by a set of sequences, each * of which starts with a byte describing the sequence. * * The header is "VMFSIMG" followed by a byte containing the format version. * Backwards compatibility is to be preserved. * * The following sequence descriptor codes are used: * 0x00: In format version >= 2, following byte is the number of 32-bit words * constituting the beginning of a 512B block, followed by that number * of 32-bit words. * In format version < 2, following 512B are a raw block. * 0x01: following chars are the number of blocks (512B) with zeroed data - 1 * in a variable-length encoding. * 0x7f: following 4 bytes is the little-endian encoded Adler-32 checksum. * */ #define FORMAT_VERSION 2 #ifdef __linux__ #include #include #endif #include #include #include #include #include #include #include #include #include #include static void die(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); exit(1); } static void show_usage(char *prog_name) { char *name = basename(prog_name); fprintf(stderr, "Syntax: %s [-x|-r] \n",name); } static size_t do_reads(void *buf, size_t sz, size_t count) { ssize_t hlen = 0, len; while (hlen < count * sz) { len = read(0, buf, count * sz - hlen); if ((len < 0) && (errno != EINTR)) die("Read error\n"); if (len == 0) break; hlen += len; buf += len; } if ((hlen > 0) && (hlen % sz)) die("Short read\n"); return(hlen); } static size_t do_read(void *buf, size_t count) { return do_reads(buf, count, 1); } static void do_write(const void *buf, size_t count) { ssize_t hlen = 0, len; while (hlen < count) { len = write(1, buf, count-hlen); if ((len < 0) && (errno != EINTR)) die("Write error\n"); if (len == 0) break; hlen += len; buf += len; } if (hlen != count) die("Short write\n"); } #define BLK_SIZE 512 static const u_char const zero_blk[BLK_SIZE] = {0,}; #define ADLER32_MODULO 65521 static struct { uint32_t sum1, sum2; } adler32 = { 1, 0 }; static void adler32_add(const u_char *buf, size_t blks) { size_t i; if (buf == zero_blk) { i = blks; while (i >= 65536 / BLK_SIZE) { adler32.sum2 = (adler32.sum2 + 65536 * adler32.sum1) % ADLER32_MODULO; i -= 65536 / BLK_SIZE; } adler32.sum2 = (adler32.sum2 + i * BLK_SIZE * adler32.sum1) % ADLER32_MODULO; } else { uint32_t sum; while(blks--) { for (i = 0, sum = 0; i < BLK_SIZE / 16; i++) { #define adler32_step sum += (*buf++); adler32.sum2 += sum #define fourtimes(stuff) stuff; stuff; stuff; stuff fourtimes(fourtimes(adler32_step)); } adler32.sum2 += adler32.sum1 * BLK_SIZE; adler32.sum1 += sum; adler32.sum1 %= ADLER32_MODULO; adler32.sum2 %= ADLER32_MODULO; } } } static uint32_t adler32_sum() { return adler32.sum1 | (adler32.sum2 << 16); } static uint32_t do_read_number(void) { u_char num; do_read(&num, 1); if (num & 0x80) return ((uint32_t) num & 0x7f) | (do_read_number() << 7); return (uint32_t) num; } static void skip_zero_blocks(size_t blks) { off_t pos; if ((pos = lseek(1, BLK_SIZE * (off_t) blks, SEEK_CUR)) == -1) die("Seek error\n"); ftruncate(1, pos); } static void write_zero_blocks_(size_t blks) { while (blks--) do_write(zero_blk, BLK_SIZE); } static void (*write_zero_blocks)(size_t blks) = write_zero_blocks_; static void write_blocks(const u_char *buf, size_t blks) { adler32_add(buf, blks); if (buf == zero_blk) write_zero_blocks(blks); else do_write(buf, blks * BLK_SIZE); } static void do_extract_(void (*write_blocks)(const u_char *, size_t)) { u_char buf[BLK_SIZE]; u_char version; u_char desc; uint32_t num; /* Read file header */ do_read(buf, 8); if (strncmp((char *)buf, "VMFSIMG", 7)) die("extract: not a VMFS image\n"); if ((version = buf[7]) > FORMAT_VERSION) die("extract: unsupported image format\n"); while (do_read(&desc, 1)) { switch (desc) { case 0x00: if (version >= 2) { num = do_read_number() * 4; memset(&buf[num], 0, BLK_SIZE - num); } else num = BLK_SIZE; do_read(buf, num); write_blocks(buf, 1); break; case 0x01: num = do_read_number(); write_blocks(zero_blk, num + 1); break; case 0x7f: do_read(buf, 4); num = buf[0] | buf[1] << 8 | buf[2] << 16 | buf[3] << 24; if (num != adler32_sum()) die("extract: checksum mismatch\n"); break; default: die("extract: corrupted image\n"); } } } static void do_extract(void) { do_extract_(write_blocks); } static void do_write_number(uint32_t num) { u_char buf[5], *b = buf; size_t sz; do { *b = (u_char) (num & 0x7f); } while ((num >>= 7) && (*(b++) |= 0x80)); sz = b - buf + 1; do_write(buf, sz); } enum block_type { none, zero, raw, }; static enum block_type detect_block_type(const u_char *buf) { int i; if (buf == NULL) return none; for (i = 0; i < BLK_SIZE / 8; i++) if (((uint64_t *)buf)[i]) return raw; return zero; } static void end_consecutive_blocks(enum block_type type, uint32_t blks) { if (type == zero) { do_write("\1", 1); do_write_number(blks - 1); } } static void do_init_image(void) { const u_char const buf[8] = { 'V', 'M', 'F', 'S', 'I', 'M', 'G', FORMAT_VERSION }; do_write(buf, 8); } static void import_blocks(const u_char *buf, size_t blks) { static enum block_type last = none, current; static uint32_t consecutive = 0; do { current = detect_block_type(buf); if ((last != none) && (current != last)) { end_consecutive_blocks(last, consecutive); consecutive = 0; } last = current; switch (current) { case zero: if (buf == zero_blk) { if (consecutive > (uint32_t) -blks) end_consecutive_blocks(zero, (uint32_t) -1); adler32_add(zero_blk, blks); consecutive += blks; return; } adler32_add(zero_blk, 1); consecutive++; break; case raw: do { int i; for (i = BLK_SIZE / 4; i;i--) if (((uint32_t *)buf)[i - 1]) break; do_write("\0", 1); do_write_number(i); do_write(buf, i * 4); adler32_add(buf, 1); } while(0); break; case none: do { uint32_t sum = adler32_sum(); u_char b[5] = { 0x7f, sum & 0xff, (sum >> 8) & 0xff, (sum >> 16) & 0xff, (sum >> 24) & 0xff }; do_write(b, 5); } while(0); return; } buf += BLK_SIZE; } while (--blks); } static void do_import(void) { u_char buf[BLK_SIZE * 16]; size_t len; #ifdef __linux__ struct stat st; int blocksize = 0; off_t filesize = 0; if ((fstat(0, &st) == 0) && S_ISREG(st.st_mode)) { ioctl(0, FIGETBSZ, &blocksize); filesize = st.st_size; } #endif do_init_image(); #ifdef __linux__ if (blocksize) { uint32_t i, max = filesize / blocksize; for (i = 0; i < max; i++) { uint32_t block = i; if (ioctl(0, FIBMAP, &block) < 0) goto fallback; if (block) { lseek(0, (off_t) i * blocksize, SEEK_SET); len = do_reads(buf, BLK_SIZE, blocksize / BLK_SIZE); import_blocks(buf, len / BLK_SIZE); } else import_blocks(zero_blk, blocksize / BLK_SIZE); } if (filesize % blocksize) import_blocks(zero_blk, (filesize % blocksize) / BLK_SIZE); import_blocks(NULL, 0); return; } fallback: #endif while ((len = do_reads(buf, BLK_SIZE, 16))) import_blocks(buf, len / BLK_SIZE); import_blocks(NULL, 0); } static void do_reimport(void) { do_init_image(); do_extract_(import_blocks); import_blocks(NULL, 0); } static void do_verify(void) { do_extract_(adler32_add); } int main(int argc,char *argv[]) { char *arg = NULL; void (*func)(void) = do_import; struct stat st; if (argc > 1) { if (strcmp(argv[1],"-x") == 0) { func = do_extract; argc--; } else if (strcmp(argv[1],"-r") == 0) { func = do_reimport; argc--; } else if (strcmp(argv[1],"-v") == 0) { func = do_verify; argc--; } if (argc == 2) arg = argv[(func == do_import) ? 1 : 2]; } if (argc > 2) { show_usage(argv[0]); return(0); } if (arg) { int fd = open(arg, O_RDONLY); if (fd == -1) { fprintf(stderr, "Error opening %s: %s\n", arg, strerror(errno)); return(1); } dup2(fd,0); close(fd); } if ((fstat(1, &st) == 0) && S_ISREG(st.st_mode) && ((st.st_size == 0) || !(fcntl(1, F_GETFL) & O_APPEND))) write_zero_blocks = skip_zero_blocks; func(); return(0); } vmfs-tools/configure.mk0000644000000000000000000000200211733303644012365 0ustar include utils.mk __VARS := $(foreach var,$(.VARIABLES),$(if $(filter-out command line,$(origin $(var))),$(var))) prefix := /usr/local exec_prefix := $$(prefix) sbindir := $$(exec_prefix)/sbin datarootdir := $$(prefix)/share mandir := $$(datarootdir)/man # configure rules really start here $(call PKG_CONFIG_CHK,uuid,-I/usr/include/uuid,-luuid) $(call PKG_CONFIG_CHK,fuse) $(call PATH_LOOKUP,asciidoc) $(call PATH_LOOKUP,xsltproc) $(call checking,docbook.xsl) __DOCBOOK_XSL := http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl ifneq (,$(XSLTPROC)) ifneq (,$(shell $(XSLTPROC) --nonet --noout $(__DOCBOOK_XSL) 2> /dev/null && echo ok)) DOCBOOK_XSL := $(__DOCBOOK_XSL) endif endif $(call result,$(DOCBOOK_XSL)) $(call LINK_CHECK,strndup) $(call LINK_CHECK,dlopen,-ldl) ifeq (,$(HAS_DLOPEN)) $(call LINK_CHECK,dlopen) endif $(call LINK_CHECK,posix_memalign) # Generate cache file $(shell ($(foreach var,$(filter-out $(__VARS) __%,$(.VARIABLES)),echo '$(var) = $($(var))';)) > config.cache) configure: vmfs-tools/libreadcmd/0000755000000000000000000000000011733555664012162 5ustar vmfs-tools/libreadcmd/manifest.mk0000644000000000000000000000000011733555434014302 0ustar vmfs-tools/libreadcmd/readcmd.c0000644000000000000000000001075211733555434013725 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2010 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include "readcmd.h" static const cmd_t empty_cmd = { 0, }; static char *init_readline(const char *prompt); static char *(*readline)(const char *prompt) = init_readline; static void (*add_history)(const char *string); /* local_readline() buffer allocation increment */ #define READLINE_INCR 256 char *local_readline(const char *prompt) { char *buf = NULL, *buf2; size_t len, alloc = READLINE_INCR; if (prompt) fprintf(stdout, "%s", prompt); buf = malloc(alloc); if (!buf) return NULL; buf2 = buf; do { if (!fgets(buf2, READLINE_INCR, stdin)) break; len = strlen(buf2); if ((len > 0) && (buf2[len-1] == '\n')) { buf2[--len] = 0; return buf; } len += (buf2 - buf); alloc += READLINE_INCR; if (!(buf2 = realloc(buf, alloc))) break; buf = buf2; buf2 = &buf[len]; } while (1); free(buf); return NULL; } static void local_add_history(const char *string) { } /* Argv allocation increment */ #define ARGV_INCR 16 /* Return a command after having prompted for it */ const cmd_t *readcmd(const char *prompt) { char *buf; int i; cmd_t *cmd = NULL; if (!isatty(fileno(stdin))) prompt = NULL; if (!(buf = readline(prompt))) { if (prompt) fprintf(stdout, "\n"); return NULL; } for(i=strlen(buf)-1;(i>=0)&&(buf[i]==' ');buf[i--]=0); if (buf[0]==0) { free(buf); return &empty_cmd; } add_history(buf); cmd = calloc(sizeof(cmd_t),1); cmd->buf = buf; if ((cmd->redir = index(buf, '|'))) cmd->piped = 1; else cmd->redir = index(buf, '>'); if (cmd->redir && (cmd->redir != buf) && (cmd->redir[-1] == ' ')) { char *s; for(s=cmd->redir-1;(s>=buf)&&(*s==' ');*(s--)=0); *(cmd->redir++) = 0; if (!cmd->piped && *cmd->redir == '>') { cmd->append = 1; if (*(++cmd->redir) == '>') { fprintf(stderr,"Unexpected token '>'\n"); free(cmd); free(buf); return &empty_cmd; } } while (*cmd->redir == ' ') cmd->redir++; } else cmd->redir = NULL; cmd->argv = malloc(ARGV_INCR * sizeof(char *)); cmd->argv[0] = buf; do { while (*(cmd->argv[cmd->argc]) == ' ') *(cmd->argv[cmd->argc]++) = 0; if (!(++cmd->argc % ARGV_INCR)) { char **newargv = realloc(cmd->argv, (cmd->argc + ARGV_INCR) * sizeof(char *)); if (newargv) { cmd->argv = newargv; } else { freecmd(cmd); fprintf(stderr, "Not enough memory\n"); return NULL; } } } while((cmd->argv[cmd->argc] = strchr(cmd->argv[cmd->argc - 1], ' '))); return cmd; } /* Free a command */ void freecmd(const cmd_t *cmd) { if (!cmd || cmd == &empty_cmd) return; free(cmd->argv); free(cmd->buf); free((cmd_t *)cmd); } static void *dlhandle = NULL; static char *init_readline(const char *prompt) { if (isatty(fileno(stdin))) { dlhandle = dlopen("libreadline.so", RTLD_NOW); if (!dlhandle) dlhandle = dlopen("libreadline.so.6", RTLD_NOW); if (!dlhandle) dlhandle = dlopen("libreadline.so.5", RTLD_NOW); if (dlhandle) { readline = dlsym(dlhandle, "readline"); add_history = dlsym(dlhandle, "add_history"); if (readline && add_history) goto readline; } } readline = local_readline; add_history = local_add_history; readline: return readline(prompt); } static __attribute__((destructor)) void close_readline(void) { if (dlhandle) dlclose(dlhandle); } vmfs-tools/libreadcmd/readcmd.h0000644000000000000000000000220711733555434013726 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* Type describing a command */ struct _cmd { int argc; char **argv; int piped; int append; char *redir; char *buf; }; typedef struct _cmd cmd_t; /* Return a line after having prompted for it */ char *local_readline(const char *prompt); /* Return a command after having prompted for it */ const cmd_t *readcmd(const char *prompt); /* Free a command */ void freecmd(const cmd_t *cmd); vmfs-tools/utils.mk0000644000000000000000000000546511733303644011564 0ustar #Usage: $(call checking,message]) checking = $(shell sh -c "echo -n Checking for $(1)... " >&2) #Usage: $(call result,value) result = $(shell echo $(if $(1),yes,no) >&2) #Usage: $(call PATH_LOOKUP,name) # Sets NAME to the full path of name define _PATH_LOOKUP __path_lookup := $(call UC,$(1)) ifndef __$$(__path_lookup) $$(call checking,$(1)) $$(__path_lookup) := $$(firstword $$(wildcard $$(foreach path,$$(subst :, ,$(PATH)),$$(path)/$(1)))) __$$(__path_lookup) := 1 $$(call result,$$($$(__path_lookup))) endif endef PATH_LOOKUP = $(eval $(call _PATH_LOOKUP,$(1))) ALPHA := A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ alpha := a b c d e f g h i j k l m n o p q r s t u v w x y z - alphaALPHA := $(join $(addsuffix /,$(alpha)), $(ALPHA)) UC = $(strip $(eval __uc := $1) \ $(foreach c,$(alphaALPHA), \ $(eval __uc := \ $(subst $(subst /,,$(dir $(c))),$(notdir $(c)),$(__uc)))) \ $(__uc)) #Usage: $(call PKG_CONFIG_CHK,name,cflags,ldflags) # cflags and ldflags used in case pkg-config fails. # Sets name/LDFLAGS and name/CFLAGS define _PKG_CONFIG_CHK $$(call PATH_LOOKUP,pkg-config) $$(call checking,$(1)) $(1)/LDFLAGS := $$(if $$(PKG_CONFIG),$$(strip $$(shell $$(PKG_CONFIG) --libs $(1) 2> /dev/null || echo __)),__) $(1)/CFLAGS := $$(if $$(PKG_CONFIG),$$(strip $$(shell $$(PKG_CONFIG) --cflags $(1) 2> /dev/null || echo __)),__) ifeq (__,$$($(1)/LDFLAGS)) $(1)/LDFLAGS := $(3) endif ifeq (__,$$($(1)/CFLAGS)) $(1)/CFLAGS := $(2) endif $$(call result,$$($(1)/CFLAGS)$$($(2)/LDFLAGS)) endef PKG_CONFIG_CHK = $(eval $(call _PKG_CONFIG_CHK,$(1),$(2),$(3))) #Usage: $(call LINK_CHECK,func,ldflags) # Try to link a simple program with a call to func() with given ldflags # Sets FUNC_LDFLAGS and HAS_FUNC define _LINK_CHECK $$(call checking,$(if $(2),$(1) in $(2),$(1))) __name := $(call UC,$(1)) __$$(__name) := $$(shell echo "char $(1)(); int main(void) { $(1)(); return(0); }" > __conftest.c; $(CC) -o __conftest __conftest.c $(2) 2> /dev/null && echo yes || echo no; rm -f __conftest*) ifeq ($$(__$$(__name)),yes) HAS_$$(__name) := 1 ifneq (,$(2)) $$(__name)_LDFLAGS := $(2) endif endif $$(call result,$$(HAS_$$(__name))) endef LINK_CHECK = $(eval $(call _LINK_CHECK,$(1),$(2))) GEN_VERSION = $(shell \ (if [ -d .git ]; then \ VER=$$(git describe --match "v[0-9].*" --abbrev=0 HEAD); \ git update-index -q --refresh; \ if git diff-index --name-status $${VER} -- | grep -q -v '^A'; then \ VER=$$(git describe --match "v[0-9].*" --abbrev=4 HEAD | sed s/-/./g); \ fi ; \ if [ -z "$${VER}" ]; then \ VER="v0.0.0.$$(git rev-list HEAD | wc -l).$$(git rev-parse --short=4 HEAD)"; \ fi; \ test -z "$$(git diff-index --name-only HEAD --)" || VER=$${VER}-dirty; \ else \ VER=$(patsubst %,%-patched,$(or $(VERSION:%-patched=%),v0.0.0)); \ fi; \ echo $$VER) 2> /dev/null) vmfs-tools/test.img0000644000000000000000000011424611733555540011552 0ustar VMFSIMG) Sun VOL1 V1.0vmhba0:C0:T0:L04KDI-{t!(~ahUah%@49edf842-dcb35d37-b383-0021280083cfBI7]܃!(~ahK?ahi! 107^/DI(e!(totoDIBI7]܃!( ͫ0ͫ0ͫ0ͫ0ͫ0ͫ 0ͫ 0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ 0ͫ"0ͫ$0ͫ&0ͫ(0ͫ*0ͫ,0ͫ.0ͫ00ͫ20ͫ40ͫ60ͫ80ͫ:0ͫ<0ͫ>0ͫ@0ͫB0ͫD0ͫF0ͫH0ͫJ0ͫL0ͫN0ͫP0ͫR0ͫT0ͫV0ͫX0ͫZ0ͫ\0ͫ^0ͫ`0ͫb0ͫd0ͫf0ͫh0ͫj0ͫl0ͫn0ͫp0ͫr0ͫt0ͫv0ͫx0ͫz0ͫ|0ͫ~0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ0ͫ1ͫ1ͫ1ͫ1ͫ1ͫ 1ͫ 1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ 1ͫ"1ͫ$1ͫ&1ͫ(1ͫ*1ͫ,1ͫ.1ͫ01ͫ21ͫ41ͫ61ͫ81ͫ:1ͫ<1ͫ>1ͫ@1ͫB1ͫD1ͫF1ͫH1ͫJ1ͫL1ͫN1ͫP1ͫR1ͫT1ͫV1ͫX1ͫZ1ͫ\1ͫ^1ͫ`1ͫb1ͫd1ͫf1ͫh1ͫj1ͫl1ͫn1ͫp1ͫr1ͫt1ͫv1ͫx1ͫz1ͫ|1ͫ~1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ1ͫ2ͫ2ͫ2ͫ2ͫ2ͫ 2ͫ 2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ 2ͫ"2ͫ$2ͫ&2ͫ(2ͫ*2ͫ,2ͫ.2ͫ02ͫ22ͫ42ͫ62ͫ82ͫ:2ͫ<2ͫ>2ͫ@2ͫB2ͫD2ͫF2ͫH2ͫJ2ͫL2ͫN2ͫP2ͫR2ͫT2ͫV2ͫX2ͫZ2ͫ\2ͫ^2ͫ`2ͫb2ͫd2ͫf2ͫh2ͫj2ͫl2ͫn2ͫp2ͫr2ͫt2ͫv2ͫx2ͫz2ͫ|2ͫ~2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ2ͫ3ͫ3ͫ3ͫ3ͫ3ͫ 3ͫ 3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ 3ͫ"3ͫ$3ͫ&3ͫ(3ͫ*3ͫ,3ͫ.3ͫ03ͫ23ͫ43ͫ63ͫ83ͫ:3ͫ<3ͫ>3ͫ@3ͫB3ͫD3ͫF3ͫH3ͫJ3ͫL3ͫN3ͫP3ͫR3ͫT3ͫV3ͫX3ͫZ3ͫ\3ͫ^3ͫ`3ͫb3ͫd3ͫf3ͫh3ͫj3ͫl3ͫn3ͫp3ͫr3ͫt3ͫv3ͫx3ͫz3ͫ|3ͫ~3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ3ͫ4ͫ4ͫ4ͫ4ͫ4ͫ 4ͫ 4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ 4ͫ"4ͫ$4ͫ&4ͫ(4ͫ*4ͫ,4ͫ.4ͫ04ͫ24ͫ44ͫ64ͫ84ͫ:4ͫ<4ͫ>4ͫ@4ͫB4ͫD4ͫF4ͫH4ͫJ4ͫL4ͫN4ͫP4ͫR4ͫT4ͫV4ͫX4ͫZ4ͫ\4ͫ^4ͫ`4ͫb4ͫd4ͫf4ͫh4ͫj4ͫl4ͫn4ͫp4ͫr4ͫt4ͫv4ͫx4ͫz4ͫ|4ͫ~4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ4ͫ5ͫ5ͫ5ͫ5ͫ5ͫ 5ͫ 5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ 5ͫ"5ͫ$5ͫ&5ͫ(5ͫ*5ͫ,5ͫ.5ͫ05ͫ25ͫ45ͫ65ͫ85ͫ:5ͫ<5ͫ>5ͫ@5ͫB5ͫD5ͫF5ͫH5ͫJ5ͫL5ͫN5ͫP5ͫR5ͫT5ͫV5ͫX5ͫZ5ͫ\5ͫ^5ͫ`5ͫb5ͫd5ͫf5ͫh5ͫj5ͫl5ͫn5ͫp5ͫr5ͫt5ͫv5ͫx5ͫz5ͫ|5ͫ~5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ5ͫ6ͫ6ͫ6ͫ6ͫ6ͫ 6ͫ 6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ 6ͫ"6ͫ$6ͫ&6ͫ(6ͫ*6ͫ,6ͫ.6ͫ06ͫ26ͫ46ͫ66ͫ86ͫ:6ͫ<6ͫ>6ͫ@6ͫB6ͫD6ͫF6ͫH6ͫJ6ͫL6ͫN6ͫP6ͫR6ͫT6ͫV6ͫX6ͫZ6ͫ\6ͫ^6ͫ`6ͫb6ͫd6ͫf6ͫh6ͫj6ͫl6ͫn6ͫp6ͫr6ͫt6ͫv6ͫx6ͫz6ͫ|6ͫ~6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ6ͫ7ͫ7ͫ7ͫ7ͫ7ͫ 7ͫ 7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ 7ͫ"7ͫ$7ͫ&7ͫ(7ͫ*7ͫ,7ͫ.7ͫ07ͫ27ͫ47ͫ67ͫ87ͫ:7ͫ<7ͫ>7ͫ@7ͫB7ͫD7ͫF7ͫH7ͫJ7ͫL7ͫN7ͫP7ͫR7ͫT7ͫV7ͫX7ͫZ7ͫ\7ͫ^7ͫ`7ͫb7ͫd7ͫf7ͫh7ͫj7ͫl7ͫn7ͫp7ͫr7ͫt7ͫv7ͫx7ͫz7ͫ|7ͫ~7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ7ͫ8ͫ8ͫ8ͫ8ͫ8ͫ 8ͫ 8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ 8ͫ"8ͫ$8ͫ&8ͫ(8ͫ*8ͫ,8ͫ.8ͫ08ͫ28ͫ48ͫ68ͫ88ͫ:8ͫ<8ͫ>8ͫ@8ͫB8ͫD8ͫF8ͫH8ͫJ8ͫL8ͫN8ͫP8ͫR8ͫT8ͫV8ͫX8ͫZ8ͫ\8ͫ^8ͫ`8ͫb8ͫd8ͫf8ͫh8ͫj8ͫl8ͫn8ͫp8ͫr8ͫt8ͫv8ͫx8ͫz8ͫ|8ͫ~8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ8ͫ9ͫ9ͫ9ͫ9ͫ9ͫ 9ͫ 9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ 9ͫ"9ͫ$9ͫ&9ͫ(9ͫ*9ͫ,9ͫ.9ͫ09ͫ29ͫ49ͫ69ͫ89ͫ:9ͫ<9ͫ>9ͫ@9ͫB9ͫD9ͫF9ͫH9ͫJ9ͫL9ͫN9ͫP9ͫR9ͫT9ͫV9ͫX9ͫZ9ͫ\9ͫ^9ͫ`9ͫb9ͫd9ͫf9ͫh9ͫj9ͫl9ͫn9ͫp9ͫr9ͫt9ͫv9ͫx9ͫz9ͫ|9ͫ~9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ9ͫ:ͫ:ͫ:ͫ:ͫ:ͫ :ͫ :ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ :ͫ":ͫ$:ͫ&:ͫ(:ͫ*:ͫ,:ͫ.:ͫ0:ͫ2:ͫ4:ͫ6:ͫ8:ͫ::ͫ<:ͫ>:ͫ@:ͫB:ͫD:ͫF:ͫH:ͫJ:ͫL:ͫN:ͫP:ͫR:ͫT:ͫV:ͫX:ͫZ:ͫ\:ͫ^:ͫ`:ͫb:ͫd:ͫf:ͫh:ͫj:ͫl:ͫn:ͫp:ͫr:ͫt:ͫv:ͫx:ͫz:ͫ|:ͫ~:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ:ͫ;ͫ;ͫ;ͫ;ͫ;ͫ ;ͫ ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ ;ͫ";ͫ$;ͫ&;ͫ(;ͫ*;ͫ,;ͫ.;ͫ0;ͫ2;ͫ4;ͫ6;ͫ8;ͫ:;ͫ<;ͫ>;ͫ@;ͫB;ͫD;ͫF;ͫH;ͫJ;ͫL;ͫN;ͫP;ͫR;ͫT;ͫV;ͫX;ͫZ;ͫ\;ͫ^;ͫ`;ͫb;ͫd;ͫf;ͫh;ͫj;ͫl;ͫn;ͫp;ͫr;ͫt;ͫv;ͫx;ͫz;ͫ|;ͫ~;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ;ͫ<ͫ<ͫ<ͫ<ͫ<ͫ <ͫ <ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ <ͫ"<ͫ$<ͫ&<ͫ(<ͫ*<ͫ,<ͫ.<ͫ0<ͫ2<ͫ4<ͫ6<ͫ8<ͫ:<ͫ<<ͫ><ͫ@<ͫB<ͫD<ͫF<ͫH<ͫJ<ͫL<ͫN<ͫP<ͫR<ͫT<ͫV<ͫX<ͫZ<ͫ\<ͫ^<ͫ`<ͫb<ͫd<ͫf<ͫh<ͫj<ͫl<ͫn<ͫp<ͫr<ͫt<ͫv<ͫx<ͫz<ͫ|<ͫ~<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ<ͫ=ͫ=ͫ=ͫ=ͫ=ͫ =ͫ =ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ =ͫ"=ͫ$=ͫ&=ͫ(=ͫ*=ͫ,=ͫ.=ͫ0=ͫ2=ͫ4=ͫ6=ͫ8=ͫ:=ͫ<=ͫ>=ͫ@=ͫB=ͫD=ͫF=ͫH=ͫJ=ͫL=ͫN=ͫP=ͫR=ͫT=ͫV=ͫX=ͫZ=ͫ\=ͫ^=ͫ`=ͫb=ͫd=ͫf=ͫh=ͫj=ͫl=ͫn=ͫp=ͫr=ͫt=ͫv=ͫx=ͫz=ͫ|=ͫ~=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ=ͫ>ͫ>ͫ>ͫ>bͫ>ͫ >ͫ >ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ >ͫ">ͫ$>ͫ&>ͫ(>ͫ*>ͫ,>ͫ.>ͫ0>ͫ2>ͫ4>ͫ6>ͫ8>ͫ:>ͫ<>ͫ>>ͫ@>ͫB>ͫD>ͫF>ͫH>ͫJ>ͫL>ͫN>ͫP>ͫR>ͫT>ͫV>ͫX>ͫZ>ͫ\>ͫ^>ͫ`>ͫb>ͫd>ͫf>ͫh>ͫj>ͫl>ͫn>ͫp>ͫr>ͫt>ͫv>ͫx>ͫz>ͫ|>ͫ~>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ>ͫ?ͫ?ͫ?ͫ?ͫ?ͫ ?ͫ ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ ?ͫ"?ͫ$?ͫ&?ͫ(?ͫ*?ͫ,?ͫ.?ͫ0?ͫ2?ͫ4?ͫ6?ͫ8?ͫ:?ͫ?ͫ@?ͫB?ͫD?ͫF?ͫH?ͫJ?ͫL?ͫN?ͫP?ͫR?ͫT?ͫV?ͫX?ͫZ?ͫ\?ͫ^?ͫ`?ͫb?ͫd?ͫf?ͫh?ͫj?ͫl?ͫn?ͫp?ͫr?ͫt?ͫv?ͫx?ͫz?ͫ|?ͫ~?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?ͫ?  ~Au Au Au  Au Au Au A> WW Au /A> 7R4IIIAAԢ~@GIDIGIA FIEIFIAӖGIFIFIAqܢAHIGIGIAAAAAAAA A  A  A  A  A AAAAA @@HIHIHIAG> pH IIIdG> H@IIIG>  IIIeAeeefAfffgAggghAhhhiAiiijAjjjkAkkklAlllmAmmmnAnnnoAooopApppqAqqqrArrrsAssstAtttuAuuuvAvvvwAwwwxAxxxyAyyyzAzzz{A{{{|A|||}A}}}~A~~~AAAAAAHAAAAAAAAAAAAAAAAAdAdAG> ߽pIIIG> ; III!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!aH!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!a!aG> #@vIII G> 0 IIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAAAAG> &Ǎ{III0n...@.fbb.sf.fdc.sf|.pbc.sf.sbc.sf@.vh.sfthin-flat.vmdkd@thin.vmdkthick-flat.vmdkthick.vmdkszeroedthick-flat.vmdk@zeroedthick.vmdkeagerzeroedthick-flat.vmdkeagerzeroedthick.vmdk ~aa Iaa a> 4b a> #a> hTWa> %W  ~qâ ~ݮݮݮ ݮݮݮݮݮ ݮ$ݮ (ݮ ,ݮ 0ݮ 4ݮ 8ݮ<ݮ@ݮDݮHݮLޮPޮTޮXޮ\ޮ`ޮdޮhޮlޮpޮtޮx> W |ޮc# Disk DescriptorFile version=1 CID=dab8f8df parentCID=ffffffff createType="vmfs" # Extent description RW 409600 VMFS "thin-flat.vmdk" # The Disk Data Base #DDB ddb.virtualHWVersion = "4" ddb.uuid = "60 00 C2 90 9c dd 83 ba-fb ce 1b d2 b8 5a 40 6b" ddb.geometry.cylinders = "200" ddb.geometry.heads = "64" ddb.geometry.sectors = "32" ddb.adapterType = "buslogic" ddb.thinProvisioned = "1" ~\# Disk DescriptorFile version=1 CID=05a15a72 parentCID=ffffffff createType="vmfs" # Extent description RW 409600 VMFS "thick-flat.vmdk" # The Disk Data Base #DDB ddb.virtualHWVersion = "4" ddb.uuid = "60 00 C2 94 dd 7e ff 9f-37 d5 f3 b7 a9 34 c6 3a" ddb.geometry.cylinders = "200" ddb.geometry.heads = "64" ddb.geometry.sectors = "32" ddb.adapterType = "buslogic" ~^# Disk DescriptorFile version=1 CID=501e91e0 parentCID=ffffffff createType="vmfs" # Extent description RW 409600 VMFS "zeroedthick-flat.vmdk" # The Disk Data Base #DDB ddb.virtualHWVersion = "4" ddb.uuid = "60 00 C2 94 48 26 0d 35-8e 25 14 37 3d 3d ec f0" ddb.geometry.cylinders = "200" ddb.geometry.heads = "64" ddb.geometry.sectors = "32" ddb.adapterType = "buslogic" ~_# Disk DescriptorFile version=1 CID=d425fe82 parentCID=ffffffff createType="vmfs" # Extent description RW 409600 VMFS "eagerzeroedthick-flat.vmdk" # The Disk Data Base #DDB ddb.virtualHWVersion = "4" ddb.adapterType = "buslogic" ddb.geometry.sectors = "32" ddb.geometry.heads = "64" ddb.geometry.cylinders = "200" ddb.uuid = "60 00 C2 96 e5 a7 01 d6-67 1c f5 95 60 c2 87 06"  !"#$%&'()*+,-./0ā1ȁ2́3Ё4ԁ5؁6܁789:;<=>?-nG{III]0vPzeroedthick-flat.vmdk_@zeroedthick.vmdkeagerzeroedthick-flat.vmdkeagerzeroedthick.vmdkA4IuIIAa1vmfs-tools/README0000644000000000000000000000430311733303644010741 0ustar vmfs-tools - Tools to access VMFS filesystems ============================================= Originally loosely based on http://code.google.com/p/vmfs/ from fluidOps, this set of tools has since evolved to handle more features from VMFS, such as extents, and allows to access VMFS through the standard Linux VFS with the help of the FUSE framework. While it is still work in progress and is not destined for production use yet, it can be of some help for some people. Build and install instructions ------------------------------ To get a full build of vmfs-tools, you need the following prerequisites: - gcc - GNU make - libuuid's development files - pkg-config - libfuse's development files - asciidoc - xsltproc - docbook-xsl From the above list, only the first three are strictly required. The lack of libfuse's development files will result in the vmfs-fuse program not being built. The lack of asciidoc, xsltproc or docbook-xsl will result in no manual pages (though you can still look at the .txt files within the source tarball). Building vmfs-tools should be as simple as running `make' or `gmake`, depending on how GNU make's binary is named on your system. To install vmfs-tools, just run `make install' (or `gmake install'). The install location for the binaries is $prefix/sbin, $prefix/share/man for the manual pages, where $prefix is /usr/local by default. If you wish to install to some other place, you can override $prefix with the command `./configure --prefix=/some/where'. Supported platforms ------------------- vmfs-tools has been verified to build on GNU/Linux, FreeBSD 7.2, Opensolaris 2009.06 and Cygwin 1.5.25. On FreeBSD 7.2, you will need to install e2fsprogs-libuuid and pkg-config so that the system uuid.h header is not used: it provides an incompatible definition of the uuid_t type. On Opensolaris, if you use the gcc-4.3.2 package instead of SUNWgcc, you need to set EXTRA_LDFLAGS to -L/lib. This can be done with the command `make EXTRA_LDFLAGS=-L/lib'. (you may need to use `gmake' instead of `make', depending on your system) On Cygwin, you need to EXTRA_LDFLAGS to -L/usr/lib/e2fsprogs to get libuuid from there. This can be done with the command `make EXTRA_LDFLAGS=-L/usr/lib/e2fsprogs'. vmfs-tools/configure0000755000000000000000000000102711733303644011770 0ustar #!/bin/sh if type gmake > /dev/null 2>&1; then MAKE=gmake elif type make > /dev/null 2>&1 && make -v 2>&1 | grep GNU > /dev/null; then MAKE=make else echo "Can't find GNU make" >&2 exit 1 fi MAKEOPTS= for opt; do case "$opt" in --prefix=* | --exec-prefix=* | --sbindir=* \ | --datarootdir=* | --mandir=*) name=`echo "$opt" | sed 's/^--\([^=]*\)=.*$/\1/' | tr - _` value=`echo "$opt" | sed 's/^--[^=]*=//'` MAKEOPTS="$MAKEOPTS $name='$value'" ;; esac done rm -f config.cache exec $MAKE config.cache ${MAKEOPTS} vmfs-tools/debugvmfs/0000755000000000000000000000000011733555664012056 5ustar vmfs-tools/debugvmfs/debugvmfs.txt0000644000000000000000000001722711733555434014605 0ustar debugvmfs(8) ============ NAME ---- debugvmfs - VMFS file system debugger SYNOPSIS -------- *debugvmfs* 'VOLUME'... 'COMMAND' [ 'OPTIONS' ] DESCRIPTION ----------- The *debugvmfs* program allows to display various informations about VMFS file systems, and to access data within the file systems. The 'VOLUME' to be opened can be either a block device or an image file. When the VMFS spreads accross several extents, all extents must be given. Please note that most commands are still likely to change in future versions. SPECIFYING FILES ---------------- Some commands take a 'filespec' as an argument. A 'filespec' may take either of the following forms: - A path name, relative to the root of the filesystem if it starts with \'/', or relative to the current working directory otherwise (interactive mode only). - An inode number, enclosed between angle brackets, e.g. \'<4>', \'<0x1400004>' COMMANDS -------- *cat* 'filespec' [ ... ]:: Outputs the content of the given files from the VMFS. *ls* [ *-l* ] 'filespec':: Lists files contained at the given location within the VMFS. + With *-l*, gives some more information, much like the output from *ls*(1) when given the *-l* option. *truncate* 'filespec' 'length':: Truncate the file to the specified length. R/W support must be enabled. *chmod* 'filespec' 'mode':: Change file permissions to the given mode. *df*:: Outputs information about file system size. *get_file_block* 'filespec' 'position':: Get file block corresponding to position in the specified file. *check_vol_bitmaps*:: Checks volume bitmaps consistency. *show_heartbeats*:: Outputs active heartbeats on the file system. *read_block* 'block_id' [ ... ]:: Outputs content within the specified block_id in binary *get_block_status* 'block_id':: Get status (allocated or free) of the specified block_id. *alloc_block_fixed* 'block_id':: Allocate the specified block_id. R/W support must be enabled. *alloc_block* 'block_type':: Allocate a block of the specified type. R/W support must be enabled. + Allowed block types are: 1 (File Block), 2 (Sub-Block), 3 (Pointer Block) and 4 (File Descriptor / Inode). *free_block* 'block_id':: Free the specified block_id. R/W support must be enabled. + Warning: can cause damage since no heartbeat is used at this time and a block used by a file can be freed. *show*:: Display value(s) of the given variable. See the *VARIABLES* section for more details. When no variable is given, it lists the top-level properties. *shell*:: Starts an interactive session. All of the above commands can be executed from within the interactive session. + The current working directory can be changed with the *cd* command, followed by a filespec. + The following output redirections are supported within the shell: + - 'cmd' > 'output' + Puts the output of 'cmd' in the 'output' file. + - 'cmd' >> 'output' + Appends the output of 'cmd' to the 'output' file. + - 'cmd' | 'external command' + Sends the output of 'cmd' to the input of 'external command'. The 'external command' itself can contain output redirection. + Examples: + ** read_block 0x00000681 | less ** cat /.fdc.sf | hexdump -C ** cat /.fdc.sf | hexdump -C > /tmp/fdc.hex ** cat /.fdc.sf | hexdump -C | less VARIABLES --------- Variables in debugvmfs represent structures on the filesystem. The currently supported top-level variables are the following: - *vol_version* - *version* - *label* - *mode* - *uuid* - *ctime* - *block_size* - *subblock_size* - *fdc_header_size* - *fdc_bitmap_count* - *fbb* - *fdc* - *pbc* - *sbc* - *fs* - *lvm* - *blkid*['blk'] - *dirent*["'path'"] - *inode*["'filespec'"] The *vol_version*, *version*, *label*, *mode*, *uuid*, *ctime*, *block_size*, *subblock_size*, *fdc_header_size*, and *fdc_bitmap_count* properties are low-level information about the filesystem. The *fbb*, *fdc*, *pbc* and *sbc* variables are bitmaps. Running them through the *show* command will display all the bitmaps header fields. Each of these fields can also be displayed individually: - 'bitmap'.*items_per_bitmap_entry* - 'bitmap'.*bmp_entries_per_area* - 'bitmap'.*hdr_size* - 'bitmap'.*data_size* - 'bitmap'.*area_size* - 'bitmap'.*area_count* - 'bitmap'.*total_items* - 'bitmap'.*used_items* - 'bitmap'.*free_items* - 'bitmap'.*entry*['n'] e.g. to display the data size of the fdc bitmap, type *show fdc.data_size*. Each 'bitmap'.*entry*['n'] (where 0 ≤ 'n' < 'bitmap'.*bmp_entries_per_area* * 'bitmap'.*area_count*) contains information about each entry in the bitmap. The available fields are: - 'bitmap'.*entry*['n'].id - 'bitmap'.*entry*['n'].total - 'bitmap'.*entry*['n'].free - 'bitmap'.*entry*['n'].ffree - 'bitmap'.*entry*['n'].mdh - 'bitmap'.*entry*['n'].item['m'] The 'bitmap'.*entry*['n'].mdh is a metadata header. See further below for more details about metadata headers. Each 'bitmap'.*entry*['n'].item['m'] (where 0 ≤ 'm' < 'bitmap'.*items_per_bitmap_entry*) contains information about a given item in the given entry. The available fields are: - 'bitmap'.*entry*['n'].item['m'].used - 'bitmap'.*entry*['n'].item['m'].dump The *pbc* bitmap has an additional field: - *pbc*.*entry*['n'].item['m'].blocks The *lvm* variable contains low-level information about the physical and logical volumes. The available fields are: - *lvm*.*uuid* - *lvm*.*size* - *lvm*.*blocks* - *lvm*.*num_extents* - *lvm*.*extent*['n'] Each *lvm*.*extent*['n'] (where 0 ≤ 'n' < *lvm*.*num_extents*) contains low-level information about the physical volumes. The available fields are: - *lvm*.*extent*['n'].device - *lvm*.*extent*['n'].uuid - *lvm*.*extent*['n'].lun - *lvm*.*extent*['n'].version - *lvm*.*extent*['n'].name - *lvm*.*extent*['n'].size - *lvm*.*extent*['n'].num_segments - *lvm*.*extent*['n'].first_segment - *lvm*.*extent*['n'].last_segment Each *blkid*['blk'] (where 'blk' is a block id) contains information on the given block id. The available fields are: - *blkid*['blk'].item - *blkid*['blk'].flags Each *dirent*['path'] (where 'path' is a path relative to the current directory in the shell or / outside the shell) contains information on the directory entry corresponding to the given path. The available fields are: - *dirent*["'path'"].type - *dirent*["'path'"].block_id - *dirent*["'path'"].record_id - *dirent*["'path'"].name Each *inode*['filespec'] contains information on the inode corresponding to the given filespec. The available fields are: - *inode*["'filespec'"].id - *inode*["'filespec'"].id2 - *inode*["'filespec'"].nlink - *inode*["'filespec'"].type - *inode*["'filespec'"].flags - *inode*["'filespec'"].size - *inode*["'filespec'"].blk_size - *inode*["'filespec'"].blk_count - *inode*["'filespec'"].uid - *inode*["'filespec'"].gid - *inode*["'filespec'"].mode - *inode*["'filespec'"].zla - *inode*["'filespec'"].tbz - *inode*["'filespec'"].cow - *inode*["'filespec'"].atime - *inode*["'filespec'"].mtime - *inode*["'filespec'"].ctime - *inode*["'filespec'"].rdm_id - *inode*["'filespec'"].mdh - *inode*["'filespec'"].blocks Metadata headers are being used in several places, such as 'bitmap'.*entry*['n'].mdh and *inode*["'filespec'"].mdh. They mostly contain information about clustered accesses to metadata on the filesystem. The available fields are: - 'mdh'.magic - 'mdh'.pos - 'mdh'.hb_pos - 'mdh'.hb_lock - 'mdh'.hb_uuid - 'mdh'.hb_seq - 'mdh'.obj_seq - 'mdh'.mtime Variable values can also be used in expressions using square brackets to use the variable value as an index. For example: - *blkid*[*inode*["'filespec'"].id] Enclosing a variable name with parentheses will use that variable value as a variable name. For example: - (*blkid*['blk'].item).status AUTHORS ------- include::../AUTHORS[] SEE ALSO -------- vmfs-fuse(8) vmfs-tools/debugvmfs/manifest.mk0000644000000000000000000000014311733555434014206 0ustar LDFLAGS := $(DLOPEN_LDFLAGS) debugvmfs.o_CFLAGS := -include version REQUIRES := libvmfs libreadcmd vmfs-tools/debugvmfs/variables.c0000644000000000000000000006436711733555434014205 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009,2010,2011,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "vmfs.h" struct var_member { const char *member_name; const char *description; const struct var_member *subvar; unsigned short offset; unsigned short length; void *(*get_member)(void *value, const char *index); void (*free_member)(void *value); char *(*get_value)(void *value, short len); }; struct var { const struct var_member *member; void *value; const struct var *parent; }; static void *get_pb_bitmap(void *value, const char *index); static void *get_bitmap_item(void *value, const char *index); #define free_bitmap_item free static void *get_bitmap_entry(void *value, const char *index); #define free_bitmap_entry free static void *get_lvm_extent(void *value, const char *index); #define free_lvm_extent NULL static void *get_blkid(void *value, const char *index); #define free_blkid free static void *get_dirent(void *value, const char *index); #define free_dirent (void (*)(void *))vmfs_dir_close static void *get_inode(void *value, const char *index); #define free_inode (void (*)(void *))vmfs_inode_release static void *get_lvm(void *value, const char *index); #define free_lvm NULL static char *get_value_none(void *value, short len); static char *get_value_uint(void *value, short len); static char *get_value_xint(void *value, short len); static char *get_value_size(void *value, short len); static char *get_value_string(void *value, short len); static char *get_value_uuid(void *value, short len); static char *get_value_date(void *value, short len); static char *get_value_fs_mode(void *value, short len); static char *get_value_hb_lock(void *value, short len); static char *get_value_bitmap_used(void *value, short len); static char *get_value_bitmap_free(void *value, short len); static char *get_value_bitmap_item_status(void *value, short len); static char *get_value_bitmap_item_dump(void *value, short len); static char *get_value_bitmap_item_blocks(void *value, short len); static char *get_value_vol_size(void *value, short len); static char *get_value_blkid_item(void *value, short len); static char *get_value_blkid_flags(void *value, short len); static char *get_value_mode(void *value, short len); static char *get_value_blocks(void *value, short len); #define PTR(type, name) 0 #define FIELD(type, name) sizeof(((type *)0)->name) #define MEMBER(type, name, desc, format) \ { # name, desc, NULL, offsetof(type, name), \ FIELD(type, name), NULL, NULL, get_value_ ## format } #define MEMBER2(type, sub, name, desc, format) \ { # name, desc, NULL, offsetof(type, sub.name), \ FIELD(type, sub.name), NULL, NULL, get_value_ ## format } #define VIRTUAL_MEMBER(type, name, desc, format) \ { # name, desc, NULL, 0, sizeof(type), NULL, NULL, get_value_ ## format } #define GET_SUBVAR(type, name, subvar, what) \ { # name, NULL, subvar, 0, sizeof(type), get_ ## what, free_ ## what, NULL } #define SUBVAR(type, name, subvar, kind) \ { # name, NULL, subvar, offsetof(type, name), kind(type, name), NULL, NULL, NULL } #define SUBVAR2(type, name, subvar, field_name, kind) \ { # name, NULL, subvar, offsetof(type, field_name), kind(type, field_name), NULL, NULL, NULL } static const struct var_member vmfs_metadata_hdr[] = { MEMBER(vmfs_metadata_hdr_t, magic, "Magic", xint), MEMBER(vmfs_metadata_hdr_t, pos, "Position", xint), MEMBER(vmfs_metadata_hdr_t, hb_pos, "HB Position", uint), MEMBER(vmfs_metadata_hdr_t, hb_lock, "HB Lock", hb_lock), MEMBER(vmfs_metadata_hdr_t, hb_uuid, "HB UUID", uuid), MEMBER(vmfs_metadata_hdr_t, hb_seq, "HB Sequence", uint), MEMBER(vmfs_metadata_hdr_t, obj_seq, "Obj Sequence", uint), MEMBER(vmfs_metadata_hdr_t, mtime, "MTime", uint), { NULL, } }; struct vmfs_bitmap_item_ref { vmfs_bitmap_entry_t entry; vmfs_bitmap_t *bitmap; uint32_t entry_idx, item_idx; }; static const struct var_member vmfs_bitmap_item[] = { VIRTUAL_MEMBER(struct vmfs_bitmap_item_ref, status, "Status", bitmap_item_status), VIRTUAL_MEMBER(struct vmfs_bitmap_item_ref, dump, NULL, bitmap_item_dump), { "blocks", NULL, NULL, 0, sizeof(struct vmfs_bitmap_item_ref), get_pb_bitmap, NULL, get_value_bitmap_item_blocks }, { NULL, } }; static const struct var_member vmfs_bitmap_entry[] = { MEMBER(vmfs_bitmap_entry_t, id, "Id", uint), MEMBER(vmfs_bitmap_entry_t, total, "Total items", uint), MEMBER(vmfs_bitmap_entry_t, free, "Free items", uint), MEMBER(vmfs_bitmap_entry_t, ffree, "First free", uint), SUBVAR(vmfs_inode_t, mdh, vmfs_metadata_hdr, FIELD), GET_SUBVAR(struct vmfs_bitmap_item_ref, item, vmfs_bitmap_item, bitmap_item), { NULL, } }; static const struct var_member vmfs_bitmap[] = { MEMBER2(vmfs_bitmap_t, bmh, items_per_bitmap_entry, "Item per bitmap entry", uint), MEMBER2(vmfs_bitmap_t, bmh, bmp_entries_per_area, "Bitmap entries per area", uint), MEMBER2(vmfs_bitmap_t, bmh, hdr_size, "Header size", size), MEMBER2(vmfs_bitmap_t, bmh, data_size, "Data size", size), MEMBER2(vmfs_bitmap_t, bmh, area_size, "Area size", size), MEMBER2(vmfs_bitmap_t, bmh, area_count, "Area count", uint), MEMBER2(vmfs_bitmap_t, bmh, total_items, "Total items", uint), VIRTUAL_MEMBER(vmfs_bitmap_t, used_items, "Used items", bitmap_used), VIRTUAL_MEMBER(vmfs_bitmap_t, free_items, "Free items", bitmap_free), GET_SUBVAR(vmfs_bitmap_t, entry, vmfs_bitmap_entry, bitmap_entry), { NULL, } }; static const struct var_member vmfs_volume[] = { MEMBER(vmfs_volume_t, device, "Device", string), MEMBER2(vmfs_volume_t, vol_info, uuid, "UUID", uuid), MEMBER2(vmfs_volume_t, vol_info, lun, "LUN", uint), MEMBER2(vmfs_volume_t, vol_info, version, "Version", uint), MEMBER2(vmfs_volume_t, vol_info, name, "Name", string), VIRTUAL_MEMBER(vmfs_volume_t, size, "Size", vol_size), MEMBER2(vmfs_volume_t, vol_info, num_segments, "Num. Segments", uint), MEMBER2(vmfs_volume_t, vol_info, first_segment, "First Segment", uint), MEMBER2(vmfs_volume_t, vol_info, last_segment, "Last Segment", uint), { NULL, } }; static const struct var_member vmfs_lvm[] = { MEMBER2(vmfs_lvm_t, lvm_info, uuid, "UUID", uuid), MEMBER2(vmfs_lvm_t, lvm_info, size, "Size", size), MEMBER2(vmfs_lvm_t, lvm_info, blocks, "Blocks", uint), MEMBER2(vmfs_lvm_t, lvm_info, num_extents, "Num. Extents", uint), GET_SUBVAR(vmfs_lvm_t, extent, vmfs_volume, lvm_extent), { NULL, } }; static const struct var_member blkid[] = { VIRTUAL_MEMBER(vmfs_block_info_t, item, "Referred Item", blkid_item), VIRTUAL_MEMBER(vmfs_block_info_t, flags, "Flags", blkid_flags), { NULL, } }; static const struct var_member dirent[] = { MEMBER2(vmfs_dir_t, dirent, type, "Type", uint), MEMBER2(vmfs_dir_t, dirent, block_id, "Block ID", xint), MEMBER2(vmfs_dir_t, dirent, record_id, "Record ID", xint), MEMBER2(vmfs_dir_t, dirent, name, "Name", string), { NULL, } }; static const struct var_member inode[] = { MEMBER(vmfs_inode_t, id, "ID", xint), MEMBER(vmfs_inode_t, id2, "ID2", xint), MEMBER(vmfs_inode_t, nlink, "Links", uint), MEMBER(vmfs_inode_t, type, "Type", uint), MEMBER(vmfs_inode_t, flags, "Flags", uint), MEMBER(vmfs_inode_t, size, "Size", size), MEMBER(vmfs_inode_t, blk_size, "Block size", size), MEMBER(vmfs_inode_t, blk_count, "Block count", uint), MEMBER(vmfs_inode_t, uid, "UID", uint), MEMBER(vmfs_inode_t, gid, "GID", uint), MEMBER(vmfs_inode_t, mode, "Mode", mode), MEMBER(vmfs_inode_t, zla, "ZLA", uint), MEMBER(vmfs_inode_t, tbz, "TBZ", uint), MEMBER(vmfs_inode_t, cow, "COW", uint), MEMBER(vmfs_inode_t, atime, "Access Time", date), MEMBER(vmfs_inode_t, mtime, "Modify Time", date), MEMBER(vmfs_inode_t, ctime, "Change Time", date), MEMBER(vmfs_inode_t, rdm_id, "RDM ID", xint), SUBVAR(vmfs_inode_t, mdh, vmfs_metadata_hdr, FIELD), VIRTUAL_MEMBER(vmfs_inode_t, blocks, NULL, blocks), { NULL, } }; static const struct var_member vmfs_fs[] = { GET_SUBVAR(vmfs_fs_t, lvm, vmfs_lvm, lvm), SUBVAR2(vmfs_fs_t, lvm, vmfs_lvm, dev, PTR), SUBVAR(vmfs_fs_t, fbb, vmfs_bitmap, PTR), SUBVAR(vmfs_fs_t, fdc, vmfs_bitmap, PTR), SUBVAR(vmfs_fs_t, pbc, vmfs_bitmap, PTR), SUBVAR(vmfs_fs_t, sbc, vmfs_bitmap, PTR), GET_SUBVAR(vmfs_fs_t, blkid, blkid, blkid), GET_SUBVAR(vmfs_fs_t, dirent, dirent, dirent), GET_SUBVAR(vmfs_fs_t, inode, inode, inode), MEMBER2(vmfs_fs_t, fs_info, vol_version, "Volume Version", uint), MEMBER2(vmfs_fs_t, fs_info, version, "Version", uint), MEMBER2(vmfs_fs_t, fs_info, label, "Label", string), MEMBER2(vmfs_fs_t, fs_info, mode, "Mode", fs_mode), MEMBER2(vmfs_fs_t, fs_info, uuid, "UUID", uuid), MEMBER2(vmfs_fs_t, fs_info, ctime, "Creation time", date), MEMBER2(vmfs_fs_t, fs_info, block_size, "Block size", size), MEMBER2(vmfs_fs_t, fs_info, subblock_size, "Subblock size", size), MEMBER2(vmfs_fs_t, fs_info, fdc_header_size, "FDC Header size", size), MEMBER2(vmfs_fs_t, fs_info, fdc_bitmap_count, "FDC Bitmap count", uint), { NULL, } }; static const struct var_member root = { NULL, NULL, vmfs_fs, 0, sizeof(vmfs_fs_t), NULL, NULL, NULL }; static void *get_member(const struct var_member *member, void *value, const char *index) { void *result = &((char *) value)[member->offset]; if (member->length == 0) result = *(void**)result; if (member->get_member) result = member->get_member(result, index); return result; } static void free_member(const struct var_member *member, void *value) { if (!value) return; if (member->free_member) member->free_member(value); } static void free_var(const struct var *var, const struct var *up_to) { const struct var *v; if (!var || var == up_to) return; free_member(var->member, var->value); v = var->parent; free((void *)var); if (v && v != up_to) free_var(v, up_to); } static const char *find_closing_thing(const char* openclose, const char *str) { size_t len = strcspn(str, openclose); if (str[len] == openclose[0]) { const char *thing = find_closing_thing(openclose, str + len + 1); if (!thing) return NULL; return find_closing_thing(openclose, thing + 1); } else if (str[len] == openclose[1]) return str + len; return NULL; } static int get_numeric_index(uint32_t *idx, const char *index); static const struct var *resolve_var(const struct var *var, const char *name) { /* TODO: this function really needs some simplification/splitting */ size_t len; const struct var_member *m; char *index = NULL; struct var *res; void *value; if (!name || !var) return var; len = strcspn(name, ".[("); if (name[len] == '(') { const struct var *idx_var; const char *end; if (len != 0 || var->parent) return NULL; if (!(end = find_closing_thing("()", name + 1))) return NULL; len = end - name - 1; index = malloc(len + 1); strncpy(index, name + 1, len); index[len] = 0; len += 2; idx_var = resolve_var(var, index); free(index); if (idx_var && idx_var->member->get_value) { index = idx_var->member->get_value(idx_var->value, idx_var->member->length); free_var(idx_var, var); var = resolve_var(var, index); free(index); index = NULL; name += len; if (*name == '.') name++; len = strcspn(name, ".["); } else return NULL; } if (!var || !name[0]) return var; if (len == 0) return NULL; m = var->member->subvar; while (m->member_name && !(!strncmp(m->member_name, name, len) && m->member_name[len] == 0)) m++; if (!m->member_name) return NULL; if (name[len] == '[') { size_t len2 = len + 1; const char *end; int is_str = 0; if (name[len2] == '"') { end = strchr(name + len2 + 1, '"'); if (end[1] != ']') return NULL; is_str = 1; len++; } else end = find_closing_thing("[]", name + len + 1); if (end) { len2 = end - name - 1; index = malloc(len2 - len + 1); strncpy(index, name + len + 1, len2 - len); index[len2 - len] = 0; len = len2 + 2; if (is_str) { len++; } else { uint32_t idx; if (!get_numeric_index(&idx, index)) { const struct var *root_var, *idx_var; for (root_var = var; root_var->parent; root_var = root_var->parent); idx_var = resolve_var(root_var, index); free(index); if (idx_var && idx_var->member->get_value) { index = idx_var->member->get_value(idx_var->value, idx_var->member->length); } else return NULL; free_var(idx_var, root_var); } } } else return NULL; } value = get_member(m, var->value, index); free(index); if (!value) return NULL; res = malloc(sizeof(struct var)); res->value = value; res->member = m; res->parent = var; if (name[len]) { const struct var *r = resolve_var(res, name + len + 1); if (!r) free(res); return r; } return res; } /* Get string corresponding to specified mode */ static char *vmfs_fs_mode_to_str(uint32_t mode) { /* only two lower bits seem to be significant */ switch(mode & 0x03) { case 0x00: return "private"; case 0x01: case 0x03: return "shared"; case 0x02: return "public"; } /* should not happen */ return NULL; } static const char * const units[] = { "", " KiB", " MiB", " GiB", " TiB", }; static char *human_readable_size(uint64_t size) { char buf[256]; int scale = 0; for (scale = 0; (size >> scale) >= 1024; scale += 10); if (size & ((1L << scale) - 1)) sprintf(buf, "%.2f%s", (float) size / (1L << scale), units[scale / 10]); else sprintf(buf, "%"PRIu64"%s", size >> scale, units[scale / 10]); return strdup(buf); } static char *get_value_uint(void *value, short len) { char buf[32]; switch (len) { case 4: sprintf(buf, "%" PRIu32, *((uint32_t *)value)); return strdup(buf); case 8: sprintf(buf, "%" PRIu64, *((uint64_t *)value)); return strdup(buf); } return get_value_none(value, len); } static char *get_value_xint(void *value, short len) { char buf[32]; switch (len) { case 4: sprintf(buf, "0x%" PRIx32, *((uint32_t *)value)); return strdup(buf); case 8: sprintf(buf, "0x%" PRIx64, *((uint64_t *)value)); return strdup(buf); } return get_value_none(value, len); } static char *get_value_size(void *value, short len) { switch (len) { case 4: return human_readable_size(*((uint32_t *)value)); case 8: return human_readable_size(*((uint64_t *)value)); } return get_value_none(value, len); } static char *get_value_string(void *value, short len) { if (len == sizeof(void *)) return strdup(*((char **)value)); return strdup((char *)value); } static char *get_value_uuid(void *value, short len) { char *buf = malloc(36); return m_uuid_to_str((u_char *)value,buf); } static char *get_value_date(void *value, short len) { char buf[256]; return strdup(m_ctime((time_t *)(uint32_t *)value, buf, 256)); } static char *get_value_fs_mode(void *value, short len) { return strdup(vmfs_fs_mode_to_str(*((uint32_t *)value))); } const char *hb_lock[] = { "unlocked", "write lock", "read lock", }; static char *get_value_hb_lock(void *value, short len) { uint32_t lock = *((uint32_t *)value); if (lock <= 2) return strdup(hb_lock[lock]); else { char buf[256]; sprintf(buf, "0x%x", lock); return strdup(buf); } } static char *get_value_none(void *value, short len) { return strdup("Don't know how to display"); } static char *get_value_bitmap_used(void *value, short len) { char buf[32]; sprintf(buf, "%d", vmfs_bitmap_allocated_items((vmfs_bitmap_t *)value)); return strdup(buf); } static char *get_value_bitmap_free(void *value, short len) { char buf[32]; sprintf(buf, "%d", ((vmfs_bitmap_t *)value)->bmh.total_items - vmfs_bitmap_allocated_items((vmfs_bitmap_t *)value)); return strdup(buf); } static char *get_value_vol_size(void *value, short len) { return human_readable_size( (uint64_t)(((vmfs_volume_t *)value)->vol_info.size) * 256); } static int longest_member_desc(const struct var_member *members) { int len = 0, curlen; for (; members->member_name; members++) { if (!members->description) continue; curlen = strlen(members->description); if (curlen > len) len = curlen; } return len; } static int get_numeric_index(uint32_t *idx, const char *index) { char *c; unsigned long ret; if (!idx) return 0; ret = strtoul(index, &c, 0); if (*c || ret > 0xffffffff) return 0; *idx = ret; return 1; } static void *get_lvm_extent(void *value, const char *index) { vmfs_lvm_t *lvm = (vmfs_lvm_t *)value; uint32_t idx; if (!index || !get_numeric_index(&idx, index) || idx >= lvm->lvm_info.num_extents) return NULL; return lvm->extents[idx]; } static void *get_bitmap_entry(void *value, const char *index) { struct vmfs_bitmap_item_ref *ref = calloc(1, sizeof(struct vmfs_bitmap_item_ref)); if (!index) return NULL; ref->bitmap = (vmfs_bitmap_t *)value; if (!get_numeric_index(&ref->entry_idx, index)) return NULL; if (ref->entry_idx >= ref->bitmap->bmh.bmp_entries_per_area * ref->bitmap->bmh.area_count) return NULL; vmfs_bitmap_get_entry(ref->bitmap, ref->entry_idx, 0, &ref->entry); return ref; } static char *get_value_bitmap_item_status(void *value, short len) { struct vmfs_bitmap_item_ref *ref = (struct vmfs_bitmap_item_ref *) value; int used = vmfs_bitmap_get_item_status(&ref->bitmap->bmh, &ref->entry, ref->entry_idx, ref->item_idx); return strdup(used ? "used" : "free"); } void dump_line(char *buf, uint32_t offset, u_char *data, size_t len) { u_char b[17]; size_t i; sprintf(buf, "%08x ", offset); buf += 10; for (i = 0; i < len; i++) { sprintf(buf, (i == 7) ? "%02x " : "%02x ", data[i]); buf += (i == 7) ? 4 : 3; b[i] = ((data[i] > 31) && (data[i] < 127)) ? data[i] : '.'; } b[i] = 0; for (; i < 16; i++) { sprintf(buf, (i == 7) ? " " : " "); buf += (i == 7) ? 4 : 3; } sprintf(buf, " |%s|\n", b); } static char *get_value_bitmap_item_dump(void *value, short len) { struct vmfs_bitmap_item_ref *ref = (struct vmfs_bitmap_item_ref *) value; uint32_t off = 0, size = ref->bitmap->bmh.data_size; u_char *data; char *dump, *buf; bool is_fbb = false; if (size == 0) { /* If bitmap data size is 0, it is very likely the bitmap is fbb. But just in case, we make sure it is */ if (ref->bitmap->f->inode->fs->fbb != ref->bitmap) return NULL; size = vmfs_fs_get_blocksize(ref->bitmap->f->inode->fs); is_fbb = true; } data = iobuffer_alloc(size); buf = dump = malloc(79 * (size + 15) / 16); if (is_fbb) vmfs_fs_read(ref->bitmap->f->inode->fs, ref->entry_idx * ref->bitmap->bmh.items_per_bitmap_entry + ref->item_idx, 0, data, size); else vmfs_bitmap_get_item(ref->bitmap, ref->entry_idx, ref->item_idx, data); while (size >= 16) { dump_line(buf, off, data + off, 16); size -= 16; off += 16; buf += 79; } if (size > 0) dump_line(buf, off, data + off, size); free(data); return dump; } static char *get_value_bitmap_item_blocks(void *value, short len) { struct vmfs_bitmap_item_ref *ref = (struct vmfs_bitmap_item_ref *) value; uint32_t size = ref->bitmap->bmh.data_size; u_char *data = iobuffer_alloc(size); uint32_t *blocks = (uint32_t *) data; int i, num = size / sizeof(uint32_t); void *b, *buf; vmfs_bitmap_get_item(ref->bitmap, ref->entry_idx, ref->item_idx, data); while (num > 0 && !blocks[num - 1]) num--; b = buf = malloc(sizeof("0x00000000") * num + 1); for (i = 0; i < num; i++) { sprintf(b, "0x%08x%c", read_le32(data, i * sizeof(uint32_t)), (i + 1) % 4 ? ' ' : '\n'); b += sizeof("0x00000000"); } return buf; } static void *get_pb_bitmap(void *value, const char *index) { struct vmfs_bitmap_item_ref *ref = (struct vmfs_bitmap_item_ref *) value; if (ref->bitmap->f->inode->fs->pbc != ref->bitmap) return NULL; return value; } static void *get_bitmap_item(void *value, const char *index) { struct vmfs_bitmap_item_ref *ref = malloc(sizeof(struct vmfs_bitmap_item_ref)); /* This is not nice, but we need to copy the struct for resolve_var to * be happy about it */ memcpy(ref, value, sizeof(struct vmfs_bitmap_item_ref)); if (!index) return NULL; if (!get_numeric_index(&ref->item_idx, index)) return NULL; if (ref->item_idx >= ref->bitmap->bmh.items_per_bitmap_entry) return NULL; return ref; } static const char *bitmaps[] = { "fbb", "sbc", "pbc", "fdc" }; static char *get_value_blkid_item(void *value, short len) { char buf[256]; vmfs_block_info_t *info = (vmfs_block_info_t *)value; sprintf(buf, "%s.entry[%d].item[%d]", bitmaps[info->type - 1], info->entry, info->item); return strdup(buf); } static char *get_value_blkid_flags(void *value, short len) { char buf[256]; vmfs_block_info_t *info = (vmfs_block_info_t *)value; int more_than_one = 0; if (sprintf(buf, "0x%x (", info->flags) <= 0) return NULL; if (info->type == VMFS_BLK_TYPE_FB) { if (info->flags & VMFS_BLK_FB_TBZ_FLAG) { strcat(buf, "tbz"); more_than_one = 1; } if (info->flags & ~VMFS_BLK_FB_TBZ_FLAG) { if (more_than_one) strcat(buf, ", "); strcat(buf, "unknown"); } } if (!info->flags) strcat(buf, "none"); strcat(buf, ")"); return strdup(buf); } static void *get_blkid(void *value, const char *index) { vmfs_block_info_t *info; uint32_t idx; if (!index || !get_numeric_index(&idx, index)) return NULL; info = calloc(1, sizeof(vmfs_block_info_t)); if (vmfs_block_get_info(idx, info) == -1) { free(info); return NULL; } /* Normalize entry and item for fbb */ if (info->type == VMFS_BLK_TYPE_FB) { vmfs_fs_t *fs = (vmfs_fs_t *)value; info->entry = info->item / fs->fbb->bmh.items_per_bitmap_entry; info->item = info->item % fs->fbb->bmh.items_per_bitmap_entry; } return info; } static vmfs_dir_t *current_dir = NULL; static void *get_dirent(void *value, const char *index) { vmfs_dir_t *dir; char *bname, *dname; if (!index) return NULL; bname = m_basename(index); dname = m_dirname(index); if (!(dir = vmfs_dir_open_at(current_dir,dname))) return NULL; if (!vmfs_dir_lookup(dir,bname)) return NULL; free(bname); free(dname); return dir; } static char *get_value_mode(void *value, short len) { char *buf = malloc(18); uint32_t mode = *((uint32_t *)value); sprintf(buf, "%04o (", mode); m_fmode_to_str(mode, buf + 6); buf[16] = ')'; buf[17] = 0; return buf; } static char *get_value_blocks(void *value, short len) { char *buf, *b; int i, num = FIELD(vmfs_inode_t, blocks) / sizeof(uint32_t); vmfs_inode_t *inode = (vmfs_inode_t *) value; while (num > 0 && !inode->blocks[num - 1]) num--; b = buf = malloc(sizeof("0x00000000") * num + 1); for (i = 0; i < num; i++) { sprintf(b, "0x%08x%c", inode->blocks[i], (i + 1) % 4 ? ' ' : '\n'); b += sizeof("0x00000000"); } return buf; } /* Defined in debugvmfs.c */ vmfs_file_t *vmfs_file_open_from_filespec(vmfs_dir_t *base_dir, const char *filespec); static void *get_inode(void *value, const char *index) { vmfs_file_t *file; vmfs_inode_t *inode; if (!index) return NULL; if (!(file = vmfs_file_open_from_filespec(current_dir,index))) return NULL; /* Awkward, need better API */ inode = vmfs_inode_acquire(vmfs_dir_get_fs(current_dir), file->inode->id); vmfs_file_close(file); return inode; } static void *get_lvm(void *value, const char *index) { vmfs_fs_t *fs = (vmfs_fs_t *) value; if (vmfs_device_is_lvm(fs->dev)) return fs->dev; return NULL; } int cmd_show(vmfs_dir_t *base_dir,int argc,char *argv[]) { current_dir = base_dir; const struct var root_var = { &root, (void *)vmfs_dir_get_fs(base_dir), NULL }; const struct var *var = resolve_var(&root_var, argv[0]); int ret = 0; if (var) { const struct var_member *m = var->member; if (m->get_value) { char *str = m->get_value(var->value, m->length); if (str) { if (m->description) printf("%s: %s\n", m->description, str); else printf("%s\n", str); free(str); } } else if (m->subvar) { char format[16]; const struct var_member *v; sprintf(format, "%%%ds: %%s\n", longest_member_desc(m->subvar)); for (v = m->subvar; v->member_name; v++) if (v->description && v->get_value) { void *m_value = get_member(v, var->value, NULL); char *str = v->get_value(m_value, v->length); printf(format, v->description, str); free(str); free_member(v, m_value); } } else ret = 1; } else ret = 1; free_var(var, &root_var); return ret; } vmfs-tools/debugvmfs/debugvmfs.c0000644000000000000000000004315111733555434014203 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2010,2011,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include "vmfs.h" #include "readcmd.h" /* Opens a vmfs_file_t/vmfs_dir_t corresponding to the given filespec */ #define vmfs_foo_open_from_filespec(foo) \ vmfs_## foo ##_t *vmfs_## foo ##_open_from_filespec( \ vmfs_dir_t *base_dir, const char *filespec) \ { \ if (filespec[0] == '<') { /* Possibly a "" filespec */ \ char *end; \ off_t inode = (off_t)strtoull(filespec + 1,&end,0); \ if ((end != filespec) && (end[0] == '>') && (end[1] == 0)) { \ const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); \ return vmfs_## foo ##_open_from_blkid(fs, inode); \ } \ } \ return vmfs_## foo ##_open_at(base_dir, filespec); \ } vmfs_foo_open_from_filespec(file) vmfs_foo_open_from_filespec(dir) /* "cat" command */ static int cmd_cat(vmfs_dir_t *base_dir,int argc,char *argv[]) { vmfs_file_t *f; int i; if (argc == 0) { fprintf(stderr,"Usage: cat file1 ... fileN\n"); return(-1); } for(i=0;i= 1) && (strcmp(argv[0],"-l") == 0)) { long_format = 1; argv++; argc--; } switch (argc) { case 0: arg = "."; break; case 1: arg = argv[0]; break; default: fprintf(stderr,"Usage: ls [-l] [path]\n"); return(-1); } if (!(d = vmfs_dir_open_from_filespec(base_dir,arg))) { fprintf(stderr,"Unable to open directory %s\n",argv[0]); return(-1); } while((entry = vmfs_dir_read(d))) { if (long_format) { vmfs_file_t *f = vmfs_file_open_from_blkid(fs,entry->block_id); if (!f) continue; vmfs_file_fstat(f,&st_info); vmfs_file_close(f); printf("%-10s ",m_fmode_to_str(st_info.st_mode,buffer)); usr = getpwuid(st_info.st_uid); grp = getgrgid(st_info.st_gid); printf("%u ", (unsigned int)st_info.st_nlink); if (usr) printf("%8s ", usr->pw_name); else printf("%8u ", st_info.st_uid); if (grp) printf("%8s ", grp->gr_name); else printf("%8u ", st_info.st_gid); printf("%10llu %s %s\n", (unsigned long long)st_info.st_size, m_ctime(&st_info.st_ctime,buffer,sizeof(buffer)), entry->name); } else { printf("%s\n",entry->name); } } vmfs_dir_close(d); return(0); } /* "truncate" command */ static int cmd_truncate(vmfs_dir_t *base_dir,int argc,char *argv[]) { off_t new_size; vmfs_file_t *f; int ret = 0; if (argc < 2) { fprintf(stderr,"Usage: truncate filespec size\n"); return(-1); } new_size = (off_t)strtoull(argv[1],NULL,0); if (!(f = vmfs_file_open_from_filespec(base_dir, argv[0]))) { fprintf(stderr,"Unable to open file %s\n",argv[0]); return(-1); } if (vmfs_file_truncate(f,new_size) < 0) { fprintf(stderr,"Unable to truncate file.\n"); ret = -1; goto end; } printf("File truncated to %"PRIu64" (0x%"PRIx64") bytes\n", (uint64_t)new_size,(uint64_t)new_size); end: vmfs_file_close(f); return ret; } /* "copy_file" command */ static int cmd_copy_file(vmfs_dir_t *base_dir,int argc,char *argv[]) { u_char buffer[4096]; off_t pos; size_t len; vmfs_file_t *output; FILE *input; if (argc < 2) { fprintf(stderr,"Usage: copy_file local_filename vmfs_filename\n"); return(-1); } if (!(input = fopen(argv[0],"r"))) { fprintf(stderr,"Unable to open local file\n"); return(-1); } if (!(output = vmfs_file_create_at(base_dir,argv[1],0644))) { fprintf(stderr,"Unable to create file.\n"); return(-1); } pos = 0; while(!feof(input)) { len = fread(buffer,1,sizeof(buffer),input); if (!len) break; vmfs_file_pwrite(output,buffer,len,pos); pos += len; } vmfs_file_close(output); return(0); } /* "chmod" command */ static int cmd_chmod(vmfs_dir_t *base_dir,int argc,char *argv[]) { mode_t mode; vmfs_file_t *f; int ret = 0; if (argc < 2) { fprintf(stderr,"Usage: chmod filespec mode\n"); return(-1); } mode = (mode_t)strtoul(argv[1],NULL,0); if (!(f = vmfs_file_open_from_filespec(base_dir, argv[0]))) { fprintf(stderr,"Unable to open file %s\n",argv[0]); return(-1); } if (vmfs_file_chmod(f,mode) < 0) { fprintf(stderr,"Unable to change file permissions.\n"); ret = -1; } vmfs_file_close(f); return ret; } /* "mkdir" command */ static int cmd_mkdir(vmfs_dir_t *base_dir,int argc,char *argv[]) { if (argc < 1) { fprintf(stderr,"Usage: mkdir dirname\n"); return(-1); } return(vmfs_dir_mkdir_at(base_dir,argv[0],0755)); } /* "df" (disk free) command */ static int cmd_df(vmfs_dir_t *base_dir,int argc,char *argv[]) { const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); uint32_t alloc,total; total = fs->fbb->bmh.total_items; alloc = vmfs_bitmap_allocated_items(fs->fbb); printf("Block size : %"PRIu64" bytes\n",vmfs_fs_get_blocksize(fs)); printf("Total blocks : %u\n",total); printf("Total size : %"PRIu64" MiB\n", (vmfs_fs_get_blocksize(fs)*total)/1048576); printf("Allocated blocks : %u\n",alloc); printf("Allocated space : %"PRIu64" MiB\n", (vmfs_fs_get_blocksize(fs)*alloc)/1048576); printf("Free blocks : %u\n",total-alloc); printf("Free size : %"PRIu64" MiB\n", (vmfs_fs_get_blocksize(fs)*(total-alloc))/1048576); return(0); } /* Get file block corresponding to specified position */ static int cmd_get_file_block(vmfs_dir_t *base_dir,int argc,char *argv[]) { vmfs_file_t *f; uint32_t blk_id; off_t pos; int ret = 0; if (argc < 2) { fprintf(stderr,"Usage: get_file_block \n"); return(-1); } if (!(f = vmfs_file_open_from_filespec(base_dir,argv[0]))) { fprintf(stderr,"Unable to open file '%s'\n",argv[0]); return(-1); } pos = (off_t)strtoull(argv[1],NULL,16); if (!vmfs_inode_get_block(f->inode,pos,&blk_id)) { printf("0x%8.8x\n",blk_id); } else { fprintf(stderr,"Unable to get block info\n"); ret = -1; } vmfs_file_close(f); return ret; } /* Check volume bitmaps */ static int cmd_check_vol_bitmaps(vmfs_dir_t *base_dir,int argc,char *argv[]) { const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); int errors = 0; printf("Checking FBB bitmaps...\n"); errors += vmfs_bitmap_check(fs->fbb); printf("Checking FDC bitmaps...\n"); errors += vmfs_bitmap_check(fs->fdc); printf("Checking PBC bitmaps...\n"); errors += vmfs_bitmap_check(fs->pbc); printf("Checking SBC bitmaps...\n"); errors += vmfs_bitmap_check(fs->sbc); printf("Total errors: %d\n",errors); return(errors); } /* Show active heartbeats */ static int cmd_show_heartbeats(vmfs_dir_t *base_dir,int argc,char *argv[]) { const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); return(vmfs_heartbeat_show_active(fs)); } /* Read a block */ static int cmd_read_block(vmfs_dir_t *base_dir,int argc,char *argv[]) { const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); uint32_t blk_id,blk_type; uint64_t blk_size; u_char *buf; size_t len; int i; if (argc == 0) { fprintf(stderr,"Usage: read_block blk1 ... blkN\n"); return(-1); } blk_size = vmfs_fs_get_blocksize(fs); if (!(buf = iobuffer_alloc(blk_size))) return(-1); for(i=0;isbc,VMFS_BLK_SB_ENTRY(blk_id), VMFS_BLK_SB_ITEM(blk_id),buf); len = fs->sbc->bmh.data_size; break; /* Pointer Block */ case VMFS_BLK_TYPE_PB: vmfs_bitmap_get_item(fs->pbc,VMFS_BLK_PB_ENTRY(blk_id), VMFS_BLK_PB_ITEM(blk_id),buf); len = fs->pbc->bmh.data_size; break; /* File Descriptor / Inode */ case VMFS_BLK_TYPE_FD: vmfs_bitmap_get_item(fs->fdc,VMFS_BLK_FD_ENTRY(blk_id), VMFS_BLK_FD_ITEM(blk_id),buf); len = fs->fdc->bmh.data_size; break; default: fprintf(stderr,"Unsupported block type 0x%2.2x\n",blk_type); } if (len != 0) { if (fwrite(buf,1,len,stdout) != len) fprintf(stderr,"Block 0x%8.8x: incomplete write.\n",blk_id); } } free(buf); return(0); } /* Allocate a fixed block */ static int cmd_alloc_block_fixed(vmfs_dir_t *base_dir,int argc,char *argv[]) { const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); uint32_t blk_id; int res; if (argc == 0) { fprintf(stderr,"Usage: alloc_block_fixed blk_id\n"); return(-1); } blk_id = (uint32_t)strtoul(argv[0],NULL,16); res = vmfs_block_alloc_specified(fs,blk_id); if (res == 0) { printf("Block 0x%8.8x allocated.\n",blk_id); } else { fprintf(stderr,"Unable to allocate block 0x%8.8x\n",blk_id); } return(0); } /* Allocate a block */ static int cmd_alloc_block(vmfs_dir_t *base_dir,int argc,char *argv[]) { const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); uint32_t blk_type,blk_id; int res; if (argc == 0) { fprintf(stderr,"Usage: alloc_block blk_type\n"); return(-1); } blk_type = (uint32_t)strtoul(argv[0],NULL,16); res = vmfs_block_alloc(fs,blk_type,&blk_id); if (res == 0) { printf("Block 0x%8.8x allocated.\n",blk_id); } else { fprintf(stderr,"Unable to allocate block.\n"); } return(0); } /* Free a block */ static int cmd_free_block(vmfs_dir_t *base_dir,int argc,char *argv[]) { const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); uint32_t blk_id; int res; if (argc == 0) { fprintf(stderr,"Usage: free_block blk_id\n"); return(-1); } blk_id = (uint32_t)strtoul(argv[0],NULL,16); res = vmfs_block_free(fs,blk_id); if (res == 0) { printf("Block 0x%8.8x freed.\n",blk_id); } else { fprintf(stderr,"Unable to free block 0x%8.8x\n",blk_id); } return(0); } int cmd_show(vmfs_dir_t *base_dir,int argc,char *argv[]); struct cmd { char *name; char *description; int (*fn)(vmfs_dir_t *base_dir,int argc,char *argv[]); }; /* Opens a shell */ static int cmd_shell(vmfs_dir_t *base_dir,int argc,char *argv[]); struct cmd cmd_array[] = { { "cat", "Concatenate files and print on standard output", cmd_cat }, { "ls", "List files in specified directory", cmd_ls }, { "truncate", "Truncate file", cmd_truncate }, { "copy_file", "Copy a file to VMFS volume", cmd_copy_file }, { "chmod", "Change permissions", cmd_chmod }, { "mkdir", "Create a directory", cmd_mkdir }, { "df", "Show available free space", cmd_df }, { "get_file_block", "Get file block", cmd_get_file_block }, { "check_vol_bitmaps", "Check volume bitmaps", cmd_check_vol_bitmaps }, { "show_heartbeats", "Show active heartbeats", cmd_show_heartbeats }, { "read_block", "Read a block", cmd_read_block }, { "alloc_block_fixed", "Allocate block (fixed)", cmd_alloc_block_fixed }, { "alloc_block", "Find and Allocate a block", cmd_alloc_block }, { "free_block", "Free block", cmd_free_block }, { "show", "Display value(s) for the given variable", cmd_show }, { "shell", "Opens a shell", cmd_shell }, { NULL, NULL }, }; static void show_usage(char *prog_name) { int i; char *name = basename(prog_name); fprintf(stderr,"%s " VERSION "\n",name); fprintf(stderr,"Syntax: %s \n\n",name); fprintf(stderr,"Available commands:\n"); for(i=0;cmd_array[i].name;i++) fprintf(stderr," - %s : %s\n",cmd_array[i].name,cmd_array[i].description); fprintf(stderr,"\n"); } static struct cmd *cmd_find(char *name) { int i; for(i=0;cmd_array[i].name;i++) if (!strcmp(cmd_array[i].name,name)) return(&cmd_array[i]); return NULL; } /* Executes a command through "sh -c", and returns the file descriptor to its * stdin or -1 on error */ static int pipe_exec(const char *cmd) { int fd[2]; pid_t p; if (pipe(fd) == -1) return -1; if ((p = fork()) == -1) return -1; if (p == 0) { /* Child process */ close(fd[1]); dup2(fd[0],0); close(fd[0]); execl("/bin/sh", "/bin/sh", "-c", cmd, NULL); return -1; } else { /* Parent process */ close(fd[0]); return fd[1]; } } /* Opens a shell */ static int cmd_shell(vmfs_dir_t *base_dir,int argc,char *argv[]) { struct cmd *cmd = NULL; const cmd_t *cmdline = NULL; vmfs_dir_t *cur_dir = vmfs_dir_open_at(base_dir,"."); if (!cur_dir) { fprintf(stderr, "Couldn't open base directory\n"); return -1; } do { freecmd(cmdline); cmdline = readcmd("debugvmfs> "); if (!cmdline) goto cleanup; if (!cmdline->argc) continue; if (!strcmp(cmdline->argv[0], "exit") || !strcmp(cmdline->argv[0], "quit")) goto cleanup; if (!strcmp(cmdline->argv[0], "cd")) { if (cmdline->argc == 2) { vmfs_dir_t *new_dir; if (!(new_dir = vmfs_dir_open_from_filespec(cur_dir, cmdline->argv[1]))) { fprintf(stderr, "No such directory: %s\n", cmdline->argv[1]); continue; } vmfs_dir_close(cur_dir); cur_dir = new_dir; } else { fprintf(stderr, "Usage: cd \n"); } continue; } cmd = cmd_find(cmdline->argv[0]); if (!cmd) { int i; fprintf(stderr,"Unknown command: %s\n", cmdline->argv[0]); fprintf(stderr,"Available commands:\n"); for(i=0;cmd_array[i].name;i++) if (cmd_array[i].fn != cmd_shell) fprintf(stderr," - %s : %s\n",cmd_array[i].name, cmd_array[i].description); } else if (cmd->fn != cmd_shell) { int out = -1; if (cmdline->redir) { int fd; if (cmdline->piped) { if ((fd = pipe_exec(cmdline->redir)) < 0) { fprintf(stderr, "Error executing pipe command: %s\n", strerror(errno)); continue; } } else if ((fd = open(cmdline->redir,O_CREAT|O_WRONLY| (cmdline->append?O_APPEND:O_TRUNC), 0666)) < 0) { fprintf(stderr, "Error opening %s: %s\n",cmdline->redir, strerror(errno)); continue; } out=dup(1); dup2(fd,1); close(fd); } cmd->fn(cur_dir,cmdline->argc-1,&cmdline->argv[1]); if (cmdline->redir) { dup2(out,1); close(out); if (cmdline->piped) wait(NULL); } } } while (1); cleanup: vmfs_dir_close(cur_dir); freecmd(cmdline); return(0); } int main(int argc,char *argv[]) { vmfs_fs_t *fs; vmfs_dir_t *root_dir; struct cmd *cmd = NULL; int arg, ret; vmfs_flags_t flags; if (argc < 3) { show_usage(argv[0]); return(0); } /* Scan arguments for a command */ for (arg = 1; arg < argc; arg++) { if ((cmd = cmd_find(argv[arg]))) break; } if (!cmd) { show_usage(argv[0]); return(0); } flags.packed = 0; #ifdef VMFS_WRITE flags.read_write = 1; #endif flags.allow_missing_extents = 1; argv[arg] = NULL; if (!(fs = vmfs_fs_open(&argv[1], flags))) { fprintf(stderr,"Unable to open filesystem\n"); exit(EXIT_FAILURE); } if (!(root_dir = vmfs_dir_open_from_blkid(fs,VMFS_BLK_FD_BUILD(0, 0, 0)))) { fprintf(stderr,"Unable to open root directory\n"); exit(EXIT_FAILURE); } ret = cmd->fn(root_dir,argc-arg-1,&argv[arg+1]); vmfs_dir_close(root_dir); vmfs_fs_close(fs); return(ret); } vmfs-tools/libvmfs/0000755000000000000000000000000011733555664011536 5ustar vmfs-tools/libvmfs/vmfs_block.c0000644000000000000000000002520711733555434014030 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS blocks. */ #include #include #include #include #include #include "utils.h" #include "vmfs.h" /* Get bitmap info (bitmap type,entry and item) from a block ID */ int vmfs_block_get_info(uint32_t blk_id, vmfs_block_info_t *info) { uint32_t blk_type; blk_type = VMFS_BLK_TYPE(blk_id); switch(blk_type) { /* File Block */ case VMFS_BLK_TYPE_FB: info->entry = 0; info->item = VMFS_BLK_FB_ITEM(blk_id); info->flags = VMFS_BLK_FB_FLAGS(blk_id); break; /* Sub-Block */ case VMFS_BLK_TYPE_SB: info->entry = VMFS_BLK_SB_ENTRY(blk_id); info->item = VMFS_BLK_SB_ITEM(blk_id); info->flags = VMFS_BLK_SB_FLAGS(blk_id); break; /* Pointer Block */ case VMFS_BLK_TYPE_PB: info->entry = VMFS_BLK_PB_ENTRY(blk_id); info->item = VMFS_BLK_PB_ITEM(blk_id); info->flags = VMFS_BLK_PB_FLAGS(blk_id); info->flags = 0; break; /* Inode */ case VMFS_BLK_TYPE_FD: info->entry = VMFS_BLK_FD_ENTRY(blk_id); info->item = VMFS_BLK_FD_ITEM(blk_id); info->flags = VMFS_BLK_FD_FLAGS(blk_id); info->flags = 0; break; default: return(-1); } info->type = blk_type; return(0); } /* Get block status (allocated or free) */ int vmfs_block_get_status(const vmfs_fs_t *fs,uint32_t blk_id) { vmfs_bitmap_entry_t entry; vmfs_bitmap_t *bmp; vmfs_block_info_t info; if (vmfs_block_get_info(blk_id,&info) == -1) return(-1); if (!(bmp = vmfs_fs_get_bitmap(fs, info.type))) return(-1); if (vmfs_bitmap_get_entry(bmp,info.entry,info.item,&entry) == -1) return(-1); return(vmfs_bitmap_get_item_status(&bmp->bmh,&entry,info.entry,info.item)); } /* Allocate or free the specified block */ static int vmfs_block_set_status(const vmfs_fs_t *fs,uint32_t blk_id, int status) { DECL_ALIGNED_BUFFER(buf,VMFS_BITMAP_ENTRY_SIZE); vmfs_bitmap_entry_t entry; vmfs_bitmap_t *bmp; vmfs_block_info_t info; if (vmfs_block_get_info(blk_id,&info) == -1) return(-1); if (!(bmp = vmfs_fs_get_bitmap(fs, info.type))) return(-1); if (vmfs_bitmap_get_entry(bmp,info.entry,info.item,&entry) == -1) return(-1); /* Lock the bitmap entry to ensure exclusive access */ if (!vmfs_metadata_lock((vmfs_fs_t *)fs,entry.mdh.pos, buf,buf_len,&entry.mdh) == -1) return(-1); /* Mark the item as allocated */ if (vmfs_bitmap_set_item_status(&bmp->bmh,&entry, info.entry,info.item,status) == -1) { vmfs_metadata_unlock((vmfs_fs_t *)fs,&entry.mdh); return(-1); } /* Update entry and release lock */ vmfs_bme_update(fs,&entry); vmfs_metadata_unlock((vmfs_fs_t *)fs,&entry.mdh); return(0); } /* Allocate the specified block */ int vmfs_block_alloc_specified(const vmfs_fs_t *fs,uint32_t blk_id) { return(vmfs_block_set_status(fs,blk_id,1)); } /* Free the specified block */ int vmfs_block_free(const vmfs_fs_t *fs,uint32_t blk_id) { return(vmfs_block_set_status(fs,blk_id,0)); } /* Allocate a single block */ int vmfs_block_alloc(const vmfs_fs_t *fs,uint32_t blk_type,uint32_t *blk_id) { vmfs_bitmap_t *bmp; vmfs_bitmap_entry_t entry; uint32_t item,addr; if (!(bmp = vmfs_fs_get_bitmap(fs, blk_type))) return(-EINVAL); if (vmfs_bitmap_find_free_items(bmp,1,&entry) == -1) return(-ENOSPC); if (vmfs_bitmap_alloc_item(&entry,&item) == -1) { vmfs_metadata_unlock((vmfs_fs_t *)fs,&entry.mdh); return(-ENOSPC); } vmfs_bme_update(fs,&entry); vmfs_metadata_unlock((vmfs_fs_t *)fs,&entry.mdh); switch(blk_type) { case VMFS_BLK_TYPE_FB: addr = (entry.id * bmp->bmh.items_per_bitmap_entry) + item; *blk_id = VMFS_BLK_FB_BUILD(addr, 0); break; case VMFS_BLK_TYPE_SB: *blk_id = VMFS_BLK_SB_BUILD(entry.id, item, 0); break; case VMFS_BLK_TYPE_PB: *blk_id = VMFS_BLK_PB_BUILD(entry.id, item, 0); break; case VMFS_BLK_TYPE_FD: *blk_id = VMFS_BLK_FD_BUILD(entry.id, item, 0); break; } return(0); } /* Zeroize a file block */ int vmfs_block_zeroize_fb(const vmfs_fs_t *fs,uint32_t blk_id) { DECL_ALIGNED_BUFFER(buf,M_DIO_BLK_SIZE); uint32_t blk_item; off_t pos,len; if (VMFS_BLK_TYPE(blk_id) != VMFS_BLK_TYPE_FB) return(-EINVAL); memset(buf,0,buf_len); blk_item = VMFS_BLK_FB_ITEM(blk_id); len = vmfs_fs_get_blocksize(fs); pos = 0; while(pos < len) { if (vmfs_fs_write(fs,blk_item,pos,buf,buf_len) != buf_len) return(-EIO); pos += buf_len; } return(0); } /* Free blocks hold by a pointer block */ int vmfs_block_free_pb(const vmfs_fs_t *fs,uint32_t pb_blk, u_int start,u_int end) { DECL_ALIGNED_BUFFER(buf,fs->pbc->bmh.data_size); uint32_t pbc_entry,pbc_item; uint32_t blk_id; int i,count = 0; if (VMFS_BLK_TYPE(pb_blk) != VMFS_BLK_TYPE_PB) return(-EINVAL); pbc_entry = VMFS_BLK_PB_ENTRY(pb_blk); pbc_item = VMFS_BLK_PB_ITEM(pb_blk); if (!vmfs_bitmap_get_item(fs->pbc,pbc_entry,pbc_item,buf)) return(-EIO); for(i=start;ipbc,pbc_entry,pbc_item,buf)) return(-EIO); } return(count); } /* Read a piece of a sub-block */ ssize_t vmfs_block_read_sb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len) { DECL_ALIGNED_BUFFER_WOL(tmpbuf,fs->sbc->bmh.data_size); uint32_t offset,sbc_entry,sbc_item; size_t clen; offset = pos % fs->sbc->bmh.data_size; clen = m_min(fs->sbc->bmh.data_size - offset,len); sbc_entry = VMFS_BLK_SB_ENTRY(blk_id); sbc_item = VMFS_BLK_SB_ITEM(blk_id); if (!vmfs_bitmap_get_item(fs->sbc,sbc_entry,sbc_item,tmpbuf)) return(-EIO); memcpy(buf,tmpbuf+offset,clen); return(clen); } /* Write a piece of a sub-block */ ssize_t vmfs_block_write_sb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len) { DECL_ALIGNED_BUFFER_WOL(tmpbuf,fs->sbc->bmh.data_size); uint32_t offset,sbc_entry,sbc_item; size_t clen; offset = pos % fs->sbc->bmh.data_size; clen = m_min(fs->sbc->bmh.data_size - offset,len); sbc_entry = VMFS_BLK_SB_ENTRY(blk_id); sbc_item = VMFS_BLK_SB_ITEM(blk_id); /* If we write completely the sub-block, no need to read something */ if (!offset && (clen == fs->sbc->bmh.data_size)) { if (!vmfs_bitmap_set_item(fs->sbc,sbc_entry,sbc_item,tmpbuf)) return(-EIO); return(clen); } /* Read the full block and update a piece of it */ if (!vmfs_bitmap_get_item(fs->sbc,sbc_entry,sbc_item,tmpbuf)) return(-EIO); memcpy(tmpbuf+offset,buf,clen); if (!vmfs_bitmap_set_item(fs->sbc,sbc_entry,sbc_item,tmpbuf)) return(-EIO); return(clen); } /* Read a piece of a file block */ ssize_t vmfs_block_read_fb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len) { uint64_t offset,n_offset,blk_size; size_t clen,n_clen; uint32_t fb_item; u_char *tmpbuf; blk_size = vmfs_fs_get_blocksize(fs); offset = pos % blk_size; clen = m_min(blk_size - offset,len); /* Use "normalized" offset / length to access data (for direct I/O) */ n_offset = offset & ~(M_DIO_BLK_SIZE - 1); n_clen = ALIGN_NUM(clen + (offset - n_offset),M_DIO_BLK_SIZE); fb_item = VMFS_BLK_FB_ITEM(blk_id); /* If everything is aligned for direct I/O, store directly in user buffer */ if ((n_offset == offset) && (n_clen == clen) && ALIGN_CHECK((uintptr_t)buf,M_DIO_BLK_SIZE)) { if (vmfs_fs_read(fs,fb_item,n_offset,buf,n_clen) != n_clen) return(-EIO); return(n_clen); } /* Allocate a temporary buffer and copy result to user buffer */ if (!(tmpbuf = iobuffer_alloc(n_clen))) return(-1); if (vmfs_fs_read(fs,fb_item,n_offset,tmpbuf,n_clen) != n_clen) { iobuffer_free(tmpbuf); return(-EIO); } memcpy(buf,tmpbuf+(offset-n_offset),clen); iobuffer_free(tmpbuf); return(clen); } /* Write a piece of a file block */ ssize_t vmfs_block_write_fb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len) { uint64_t offset,n_offset,blk_size; size_t clen,n_clen; uint32_t fb_item; u_char *tmpbuf; blk_size = vmfs_fs_get_blocksize(fs); offset = pos % blk_size; clen = m_min(blk_size - offset,len); /* Use "normalized" offset / length to access data (for direct I/O) */ n_offset = offset & ~(M_DIO_BLK_SIZE - 1); n_clen = ALIGN_NUM(clen + (offset - n_offset),M_DIO_BLK_SIZE); fb_item = VMFS_BLK_FB_ITEM(blk_id); /* * If everything is aligned for direct I/O, write directly from user * buffer. */ if ((n_offset == offset) && (n_clen == clen) && ALIGN_CHECK((uintptr_t)buf,M_DIO_BLK_SIZE)) { if (vmfs_fs_write(fs,fb_item,n_offset,buf,n_clen) != n_clen) return(-EIO); return(n_clen); } /* Allocate a temporary buffer */ if (!(tmpbuf = iobuffer_alloc(n_clen))) return(-1); /* Read the original block and add user data */ if (vmfs_fs_read(fs,fb_item,n_offset,tmpbuf,n_clen) != n_clen) goto err_io; memcpy(tmpbuf+(offset-n_offset),buf,clen); /* Write the modified block */ if (vmfs_fs_write(fs,fb_item,n_offset,tmpbuf,n_clen) != n_clen) goto err_io; iobuffer_free(tmpbuf); return(clen); err_io: iobuffer_free(tmpbuf); return(-EIO); } vmfs-tools/libvmfs/utils.c0000644000000000000000000001212011733555434013031 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * Utility functions. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #ifdef NO_POSIX_MEMALIGN #include #endif #include "utils.h" /* Convert an UUID into a string */ char *m_uuid_to_str(const uuid_t uuid,char *str) { uint32_t time_low; uint32_t time_mid; uint16_t clock_seq; time_low = read_le32(uuid,0); time_mid = read_le32(uuid,4); clock_seq = read_le16(uuid,8); sprintf(str, "%02x%02x%02x%02x-%02x%02x%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", time_low >> 24, time_low >> 16 & 0xff, time_low >> 8 & 0xff, time_low & 0xff, time_mid >> 24, time_mid >> 16 & 0xff, time_mid >> 8 & 0xff, time_mid & 0xff, clock_seq >> 8 & 0xff, clock_seq & 0xff, uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); return str; } /* Convert a timestamp to a string */ char *m_ctime(const time_t *ct,char *buf,size_t buf_len) { struct tm ctm; localtime_r(ct,&ctm); snprintf(buf,buf_len,"%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d", ctm.tm_year + 1900, ctm.tm_mon + 1, ctm.tm_mday, ctm.tm_hour, ctm.tm_min, ctm.tm_sec); return buf; } struct fmode_info { u_int flag; char c; int pos; }; static struct fmode_info fmode_flags[] = { { S_IFDIR, 'd', 0 }, { S_IFLNK, 'l', 0 }, { S_IRUSR, 'r', 1 }, { S_IWUSR, 'w', 2 }, { S_IXUSR, 'x', 3 }, { S_IRGRP, 'r', 4 }, { S_IWGRP, 'w', 5 }, { S_IXGRP, 'x', 6 }, { S_IROTH, 'r', 7 }, { S_IWOTH, 'w', 8 }, { S_IXOTH, 'x', 9 }, { S_ISUID, 's', 3 }, { S_ISVTX, 't', 9 }, { 0, 0, -1, }, }; /* Convert a file mode to a string */ char *m_fmode_to_str(u_int mode,char *buf) { struct fmode_info *fi; int i; for(i=0;i<10;i++) buf[i] = '-'; buf[10] = 0; for(i=0;fmode_flags[i].flag;i++) { fi = &fmode_flags[i]; if ((mode & fi->flag) == fi->flag) buf[fi->pos] = fi->c; } return buf; } /* Count the number of bits set in a byte */ int bit_count(u_char val) { static int qb[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, }; return(qb[val >> 4] + qb[val & 0x0F]); } /* Allocate a buffer with alignment compatible for direct I/O */ u_char *iobuffer_alloc(size_t len) { size_t buf_len; void *buf; buf_len = ALIGN_NUM(len,M_DIO_BLK_SIZE); #ifdef NO_POSIX_MEMALIGN if (!(buf = memalign(M_DIO_BLK_SIZE,buf_len))) #else if (posix_memalign((void **)&buf,M_DIO_BLK_SIZE,buf_len)) #endif return NULL; return buf; } /* Free a buffer previously allocated by iobuffer_alloc() */ void iobuffer_free(u_char *buf) { free(buf); } /* Read from file descriptor at a given offset */ ssize_t m_pread(int fd,void *buf,size_t count,off_t offset) { int max_retries = 10; u_char *ptr = (u_char *)buf; size_t hlen = 0; ssize_t len; while(hlen < count) { len = pread(fd,ptr,count-hlen,offset+hlen); if (len < 0) { if (errno == EIO) { if (max_retries-- == 0) return(-1); continue; } if (errno != EINTR) return(-1); } else { if (len == 0) break; hlen += len; ptr += len; } } return(hlen); } /* Write to a file descriptor at a given offset */ ssize_t m_pwrite(int fd,const void *buf,size_t count,off_t offset) { int max_retries = 10; u_char *ptr = (u_char *)buf; size_t hlen = 0; ssize_t len; while(hlen < count) { len = pwrite(fd,ptr,count-hlen,offset+hlen); if (len < 0) { if (errno == EIO) { if (max_retries-- == 0) return(-1); continue; } if (errno != EINTR) return(-1); } else { if (len == 0) break; hlen += len; ptr += len; } } return(hlen); } /* Returns directory name */ char *m_dirname(const char *path) { char *dirc = strdup(path); char *dname = strdup(dirname(dirc)); free(dirc); return(dname); } /* Returns base name */ char *m_basename(const char *path) { char *basec = strdup(path); char *bname = strdup(basename(basec)); free(basec); return(bname); } vmfs-tools/libvmfs/vmfs_bitmap.h0000644000000000000000000001305011733407353014204 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_BITMAP_H #define VMFS_BITMAP_H #include /* Bitmaps magic numbers */ #define VMFS_BITMAP_MAGIC_FBB 0x10c00002 #define VMFS_BITMAP_MAGIC_SBC 0x10c00003 #define VMFS_BITMAP_MAGIC_PBC 0x10c00004 #define VMFS_BITMAP_MAGIC_FDC 0x10c00005 /* === Bitmap header === */ struct vmfs_bitmap_header { uint32_t items_per_bitmap_entry; uint32_t bmp_entries_per_area; uint32_t hdr_size; uint32_t data_size; uint32_t area_size; uint32_t total_items; uint32_t area_count; }; /* === Bitmap entry === */ #define VMFS_BITMAP_ENTRY_SIZE 0x400 #define VMFS_BITMAP_BMP_MAX_SIZE 0x1f0 struct vmfs_bitmap_entry_raw { struct vmfs_metadata_hdr_raw mdh; /* Metadata header */ uint32_t id; /* Bitmap ID */ uint32_t total; /* Total number of items in this entry */ uint32_t free; /* Free items */ uint32_t ffree; /* First free item */ uint8_t bitmap[VMFS_BITMAP_BMP_MAX_SIZE]; } __attribute__((packed)); #define VMFS_BME_OFS_ID offsetof(struct vmfs_bitmap_entry_raw, id) #define VMFS_BME_OFS_TOTAL offsetof(struct vmfs_bitmap_entry_raw, total) #define VMFS_BME_OFS_FREE offsetof(struct vmfs_bitmap_entry_raw, free) #define VMFS_BME_OFS_FFREE offsetof(struct vmfs_bitmap_entry_raw, ffree) #define VMFS_BME_OFS_BITMAP offsetof(struct vmfs_bitmap_entry_raw, bitmap) struct vmfs_bitmap_entry { vmfs_metadata_hdr_t mdh; uint32_t id; uint32_t total; uint32_t free; uint32_t ffree; uint8_t bitmap[VMFS_BITMAP_BMP_MAX_SIZE]; }; /* A bitmap file instance */ struct vmfs_bitmap { vmfs_file_t *f; vmfs_bitmap_header_t bmh; }; /* Callback prototype for vmfs_bitmap_foreach() */ typedef void (*vmfs_bitmap_foreach_cbk_t)(vmfs_bitmap_t *b,uint32_t addr, void *opt_arg); /* Read a bitmap entry */ int vmfs_bme_read(vmfs_bitmap_entry_t *bme,const u_char *buf,int copy_bitmap); /* Write a bitmap entry */ int vmfs_bme_write(const vmfs_bitmap_entry_t *bme,u_char *buf); /* Update a bitmap entry on disk */ int vmfs_bme_update(const vmfs_fs_t *fs,const vmfs_bitmap_entry_t *bme); /* Read a bitmap entry given a block id */ int vmfs_bitmap_get_entry(vmfs_bitmap_t *b,uint32_t entry,uint32_t item, vmfs_bitmap_entry_t *bmp_entry); /* Get position of an item */ off_t vmfs_bitmap_get_item_pos(vmfs_bitmap_t *b,uint32_t entry,uint32_t item); /* Read a bitmap item from its entry and item numbers */ bool vmfs_bitmap_get_item(vmfs_bitmap_t *b, uint32_t entry, uint32_t item, u_char *buf); /* Write a bitmap given its entry and item numbers */ bool vmfs_bitmap_set_item(vmfs_bitmap_t *b,uint32_t entry,uint32_t item, u_char *buf); /* Mark an item as free or allocated */ int vmfs_bitmap_set_item_status(const vmfs_bitmap_header_t *bmh, vmfs_bitmap_entry_t *bmp_entry, uint32_t entry,uint32_t item, int status); /* Get the status of an item (0=free,1=allocated) */ int vmfs_bitmap_get_item_status(const vmfs_bitmap_header_t *bmh, vmfs_bitmap_entry_t *bmp_entry, uint32_t entry,uint32_t item); /* Find a free item in a bitmap entry and mark it allocated */ int vmfs_bitmap_alloc_item(vmfs_bitmap_entry_t *bmp_entry,uint32_t *item); /* Find a bitmap entry with at least "num_items" free in the specified area */ int vmfs_bitmap_area_find_free_items(vmfs_bitmap_t *b, u_int area,u_int num_items, vmfs_bitmap_entry_t *entry); /* Find a bitmap entry with at least "num_items" free (scan all areas) */ int vmfs_bitmap_find_free_items(vmfs_bitmap_t *b,u_int num_items, vmfs_bitmap_entry_t *entry); /* Count the total number of allocated items in a bitmap area */ uint32_t vmfs_bitmap_area_allocated_items(vmfs_bitmap_t *b,u_int area); /* Count the total number of allocated items in a bitmap */ uint32_t vmfs_bitmap_allocated_items(vmfs_bitmap_t *b); /* Call a user function for each allocated item in a bitmap */ void vmfs_bitmap_area_foreach(vmfs_bitmap_t *b,u_int area, vmfs_bitmap_foreach_cbk_t cbk, void *opt_arg); /* Call a user function for each allocated item in a bitmap */ void vmfs_bitmap_foreach(vmfs_bitmap_t *b,vmfs_bitmap_foreach_cbk_t cbk, void *opt_arg); /* Check coherency of a bitmap file */ int vmfs_bitmap_check(vmfs_bitmap_t *b); /* Open a bitmap file */ vmfs_bitmap_t *vmfs_bitmap_open_at(vmfs_dir_t *d, const char *name); vmfs_bitmap_t *vmfs_bitmap_open_from_inode(const vmfs_inode_t *inode); /* Close a bitmap file */ void vmfs_bitmap_close(vmfs_bitmap_t *b); #endif vmfs-tools/libvmfs/vmfs_fs.h0000644000000000000000000001037111733555434013347 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_FS_H #define VMFS_FS_H #include /* === FS Info === */ #define VMFS_FSINFO_BASE 0x0200000 #define VMFS_FSINFO_MAGIC 0x2fabf15e struct vmfs_fsinfo_raw { uint32_t magic; uint32_t volver; u_char ver; uuid_t uuid; uint32_t mode; char label[128]; uint32_t dev_blocksize; uint64_t blocksize; uint32_t ctime; /* ctime? in seconds */ uint32_t _unknown3; uuid_t lvm_uuid; u_char _unknown4[16]; uint32_t fdc_header_size; uint32_t fdc_bitmap_count; uint32_t subblock_size; } __attribute__((packed)); #define VMFS_FSINFO_OFS_MAGIC offsetof(struct vmfs_fsinfo_raw, magic) #define VMFS_FSINFO_OFS_VOLVER offsetof(struct vmfs_fsinfo_raw, volver) #define VMFS_FSINFO_OFS_VER offsetof(struct vmfs_fsinfo_raw, ver) #define VMFS_FSINFO_OFS_UUID offsetof(struct vmfs_fsinfo_raw, uuid) #define VMFS_FSINFO_OFS_MODE offsetof(struct vmfs_fsinfo_raw, mode) #define VMFS_FSINFO_OFS_LABEL offsetof(struct vmfs_fsinfo_raw, label) #define VMFS_FSINFO_OFS_BLKSIZE offsetof(struct vmfs_fsinfo_raw, blocksize) #define VMFS_FSINFO_OFS_CTIME offsetof(struct vmfs_fsinfo_raw, ctime) #define VMFS_FSINFO_OFS_LVM_UUID offsetof(struct vmfs_fsinfo_raw, lvm_uuid) #define VMFS_FSINFO_OFS_SBSIZE offsetof(struct vmfs_fsinfo_raw, subblock_size) #define VMFS_FSINFO_OFS_FDC_HEADER_SIZE \ offsetof(struct vmfs_fsinfo_raw, fdc_header_size) #define VMFS_FSINFO_OFS_FDC_BITMAP_COUNT \ offsetof(struct vmfs_fsinfo_raw, fdc_bitmap_count) #define VMFS_FSINFO_OFS_LABEL_SIZE sizeof(((struct vmfs_fsinfo_raw *)(0))->label) struct vmfs_fsinfo { uint32_t magic; uint32_t vol_version; uint32_t version; uint32_t mode; uuid_t uuid; char *label; time_t ctime; uint64_t block_size; uint32_t subblock_size; uint32_t fdc_header_size; uint32_t fdc_bitmap_count; uuid_t lvm_uuid; }; /* === VMFS filesystem === */ #define VMFS_INODE_HASH_BUCKETS 256 struct vmfs_fs { int debug_level; /* FS information */ vmfs_fsinfo_t fs_info; /* Associated VMFS Device */ vmfs_device_t *dev; /* Meta-files containing file system structures */ vmfs_bitmap_t *fbb,*sbc,*pbc,*fdc; /* Heartbeat used to lock meta-data */ vmfs_heartbeat_t hb; u_int hb_id; uint64_t hb_seq; u_int hb_refcount; uint64_t hb_expire; /* Counter for "gen" field in inodes */ uint32_t inode_gen; /* In-core inodes hash table */ u_int inode_hash_buckets; vmfs_inode_t **inodes; }; /* Get the bitmap corresponding to the given type */ static inline vmfs_bitmap_t *vmfs_fs_get_bitmap(const vmfs_fs_t *fs, enum vmfs_block_type type) { if ((type > VMFS_BLK_TYPE_NONE) && (type < VMFS_BLK_TYPE_MAX)) { vmfs_bitmap_t * const *bitmap = (vmfs_bitmap_t **)&fs->fbb; return bitmap[type - 1]; } return NULL; } /* Get block size of a volume */ static inline uint64_t vmfs_fs_get_blocksize(const vmfs_fs_t *fs) { return(fs->fs_info.block_size); } /* Get read-write status of a FS */ static inline bool vmfs_fs_readwrite(const vmfs_fs_t *fs) { return(fs->dev->write); } /* Read a block from the filesystem */ ssize_t vmfs_fs_read(const vmfs_fs_t *fs,uint32_t blk,off_t offset, u_char *buf,size_t len); /* Write a block to the filesystem */ ssize_t vmfs_fs_write(const vmfs_fs_t *fs,uint32_t blk,off_t offset, const u_char *buf,size_t len); /* Open a FS */ vmfs_fs_t *vmfs_fs_open(char **paths, vmfs_flags_t flags); /* Close a FS */ void vmfs_fs_close(vmfs_fs_t *fs); #endif vmfs-tools/libvmfs/vmfs_metadata.h0000644000000000000000000000526011733303644014512 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_METADATA_H #define VMFS_METADATA_H #include #define VMFS_METADATA_HDR_SIZE 512 struct vmfs_metadata_hdr_raw { uint32_t magic; /* Magic number */ uint64_t pos; /* Position in the volume */ uint64_t hb_pos; /* Heartbeat position */ uint64_t hb_seq; /* Heartbeat sequence */ uint64_t obj_seq; /* Object sequence */ uint32_t hb_lock; /* Heartbeat lock flag */ uuid_t hb_uuid; /* UUID of locking server */ uint64_t mtime; u_char pad1[0x1c0]; /* Padding/unknown */ } __attribute__((packed)); #define VMFS_MDH_OFS_MAGIC offsetof(struct vmfs_metadata_hdr_raw, magic) #define VMFS_MDH_OFS_POS offsetof(struct vmfs_metadata_hdr_raw, pos) #define VMFS_MDH_OFS_HB_POS offsetof(struct vmfs_metadata_hdr_raw, hb_pos) #define VMFS_MDH_OFS_HB_SEQ offsetof(struct vmfs_metadata_hdr_raw, hb_seq) #define VMFS_MDH_OFS_OBJ_SEQ offsetof(struct vmfs_metadata_hdr_raw, obj_seq) #define VMFS_MDH_OFS_HB_LOCK offsetof(struct vmfs_metadata_hdr_raw, hb_lock) #define VMFS_MDH_OFS_HB_UUID offsetof(struct vmfs_metadata_hdr_raw, hb_uuid) #define VMFS_MDH_OFS_MTIME offsetof(struct vmfs_metadata_hdr_raw, mtime) struct vmfs_metadata_hdr { uint32_t magic; uint64_t pos; uint64_t hb_pos; uint64_t hb_seq; uint64_t obj_seq; uint32_t hb_lock; uuid_t hb_uuid; uint64_t mtime; }; static inline bool vmfs_metadata_is_locked(vmfs_metadata_hdr_t *mdh) { return(mdh->hb_lock != 0); } /* Read a metadata header */ int vmfs_metadata_hdr_read(vmfs_metadata_hdr_t *mdh,const u_char *buf); /* Write a metadata header */ int vmfs_metadata_hdr_write(const vmfs_metadata_hdr_t *mdh,u_char *buf); /* Lock and read metadata at specified position */ int vmfs_metadata_lock(vmfs_fs_t *fs,off_t pos,u_char *buf,size_t buf_len, vmfs_metadata_hdr_t *mdh); /* Unlock metadata */ int vmfs_metadata_unlock(vmfs_fs_t *fs,vmfs_metadata_hdr_t *mdh); #endif vmfs-tools/libvmfs/vmfs_host.h0000644000000000000000000000203711733303644013706 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_HOST_H #define VMFS_HOST_H /* Initialize host info (UUID,uptime,...) */ int vmfs_host_init(void); /* Show host info */ void vmfs_host_show_info(void); /* Get host uptime (in usecs) */ uint64_t vmfs_host_get_uptime(void); /* Get host UUID */ void vmfs_host_get_uuid(uuid_t dst); #endif vmfs-tools/libvmfs/vmfs_volume.c0000644000000000000000000001513611733555434014245 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2011 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS volumes. */ #define _GNU_SOURCE #include #include #include #include #include #include #include "vmfs.h" #include "scsi.h" /* Read a raw block of data on logical volume */ static ssize_t vmfs_vol_read(const vmfs_device_t *dev,off_t pos, u_char *buf,size_t len) { vmfs_volume_t *vol = (vmfs_volume_t *) dev; pos += vol->vmfs_base + 0x1000000; return(m_pread(vol->fd,buf,len,pos)); } /* Write a raw block of data on logical volume */ static ssize_t vmfs_vol_write(const vmfs_device_t *dev,off_t pos, const u_char *buf,size_t len) { vmfs_volume_t *vol = (vmfs_volume_t *) dev; pos += vol->vmfs_base + 0x1000000; return(m_pwrite(vol->fd,buf,len,pos)); } /* Volume reservation */ static int vmfs_vol_reserve(const vmfs_device_t *dev, off_t pos) { vmfs_volume_t *vol = (vmfs_volume_t *) dev; return(scsi_reserve(vol->fd)); } /* Volume release */ static int vmfs_vol_release(const vmfs_device_t *dev, off_t pos) { vmfs_volume_t *vol = (vmfs_volume_t *) dev; return(scsi_release(vol->fd)); } /* * Check if physical volume support reservation. * TODO: We should probably check some capabilities info. */ static int vmfs_vol_check_reservation(vmfs_volume_t *vol) { int res[2]; /* The device must be a block device */ if (!vol->is_blkdev) return(0); /* Try SCSI commands */ res[0] = scsi_reserve(vol->fd); res[1] = scsi_release(vol->fd); /* Error with the commands */ if ((res[0] < 0) || (res[1] < 0)) return(0); vol->dev.reserve = vmfs_vol_reserve; vol->dev.release = vmfs_vol_release; return(1); } /* Read volume information */ static int vmfs_volinfo_read(vmfs_volume_t *volume) { DECL_ALIGNED_BUFFER(buf,1024); vmfs_volinfo_t *vol = &volume->vol_info; if (m_pread(volume->fd,buf,buf_len,volume->vmfs_base) != buf_len) return(-1); vol->magic = read_le32(buf,VMFS_VOLINFO_OFS_MAGIC); if (vol->magic != VMFS_VOLINFO_MAGIC) { fprintf(stderr,"VMFS VolInfo: invalid magic number 0x%8.8x\n", vol->magic); return(-1); } vol->version = read_le32(buf,VMFS_VOLINFO_OFS_VER); vol->size = read_le32(buf,VMFS_VOLINFO_OFS_SIZE); vol->lun = buf[VMFS_VOLINFO_OFS_LUN]; vol->name = strndup((char *)buf+VMFS_VOLINFO_OFS_NAME, VMFS_VOLINFO_OFS_NAME_SIZE); read_uuid(buf,VMFS_VOLINFO_OFS_UUID,&vol->uuid); vol->lvm_size = read_le64(buf,VMFS_LVMINFO_OFS_SIZE); vol->blocks = read_le64(buf,VMFS_LVMINFO_OFS_BLKS); vol->num_segments = read_le32(buf,VMFS_LVMINFO_OFS_NUM_SEGMENTS); vol->first_segment = read_le32(buf,VMFS_LVMINFO_OFS_FIRST_SEGMENT); vol->last_segment = read_le32(buf,VMFS_LVMINFO_OFS_LAST_SEGMENT); vol->num_extents = read_le32(buf,VMFS_LVMINFO_OFS_NUM_EXTENTS); read_uuid(buf,VMFS_LVMINFO_OFS_UUID,&vol->lvm_uuid); #ifdef VMFS_CHECK { /* The LVM UUID also appears as a string, so we can check whether our formatting function is correct. */ char uuidstr1[M_UUID_BUFLEN], uuidstr2[M_UUID_BUFLEN]; memcpy(uuidstr1,buf+VMFS_LVMINFO_OFS_UUID_STR,M_UUID_BUFLEN-1); uuidstr1[M_UUID_BUFLEN-1] = 0; if (memcmp(m_uuid_to_str(vol->lvm_uuid,uuidstr2),uuidstr1, M_UUID_BUFLEN-1)) { fprintf(stderr, "uuid mismatch:\n%s\n%s\n",uuidstr1,uuidstr2); return(-1); } } #endif return(0); } /* Close a VMFS volume */ static void vmfs_vol_close(vmfs_device_t *dev) { vmfs_volume_t *vol = (vmfs_volume_t *) dev; if (!vol) return; close(vol->fd); free(vol->device); free(vol->vol_info.name); free(vol); } /* Open a VMFS volume */ vmfs_volume_t *vmfs_vol_open(const char *filename,vmfs_flags_t flags) { vmfs_volume_t *vol; struct stat st; int file_flags; if (!(vol = calloc(1,sizeof(*vol)))) return NULL; if (!(vol->device = strdup(filename))) goto err_filename; file_flags = (flags.read_write) ? O_RDWR : O_RDONLY; if ((vol->fd = open(vol->device,file_flags)) < 0) { perror("open"); goto err_open; } vol->flags = flags; fstat(vol->fd,&st); vol->is_blkdev = S_ISBLK(st.st_mode); #if defined(O_DIRECT) || defined(DIRECTIO_ON) if (vol->is_blkdev) #ifdef O_DIRECT fcntl(vol->fd, F_SETFL, O_DIRECT); #else #ifdef DIRECTIO_ON directio(vol->fd, DIRECTIO_ON); #endif #endif #endif vol->vmfs_base = VMFS_VOLINFO_BASE; /* Read volume information */ if (vmfs_volinfo_read(vol) == -1) { DECL_ALIGNED_BUFFER(buf,512); uint16_t magic; fprintf(stderr,"VMFS: Unable to read volume information\n"); fprintf(stderr,"Trying to find partitions\n"); m_pread(vol->fd,buf,buf_len,0); magic = read_le16(buf, 510); if ((magic == 0xaa55) && (buf[450] == 0xfb)) { vol->vmfs_base += read_le32(buf, 454) * 512; if (vmfs_volinfo_read(vol) == -1) goto err_open; } else goto err_open; } /* We support only VMFS3 and VMFS5*/ if ((vol->vol_info.version != 3) && (vol->vol_info.version != 5)) { fprintf(stderr,"VMFS: Unsupported version %u\n",vol->vol_info.version); goto err_open; } if ((vol->vol_info.version == 5) && flags.read_write) { fprintf(stderr, "VMFS: Can't open VMFS read/write\n"); goto err_open; } if (vol->is_blkdev && (scsi_get_lun(vol->fd) != vol->vol_info.lun)) fprintf(stderr,"VMFS: Warning: Lun ID mismatch on %s\n", vol->device); vmfs_vol_check_reservation(vol); if (vol->flags.debug_level > 0) { printf("VMFS: volume opened successfully\n"); } vol->dev.read = vmfs_vol_read; if (vol->flags.read_write) vol->dev.write = vmfs_vol_write; vol->dev.close = vmfs_vol_close; vol->dev.uuid = &vol->vol_info.lvm_uuid; return vol; err_open: free(vol->device); err_filename: free(vol); return NULL; } vmfs-tools/libvmfs/vmfs_file.c0000644000000000000000000002342411733555434013654 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2011,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS file abstraction. */ #define _GNU_SOURCE #include #include #include #include #include "vmfs.h" /* Open a file based on an inode buffer */ vmfs_file_t *vmfs_file_open_from_inode(const vmfs_inode_t *inode) { vmfs_file_t *f; if (!(f = calloc(1,sizeof(*f)))) return NULL; f->inode = (vmfs_inode_t *)inode; return f; } /* Open a file based on a directory entry */ vmfs_file_t *vmfs_file_open_from_blkid(const vmfs_fs_t *fs,uint32_t blk_id) { vmfs_inode_t *inode; if (!(inode = vmfs_inode_acquire(fs,blk_id))) return NULL; return(vmfs_file_open_from_inode(inode)); } /* Open a file */ vmfs_file_t *vmfs_file_open_at(vmfs_dir_t *dir,const char *path) { uint32_t blk_id; if (!(blk_id = vmfs_dir_resolve_path(dir,path,1))) return(NULL); return(vmfs_file_open_from_blkid(vmfs_dir_get_fs(dir),blk_id)); } /* Create a new file entry */ int vmfs_file_create(vmfs_dir_t *d,const char *name,mode_t mode, vmfs_inode_t **inode) { vmfs_fs_t *fs = (vmfs_fs_t *)vmfs_dir_get_fs(d); vmfs_inode_t *new_inode; int res; if (!vmfs_fs_readwrite(fs)) return(-EROFS); if ((res = vmfs_inode_alloc(fs,VMFS_FILE_TYPE_FILE,mode,&new_inode)) < 0) return(res); if ((res = vmfs_dir_link_inode(d,name,new_inode)) < 0) { vmfs_block_free(fs,new_inode->id); vmfs_inode_release(new_inode); return(res); } *inode = new_inode; return(0); } /* Create a file */ vmfs_file_t *vmfs_file_create_at(vmfs_dir_t *dir,const char *path,mode_t mode) { char *dir_name,*base_name; vmfs_dir_t *d = NULL; vmfs_file_t *f = NULL; vmfs_inode_t *inode; dir_name = m_dirname(path); base_name = m_basename(path); if (!dir_name || !base_name) goto done; if (!(d = vmfs_dir_open_at(dir,dir_name))) goto done; if (vmfs_file_create(d,base_name,mode,&inode) < 0) goto done; if (!(f = vmfs_file_open_from_inode(inode))) vmfs_inode_release(inode); done: vmfs_dir_close(d); free(dir_name); free(base_name); return f; } /* Close a file */ int vmfs_file_close(vmfs_file_t *f) { if (f == NULL) return(-1); vmfs_inode_release(f->inode); free(f); return(0); } /* Read data from a file at the specified position */ ssize_t vmfs_file_pread(vmfs_file_t *f,u_char *buf,size_t len,off_t pos) { const vmfs_fs_t *fs = vmfs_file_get_fs(f); uint32_t blk_id,blk_type; uint64_t blk_size,blk_len; uint64_t file_size,offset; ssize_t res=0,rlen = 0; size_t exp_len; int err; /* We don't handle RDM files */ if (f->inode->type == VMFS_FILE_TYPE_RDM) return(-EIO); blk_size = vmfs_fs_get_blocksize(fs); file_size = vmfs_file_get_size(f); while(len > 0) { if (pos >= file_size) break; if ((err = vmfs_inode_get_block(f->inode,pos,&blk_id)) < 0) return(err); #if 0 if (f->vol->debug_level > 1) printf("vmfs_file_read: reading block 0x%8.8x\n",blk_id); #endif blk_type = VMFS_BLK_FB_TBZ(blk_id) ? VMFS_BLK_TYPE_NONE : VMFS_BLK_TYPE(blk_id); switch(blk_type) { /* Unallocated block */ case VMFS_BLK_TYPE_NONE: offset = pos % blk_size; blk_len = blk_size - offset; exp_len = m_min(blk_len,len); res = m_min(exp_len,file_size - pos); memset(buf,0,res); break; /* File-Block */ case VMFS_BLK_TYPE_FB: exp_len = m_min(len,file_size - pos); res = vmfs_block_read_fb(fs,blk_id,pos,buf,exp_len); break; /* Sub-Block */ case VMFS_BLK_TYPE_SB: { exp_len = m_min(len,file_size - pos); res = vmfs_block_read_sb(fs,blk_id,pos,buf,exp_len); break; } /* Inline in the inode */ case VMFS_BLK_TYPE_FD: if (blk_id == f->inode->id) { exp_len = m_min(len,file_size - pos); memcpy(buf, f->inode->content + pos, exp_len); res = exp_len; break; } default: fprintf(stderr,"VMFS: unknown block type 0x%2.2x\n",blk_type); return(-EIO); } /* Error while reading block, abort immediately */ if (res < 0) return(res); /* Move file position and keep track of bytes currently read */ pos += res; rlen += res; /* Move buffer position */ buf += res; len -= res; } return(rlen); } /* Write data to a file at the specified position */ ssize_t vmfs_file_pwrite(vmfs_file_t *f,u_char *buf,size_t len,off_t pos) { const vmfs_fs_t *fs = vmfs_file_get_fs(f); uint32_t blk_id,blk_type; ssize_t res=0,wlen = 0; int err; if (!vmfs_fs_readwrite(fs)) return(-EROFS); /* We don't handle RDM files */ if (f->inode->type == VMFS_FILE_TYPE_RDM) return(-EIO); while(len > 0) { if ((err = vmfs_inode_get_wrblock(f->inode,pos,&blk_id)) < 0) return(err); #if 0 if (f->vol->debug_level > 1) printf("vmfs_file_write: writing block 0x%8.8x\n",blk_id); #endif blk_type = VMFS_BLK_TYPE(blk_id); switch(blk_type) { /* File-Block */ case VMFS_BLK_TYPE_FB: res = vmfs_block_write_fb(fs,blk_id,pos,buf,len); break; /* Sub-Block */ case VMFS_BLK_TYPE_SB: res = vmfs_block_write_sb(fs,blk_id,pos,buf,len); break; default: fprintf(stderr,"VMFS: unknown block type 0x%2.2x\n",blk_type); return(-EIO); } /* Error while writing block, abort immediately */ if (res < 0) return(res); /* Move file position and keep track of bytes currently written */ pos += res; wlen += res; /* Move buffer position */ buf += res; len -= res; } /* Update file size */ if (pos > vmfs_file_get_size(f)) { f->inode->size = pos; f->inode->update_flags |= VMFS_INODE_SYNC_META; } return(wlen); } /* Dump a file */ int vmfs_file_dump(vmfs_file_t *f,off_t pos,uint64_t len,FILE *fd_out) { u_char *buf; ssize_t res; size_t clen,buf_len; if (!len) len = vmfs_file_get_size(f); buf_len = 0x100000; if (!(buf = iobuffer_alloc(buf_len))) return(-1); for(;pos < len; pos+=clen) { clen = m_min(len,buf_len); res = vmfs_file_pread(f,buf,clen,pos); if (res < 0) { fprintf(stderr,"vmfs_file_dump: problem reading input file.\n"); return(-1); } if (fwrite(buf,1,res,fd_out) != res) { fprintf(stderr,"vmfs_file_dump: error writing output file.\n"); return(-1); } if (res < clen) break; } free(buf); return(0); } /* Get file status */ int vmfs_file_fstat(const vmfs_file_t *f,struct stat *buf) { return(vmfs_inode_stat(f->inode,buf)); } /* Get file file status (follow symlink) */ int vmfs_file_stat_at(vmfs_dir_t *dir,const char *path,struct stat *buf) { uint32_t blk_id; if (!(blk_id = vmfs_dir_resolve_path(dir,path,1))) return(-ENOENT); return(vmfs_inode_stat_from_blkid(vmfs_dir_get_fs(dir),blk_id,buf)); } /* Get file file status (do not follow symlink) */ int vmfs_file_lstat_at(vmfs_dir_t *dir,const char *path,struct stat *buf) { const vmfs_dirent_t *entry; vmfs_dir_t *d; char *name; name = m_dirname(path); d = vmfs_dir_open_at(dir,name); free(name); if (!d) return(-1); name = m_basename(path); if (!strcmp(name,"/")) { free(name); return(vmfs_file_fstat(dir->dir,buf)); } entry = vmfs_dir_lookup(dir,name); free(name); if (!entry) return(-1); return(vmfs_inode_stat_from_blkid(vmfs_dir_get_fs(dir), entry->block_id,buf)); } /* Truncate a file (using a file descriptor) */ int vmfs_file_truncate(vmfs_file_t *f,off_t length) { return(vmfs_inode_truncate(f->inode,length)); } /* Truncate a file (using a path) */ int vmfs_file_truncate_at(vmfs_dir_t *dir,const char *path,off_t length) { vmfs_file_t *f; int res; if (!(f = vmfs_file_open_at(dir,path))) return(-ENOENT); res = vmfs_file_truncate(f,length); vmfs_file_close(f); return(res); } /* Change permissions of a file */ int vmfs_file_chmod(vmfs_file_t *f,mode_t mode) { return(vmfs_inode_chmod(f->inode,mode)); } /* Change permissions of a file (using a path) */ int vmfs_file_chmod_at(vmfs_dir_t *dir,const char *path,mode_t mode) { vmfs_file_t *f; int res; if (!(f = vmfs_file_open_at(dir,path))) return(-ENOENT); res = vmfs_file_chmod(f,mode); vmfs_file_close(f); return(res); } /* Delete a file */ int vmfs_file_delete(vmfs_dir_t *dir,const char *name) { vmfs_dirent_t *entry; off_t pos; if (!(entry = (vmfs_dirent_t *)vmfs_dir_lookup(dir,name))) return(-ENOENT); if ((entry->type != VMFS_FILE_TYPE_FILE) && (entry->type != VMFS_FILE_TYPE_SYMLINK)) return(-EPERM); pos = (dir->pos - 1) * VMFS_DIRENT_SIZE; return(vmfs_dir_unlink_inode(dir,pos,entry)); } vmfs-tools/libvmfs/vmfs_host.c0000644000000000000000000000336611733555434013715 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS host. */ #define _GNU_SOURCE #include #include #include "vmfs.h" static uuid_t host_uuid; static struct timeval host_tv_start; /* Initialize host info (UUID,uptime,...) */ int vmfs_host_init(void) { static bool initialized = 0; if (! initialized) { uuid_generate_time(host_uuid); gettimeofday(&host_tv_start,NULL); initialized = 1; } return(0); } /* Show host info */ void vmfs_host_show_info(void) { char uuid_str[M_UUID_BUFLEN]; printf("Host UUID : %s\n",m_uuid_to_str(host_uuid,uuid_str)); printf("Host Uptime : %"PRIu64" usecs\n",vmfs_host_get_uptime()); } /* Get host uptime (in usecs) */ uint64_t vmfs_host_get_uptime(void) { struct timeval cur_time,delta; uint64_t uptime; gettimeofday(&cur_time,NULL); timersub(&cur_time,&host_tv_start,&delta); uptime = ((uint64_t)delta.tv_sec * 1000000) + delta.tv_usec; return(uptime); } /* Get host UUID */ void vmfs_host_get_uuid(uuid_t dst) { uuid_copy(dst,host_uuid); } vmfs-tools/libvmfs/vmfs_metadata.c0000644000000000000000000000730711733555434014517 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS metadata headers. */ #include #include #include "vmfs.h" /* Read a metadata header */ int vmfs_metadata_hdr_read(vmfs_metadata_hdr_t *mdh,const u_char *buf) { mdh->magic = read_le32(buf,VMFS_MDH_OFS_MAGIC); mdh->pos = read_le64(buf,VMFS_MDH_OFS_POS); mdh->hb_pos = read_le64(buf,VMFS_MDH_OFS_HB_POS); mdh->hb_seq = read_le64(buf,VMFS_MDH_OFS_HB_SEQ); mdh->obj_seq = read_le64(buf,VMFS_MDH_OFS_OBJ_SEQ); mdh->hb_lock = read_le32(buf,VMFS_MDH_OFS_HB_LOCK); mdh->mtime = read_le64(buf,VMFS_MDH_OFS_MTIME); read_uuid(buf,VMFS_MDH_OFS_HB_UUID,&mdh->hb_uuid); return(0); } /* Write a metadata header */ int vmfs_metadata_hdr_write(const vmfs_metadata_hdr_t *mdh,u_char *buf) { memset(buf,0,VMFS_METADATA_HDR_SIZE); write_le32(buf,VMFS_MDH_OFS_MAGIC,mdh->magic); write_le64(buf,VMFS_MDH_OFS_POS,mdh->pos); write_le64(buf,VMFS_MDH_OFS_HB_POS,mdh->hb_pos); write_le64(buf,VMFS_MDH_OFS_HB_SEQ,mdh->hb_seq); write_le64(buf,VMFS_MDH_OFS_OBJ_SEQ,mdh->obj_seq); write_le32(buf,VMFS_MDH_OFS_HB_LOCK,mdh->hb_lock); write_le64(buf,VMFS_MDH_OFS_MTIME,mdh->mtime); write_uuid(buf,VMFS_MDH_OFS_HB_UUID,&mdh->hb_uuid); return(0); } /* Lock and read metadata at specified position */ int vmfs_metadata_lock(vmfs_fs_t *fs,off_t pos,u_char *buf,size_t buf_len, vmfs_metadata_hdr_t *mdh) { /* Acquire heartbeat */ if (vmfs_heartbeat_acquire(fs) == -1) return(-1); /* Reserve volume */ if (vmfs_device_reserve(fs->dev,pos) == -1) { fprintf(stderr,"VMFS: unable to reserve volume.\n"); goto err_reserve; } /* Read the complete metadata for the caller */ if (vmfs_device_read(fs->dev,pos,buf,buf_len) != buf_len) { fprintf(stderr,"VMFS: unable to read metadata.\n"); goto err_io; } vmfs_metadata_hdr_read(mdh,buf); if (mdh->hb_lock != 0) goto err_io; /* Update metadata information */ mdh->obj_seq++; mdh->hb_lock = 1; mdh->hb_pos = fs->hb.pos; mdh->hb_seq = fs->hb_seq; uuid_copy(mdh->hb_uuid,fs->hb.uuid); vmfs_metadata_hdr_write(mdh,buf); /* Rewrite the metadata header only */ if (vmfs_device_write(fs->dev,pos,buf,VMFS_METADATA_HDR_SIZE) != VMFS_METADATA_HDR_SIZE) { fprintf(stderr,"VMFS: unable to write metadata header.\n"); goto err_io; } vmfs_device_release(fs->dev,pos); return(0); err_io: vmfs_device_release(fs->dev,pos); err_reserve: vmfs_heartbeat_release(fs); return(-1); } /* Unlock metadata */ int vmfs_metadata_unlock(vmfs_fs_t *fs,vmfs_metadata_hdr_t *mdh) { DECL_ALIGNED_BUFFER(buf,VMFS_METADATA_HDR_SIZE); mdh->hb_lock = 0; uuid_clear(mdh->hb_uuid); vmfs_metadata_hdr_write(mdh,buf); /* Rewrite the metadata header only */ if (vmfs_device_write(fs->dev,mdh->pos,buf,buf_len) != buf_len) { fprintf(stderr,"VMFS: unable to write metadata header.\n"); return(-1); } return(vmfs_heartbeat_release(fs)); } vmfs-tools/libvmfs/vmfs_bitmap.c0000644000000000000000000003536011733555434014213 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS bitmaps. */ #include #include #include #include #include #include "utils.h" #include "vmfs.h" /* Read a bitmap header */ int vmfs_bmh_read(vmfs_bitmap_header_t *bmh,const u_char *buf) { bmh->items_per_bitmap_entry = read_le32(buf,0x0); bmh->bmp_entries_per_area = read_le32(buf,0x4); bmh->hdr_size = read_le32(buf,0x8); bmh->data_size = read_le32(buf,0xc); bmh->area_size = read_le32(buf,0x10); bmh->total_items = read_le32(buf,0x14); bmh->area_count = read_le32(buf,0x18); return(0); } /* Write a bitmap header */ int vmfs_bmh_write(const vmfs_bitmap_header_t *bmh,u_char *buf) { write_le32(buf,0x0,bmh->items_per_bitmap_entry); write_le32(buf,0x4,bmh->bmp_entries_per_area); write_le32(buf,0x8,bmh->hdr_size); write_le32(buf,0xc,bmh->data_size); write_le32(buf,0x10,bmh->area_size); write_le32(buf,0x14,bmh->total_items); write_le32(buf,0x18,bmh->area_count); return(0); } /* Read a bitmap entry */ int vmfs_bme_read(vmfs_bitmap_entry_t *bme,const u_char *buf,int copy_bitmap) { vmfs_metadata_hdr_read(&bme->mdh,buf); bme->id = read_le32(buf,VMFS_BME_OFS_ID); bme->total = read_le32(buf,VMFS_BME_OFS_TOTAL); bme->free = read_le32(buf,VMFS_BME_OFS_FREE); bme->ffree = read_le32(buf,VMFS_BME_OFS_FFREE); if (copy_bitmap) { memcpy(bme->bitmap,&buf[VMFS_BME_OFS_BITMAP],(bme->total+7)/8); } return(0); } /* Write a bitmap entry */ int vmfs_bme_write(const vmfs_bitmap_entry_t *bme,u_char *buf) { vmfs_metadata_hdr_write(&bme->mdh,buf); write_le32(buf,VMFS_BME_OFS_ID,bme->id); write_le32(buf,VMFS_BME_OFS_TOTAL,bme->total); write_le32(buf,VMFS_BME_OFS_FREE,bme->free); write_le32(buf,VMFS_BME_OFS_FFREE,bme->ffree); memcpy(&buf[VMFS_BME_OFS_BITMAP],bme->bitmap,(bme->total+7)/8); return(0); } /* Update a bitmap entry on disk */ int vmfs_bme_update(const vmfs_fs_t *fs,const vmfs_bitmap_entry_t *bme) { DECL_ALIGNED_BUFFER(buf,VMFS_BITMAP_ENTRY_SIZE); memset(buf,0,VMFS_BITMAP_ENTRY_SIZE); vmfs_bme_write(bme,buf); if (vmfs_device_write(fs->dev,bme->mdh.pos,buf,buf_len) != buf_len) return(-1); return(0); } /* Get number of items per area */ static inline u_int vmfs_bitmap_get_items_per_area(const vmfs_bitmap_header_t *bmh) { return(bmh->bmp_entries_per_area * bmh->items_per_bitmap_entry); } /* Get address of a given area (pointing to bitmap array) */ static inline off_t vmfs_bitmap_get_area_addr(const vmfs_bitmap_header_t *bmh,u_int area) { return(bmh->hdr_size + (area * bmh->area_size)); } /* Read a bitmap entry given a block id */ int vmfs_bitmap_get_entry(vmfs_bitmap_t *b,uint32_t entry,uint32_t item, vmfs_bitmap_entry_t *bmp_entry) { DECL_ALIGNED_BUFFER(buf,VMFS_BITMAP_ENTRY_SIZE); uint32_t items_per_area; u_int entry_idx,area; off_t addr; addr = (entry * b->bmh.items_per_bitmap_entry) + item; items_per_area = vmfs_bitmap_get_items_per_area(&b->bmh); area = addr / items_per_area; entry_idx = (addr % items_per_area) / b->bmh.items_per_bitmap_entry; addr = vmfs_bitmap_get_area_addr(&b->bmh,area); addr += entry_idx * VMFS_BITMAP_ENTRY_SIZE; if (vmfs_file_pread(b->f,buf,buf_len,addr) != buf_len) return(-1); vmfs_bme_read(bmp_entry,buf,1); return(0); } /* Get position of an item */ off_t vmfs_bitmap_get_item_pos(vmfs_bitmap_t *b,uint32_t entry,uint32_t item) { off_t pos; uint32_t addr; uint32_t items_per_area; u_int area; addr = (entry * b->bmh.items_per_bitmap_entry) + item; items_per_area = vmfs_bitmap_get_items_per_area(&b->bmh); area = addr / items_per_area; pos = b->bmh.hdr_size + (area * b->bmh.area_size); pos += b->bmh.bmp_entries_per_area * VMFS_BITMAP_ENTRY_SIZE; pos += (addr % items_per_area) * b->bmh.data_size; return(pos); } /* Read a bitmap item from its entry and item numbers */ bool vmfs_bitmap_get_item(vmfs_bitmap_t *b, uint32_t entry, uint32_t item, u_char *buf) { off_t pos = vmfs_bitmap_get_item_pos(b,entry,item); return(vmfs_file_pread(b->f,buf,b->bmh.data_size,pos) == b->bmh.data_size); } /* Write a bitmap given its entry and item numbers */ bool vmfs_bitmap_set_item(vmfs_bitmap_t *b,uint32_t entry,uint32_t item, u_char *buf) { off_t pos = vmfs_bitmap_get_item_pos(b,entry,item); return(vmfs_file_pwrite(b->f,buf,b->bmh.data_size,pos) == b->bmh.data_size); } /* Get offset of an item in a bitmap entry */ static void vmfs_bitmap_get_item_offset(const vmfs_bitmap_header_t *bmh,u_int addr, u_int *array_idx,u_int *bit_idx) { u_int idx; idx = addr % bmh->items_per_bitmap_entry; *array_idx = idx >> 3; *bit_idx = idx & 0x07; } /* Update the first free item field */ static void vmfs_bitmap_update_ffree(vmfs_bitmap_entry_t *entry) { u_int array_idx,bit_idx; int i; entry->ffree = 0; for(i=0;itotal;i++) { array_idx = i >> 3; bit_idx = i & 0x07; if (entry->bitmap[array_idx] & (1 << bit_idx)) { entry->ffree = i; break; } } } /* Mark an item as free or allocated */ int vmfs_bitmap_set_item_status(const vmfs_bitmap_header_t *bmh, vmfs_bitmap_entry_t *bmp_entry, uint32_t entry,uint32_t item, int status) { u_int array_idx,bit_idx; u_int bit_mask; uint32_t addr; addr = (entry * bmh->items_per_bitmap_entry) + item; vmfs_bitmap_get_item_offset(bmh,addr,&array_idx,&bit_idx); bit_mask = 1 << bit_idx; if (status == 0) { /* item is already freed */ if (bmp_entry->bitmap[array_idx] & bit_mask) return(-1); bmp_entry->bitmap[array_idx] |= bit_mask; bmp_entry->free++; } else { /* item is already allocated */ if (!(bmp_entry->bitmap[array_idx] & bit_mask)) return(-1); bmp_entry->bitmap[array_idx] &= ~bit_mask; bmp_entry->free--; } vmfs_bitmap_update_ffree(bmp_entry); return(0); } /* Get the status of an item (0=free,1=allocated) */ int vmfs_bitmap_get_item_status(const vmfs_bitmap_header_t *bmh, vmfs_bitmap_entry_t *bmp_entry, uint32_t entry,uint32_t item) { u_int array_idx,bit_idx; u_int bit_mask; uint32_t addr; addr = (entry * bmh->items_per_bitmap_entry) + item; vmfs_bitmap_get_item_offset(bmh,addr,&array_idx,&bit_idx); bit_mask = 1 << bit_idx; return((bmp_entry->bitmap[array_idx] & bit_mask) ? 0 : 1); } /* Find a free item in a bitmap entry and mark it allocated */ int vmfs_bitmap_alloc_item(vmfs_bitmap_entry_t *bmp_entry,uint32_t *item) { u_int array_idx,bit_idx; int i; /* TODO: use first free field as a hint */ for(i=0;itotal;i++) { array_idx = i >> 3; bit_idx = i & 0x07; if (bmp_entry->bitmap[array_idx] & (1 << bit_idx)) { *item = i; bmp_entry->bitmap[array_idx] &= ~(1 << bit_idx); bmp_entry->free--; vmfs_bitmap_update_ffree(bmp_entry); return(0); } } return(-1); } /* Find a bitmap entry with at least "num_items" free in the specified area */ int vmfs_bitmap_area_find_free_items(vmfs_bitmap_t *b, u_int area,u_int num_items, vmfs_bitmap_entry_t *entry) { vmfs_fs_t *fs; u_char *buf,*ptr; size_t buf_len; off_t pos; int res = -1; int i; fs = (vmfs_fs_t *)vmfs_file_get_fs(b->f); pos = vmfs_bitmap_get_area_addr(&b->bmh,area); buf_len = b->bmh.bmp_entries_per_area * VMFS_BITMAP_ENTRY_SIZE; if (!(buf = iobuffer_alloc(buf_len))) return(-1); if (vmfs_file_pread(b->f,buf,buf_len,pos) != buf_len) goto done; for(i=0;ibmh.bmp_entries_per_area;i++) { ptr = buf + (i * VMFS_BITMAP_ENTRY_SIZE); vmfs_bme_read(entry,ptr,1); if (vmfs_metadata_is_locked(&entry->mdh) || (entry->free < num_items)) continue; /* We now have to re-read the bitmap entry with the reservation taken */ if (!vmfs_metadata_lock(fs,entry->mdh.pos, ptr,VMFS_BITMAP_ENTRY_SIZE, &entry->mdh)) { vmfs_bme_read(entry,ptr,1); if (entry->free < num_items) { vmfs_metadata_unlock(fs,&entry->mdh); continue; } res = 0; break; } } done: iobuffer_free(buf); return(res); } /* Find a bitmap entry with at least "num_items" free (scan all areas) */ int vmfs_bitmap_find_free_items(vmfs_bitmap_t *b,u_int num_items, vmfs_bitmap_entry_t *entry) { u_int i; for(i=0;ibmh.area_count;i++) if (!vmfs_bitmap_area_find_free_items(b,i,num_items,entry)) return(0); return(-1); } /* Count the total number of allocated items in a bitmap area */ uint32_t vmfs_bitmap_area_allocated_items(vmfs_bitmap_t *b,u_int area) { u_char buf[VMFS_BITMAP_ENTRY_SIZE]; vmfs_bitmap_entry_t entry; uint32_t count; off_t pos; int i; pos = vmfs_bitmap_get_area_addr(&b->bmh,area); for(i=0,count=0;ibmh.bmp_entries_per_area;i++) { if (vmfs_file_pread(b->f,buf,sizeof(buf),pos) != sizeof(buf)) break; vmfs_bme_read(&entry,buf,0); count += entry.total - entry.free; pos += sizeof(buf); } return count; } /* Count the total number of allocated items in a bitmap */ uint32_t vmfs_bitmap_allocated_items(vmfs_bitmap_t *b) { uint32_t count; u_int i; for(i=0,count=0;ibmh.area_count;i++) count += vmfs_bitmap_area_allocated_items(b,i); return(count); } /* Call a user function for each allocated item in a bitmap */ void vmfs_bitmap_area_foreach(vmfs_bitmap_t *b,u_int area, vmfs_bitmap_foreach_cbk_t cbk, void *opt_arg) { DECL_ALIGNED_BUFFER(buf,VMFS_BITMAP_ENTRY_SIZE); vmfs_bitmap_entry_t entry; off_t pos; uint32_t addr; u_int array_idx,bit_idx; u_int i,j; pos = vmfs_bitmap_get_area_addr(&b->bmh,area); for(i=0;ibmh.bmp_entries_per_area;i++) { if (vmfs_file_pread(b->f,buf,buf_len,pos) != buf_len) break; vmfs_bme_read(&entry,buf,1); for(j=0;j> 3; bit_idx = j & 0x07; addr = area * vmfs_bitmap_get_items_per_area(&b->bmh); addr += i * b->bmh.items_per_bitmap_entry; addr += j; if (!(entry.bitmap[array_idx] & (1 << bit_idx))) cbk(b,addr,opt_arg); } pos += buf_len; } } /* Call a user function for each allocated item in a bitmap */ void vmfs_bitmap_foreach(vmfs_bitmap_t *b,vmfs_bitmap_foreach_cbk_t cbk, void *opt_arg) { u_int i; for(i=0;ibmh.area_count;i++) vmfs_bitmap_area_foreach(b,i,cbk,opt_arg); } /* Check coherency of a bitmap file */ int vmfs_bitmap_check(vmfs_bitmap_t *b) { u_char buf[VMFS_BITMAP_ENTRY_SIZE]; vmfs_bitmap_entry_t entry; uint32_t total_items; uint32_t magic; uint32_t entry_id; int i,j,k,errors; int bmap_size; int bmap_count; off_t pos; errors = 0; total_items = 0; magic = 0; entry_id = 0; for(i=0;ibmh.area_count;i++) { pos = vmfs_bitmap_get_area_addr(&b->bmh,i); for(j=0;jbmh.bmp_entries_per_area;j++) { if (vmfs_file_pread(b->f,buf,sizeof(buf),pos) != sizeof(buf)) break; vmfs_bme_read(&entry,buf,0); if (entry.mdh.magic == 0) goto done; /* check the entry ID */ if (entry.id != entry_id) { printf("Entry 0x%x has incorrect ID 0x%x\n",entry_id,entry.id); errors++; } /* check the magic number */ if (magic == 0) { magic = entry.mdh.magic; } else { if (entry.mdh.magic != magic) { printf("Entry 0x%x has an incorrect magic id (0x%x)\n", entry_id,entry.mdh.magic); errors++; } } /* check the number of items */ if (entry.total > b->bmh.items_per_bitmap_entry) { printf("Entry 0x%x has an incorrect total of 0x%2.2x items\n", entry_id,entry.total); errors++; } /* check the bitmap array */ bmap_size = (entry.total + 7) / 8; bmap_count = 0; for(k=0;kbmh.total_items) { printf("Total number of items (0x%x) doesn't match header info (0x%x)\n", total_items,b->bmh.total_items); errors++; } return(errors); } /* Open a bitmap file */ static inline vmfs_bitmap_t *vmfs_bitmap_open_from_file(vmfs_file_t *f) { DECL_ALIGNED_BUFFER(buf,512); vmfs_bitmap_t *b; if (!f) return NULL; if (vmfs_file_pread(f,buf,buf_len,0) != buf_len) { vmfs_file_close(f); return NULL; } if (!(b = calloc(1, sizeof(vmfs_bitmap_t)))) { vmfs_file_close(f); return NULL; } vmfs_bmh_read(&b->bmh, buf); b->f = f; return b; } vmfs_bitmap_t *vmfs_bitmap_open_at(vmfs_dir_t *d,const char *name) { return vmfs_bitmap_open_from_file(vmfs_file_open_at(d, name)); } vmfs_bitmap_t *vmfs_bitmap_open_from_inode(const vmfs_inode_t *inode) { return vmfs_bitmap_open_from_file(vmfs_file_open_from_inode(inode)); } /* Close a bitmap file */ void vmfs_bitmap_close(vmfs_bitmap_t *b) { if (b != NULL) { vmfs_file_close(b->f); free(b); } } vmfs-tools/libvmfs/vmfs_heartbeat.c0000644000000000000000000001432011733555434014667 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS heartbeats. */ #include #include #include #include #include #include "utils.h" #include "vmfs.h" /* Read a heartbeart info */ int vmfs_heartbeat_read(vmfs_heartbeat_t *hb,const u_char *buf) { hb->magic = read_le32(buf,VMFS_HB_OFS_MAGIC); hb->pos = read_le64(buf,VMFS_HB_OFS_POS); hb->seq = read_le64(buf,VMFS_HB_OFS_SEQ); hb->uptime = read_le64(buf,VMFS_HB_OFS_UPTIME); hb->journal_blk = read_le32(buf,VMFS_HB_OFS_JOURNAL_BLK); read_uuid(buf,VMFS_HB_OFS_UUID,&hb->uuid); return(0); } /* Write a heartbeat info */ int vmfs_heartbeat_write(const vmfs_heartbeat_t *hb,u_char *buf) { write_le32(buf,VMFS_HB_OFS_MAGIC,hb->magic); write_le64(buf,VMFS_HB_OFS_POS,hb->pos); write_le64(buf,VMFS_HB_OFS_SEQ,hb->seq); write_le64(buf,VMFS_HB_OFS_UPTIME,hb->uptime); write_le32(buf,VMFS_HB_OFS_JOURNAL_BLK,hb->journal_blk); write_uuid(buf,VMFS_HB_OFS_UUID,&hb->uuid); return(0); } /* Show heartbeat info */ void vmfs_heartbeat_show(const vmfs_heartbeat_t *hb) { char uuid_str[M_UUID_BUFLEN]; printf("Heartbeat ID 0x%"PRIx64":\n",hb->pos); printf(" - Magic : 0x%8.8x\n",hb->magic); printf(" - Sequence : 0x%8.8"PRIx64"\n",hb->seq); printf(" - Uptime : 0x%8.8"PRIx64"\n",hb->uptime); printf(" - UUID : %s\n",m_uuid_to_str(hb->uuid,uuid_str)); printf("\n"); } /* Show the active locks */ int vmfs_heartbeat_show_active(const vmfs_fs_t *fs) { DECL_ALIGNED_BUFFER(buf,VMFS_HB_SIZE); vmfs_heartbeat_t hb; ssize_t res; off_t pos = 0; int count = 0; while(pos < VMFS_HB_SIZE * VMFS_HB_NUM) { res = vmfs_device_read(fs->dev,VMFS_HB_BASE+pos,buf,buf_len); if (res != buf_len) { fprintf(stderr,"VMFS: unable to read heartbeat info.\n"); return(-1); } vmfs_heartbeat_read(&hb,buf); if (vmfs_heartbeat_active(&hb)) { vmfs_heartbeat_show(&hb); count++; } else if (hb.magic != VMFS_HB_MAGIC_OFF) { fprintf(stderr,"VMFS: invalid heartbeat info.\n"); break; } pos += res; } return(count); } /* Lock an heartbeat given its ID */ int vmfs_heartbeat_lock(vmfs_fs_t *fs,u_int id,vmfs_heartbeat_t *hb) { DECL_ALIGNED_BUFFER(buf,VMFS_HB_SIZE); off_t pos; int res = -1; if (id >= VMFS_HB_NUM) return(-1); pos = VMFS_HB_BASE + (id * VMFS_HB_SIZE); if (vmfs_device_reserve(fs->dev,pos) == -1) { fprintf(stderr,"VMFS: unable to reserve volume.\n"); return(-1); } if (vmfs_device_read(fs->dev,pos,buf,buf_len) != buf_len) { fprintf(stderr,"VMFS: unable to read heartbeat info.\n"); goto done; } vmfs_heartbeat_read(hb,buf); if (vmfs_heartbeat_active(hb)) goto done; hb->magic = VMFS_HB_MAGIC_ON; hb->uptime = vmfs_host_get_uptime(); hb->seq++; vmfs_host_get_uuid(hb->uuid); vmfs_heartbeat_write(hb,buf); if (vmfs_device_write(fs->dev,pos,buf,buf_len) != buf_len) { fprintf(stderr,"VMFS: unable to write heartbeat info.\n"); hb->magic = VMFS_HB_MAGIC_OFF; goto done; } res = 0; done: vmfs_device_release(fs->dev,pos); return(res); } /* Unlock an heartbeat */ int vmfs_heartbeat_unlock(vmfs_fs_t *fs,vmfs_heartbeat_t *hb) { DECL_ALIGNED_BUFFER(buf,VMFS_HB_SIZE); if (!vmfs_heartbeat_active(hb)) return(-1); hb->magic = VMFS_HB_MAGIC_OFF; hb->seq++; uuid_clear(hb->uuid); vmfs_heartbeat_write(hb,buf); return((vmfs_device_write(fs->dev,hb->pos,buf,buf_len) == buf_len) ? 0 : -1); } /* Update an heartbeat */ int vmfs_heartbeat_update(vmfs_fs_t *fs,vmfs_heartbeat_t *hb) { DECL_ALIGNED_BUFFER(buf,VMFS_HB_SIZE); if (!vmfs_heartbeat_active(hb)) return(-1); hb->uptime = vmfs_host_get_uptime(); vmfs_heartbeat_write(hb,buf); return((vmfs_device_write(fs->dev,hb->pos,buf,buf_len) == buf_len) ? 0 : -1); } /* Acquire an heartbeat (ID is chosen automatically) */ int vmfs_heartbeat_acquire(vmfs_fs_t *fs) { vmfs_heartbeat_t hb; u_char *buf; size_t buf_len; int i,res = -1; /* Heartbeat already active ? */ if (fs->hb_refcount > 0) { fs->hb_refcount++; fs->hb_expire = vmfs_host_get_uptime() + VMFS_HEARTBEAT_EXPIRE_DELAY; return(0); } /* Try to reuse the current ID */ if (!vmfs_heartbeat_lock(fs,fs->hb_id,&fs->hb)) return(0); buf_len = VMFS_HB_NUM * VMFS_HB_SIZE; if (!(buf = iobuffer_alloc(buf_len))) return(-1); if (vmfs_device_read(fs->dev,VMFS_HB_BASE,buf,buf_len) != buf_len) return(-1); /* * Heartbeat is taken by someone else, find a new one. * To avoid high contention with SCSI reservation, we first read * directly the heartbeat info, and if the heartbeat is not taken, * we try to acquire it definitely with reservation. */ for(i=0;ihb)) { fs->hb_id = i; fs->hb_seq = fs->hb.seq; fs->hb_refcount = 1; fs->hb_expire = vmfs_host_get_uptime() + VMFS_HEARTBEAT_EXPIRE_DELAY; res = 0; break; } } iobuffer_free(buf); return(res); } /* Release an heartbeat */ int vmfs_heartbeat_release(vmfs_fs_t *fs) { if (fs->hb_refcount == 0) return(-1); /* The heartbeat will be eventually released by the background process */ fs->hb_refcount--; return(0); } vmfs-tools/libvmfs/vmfs_heartbeat.h0000644000000000000000000000600511733303644014667 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_HEARTBEAT_H #define VMFS_HEARTBEAT_H #include #include #define VMFS_HB_BASE 0x0300000 #define VMFS_HB_SIZE 0x200 #define VMFS_HB_NUM 2048 #define VMFS_HB_MAGIC_OFF 0xabcdef01 #define VMFS_HB_MAGIC_ON 0xabcdef02 struct vmfs_heartbeart_raw { uint32_t magic; uint64_t pos; uint64_t seq; uint64_t uptime; uuid_t uuid; uint32_t journal_block; uint32_t vol_version; /* from fs_info (?) */ uint32_t version; /* from fs_info (?) */ } __attribute__((packed)); #define VMFS_HB_OFS_MAGIC offsetof(struct vmfs_heartbeart_raw, magic) #define VMFS_HB_OFS_POS offsetof(struct vmfs_heartbeart_raw, pos) #define VMFS_HB_OFS_SEQ offsetof(struct vmfs_heartbeart_raw, seq) #define VMFS_HB_OFS_UPTIME offsetof(struct vmfs_heartbeart_raw, uptime) #define VMFS_HB_OFS_UUID offsetof(struct vmfs_heartbeart_raw, uuid) #define VMFS_HB_OFS_JOURNAL_BLK offsetof(struct vmfs_heartbeart_raw, journal_block) struct vmfs_heartbeat { uint32_t magic; uint64_t pos; uint64_t seq; /* Sequence number */ uint64_t uptime; /* Uptime (in usec) of the locker */ uuid_t uuid; /* UUID of the server */ uint32_t journal_blk; /* Journal block */ }; /* Delay for heartbeat expiration when not referenced anymore */ #define VMFS_HEARTBEAT_EXPIRE_DELAY (3 * 1000000) static inline bool vmfs_heartbeat_active(vmfs_heartbeat_t *hb) { return(hb->magic == VMFS_HB_MAGIC_ON); } /* Read a heartbeart info */ int vmfs_heartbeat_read(vmfs_heartbeat_t *hb,const u_char *buf); /* Write a heartbeat info */ int vmfs_heartbeat_write(const vmfs_heartbeat_t *hb,u_char *buf); /* Show heartbeat info */ void vmfs_heartbeat_show(const vmfs_heartbeat_t *hb); /* Show the active locks */ int vmfs_heartbeat_show_active(const vmfs_fs_t *fs); /* Lock an heartbeat given its ID */ int vmfs_heartbeat_lock(vmfs_fs_t *fs,u_int id,vmfs_heartbeat_t *hb); /* Unlock an heartbeat */ int vmfs_heartbeat_unlock(vmfs_fs_t *fs,vmfs_heartbeat_t *hb); /* Update an heartbeat */ int vmfs_heartbeat_update(vmfs_fs_t *fs,vmfs_heartbeat_t *hb); /* Acquire an heartbeat (ID is chosen automatically) */ int vmfs_heartbeat_acquire(vmfs_fs_t *fs); /* Release an heartbeat */ int vmfs_heartbeat_release(vmfs_fs_t *fs); #endif vmfs-tools/libvmfs/vmfs_inode.h0000644000000000000000000001275111733555434014041 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2011 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_INODE_H #define VMFS_INODE_H #include #include #define VMFS_INODE_SIZE 0x800 #define VMFS_INODE_BLK_COUNT 0x100 #define VMFS_INODE_MAGIC 0x10c00001 struct vmfs_inode_raw { struct vmfs_metadata_hdr_raw mdh; uint32_t id; uint32_t id2; /* seems to be VMFS_BLK_FD_ITEM(id) + 1 */ uint32_t nlink; uint32_t type; uint32_t flags; uint64_t size; uint64_t blk_size; uint64_t blk_count; uint32_t mtime; uint32_t ctime; uint32_t atime; uint32_t uid; uint32_t gid; uint32_t mode; uint32_t zla; uint32_t tbz; uint32_t cow; u_char _unknown2[432]; union { uint32_t blocks[VMFS_INODE_BLK_COUNT]; uint32_t rdm_id; char content[VMFS_INODE_BLK_COUNT * sizeof(uint32_t)]; }; } __attribute__((packed)); #define VMFS_INODE_OFS_ID offsetof(struct vmfs_inode_raw, id) #define VMFS_INODE_OFS_ID2 offsetof(struct vmfs_inode_raw, id2) #define VMFS_INODE_OFS_NLINK offsetof(struct vmfs_inode_raw, nlink) #define VMFS_INODE_OFS_TYPE offsetof(struct vmfs_inode_raw, type) #define VMFS_INODE_OFS_FLAGS offsetof(struct vmfs_inode_raw, flags) #define VMFS_INODE_OFS_SIZE offsetof(struct vmfs_inode_raw, size) #define VMFS_INODE_OFS_BLK_SIZE offsetof(struct vmfs_inode_raw, blk_size) #define VMFS_INODE_OFS_BLK_COUNT offsetof(struct vmfs_inode_raw, blk_count) #define VMFS_INODE_OFS_MTIME offsetof(struct vmfs_inode_raw, mtime) #define VMFS_INODE_OFS_CTIME offsetof(struct vmfs_inode_raw, ctime) #define VMFS_INODE_OFS_ATIME offsetof(struct vmfs_inode_raw, atime) #define VMFS_INODE_OFS_UID offsetof(struct vmfs_inode_raw, uid) #define VMFS_INODE_OFS_GID offsetof(struct vmfs_inode_raw, gid) #define VMFS_INODE_OFS_MODE offsetof(struct vmfs_inode_raw, mode) #define VMFS_INODE_OFS_ZLA offsetof(struct vmfs_inode_raw, zla) #define VMFS_INODE_OFS_TBZ offsetof(struct vmfs_inode_raw, tbz) #define VMFS_INODE_OFS_COW offsetof(struct vmfs_inode_raw, cow) #define VMFS_INODE_OFS_BLK_ARRAY offsetof(struct vmfs_inode_raw, blocks) #define VMFS_INODE_OFS_RDM_ID offsetof(struct vmfs_inode_raw, rdm_id) #define VMFS_INODE_OFS_CONTENT offsetof(struct vmfs_inode_raw, content) /* Synchronization flags */ #define VMFS_INODE_SYNC_META 0x01 #define VMFS_INODE_SYNC_BLK 0x02 #define VMFS_INODE_SYNC_ALL (VMFS_INODE_SYNC_META | VMFS_INODE_SYNC_BLK) /* Some VMFS 5 features use a weird ZLA */ #define VMFS5_ZLA_BASE 4301 struct vmfs_inode { vmfs_metadata_hdr_t mdh; uint32_t id,id2; uint32_t nlink; uint32_t type; uint32_t flags; uint64_t size; uint64_t blk_size; uint64_t blk_count; time_t mtime,ctime,atime; uint32_t uid,gid; uint32_t mode,cmode; uint32_t zla,tbz,cow; uint32_t rdm_id; union { uint32_t blocks[VMFS_INODE_BLK_COUNT]; char content[VMFS_INODE_BLK_COUNT * sizeof(uint32_t)]; }; /* In-core inode information */ const vmfs_fs_t *fs; vmfs_inode_t **pprev,*next; u_int ref_count; u_int update_flags; }; /* Callback function for vmfs_inode_foreach_block() */ typedef void (*vmfs_inode_foreach_block_cbk_t)(const vmfs_inode_t *inode, uint32_t pb_blk, uint32_t blk_id, void *opt_arg); /* Update an inode on disk */ int vmfs_inode_update(const vmfs_inode_t *inode,int update_blk_list); /* Get inode corresponding to a block id */ int vmfs_inode_get(const vmfs_fs_t *fs,uint32_t blk_id,vmfs_inode_t *inode); /* Acquire an inode */ vmfs_inode_t *vmfs_inode_acquire(const vmfs_fs_t *fs,uint32_t blk_id); /* Release an inode */ void vmfs_inode_release(vmfs_inode_t *inode); /* Allocate a new inode */ int vmfs_inode_alloc(vmfs_fs_t *fs,u_int type,mode_t mode,vmfs_inode_t **inode); /* * Get block ID corresponding the specified position. Pointer block * resolution is transparently done here. */ int vmfs_inode_get_block(const vmfs_inode_t *inode,off_t pos,uint32_t *blk_id); /* Get a block for writing corresponding to the specified position */ int vmfs_inode_get_wrblock(vmfs_inode_t *inode,off_t pos,uint32_t *blk_id); /* Truncate file */ int vmfs_inode_truncate(vmfs_inode_t *inode,off_t new_len); /* Call a function for each allocated block of an inode */ int vmfs_inode_foreach_block(const vmfs_inode_t *inode, vmfs_inode_foreach_block_cbk_t cbk,void *opt_arg); /* Get inode status */ int vmfs_inode_stat(const vmfs_inode_t *inode,struct stat *buf); /* Get inode status */ int vmfs_inode_stat_from_blkid(const vmfs_fs_t *fs,uint32_t blk_id, struct stat *buf); /* Change permissions */ int vmfs_inode_chmod(vmfs_inode_t *inode,mode_t mode); #endif vmfs-tools/libvmfs/manifest.mk0000644000000000000000000000012611733303644013661 0ustar utils.o_CFLAGS := $(if $(HAS_POSIX_MEMALIGN),,-DNO_POSIX_MEMALIGN=1) REQUIRES := uuid vmfs-tools/libvmfs/scsi.h0000644000000000000000000000240111733303644012632 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef SCSI_H #define SCSI_H #ifdef __linux__ #include #include struct scsi_idlun { int four_in_one; int host_unique_id; }; #endif static inline int scsi_get_lun(int fd) { #if __linux__ struct scsi_idlun idlun; if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, &idlun)) #endif return(-1); #if __linux__ return((idlun.four_in_one >> 8) & 0xff); #endif } /* Send a SCSI "reserve" command */ int scsi_reserve(int fd); /* Send a SCSI "release" command */ int scsi_release(int fd); #endif vmfs-tools/libvmfs/vmfs_lvm.c0000644000000000000000000001363111733555434013532 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2011 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS LVM layer */ #include #include "vmfs.h" /* * Until we uncover the details of the segment descriptors format, * it is useless to try to do something more efficient. */ static vmfs_volume_t *vmfs_lvm_get_extent_from_offset(const vmfs_lvm_t *lvm, off_t pos) { int extent; off_t segment = pos / VMFS_LVM_SEGMENT_SIZE; for (extent = 0; extent < lvm->loaded_extents; extent++) { if ((segment >= lvm->extents[extent]->vol_info.first_segment) && (segment <= lvm->extents[extent]->vol_info.last_segment)) return(lvm->extents[extent]); } return(NULL); } /* Get extent size */ static inline uint64_t vmfs_lvm_extent_size(const vmfs_volume_t *extent) { return((uint64_t)extent->vol_info.num_segments * VMFS_LVM_SEGMENT_SIZE); } typedef ssize_t (*vmfs_vol_io_func)(const vmfs_device_t *,off_t,u_char *,size_t); /* Read a raw block of data on logical volume */ static inline ssize_t vmfs_lvm_io(const vmfs_lvm_t *lvm,off_t pos,u_char *buf, size_t len,vmfs_vol_io_func func) { vmfs_volume_t *extent = vmfs_lvm_get_extent_from_offset(lvm,pos); if (!extent) return(-1); pos -= (uint64_t)extent->vol_info.first_segment * VMFS_LVM_SEGMENT_SIZE; if ((pos + len) > vmfs_lvm_extent_size(extent)) { /* TODO: Handle this case */ fprintf(stderr,"VMFS: i/o spanned over several extents is unsupported\n"); return(-1); } return(func(&extent->dev,pos,buf,len)); } /* Read a raw block of data on logical volume */ static ssize_t vmfs_lvm_read(const vmfs_device_t *dev,off_t pos, u_char *buf,size_t len) { vmfs_lvm_t *lvm = (vmfs_lvm_t *)dev; return(vmfs_lvm_io(lvm,pos,buf,len,vmfs_device_read)); } /* Write a raw block of data on logical volume */ static ssize_t vmfs_lvm_write(const vmfs_device_t *dev,off_t pos, const u_char *buf,size_t len) { vmfs_lvm_t *lvm = (vmfs_lvm_t *)dev; return(vmfs_lvm_io(lvm,pos,(u_char *)buf,len,(vmfs_vol_io_func)vmfs_device_write)); } /* Reserve the underlying volume given a LVM position */ static int vmfs_lvm_reserve(const vmfs_device_t *dev,off_t pos) { vmfs_lvm_t *lvm = (vmfs_lvm_t *)dev; vmfs_volume_t *extent = vmfs_lvm_get_extent_from_offset(lvm,pos); if (!extent) return(-1); return(vmfs_device_reserve(&extent->dev, 0)); } /* Release the underlying volume given a LVM position */ static int vmfs_lvm_release(const vmfs_device_t *dev,off_t pos) { vmfs_lvm_t *lvm = (vmfs_lvm_t *)dev; vmfs_volume_t *extent = vmfs_lvm_get_extent_from_offset(lvm,pos); if (!extent) return(-1); return(vmfs_device_release(&extent->dev, 0)); } /* Create a volume structure */ vmfs_lvm_t *vmfs_lvm_create(vmfs_flags_t flags) { vmfs_lvm_t *lvm; if (!(lvm = calloc(1,sizeof(*lvm)))) return NULL; lvm->flags = flags; if (flags.read_write) fprintf(stderr, "VMFS: R/W support is experimental. Use at your own risk\n"); return lvm; } /* Add an extent to the LVM */ int vmfs_lvm_add_extent(vmfs_lvm_t *lvm, vmfs_volume_t *vol) { uint32_t i; if (!vol) return(-1); if (lvm->loaded_extents == 0) { uuid_copy(lvm->lvm_info.uuid, vol->vol_info.lvm_uuid); lvm->lvm_info.size = vol->vol_info.lvm_size; lvm->lvm_info.blocks = vol->vol_info.blocks; lvm->lvm_info.num_extents = vol->vol_info.num_extents; } else if (uuid_compare(lvm->lvm_info.uuid, vol->vol_info.lvm_uuid)) { fprintf(stderr, "VMFS: The %s file/device is not part of the LVM\n", vol->device); return(-1); } else if ((lvm->lvm_info.size != vol->vol_info.lvm_size) || (lvm->lvm_info.blocks != vol->vol_info.blocks) || (lvm->lvm_info.num_extents != vol->vol_info.num_extents)) { fprintf(stderr, "VMFS: LVM information mismatch for the %s" " file/device\n", vol->device); return(-1); } for (i = 0; (i < lvm->loaded_extents) && (vol->vol_info.first_segment > lvm->extents[i]->vol_info.first_segment); i++); if (lvm->loaded_extents) memmove(&lvm->extents[i + 1], &lvm->extents[i], (lvm->loaded_extents - i) * sizeof(vmfs_volume_t *)); lvm->extents[i] = vol; lvm->loaded_extents++; return(0); } /* Close an LVM */ static void vmfs_lvm_close(vmfs_device_t *dev) { vmfs_lvm_t *lvm = (vmfs_lvm_t *)dev; if (!lvm) return; while(lvm->loaded_extents--) vmfs_device_close(&lvm->extents[lvm->loaded_extents]->dev); free(lvm); } /* Open an LVM */ int vmfs_lvm_open(vmfs_lvm_t *lvm) { if (!lvm->flags.allow_missing_extents && (lvm->loaded_extents != lvm->lvm_info.num_extents)) { fprintf(stderr, "VMFS: Missing extents\n"); return(-1); } lvm->dev.read = vmfs_lvm_read; if (lvm->flags.read_write) lvm->dev.write = vmfs_lvm_write; lvm->dev.reserve = vmfs_lvm_reserve; lvm->dev.release = vmfs_lvm_release; lvm->dev.close = vmfs_lvm_close; lvm->dev.uuid = &lvm->lvm_info.uuid; return(0); } /* Returns whether a given device is a vmfs_lvm */ bool vmfs_device_is_lvm(vmfs_device_t *dev) { return (dev->read == vmfs_lvm_read); } vmfs-tools/libvmfs/vmfs.h0000644000000000000000000000426011733555434012657 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_H #define VMFS_H /* VMFS types - forward declarations */ typedef struct vmfs_volinfo vmfs_volinfo_t; typedef struct vmfs_fsinfo vmfs_fsinfo_t; typedef struct vmfs_lvminfo vmfs_lvminfo_t; typedef struct vmfs_heartbeat vmfs_heartbeat_t; typedef struct vmfs_metadata_hdr vmfs_metadata_hdr_t; typedef struct vmfs_block_info vmfs_block_info_t; typedef struct vmfs_bitmap_header vmfs_bitmap_header_t; typedef struct vmfs_bitmap_entry vmfs_bitmap_entry_t; typedef struct vmfs_bitmap vmfs_bitmap_t; typedef struct vmfs_inode vmfs_inode_t; typedef struct vmfs_dirent vmfs_dirent_t; typedef struct vmfs_dir vmfs_dir_t; typedef struct vmfs_blk_array vmfs_blk_array_t; typedef struct vmfs_blk_list vmfs_blk_list_t; typedef struct vmfs_file vmfs_file_t; typedef struct vmfs_device vmfs_device_t; typedef struct vmfs_volume vmfs_volume_t; typedef struct vmfs_lvm vmfs_lvm_t; typedef struct vmfs_fs vmfs_fs_t; union vmfs_flags { int packed; struct { unsigned int debug_level:4; unsigned int read_write:1; unsigned int allow_missing_extents:1; }; }; typedef union vmfs_flags vmfs_flags_t __attribute__((transparent_union)); #include "utils.h" #include "vmfs_heartbeat.h" #include "vmfs_metadata.h" #include "vmfs_block.h" #include "vmfs_bitmap.h" #include "vmfs_inode.h" #include "vmfs_dirent.h" #include "vmfs_file.h" #include "vmfs_device.h" #include "vmfs_volume.h" #include "vmfs_lvm.h" #include "vmfs_fs.h" #include "vmfs_host.h" #endif vmfs-tools/libvmfs/vmfs_inode.c0000644000000000000000000005262611733555434014041 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2011 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS inodes. */ #include #include #include #include #include #include "vmfs.h" static inline uint32_t vmfs_inode_read_blk_id(const u_char *buf,u_int index) { return(read_le32(buf,VMFS_INODE_OFS_BLK_ARRAY+(index*sizeof(uint32_t)))); } static inline void vmfs_inode_write_blk_id(u_char *buf,u_int index, uint32_t blk_id) { write_le32(buf,VMFS_INODE_OFS_BLK_ARRAY+(index*sizeof(uint32_t)),blk_id); } /* Read an inode */ static int vmfs_inode_read(vmfs_inode_t *inode,const u_char *buf) { int i; vmfs_metadata_hdr_read(&inode->mdh,buf); if (inode->mdh.magic != VMFS_INODE_MAGIC) return(-1); inode->id = read_le32(buf,VMFS_INODE_OFS_ID); inode->id2 = read_le32(buf,VMFS_INODE_OFS_ID2); inode->nlink = read_le32(buf,VMFS_INODE_OFS_NLINK); inode->type = read_le32(buf,VMFS_INODE_OFS_TYPE); inode->flags = read_le32(buf,VMFS_INODE_OFS_FLAGS); inode->size = read_le64(buf,VMFS_INODE_OFS_SIZE); inode->blk_size = read_le64(buf,VMFS_INODE_OFS_BLK_SIZE); inode->blk_count = read_le64(buf,VMFS_INODE_OFS_BLK_COUNT); inode->mtime = read_le32(buf,VMFS_INODE_OFS_MTIME); inode->ctime = read_le32(buf,VMFS_INODE_OFS_CTIME); inode->atime = read_le32(buf,VMFS_INODE_OFS_ATIME); inode->uid = read_le32(buf,VMFS_INODE_OFS_UID); inode->gid = read_le32(buf,VMFS_INODE_OFS_GID); inode->mode = read_le32(buf,VMFS_INODE_OFS_MODE); inode->zla = read_le32(buf,VMFS_INODE_OFS_ZLA); inode->tbz = read_le32(buf,VMFS_INODE_OFS_TBZ); inode->cow = read_le32(buf,VMFS_INODE_OFS_COW); /* "corrected" mode */ inode->cmode = inode->mode | vmfs_file_type2mode(inode->type); if (inode->type == VMFS_FILE_TYPE_RDM) { inode->rdm_id = read_le32(buf,VMFS_INODE_OFS_RDM_ID); } else if (inode->zla == VMFS5_ZLA_BASE + VMFS_BLK_TYPE_FD) { memcpy(inode->content, buf + VMFS_INODE_OFS_CONTENT, inode->size); } else { for(i=0;iblocks[i] = vmfs_inode_read_blk_id(buf,i); } return(0); } /* Write an inode */ static int vmfs_inode_write(const vmfs_inode_t *inode,u_char *buf) { vmfs_metadata_hdr_write(&inode->mdh,buf); write_le32(buf,VMFS_INODE_OFS_ID,inode->id); write_le32(buf,VMFS_INODE_OFS_ID2,inode->id2); write_le32(buf,VMFS_INODE_OFS_NLINK,inode->nlink); write_le32(buf,VMFS_INODE_OFS_TYPE,inode->type); write_le32(buf,VMFS_INODE_OFS_FLAGS,inode->flags); write_le64(buf,VMFS_INODE_OFS_SIZE,inode->size); write_le64(buf,VMFS_INODE_OFS_BLK_SIZE,inode->blk_size); write_le64(buf,VMFS_INODE_OFS_BLK_COUNT,inode->blk_count); write_le32(buf,VMFS_INODE_OFS_MTIME,inode->mtime); write_le32(buf,VMFS_INODE_OFS_CTIME,inode->ctime); write_le32(buf,VMFS_INODE_OFS_ATIME,inode->atime); write_le32(buf,VMFS_INODE_OFS_UID,inode->uid); write_le32(buf,VMFS_INODE_OFS_GID,inode->gid); write_le32(buf,VMFS_INODE_OFS_MODE,inode->mode); write_le32(buf,VMFS_INODE_OFS_ZLA,inode->zla); write_le32(buf,VMFS_INODE_OFS_TBZ,inode->tbz); write_le32(buf,VMFS_INODE_OFS_COW,inode->cow); return(0); } /* Update block list */ static void vmfs_inode_write_blk_list(const vmfs_inode_t *inode,u_char *buf) { int i; for(i=0;iblocks[i]); } /* Update an inode on disk */ int vmfs_inode_update(const vmfs_inode_t *inode,int update_blk_list) { DECL_ALIGNED_BUFFER(buf,VMFS_INODE_SIZE); memset(buf,0,VMFS_INODE_SIZE); vmfs_inode_write(inode,buf); if (update_blk_list) { vmfs_inode_write_blk_list(inode,buf); } else { buf_len -= VMFS_INODE_BLK_COUNT * sizeof(uint32_t); } if (vmfs_device_write(inode->fs->dev,inode->mdh.pos,buf,buf_len) != buf_len) return(-1); return(0); } /* Get inode corresponding to a block id */ int vmfs_inode_get(const vmfs_fs_t *fs,uint32_t blk_id,vmfs_inode_t *inode) { DECL_ALIGNED_BUFFER_WOL(buf,VMFS_INODE_SIZE); if (VMFS_BLK_TYPE(blk_id) != VMFS_BLK_TYPE_FD) return(-1); if (!vmfs_bitmap_get_item(fs->fdc, VMFS_BLK_FD_ENTRY(blk_id), VMFS_BLK_FD_ITEM(blk_id), buf)) return(-1); return(vmfs_inode_read(inode,buf)); } /* Hash function to retrieve an in-core inode */ static inline u_int vmfs_inode_hash(const vmfs_fs_t *fs,uint32_t blk_id) { return( (blk_id ^ (blk_id >> 9)) & (fs->inode_hash_buckets - 1) ); } /* Register an inode in the in-core inode hash table */ static void vmfs_inode_register(const vmfs_fs_t *fs,vmfs_inode_t *inode) { u_int hb; hb = vmfs_inode_hash(fs,inode->id); inode->fs = fs; inode->ref_count = 1; /* Insert into hash table */ inode->next = fs->inodes[hb]; inode->pprev = &fs->inodes[hb]; if (inode->next != NULL) inode->next->pprev = &inode->next; fs->inodes[hb] = inode; } /* Acquire an inode */ vmfs_inode_t *vmfs_inode_acquire(const vmfs_fs_t *fs,uint32_t blk_id) { vmfs_inode_t *inode; u_int hb; hb = vmfs_inode_hash(fs,blk_id); for(inode=fs->inodes[hb];inode;inode=inode->next) if (inode->id == blk_id) { inode->ref_count++; return inode; } /* Inode not yet used, allocate room for it */ if (!(inode = calloc(1,sizeof(*inode)))) return NULL; if (vmfs_inode_get(fs,blk_id,inode) == -1) { free(inode); return NULL; } vmfs_inode_register(fs,inode); return inode; } /* Release an inode */ void vmfs_inode_release(vmfs_inode_t *inode) { assert(inode->ref_count > 0); if (--inode->ref_count == 0) { if (inode->update_flags) vmfs_inode_update(inode,inode->update_flags & VMFS_INODE_SYNC_BLK); if (inode->pprev != NULL) { /* remove the inode from hash table */ if (inode->next != NULL) inode->next->pprev = inode->pprev; *(inode->pprev) = inode->next; free(inode); } } } /* Allocate a new inode */ int vmfs_inode_alloc(vmfs_fs_t *fs,u_int type,mode_t mode,vmfs_inode_t **inode) { vmfs_inode_t *fdc_inode; off_t fdc_offset; uint32_t fdc_blk; time_t ct; time(&ct); if (!(*inode = calloc(1,sizeof(vmfs_inode_t)))) return(-ENOMEM); (*inode)->mdh.magic = VMFS_INODE_MAGIC; (*inode)->type = type; (*inode)->blk_size = fs->sbc->bmh.data_size; (*inode)->zla = VMFS_BLK_TYPE_SB; (*inode)->mtime = ct; (*inode)->ctime = ct; (*inode)->atime = ct; (*inode)->id2 = ++fs->inode_gen; (*inode)->mode = mode; (*inode)->cmode = (*inode)->mode | vmfs_file_type2mode((*inode)->type); if ((vmfs_block_alloc(fs,VMFS_BLK_TYPE_FD,&(*inode)->id)) < 0) { free(*inode); return(-ENOSPC); } /* Compute "physical" position of inode, using FDC file */ fdc_inode = fs->fdc->f->inode; fdc_offset = vmfs_bitmap_get_item_pos(fs->fdc, VMFS_BLK_FD_ENTRY((*inode)->id), VMFS_BLK_FD_ITEM((*inode)->id)); if ((vmfs_inode_get_block(fdc_inode,fdc_offset,&fdc_blk) == -1) || (VMFS_BLK_TYPE(fdc_blk) != VMFS_BLK_TYPE_FB)) { vmfs_block_free(fs,(*inode)->id); free(*inode); return(-ENOSPC); } (*inode)->mdh.pos = fdc_inode->blk_size * VMFS_BLK_FB_ITEM(fdc_blk); (*inode)->mdh.pos += fdc_offset % fdc_inode->blk_size; (*inode)->update_flags |= VMFS_INODE_SYNC_ALL; vmfs_inode_register(fs,*inode); return(0); } /* * Get block ID corresponding the specified position. Pointer block * resolution is transparently done here. */ int vmfs_inode_get_block(const vmfs_inode_t *inode,off_t pos,uint32_t *blk_id) { const vmfs_fs_t *fs = inode->fs; u_int blk_index; uint32_t zla; int vmfs5_extension; *blk_id = 0; if (!inode->blk_size) return(-EIO); /* This doesn't make much sense but looks like how it's being coded. At * least, the result has some sense. */ zla = inode->zla; if (zla >= VMFS5_ZLA_BASE) { vmfs5_extension = 1; zla -= VMFS5_ZLA_BASE; } else vmfs5_extension = 0; switch(zla) { case VMFS_BLK_TYPE_FB: case VMFS_BLK_TYPE_SB: blk_index = pos / inode->blk_size; if (blk_index >= VMFS_INODE_BLK_COUNT) return(-EINVAL); *blk_id = inode->blocks[blk_index]; break; case VMFS_BLK_TYPE_PB: { DECL_ALIGNED_BUFFER_WOL(buf,fs->pbc->bmh.data_size); uint32_t pb_blk_id; uint32_t blk_per_pb; u_int pb_index; u_int sub_index; blk_per_pb = fs->pbc->bmh.data_size / sizeof(uint32_t); blk_index = pos / inode->blk_size; pb_index = blk_index / blk_per_pb; sub_index = blk_index % blk_per_pb; if (pb_index >= VMFS_INODE_BLK_COUNT) return(-EINVAL); pb_blk_id = inode->blocks[pb_index]; if (!pb_blk_id) break; if (!vmfs_bitmap_get_item(fs->pbc, VMFS_BLK_PB_ENTRY(pb_blk_id), VMFS_BLK_PB_ITEM(pb_blk_id), buf)) return(-EIO); *blk_id = read_le32(buf,sub_index*sizeof(uint32_t)); break; } case VMFS_BLK_TYPE_FD: if (vmfs5_extension) { *blk_id = inode->id; break; } default: /* Unexpected ZLA type */ return(-EIO); } return(0); } /* Aggregate a sub-block to a file block */ static int vmfs_inode_aggregate_fb(vmfs_inode_t *inode) { const vmfs_fs_t *fs = inode->fs; DECL_ALIGNED_BUFFER(buf,fs->sbc->bmh.data_size); uint32_t fb_blk,sb_blk,fb_item; uint32_t sb_count; off_t pos; int i,res; sb_count = vmfs_fs_get_blocksize(fs) / buf_len; if (!(buf = iobuffer_alloc(buf_len))) return(-ENOMEM); sb_blk = inode->blocks[0]; if (!vmfs_bitmap_get_item(fs->sbc, VMFS_BLK_SB_ENTRY(sb_blk), VMFS_BLK_SB_ITEM(sb_blk), buf)) { res = -EIO; goto err_sb_blk_read; } if ((res = vmfs_block_alloc(fs,VMFS_BLK_TYPE_FB,&fb_blk)) < 0) goto err_blk_alloc; fb_item = VMFS_BLK_FB_ITEM(fb_blk); if (vmfs_fs_write(fs,fb_item,0,buf,buf_len) != buf_len) { res = -EIO; goto err_fs_write; } memset(buf,0,buf_len); pos = buf_len; for(i=1;iblocks[0] = fb_blk; inode->zla = VMFS_BLK_TYPE_FB; inode->blk_size = vmfs_fs_get_blocksize(fs); inode->update_flags |= VMFS_INODE_SYNC_BLK; iobuffer_free(buf); return(0); err_fs_write: vmfs_block_free(fs,fb_blk); err_sb_blk_read: err_blk_alloc: iobuffer_free(buf); return(res); } /* Aggregate block list of an inode to a pointer block */ static int vmfs_inode_aggregate_pb(vmfs_inode_t *inode) { const vmfs_fs_t *fs = inode->fs; uint32_t pb_blk,pb_len; uint32_t item,entry; u_char *buf; int i,res; pb_len = fs->pbc->bmh.data_size; if (pb_len < (VMFS_INODE_BLK_COUNT * sizeof(uint32_t))) { fprintf(stderr,"vmfs_inode_aggregate_pb: pb_len=0x%8.8x\n",pb_len); return(-EIO); } if (!(buf = iobuffer_alloc(pb_len))) return(-ENOMEM); memset(buf,0,pb_len); if ((res = vmfs_block_alloc(fs,VMFS_BLK_TYPE_PB,&pb_blk)) < 0) goto err_blk_alloc; for(i=0;iblocks[i]); entry = VMFS_BLK_PB_ENTRY(pb_blk); item = VMFS_BLK_PB_ITEM(pb_blk); if (vmfs_bitmap_set_item(fs->pbc,entry,item,buf) == -1) { res = -EIO; goto err_set_item; } memset(inode->blocks,0,sizeof(inode->blocks)); inode->blocks[0] = pb_blk; inode->zla = VMFS_BLK_TYPE_PB; inode->update_flags |= VMFS_INODE_SYNC_BLK; iobuffer_free(buf); return(0); err_set_item: vmfs_block_free(fs,pb_blk); err_blk_alloc: iobuffer_free(buf); return(res); } /* Proceed to block aggregation if the specified offset */ static int vmfs_inode_aggregate(vmfs_inode_t *inode,off_t pos) { int res; if ((inode->zla == VMFS_BLK_TYPE_SB) && (pos >= inode->blk_size)) { /* A directory consists only of sub-blocks (except the root dir) */ if (inode->type == VMFS_FILE_TYPE_DIR) return(-EFBIG); if ((res = vmfs_inode_aggregate_fb(inode)) < 0) return(res); } if ((inode->zla == VMFS_BLK_TYPE_FB) && (pos >= (inode->blk_size * VMFS_INODE_BLK_COUNT))) return(vmfs_inode_aggregate_pb(inode)); return(0); } /* Get a block for writing corresponding to the specified position */ int vmfs_inode_get_wrblock(vmfs_inode_t *inode,off_t pos,uint32_t *blk_id) { const vmfs_fs_t *fs = inode->fs; u_int blk_index; int res; if (!vmfs_fs_readwrite(fs)) return(-EROFS); *blk_id = 0; if ((res = vmfs_inode_aggregate(inode,pos)) < 0) return(res); if (inode->zla == VMFS_BLK_TYPE_PB) { DECL_ALIGNED_BUFFER_WOL(buf,fs->pbc->bmh.data_size); uint32_t pb_blk_id; uint32_t blk_per_pb; u_int pb_index; u_int sub_index; bool update_pb; update_pb = 0; blk_per_pb = fs->pbc->bmh.data_size / sizeof(uint32_t); blk_index = pos / inode->blk_size; pb_index = blk_index / blk_per_pb; sub_index = blk_index % blk_per_pb; if (pb_index >= VMFS_INODE_BLK_COUNT) return(-EINVAL); pb_blk_id = inode->blocks[pb_index]; /* Allocate a Pointer Block if none is currently present */ if (!pb_blk_id) { if ((res = vmfs_block_alloc(fs,VMFS_BLK_TYPE_PB,&pb_blk_id)) < 0) return(res); memset(buf,0,fs->pbc->bmh.data_size); inode->blocks[pb_index] = pb_blk_id; inode->update_flags |= VMFS_INODE_SYNC_BLK; update_pb = 1; } else { if (!vmfs_bitmap_get_item(fs->pbc, VMFS_BLK_PB_ENTRY(pb_blk_id), VMFS_BLK_PB_ITEM(pb_blk_id), buf)) return(-EIO); *blk_id = read_le32(buf,sub_index*sizeof(uint32_t)); } if (!*blk_id) { if ((res = vmfs_block_alloc(fs,VMFS_BLK_TYPE_FB,blk_id)) < 0) return(res); write_le32(buf,sub_index*sizeof(uint32_t),*blk_id); inode->blk_count++; inode->update_flags |= VMFS_INODE_SYNC_BLK; update_pb = 1; } else { if (VMFS_BLK_FB_TBZ(*blk_id)) { if ((res = vmfs_block_zeroize_fb(fs,*blk_id)) < 0) return(res); *blk_id = VMFS_BLK_FB_TBZ_CLEAR(*blk_id); write_le32(buf,sub_index*sizeof(uint32_t),*blk_id); inode->tbz--; inode->update_flags |= VMFS_INODE_SYNC_BLK; update_pb = 1; } } /* Update the pointer block on disk if it has been modified */ if (update_pb && !vmfs_bitmap_set_item(fs->pbc, VMFS_BLK_PB_ENTRY(pb_blk_id), VMFS_BLK_PB_ITEM(pb_blk_id), buf)) return(-EIO); } else { /* File Block or Sub-Block */ blk_index = pos / inode->blk_size; if (blk_index >= VMFS_INODE_BLK_COUNT) return(-EINVAL); *blk_id = inode->blocks[blk_index]; if (!*blk_id) { if ((res = vmfs_block_alloc(fs,inode->zla,blk_id)) < 0) return(res); inode->blocks[blk_index] = *blk_id; inode->blk_count++; inode->update_flags |= VMFS_INODE_SYNC_BLK; } else { if ((inode->zla == VMFS_BLK_TYPE_FB) && VMFS_BLK_FB_TBZ(*blk_id)) { if ((res = vmfs_block_zeroize_fb(fs,*blk_id)) < 0) return(res); *blk_id = VMFS_BLK_FB_TBZ_CLEAR(*blk_id); inode->blocks[blk_index] = *blk_id; inode->tbz--; inode->update_flags |= VMFS_INODE_SYNC_BLK; } } } return(0); } /* Truncate file */ int vmfs_inode_truncate(vmfs_inode_t *inode,off_t new_len) { const vmfs_fs_t *fs = inode->fs; u_int i; int res; if (!vmfs_fs_readwrite(fs)) return(-EROFS); if (new_len == inode->size) return(0); if (new_len > inode->size) { if ((res = vmfs_inode_aggregate(inode,new_len)) < 0) return(res); inode->size = new_len; inode->update_flags |= VMFS_INODE_SYNC_META; return(0); } switch(inode->zla) { case VMFS_BLK_TYPE_FB: case VMFS_BLK_TYPE_SB: { u_int start,end; start = ALIGN_NUM(new_len,inode->blk_size) / inode->blk_size; end = inode->size / inode->blk_size; for(i=start;i<=end;i++) { if (inode->blocks[i] != 0) { vmfs_block_free(fs,inode->blocks[i]); inode->blk_count--; inode->blocks[i] = 0; } } break; } case VMFS_BLK_TYPE_PB: { uint32_t blk_per_pb; u_int pb_start,pb_end; u_int sub_start,start; u_int blk_index; int count; blk_per_pb = fs->pbc->bmh.data_size / sizeof(uint32_t); blk_index = ALIGN_NUM(new_len,inode->blk_size) / inode->blk_size; pb_start = blk_index / blk_per_pb; sub_start = blk_index % blk_per_pb; pb_end = inode->size / (inode->blk_size * blk_per_pb); for(i=pb_start;i<=pb_end;i++) { if (inode->blocks[i] != 0) { start = (i == pb_start) ? sub_start : 0; /* Free blocks contained in PB */ count = vmfs_block_free_pb(fs,inode->blocks[i], start,blk_per_pb); if (count > 0) inode->blk_count -= count; if (start == 0) inode->blocks[i] = 0; } } break; } default: return(-EIO); } inode->size = new_len; inode->update_flags |= VMFS_INODE_SYNC_BLK; return(0); } /* Call a function for each allocated block of an inode */ int vmfs_inode_foreach_block(const vmfs_inode_t *inode, vmfs_inode_foreach_block_cbk_t cbk, void *opt_arg) { const vmfs_fs_t *fs = inode->fs; uint64_t blk_size; uint32_t blk_per_pb; uint32_t blk_id; u_int blk_total; u_int blk_count; int i,j; blk_total = 0; blk_per_pb = 0; blk_size = inode->blk_size; if (!blk_size) return(-1); blk_count = (inode->size + blk_size - 1) / blk_size; if (inode->zla == VMFS_BLK_TYPE_PB) { blk_per_pb = fs->pbc->bmh.data_size / sizeof(uint32_t); blk_total = blk_count; blk_count = (blk_count + blk_per_pb - 1) / blk_per_pb; } if (blk_count > VMFS_INODE_BLK_COUNT) return(-1); for(i=0;iblocks[i]; if (!blk_id) continue; cbk(inode,0,blk_id,opt_arg); /* Analyze pointer block */ if (inode->zla == VMFS_BLK_TYPE_PB) { DECL_ALIGNED_BUFFER_WOL(buf,fs->pbc->bmh.data_size); uint32_t blk_id2; u_int blk_rem; if (!vmfs_bitmap_get_item(fs->pbc, VMFS_BLK_PB_ENTRY(blk_id), VMFS_BLK_PB_ITEM(blk_id), buf)) return(-1); /* Compute remaining blocks */ blk_rem = m_min(blk_total - (i * blk_per_pb),blk_per_pb); for(j=0;jst_mode = inode->cmode; buf->st_nlink = inode->nlink; buf->st_uid = inode->uid; buf->st_gid = inode->gid; buf->st_size = inode->size; buf->st_atime = inode->atime; buf->st_mtime = inode->mtime; buf->st_ctime = inode->ctime; buf->st_blksize = M_BLK_SIZE; buf->st_blocks = inode->blk_count * (inode->blk_size / S_BLKSIZE); return(0); } /* Get inode status */ int vmfs_inode_stat_from_blkid(const vmfs_fs_t *fs,uint32_t blk_id, struct stat *buf) { vmfs_inode_t *inode; if (!(inode = vmfs_inode_acquire(fs,blk_id))) return(-EIO); vmfs_inode_stat(inode,buf); vmfs_inode_release(inode); return(0); } /* Change permissions */ int vmfs_inode_chmod(vmfs_inode_t *inode,mode_t mode) { inode->mode = mode; inode->update_flags |= VMFS_INODE_SYNC_META; return(0); } vmfs-tools/libvmfs/scsi.c0000644000000000000000000000462711733303644012641 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #ifdef __linux__ #include #include #endif #include /* SCSI "reserve" command */ #define SCSI_CMD_RESERVE 0x16 #define SCSI_CMD_LEN_RESERVE 6 /* SCSI "release command */ #define SCSI_CMD_RELEASE 0x17 #define SCSI_CMD_LEN_RELEASE 6 /* Send a SCSI "reserve" command */ int scsi_reserve(int fd) { #ifdef __linux__ sg_io_hdr_t io_hdr; u_char sense_buffer[32]; u_char cmd[SCSI_CMD_LEN_RESERVE] = { SCSI_CMD_RESERVE, 0, 0, 0, 0, 0 }; memset(&io_hdr, 0, sizeof(struct sg_io_hdr)); io_hdr.interface_id = 'S'; io_hdr.cmd_len = sizeof(cmd); io_hdr.mx_sb_len = sizeof(sense_buffer); io_hdr.dxfer_direction = SG_DXFER_NONE; io_hdr.cmdp = cmd; io_hdr.sbp = sense_buffer; io_hdr.timeout = 5000; if (ioctl(fd,SG_IO,&io_hdr) < 0) { perror("ioctl"); return(-1); } #endif return(0); } /* Send a SCSI "release" command */ int scsi_release(int fd) { #ifdef __linux__ sg_io_hdr_t io_hdr; u_char sense_buffer[32]; u_char cmd[SCSI_CMD_LEN_RELEASE] = { SCSI_CMD_RELEASE, 0, 0, 0, 0, 0 }; memset(&io_hdr, 0, sizeof(struct sg_io_hdr)); io_hdr.interface_id = 'S'; io_hdr.cmd_len = sizeof(cmd); io_hdr.mx_sb_len = sizeof(sense_buffer); io_hdr.dxfer_direction = SG_DXFER_NONE; io_hdr.cmdp = cmd; io_hdr.sbp = sense_buffer; io_hdr.timeout = 5000; if (ioctl(fd,SG_IO,&io_hdr) < 0) { perror("ioctl"); return(-1); } #endif return(0); } vmfs-tools/libvmfs/vmfs_dirent.h0000644000000000000000000000640611733303644014222 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_DIRENT_H #define VMFS_DIRENT_H #include #include "vmfs_file.h" #define VMFS_DIRENT_SIZE 0x8c struct vmfs_dirent_raw { uint32_t type; uint32_t block_id; uint32_t record_id; char name[128]; } __attribute__((packed)); #define VMFS_DIRENT_OFS_TYPE offsetof(struct vmfs_dirent_raw, type) #define VMFS_DIRENT_OFS_BLK_ID offsetof(struct vmfs_dirent_raw, block_id) #define VMFS_DIRENT_OFS_REC_ID offsetof(struct vmfs_dirent_raw, record_id) #define VMFS_DIRENT_OFS_NAME offsetof(struct vmfs_dirent_raw, name) #define VMFS_DIRENT_OFS_NAME_SIZE sizeof(((struct vmfs_dirent_raw *)(0))->name) struct vmfs_dirent { uint32_t type; uint32_t block_id; uint32_t record_id; char name[129]; }; struct vmfs_dir { vmfs_file_t *dir; uint32_t pos; vmfs_dirent_t dirent; u_char *buf; }; static inline const vmfs_fs_t *vmfs_dir_get_fs(vmfs_dir_t *d) { return d ? vmfs_file_get_fs(d->dir) : NULL; } /* Search for an entry into a directory ; affects position of the next entry vmfs_dir_read will return */ const vmfs_dirent_t *vmfs_dir_lookup(vmfs_dir_t *dir,const char *name); /* Resolve a path to a block id */ uint32_t vmfs_dir_resolve_path(vmfs_dir_t *base_dir,const char *path, int follow_symlink); /* Open a directory based on an inode buffer */ vmfs_dir_t *vmfs_dir_open_from_inode(const vmfs_inode_t *inode); /* Open a directory based on a directory entry */ vmfs_dir_t *vmfs_dir_open_from_blkid(const vmfs_fs_t *fs,uint32_t blk_id); /* Open a directory */ vmfs_dir_t *vmfs_dir_open_at(vmfs_dir_t *d,const char *path); /* Return next entry in directory. Returned directory entry will be overwritten by subsequent calls */ const vmfs_dirent_t *vmfs_dir_read(vmfs_dir_t *d); /* Set position of the next entry that vmfs_dir_read will return */ static inline void vmfs_dir_seek(vmfs_dir_t *d, uint32_t pos) { if (d) d->pos = pos; } /* Close a directory */ int vmfs_dir_close(vmfs_dir_t *d); /* Link an inode to a directory with the specified name */ int vmfs_dir_link_inode(vmfs_dir_t *d,const char *name,vmfs_inode_t *inode); /* Unlink an inode from a directory */ int vmfs_dir_unlink_inode(vmfs_dir_t *d,off_t pos,vmfs_dirent_t *entry); /* Create a new directory */ int vmfs_dir_create(vmfs_dir_t *d,const char *name,mode_t mode, vmfs_inode_t **inode); /* Delete a directory */ int vmfs_dir_delete(vmfs_dir_t *d,const char *name); /* Create a new directory given a path */ int vmfs_dir_mkdir_at(vmfs_dir_t *d,const char *path,mode_t mode); #endif vmfs-tools/libvmfs/vmfs_file.h0000644000000000000000000000661411733303644013655 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_FILE_H #define VMFS_FILE_H #include /* File types (in inode and directory entries) */ #define VMFS_FILE_TYPE_DIR 0x02 #define VMFS_FILE_TYPE_FILE 0x03 #define VMFS_FILE_TYPE_SYMLINK 0x04 #define VMFS_FILE_TYPE_META 0x05 #define VMFS_FILE_TYPE_RDM 0x06 /* File flags */ #define VMFS_FILE_FLAG_RW 0x01 /* === VMFS file abstraction === */ struct vmfs_file { vmfs_inode_t *inode; u_int flags; }; static inline const vmfs_fs_t *vmfs_file_get_fs(vmfs_file_t *f) { if (f && f->inode) return(f->inode->fs); return NULL; } static inline mode_t vmfs_file_type2mode(uint32_t type) { switch (type) { case VMFS_FILE_TYPE_DIR: return S_IFDIR; case VMFS_FILE_TYPE_SYMLINK: return S_IFLNK; default: return S_IFREG; } } /* Get file size */ static inline uint64_t vmfs_file_get_size(const vmfs_file_t *f) { return(f->inode->size); } /* Open a file based on an inode buffer */ vmfs_file_t *vmfs_file_open_from_inode(const vmfs_inode_t *inode); /* Open a file based on a block id */ vmfs_file_t *vmfs_file_open_from_blkid(const vmfs_fs_t *fs,uint32_t blk_id); /* Open a file */ vmfs_file_t *vmfs_file_open_at(vmfs_dir_t *dir,const char *path); /* Create a new file entry */ int vmfs_file_create(vmfs_dir_t *d,const char *name,mode_t mode, vmfs_inode_t **inode); /* Create a file */ vmfs_file_t *vmfs_file_create_at(vmfs_dir_t *dir,const char *path,mode_t mode); /* Close a file */ int vmfs_file_close(vmfs_file_t *f); /* Read data from a file at the specified position */ ssize_t vmfs_file_pread(vmfs_file_t *f,u_char *buf,size_t len,off_t pos); /* Write data to a file at the specified position */ ssize_t vmfs_file_pwrite(vmfs_file_t *f,u_char *buf,size_t len,off_t pos); /* Dump a file */ int vmfs_file_dump(vmfs_file_t *f,off_t pos,uint64_t len,FILE *fd_out); /* Get file status */ int vmfs_file_fstat(const vmfs_file_t *f,struct stat *buf); /* Get file file status (follow symlink) */ int vmfs_file_stat_at(vmfs_dir_t *dir,const char *path,struct stat *buf); /* Get file file status (do not follow symlink) */ int vmfs_file_lstat_at(vmfs_dir_t *dir,const char *path,struct stat *buf); /* Truncate a file (using a file descriptor) */ int vmfs_file_truncate(vmfs_file_t *f,off_t length); /* Truncate a file (using a path) */ int vmfs_file_truncate_at(vmfs_dir_t *dir,const char *path,off_t length); /* Change permissions of a file */ int vmfs_file_chmod(vmfs_file_t *f,mode_t mode); /* Change permissions of a file (using a path) */ int vmfs_file_chmod_at(vmfs_dir_t *dir,const char *path,mode_t mode); /* Delete a file */ int vmfs_file_delete(vmfs_dir_t *dir,const char *name); #endif vmfs-tools/libvmfs/vmfs_device.h0000644000000000000000000000371111733555434014176 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_DEVICE_H #define VMFS_DEVICE_H #include "vmfs.h" struct vmfs_device { ssize_t (*read)(const vmfs_device_t *dev, off_t pos, u_char *buf, size_t len); ssize_t (*write)(const vmfs_device_t *dev, off_t pos, const u_char *buf, size_t len); int (*reserve)(const vmfs_device_t *dev, off_t pos); int (*release)(const vmfs_device_t *dev, off_t pos); void (*close)(vmfs_device_t *dev); uuid_t *uuid; }; static inline ssize_t vmfs_device_read(const vmfs_device_t *dev, off_t pos, u_char *buf, size_t len) { return dev->read(dev, pos, buf, len); } static inline ssize_t vmfs_device_write(const vmfs_device_t *dev, off_t pos, const u_char *buf, size_t len) { if (dev->write) return dev->write(dev, pos, buf, len); return -1; } static inline int vmfs_device_reserve(const vmfs_device_t *dev, off_t pos) { if (dev->reserve) return dev->reserve(dev, pos); return 0; } static inline int vmfs_device_release(const vmfs_device_t *dev, off_t pos) { if (dev->release) return dev->release(dev, pos); return 0; } static inline void vmfs_device_close(vmfs_device_t *dev) { if (dev->close) dev->close(dev); } #endif vmfs-tools/libvmfs/vmfs_block.h0000644000000000000000000001642611733555434014040 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2011,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_BLOCK_H #define VMFS_BLOCK_H /* Block types */ enum vmfs_block_type { VMFS_BLK_TYPE_NONE = 0, VMFS_BLK_TYPE_FB, /* File Block */ VMFS_BLK_TYPE_SB, /* Sub-Block */ VMFS_BLK_TYPE_PB, /* Pointer Block */ VMFS_BLK_TYPE_FD, /* File Descriptor */ VMFS_BLK_TYPE_MAX, }; #define VMFS_BLK_SHIFT(mask) __builtin_ctz(mask) #define VMFS_BLK_VALUE(blk_id, mask) (((blk_id) & (mask)) >> VMFS_BLK_SHIFT(mask)) #define VMFS_BLK_MAX_VALUE(mask) (((mask) >> VMFS_BLK_SHIFT(mask)) + 1) #define VMFS_BLK_FILL(value, mask) (((value) << VMFS_BLK_SHIFT(mask)) & (mask)) #define VMFS_BLK_TYPE_MASK 0x00000007 /* Extract block type from a block ID */ #define VMFS_BLK_TYPE(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_TYPE_MASK) /* File-Block * { unsigned int item:26; * unsigned int flags:3; * unsigned int type:3; } * There is probably really no more than one flag, but so far, nothing * indicates what can be stored between the significant bits for the block * type and the TBZ flag, so we'll consider they are flags of some sort, * and will display them as such. */ #define VMFS_BLK_FB_ITEM_MASK 0xffffffc0 #define VMFS_BLK_FB_FLAGS_MASK 0x00000038 /* TBZ flag specifies if the block must be zeroed. */ #define VMFS_BLK_FB_TBZ_FLAG 4 #define VMFS_BLK_FB_ITEM(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FB_ITEM_MASK) #define VMFS_BLK_FB_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FB_FLAGS_MASK) #define VMFS_BLK_FB_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_FB_ITEM_MASK) #define VMFS_BLK_FB_TBZ(blk_id) \ (VMFS_BLK_FB_FLAGS(blk_id) & VMFS_BLK_FB_TBZ_FLAG) #define VMFS_BLK_FB_TBZ_CLEAR(blk_id) ((blk_id) & ~(VMFS_BLK_FILL(VMFS_BLK_FB_TBZ_FLAG, VMFS_BLK_FB_FLAGS_MASK))) #define VMFS_BLK_FB_BUILD(item, flags) \ (VMFS_BLK_FILL(item, VMFS_BLK_FB_ITEM_MASK) | \ VMFS_BLK_FILL(flags, VMFS_BLK_FB_FLAGS_MASK) | \ VMFS_BLK_TYPE_FB) /* Sub-Block * { unsigned int item_lsb:4; * unsigned int entry:22; * unsigned int flags:1; // Not sure it even exists * unsigned int item_msb: 2; * unsigned int type:3; } */ #define VMFS_BLK_SB_ITEM_LSB_MASK 0xf0000000 #define VMFS_BLK_SB_ENTRY_MASK 0x0fffffc0 #define VMFS_BLK_SB_FLAGS_MASK 0x00000020 #define VMFS_BLK_SB_ITEM_MSB_MASK 0x00000018 #define VMFS_BLK_SB_ITEM_VALUE_LSB_MASK 0x0000000f #define VMFS_BLK_SB_ITEM_VALUE_MSB_MASK 0x00000030 #define VMFS_BLK_SB_ITEM(blk_id) \ (VMFS_BLK_FILL(VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_ITEM_LSB_MASK), VMFS_BLK_SB_ITEM_VALUE_LSB_MASK) | \ VMFS_BLK_FILL(VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_ITEM_MSB_MASK), VMFS_BLK_SB_ITEM_VALUE_MSB_MASK)) #define VMFS_BLK_SB_ENTRY(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_ENTRY_MASK) #define VMFS_BLK_SB_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_FLAGS_MASK) #define VMFS_BLK_SB_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_SB_ITEM_VALUE_LSB_MASK | VMFS_BLK_SB_ITEM_VALUE_MSB_MASK) #define VMFS_BLK_SB_MAX_ENTRY VMFS_BLK_MAX_VALUE(VMFS_BLK_SB_ENTRY_MASK) #define VMFS_BLK_SB_BUILD(entry, item, flags) \ (VMFS_BLK_FILL(entry, VMFS_BLK_SB_ENTRY_MASK) | \ VMFS_BLK_FILL(VMFS_BLK_VALUE(item, VMFS_BLK_SB_ITEM_VALUE_LSB_MASK), \ VMFS_BLK_SB_ITEM_LSB_MASK) | \ VMFS_BLK_FILL(VMFS_BLK_VALUE(item, VMFS_BLK_SB_ITEM_VALUE_MSB_MASK), \ VMFS_BLK_SB_ITEM_MSB_MASK) | \ VMFS_BLK_FILL(flags, VMFS_BLK_SB_FLAGS_MASK) | \ VMFS_BLK_TYPE_SB) /* Pointer-Block * { unsigned int item:4; * unsigned int entry:22; * unsigned int flags:3; * unsigned int type:3; } */ #define VMFS_BLK_PB_ITEM_MASK 0xf0000000 #define VMFS_BLK_PB_ENTRY_MASK 0x0fffffc0 #define VMFS_BLK_PB_FLAGS_MASK 0x00000038 #define VMFS_BLK_PB_ITEM(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_PB_ITEM_MASK) #define VMFS_BLK_PB_ENTRY(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_PB_ENTRY_MASK) #define VMFS_BLK_PB_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_PB_FLAGS_MASK) #define VMFS_BLK_PB_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_PB_ITEM_MASK) #define VMFS_BLK_PB_MAX_ENTRY VMFS_BLK_MAX_VALUE(VMFS_BLK_PB_ENTRY_MASK) #define VMFS_BLK_PB_BUILD(entry, item, flags) \ (VMFS_BLK_FILL(entry, VMFS_BLK_PB_ENTRY_MASK) | \ VMFS_BLK_FILL(item, VMFS_BLK_PB_ITEM_MASK) | \ VMFS_BLK_FILL(flags, VMFS_BLK_PB_FLAGS_MASK) | \ VMFS_BLK_TYPE_PB) /* File Descriptor * { unsigned int item:10; * unsigned int entry:16; * unsigned int flags:3; * unsigned int type:3; } */ #define VMFS_BLK_FD_ITEM_MASK 0xffc00000 #define VMFS_BLK_FD_ENTRY_MASK 0x003fffc0 #define VMFS_BLK_FD_FLAGS_MASK 0x00000038 #define VMFS_BLK_FD_ITEM(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FD_ITEM_MASK) #define VMFS_BLK_FD_ENTRY(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FD_ENTRY_MASK) #define VMFS_BLK_FD_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FD_FLAGS_MASK) #define VMFS_BLK_FD_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_FD_ITEM_MASK) #define VMFS_BLK_FD_MAX_ENTRY VMFS_BLK_MAX_VALUE(VMFS_BLK_FD_ENTRY_MASK) #define VMFS_BLK_FD_BUILD(entry, item, flags) \ (VMFS_BLK_FILL(entry, VMFS_BLK_FD_ENTRY_MASK) | \ VMFS_BLK_FILL(item, VMFS_BLK_FD_ITEM_MASK) | \ VMFS_BLK_FILL(flags, VMFS_BLK_FD_FLAGS_MASK) | \ VMFS_BLK_TYPE_FD) struct vmfs_block_info { uint32_t entry, item, flags; enum vmfs_block_type type; }; /* Get bitmap info (bitmap type,entry and item) from a block ID */ int vmfs_block_get_info(uint32_t blk_id, vmfs_block_info_t *info); /* Get block status (allocated or free) */ int vmfs_block_get_status(const vmfs_fs_t *fs,uint32_t blk_id); /* Allocate the specified block */ int vmfs_block_alloc_specified(const vmfs_fs_t *fs,uint32_t blk_id); /* Free the specified block */ int vmfs_block_free(const vmfs_fs_t *fs,uint32_t blk_id); /* Allocate a single block */ int vmfs_block_alloc(const vmfs_fs_t *fs,uint32_t blk_type,uint32_t *blk_id); /* Zeroize a file block */ int vmfs_block_zeroize_fb(const vmfs_fs_t *fs,uint32_t blk_id); /* Free blocks hold by a pointer block */ int vmfs_block_free_pb(const vmfs_fs_t *fs,uint32_t pb_blk, u_int start,u_int end); /* Read a piece of a sub-block */ ssize_t vmfs_block_read_sb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len); /* Write a piece of a sub-block */ ssize_t vmfs_block_write_sb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len); /* Read a piece of a file block */ ssize_t vmfs_block_read_fb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len); /* Write a piece of a file block */ ssize_t vmfs_block_write_fb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos, u_char *buf,size_t len); #endif vmfs-tools/libvmfs/utils.h0000644000000000000000000001216511733555434013047 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef UTILS_H #define UTILS_H #include #include #include #include /* Max and min macro */ #define m_max(a,b) (((a) > (b)) ? (a) : (b)) #define m_min(a,b) (((a) < (b)) ? (a) : (b)) #define M_UUID_BUFLEN 36 #if defined(__amd64__) || defined(__i386__) #define LE_AND_NO_ALIGN 1 #endif /* Read a 16-bit word in little endian format */ static inline uint16_t read_le16(const u_char *p,int offset) { #ifdef LE_AND_NO_ALIGN return(*((uint16_t *)&p[offset])); #else return((uint16_t)p[offset] | ((uint16_t)p[offset+1] << 8)); #endif } /* Write a 16-bit word in little endian format */ static inline void write_le16(u_char *p,int offset,uint16_t val) { #ifdef LE_AND_NO_ALIGN *(uint16_t *)&p[offset] = val; #else p[offset] = val & 0xFF; p[offset+1] = val >> 8; #endif } /* Read a 32-bit word in little endian format */ static inline uint32_t read_le32(const u_char *p,int offset) { #ifdef LE_AND_NO_ALIGN return(*((uint32_t *)&p[offset])); #else return((uint32_t)p[offset] | ((uint32_t)p[offset+1] << 8) | ((uint32_t)p[offset+2] << 16) | ((uint32_t)p[offset+3] << 24)); #endif } /* Write a 32-bit word in little endian format */ static inline void write_le32(u_char *p,int offset,uint32_t val) { #ifdef LE_AND_NO_ALIGN *(uint32_t *)&p[offset] = val; #else p[offset] = val & 0xFF; p[offset+1] = val >> 8; p[offset+2] = val >> 16; p[offset+3] = val >> 24; #endif } /* Read a 64-bit word in little endian format */ static inline uint64_t read_le64(const u_char *p,int offset) { #ifdef LE_AND_NO_ALIGN return(*((uint64_t *)&p[offset])); #else return((uint64_t)read_le32(p,offset) + ((uint64_t)read_le32(p,offset+4) << 32)); #endif } /* Write a 64-bit word in little endian format */ static inline void write_le64(u_char *p,int offset,uint64_t val) { #ifdef LE_AND_NO_ALIGN *(uint64_t *)&p[offset] = val; #else write_le32(p,offset,val); write_le32(p,offset+4,val); #endif } #define cpu_to_lexx(bits) \ static inline uint##bits##_t cpu_to_le##bits(uint##bits##_t i) \ { \ u_char *p = (u_char *)&i; \ return read_le##bits(p, 0); \ } cpu_to_lexx(16) cpu_to_lexx(32) cpu_to_lexx(64) /* Read an UUID at a given offset in a buffer */ static inline void read_uuid(const u_char *buf,int offset,uuid_t *uuid) { memcpy(uuid,buf+offset,sizeof(uuid_t)); } /* Write an UUID to a given offset in a buffer */ static inline void write_uuid(u_char *buf,int offset,const uuid_t *uuid) { memcpy(buf+offset,uuid,sizeof(uuid_t)); } #define M_SECTOR_SIZE 512 #define M_BLK_SIZE 4096 /* * Block size/alignment required for direct I/O : * 4k bytes on Linux 2.4, * 512 bytes on Linux 2.6 */ #define M_DIO_BLK_SIZE 4096 #define ALIGN_CHECK(val, mult) (((val) & ((mult) - 1)) == 0) #define ALIGN_NUM(val, mult) (((val) + ((mult) - 1)) & ~(((mult) - 1))) #define ALIGN_PTR(ptr, mult) (void *)ALIGN_NUM((uintptr_t)(ptr), mult) #define DECL_ALIGNED_BUFFER(name, size) \ u_char __##name[(size) + M_SECTOR_SIZE]; \ u_char *name = (u_char *)ALIGN_PTR(__##name,M_SECTOR_SIZE); \ size_t name##_len = (size) #define DECL_ALIGNED_BUFFER_WOL(name, size) \ u_char __##name[(size) + M_SECTOR_SIZE]; \ u_char *name = (u_char *)ALIGN_PTR(__##name,M_SECTOR_SIZE); \ /* Convert an UUID into a string */ char *m_uuid_to_str(const uuid_t uuid,char *str); /* Convert a timestamp to a string */ char *m_ctime(const time_t *ct,char *buf,size_t buf_len); /* Convert a file mode to a string */ char *m_fmode_to_str(u_int mode,char *buf); /* Count the number of bits set in a byte */ int bit_count(u_char val); /* Allocate a buffer with alignment compatible for direct I/O */ u_char *iobuffer_alloc(size_t len); /* Free a buffer previously allocated by iobuffer_alloc() */ void iobuffer_free(u_char *buf); /* Read from file descriptor at a given offset */ ssize_t m_pread(int fd,void *buf,size_t count,off_t offset); /* Write to a file descriptor at a given offset */ ssize_t m_pwrite(int fd,const void *buf,size_t count,off_t offset); /* Returns directory name */ char *m_dirname(const char *path); /* Returns base name */ char *m_basename(const char *path); #ifdef NO_STRNDUP #include static inline char *strndup(const char *s, size_t n) { char *result; n = strnlen(s, n); result = malloc(n + 1); if (!result) return NULL; memcpy(result, s, n); result[n + 1] = 0; } #endif #endif vmfs-tools/libvmfs/vmfs_fs.c0000644000000000000000000002131611733555434013343 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS filesystem.. */ #define _GNU_SOURCE #include #include #include "vmfs.h" /* VMFS meta-files */ #define VMFS_FBB_FILENAME ".fbb.sf" #define VMFS_FDC_FILENAME ".fdc.sf" #define VMFS_PBC_FILENAME ".pbc.sf" #define VMFS_SBC_FILENAME ".sbc.sf" /* Read a block from the filesystem */ ssize_t vmfs_fs_read(const vmfs_fs_t *fs,uint32_t blk,off_t offset, u_char *buf,size_t len) { off_t pos; pos = (uint64_t)blk * vmfs_fs_get_blocksize(fs); pos += offset; return(vmfs_device_read(fs->dev,pos,buf,len)); } /* Write a block to the filesystem */ ssize_t vmfs_fs_write(const vmfs_fs_t *fs,uint32_t blk,off_t offset, const u_char *buf,size_t len) { off_t pos; pos = (uint64_t)blk * vmfs_fs_get_blocksize(fs); pos += offset; return(vmfs_device_write(fs->dev,pos,buf,len)); } /* Read filesystem information */ static int vmfs_fsinfo_read(vmfs_fs_t *fs) { DECL_ALIGNED_BUFFER(buf,512); vmfs_fsinfo_t *fsi = &fs->fs_info; if (vmfs_device_read(fs->dev,VMFS_FSINFO_BASE,buf,buf_len) != buf_len) return(-1); fsi->magic = read_le32(buf,VMFS_FSINFO_OFS_MAGIC); if (fsi->magic != VMFS_FSINFO_MAGIC) { fprintf(stderr,"VMFS FSInfo: invalid magic number 0x%8.8x\n",fsi->magic); return(-1); } fsi->vol_version = read_le32(buf,VMFS_FSINFO_OFS_VOLVER); fsi->version = buf[VMFS_FSINFO_OFS_VER]; fsi->mode = read_le32(buf,VMFS_FSINFO_OFS_MODE); fsi->block_size = read_le64(buf,VMFS_FSINFO_OFS_BLKSIZE); fsi->subblock_size = read_le32(buf,VMFS_FSINFO_OFS_SBSIZE); fsi->fdc_header_size = read_le32(buf,VMFS_FSINFO_OFS_FDC_HEADER_SIZE); fsi->fdc_bitmap_count = read_le32(buf,VMFS_FSINFO_OFS_FDC_BITMAP_COUNT); fsi->ctime = (time_t)read_le32(buf,VMFS_FSINFO_OFS_CTIME); read_uuid(buf,VMFS_FSINFO_OFS_UUID,&fsi->uuid); fsi->label = strndup((char *)buf+VMFS_FSINFO_OFS_LABEL, VMFS_FSINFO_OFS_LABEL_SIZE); read_uuid(buf,VMFS_FSINFO_OFS_LVM_UUID,&fsi->lvm_uuid); return(0); } static vmfs_bitmap_t *vmfs_open_meta_file(vmfs_dir_t *root_dir, char *name, uint32_t max_item, uint32_t max_entry, char *desc) { vmfs_bitmap_t *bitmap = vmfs_bitmap_open_at(root_dir, name); if (!bitmap) { fprintf(stderr, "Unable to open %s.\n", desc); return NULL; } if (bitmap->bmh.items_per_bitmap_entry > max_item) { fprintf(stderr, "Unsupported number of items per entry in %s.\n", desc); return NULL; } if ((bitmap->bmh.total_items + bitmap->bmh.items_per_bitmap_entry - 1) / bitmap->bmh.items_per_bitmap_entry > max_entry) { fprintf(stderr,"Unsupported number of entries in %s.\n", desc); return NULL; } return bitmap; } /* Open all the VMFS meta files */ static int vmfs_open_all_meta_files(vmfs_fs_t *fs) { vmfs_bitmap_t *fdc = fs->fdc; vmfs_dir_t *root_dir; /* Read the first inode */ if (!(root_dir = vmfs_dir_open_from_blkid(fs,VMFS_BLK_FD_BUILD(0, 0, 0)))) { fprintf(stderr,"VMFS: unable to open root directory\n"); return(-1); } if (!(fs->fbb = vmfs_bitmap_open_at(root_dir,VMFS_FBB_FILENAME))) { fprintf(stderr,"Unable to open file-block bitmap (FBB).\n"); return(-1); } if (fs->fbb->bmh.total_items > VMFS_BLK_FB_MAX_ITEM) { fprintf(stderr, "Unsupported number of items in file-block bitmap (FBB).\n"); return(-1); } fs->fdc = vmfs_open_meta_file(root_dir, VMFS_FDC_FILENAME, VMFS_BLK_FD_MAX_ITEM, VMFS_BLK_FD_MAX_ENTRY, "file descriptor bitmap (FDC)"); if (!fs->fdc) return(-1); fs->pbc = vmfs_open_meta_file(root_dir, VMFS_PBC_FILENAME, VMFS_BLK_PB_MAX_ITEM, VMFS_BLK_PB_MAX_ENTRY, "pointer block bitmap (PBC)"); if (!fs->pbc) return(-1); fs->sbc = vmfs_open_meta_file(root_dir, VMFS_SBC_FILENAME, VMFS_BLK_SB_MAX_ITEM, VMFS_BLK_SB_MAX_ENTRY, "pointer block bitmap (PBC)"); if (!fs->sbc) return(-1); vmfs_bitmap_close(fdc); vmfs_dir_close(root_dir); return(0); } /* Read FDC base information */ static int vmfs_read_fdc_base(vmfs_fs_t *fs) { vmfs_inode_t inode = { { 0, }, }; uint32_t fdc_base; /* * Compute position of FDC base: it is located at the first * block after heartbeat information. * When blocksize = 8 Mb, there is free space between heartbeats * and FDC. */ fdc_base = m_max(1, (VMFS_HB_BASE + VMFS_HB_NUM * VMFS_HB_SIZE) / vmfs_fs_get_blocksize(fs)); if (fs->debug_level > 0) printf("FDC base = block #%u\n", fdc_base); inode.fs = fs; inode.mdh.magic = VMFS_INODE_MAGIC; inode.size = fs->fs_info.block_size; inode.type = VMFS_FILE_TYPE_META; inode.blk_size = fs->fs_info.block_size; inode.blk_count = 1; inode.zla = VMFS_BLK_TYPE_FB; inode.blocks[0] = VMFS_BLK_FB_BUILD(fdc_base, 0); inode.ref_count = 1; fs->fdc = vmfs_bitmap_open_from_inode(&inode); /* Read the meta files */ if (vmfs_open_all_meta_files(fs) == -1) return(-1); return(0); } static vmfs_device_t *vmfs_device_open(char **paths, vmfs_flags_t flags) { vmfs_lvm_t *lvm; if (!(lvm = vmfs_lvm_create(flags))) { fprintf(stderr,"Unable to create LVM structure\n"); return NULL; } for (; *paths; paths++) { if (vmfs_lvm_add_extent(lvm, vmfs_vol_open(*paths, flags)) == -1) { fprintf(stderr,"Unable to open device/file \"%s\".\n",*paths); return NULL; } } if (vmfs_lvm_open(lvm)) { vmfs_device_close(&lvm->dev); return NULL; } return &lvm->dev; } /* Open a filesystem */ vmfs_fs_t *vmfs_fs_open(char **paths, vmfs_flags_t flags) { vmfs_device_t *dev; vmfs_fs_t *fs; vmfs_host_init(); dev = vmfs_device_open(paths, flags); if (!dev || !(fs = calloc(1,sizeof(*fs)))) return NULL; fs->inode_hash_buckets = VMFS_INODE_HASH_BUCKETS; fs->inodes = calloc(fs->inode_hash_buckets,sizeof(vmfs_inode_t *)); if (!fs->inodes) { free(fs); return NULL; } fs->dev = dev; fs->debug_level = flags.debug_level; /* Read FS info */ if (vmfs_fsinfo_read(fs) == -1) { fprintf(stderr,"VMFS: Unable to read FS information\n"); vmfs_fs_close(fs); return NULL; } if (uuid_compare(fs->fs_info.lvm_uuid, *fs->dev->uuid)) { fprintf(stderr,"VMFS: FS doesn't belong to the underlying LVM\n"); vmfs_fs_close(fs); return NULL; } /* Read FDC base information */ if (vmfs_read_fdc_base(fs) == -1) { fprintf(stderr,"VMFS: Unable to read FDC information\n"); vmfs_fs_close(fs); return NULL; } if (fs->debug_level > 0) printf("VMFS: filesystem opened successfully\n"); return fs; } /* * Check that all inodes have been released, and synchronize them if this * is not the case. */ static void vmfs_fs_sync_inodes(vmfs_fs_t *fs) { vmfs_inode_t *inode; int i; for(i=0;iinodes[i];inode;inode=inode->next) { #if 0 printf("Inode 0x%8.8x: ref_count=%u, update_flags=0x%x\n", inode->id,inode->ref_count,inode->update_flags); #endif if (inode->update_flags) vmfs_inode_update(inode,inode->update_flags & VMFS_INODE_SYNC_BLK); } } } /* Close a FS */ void vmfs_fs_close(vmfs_fs_t *fs) { if (!fs) return; if (fs->hb_refcount > 0) { fprintf(stderr, "Warning: heartbeat still active in metadata (ref_count=%u)\n", fs->hb_refcount); } vmfs_heartbeat_unlock(fs,&fs->hb); vmfs_bitmap_close(fs->fbb); vmfs_bitmap_close(fs->fdc); vmfs_bitmap_close(fs->pbc); vmfs_bitmap_close(fs->sbc); vmfs_fs_sync_inodes(fs); vmfs_device_close(fs->dev); free(fs->inodes); free(fs->fs_info.label); free(fs); } vmfs-tools/libvmfs/vmfs_volume.h0000644000000000000000000001045111733555434014245 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_VOLUME_H #define VMFS_VOLUME_H #include /* === Volume Info === */ #define VMFS_VOLINFO_BASE 0x100000 #define VMFS_VOLINFO_MAGIC 0xc001d00d struct vmfs_volinfo_raw { uint32_t magic; uint32_t ver; u_char _unknown0[6]; u_char lun; u_char _unknown1[3]; char name[28]; u_char _unknown2[49]; /* The beginning of this array looks like it is a LUN * GUID for 3.31 * filesystems, and the LUN identifier * string as given by ESX for 3.21 filesystems. */ uint32_t size; /* Size of the physical volume, divided by 256 */ u_char _unknown3[31]; uuid_t uuid; uint64_t ctime; /* ctime? in usec */ uint64_t mtime; /* mtime? in usec */ } __attribute__((packed)); #define VMFS_VOLINFO_OFS_MAGIC offsetof(struct vmfs_volinfo_raw, magic) #define VMFS_VOLINFO_OFS_VER offsetof(struct vmfs_volinfo_raw, ver) #define VMFS_VOLINFO_OFS_LUN offsetof(struct vmfs_volinfo_raw, lun) #define VMFS_VOLINFO_OFS_NAME offsetof(struct vmfs_volinfo_raw, name) #define VMFS_VOLINFO_OFS_SIZE offsetof(struct vmfs_volinfo_raw, size) #define VMFS_VOLINFO_OFS_UUID offsetof(struct vmfs_volinfo_raw, uuid) #define VMFS_VOLINFO_OFS_NAME_SIZE \ sizeof(((struct vmfs_volinfo_raw *)(0))->name) /* === LVM Info === */ #define VMFS_LVMINFO_OFFSET 0x0200 struct vmfs_lvminfo_raw { uint64_t size; uint64_t blocks; /* Seems to always be sum(num_segments for all extents) + * num_extents */ uint32_t _unknown0; char uuid_str[35]; u_char _unknown1[29]; uuid_t uuid; uint32_t _unknown2; uint64_t ctime; /* ctime? in usec */ uint32_t _unknown3; uint32_t num_segments; uint32_t first_segment; uint32_t _unknown4; uint32_t last_segment; uint32_t _unknown5; uint64_t mtime; /* mtime? in usec */ uint32_t num_extents; } __attribute__((packed)); #define VMFS_LVMINFO(field) \ (VMFS_LVMINFO_OFFSET + offsetof(struct vmfs_lvminfo_raw, field)) #define VMFS_LVMINFO_OFS_SIZE VMFS_LVMINFO(size) #define VMFS_LVMINFO_OFS_BLKS VMFS_LVMINFO(blocks) #define VMFS_LVMINFO_OFS_UUID_STR VMFS_LVMINFO(uuid_str) #define VMFS_LVMINFO_OFS_UUID VMFS_LVMINFO(uuid) #define VMFS_LVMINFO_OFS_NUM_SEGMENTS VMFS_LVMINFO(num_segments) #define VMFS_LVMINFO_OFS_FIRST_SEGMENT VMFS_LVMINFO(first_segment) #define VMFS_LVMINFO_OFS_LAST_SEGMENT VMFS_LVMINFO(last_segment) #define VMFS_LVMINFO_OFS_NUM_EXTENTS VMFS_LVMINFO(num_extents) /* * Segment bitmap is at 0x80200. * Segment information are at 0x80600 + i * 0x80 for i between 0 and * VMFS_LVMINFO_OFS_NUM_SEGMENTS * * At 0x10 (64-bits) or 0x14 (32-bits) within a segment info, it seems like * something related to the absolute segment number in the logical volume * (looks like absolute segment number << 4 on 32-bits). * Other segment information seem relative to the extent (always the same * pattern on all extents) */ struct vmfs_volinfo { uint32_t magic; uint32_t version; char *name; uuid_t uuid; int lun; uint32_t size; uint64_t lvm_size; uint64_t blocks; uuid_t lvm_uuid; uint32_t num_segments, first_segment, last_segment, num_extents; }; /* === VMFS mounted-volume === */ struct vmfs_volume { vmfs_device_t dev; char *device; int fd; vmfs_flags_t flags; int is_blkdev; int scsi_reservation; /* VMFS volume base */ off_t vmfs_base; /* Volume and FS information */ vmfs_volinfo_t vol_info; }; /* Open a VMFS volume */ vmfs_volume_t *vmfs_vol_open(const char *filename,vmfs_flags_t flags); #endif vmfs-tools/libvmfs/vmfs_dirent.c0000644000000000000000000002507511733555434014226 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* * VMFS directory entries. */ #define _GNU_SOURCE #include #include #include #include "vmfs.h" /* Read a directory entry */ static int vmfs_dirent_read(vmfs_dirent_t *entry,const u_char *buf) { entry->type = read_le32(buf,VMFS_DIRENT_OFS_TYPE); entry->block_id = read_le32(buf,VMFS_DIRENT_OFS_BLK_ID); entry->record_id = read_le32(buf,VMFS_DIRENT_OFS_REC_ID); memcpy(entry->name,buf+VMFS_DIRENT_OFS_NAME,VMFS_DIRENT_OFS_NAME_SIZE); entry->name[VMFS_DIRENT_OFS_NAME_SIZE] = 0; return(0); } /* Write a directory entry */ static int vmfs_dirent_write(const vmfs_dirent_t *entry,u_char *buf) { write_le32(buf,VMFS_DIRENT_OFS_TYPE,entry->type); write_le32(buf,VMFS_DIRENT_OFS_BLK_ID,entry->block_id); write_le32(buf,VMFS_DIRENT_OFS_REC_ID,entry->record_id); memcpy(buf+VMFS_DIRENT_OFS_NAME,entry->name,VMFS_DIRENT_OFS_NAME_SIZE); return(0); } /* Search for an entry into a directory ; affects position of the next entry vmfs_dir_read will return */ const vmfs_dirent_t *vmfs_dir_lookup(vmfs_dir_t *d,const char *name) { const vmfs_dirent_t *rec; vmfs_dir_seek(d,0); while((rec = vmfs_dir_read(d))) { if (!strcmp(rec->name,name)) return(rec); } return(NULL); } /* Read a symlink */ static char *vmfs_dirent_read_symlink(const vmfs_fs_t *fs, const vmfs_dirent_t *entry) { vmfs_file_t *f; size_t str_len; char *str = NULL; if (!(f = vmfs_file_open_from_blkid(fs,entry->block_id))) return NULL; str_len = vmfs_file_get_size(f); if (!(str = malloc(str_len+1))) goto done; if ((str_len = vmfs_file_pread(f,(u_char *)str,str_len,0)) == -1) { free(str); goto done; } str[str_len] = 0; done: vmfs_file_close(f); return str; } /* Resolve a path name to a block id */ uint32_t vmfs_dir_resolve_path(vmfs_dir_t *base_dir,const char *path, int follow_symlink) { vmfs_dir_t *cur_dir,*sub_dir; const vmfs_dirent_t *rec; char *nam, *ptr,*sl,*symlink; int close_dir = 0; const vmfs_fs_t *fs = vmfs_dir_get_fs(base_dir); uint32_t ret = 0; cur_dir = base_dir; if (*path == '/') { if (!(cur_dir = vmfs_dir_open_from_blkid(fs,VMFS_BLK_FD_BUILD(0, 0, 0)))) return(0); path++; close_dir = 1; } if (!(rec = vmfs_dir_lookup(cur_dir,"."))) return(0); ret = rec->block_id; nam = ptr = strdup(path); while(*ptr != 0) { sl = strchr(ptr,'/'); if (sl != NULL) *sl = 0; if (*ptr == 0) { ptr = sl + 1; continue; } if (!(rec = vmfs_dir_lookup(cur_dir,ptr))) { ret = 0; break; } ret = rec->block_id; if ((sl == NULL) && !follow_symlink) break; /* follow the symlink if we have an entry of this type */ if (rec->type == VMFS_FILE_TYPE_SYMLINK) { if (!(symlink = vmfs_dirent_read_symlink(fs,rec))) { ret = 0; break; } ret = vmfs_dir_resolve_path(cur_dir,symlink,1); free(symlink); if (!ret) break; } /* last token */ if (sl == NULL) break; /* we must have a directory here */ if (!(sub_dir = vmfs_dir_open_from_blkid(fs,ret))) { ret = 0; break; } if (close_dir) vmfs_dir_close(cur_dir); cur_dir = sub_dir; close_dir = 1; ptr = sl + 1; } free(nam); if (close_dir) vmfs_dir_close(cur_dir); return(ret); } /* Cache content of a directory */ static int vmfs_dir_cache_entries(vmfs_dir_t *d) { off_t dir_size; if (d->buf != NULL) free(d->buf); dir_size = vmfs_file_get_size(d->dir); if (!(d->buf = calloc(1,dir_size))) return(-1); if (vmfs_file_pread(d->dir,d->buf,dir_size,0) != dir_size) { free(d->buf); return(-1); } return(0); } /* Open a directory file */ static vmfs_dir_t *vmfs_dir_open_from_file(vmfs_file_t *file) { vmfs_dir_t *d; if (file == NULL) return NULL; if (!(d = calloc(1, sizeof(*d))) || (file->inode->type != VMFS_FILE_TYPE_DIR)) { vmfs_file_close(file); return NULL; } d->dir = file; vmfs_dir_cache_entries(d); return d; } /* Open a directory based on an inode buffer */ vmfs_dir_t *vmfs_dir_open_from_inode(const vmfs_inode_t *inode) { return vmfs_dir_open_from_file(vmfs_file_open_from_inode(inode)); } /* Open a directory based on a directory entry */ vmfs_dir_t *vmfs_dir_open_from_blkid(const vmfs_fs_t *fs,uint32_t blk_id) { return vmfs_dir_open_from_file(vmfs_file_open_from_blkid(fs,blk_id)); } /* Open a directory */ vmfs_dir_t *vmfs_dir_open_at(vmfs_dir_t *d,const char *path) { return vmfs_dir_open_from_file(vmfs_file_open_at(d,path)); } /* Return next entry in directory. Returned directory entry will be overwritten by subsequent calls */ const vmfs_dirent_t *vmfs_dir_read(vmfs_dir_t *d) { u_char *buf; if (d == NULL) return(NULL); if (d->buf) { if (d->pos*VMFS_DIRENT_SIZE >= vmfs_file_get_size(d->dir)) return(NULL); buf = &d->buf[d->pos*VMFS_DIRENT_SIZE]; } else { u_char _buf[VMFS_DIRENT_SIZE]; if ((vmfs_file_pread(d->dir,_buf,sizeof(_buf), d->pos*sizeof(_buf)) != sizeof(_buf))) return(NULL); buf = _buf; } vmfs_dirent_read(&d->dirent,buf); d->pos++; return &d->dirent; } /* Close a directory */ int vmfs_dir_close(vmfs_dir_t *d) { if (d == NULL) return(-1); if (d->buf) free(d->buf); vmfs_file_close(d->dir); free(d); return(0); } /* Link an inode to a directory with the specified name */ int vmfs_dir_link_inode(vmfs_dir_t *d,const char *name,vmfs_inode_t *inode) { vmfs_fs_t *fs = (vmfs_fs_t *)vmfs_dir_get_fs(d); u_char buf[VMFS_DIRENT_SIZE]; vmfs_dirent_t entry; off_t dir_size; ssize_t res; if (!vmfs_fs_readwrite(fs)) return(-EROFS); if (vmfs_dir_lookup(d,name) != NULL) return(-EEXIST); memset(&entry,0,sizeof(entry)); entry.type = inode->type; entry.block_id = inode->id; entry.record_id = inode->id2; strncpy(entry.name,name,VMFS_DIRENT_OFS_NAME_SIZE); vmfs_dirent_write(&entry,buf); dir_size = vmfs_file_get_size(d->dir); res = vmfs_file_pwrite(d->dir,buf,sizeof(buf),dir_size); if (res != sizeof(buf)) return((res < 0) ? res : -ENOSPC); inode->nlink++; vmfs_dir_cache_entries(d); return(0); } /* Unlink an inode from a directory */ int vmfs_dir_unlink_inode(vmfs_dir_t *d,off_t pos,vmfs_dirent_t *entry) { vmfs_fs_t *fs = (vmfs_fs_t *)vmfs_dir_get_fs(d); vmfs_inode_t *inode; off_t last_entry; if (!vmfs_fs_readwrite(fs)) return(-EROFS); /* Update the inode, delete it if nlink reaches 0 */ if (!(inode = vmfs_inode_acquire(fs,entry->block_id))) return(-ENOENT); if (!--inode->nlink) { vmfs_inode_truncate(inode,0); vmfs_block_free(fs,inode->id); } else { inode->update_flags |= VMFS_INODE_SYNC_META; } vmfs_inode_release(inode); /* Remove the entry itself */ last_entry = vmfs_file_get_size(d->dir) - VMFS_DIRENT_SIZE; if (pos != last_entry) { u_char buf[VMFS_DIRENT_SIZE]; vmfs_file_pread(d->dir,buf,sizeof(buf),last_entry); vmfs_file_pwrite(d->dir,buf,sizeof(buf),pos); } vmfs_file_truncate(d->dir,last_entry); vmfs_dir_cache_entries(d); return(0); } /* Create a new directory */ int vmfs_dir_create(vmfs_dir_t *d,const char *name,mode_t mode, vmfs_inode_t **inode) { vmfs_fs_t *fs = (vmfs_fs_t *)vmfs_dir_get_fs(d); vmfs_dir_t *new_dir; vmfs_inode_t *new_inode; int res; if (!vmfs_fs_readwrite(fs)) return(-EROFS); if (vmfs_dir_lookup(d,name)) return(-EEXIST); /* Allocate inode for the new directory */ if ((res = vmfs_inode_alloc(fs,VMFS_FILE_TYPE_DIR,mode,&new_inode)) < 0) return(res); if (!(new_dir = vmfs_dir_open_from_inode(new_inode))) { res = -ENOENT; goto err_open_dir; } vmfs_dir_link_inode(new_dir,".",new_inode); vmfs_dir_link_inode(new_dir,"..",d->dir->inode); vmfs_dir_link_inode(d,name,new_inode); *inode = new_inode; return(0); err_open_dir: vmfs_inode_release(new_inode); return(res); } /* Delete a directory */ int vmfs_dir_delete(vmfs_dir_t *d,const char *name) { vmfs_fs_t *fs = (vmfs_fs_t *)vmfs_dir_get_fs(d); vmfs_dirent_t *entry; vmfs_dir_t *sub; off_t pos; if (!vmfs_fs_readwrite(fs)) return(-EROFS); if (!(entry = (vmfs_dirent_t *)vmfs_dir_lookup(d,name))) return(-ENOENT); if (entry->type != VMFS_FILE_TYPE_DIR) return(-ENOTDIR); if (!(sub = vmfs_dir_open_from_blkid(fs,entry->block_id))) return(-ENOENT); /* The directory must be empty (excepted for . and ..) */ if (vmfs_file_get_size(sub->dir) != (2 * VMFS_DIRENT_SIZE)) { vmfs_dir_close(sub); return(-ENOTEMPTY); } d->dir->inode->nlink--; sub->dir->inode->nlink = 1; sub->dir->inode->update_flags |= VMFS_INODE_SYNC_META; /* Update the parent directory */ pos = (d->pos - 1) * VMFS_DIRENT_SIZE; vmfs_dir_unlink_inode(d,pos,entry); vmfs_dir_close(sub); return(0); } /* Create a new directory given a path */ int vmfs_dir_mkdir_at(vmfs_dir_t *d,const char *path,mode_t mode) { char *dir_name,*base_name; vmfs_dir_t *dir; vmfs_inode_t *new_inode = NULL; int res; dir_name = m_dirname(path); base_name = m_basename(path); if (!dir_name || !base_name) { res = -EFAULT; goto done; } if (!(dir = vmfs_dir_open_at(d,dir_name))) { res = -ENOENT; goto done; } res = vmfs_dir_create(dir,base_name,mode,&new_inode); if (new_inode) vmfs_inode_release(new_inode); vmfs_dir_close(dir); done: free(dir_name); free(base_name); return(res); } vmfs-tools/libvmfs/vmfs_lvm.h0000644000000000000000000000310611733555434013533 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2011 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef VMFS_LVM_H #define VMFS_LVM_H #define VMFS_LVM_MAX_EXTENTS 32 #define VMFS_LVM_SEGMENT_SIZE (256 * 1024 * 1024) struct vmfs_lvminfo { uuid_t uuid; uint32_t num_extents; uint64_t size; uint64_t blocks; }; /* === LVM === */ struct vmfs_lvm { vmfs_device_t dev; vmfs_flags_t flags; /* LVM information */ vmfs_lvminfo_t lvm_info; /* number of extents currently loaded in the lvm */ int loaded_extents; /* extents */ vmfs_volume_t *extents[VMFS_LVM_MAX_EXTENTS]; }; /* Create a volume structure */ vmfs_lvm_t *vmfs_lvm_create(vmfs_flags_t flags); /* Add an extent to the LVM */ int vmfs_lvm_add_extent(vmfs_lvm_t *lvm, vmfs_volume_t *vol); /* Open an LVM */ int vmfs_lvm_open(vmfs_lvm_t *lvm); /* Returns whether a given device is a vmfs_lvm */ bool vmfs_device_is_lvm(vmfs_device_t *dev); #endif vmfs-tools/GNUmakefile0000644000000000000000000001305111733555434012141 0ustar ifeq (,$(filter clean distclean realclean,$(MAKECMDGOALS))) -include version -include config.cache endif include utils.mk PACKAGE := vmfs-tools all: SUBDIRS := $(subst /,,$(dir $(wildcard */manifest.mk))) ifeq (,$(fuse/LDFLAGS)) ifeq (,$(filter clean distclean,$(MAKECMDGOALS))) SUBDIRS := $(filter-out vmfs-fuse,$(SUBDIRS)) endif endif ENV_CFLAGS := $(CFLAGS) ENV_LDFLAGS := $(LDFLAGS) CFLAGS := LDFLAGS := __NEW_VARS := CFLAGS LDFLAGS define subdir_variables __VARS := $$(filter-out $$(__NEW_VARS),$$(.VARIABLES)) include $(1)/manifest.mk __NEW_VARS := $$(filter-out $$(__VARS) __VARS,$$(.VARIABLES)) $$(foreach var,$$(__NEW_VARS), $$(if $$($$(var)),$$(eval $(1)/$$(var) := $$($$(var)))$$(eval $$(var) := ))) $(1)/SRC := $(wildcard $(1)/*.c) $(1)/HEADERS := $(wildcard $(1)/*.h) $(1)/OBJS := $$($(1)/SRC:%.c=%.o) ifeq (,$(filter lib%,$(1))) $(1)/TARGET := $(1)/$(1) $(1)/MANSRC := $(wildcard $(1)/$(1).txt) else $(1)/TARGET := $(1)/$(1).a endif $(1)/CFLAGS += -I$(1) endef $(foreach subdir,$(SUBDIRS), $(eval $(call subdir_variables,$(subdir)))) define order_by_requires $(eval __result := $(foreach subdir,$(1),$(if $(filter $(1),$($(subdir)/REQUIRES)),,$(subdir)))) $(eval __tmp := $(filter-out $(__result),$(1))) $(if $(filter-out $(__tmp),$(1)),,$(error Dependency loop between subdirectories)) $(if $(__tmp),$(call order_by_requires,$(__tmp),$(2) $(__result)),$(2) $(__result)) endef define subdir_rules $(1)/CFLAGS += $$(foreach require,$$($(1)/REQUIRES),$$($$(require)/CFLAGS)) $(1)/LDFLAGS += $$(foreach require,$$($(1)/REQUIRES),$$($$(require)/LDFLAGS)) $$($(1)/TARGET): LDFLAGS += $$($(1)/LDFLAGS) $$($(1)/TARGET): $$($(1)/OBJS) $$(foreach require,$$($(1)/REQUIRES),$$($$(require)/TARGET)) $$(foreach obj,$$($(1)/OBJS), $$(eval $$(obj): CFLAGS += $$($(1)/CFLAGS) $$($$(obj)_CFLAGS))) endef $(foreach subdir,$(strip $(call order_by_requires,$(SUBDIRS))),$(eval $(call subdir_rules,$(subdir)))) CC := gcc OPTIMFLAGS := $(if $(filter -O%,$(ENV_CFLAGS)),,-O2) CFLAGS := $(ENV_CFLAGS) $(filter-out $(ENV_CFLAGS),-Wall $(OPTIMFLAGS) -g -D_FILE_OFFSET_BITS=64 $(EXTRA_CFLAGS)) CFLAGS += $(if $(HAS_STRNDUP),,-DNO_STRNDUP=1) LDFLAGS := $(ENV_LDFLAGS) $(filter-out $(ENV_LDFLAGS),$(EXTRA_LDFLAGS)) SRC := $(wildcard *.c) $(foreach subdir,$(SUBDIRS),$($(subdir)/SRC)) HEADERS := $(wildcard *.h) $(foreach subdir,$(SUBDIRS),$($(subdir)/HEADERS)) OBJS := $(SRC:%.c=%.o) BUILD_PROGRAMS := $(foreach subdir,$(filter-out lib%,$(SUBDIRS)),$($(subdir)/TARGET)) BUILD_LIBS := $(foreach subdir,$(filter lib%,$(SUBDIRS)),$($(subdir)/TARGET)) MANSRCS := $(foreach subdir,$(SUBDIRS),$($(subdir)/MANSRC)) MANDOCBOOK := $(MANSRCS:%.txt=%.xml) MANPAGES := $(foreach man,$(MANSRCS),$(man:%.txt=%.$(shell sed '1{s/^.*(//;s/)//;q;}' $(man)))) EXTRA_DIST := LICENSE README TODO AUTHORS test.img configure all: $(BUILD_PROGRAMS) $(wildcard .gitignore) test.img ALL_MAKEFILES = $(filter-out config.cache,$(MAKEFILE_LIST)) configure.mk version: VERSION := $(GEN_VERSION) version: $(filter-out version, $(ALL_MAKEFILES)) $(SRC) $(HEADERS) $(wildcard .git/logs/HEAD .git/refs/tags) echo "#if 1" > $@ echo "#define VERSION \"$(VERSION)\"" >> $@ echo "#else" >> $@ echo VERSION := $(VERSION) >> $@ echo "#endif" >> $@ $(BUILD_LIBS): ar -r $@ $^ ranlib $@ $(OBJS): %.o: %.c $(HEADERS) $(BUILD_PROGRAMS): $(CC) -o $@ $^ $(LDFLAGS) clean distclean: CLEAN := $(wildcard $(BUILD_LIBS) $(BUILD_PROGRAMS) $(OBJS) $(PACKAGE)-*.tar.gz $(MANPAGES) $(MANDOCBOOK)) distclean: CLEAN += $(wildcard config.cache) clean distclean: $(if $(strip $(CLEAN)),rm $(strip $(CLEAN))) ALL_DIST := $(SRC) $(HEADERS) $(ALL_MAKEFILES) $(MANSRCS) $(EXTRA_DIST) DIST_DIR := $(PACKAGE)-$(VERSION:v%=%) dist: $(ALL_DIST) @rm -rf "$(DIST_DIR)" @mkdir "$(DIST_DIR)" $(foreach subdir,$(SUBDIRS),"$(DIST_DIR)/$(subdir)") tar -cf - $(ALL_DIST) | tar -C "$(DIST_DIR)" -xf - tar -zcf "$(DIST_DIR).tar.gz" "$(DIST_DIR)" @rm -rf "$(DIST_DIR)" ifneq (,$(ASCIIDOC)) ifneq (,$(XSLTPROC)) ifneq (,$(DOCBOOK_XSL)) $(MANDOCBOOK): %.xml: %.txt $(ASCIIDOC) -a manversion=$(VERSION:v%=%) -a manmanual=$(PACKAGE) -b docbook -d manpage -o $@ $< $(MANPAGES): %.8: %.xml $(XSLTPROC) -o $@ --nonet --novalid $(DOCBOOK_XSL) $< doc: $(MANPAGES) endif endif endif $(DESTDIR)/%: install -d -m 0755 $@ INSTALL_PROGRAMS := $(foreach prog,$(BUILD_PROGRAMS),$(if $(filter noinst,$($(prog)_OPTIONS)),,$(prog))) INSTALLED_PROGRAMS := $(patsubst %,$(DESTDIR)$(sbindir)/%,$(notdir $(INSTALL_PROGRAMS))) $(foreach prog, $(INSTALL_PROGRAMS), $(eval $(DESTDIR)$(sbindir)/$(notdir $(prog)): $(prog))) $(INSTALLED_PROGRAMS): %: $(DESTDIR)$(sbindir) install $(if $(NO_STRIP),,-s )-m 0755 $(filter-out $<,$^) $(dir $@) INSTALLED_MANPAGES := $(patsubst %.txt,$(DESTDIR)$(mandir)/man8/%.8,$(notdir $(foreach subdir,$(SUBDIRS),$($(subdir)/MANSRC)))) $(foreach man,$(foreach subdir,$(SUBDIRS),$($(subdir)/MANSRC:%.txt=%.8)), $(eval $(DESTDIR)$(mandir)/man8/$(notdir $(man)): $(man))) $(INSTALLED_MANPAGES): %: $(DESTDIR)$(mandir)/man8 install -m 0755 $(filter-out $<,$^) $(dir $@) install: $(INSTALLED_PROGRAMS) $(INSTALLED_MANPAGES) ifeq (,$(filter dist clean distclean,$(MAKECMDGOALS))) test.img: imager/imager.c | imager/imager ./imager/imager -r $@ > $@.new diff $@ $@.new || ./imager/imager -v $@.new mv -f $@.new $@ endif .PHONY: all clean distclean dist install doc .gitignore: $(ALL_MAKEFILES) (echo "*.tar.gz"; \ echo "*.[ao]"; \ echo "*.xml"; \ echo "*.8"; \ echo "version"; \ echo "config.cache"; \ $(foreach program, $(BUILD_PROGRAMS),echo $(program);) \ ) > $@ config.cache: configure.mk @$(MAKE) -s -f $^ $(if $(ENV_CFLAGS),CFLAGS='$(ENV_CFLAGS)') $(if $(ENV_LDFLAGS),LDFLAGS='$(ENV_LDFLAGS)') vmfs-tools/.git/0000755000000000000000000000000011733555664010735 5ustar vmfs-tools/.git/COMMIT_EDITMSG0000644000000000000000000000102211733555642013013 0ustar Release 0.2.5-1 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # On branch debian # Your branch is ahead of 'origin/debian' by 73 commits. # # Changes to be committed: # (use "git reset HEAD^1 ..." to unstage) # # modified: debian/changelog # # Untracked files: # (use "git add ..." to include in what will be committed) # # debian/files # debian/vmfs-tools.debhelper.log # debian/vmfs-tools.substvars # debian/vmfs-tools/ vmfs-tools/.git/packed-refs0000644000000000000000000000013611733303644013031 0ustar # pack-refs with: peeled 7c33aa6f03074c143c6190c0f5ba6ef345541022 refs/remotes/origin/master vmfs-tools/.git/HEAD0000644000000000000000000000002711733555424011352 0ustar ref: refs/heads/debian vmfs-tools/.git/description0000644000000000000000000000011111733303642013157 0ustar Unnamed repository; edit this file 'description' to name the repository. vmfs-tools/.git/objects/0000755000000000000000000000000011733555634012363 5ustar vmfs-tools/.git/objects/56/0000755000000000000000000000000011733412720012601 5ustar vmfs-tools/.git/objects/56/05a28306acf98166c75ecada17c8ae0349643e0000444000000000000000000000026211733412720017732 0ustar xڍMj0@u6E颇I#[$Q}JzҶ[:]E⣢$%f-滴\i ;K~pDF4w|ګScI7kIvmfs-tools/.git/objects/56/3e5b9596f27cb290680aaa5266252f39eaabdf0000444000000000000000000000150211733411227020015 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9h-ŏ[ݱ3sט2vT͹ć}֚եe&J-qv{.|fj0(5p3xCOJ=0#, 3.L޶VWe͓޵z?X|+E e .v/ۙar1(@ZmWz}]G4βR딽MFSpWNJ֑߭YQFjbQIRj"ȳ3N^Ֆ:] f0,OAvqu)7,Y6dMlƝג9O28˓'J>E9wFbI~Mdey){RqbiD{C&Xka`JssS{^du9e@k%90nbʷUe0`ꉾ8''|zwŬԒĔĒDt7W>뤱*`Xvs˛6;ns Ҳ\Mķ-l ݹh ִYXf0yf(߂? N ˒vmfs-tools/.git/objects/ec/0000755000000000000000000000000011733376057012752 5ustar vmfs-tools/.git/objects/ec/17217745711ccbb86f7f59f99fb970f16cdaab0000444000000000000000000000337411733376057020215 0ustar xXmoH* r!UKҨ A^,۬akyס76KZYU ޙg^vav9Coc71Ov]9|Q)$REӘ%V*8\hLE} 8sOp\ӥX)O#4 Y<:Rm0b;Ӌ <1crSk!TY Ro*q]I =$80O}KLС. 9M7|L(ђ>31 E੢ۋk А,,34"\*0 TX\|/4ٴnno*Rn|d{M'4 e [e ݘFw4O[(8-_[b`XP_rSn]ss,:Eb!U,yV)>~B%8;GY * PVIDlyE 8}nIź2)'vߑ8eT.#~r$2 AJɱi2XQJ ÑcCܘ#ū.2 H?KK$bB2n~Pe dr3Q[Կf2 &)HUJ, P'1"[F= $s֊n|=\VvOEgrAmq1\ aBp!DbF:WFvz]I>x xIn)΍^l]t\9SM$qIXkwESFZRKIs *+дy[W~$R,;'o"Tz~8:rnpLI&&5o8_-e/@{P,9R?2~n zY+*.6caAՊލT,}.aJ"havnR}L+%|EQڝboeF_ Fj\,6}73,JUq%LJ# &&3>Y #Z22g z[lhg<ś \5Th.Q&4Cfn})B`ng{ܥ7W|x`Rf}q@xvQE_G~meCl\ʱnn\ٙݧ橸ge/U҇1񓕽n].ocĩ+{z,gIVVKߩ$(bE  U%p)/ʽܳ+ ˅-E3n|KÓGxFf'aÉT.nq=5ˢfqi(&WѸ0^vmfs-tools/.git/objects/fa/0000755000000000000000000000000011733411227012736 5ustar vmfs-tools/.git/objects/fa/722409c034d7c864c014df02601196f3af5a4a0000444000000000000000000000027511733411227017632 0ustar xڍ1n0 E;(K1Pd HJFCn_ߓZJf|](Ln%&fL+4x4 *ɳxoźXMSb1'}jKV77}g-EVS 4mVRS^K[/Vh|]UCOMrxͧw78\QM-ILI,I(9+JiN?}>~UiN m7'ic:)6 +-)yD|KН`M̎EaKg2-St/ݺvmfs-tools/.git/objects/0f/0c18ebe83febcb45774e362d266ad6a8239c2d0000444000000000000000000000017411733374416020164 0ustar x+)JMU04d040031QH+N+M++(a(2as;odTn{8N 071/3-D/7mnPκ;>5ɟTȨx ;<37!RT<F3vmfs-tools/.git/objects/a6/0000755000000000000000000000000011733374416012666 5ustar vmfs-tools/.git/objects/a6/ff8f0fb2983f212cc696ee2193007b730c9a770000444000000000000000000000104711733374416017755 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t b^eg|P>}]ۋg@UZ\w,e>Vg-]%t'rj@ՔdaV?/=ӧpM ktJSK=<ɻ^gEb^L]}%IMNY.qL;_+vmfs-tools/.git/objects/54/0000755000000000000000000000000011733410134012574 5ustar vmfs-tools/.git/objects/54/5c86e7a11bcbf36465235f892df8efa12937540000444000000000000000000000150211733410134017664 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9h-ŏ[ݱ3sט2^z'QNqgh5 KI-LN*tZ{u&fɣ\5EafQj^ (g8񪇞ڕ{4`UaGXf0\m am +LI'k1͛\ZqV2]r;^bI3WbP"5s]'ֆ,eM>TQf(_stᕮ#[=ĢDgg sY˽2)-u0q`Xr3j*RnXY^Em~1ӛ#;%_}s;0e0p'O|r4Ē2S@~ϥ ,L֊Tg榴ϝ1{5rrJs`ip{ o7`H}qON+Y%)%@"gE<)'oǯ*}IcU㯗7mL[w8e^Sde9 /o)Z siٱ(`x)6Q&J؝N;^vmfs-tools/.git/objects/54/c3fc87ce8a23c8ad5514a50563c2715008763c0000444000000000000000000000541211733410134017562 0ustar xY{s8)PwSI{{ά8g'c;ڎF*TH%v )#v{{3纱D ?o{;EFa*E 20b sb襳, { x}xOYE: Q xm34#";,ǟJ&۬]yu7&1mQP/Jߦ;U)Tt$ N[L$9돭Pr[kwu3\Ƭ: !8<-7\ eJʛYsWF4gdx^WP@)/ ;p$7w}liU ;THqJB^DyWbQ4=Tu֬ȉEv/BmܬDd#P1j<]0H]@[Kka¬gn-6A&Q$Y@Q  |%wt ܚ~ICOj,ͨp֘(pkzD*R2_ë̗pk[tVb Fįhll+ԙ0/h(*_!COj-fR۳(-TaM&1a9"ITj[,z>. #bbI1@~LPV"f [fRS8vRv ;`_zQRDߧPzɿ0A%UZS8pKZjN38 Kt|i$\0DJCzڤ)wYlcuwztkg)tuaQ%{Ѡ;A{'+5RM6 ۋ,Z lS%%Yg"z@kۆ~5Gli-3:Æ1 :VgNآxͮi׺E.}u!spOʑ ZE*RݧAjխU2hOZk֟v "ֶ^Dv1Z9yH>p$ü2~S|sֲ]XUyhv.El]Itõ7E:"57;uE(No AAyDq`.Zb7;'4?e9ܗy"%ut!}PXu^K\R)ȄɂZɝ۱”V="fxa\+{CcmX6 *UsXyB,X*:1Ǖvr1Oջ8h>}>=~ip)3;WdpM'r ̥w% C7ב/_W6wBu66N# 7A$*@JJ5Wsfa<$jP^td0R,\4NP> CPaC*z #` =u6 &g]:aR &}Xsg-]/\؋[a$%Eta 0(ߌ9cF`-k2 P!2!$Z =K6 ,Dϣ8 ->PCR$iZ}WFJ*#lIb+D0ة@XpPQg9F4Li7NC(,9+lOve).=[-ӫKtʟc(EZS_r͐Vk%-%5{+*@YZW8ͧ=_-Qٹv4knm:EԝK..tAmA>t 3]^ XLB%F4W >yo1z3|0#;L t汾8M%΅W g]%0z#>[6..] JB|&HvjNRgC- 4s[us<>{Z.;|HR 9i;˓9*X()d-6UfIÄ?8[A*7ٕS+N0aMl 2(HzЕZlj0nD]$tƛ,\g;ln(udBRj즙fiT7:1u/LTkcqK1[C<4iQ3?f>[x+zݍ:vF+4YWħFfJc@:NY4+MoDKuXPsg-\*uZթfl+0B i?70'N Rw:XZtl7~:aQD)->GA5y<%݁D('nf|@̥\\|'aD+B`sWywhLoVg r BM&q^q<5љ<] u~Ӆ3~*^WS{j8P_Zn : Xf7jk}.JKdݸK\"O?T_0!;\m$'#@s#~,K6"N4&U4Z|T+*(,DW;WyC7B+= Wn1CZb`hi9 [w4i}FQ,)MG' WKdxmG%>X*:FV|軓o0.?Q}d( ױ*-,RO.r*ZPQuR"P?娘Nn?Зȵ ZƩP.ԫ bA| Bm%B}!鹉 UlKnt5sH栖OPk|1S.6j]n͎A5Lյ rY38l?M+-cJRތ?=R%< B»z'$|uluuFp_Jg|94^x,Rg 25OFOYKkM76xah64[ŏ]he clUFEm}ߚU`" 65֭ Ḥ´!uEj -3 y4ԝڿ̕ 'b E}\FǙg{R/B'.{(7-|龵_!O@XS.GZN,"XeCxynvۦNh[ojV7ZZҴn ^ޣsbU3rÂLf0rvajZm/N}Jc'=qcd=S]C0D:DjCYګ>4Pky';+wfDjz uQǑ3Yۡ D@ Ng5\:@1aȰZ%;f;HQ~M.B:bz7w~#/ KĈ%5s,T@EvZECg _$^SW/(:Y' E!T{49pDtX,g&,?w9OX^H'NuEp|[s;< dTaNM?Ӭư4 X MKdvaE *׬w+sbn)P!ć%\8݅PAv&2 BQChrl_ 5o%+ :Ϸ$Hʕ1zY_)3%]SHbbeVUG 7 O9 x,Ũl7yyЕwLG-0T`,\1P*k*Q๟ο8iqn A@xyqAvH<&?AN!du,-^vNk˒eRpڊx& WvCӘm v(m3͚P5[ sTWI>)m9ȩvbBhLKP3"7mn .|1ZF(pAۢ)P 6 4L^iP]nc9!Rػf/c;Y~naŦJ`f,(ɴm4:\Hڶ$ W%g2X-[aXn ݐ7˗#5Pn It,]Cܭ?Tu 3wUڲ&!ZV4qf2>s[ژ)B`H%X&K3Jljkf>m;o2xZj+#gxVܑ_1Oloy" )TS pg{= T/5ش <03q4BAKp6稥)ratBcD!PeA@Hx"kve~?ô'JIcP=k7ȮciC0 ʾd Ivmfs-tools/.git/objects/d4/0000755000000000000000000000000011733551143012661 5ustar vmfs-tools/.git/objects/d4/1d399b8cb538efccb8a115e6d377eccef3df480000444000000000000000000000344711733551143020424 0ustar xYmoHFڃ'2Kr4X@v.,۴ۍa}W6̎(`wu=OUW=/d*p/Q JBoa?%˰7D$Pnbl.z[fOs*$[ h2 7~s"ȟc5_"h,t)Msgjr0S f܍,K+X|7NHS/tTg"6JkI<%$rGXO>?G`'^H}PĂꊘ)xڏS1tJb q/ <#shIՕ9PjHw+S o9[`Dst1.q#$\1|O'кϭѨu?yFc9g8J^HFg\!}aV?O0'z#hMǑ0? 0w_O Bcir,ih9@?I .\U\.gqND"TAin?9w7xdb~ W "d'S*뙟ɓu/hXC@/$C@G8ޚ hjlw9]H\9~oR\\J;^;KkحzCB ~tb >|Eq2w \&d>͍ՆpNr܍?44G]Q/oSY(h,nH;JnReH1zMCuNGob-J1Ht|`(ݙRqH]^wC/pGKˑ`R;L3* (`Li:[^"$(ŃhD<*RQ1 @_̀tI3 &@IUi`pSЂݕHy&(Gvp>Feo8NMׅr^5m clÄ(R%+LMTЍQ=bd[vC:6|h^ruU3rhvfY<ƌ SUk{J StP{39Rܩ R»z')$|uluGLp[|"94^x,Ұg 2%5OFOYk7xa{h64[O]he cl*74a~kVQ-4,DXK\Zjf.S.Ri bԁaf#SiZ,(΀PVPwVj0Ww=,>qQgU ~ l>auD6>K#}b*,v%8rbaW.#jÓ]Emi s]VCVk\^{:[-/6ysbU3rÂםNםH˵AZ#kʾtʼt0F!yݍ<,K).NO{^-@Zoa$z["rVediz[A9U7EuGgmv++U7SW3wktBUdcaȰZt{&ۯf;HﻗQ~K.B:bz7W~%ѯ KbD9wj|s_-gm -gQقG($(.;TGU?,({' E!T{49pDtX,g&,?w9OX^HgNuEp|_sk11ݿ[ІO;Y)t`$ei oN.BޥRxx0f`<3awlʃ4KfS'A&!MfϮNj_"ЃsN. n.:z'LW |̂ te';;IIsH ybeߦo9j= b7=0 Q3awzM1ēNq?l4[[`H#{ܤ9Yؠ(O_'sckV(D׺JcA𴏿K OcLo 9 Q㭢m*B:7 *u@uZ?h$ @VDYL(I7  ERu>$uܣ(}'!i$'d+ "ӄ{|-܃ԌlBIB3ނdXH8-!QͬfMI 7)")+W4cW1y 1258#kjvm4KҊ%E.ؖy?F}v_ĠsIHӝCt Ebɤdl^$Ψ&XlTF.*1ŭ_U"M̔HZ]9b-ԫԬXqk9 *B3wz>6-xPu*GMtzwpho~kOMqsJ}h)jTq[5|Sg k({: 7LR Y9Tgd;÷ܖ3KaA!F hppѨw{FJRn]#7 qfIfʍb'bHxc7Zs[w6Q{Qc rꞄSf/>  DZxm "e:1)iwjG)>Sw2)eҬ%p"J*p6AXl:ĪMJXŧ%*9ߋbmkTK L|/ă9˅7qy"joZTyk%$>EKRƟNDZ!R#Bt)PǿٙiqLbkZK{% slD %cma|0\WljuO|W⧵"zGxZDDI8tb2HwKzKd-j.ؿ-( =r@Q59PKO݌Ө9 4cTgO˄hUb5(py2r"kc[V Cs\}~uzJF}B06ފTج5zӗj dܦG׶q&#*bQ2f"OJ|MwpL>k,rfgtE5u}{L@>\=BQW@l :@,ɜPӖ1Ec8AX>I, TqrxrzƮ(,n}[ƭDYtʝȇ|M&u>{hPW|vϫ8O}i.ęm-]LMݳ@ :n{]oj?( YT|n^ЕBp9k'ݰ,;;v>d6l;'NUSk<3[s[cæޏV5ZOBPW}^JA)ʰT ["/V)>L ^(zZ.?&*0[ss>kJ{9@Oå|uA[ja-.yW{6(roK}&&Y[jKgU)^^ &q=XUoG1%M,H lmE1(ڼ)&3AuO%'e36+hVIpMx9V,(8ska"Q5$䴬jrbsG9%7ڤ_`^N͉XdZC?:KY ~nϜl_A;f3ez{%: O8pzw '.4˲ )3-d=8ǟUfu"+^R:q"}{,ns-&)1*SjUSVYqbP3> fOdCjשA4 :BwW+鴕) ?6WmL[mMjdOl)f!:|ZK޼{%vߗcS'mҙ%W[s)ne{I1)(;{*XEMcAm;y\0.$Kō!gsaj}kMj{=bg2%b_ ^ ԕ,I1TȄ5Q.2!6ՏIbv[Z[a>C]VQk96eaGpo&^֖kj*CLϦչg|f13#-=3/r5 W!*2V'-YuurvH] ۺ^֗wVoOr?S >(7[= JjyjMٴl"8&rtj=7Ն/7`r.ro+J)ʆ!}fΪƔwt.] j/|'-yX/vPvweD@im~~2.L֖sNE0Ygb`|gI7.#Y%؃}3Azv=z#?[eVȈ]+]uD3TL_>V_+Z8K8aB;Y{Rdvmfs-tools/.git/objects/e4/ca8864e5bcd37faa667becc1cd2bd25218a3d00000444000000000000000000000150111733411456020356 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9h-ŏ[ݱ3sט2*l_IMxaaVz|;ԲTBWeW7nbPy`,aE.%t;s5^޿:L.E(RJ/ȚYVjh2O:5wQI^:#+HM,*IJMyv0+R' [ %<)V..ŝ55P|1)9߻ڸZ7]# CY?'yDɧ(NH,iۯ,3/?|\z:N2hok8Lu qV |nnJyX[ڋ.,h~8 _Xv# L='`OnpZX4P rVӜ&<|g4V +?nN8zyƴu~Sm55AVZS 2q;W-?_6+ ?le[t4_hV1vmfs-tools/.git/objects/e4/beef5be0ac5b86572dfbdefa0833d3121eb6b00000444000000000000000000000221111733412720020424 0ustar x+)JMU045`040031QK,L/JeXoJ?MSS14?(A)$v/˰VSOKĊ"A&fe2|M0RO{ce0羂Pe>ή~ W'Ĉ/|,bo9gJ\]|]V˳.ͧ;5rŭwgpM۔_([.*RR26yrgYQw]ZQ~YP*Jrӊ?2s|u/m`(+(a0֡{eۍn=kόePE)ɹ)@Z϶<ήf͓se0([YtѶ^G;EB⠊3ƨ|htwEEq.6#`TXcCsI]wzlҒϾ$Fu(w9EICf=o[E M6wT ߺiũ@(vn8g")ڨCùiq0QqIE|RfInbθnbzfV)\\Ea: z_?z}7?[9@&k0@τS[}WT`o Tmu3ugY ̢Լ}OhM1Z (`)wkNK; !+eyxr4L=]vV62^=<dwU\muJhCQe{4{͹7vR7 -fu]q(z>3+fhdEE%I )~42[moCڤ:K`-'krO͊,S=Ρ/y@WwDk?,]N N䉒OQΝXҶ_YYf^~ (P~Wm I_g-q.](=P)GŴڜ\iĄ09)%0Cۢ~`جd+ss9dsԒĔĒDg ͒QdGDeXf0V>VcuߥO5R0'"+-)yԩND6D] DvNMzMk4vmfs-tools/.git/objects/e9/0000755000000000000000000000000011733543147012674 5ustar vmfs-tools/.git/objects/e9/b87df036c7d0545b71d287c3a1802d2b2e8c890000444000000000000000000000150211733376453017752 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9h-ŏ[ݱ3sט2;p<O#CVZ T*M̒G=k}9̢ԼPًpU=+hۏ(`_3yZ^/4$@V 4Ozc͛7b*1e0LȻvĒng+WŠ(EjV3Ӧe_>ȸ뮤Ce5 ]Tr҅Wn-Ȋ2RJRAq2e-ʤ Vm6a+x Kaqgz  #_LoJ`6|iW|PO~_wsm3")_+)΁)v+4V݈*!}SOʼn?9q<ӻ(f妖$$$ 4ľ 4Y'Uiʏ^޴1mu{MM悼l"haL\UFW fǢ03D)]n`w:Mc0vmfs-tools/.git/objects/e9/4d91a219bd499a2ad78569723be80c2d0a9b350000444000000000000000000000104711733543147017754 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&3o{cg9EZcQVVx9'MGv>5LB&371=AQ2kOta(L*JMLIMa3cL-ni.Wgԓq n#$C[ꯒt~c)w:k*=S$3- {Ϝ}vyٿ?>ClYVZpXI:ۦ/{b:+qHjrr.lܰÔ&vmfs-tools/.git/objects/a9/0000755000000000000000000000000011733412720012660 5ustar vmfs-tools/.git/objects/a9/91b72033d0a62ee62f209151f4fbc39725cd4b0000444000000000000000000000031711733412720017717 0ustar xڍN ]7 MѝfJl kܻKm&evJ[ RI)vϟ5sI7%t!!b6.8W3hgZ[.~`Dvmfs-tools/.git/objects/a9/4a826683d75f9001045f176d7bb8ad7c2e78030000444000000000000000000000105011733410505017575 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lϙWOo-^m3GMWWIjq^fn:ޱoz;XtЉȩUSZS g>[ZN!6M+-Ne8,Q$zm=x1u8$59e Z11.|)ۯV$vmfs-tools/.git/objects/pack/0000755000000000000000000000000011733303644013271 5ustar vmfs-tools/.git/objects/pack/pack-9f013551793d1456fb6038dfaf47eb702de4e730.pack0000444000000000000000000173625611733303644022374 0ustar PACK ^xڍAJ1@}NQ{ATuw".ݸM%S =HF;p}=D SK$ ̅k>]2zq”)b@'fFZM/ |Togp"5.w7wQ6fۀg+c{?:)Mxڍ˱n ᝧR\EU,]Gbq}ۥs_76fP)JN&OsbT!Y+39X;d&49pLh3MI3{s^1[3\{\n+Tܷ+(T w$"e 4G s0xޗ9hq7Qxڍj0Fw=SKHWR:C!\–l9o_{sW&"; f]mT&8aQiFv1,9 M+ k(t#<3K'x)7<%y:BK%q#̭d,)\̓]g#|;83lkΌ` | ntPm8<ءc}W+q̞֝/R-kxڍKn 9J UUL(1H} L_:7F J$R"FbAгZ8iQz9)+m̠ɪ-8;)DOHyk{r?AH%J5s_2F _}~w9߽evQkD!i;0`U[TxڍMN @yWqg^b(?-c3'.R.< hMwo] ND0Z/gƉ ͹ԓEjJ_X)wv@-koRdBh{g||m^p_f F1^fz UP0iG-ļw ֈ6P^Ri f} Ԩ+S3RrHi0\|xڍ1N1@ާ)=cIx]>n7h*"J(xڕN @=O1{UcwƇ`h վ\ ʄRJq=+D )@쌚7uzB#JK"4ڡNlsFV131|Rײ/՘rk}yU 'D2Ed,gI ϖ#N?+W8gN[ܡG1Vxڍn0E{hDR)%#L:npu,_Vkzi}}U9cKe _ ˿Ź>j>_F4A6  ƝN :Qxxڍ;N1ާ)"D:N(ڎo$n9 -|29Hyp [)GAeI^һy`kYnVs\zc}^^䜥C9QqYϺ<^3`zOq'q# +LxڍKn0 D:wlEeH"e %CuK͐r=VԴji-VCKj8b3C]wNS$)iju 0ANc|ux[i1}Y1Mj^d%3ӿ LW8W:?+!C".)j%'Bsߑ x6 _yt13X)#`Wهi%m5L(%o ؟qMNXځxڕMn =x?ਊ̦xF5UnrrV`<9hZ{ND҅αὖ\-#Yk^@""Jş4[\s؟-zQav 7ےuϐ _vpOc߃;wlWxڕAN!@=Cݹ4 Gp M҆"FKJ{rq] ]X|uzR2YJDen&8md 7:| g+jȳ<@4LDP!Q1ߣgx{{B5ގyPfy/7SxڕM 0@}N1{ANӤ Jxi21'pW23`t@GbiУKkYPkuF53)v͌ 2j\"-ΐ<#GԄ;6 V1qGΆCLIK)q^;Z+c=?/Rڗ'PfHk;h1?Da_>ko{ uXllAA*|M5Txڍ;N1s3$6 gFm,3 9IETsEE&yg0*W֗'J&*˾à6A#Inp_C2.鐅G# \Jxu\@(aZRmm0v (Qxڕ1n0 w{@;,ԥ EbI,n];7Uφ2)I028eG5- }X40iBMѫ\G?3>j ׼/IG>նuv&EkH!lpݎ8=Fl\i4QVF&B.1!FQ|RCd_!+)1{p"}[$FkCt7x_n o{ ϵ+mi9+j;9e8SC~PX2uf#rQ*SxڍMN FM 1`\b(EA4i9J$@ JV̂689Z^;FϓDtfL܁i4zJq˝􈨄QKgP}->FQR.i}_.TBqp9Gz#/+|Q*w\ 6<QG =c%7ƾ'-$R Bp;_[h>xڕA @=a1čA% m*x{xn"wGfF\4^5lR*`F_9d9DB6;٩lpOے| eH-m::i?jG5Hߦw_GΡLT`aiumU};Hn%xڍ10{(n'H'qqbmlGò;ptyy}r$%$:!Fa8A42lH>Csϩ:D+Z\J R B)8G7x~;8otٴ9ӫ_!{ 9\W0v%H{ l5Kf?hS=]_ a#%%&ìV%j Na'Pm8AmtB7[xxyNt[ On[ɕ­ a\V/y _XuJBY;%R= ԚR\򂞉4bjI65-8%tf0x:G ]!xڍ0~_{jE97B,=J\kk;hyzH>g+蜔pV92mktU'a5[J!K!Ni+% m/ji(MLoy++Sg%h^1kC;. :cS=VurU(U[XI&Q]p]xڕ1n0 @]^$(KH,=)QQ@n\!mSo"9w9F)RꠂJ2tiSh>[<'E1 ℊ8{N V}w_ƙIMO?=2E=Yg?Y9?+hk*wTP>ҪRKYxڕK EM B'N\G%Bk{ق{InoDe6c{hY%3&>ځhՄ1DkcB"J5x7cm)ny-W *e0;{# |+J͵0H 5mI]xڕN0 +Фq ذo@yѴ(V)X0+6ut] 3d\b-P)wDTa D2idLB&t<1w1E) S ۿ8IY a)<|^rwy~s|ZJ UZ-o4"ɱVwQ,CsqQe1˝8$kr8LcCW-Ӛ̓~c{xڍ=N0@> 7BpD1ljvr]Iߧ7:(d^X̼p4srŃ3;]6@-cȴNZ4!SdJD\B'<:| gZQ[_ހ ˍ;`l gǠB%˭>Jiw BŨ"d;cAaIԤ1`m"{!09aɘIęl쓺Mn &S1SyQţMu*^Ue^%|u/`l0gmVɹ5H?QeIޖ~Ape^d P6 87:V5QGxڍ1j0D{b@eYCҤ!V+[2GEryL+"<&* ,:Qk6zq~8р,"G43j} BNER!m5I6,H} ^-xڕKN0}N1{ʏʎ p")nftsr^`)(Ж9l#T %jdc1Y X>"8cཕBZu 5\ھ^A*'7zxJ)e mk_0'ʵ%Wȵ j(V-,w}.WkW xڕ;j1^>`F!31Z {Ab|\73hҢILb!KBNJ?ap(s: /KP#&upi7mϭ~s;>/ʣYEzmN~k?ap[!B {9?RNxڍA0 O@)afv!HNC$No=@ znSNm%okIٗ%xڍN0EY*դB,aP85#g\`ʯ{9GDuWUwl*7rhQnvNV JZ4R[+g/tAx 8ʏ}Tu/۞ p'k)a%3ۡ612Zg_V0*G b^oΦ&'6%PT~uL+߇ OYyVs`L]1K](k?9GqWk!qEŠDexNي/1IhxڕA 0@}N1KEĦt $ڠiF۫Gp:@&؞3K^oI$c-34$޴8MglGtؗ l>(FIxڕ˹N0@_4-o!J(hhBsb1#4щgBtIGNkip/S3^ avZRV:f&E!Z)!'1|1jVOxڍJ1@}4"v'("/3)LK >*,ǠX0T$NE)=u`_B;)%N\#~gpS[}Rxkuz$Z7m_h}[:k ?ʹw' [(㵖3D@WLf~xHNxڍP;O0 +v)M_)xr7H*_O LLLeH(:=nlZ{Q !*AZJ%V2TlJ*i\e/pP Keg<=[2hA8gzCā b/᭬3] H9`ւ|/th p$Ly"lvZ\@`7'-8GPlKymG0=y]},xڕj0z*K!+[8,_q`fzDkʥF3hE*)E8;;1=J_K}0,m \>BҞ?Ph=h&Wxڕ;N0@{b-ʿ!JDc+q'۳} /zFkw]O`HZ&O*W^Xǡ;C6ޑ">\RDI*D6^\Kox(0%潜:<ҝiN*)E5w(">%mʥ .Js 5G&B m_@{? /@ 5,~vO^VxڕKj0EZś“e)N uMrKwm!\8sUcRk·$DoQ#vH2?q{v*m{DD)9AVJB-`^|,9?>.ev./h 5sUMYW`fntenS3?Oxڕj EP4&/ZJ鲛B@H4 ;_=ܶ3AdפtڏN'QGn$<~ 1G"bInuϴ0|R^}δto {}JxR?;sx<̍w.WشjĽpyIl+ 37{|#q\S^oxڕϽN0Wqv?iT^1>*WO0;|T;(au}!(N ʌzl53;䨄RCph Iw:f6J8#iz.&cRBixsv![N{6<]/1Pr9[9Fޙx W쯨@ֵTT*/i7xڍJ1{b$dx/KI2df}{mt[-~'cZP*9 !TM&[(U@{'[cc7Nng 6avC.y OG0,6l^xsf A/|~C.R!%;=é .%@hkrB3UJ"YSye&\pyxڕ;O0޿bKɏu 蠡ub]Ŀ'n^ً#b(Jϊ] LJ1I7u *-!:2r$hDCNp6G_Jtex/9)m 0ıqf&Wuqΐxڍ1n0{^}tc(ui^}hҧHS 3RHDգ5A mQᵂHuY : |+OxOiHL Z-/(wV_( 4opj l\mBO+s$(Er .'1| XZxڍKN0D>E/A8OB,ٰn'8rl=FlTOUU 3c88Ўr=TzcSѐތ)?Y$$2GV\mdx)2q kK0.4uzs9V E`GxoK/քgXpBRz"JXGUxڍLj1+P(3~c/=ލz7lB.$ J3biup$})"jHY-nJq220$+eԤ1Evvx/ o[ ^퇨0{7$o(?t{7t̹ ʷe/]G O@xڍ=o w~mZU;%sG9˾Dʿ/N]{9xE^dg*޺*Jk1*alhbq+fupQNӾ;4=tZmބ ܅Oe#< 82uF e#5IPF뜶78 a/?pFn(S@9Fb K~bȈv% \#8?~ݖOwXhnU!FLy=|[j.o.>LbT*~ [ÛxڍO1n0 -V(vҹc@I-ԶWN3t <C{m65-mtDL+CcQ9* ېҟ::rI;n< _3. ]uW1R}7$Uf`ZɻP^Z#^0OȐ:qsb_GxۍB+5߁jY01{;7| 6OC9~ 0_E;~/MrL/xڍj E~۷ OMSJi7~S_B? s ylqn DeeqʹVg ;& pT Z*| WIeN.o ՄҢA O(?;3n_nin/]!vN z23ܨFr7!>ܟ Sx$~^xڍN!F=Oq&åcƍ/!L^M|'@E-йLCJ/Mnf#nX 9CF2Qs6zf?X$*cwЩ/znr\ط iB'Akf:Zӽ;h,pN ?kMxڍN0ໟb+(ZBc{ʱIDG*B;)盙@˦6*D>4^zōJcMN9C&i,ֺmMAC `v)}2|Rc쟻* x-B*wےC)?RA]K RL}ڡD;yر0Øi:[Gv7o}}7^axڍ;N0H+b;[,3;҆e H\h&̒"vFTt~z`m@V) tHD{$m INfc|1|Z5wܨRËBLI1qVCxڍAn Eb"`LU.b0A5!Qo"̗ӛVYcp( ýR'\Ko>TBjkG%.8gso 2On_Ox.w/DքnLkٗ7^aOYxڍ;n0{b? e4ϮEXRG}ofB^bNA( 8J[v>ď_hnCڱuDh:whp jP6om |+W-n^男ZN^R[Dcј(ԝ:ױɴ;m-ySxڍj0D{}H$K!+Ӥ B+keXa˾GWiAk-vƵE@R6x+-}k'7DҶA YiDǴEb<≮iuZ'V)irk<}8bb:Hyy8mP+t'՝壪Cgaxڍn E|[E`jwtf(X;ߗrgJR{;@'IP-q-uΛY\AӨzrV$B GihVC^# 4 zJfƸM^@tJ&֌AdHv;/OteY l3ѴOg|2ْ.^\o -}8UN C#RgxڍJ0}fJI3n܈68iJ0n}.wܶ" vY*pkΠ6=Ys~& r'SAaB`J $#vkSY-}" OyzOvi]Yg0FHK=\Am9Mu*R6W1 +.'n;CU qڑ3dGxڕn D|*VMmjnHSơr&3J;3&&׻DrGa{=m')1(OOJ~"r~ГtiXe [txy_VL.xTZSmL G. -d R4 /7lj! ~D`B8qCP`K8Ȼ6W[WF3ߎk%5Y[z!&t{#P9Xx8 oڀP8W5Qdgxڍ;n!D9E疬z>X+kM|,`VM8+=+U g%0* 9O(2#y$IFm*B 9h(7jmY(ݲa2W?J()qO}k;9kMۺqr{?qlB{ɎʭW%L-AגFcOn/O_SxڍJ1y,f~Dģғtf;ɐtV|{3 ih+NDb4R&kЍ}{:'ton& cOrjhIр]4Ҹ)8^bWAוa]3zi~FqTiFJagOw?Fai*euȔ . B諄`# :U33υ`[&x-%ZZ/$2'Mn=TJ1\_>LXcKE[QW-ŭ;o _]xڍn0D{~1 JAA2MAKiIYGxoAruh~ЖUcI% jkhh[.e?Z^R5aZ|g/ɩ`hwv^x9IŊ?Dfp\aiaf(f0Pwa 9qAqFe0#=(䲑WW*z0A| [Vrsq3x#B1Ge`'Wa޳_xڕN0E{V~`'(qb;Qb/q64HS͜{D@ZI;Lgw *Ź])[p\@zmZ$2HV^[!rᪿ׆a-{$xSoxJ0aĚ:Qr#|_# g{nvf? ttxڍN @=Oq Pʏ1Fwn\.24R3oocܟ/9A''iR2 mnVI%~Bqp^3xgcZ)uУ4R );]k|C^}^s/7rt i 8(io"ҍgx$yM$#UPԯfhV7ٌ v<G$Q}©wsB^GiN;&8-"Ye[cox׷ɇr_ɬ22807C~r>d9ENPG!'#\/w{4<%XxڍMN0 9 Q~&mb&N$Uv4'qj!yrD'$"*ZbT8JQBWF6^yhFps.~>st8L &xez!zs$p9Mj?#s4 +.;mкÔ[nu&Nz~k}֎57Ij* \"6k4A#`O!HqlmDF_}wxڍ=n!@SLvȥ 3b`+ Xp"rQ{fcPANl5[)ͬmy#u0Ss86ZZ GnyP JfoRI)\{"Sˣp'x` vmWSMxڕN E|M@1ԍ1 %J6 ܝ9wtf0GY𖯧ykw@Y /VskzG>W-w6i7t # ,%`s_O(xڍOK0sSQݶ =,x$6lӔdYEB.DWZgY^W9j[l]mKS5ZjH3CS(Lg Lgu_鮯,e[m•a{: gV qlۦ,2ed1Ͷ_zr11hde"/.zO2A$>pRj0aF ;P( k"@XbXewkxbȨ`n(~PL.E/N+Y4ۉGx2!F2<6j'Ҍp .C⅍9itb3څƲ2Z&b ͑E{j]K?>.Ҽ(m k RI)Ӝ{CA(y ,GیiaTJxڕLKn sW UuM6xQ<8Un[ OJ{λVv6 #B)$l P2w{n::=Ï>a~osp7BO8u]};JAHBJs{3%~aԠAI@ӟ1!7^UxڕK0>EPI6Xa?mb(8 nO#M굅:w>吴*&4`xmBp F )$H`cu .pwS-?Smrsk R%'ءDa+sk})-SthD;bN^vL̚sё/"(hҀBGT8t(%cT>Z|:Ox)^:9>cIͥw/yUڮ }f{ Ww LxڕAN0 @}N=Jqݠ8N[14GW) *g9 R}4p]sQu!'Iz*,tkcj_m{ގ S f:k6X/3D(;^.0bTx^.{)r^V8} i oh̽bcy},W|ߝ.i}SnUxڕ1N0{b{$ul#(ih@֝(q{xT0Y'SJbGlgfQ+mt`q<(9?H$8YEGmrxo7v2> h\4jYߣ״?çvYWL\gN森^i!K-gXxڕKn0@>쑐Il*lȟqc8z#t>m5.g/hj/aG!Id=_@KN!R6ID[KYuR>xfLVu>O=wtb8hZ79&U {]X{ajſVCȞNxڍN0EYj|!R7~@h-<{kv59w&=HEM 9*QB8p(h,نXP*'>G FPMSg\ ޝtBkiUfOBR\xy!&F(DߧÎ^0|%m¶ .;=Gpc&sК2o_tnprBo fBM>@zٻ}4w/E.kv6c_wxڕn!{bHnrM`]|';<> H8sd)*)dd'[c c)316cʄc1>ZryY{}:kMڻ,Oݛ ]AxE7(y`KjxڕAN ={ |J 1nꌉgJTw=3^u0|s)@QD6* 9R؉7* q(-uQ2wkk/S͙~1ϗ+KC.O P) \p]ߑٺ4"+ن%!V 3^H"wqNrx_ "/T~tKMoe1 4N VgWSp!vfq KլQkf6 ksBx[sN9<_Y|a-'RM̵f$B}쥠-12lS({L ,VR;(X<3bvfצk: Xn8YdxڕIN0~EߑFtl%ƅ7N,gPx=#~T}ECČ#}jvqYT7ޤv,S@Fg[q&2 N9G_Kཕ"'{+R.o5Ԙ JbExZJA3ELQMQ|\|ߙڍk; |~ .YiV~TGxڍM1}NQ{AT"ìf3OA6/|OE NPOEP$Ifh2hvY;X^\0%x3#m  l;֚֫é-_[Xs}_`yfrlQkƳ.@O4P},Ϛz2lnϦ_HAxڍAN!@= h 1ƥWT1C Cwmo`!PJb[6d XLhɋduOC ,E0{$GzM]u| x! T5v}uo}\^ɹ(OV<  C WYOM3xڍKj1D:E[dMV9>-[d4 cɐۧ( ރ'3$!0!.qFYē dj FZ,tfZ."R,!iW *y'|o;[x8oW mj^P#,d!DDQ}!`= ?[fQבgTPTLxڍAN!=4 Lxj(Mcbo/&*Utfp:dRdg]bdXO}|N&·+z]VWb)!}FlGdxo7\zHeԧo/s4fVjqgj^lYQ:W  Vʜ,i$!gQNKL֙GlwJNC% yg035կGvScuaYDfYE06s goOnd1̃GKR{C-PZ7na>QUxڍKj0N%aAYfђ3"~Y6 XL1!8%E]*E̫z!hW RFPFCxpm/M^_[yKEk eCftQ+O/Ca<(}N]ouGNJxڍAn O1J-0 RUeM1 j0ŮzrTAX(ҼmxF7;'QWUL SЕM)2 FIFѨ_䬉d'>6Ok-E<.')嵶XGx1ΘI2 Q[=Qwk:@h}ov.?DT'ig-^Ɵ&߿wYo^QT4xڍ=n EU>R if gP0KH3:@IgTCk.>q6!h6vZ}y5.8QA*VfǼ_pꗧsíq~c}rN2'!AU?sc &4 dۑ  )Q]xڍ;N0{uH+c{4q{,L=u6wѤHQ`hNڄlA/$`<l:[QV{jrK3(}r£TR <2'3\ WMw^{{PǍ{^0FNLc)~ PxڕMN0@O1{N Q!QqǞIFrpzr[jMfrv6/Ffmk79C$01 cLSf'Cv0uT"Z?p㲅-p'"{7oXwqYk̿s-z:XՒ=_VʜxڍJ0} 4?DQ|mNabނ^yZju? ;V>Zr0Jk- V(o}F1XqMKt.9J<=f.!]RO${JэBtL `wx|FL3.+|iC3x-SPS2b]2(eL~/XLxڍJ1Fw/v(Eu#>@{ 3I$P8F6j21΋p*^=3hF]!F!!ڢ\xAIK.x>i&x9 t^\]mGB[!G163N V/_BpXz^7P_O'lpzԧTe^ +)ҥ<Yxڍ=k0@w Nt Ct.'lDvPB}2VE $'"LtQ"Nڠw6 H">5%7(eo[)r粼'^SV 6u=zx6={. ,vޘqok xIxR/0jz2zFJ |wl=UBLrO)/&7FYj$~qCcp>V^j6a38X#?np w%k.pN !v׷n' +ԍaxڍJ1y+et(P>$lBw%|{SEmf@JqѴJRHɕ_s]9N) .0+zT@Q}/!å)s<O#8:QrljTpOM\QK?HD`xvu\?3kV ^CL=~(ˊ}i!xڍN0{?"ǎ/%48:Ds(o#fvd"ص[jж͕Z\ EzlMQ3ƌ GzIU p*0˒2K x 1NnMԾAH. x93JZu); 8Sn LR(R85 c>q?`\!N@m`#}g)hR |' ,=TOr5 ?{xڍMO0]@15]?~@C)&Of&3qDir%(+D%%Rs4bBBVƘ\02C+SZ*rT2SQp96ϮE]'뚇ګ`%XCʄdL"+RJ̒t1⿊UB|^_ֻE{88 SDe~3| F?M}T[[0X ] B5yĄ|xґxڍQK0+R$]qȜܳmX67@|rÉ#Ty-(ATR-Fȥj$_M= eYJ"WBPfUrl"OlSH]ڣ=,T/U%&/򜙤1ҿࢺf{pHV`:= h} Ϯi 6\n!걥[^w=&8M`=8mCSbHFGX2 cRf)G ?|1!~7xڕKn! =Rdl`&IPP1LܾB͡ B"V] Z[2 ;H%eġoXE?FF%$%33>RzkvVN}\?" -Ω mݡnP~RP?Ixڍ;n0 ]^ ЏTAdih["o{&&:Ql>Ő#ra꛺䘢)b4D8ad[k򀷶+K=idEEU~:3|~5TWyӮvcUvY ;;PRxڍAN @}O1{nx)b)j]xWoޘn"Z&z#H$s.R㳃#qA&f(m]3Fd٬JY&\z, '[ə93+/qvzu3"<)ozhy,1B:q#@R[PN~R_TxڍN0~*$S!'׉U;*oYMDjPРV85=ֈzT40Z"r\NSϕl=(K[Ri8gxHy|!^u RW 97T##$KNcƸL>PR{]ou&  ]>•`j64kxڍ1n0 ]^ Ȓ"% iZY"{ ̲J1"+SL`HdYEְ5RI7KO&rLZ> [z{>y_QOo)dJ)gxABte O& /k6(-;qtaGJ4xڍMK0}u!H>L:SNԵ&7m& 2~*}BȭNZ6^2=*'gn':5g,*hDf{pR[#,C/F|okR\-^rt8?M &.>P=7FߔP+ y>|F< aHBZ+. K {vpxiMmSŐMG ]xڍn D|[EGU[{i ,6 F&Q/=ΛQ2tQFwljZӠԍMc[#f -ȵNp[. {CשK`ێZRt8g׸Iy|ݠ<45п@bu@E0X:f2XTGH"Gi?C`}ό+!&W{AUŞG8ktΐgNP,~z^\o1.G dxڍ1n!Wl9=@i8vmpDg˿O< ̐/TNSbj"4hQ bd1A"4x LYH\&Jh]0s)RI*\'GopnWJ=k70v^Zaqn &InP~RiKȕxڍ;n!ОSLɂ᳃E)|5Y"E9!%&D͔!MsJ-d7 &dѢVY X@┴*.΄T0;y['|z [G;~BS[JJ޲ (ΐ9뽕uGup}< iJxڍN0D{H';&1B*hpubGs=> tY͛^!PM˅hQ:.;5:X[u@C#*nM(эHF;GA7 :2 oHb x=/ :l_O8B)X9`JMf#cNHpN!L_ܱ r`v5d_͞;s)@5s[^+oqjzR)eN9RWֵNuc릩ZTfcUM+[TDQ?F(=`Rt]5F )VmԚ᛽"| 2+ox ]ֽ=R97Ȟvꊣ=9 5jLPfzCis°93D> yۇ ,1\rn6O` jFҺ,!f4~oxʁ|ۖj2xڍPAN0{ NIEܸpD^'V;rMKŕh43)X.c T#Keq[9UU:eFL'PlѶ3u-ma,KK6FYkPh% !»;q B)]>c"t}r>^R2hϽ\j)bZPfr؊ M38I-33S gJ^RE-lfݶX ardY Zd!Ӌl ь[BiY)?݃ X?-!EݠJ0'ET ,= (Z09-k?itfIHvqk@|DC.Hݶ#hG%ho[bl9/i^hiVW8Hc3HxZ1|\WXRmB<ÙԸ6{mw7($OT:?ľYxڕ=n SLi`FiRXR!SX詖/8㨭CN ovKxڕ9n0@ў>0F.MedE>\G Q :X4;Y\Nl,&ִqHD%h#*:wU~Z5lujx1AT_1Qu 9_8kϰMMJxڕ1N0F> ΎKh p<"8={}7McN.룰R&G$_tm59'qY8$8#p6O{?EϵmW2yavhqv*Ң]ák-PYsmq WUxڕAj!E}]3 a*d34jUȴmNHn~̠6 qrDHaэQ/+EmB!XFEdš Dgpd~/҃̿JZv=#ZFxQRSd-Nrj-HpdHH!%wJu}_^F<ڦ?Y,xڕA 0E9셒dD\q$MԴF۫Go<ޯd>u٘YZ^s0#2W dbBn[d$hli hU|aYx=/v,!D gyv-en%Ni;@. ,Fkx3E'aV՗=|[#qs :.Fx4N"y & hGRCz](Ou6cQjX2-Dg|(WgORߔљ!ڸl#eRmBodSAtds)ث=)P6necm gS[9At%QJr= a/9>W8Ii0䭦oHOmx9N0E{H_8E8o`d W 9t [q\b5f,vjumB`h[ o xoF ܲU|o^+k=ޟ%5W}|c>jE[d-φ"I%σtLG\~fM_QxKn!D">'EV&ha&Lޖ^9@B0p#LgyY''*'hК <D,àM¸Tt2Cē]%$nI& 6t~.9@].Oҟ=x1N0ާ IF+KXqbǑE#Px_"лR`"$ޝLHzD+viP7 UzCTxAj0zJjmR G-RYA}B(sfz8F}&2| ijwA[Vnugn -cH&DmHjH8Q_,p eXyy/-ɐ3~g$De]=\x1UZN7xz^zg*V 矽@MGTLxMj0F: EJ)%B7yƶHeEYuU9f $xKgqN'w"h~6@L#G 9#Ny%X_𱷦wxmÛ[{=&6}|nG3Ҍ jQ8a&ɓK>a hw~ LcAXj~Kp+wV+.? A4|HR,cCQsZV!.^!;LO:xM0 @}N=(uF ;6"qAQHs{z{`!cB]ObIe ~HŪk.`9y|!8Qǣ3{ pJwz5/{t=GN5rȥ5z4K3rB/Af{/Fgx;0{b{$:k#hh8l L1\M3כ$) ؓv(D#G.zrGv4 q`șF>/ .&p^j|w.m:outVkW.T4K^-Wr^pJxMJ@@}NQJ$-"s!*ՕNN (xxG<=m"0>8ֹ>qbJe\7{cbSMadGB0#8s[~x',t+UϺhqְ7yNoqEVgz!{m WϫݯF=EEAntdE~lUÞxAn ;XZ쨪r>FMXQ *^tLȳg{1KYFqhz*{8."&JLԆ-fX`HG_J|,&?-y{V‰%sgWnkCw^ ~i\dGi-USΗxMN0 @}N=r6!6Hl88hffؿ $ ;E)˔H08/9x hnuCpggB Χd<(>@}\ZrUhۺʽ>¹ZeC MjS5_5P&zLx˱j0]_q{!'ˑJ(d*t?ζ-tڦ7ch#‹EkM>dQGS*M^J*fo/3)L&CVҒ4pWx1N1 E %xvZ$U-=#n@7$%ۂ0]#A#yHGkSƕH֐#Hòl9:6c~ |{ܓ>18$m@xhsʿF/5yLv`EZ\ZO4SǟxN!^}oХ(潼׶~' 7) 2\v?;48UNu8Sەx;n0D{bďHtnR""I9@)< G?KRfHqʢ̈́35%ر鍟rj'8&UH*Gb y}[6tKFi3r% rd]!^R1C/@3p9}{i+96HnB|[pR|йuhG|?bs x90@ާ y& ! el2NI~_Ʉh%H "0ZU1ks6XstkR2X)`HcJKb-8Mm:.;RM"$)Eϡ"sM0=R"F;:m%˴SOuqN7B!h\j!$XecZkHJIw8IQ[ߞAi;x@8_HJ/NgfUZ/4r@}}o}L?[ Mx=K0=l*䳽GGIzNn4Ev]_7"P̗h"[ieDTj@bF5ht4n`zv$%^G+Kmno5g缼+)vzR;RK))SQ); S5RTLZ>*=}]ʽu؏m$~e?Wx˱j0]_qcBIA)tξ#bYAכ*8]cG$d@F_`=:N4QdRR*ӕa_r_Xf-{(uZҨSZJ1ejcy y.Oh`W_$kIx;N0>ic%b'VC 'IںdL.\$mȫI$7=_Nj {2iuJ1aq5TlHetnb>^^+[?/lRYeB‹PB,: 3?xɖvNw'ϖqxw8cdџKo/ S|xJ0{b"ɤIdA,6&K"xN?|>p8jOid8"Ishڡs9Iޙ16N; =5*luK^~NsH.=tn7VdUZU9$1&[h_F8uCp8KZJ\/RxAN0E>ŨB*6rܸqB`,P0'UǎbGǭʞ|Ӳ\w+=4^!{Ja؄3 ܵT'uh^JAJˮHqKqw"xH?<ף`2Vq>@-;^ UisN-+)637[UUqxIN!=K; P 10S.Tܿ7;"(1W+4:!(3QS,un; 6mD䎯‹m[{&7. SQ@9Soo^֐ϲ_qJH9<';6 g@纏%=WŽk cUc= UXx=N0@ާM;%Z:3XvdO{{rQQQ~ՋJ(H49hb qGSCXd5Z휊19rNF؃3}|Ԝoy6[B:km RK="Q" =?: [ )m9{g~Vj!T偁~Sg!v*n2pb3A-$_$awx1n!E{N1eH,˥t 6ʲX}6]]/qτH iMv6fn>@cОl ]r$/RJ9UKjt^/G=^ gYƐUT>FMWJu[en$.iSxJ0y9*K6m"*"^ăO&۰dȾeN3Ô  h }?h?i=8 \hl Zә1KvV,yxuŕiNCcGReTZ𕌥AJ)"_JmƐ{SH xXfzxz=PYN;7Tu@O[ 1fx=N0{u+!IBh@H<}Z'({{r4L1umt>$InQ Sh\8۪_^1Wr}CIJG!?@_yY#_@K)c9?ϒ~YwƷtVkv3׊Cp ^6HGbzP6MxKj1:EAlpV>AϨeH,`޶Q2 VO(H8.d8*,&:C$Ԟ (a۹TYʶ޶B9}{-R1'Tb?-0b}Km8nk7H,?XNʑx;n {NhW|(6r> cE{phڙbz#2 i;䬔VEEBHvF{9""6JZ6|{m'h7.9gawwȮ^wi b# 7Q#8> {p4: Tx1n E{N1}+(]bF6`aQn {A𨥑Zi5 5q3N0yفreGN8q*N*f`xTgI~-ˎ+K]axs:[?]-=mx䶘ؖ+9NzRZLtJripT:? Wtx1n E{N1}`G(Emrc/W~o& -3j24)̪V fk'$5"vqd&#W '#/gn '=B >pB~5PuKDv0ːUzlC٫Ms>{PiPpxAn E>ۦUYb 36 6 r: OՍt4= 1BZKc =Fkz CA4)١f'QlkMet%,B8/eʸԖS٦{xJ.fv_k-i0B__a/Pgp's~@@ϻ\:rG[*x10{z$t-!DIC.A,%6_@[l3ٲ@` vH^w}qd=YCԛ7Y <$0FB4[KFuZi^5g)OKL5yflphPFRK^?uYjM8AZ\Fx˱N!ឧ0bavfkķ^pqbŋQ]- !=M;t#k9d't>zPHV1yexj_xPQ}9J$"d=׏J+\^v7OM+-[0{rs]PxNN {717/>eX^|3Nf4"@}0 E:tEMEV*.ߨ aګhRʕOPtܬ$26L_5gzK>Lw~m.eaa^1ߏz~`~S#|9>щfji&_R/V&T۟xڕNKn oE$ DQEx DW*X-hFr`8X)7wIL)Bd&mfab+.9+>3y|9=›AcܷMTpzZ/vCoB֯tUaҀGyPR>[V~X{xڕM 0@}O1{QצAdSҩ[|G;:&g9c4}}ȎpȑEB V!V AȃlFT]9yNyY-ctvmWICZ,BSx;.T~ A%w_JgxڕMN!w.cb=ifzO2>ຑ] RK)Ge(󥜓 p;W\ڐu;.P5&SxڕA 0 ~8@)B![2 $Mp ̬5UB{B.GS܍9ԧʒBPrt;7}0(1 ౌȉEQEeIa9c>)e n>+y09Gte[LsQ~Q|zy1|l~JxڕMJ1 }O AM03-2 oWpbj ռsD&?(Y_ YR%(xbkڬUεf)cSq 7[U;' ="hhgWGyt~pVaL^E~zJxڕKj0D:E3|o,BHf+HX KFnr(GȢvxU܉`!,II` Yl=JQNSep!FqRjsQ!xڕJ1>*fD\=xN lg}:TJ:3x|3fJXK.ƘY0v l)%1MA[iJeOD=',!0˥ Ky &B1Y OhJ۶U=ܷ:~:#UdAβϗoh_ -Pxڕj O1BѨ (:5b'?"`_YGF4v>ۤ!KN/HN=B:}ZyLb$gƺ0:ԉM*\ҷsG xq rٽP#*nDZ!ս-Uޯ$zz!QƏHϯyLBMϩ_O2xڕI 1@}N"HJ " ޣL솞HwxK#j3c? 5LB$aX3٨Vl4.T+Vo8jBV~iַaeI߇q\D _^RZ=x}0UiDoc\a~&jWo}FxڕAj0@ѽN1˔Bf$KJ2 dMzn?<~o"TJ\dTX|BQ#k37:P Q0().z[rY_%PNGj$3/Kpa::]Ӣν˿?&S2o8Vk- Jؐxڕ] !@wWqߣ/FDue1iZ|A-;XBFd91jRb^ e3e28~J(>1ϲ,m5}J:( "Zw(ޕ#]u:I|IPxڕAj0@ѽN}XKA BF`EFrG|"v"Er'43ddZJ| )\"P X 5J@_؃3tڇYv~b}j~ʟu\sWpomSk.lCXx!i7Oah}Xb(e_dOY[oCڱ2|l^Ry;%= XO$xDRuCUx*lعmD)*^2\AwK.n~5NxڕK 0@9Eic~#"= 6[k}G`!8\S U~7E"F\Hy/x5F 6ckᙧinprZE֣l+_ e-+W@=J-xڕAJ1}NQ{AؕAD'؁Nks7olƶn #q*&͝2q!ZhZrCԊ kkȢ9-c>s}ej{>F!.)9zOOqv3;۝~~w$b~ 0uJ xڕKj0нN1B#Y.G#,-L}rd04`mH)FKD󈉊^8x@1TlٙQ{7"1AvQC>g.Xm]C賎/0 S>Г֊57Tm;VpB}ϵ|*m0IO(LxڕAj0 @ѽO}" zYi< 37U!A9`D_SHd>a&oLz4嘂FVϖeL39;>5-}[O˻/"?!dݣq+ZM9 U_@LxڕAj0 @ѽO}";J)sǑHhǙOzכ$Ƀ#H< Qp1SdAѻ'1Px58Jg"t6xm9zg粮wt&Rߣy=nzKW) \ɼ.q6d\\N%adY\mΞrCs/włRK[Y۸F/)DŽuSݷPxyi}H>&r ,Yk1FWg,om EG;Eu_$hK/xڕQ 0 ",Y۵""ޣ6pnt^_<"1IΜBFsL]'J&N0Re8mTڬR8U[O۸TulYG|.^o'W@IzCCMe'3QMP>u2Y~}hGxڕ] 0 "di6)8'] O$Ԇ"4p/!S!{q%YC! V\;lȡ Ȝ:ءuBt c~mpi~- GLwb&eTߡycCL~F ݎ_OQoxڕM 0@}N1{AךEjS |<"(;Ʉ(9J8cDÈleU(4ŀ7i:bvc!Jhh׹uxν~m.KSro|R8Z8YoTU{4EֶޕVE xڕIj1^s1 &?V+#2܃ W$ju*"O%Y 4B -O2X^#kt->2G4bINK[yuL^gm .dR Kg8?x?_e9}/e ٙ?OUFxڕAjC!н}u(R(d+ ?E{ot2oSoELɡ!a9sC@̖MB kERbaqow*:jP[|@›HJxڕA 0@}N1$$m"JADŶ)1zw~-`u'go z$,!-^+ a8B6x+Dle!0{91VtVZ('62Db*Nٔ H;qZ\:څV | |^92{CTRԗ1ӿ+g-rm'_^^[! tQ>h 8TPxڕQJ1b>Q&d ىmJ:3MUTxi'IC,9CBJIi-.So`aI55mIg^WQ'mc6}S8}}VO!̄/H뵛鿣;_xogFDZ.5FxڕKj0 9-"PJY&( A3"e hg38BW(/deӔqᑺ DQ0,PHBEDZ&)1E0SsXn~o o\>NX?qmUUzȵ'BҞ<Bk+|YO/Sxڕkj {K8& j Ɣ{{FFfs1Z4ڨ&bwPpff$d#G3O-r} nkKGJpO9޹}QM*)Eߠ$??%ԝ[- L+\ٻ zm6?WLxڕKj1:E/mAC _tZcM!Ϙ Ճ!X(EGSl#H!;Ebd*,`s>g Pkr]>km~Nr o\?ʯu!N0Tߡ,K]ϥ3AA;9 \WXC6Tgxڕ]j0 wBc(cP="E&fi\n_|vcDg(Ra ]xB\ KW$EN2 #9MYnunuߛ…P()9o[kUU ͭR^ ǠwóW(`0zIL̛xڕj0D%זtmk J)yJա_Kam"0{\!zeAdq zr8Y M% ="O8㐖DK"^V^|[޵>mUgW>hgGDhGDȪo\Etreˡ pH.WصuĘ 9rXl~ akxڕ]J1(d'?(zIL7 J:32'xvقJhDĔH+vDsPN1Y- CJ/ h›#rHfr4sLo7/6 w'eb"NDcq;<+(QZ?Æ:@#Aŝ4^<xڕJ1Fs2gEQ̄ 6%;U|w KNɦ⽭s.j;)FC%klP4*LO>8c'25.[hplK8~Zhc]D /hUDGA_kNhO H?GmWԶz*RWxڕ[j0ul([\#8ؑiAa> PSvCCF1Fv)S6Ac绀t:r:fGlS@kո:|Nn։R wO)xATԖGuO< C+P̰C<]uUO[xڕQ O12F  c#XdϿ{='B0u:kJs \ɠh7MZ7M\6*WHTu@D0j):GɲVmLxn2ë}>C|zDGM se[|@ۡ0^(#]aM5xڕi0 =B-;![ \UtPsL$3aJi*u ^J(H{'RZc#EUr@~?Wm:/BLy&›޻}3.۹_l[?`v7z>ĽLxڕKj1 нO}3;PB{Ȓ̘NQBz!olԅ׵Q|MUZ.1D0`wԫAJZμ J9몫/}%h+eutmLf86san B\` >|\ݹ?_(y b5<UU Okp.^_h| KAxڕ 0Lq9k7prg) igŽRЋ84 g T,ˈX25u^GF!'b = R6iөuNísS8\63 0ѹagUUohkIʐFOо-.:{MxڕI 0}N%f"ł 2h@_+t5DI1\Z%rJEeb.;L.>7 L~ IHІkYv:$OZjʛ Le]+=IBv\źml*xasS;!tDxڕQj0 B0X(e0,@OvB*0cOm:1-Ԩ'w%iM0id!)ypsV^uw}.֯r3cX0Z)RFxڕj E~[P&jC)Lt<`^گoB7s9;5^Β8H#^(;;;247`LTshagQ"jvN-q',3HkK3HxB(B]L+\kܦ%8\8&ǧ6x0εlhZ~\+Br0l.h~xڕKj0 нO}_P)Cvdbܿg?]"OC\9jbm2YTKNsBn.'C[2|>ku^8 l ih 8tgc4rCxڕK @b2FR($4Eo ~7#; Y¢G1bq6FgYAЗ(>hCS6I41cȧOuj}R;R<{:v=X5E8R]׹w[T /50% ^[=IxڕK 1D9Eg: xN8{ooඊ1CAGErLzQs 4,'4vj O\qdL`o#,&+:dܧV߲ã&pvH>vcEpVke"73 >RTe=b*u}?M[xڕj0=GVR JZŢuM>!9 ` #XN:fu)` ygX=hpwџ.,N1V\QW鏙Z |I: q_0pFk^EP]v[)>sg>^!> 7nxTxڕKj1 нO}w BcHƃ?BFT[nXt=eo%C;iaIY5sEѺ e\k1 /]7r [Gsɿ]4y7@DbxڕKj!нp~0ҴŮsy3g֠ D)b-A xR1/!Rn#`4uE@4@Ń*Q*x)DxS~Ǟw=^Mjʂo(%VQo[~2osF?_^QQOK\xڕA @=`ob!1ƕq!FiJ^=6 ]uR r4CB]2ΐZyiq@[')GK!69B`Tq}z-[xP[NP]}%CmƩU^ Ejxڕ;n!{N$Ɋ\H3 /`aQn'7H7̌N+wQ78i i",0Ȯة6D4z֙"8y68puV }áy^Z?LNKKYxy N> 4^o-\ G|CaH0m+½%tN˯x~a??[Axڕ0{bL$A݃]Tm#5 /x̪GB-RT γ6SϮ60TmDa(YZl kSh« Q?oԿekr $D#/E8 xje{oϐ'C;$}OH̗xڕMj0 O!f2؉@)\#8DL8Jn̬F>qA RRoFJנsnІm\A[;&oe/+3iB,eZo@]3 %Vیp)eOo;3WhTzÓTR %2㿇bBRPЅWB|.T;7izx{ [kt;<rJ`aςXFǼ㹣r>m[xڕ=n @SL"J4ϰZRHC`.8Rn_!7:t).=yՌlИ٥HKCPG)Z+JDOǠNleFPQdz~=UKxڕAn =} &UUeM{̌b Cܾ~[eΌ8JaDQ&&8pT?: ,FF:u1WV+>RvV0hj /V!sk-}Y<`oA"G.ק|,? Paxڕ=0ާNjtpd{8H~7f~RIaH2ɡ"L\@h$g otƨtlKRr G KmpWZ \~_(PRj0P!;|ϒ> Ϛ { i$(\j{A^ oxz][+RxڕMn O1RTeM^a%@ܾ87j6{O*fEy<[ddMN#3{2V t,tN)Od\H ;ѶR+ n%%z%m9#}~(7!|Op^ XɷR# l/l1;D{;Ea8e+_d|%Aۨc>xڕJ1@cHGb*XMIA3#i*Opw,ND i dA+"!Jstb7A.* 2Fv\*i)~ׇOS>Ji5x1skOo?l^~n>@L'߅j~N՝xڕAn @=҈ UJtC8$%Tg޾B/"K9!aa"%HL>j~]aHB&P_"r%yTSqg/mƱar:k _ʿC>]1F*t(gHINxڕ;n0{b; ~v).V SrGp03xmS0"zfI u%CS4 {.5gΧ0?D(۴np ku~yu?y]v[k m\Wa['<']8I9}4? JxڍMN0O1{ Ԯ?3mT;$-ާzcNGII.k'H:4F8ِA!RޚQ2QKEߗӃ}ޯQ=U˲!8Dq$n9B_ՈlvxJQ} kB5Eʽ Dl9IDA$8 z *lVWfZ.cwr#⇜ZY+m9õ,Y6:o Đ&>Jxڕn0DTn8UUq,>baq5mF3o4BD佌IܻQXKA("U SOUɳs. b#92'l:W8M7߹r=\㴕^~"ЛSk2h%Dzd-ϷPUb7*>mnS@xڍAj0zKJR)!GkĊ"&: (9悄^Tr`P J~<`u07nz@B$,.qЄdƱhDIld~VG=畯׷nY2C40wNi;|۪y;kka_JxڍAN E͍? c:qڒBi[ pzsVŽ^fH^ Fj4W B[-ѐx'r}ָQ;R 5vc'=ڒ -D_9m G2R͠"Z=Mq:*=_eh 1!ld=1 ɮTsɑ`/y.6%E_+\PH{tƾYhxڕKn @bm 0LUU.0mJ}#t>@@ WW SD2EOT&Xbbzˤ~RmH{!ZBpFLZ},e [r|iu`Co:/jacȿCrZ~2;: Y.y~WhLΑxڍ1j0ާ2!FF! f$b-keCn9@UplhuVFwɍTnd\ekSycG Q᠉# !p+9|ӑK҆2P#v*SkOPƧ}NU2=-/Pu!m{Pk_lTXxڕKN09E!!0+=쫞Bg3V2O\Zy42h S Is$^8*.GarmԄRbs|x\[.Bihxeadh-_{0}_; 9AA `%\ R8!*g{z:z5e cxڍ;j1{BM <BH&eE'[x%lczf9JKt*=,ᢄ!i ٷ&wr D -XbTހGIGd6/}r%~[* J4 I H\u ۵ÑsٞǨpdhRxڍJ0@}.Aפg(7&49_oɚY-.Nrʐ] iFe76.#ogsJg 8ԖU"g_k1\joyX(;(m'xڍJ0y9*LfgDom~ЁOD[_"vC;:a* {wNG .e=qPxڍ=j0{bMYF6"EZؒIŷ>@S33(7HѤ SckZgQ^[QT4x#mv5agIн[0|m1oq|-_ߡQA^‹TR w8C/mNP|nRclޡ7'NeP<=R+{x̜|Cb֝xڍN0F<[b'*؅VrV=S @-9xѝ=hٺ;ˡw"Sz ߛu"gVbzي4a{s}>0Ŵ旹^IyI~V+Ԫw| 7-r4XfKcMy!I#Ǡk4`xڍ˱j0]OqcBd)]:f')lȅ}:vD 1C$6G֫L׬!Ƅ٥e`7ST\Zues;6PD6Yz.[MNK'Z^=LÒxڍj1{}J@XV\q+[tgt301˜8 ֌.!sIB+gQkELמ-E A{Mʕq^9,T}mO46Z ҏYz X>jަ\fn,~zi{ֹ,^|%Pxڍ˱N0O:;,!].jDۃ`ڑx8@>#9&I8!sӵ[0YI1S rH"ncV5V.j_Z>Rqkg<`dw۔U)/-oKOۮVhG~८ooPZ;'"WA Ge_cԼ?{;mϩN~P6}CSRxڍбN0_m|su>=ryiZaCfB,^fDk2p"imV+22 -bܕEyq^GmÅ-7x˺DsYa4YO3ܣFTKo? 8PWqe %xW'(qe쥐SZHZ~t f r1֐9qU5g"xڍN0D|H;Y#tB4|M,bs{rFniZe+*P*hG/e@37(=wrii@bZ+ۏz(GkWx˴BikNkc3F;SZ.dj'ѿbGemey۽ C+|\S{8!i)]t?XxڍN1{H`/% p798|==H3#f=c`ѢE.k[B meM >;m"g,OHèU>~/m};P+;;f;%xVk{YEsoTrcӍK6C vO(}ܡ2~rWxڕAN =; mc) x{Gp?*9HB0^B0#DsrceYń$ifI@%e;#X[jxDz󑷫><":x&=m 74YZkۣ~v_,Mxڍ1n0 @]^ )%K/Bt h8K&"S87w, sBkgbuIBZQtqkKժ?Zo;o &>^sfY10 4ZC6.tE Kaa~"Luxڍj F>]v(@)ğk"u0o0 =b r^yp('agwۨtp(g(S2J71Z ~Jt=Z|{͙~5e%#ԶR)&"z_>T~hvRT+ԓm&S&IN6@p,WZbq~?G_]xڍJ0F}YzkK7#6%*A}bf!WKLdZv=ȜZ_ikXRtGĈV8'8e~p'm[!֜ v]wWB:Sm 0.2JZ#ad"s'w,P? ZiA*1Ǵ|9ҏbP#G*+ІP Bl5 1 l]^axڍMJ1}NQ{A*IOD\ФUaL2ӊw9{F'ʰ$QȦ[Y:Y4iJ5v d).[cdAIAJD"co୕B?\35FE=Ohޡ*|||\B[;z +4uJqWmxڍMJ1}N{Q3IfDĥL=4G&x{x6U"$w:a64eЬ1&5qаvPDU Ҵm!;7xo\ ~CٟPS>H-{B[:+V _Rn1$`u#pEHXɗxڕAj0E: A%*!tMXE")rKo_7(<<7"p46;wJדFب(^A/5g\1ϧPҶNO4ZJYUZ!ɭw;Y.w_@{+t8PbJ1N Q_sfPxڍ=n0 @]ؤ@AǦإK/`LCQt}^-":EGJcm;v3Y+dcxޣ)qoǑ,hB÷:k,9/t5-!탅W&rU7zs4?.tEqMa*r0Jߜxڍ;!{~Ŕ>˰ r5֛w,ߣUf ݐ8X̀IYoP%tbKwk2()b)hXD#ަR8_K<AuhŮ"ʹ5rԲtc؍ee¼S>8ՒǕڴي'oLxڍJ0{b iSћL33adɦ {#)Cfy K GKÕ~6;w̌K0VY#3<2ϵ{՜StN`}q-e]>VNmW)+{УĞj[i0M OUxڍj0D=E+K2z7E$JB2zfW23(RHH@jEE5inDQhPjfr(ȞQ14]C ?b'\9Z'8KնVZ+MH!>})?Q`Bz@I0;A@Syy==Ô,k _@`xڍKN!9sYtzqK5) P8<ш@QD%}RWv\.J!I˅ѰolpR` *&9:#0YV|/Z Vn{Gym˜䜅cC'Bۣ A(N~g{j9 kUxڕ1n {^}`Á.Mr hF̀ڧ!N6L֔J &wi!1%MlQO49Zg84;4? _5>Ὥ7G<ث9XxVk/CIزԾ '.ܠ\oTgT/vTkxڕM @=OM`*QP+xF8:T(#p#*k)ZmkT:ĀBhO(AM<H?k95g%?oە|mJkkpszG6ם`q}`mTRO5FIxڍ;j1@^xeL ?3`BJ7)SrY@˹3CB ɂ$D!ZCCI.(k c>[h})h-[7Hб:|3á6*!L^ZS17wJ*5_΅^v0F xCQ!xڕ=n!@SLi+R.HVM\` +}RM7:3xC-uBgL6$Җ&1:u)&Ir &mS&XǸ_J\Ś֣~s,7+1ߣ}İ{+Kg:!X,~JR@xڍ˻ ᝧ`.-`b9(Ajҷ rRzQ9 t Yc 6cb7>Hc\a,xd~C.ȯ9%\) ˏ}!ǙKմ5BIJk=iDﮏf˾`Ixڕ1N1E{bHk{Bi8C&x'I7D!MYz6F?gL!uM>rB"Da7qfx<֪x=k) z Kv|4ֹю'mVimz˦kp-!/$. ߗnOR.xڕN1D{K"$dXB2 %i}Xv Тvj3kG#G`G8O>$P7\E5M9`JMOdq;/ri]+s+snT|/Oo/=Nh@?0F-"zYϹs݅i-f1KO8g2ozcF̕$#\xڕn0Ew Tَ8B ],RacrsutjaphުsQOFů,:Ӓx`FGF"˦w2h Z e0;Kz.S_8ipqM_GPlrOn#c8B O 5uۃirkaYiWZn/tYlxڕMn1 @}N%U+߉P]!Lz#t*RN}zVc"޶}R~jg}(/PFG+C]aֱyy܆@/O*Q#xڕMjC!ṫ8BPG Y3.|&Ҩz } ]A/ϻ&@1(U$s*3G}6E#Z#LE>8l^dJZ`bFcƤMzNc^_HigIORK)үkߣx_@N Z@mki?QO,xڕ1E|)A.bi7 Q ; `F:!pyhQNI?IB8D]}K-AH$MR pY"}` z_|/N;RA'-l䜅̽!;֘%Ƙ_Fz~x}^aa~/ NWxڕ;n!ОSLi+Rİ|)RI v˷T1 uҴ0;}t6,m(E:8LjfGcZ't[>k)|}/Z^k?*m5V*xJJ2Bᷤ%Q-^hl# xTxڍJ1y9*g'邈޼ 4B-^љ!GEq#R8c2 hyR\h)0O8X.XzN^6Nwajc=SMy+`^ZŽcFtF܊\g^څBdqVa4xPx+k q~W_VxڍJ@@|Ŕ L6{YrɱI<{SX>ރU`Փ;y{BlEM1F LGqydKQu֐6D"qH"2' ^Pxߦ{(-9<|9=?-!k鬇4f6_hX>s\PC@>Eyd9 rouS} Y{xڍN @}bޘ( hbn\7>C3 CKni ry{5\&4*319E֎!1YF^ANc 'ѧfF)ik_/"|*_Pe=k;rvuVRw' T> %d_ e|G+]oN7eMxڕ;k0Fw;&µWV !cWe[.7]Jl|-LDLVe"'].`ֲXm"ŨI{IVX̉IRFm^|1\ZvF?ü '6#+xC(YZC8lw;| tek^o=imIbM)~UxڕPj1[y2MVu :C>2ea` 3:3x&$]9ɢZO><ВˊNˀh&QHUٟ,D璚 F6.G2Z^|%>~~z QY'vgX7l˶r{cܙNG[(yaNQUCxڍAj0E:,Ek$J2nr#K#4,z$  ZGLw$&$:M::q }Z)Jh(͘X6q[KTr_t׸l"E(QJϥ5'h:339CZiV^[\C\vnoq!1PxڍN0Fw?G7Y#;ZǕ $`sNo9 t#2ME ZCTȈj FB63I5Γ|H$9g1|Z^}Nϭo Vjʥ uZty o8P}5*igs OvPf`RxڕM @=%΍[0.ۗ 3Lxt9Ma4zPfxu/\Z^Wj0NE<; =%{e^~a .ucHqe,Lؒxڕ OᱥP&: ^ziz[e@3dq Jo`9zM*MRpGh G*@9$ggWKdSr]~Xh+_K}|ˮWZZ0=LǣMy[R;ǿ1Dz:ZQOgIxڕj0=^k)B!zڑQ6i?0 @Qܘ\3ژyCqs@4[P4t9Me(PvdBS^:׹קmfei gQc5ֵCsPzg7g.uӫǧpKіxڕMj0@N1˄BѯeA(@4eqBoݼ݃"܃rdg^cj&bT{U9{-ÜlCyR^ă>ຌsRkg$<8frÛR[+Q|b#>7*osN9ʸ3fmϳQ xڕJ0{b M 7L36l)T_g@Nhv!X&%A]p " :!مu$]2EαkюUn[pe}?jB >p:;/ -2˘{ߞ8VpJhxڕ 0LGE׀ B-i**С6n)xO͞b1+Lz p>DB#Xw.8Eʠq>ֲeY>4-M^(F\RE΂'J Z湴C,:9o}.keL^F(xڕ1n ާ"=f*V.a-f8Si,\he!yA B3!@ M8`R$G$eflD<@Rzg@BN4 E6.3IIdig[rKYkυm7JQʻ tV(;쾸,B-z!7urym#20|奄dRxڕ[j0E/i,A)M@W0cyLCV\tf`,G\rH'uΫ@%c^) tĹ ɔCw )ensS |PڅKcݠc7mVn*/3t|UʾԶnP{i~&Oxڕ;n!=-E,U&r<ȰX,+ٷ hF'g B1k0WER6%Ʀ;vZɡqZiKxbS.r$7r}\[|#lNzY 1 \H5kKxy w8}|TQʅ0ey]nz6``X64S1xڍ=n0@SLblhira'=nD`wE]H &#> dFp ڌiz$5ShuFQw6\V3kÕZBz)\P"v,f/%-P[s)Ӿk Cp϶kO|>Z xڍN0E|tIH 4D;ǻ=i[*;<CVSZed*doMW6U6ń3EVJ -R&cuO.p}a> 8 7n1qBYɦnaRTB:'3PLSlS%x-KG%ZAτR~< xȜ +ԟx^DYL?p 藑'\Hg8QظYO$OI_Nǹ-?E9xڕ]n 9>&jUa6?Ra ,k5㞠O734b'F5vĠ=toB6P-l nVrRM'9IõQ s_R >C³qk5O@#T+vKxsf4Z {'\Bʖ.W16Bu-ik?[ 5+c{rSH&v7a!ݗr~\`/F%d#YTD=vxڕAj0z e%J(z#ծ-XFYM0"ѫP >K!N4 q8Eܞlʄ: O%{ 9 akvk_߇3@D~fv.*˒ %{&u;JxڕA 0E9I$& c:ڔt_S}6G*pkjǟLSaxڕAj0zK$ Bi(ZieQPzad0fK.U)SqiB!$1zXz&:>>3\rѨLbE!k\mۺ5Cg_f*}o"PJ,$?WH:B[Ͽ 67?L@xڕKj1:E$!{Ӛ}8AzBL#k ]hwc:)֢%b31I>I!b*Cv^p>wq,ZCꥯ7yFxA*C- oۢ- !OA9~0d8yߏ]LPxڕQj!Oџ 5Vu=BA KA<[C9%q ֌||9.F6ޞ&yN$LI]>kozo?_ygE[UUQ}?5UiZ3Hqv<םQxڕQJ0b>A&Lk,ifBMSoW=paV9)IF8" {a9\u7yZdd"?35ڱ*|mko)^s=y/]j3wtW g?~e݋3sOV~oJęxڕIN09#!OB 8IY G`[jFh"X/QBAx Ұ?UXwA1EbFG;b\f&>:+襕/㖹tַʘaF(!p.8=bMwi42R?2xGi "rHN+X5xڕKj0:EC[M!Z[ ۏ@vţ^ P+;;ZDAY$^HSLZu;?Ie F9I03Ȁʡȭwy0|}'c|owRj1LDte Q|rj5F2C*.×Z s#{2/~W+xڕ=N!E{Vu&cav.Gy&q V89J~5$Ҟ98xM&{'IAd.'e[Te:.>_z+k?PO-kc{$ JRK)a9PTTvso764 oA:6Fdž)~{Qxڕn D{9X DQt#ְ;\*}Ѽћ^E@1d yKP(!&J \e Ⱥ(5N4:ͳv%b2ŁϾ&y"?V=܏jchE/2.gv/ y9\>R"" _ qPxڍN0}Ur[(2'&AYzR[h(Dݻ:)Q\Fi9<窒\h FlVBimZ#.$;4(ZS"H_p;Wq똅E+ ,s@Yߡ ٚ_qZm{}z9#, ҲNelp j ΀ n J=u4d =tW:Lu0ctz8=>n2 !oדxڍ;N0ާie BnY:0lju$@"z 3< WeŽ0G")%tS42+::\&pi쭂, snwB2.+߿?p>_=Nxڕ1n0 @]^ d*,P&¡ z&|mrGq9|&M&HOLɎHsHQkh[RsUVoוv}''bf~EU=WErY.G`ײ}@۬;_ePsxڕJ0@n; 2I&&6%r-nA$R-1KUp \Tv1u i9EvF 5`&<u^ >ڲtTNNeT,'R_L=#En}G qj?*n_tnnG{l~s~@XxڕjB1E3/nED(TEj;q\8G[o~=YkۂK&I*&(҄9IcI - rhX<`T^d8Vy'E*e^\vsUlηpϥy9AH3sxI KkomHopz |?_Ǐhd@#qLxڍ˽N0@=OqwTdAQ!Ѣ\9:3trZGơ5<$ fJ*ǨUw KDFA, d] ڨ `6Dp\ͫ +lgD2Bp\lX*2bU3Zޮ9~JJt}P rZ( 'DᆌGq$qw~o!Z,Zʭ }Gу gx&~Tmxڍ1N1@ާ؎!*"AH R=Nwܞ&q {'MVӀ!u2ꛛ(6#ifdGhuDŷ~YU`*?T/s*3K Or9M3qk=v lZŻj 0n ?y\CJaL10yP5MLxڕ=n!EUޒdY)Ӥ\Sx";$b 8^eE !kH}Q^r>]J FڰDW2+ `;fǼN_jŋ.q{򞷣[]IeSFIj)EzmN{ߘTr<@<(>[z~Ԉ>hgj]7$NxڕJ0{b..i/^|2I'&YT+x~__E@)T:ja5@lS1!cv,"z;yځrϢiɍlbAv:PΛdq/m)Jox)z:< HjH!e] U >6Yٙ_H{=}JڦSx&UxڕQj0DuL(VdkYZa2~F:3hMi0HL I#=:DV[ Xcp|,C((6˅KDXkTuxzݥmG&pM\ hcm=DڲTP Koumoǖ /ء~W ]XxڕAj0@ѽN1@,AB,#L}s}P/Ŗ;0De !I^2r9hCaB$%%ϔ|Ƙ}Zo."5z=+o۶p.%Cg8Yg)}ߛ*TBn"RFSBc.P9]\cki ^n~ڸ ׾mU8BїOp<v5dې~|A{ Yh %PxڕAj0zCjeB`Z"vd͡o^f"L!Δ+GHe*29fY(Jf!7KY\dv9)s,D} ɋ.}u}_ںvKX!`5UhcM7:~_j|oUKxڕ[j0ul(YہP cڭlͣaF388RNI˙z!"?\>ܙ W$JENlΒcHVo: S+[yUܔ}CBCtuZۡΌ&ƦQဟE#}jPv=P*,Qd^TXTxڕ;jAD9E1=_0 |1vvGZ*SAUPUd0M&"-!bҰ1j ^]M d'M˦b984+h-V}qMuf8-Kx/.LhL0oV"oieHn8K[-\Q 6y?1YĐxڕAj0E:, E#ɲ4z fjS; 篛ty3CY(&yp0cͭt* !ZgStXGρ%bMєέܗ]mf\ֵ)ߕ^Ra|dm*[4Zg2/P12ؗ_ȟMxڕQj0 Ÿ+!۪A/G!^v Ou0XR@):nTCbRSH# UB>3+,%ȎY ru{m~P+iG̈О{oh~Z?Vۼ4+T<IԔxڕQJ0@b>A&mNAD6d2y[pM:e2#&JX/q?c#aG 'nuf5R$b'ՐFfB8{ϵǪp+Mǣkn`FkNfGAZKpdUwgW>¥˖BCZϧxQxڕQj0 B+!r@)zb2 k(;z="Rc) ʑ&&ػ!N̖*88Z)\\ɖ=42ZkL:tnڶY{y>…P E u]TmhGZJR8GYxڕIj1zEc A,!o--$lY'!π_ch" C.[q,ƔxJ&ϖ0A ;핎*iyIFFuL4pi HQz/\r"~zYu[r |;omW~2`< +Qxڕ]J0F߻yT)\DF$4pӖt׺_sç=gLӄ<ђL&L5Sv᠞7I(})ca)D 1c@]kǚC7s" /h[!߭KXjnOϠ+) }M#ZUxڕ[j1 } BkkYمl8 oz S\NOĊW Wi' usД"--c`Hؽw3C]DŽunw*]CXr) C4<}S58}t\E5 3LHxڕAJ0}N1KE$& (x$hLIoo_|vfpHL`YФ\-I!.k‚i$NAÅh.g1V>cev 8ڄ,o;xVk[eN7TD]eR#Ty_Hexµ nNxڕKj0 >-XoXPxڕQj0 Ÿ+؎(.EY\Wv38$>{/e!\S$d`vP"JH(d/6$' :tm^^UWٶPlb}`ZTJݷO{DJ5~;? $IxڕQj! OBR(;Œn-Ax#.^Őj@iFBŹR%[L$> ֗[(xcd.ُc*q{*u'ц<Ϯ*k.5G>;kZBp5OxڕAn b*fKUc/58(D 943}\$FHdRB1)iՀ].3zf*"sM>Ƶu+7V>^;R :ȓChIYзCsPy+ Ўatr5/OMԞxڕMj0@uu (HB)n~FeG ^EHL 6 dWJ_cI+v=&BF\jefNLm?e,X%cbNƖhb#Dv*yiZoo2ڰӫFb~P!ߣ:>tP}[2~={ϴl2d6XxڕK M hbxGy&^,f7"8d^d=J]Jȅ:xmR*^hpX1x O.tI1Ѥ2\:;QZr>V/KxڕMn Fb*ßTEYU Ř}#dN(GdC 9;.GHR^g=v`Z9LQc:iK!&l|);1>Z oukry33TRX1iQ A͇v꼶^Z$MxڕKj0:E}- 00-Dn?zPENxmxJĈ4)fDN .,v~R/tМ#' ZkS!C0&cXY[)|mk!}t1ojJ*BIvɄX~Ft^QN$ l|7ŘUxڕMj0@N1@YR= (cho__{dD֖%Z}-RKAM\4huɻC_UۢItvWc.FS1k-X ;)qnh74Eߣ&7@㼰y?GYء]Y OӜxڕA0 _B%a)-#$lZE9EP-#*BKPB:$*[xWӗ1 {^&p87q%mVuΰzIAC />qGFxڕAj0zA%ۂe4aey_rK]-L O6:-Dzu43ڱ&0%vd4cD2;7DfDK/}a+(BC[Z{n)£TuFZ!IiHrQ:u}դz_JWxڕKj0 >WJ{زLL:)޾B3 3W3ŔWD17ϼD-YG9XJ<"'Oݦ&O7jҭ;8輋!ctUh$ :}PI+4}}SJN^xڕA @=aJI1j<+w0 ؖGp_~p7%Gkq(ZtpUߋWh$9"ɹ_O :LJ˘4Z|~kCpj^[Y{H5ڧzTƠBvRI)LSn) _ߐ i/I(Exڕ]j F]żZB;q$rxQ7[]pO8&)%I] ׈ѐ$J@e EdM6.):|mٞw650XmV܎)R)N{)xz2 ~PQxڕMj н}QӉPJ?#(f'=P=٢bD"0Ы&_iLh er{=jS!il*,91-} _.ǒ(8HZxFkyVwT9!\:7u%O^\Mho RxڕKj0:E3@R[0@Z6XBOn[jtx9O,4&g!l<u)p CR@ctF3αk/Ǩm*Vyy?. &c<mV\2>rlnOO*@{,5pBټ6*T xڕA 0E9 %cPJ]1gPFb} {)IוּDFE>>m$TɒsrBGNw:ϱL{(%W>W-w@=b7y]ZoѼiHKVwXsIvImJE+<02`& VXLXQmļ8p0cLF8c-sQ/xI>hSY ۶uWsZc(Ԓ7|yn3᷶\~kRvB%p5fds.VxڕQ0bdδ ,"$fl6.{{ RPXGF%FىL{Y&4&A˜4ėέqu ^w`Ec/t&eќokދlR]c3ܪ(GxڕQ 0 "dMK6)ut ~g]0zNȌYJjN00"=Y^j ZgٴԪExڕQj O12$*R=l.I{T)Dlk+5bjّ-g_cEs? \),i #ӶB- 7OS8t;Vǩ;XG)zxAhʼ݆*?g \N9/_ޯ]yPtOKxڕQj0 BPQl(cekXiRw׫?8<9)Ip|l'?P2R!."hYzLFЛkz9Vg޶}vi;8;"h{]#%^}x-Q KkӍHђxڕK 0}N1{Ao"{Ɍ Ԧ)x|x'ХDG˕kѤ9Nl(gAKC DlGړJXUY2[m]vy\Xw:e8iz5}NؤmOgDxڕKj0нN1BB B!(`Q $O&8GɺيlZX#O:e!n.b>rΆ uLYg?e ?>z GZxڕA!BPc˲v38!OCdj)QRf*eȒ19hPRB*,X1D1-[`- z:&\:z E~ZN2lp2|ُ6el[SCsm(CT@_gm slpiM&xڕj0 лBǕS'ra`}Ce&up} M<%"#y'x<ʐP0?;FEh8ʞH. ,1 [`IKmu_~ʺbףˇ/Cp8 :VzחfkjSeNk #E?LKxڕQj b>[ E5BKqDY1+9D@HB!*w3z8甐 i F],'bNkЅ 3ycG* 7N4@kqeZ{SOI |JQԇ-gHgYz\8yj eU,xڕKJ1}NQKEΧ4(C&omM`>rN!S9VRR޵&w/Sk,ED0J:[>OKXGL;3|w].?0yxGxBdlMxڕQJ0b>]IL5tfBͦ_=xt)0Ag2(1+(l<䮀y&o }dWa"/btZWL~|lڏM{WxPz) &|YkVU\iڄổVmOyrM xڕ[ !WqЫDAhf s_[E\\(q!fNHLť)84eRxJ!} NIТ'7ghE^_6Lz_aiں1hnX`͏Jkn~GCxڕKj0@: A+(%{HQ-,#ٿLf(G.0ǐKDI%|go4y,6\aBjԄ* uCƾ21~B:Z轉Ǣ+zo3k߶QMzTK͚xڕKj0нO1˖B=P dieFܾB ;LjLxUurz.yCz zޗIh1&upsvRåpҶBU c>=$gm›2J UsJ$\C]!N2\?wxVcX'Zv]҉ԶBPڒ^?UyxڕJ0Eٹ$$i #`_H~.1,#eq6qy.sH.-u2ԥ*p1&!$Bd{UiKhM:uo^.Y)(J/4; vY³5*GO (v4K0%%*l~mPxڕQJ0{TIMҀ"xMy$[\ x͎B-jTؔw5>TfF f  _!0K\'d >K/1]S{Y/h3j'b=,A*P;|re#/B /l*88VxڕA EaU!T߿B/} "(N]n+gqK1p i+ j9Y9LIѫKvG=.cݲZa?*B_)@c=r~QJKԝxڕ[j0}%_-MA =JZ!2篯 3Í0$.F*d$, *x[u+6Ztpk^ -3@`;໴qak1>uGf7 u_ pk {x]x -[9ڀ++:mp;@GWxڕA 0{^wA6i@DP_$hMۃ/x s\̃c7Xh3@j;B9q,j 3y4=j#95׷}a6K*Cҹ+h9# QmUQ:`zB4og_A;:FIֵп{p=ns~;:~m+ƄBʿt O0G [=xڕ[ 0@b y5mAD܆L236%.f72$#.tSEltDaᵂEDY]JB٘NG< ½c,ӧmdxN+\R`wpVkLߡA#+9Q@FxڕJ@>&2 , &;aһ_o^Wvf#l&I9$㜣|.eرMNd)g"%dIEC3]zhϺM, g?8cjVUQ <696'V@@0|W]xi>v*8M/MYxڕMJ1F9E1[A*Eܸ}ics]`TY繊ۢϙ>t>D]kUO\hDbMxڕMj0F: APJKEWFܿ&7歾Fɛ9DOΙiAm8Q^\DpQuHp1d83&)16ϙucmk/wٶ6c%0EozZq!/޺Ue??vXʨt@~INԚxڕMj0@O1˄B?J)̌5EH㜿7>O3(h"*R&& 3qرC@+@N#u*XIr f\paCsmKWmUmI,qFZJ Gg %9 >s/W#BRfg: *XÕxڕ[ 0@bW<4!db)u~˝b-VhL)ѐ= !Č&FZJEr"D\Qio<ׅ<\WNOZJ-Hm+3 ŵs:fVi%N$>KxڕMj0>ŐmH%GJC 6Q }=O3Qdn>8DG0HFo >8chr8YpDbԏ&FFpթ6ڼh}N ?s)UL*}H;*{]rML̅T-ؙȠ*[c).p{Z uƤTlaTxڕM 0@}N1{A&A Lh6%_ o u *[.GK)b8hf4x(qr9r-Tcg&StBK!Fmy| ٿC-q]\Bɾb9)Z"9ټhȡg\r`T"ÂJ9Ȇ.]uSkxm wG N;Yp*oGU )I@?p*uB}wykPxڕi0wMq ӿ  I>a )+dN&R50{0ɧ-ap-(^ "ɺ fLNiJUEL:HG" ^Zߥ'Bp_1|3j2 Q+3} Ń&8i^)oiO q^qL"xڕKjD!-JC{}&GȺxAI[Bu!;LՄhSsWZt2}9t U ] O"҃\pkoW#cL7׺Aikbt"ޙߢ͵y@Kgy jsk/į-~?MOgxڕ[j0E!R64"dkgp"kbLtjR&PXPFrڐ(SI!ҹPNN"x~Q7Lp.X_e|ғҺÇR geOt'--'8e7w>mkoa#}\{uD^O[`xڕKj0 нO}(PJa d8 tn߹Q ddBv~ %0O%\4ʩe!I(2څ45! e1t<~_[{Ws| ǐlpS5ҏYN]%m4YGxڕYj0b> EPJBh1۷=Bh@譳Ny-9Z\vdWvl\,r ʻ٠Z@ڀNzތ[mG7RNr z 䬕J /bbs +Y0G”X**;`xoT7?o8:<g.XxڕQj0 wB0Grcekے./W~m"9H;y @ \ ## -+D`PsKhh0Rș1$ehAWVL&ڡ}^CJYFo૶^y6:qeQ_U MryJc1 ?BM jpX p E[xڕKj0:EA_K0$ Rc=2rk !'TQ+ &-YSB$Z!Rdcr(4WKEGeHSYKk)܏w۶9i@ik]|&7P|^;xO:=~1~ PVxڕQj0 B!NA/ے!v.**[/1q! 1xf?Qp`fb'̙2GZ4G,vq9OBacBΤX[h*p|~ zs -)mr4[?H]z4{zHxڍj!PQG!.) ߉dAB޾;K`0(B I>qN5 N;=k.̸52.fZɅ×&s[>nfGz+u}ΜEQx% gJ?peǺ= fW1=ڭ;#ّW2!aż^b~Z`;vxژi]xڍN0E{,؉#! 5g+?h)sLDf$E7A+c9 9Y9)a=a7eNXVMZ!5B ܎a] ^ºiͮM# TLvT?"{>"zHEk5-&pV3 w?jПw\n(X P @ex.eJr s)'%åDMӰ"{xڍνj1^Oe!4)SN$짏ҤK;3L_E< 1Q";Fi)yQd,Z$1dٸvB"($/PWGZ\S\8_K]o`w^ j/s?8BRYNu>B˷GкD |v?bGyg uUhxڍJC1FyYZ3 Ug(4ĴԷݜw>"@, &eD%aCCD#ix1[f!zvc-/vK*7CU੮ϧr9>N;@C{mVeS)_Q.u<ֳSins跳7RJxڍJ0@}.E67 2ٸ$f&$C*}{Fњhai AF"^4bwpe@7P@.29d)A['ù;:Jy+/m҃1VRxw/>WI%F| 3Cjѿ3SExڕ= @SХg)ZLC x!En=OMD83C`5 b2HP0~u5PS-;O TSa}T@<)VůMѷc/rOk:8cTr]=YtnECNkZP7xڕAn @=} U]U c}| JVIe4kr:@M>xP:]ҚT"e.͈'cYFJqoW+p+e^Z_Ai&h""e g\/m_xt>\LqVakh^x/Qxڕ; 1@>x NQp$/d2W܁mm7:ZM1X쌏B켶]8Zq셕*;#JEgChRԈ;SH6l=õ= $Ho؏})u~!RFNKY=[:_R!Ck]c+Lxڕ;N0> AAT`'VXeޞ3,̔6^IYc .xpvΪQG¢DdEgOɉ ϱ>kc?h=Kg<%2;\ ZD.~6n06@Đ@TxڕMj0@N1ˆҢdA)Cfee^Bwo>Ds'sSDxgY3[T4hYGGW8r.^z3{¨!kX nuۺCw`jZ֏@VHRI`TN ?'ݷ'}_sP0xڕJA@}E~W$DD%jGM2 Cgߛ;s THNC!L$)4>(ę(x4)B6D_Xd>$[ щxmi2?POOsp||Mp QZXnYw_n6n%~!Jxڕn >EӦʤI./ AtE/99)"F;BN2ѡ1 U, ´EGQk)[(ڰnUhU#%(&M4H15eD<}6VRNiMia\Jbяz 9H ?!7_u˟ Mڙ)-窺>k]10.MxßjJX[v}_8ey۱|AgsE8iZѻƐC%^қ0䣔g ]ou_O9-MxڕKj0нN1d(c JrhE+MN3'2$ B$Nc(Oy! r$ā}9xLT\T6еYGZmۺ7U &y5ܟϦ*яI}v .uV#L6xڕJ0ECI6ӂ"ifM%M]ܯ <8V!sl A˂(8NS` #N躛,VHJ31 Ѳp1 Rkqo2|ǔJ G RhmEZwl[lvD ɫ <LB+$8=~?%%1=/a[FxڕMj0@O1dPh=FҨ { ""mHѸ˘c@<*( BD;=qƐcd wPhK^'!*:'7:Qmxڕn0V~%PoxwET݊/F0C: D!Y`RT?p.˽c zE: | ǜ3_ǷR˯r>9ѰVkoe)%M2]ahi"ͲH[F.𠴂̭Q+xڕMN ?YFw{ C5^3:"ēQEROq $Fv R;KI))9QIKD[NFbu(+{e \8/.8g4}~հ" 1qsu[Kj;w([BDjḗ$ATxڍN1DsE B 6m{Z= J:^G)ѓOfBENwܲW+L:N((m{5Nr.ȏGpk8;8qmӡT\k \rΨV4W³!;x.dfB¼cg1 l` A-em0i!~xgxڕAn bVl(q/Q0f5Zq74X;ƺ8x%`R+UGm}4*^e]}TMc[|pks {\!@~OxڍN0 E XI;B84{"}ڬpU[.)RS @+dnNy |o;w=Ħ~"xڕ;n!DsNљ[+3`YN|YX >WR#2qOA:OiIj\(G :)m`0C#YY1QZ"s\[|Jwx+׏mY.o V i8&dK,> gǯ6ഖbؗ8˫l:|hRA'誱Jѭ>7/ExڕMn0}N1b;TUݴ;9 q7WV)UIˆ:II(XwT^AkD6&0;TrIrЃ%'^Vwrf,)ii>*:*T72Zpg3P3V¶Ds[ GS*xڕN!E{b,,KKk3.Q/؞{nrFcd=[A+ρ+Zlz%q ͲN05KRVI;V18F9-}2֜nxٿlϠP/ʡF ai QwO eT`ڠFL-g2GG8;|{YP"xڕ1n0 @ݧЖ!@!(A1KAQm4 Uzz?dRe-V4cKDlMB> uz*Irj9j$0(Xv5ƆH7,V-{;5'MZ4һStdDut`xwyRe |OU/}JxڍN }b&1ƥ7 03Q.55ܞ/h bII]2 D/F: #_xE셬6HhG5:i51rm3RK~>•׶=e )TjJsEq<[o\ꍡuɵ8% 99s>sSxڍN0}b 4n* FgXșPT`y;RF47{m"U 5mPY`|GNS@d3J{J!6sxbx)7ܦ~hnr@ikTMcUQwiGq=Bi*4M 15e3Y@2e/W~k]{xڍ1n!@ўSLɆedY)"Y{v0[qotU 2'!Nd9`)9dcvh6 9>r (9p$IIefltpsբ:lهAZDgfldup][7|{;tKn8<| !|s/q O4R@ɲ2׎i^_GxڍN0=*W$ƥvi:_3i %"I1&"2c1euM&'C 6Yr8 T\̊vY78WVyG|M7^6}AKa0NVsk/1z'q opIZr좞h"Jxڍ1N0> MNjV*h;mNU<d2(b*FJSzѝ0zld WX|ӹ\^նq3N^1wW._1xbU슼xה+v@ŶVٌ{LӐxڍj0W C~M,CnE| cTbka. +p`h-c輈!x i6.X*iI{#3mB`8ǞNkt9㇮yzg^tZhi=F2ՊA߶J=`s|GL3}+3me 睾SiG5Ҁ ˀ%$<1co~K6[ xڍ1N1ާ)޵*4Q#g6Fqh&g-zR$k[ά1{LH%59wXH&;/e ^db~ ~0Ltݕ%^ `^T!8b% s".sD H%EI RU0l0Z]R}5RlO^6N ۱ >h [3ʮ5+lD؜O{ CxڍJ0}I&MAb8t1;ini"!#f9Lb NĝsVy1ѵ*j#2ɚ/ ·h`-ą^gBp{ZJy I𚶍~q[/W.ܶ/O u{cfe(RBft09cڝf^ J%ł!ż 8}UU925Y3Sxڍ1N!SLag2$Ƽ 0] / `77*-#s%[^tpSbo>ehIF\SL"e[cNj$.);#^ۻyO~Ksg 8d-ͩK ߻vCe^RlC/ HxڍKJ1}.ATADp<@U~ 4Yx 88s>H;[ƈ!jCDk@colB4bO0ljE'}ms1d}P8>F`pΛljf ah)sj]|3|ZuyWRK(=:,OW+L7][Cs8ǺJ͙?tV >;+nʀF1/XU|X] J'ec`Cdqc^rDo(0;` QwEJ˰l{Ha@[G`LAYmI. 8I=~zo- GrIEq2Š9S1Yn'.KUhXy9A/d4)>T*7R?RxڕMj1 @O}!Ud?PJt]Yf h3WꭾS(A-p )愡DH]Q̠)\0ĒœT 9H%Gv\ a4tҧ^f۵EO{<_O{E蝳o6U74oL~9}Nccm} IKPxڕQJ0b>AK"6$Lhmt[ u¹\f@4)dO]`CFf_<$c9 = o HtJc0ɥ>яO,ug,MXFs8 ֵ3]83oR&simw篶FwT-guT|?L^xڕ=n @SLi5(E49`6 ,+9*7HHe4j-Tb~<{.ط <92<`)FCR_xڕAj0~45 !%!㵈eY2l^ pFsݠvc+B2hٻ>xuY+51j񎆠=0Z;(t |/<%o1t Q=xRT2*[n#G^Z3l[#aa9o~S)xڍj0D{}v),@HRHgI#}@`eBVt4)O:ȹ5J3)* )B-Ir8J/zP(V7BcqyW\S.p};xP+Ϩ5Pa%sH1B|W\LS}ߊjF?}-acRA`t;Ť9Btx|?~58Q'MoexڍMN =~Zcx Q _uܿ7d[$X&(^8PoZ+9&IĹ0s"޲(f)[oxnkŃ(/hO +ϸv{1]Y3szJKxڍN0 y I!N,N@#ZɅRr.8gPk!/BNH9Nb2䴑S\n .B eBp}#+W5>[pF!k;1V̎zz P!FUb'_>nO|xڍ1n Wlhri,ŀq}RgFd(zIlgm@es:Zo).5_i1lI\$6gL#*>:|/V<൬q ,ϭ7!΢ jD<3:MQg.xV|?`6{K Yw\|n@IR$i ٚ1ԀTBҔ}ڏ1|1 ֎x~\RZȿDJE~9b9fpk}vPNJxڕMj1 @O}HcC BnGb 3(>|t2C"W[I+-A(,.u9Vs7HS(.VH$ c-obC1g}߇WO Z>":G{ uU'HwCvݼ77(]|[35{Oxڕn!{bX"w(r&.6qD-_31<餐MtDgB6b@>H$3{FII֐2S`2) kmk)r=]V(Gm/Pz99[xZJ2Ź3ܱe +Cȸ'\`$ c7p//mKv/ Wߚxڕ;n0D{b{?t*'XKY)}Tyiim f VEԞViY"1F5-8'~ހtD:x-˜1OL(I:)A=Jp+9 .q]ǭRO@eI*)Eͭ5("/}8A+pν4HZǵVhqRRVxڍN0=v'hl~TSOTT8pݝY"蹔(F7 ᬞV;)Jf섅RZV6NVd4jڊNؖV\ >st׸xe~!4]5䜹DÕ+qZk0S|C Zab>ԅ"c+\_ x^8XF}9 l+ӟ%yWr`?xڍ1n E{N1} (n`]D{}ODp6F:va2vDZi3tHbm I=[ ^ 4%T~P(|Z|Bx/rrmGt(ݤE"Ly"?|k\ﵱ'pmЩ\ +A嬽?[^xڍ=0@ާ~%dWQP!&!D Rnii^DE:^s]T(hhM8d@fHY!ao\]$p@/oZGo"E~_MZlp8RW=mqwĔ<1]: ` /Iɭ>k<'u]a,{8I2xڍKj1D:EF/2"#k }dWޘ!ψ`цCtb6\ٰU4(xrDQEI$1&i5OV+/k*{=lm>VRi$K/p"1;|<B1-eǎQFY{߮OrxڍMn b0UuMA P=}Id~zct$ NtΡz&oɮzA ŷo\:H`(̓fLTԫ44j+\҅?ϟJ{>Զ.N QLKyb=;4S*<^/\ү節!UtxڍAN yWq&BcΜ轴 %8= XHOZ3EfhhR(uFpsMsnܒx(-% M}6~oljH>J2߭l_8ghw{ʵW~ǠgqGxڕKj1 нO}?PJ!mΠ!+M,1QW.p^Rb)wFE5"Z"Qið0gn }s0`z/ y8n&zZ?jCa JoxڕJ0}biڤ \DW>e MI݂O>Vf#!Dcshv;͆W{6 w.'2Z@LNTe<KCӣghmo5`1M*˒U߰y%\!HW9 A5i.Z`o 8byCqf:I^-xڕKj0Vq`, J)tIq%آ\T%gtX*39&5[#d,dONfoR*/igXNkŝ^lr9eʇz4te N\sl%υoEx-MGxڕKn @ba (M7=;ܪot>1q"u.8͎KzMYJLY=b^EkiQ)vDVI'QsGdx?j|[7rףW:C( Q,OEp_577q,QRoVKO֡02Cϼm&mUӞxڕMN -5F_cxྲྀ+Pj4 .'ɌNAXz.OB'證BFmI8Ýsiu^FqBIͳ9iIE*Qpv7Z KYߖ-T B*鼶Fty wȐ|xwD Zn0wJ#RA{/lX sXxڍN @}b1 -Bo]ϗ3:3H4dȐ,Z H;IJ'FɆQkң!>I1 N^I!Ltv_ ײ;1_u*Q#< b 2?8E]139azC(RΫ cc87!WÑxڍAN =@0;7%Ro љh\ vA{tuifUlrRzqUƨiNjXY"ckY V׺-[ة\j2S“W1_kc_Zj>_b8KT:Q ἎXΕM bTxڍKNE!笢&{c:q nxD{M\ʩSk0ѡx&B UHDBHj N3d[a#F'&r^>ർZ9e><R',^ϲ7/dHa篚QCgFiy"Eߥ~2RxڕAn Eb"`Jꢋlz ƉrGXE)\<{R $|Mi:[rR7^ DN ;{9mBp&&fX&(}Gk'ni멯 :<xѨrC-$=봽WG[G[e,cn 6:/HPgxڍ1n {^]"(H&XA9q}"} 6!k(ѨQZOQH7bOl} CTjǓh|p&%pii>R%;V{y^J5.RK)A?QW]K}:N+pY{9W[a8s>ʝ_h]xڕKn +E|(겛g0NWrŌNT΢!8"RO!Y8DFT$NFER8KVKe1Itdk [)kYk܎ri}@NZh9OsYp,ϒO>|@#'qyL B,>\ixڕQj O1 f4 R(5DUHbx 3C".#3 2[;adquрh{H󚬛8a4l aH*z\>33ʶo!}frE,ć>VG{JTw[.t)㋴[eR߶&ӭ"I* NxڕA 0y4i"dKm#q f.hc+,Ks :h) ŲyƛBr>ھ1RHc6iש6Om~k}M yY™+]v >G8`hV ,};_YSI Gxڕ]j @wW12:J)#&z1#~y.ϝxcI~& Dy67T?}vrAw0\2W5YKi xڕ 0E G(nI2֔8 nˍitFYC)*(vlaНIE!D9q;Hsme]+%\vFIj)E۶0ߢ 9AYV?RDBFxڕAJ1E9E-AJiADƐ0IS]3m{oU19:N],3R&#'?u lYK}MbEg)GRې= 䛮CsVv 7,o0`}'֚:zo|, ;-Mt@;BҴ GRcxڕKj0:E>B 0Ijagr,jYU2ə t|V Lp.:0)dY{)X|m9dftdX%ۘ~86{<{i[dbӛZ2EeAeTdYP!Q_QS&TNxڕ[ 0@bɳI@D$3֔tܿp^̐ݔeKM%GtťB`|0R!ԑb-mB-fbΖ"NŜeX\ֵ \j۸FgpVkU-"7Tw"oacABA;0-ҡ>gL xڕAj0 ~b+C)Bo}"t/OeN3cC2U*gA$U)xA4F•.,9'= kt($SZa"dԠe[vZn _oR?.:!4 xIf7(u*j\6r?y=mX-NxڕKJ1s^*e(;$0IL7Wp[T}ELfH.9QQLdbL5f)ZG2N'wg}1xr Gm2&|Y/ga1)ޒ^myڄ/(Z/"h,H(a}=1>/N4QƉ.]m3L7&岊C Ϸroe_3\ {J›xڕAN0@ѽO1{v&v"jXC3XHȝܟ^@lm!#xĦ.[krYIIgL:cHVxڕAj0@ѽN1B[ % -]%i42d۷9Bo߷ LY %<"T nA cN)pDKģ?y_6S1/K5xrvz"`褮lOCwku׶¡[ϟ+Ul3npzIxڕAj0E> AG%R ]cid5AU"93Y5BpKfN䇍`ѥ<"Aض.yMSS|xڕKj0 }N}aO ,ЙxpEo3Mp\ \b2(DU8l`^ɫJÐsUT=.>&O.?2R@NpHu^/XP/nTxڕKj0нN1ˆB@ @w=CifYyN\W9ym RuSܩm@>͜Rt)O19fE}+^cjyUwxNxڕJ0{4?H_MvCmR鍈 13R5*v )g =vav"F踱ΛQdOYJR!e_洮E)ėScϠ3{ eے7XڐFS>`~yGbL7]"$ Jb@;pѯ7m͖2z~)teH7n=xڕK 0}N1{A&v " x|&46%M6^VARN!ĘX9$c`e$RUX7YNFOcJ?09HyeҠp-slX漮-Go2JO$erkws{{3 vHxڕj!O1eV]g:tUre&WVGd<9ʺd dnue)-QЯTJ)XEx[:fm _uۄw)?`:&/h˥Ω͹i!룊Bڛ|è?zx_S<OxڕM 0@}N1KEt@DZhN=zw4f@d#{DG]%I|>v)6/qt|shֽEISP}6%:E ch&u4Uk.]뭋PI[U<ߣzm kcG wa\JUyHVxڕAN =D1&& ÐOzO3 'ڦK oȐ5HCޖ:q𷀣 r]~E&bI>)d>QsguW*so`X|"o&930< m2߀G5]CFA S*xڍ;n ОSL(|E)3D6D,V6ӿ7d3.)A+7{M4`(y,#4$Fm>XmmI&#:Ƅ52DZ~x27cc /hr=K_С/T_;2cN('or8mO_xڕ0E LbӀ<(G2H9p{cMIiЋ  zK1ۘw+g\vN\xڕ[ =E]DaXDH`OEUq'`\RӺh0fg NPMV"#Isr6&lo7G*i.Z/GeƙGV1N[toPϴ|4Ow?->QYxڕKJ1}NQKEASUt`3dzmNf`v׺8"5-17m\Ca JJ1g )HbQ0SOƄmopivj{yч2Xִ];Tgvgha~dHxڕQj b E3B86ªLz97,dA%210y tRN>&kL$/rbSJ&rt9KtcPu) y-g£*}L)-^O)j|-=dQxڕQj O1] D(KXt2CI :6f!)bqH>LQBpv1X^ء9SCd;c>$Qd 1l<`&]_k+]2|m $қ:^Pe.!eGgyVHD;{:;,Y{/ychKRn~WtxڕAj0@ѽN1˄@eنP iFX`[Fm_M8G׻ɇ89$l=&ɦ`Es]cg):&]!@Cq"^:C> e _}}4?,\MZTߣy5\yMΠ»@-u3M?xڕMJ1}NQJo@D<*:1MF­ bceI1E D w 4{p<.E[Rd))Q!tSp&u^Qon[Wx"y+=x'x4UUwhy21|6]n|3?'jr6.TQxڕAj0E>Őm H#ŶBFQԖ<=?m"Ont~ d}Bs  ьݓ1DMS !:D1цkL:s˛,𑗥*pzە/Eap鸮kV7-Mqu ~T& M"Gg*A.J*Zet? Zxڕ=n SVFE\ybxW}:hԂT#>2!IZ#9vΣd3S/kFdU[/rZqRR51G]rp1 oq&pK.w`\p^(&C!˜8V\ASqk9\z0; az±Z@V㐐ۯi =ai=x\Zr4`hң,ɻcQ}M`Kt?7h HiWL۔xڍAN0O1;v,!Ă`q#w `܉Sm:j=&>-F&iDIlie4ZU.N%F)wExu\NVKߦ3y֧WPqH3“i/fT(PjX vz8sK9V['Wזxڍj0D{}Ŗ cmI!Ls V're )RyHg-/sFDvE ۂњ4CFݨ!`]r\ݦr:h)+˥u8OV+kW:RSLq55h8-vrT`xCJ7|"!O)g@9k!:EbXxڍ˱n НU ])2v09V D6No~@ y4y=z iKl7qRrC;<#1&JIDr'N[D)2GM*[q"i&,r2fl+PD$v8 am૝5.Ts7(ZZJÇR"QMFy'ӝ=:ZGf u(RH5_6[ INAxڍj!F>˄BQ;\nZzH88&з@~щ82 9E)D!;-Kau}Z1lS""HYqmV+S~w\Ry3jRbt %YƠh /d͇2*~ˠz8HYZ"ik'5W9Qxڍ=j1@^&?MJHE]3A%9q )eT A4օʕaqDdȂnn>k|~>_v6Bk^$J)lcF嬊o+w)2<6Ж_iZv{1,Nxڍj1{}Ŗ1z[4)SzD}D`Ft:+Nd u"qv"uX%$@(❷1}}q/_\@*k5Jr+p%,Ⱥ' w0|&as<ᳮ kRq=}d:7eVxڍJ0{bI6"x\&ɤi4|{ VEwd4!RqdBOȎܘ ޫWYG 8"3#uAK!hG o7ۼQ:FxFk2&A |O>i6&rt~!ȾC^pv"UVxڍKj1D:EFIv-$#k}dW<@Sh6!Yd†lC6̼; n^Qld8#qRl9D|OKZoo/j 4z""f!*{@-2+ݡL^Wz2y;jUxڍJ0EY*$mf@ĥ7@H&^O{.{.Uf CJG3\煙O7tJ?:DʹGڐ ZͨҨ]l[ %%]n.xR/=E"IR GTS3g>pOa&nήW~Io-n=st=3X!~E[xڍ1o w~ō*E1:v#F `sFnvx};jTЎGcBЛq/085,A 3vRN7àB\j6kRs/xJH[>v~!Kt#c(CF!|渎>QvHJSt=HipE( WT,cl5pe;p՗xڍAJ0@9&ѝ&6&M {^?Tsyǜ {f5ujI$0MN"8 eDFU| W_Km~˶k\s;W [h]#8hS|K'ݯ mZ A\S[!UO

 9BlZ#3[Aп9> KMv^V#Łj]O8b,cއw,1%8oM W̓u^mJք`XcG6U'm qz UP;{i)TJET(ڠ΍tޕJXo?/V6xڍ˱nB!ᝧ8Ƥssn4];pᠤķo]HDi"yB3=و)N̫<%Za.Waiv#Jǹu8oC+E^Ο1[0hQ;̰Ө gCəAuxt[RҮR[YrmQ6[e6[SxڍAC!DA[* .9Dm"Ŀz&3LP(2RBAl8cP>lƑ6 QRtyԁ6 uL7h]/w4 VC"ͺ%:}'g ({Okxpz?nр:>2CK) MYxڕAn =`٨R5 `)즛^X rp޾BM@NX}ae}V i}c9oquVxڕKj1:E/cAdClnliF !*x7fIē]I9 ƨظvHG#W8umR|c(ok|)«Z/Gyg3,u Sd1KN3/9PxڕJ1<)]e2-ml|$gwdYW.Y`98[gB I<<524q΢nұxC2 WﲷEX}[zm⋞xʾn8QU)1Qc c)Ka_:ÁFKoWopRȔxڕ˱J1>O1$nD,ml|e.^6K v??L%oQŅƄ6RPe'Y}gՑTDB}!jox{38 EkMѼUMv~:hڢ౞PxڍKN0нO1KqB]v3Tq\%"n+<׶94rq&*c)1YOKXs=GߦOPès H2?#EqOqr ؉|U V[ 6 9˫RQsxڍN0E$vbBHl~rIcՏʙ K9g*0rg$VvFs'CAq.`"MBW݀,v(muJ+qfVs?#vq~>_6Zs%9'x48-GX `\GE ^#.0 o/ 6Xu$OKV -y|xڍ=n!@SLQ4- EQ n|/ʲXk6oo+ҿK2PxLɑIh9TZiqU&k`SƠC6L%YtQ 78/SoBk{{22L Ezu  ח+|eo 3S~R~C-CgO<xڕAn @= 즛0"3YP8e'׫0NJA rr4E)v,*,RV u8qR]ApD\3|߷&Z沽0N"$sf{jCE #Vr:Ԣ7,T}p <AP}OM$T3F:* iczMZH?lƑxڕ]JC1F߳yWdE tM4ݛv s7 ƐRHDA+D1`l7'ā,0h1zrHQמu)/+iײY9̽⭞u8anzaC]K/0: ~z?1]G(տ?3,^7\[xڕAN0 }N% 9$1@pL쨑zf8?y}O1KɆCƐqBO3VE D".F^M{ڏj*kKC?&$%A;>9`2VѦR9ռM<ϥ-ow07U[U(˒[CuoJ(w`X2J<1\>.BNxڕj0~=&dPB^mfF*3DRN{lɅLcbL27&x&Y"%"N:CNs^wKX&ey./U2Y]l9m'~ i_HrY@ r)L->KU$*Ϗs ^ݗxڕAj0 ~"Ŏ {[88 0ӛqD8*&*i`d(fY.!pI0QMl3DvPdknueYjgO@#l p@4k]w hY\'̲y\Wr@\s ө*0RxڕJ@y>*'LQž׻Lwl *n4(Ɛp(;evc5"mvx- d=Pt^p"Z4b[Bc2o 9\}fx˲xTKz}Z]ڶ Kg"u߷t<߿^'8gY/r=Aa%~*)7_XTxڕQj s%& A!A7@qovDsJ`хe3bDp@ZŋWj0wt 7.Em7 5hCxd/{'Qޑ?hexSFyf784&Ai ^$Q7|qp(z=Ύkxg,tN/]xڕ[j0 } /+,-#dbQ b|pcFC2rH>T]LX'w$ M]9K1{ql ?R?/)uXgEj&ԫi j7{l Cnǩ~zK xڕM 0@}N t:i@DhMIS#ޘu@IN>[DO89+"F8-4tT82)ڜpD&h #&I8 GkϹmf*R%y=]ݵhZPk矔/VA)xڍKj1D:Ec>BKݲ pEQW3CISF2(g(dJ##2MhU0;?xCQɑJQrؠcy6]IJ6n|gZ歾~}#./RK)Ac?({ ;{-WYOϲe|9,{u-Uz2Rxڕ;N0>b%% "#g(g@ySrDk R jwCQHHv\p2e6FkkݜGD #9dod2Jsٰr>.l/ %ea)Q8G+m^R9 /` +588Txڕj1{=#O BI[,CGҦ)m"@yr#ڔ=E dψS0NMV N;>c},Њw |m"Ox[e5r+Xp'[4[k:?a|-g] :UPjzjDU9vb1?kYsxڕMN0 }N=I$@ NџQ'9L.Q$'+ vݐ5Wum4Xa^}{ lg;HJ!GǶ, /6μJ=m_lG!xBhYG. IYC`B]OswcMx_Pxڕ1j0{b@a%Y^H&/)֫ݳm:]q< 0 -[!e5D6h+pӽ,>i8)Qb&S&P\|.? u/v^y/m{ > 1&Oһ{tr>ʓ 37x<ڕ Ts_eM"xڕj1D{}vjOw7buNF }.E> ÛaZU&ث=NC6;W] IPqRruYͥgVt>͸5}hI'7X8+ƙ+lWheϾNxڕKj0:EZK0elld }#d^U Y{I VSiƀ8L)8S5PaLYk&/urTrQs"D#׽WfOxF5v6j[4H%YzJj Jy>B2<.PxڕAn b*U񂥪ʱ\q4/:VE 0YdecZO8,pQmsک8^Ihpcb 5v-M৤$/Jr3=}|Θ֊vsmM_IO z#ɲ?kzLxڕ1n0 @]^)K(ХK(Hlo ) e P]% 9 .\hSI&M#/SC UQoǴ<58mYteom19xd9/C{Wfy:7i۟65uHБxڕMj0@N1BH?(!M6]6J'26Q% NG"H+>1ں2?bʾZπ6TRte p J<~h0q.ګQi!Mxڕ;1Ds棁lġВb=E6)G=(m0$\(d9s.bĐ"VBGw0QݒfB8>!naN V=ۥ 9ZE8mg Rܡ7e{J5YrNxڕAn Eb"0`&AMNj޾Vn{2a:B(%bC]&Nӌɪ4xHHwg|)Vq3ds-zV{pm{yڱ^X3&>4jI6~[TaqA:,,P? z;c=kNv+Nxڕ=j0{b@пdiR-ly]302BdVF1b.u eO?y>1ŢA\":l\yʗl}g}}/ҮA8 .&& :e\,'IBP }!)B}mP(xڍ0{}pT!U}$:"ukD9 lJ1X.XO!'Vi G&1wN;3DW,[J[ e|-4utma>DUпˆ_~7M^di0WGhԕziLmxڍ=k0@w N4CBu32t gQ=x`3؆qYsbY}sgO v1S}]]Ccspqxo?aW\߀!r!8 /U\̡VWj2̓T+&s;]>sw>Mxxڍ˱N!О01 ;,cel ;ܑ[òW.̳w.@pD $&I] 2$w%-Ȕٱ7qi]Vzy=-O_4X1bЏ]1_1[ַӭea.CPI(xڕ;N0EH^,!DIL8FS{ڣsno(V3҉_X8C! +L?Ql] K_xbU_Q7裖_z-mGWym{#R"NYzb%X|8:aaZ dO!=-po.o>Ѹp](ASΫ` 2o&4KֺjZx% .DŽ}clWַY &aɣ}ǏL5yP6д"dMN =P͚xڕJ0{b̤".ZPp=d'm0m$M}߯U9Ex#+O{bOVOO6P x4nI{Fxڕ˱ НIs"p4M.j*j(}"&;$I {cZ`1P0ѫ,XZ\y;,1*xM皳pcy=_2ܡD \P#xʩV;T@?}+d>sgm\CDGxڕM @=0Hqƍ0 mRo \~{uf[C:BC$;V 9x񠙧 !舘Ҟ^Rp[>iY˪A2 ZPf87Sə_ñ5SF#lRO9egN5 C-?lo-Hxڕ=N0@ާ 9'B g@d&kvܞߓ^̀FPM(H1`L7>OwvںG 3.Də\Ut[>^KvY7ڗtR8Zwzm \i@dX;,] GCCR{xڕ1n0 w$˒ Ș}ESPle>."6c]H )dK$'e?H E N<-uunX(q@p(< smvMU~cZh[?}Ùd} dmM-O}-pQ:c=Txj~6KtxڕAn @=} 2`)ƇÐ"o__כl,$OΦhђ7xE"ÌM9cL,<٫E7 J0w -*'ʻ~qNc7pѨ,˿yu$U[eJ=^JxڕM 0@}N1{A&M".ݸ-Fj*x{.|"@u%H9E8ޥY=h9Y2qdцI.]&E[ &pe:wZy+Ga&;4rnMU*_%?U_-G xڍ˱n ᝧRs:tҥK6J&<@_כ ֠sBS4q{(ӹCcv61J,xڍ=n0 @]֡@APd^B d~kUlp!q}Qxf .hr}ݙ(Dꏫ, 4 Bɣv";H(hVZ<ܾ HIFxGSűՕOm(>,̐Z %Jy9Q? Nxڍ1!@ўSLob]HC3Fl%7zHE[=:&L4H&I!)n#33<CIŭ/m \kc^#^m>N{cN[}˵wZՅjȵ P-i+Z y{K5xڍ=0{HOli(6 Idbo qf UYAeCWNSC!HJkl4Ҕ5! g 'btpAĭߗ&//iޏ)y~iTlh𬭗;b"q}c,4΅w(uP_e{@~-+Hxڍ10 "m$an@($rӝtS#dىsdRެgȔi#~JQ9q]jOUa.E_v[.MiZfE\k ?Ԛ ͱqvwvjLtqoJotRyԃE4'!cByJP[cYh 3qPR]m'RqF0׭\hoZf:jA/}w۽|xڍAj0E: AǞ!(b˄>}#ADhDQy;?Yv.{P8>>.0tf9<.tϵ^`PDORI)h5SڿPÆjkLr m3(;.J}PHEoVxڕMj0 @O} -C2o{.{:E$P3Ѻ$n-jm "SN'Za50c Jllncmq>Z^|&﬏єq]U g.p=/m|C?ۀ+ NI\xڕ[j0ul)lJk=V`GA^ FH-ٱ8a %y&”ϕ74`4m%[]ʜ"VL:u~m]R峍/nF81:DSќcou{!z;i+=yLzxڕK н}?RZ Ǩ#^g?0 {&.5\CX@ag}LvRX!rNY2G0ۺv[S;h3C.hUD羽@{a& ܳFwxڕK 0}N1{AEd8|B 1HK#Z08S]|NyMb st[ݔˏuS D unhop*rٵeh1'-֔|6U;k2 ]>)[7FxڕKj0@ѹV6u>O?(%mYz D{oiWވ@d*sẌ:9'BRs8Z-4::S^6J]^գDda6xZz>ʾ/1G^AH[m] o^ʏuHl86Uw>Ni;l >E xF"/QoxڕQ O1 P=Hvx+,%%PF$\BU^\*yӐBξJĜCNv6a8BCčԽx㸴wzuo|-f —uyFi DOy΁Gس`Uܝxڕ;n0{b@R#HF4$*o]!+fo0EM'O&h0X6#9LqTq"ydpai:b#!$xm0o{+p+kGhE= ભ֊N2R7\^@J='~( gd\?/RNxڕn1E{6 JE^Ϣ|As3DmQbFVeRsBre]p]^Ysٳv]Ys@q&=4oR+೎Ds*Ϻ[ FiQ^ÇRwQB +UJn-ҟ*~0Pxڍ=n@@~O1eP$4޿%((" 5xfF˺^ZT!BQ&-=D}Rp sѹ:u 6H0INBj1^We i< 7%v)1.'ZDӿ\ ,p>PJ˺fؘ?qH%xڍ˽J1@~bJEI6?doM$&o">;#2Q ռpak1(8}Pa<]dVog4~ ^Sw~ީpmm(mJ j)2.f hB:FkHĞk^;Pr_R)r9:R6cUxڕAN1 @}N=$N2bp;ELW`"OaYS8yC^]D֋٨KSyatEDI<'Jqn[ೕ"wx-Ӆ*^[?`KdZ>!͇^Kc* k/]@p+z룰d:U;PxڕK 0}N1{A&&)(+ݺgBmSҩ NeR v)#ZJ0dskBG$IwNPdT7Ūs%p:<^wnD.Nү AkA'T"ewyC7pmODpxڕMj0@N1@ؒ @^a`my=Bwo3Cb3-^rrR G ΣѴ,Ѽ HY01ijlj'| )b,еux+Wݶp+Z{3\֔U Xzi:? (q^KhxڕKj0нN1BƲ>PB]0g@,r >x1@ѱ| vA1ld,G=qrj[A`GL3 %opvξKGK>|=]]n~ QkQzo-$scLʚxڕ0{b 2"IާɄ)g]ާ#yyc%Qhno@j{]+T-m/LxڕAj0@ѽN12$˂R<3%2ʸ~r.u؇G̅ ǥ^k1{PbF"Y)Iqw'giy M>tnۨO&[[ _T~2w[b ~WU74Wfh4*wYk< GxڕI 09 k "JAp 2N$76xjضnGTq%6j\ÕUmjee<G娝p{Dݐ\m=iZ ]CK8FJUÊ$"!3tzV ܬ6.oJZ,xڕM!@='1ƥWsb#i'~ }y VeERTQEAevh,'e ;?xYe4hi!'<#!y8u*FnnpmN5_+>c6JR 2:oww!\֭2" OxڕA 0}N1{At& J\;0if4hGű툜}@m];4=YŋSOy*0 & 1c=ZOJtXVZh)<)9%&vM!.i1VPc]Roy/gȋ $M8IIxڍN0|H'SB~݋E|>9N=ig43:("g4{d- 29N,:R1Jj>Pga8 ci>7GZۊ\ziRiaI16OTApuD0\:%'poo/MWxڍ;j1@^x}*rtfHd=1cL!;OΫй X찫-hr۔.D g6xi>A#6q@Ti."'?II>1l-s?6E}Mxڍ˱N0_q;Ru>CT}n,%Pvjg[~ !.JH6i]ت)NbTTxm.8 qA?2'\WPJ/Rٙu.C.Z<cdN%:&]׷ou1ϯXB3OhM9MU#?| ||`W.SBeehsthUǮ/ĜLvxڍ˿j0]Oq{N:]αId2BUl RB(VFlZ™g۾)<\*e'侐#"ntٕl1]fo:,j;|tKoX=hU?c>xz ${`ӘϠ U=ERcLxڍ;n1ާ)7XBt)B~x9bo E#cE!͙I|dQ=2 G)e$.| CO.N6kkdS_n^΀i#F mV%4> ]Յ?WgF%xڕA 0@}N1{A&I;6 "cNlmB:^M"ch}OE0 4p'Tn)tɻ_c'GI؆G>~\w-ue) 瘮O.`]=9t&uͪh {Y ך6~jƖITxڍj0 ~ !@)=!#o&vp}kob曑"S䜲}Bo@'&tZuJ f4Zkevt$S8L|j9x>-+qI>k $vm˩b WL '(../`NPk ǜRfOÙeÖxBxS0\?`ng0/6=}/ڽpL%=SݷȞ2iTe (XC2߱#cO)RVRZgUGO^p?i}t)O|`xMT=X[B@]AP @:- Zețuͩ~6~` -,ʕNxڕKj0нN1@QƚȂP tCbE}s3qJ…Q%dLEdBalᇛ&w456$YM"{}8|1ozַpb) .c kr x`qn];TW7VJxڕM 0@}N1{_q3HNl4ҦW R61Ic#錒W1{ Vd TLcvJUk4+Ɛ#>.pnu:aV܎@R1JD^ k^ ʜZ 0lHxڕ1n {^}N/`K(e{Crb 2>tSE@SʁA&Q[lul$vwr.&G'k4-c<%J}Q^~IDFT4P{+aVr=W7 %mG # ^U*xڕ˱n Fᝧ{TEب`"#훱kޘI: bZ`LTƙA+iEg$4Or;%p6Z l_kY.WF%.9J)[ߣcwqFOO^)5ydz|FzlOWxڕ˻n1@_1%(R!&%jla^GAC=w4"tT8&Tm^f9qR676ZD&y- .I9r9 6εr!8Rv?]qM˭v!57,1#;v{}Ӝpf /);'A͐;ѥ~dekWpxڕn!D{bD,+-`wmdsX-s שfLD`xFK'匒k б_i`P[b ;w(~,~҉`Wr;lp k,A hRI)Lӿ2/1}+|Z^~.Q/:M>DxAh)1ߣNҠVa g}ݏaNɞxڕ;N0{bKZ;vHO DY/QbGӓ+PL53m'?^標eP"Q [3ّ*7 Ne&g2 ó4^FAu 9}\׺o F#g=N QLѿGE"۲R[VH KhPRxڕ;N0ާ[{-!DICo,23ߓI }m9]pjՂ+zZIwt ^W_bSpѥzT2&|Lm{;y{cC'mV]8[_iӃ,'.X+  ̽tWjxڕn {bD")RIְܡ3pR>)L3hz#/R%dT}R٨ΕVpvFF#FNFMf(l 3Z|g͙~-_?.F~skQ%O2No$e<(c;5 qS-0K`LmBN~'H[Yxڕ͊1y>* Οiţ%ttL$P}U1k磣dyC26zI:GhRΔ![m0)ȽUkʩ\V*~Sxڕ1N0E{bz$3HQpDku"q{RpW'?:@29>I١@5?( fׂX7ߩ6A]DQњhl(ɐkH8zE)azWm .Q*^m^R5ݎď\׶ #ҰAON9CyA2e3[y]KD}g EwxڕMj0:,[ E?Yk79Y#۴^&smpY>k)c7]Ӳڦ{h0ojƝ\DߢX !@mԿnfjdX3(~3Q xڕAj0E:, eF#6]$*t6&Ki2&rq J2DN$n>od0b7arcFD脼U3_>j)r^䣼Զi8*$$MADP_\CMnavHnwot>;\VJ+#5!i,a0>ĈIin=hNbʄ1N4[JWW粼^V|^^@*-4IxN s^W,cߐ4G?BdmJjsdN1?^Zxڕj1 [ ŏ!K!hƴ^ߧ_03Xd2 1H3%AN\:bfo=Og%b#6.é| |Zr\xe/p~g!5YƐUogeã,EӳyM3xڕAJ1yE]I'I"{Ӌo2Ilp#̂Wx-Fg=g+&AS4ȈXLoY%Dq>Eg0% r0Vc\mk]5J=@4!*u w^!>GWs4xG?x8o{P!xڕAj0z[ EeiB譽 f% B>0ӛ,X|n@-Ygdm^d+7:3%LKp!^f7{l $⽟j|c6罼׶XG3"xVkܻ<|`6-7UIzyUxMӔxڕAj0z[E+ɍ^v: =fId%K>,&HKJ>%[I\(01y.JJrf]j;|aМV?6}GiJO1ܪ@ms//lLy\RۻRxڕA @=v(LbK7n@CahK1Hx{{ZA2c#wmdGRk(6h#ޮZA+$%1%Bm0jБ <=_6.n ιWP J NRCεߣxr;Cɹa.KNlHpxڕMj0F:-")@)ݵ<#[$,z&~YR Gӈ9$C8 _'m N:6yge/x/UNaRbw~Y?y{IVm#F?6^e}y{PxڕAj0E:,[ZhFe(f35rD8r޽)}oU|M.n`ck}~d垝 "U "&JA.DrBэ$JFvZ*|OR~k9McR=Xr ьw3{*\KZiV~Y{mGN'xڕAj0z e-2[{JZ9"9߷~a7U ٓP] Ey!4:8kŲÒ| #):0Ddd3_>j)|\ż7,!3ZD~ܻ;4 (~Jww?z7ݞWLxڕMJ1F9E-A*T~@ĝn

otU ,%[i X$dy@L%/yRHȸs."qYO [k/~YޞuRJO|3yWk[.׽݃Ik Mٟxڕ90@ާ 8% CD#lj~_D2>PoE$ }@P*R4&$.%qΑ5Pj^czKK~-q \(xg " 9FC\vzD-a/HxڕAj0E:, e,ɖtnr3ƎhY6q yUf5~Њ0'/F;=0:A*xIN^)7R:o0&:}l]KKe)9||{L[(uNjZw" s<y­<ƸeeZַp̐xTxڕJ1D>*tNAě^gҙ n&K6;x:jtUNًK@äPκt(cDDYn&GKǩu,_ Vzz[ϲW0#:DdC]4v[)_AeTuȔYNZxڕJ0@Y*̤I N7~C436%M/*~9pZγN"C<݂"q,:G2`U{]Jt(9ۺәK]_CO~"LɿC Ǭp];+7g޶9KY&ã~xPTxڕAJ1yEA:dH@do7,=IlXlf߫E"#&oKt R)rIg5^Or@PvEv5H(y]C`ˆyE୷&_·탯,y 6ĈhYX ހǶ.,u< Z^4E>m~H nr3`ղMen^ǚNEeʼãZN"xڕA =??1@ib_ tfDi &^kUz&8X)e$ #U.hEv!6C'w&aw­ݗ .7=q漕R 7>F jh5wT7u<$aU?6l'̳%Kݚxڕ˽N0=Oq $:b``}nƾq*}AИЊgDw'3hZS%\*g"O>Y-%F>~0~}\O|st{~^l2J; %A0AJ s{˙Wjσ{YPX.xڕ=j1@^>fw%Iej[ؒJkc ~76fEpXmJ#iBGΐ]Ikk [H dׅަhH}\|c8Rr5|rihP#-32o3+[|}=׳q N"[~BmMZ!W;Z79^JCǙ2FR xڕAj0z a-G J鱗 "YeI6- zaWf]C^St)ycš4vVDPy G#I!3ZMIG'6N%OFϥey0| y~aK˞O`g4xF5~ʥw.`h%3Ȳr{*sٷ/ek d8ϣ{uo˟^ZOxڕ; 1>^c"ڈ'N&koW/"@z0Std86ebkGZuH=[ 6%sԔ}I.ƆdUzN4u?S5e܁&MVH.Gux B Exڕ;n!{Nz,).M<"-rX ܎fffȤ(f#tRzLH fI5DmXf2%]P+9Ǽ?k?-^>Ai#]pZJf5%{e(-Qqz;!mP}xڕ˱ Н\(&vu/QB^Z}9r"I6hOlcmp^cAtd\-q@#4"kӫqmRaa9.55x~x@NPžY>oQG/NMxڥM 0@}N1KE5 i24)izW ͈.F((K^ ֏lJ#)%M0kr[pΏOuj:kS%H/R 暛A8p9 uYRo|`{/y.}MxڥAj0^DŽBѮ%GP |ìU- oK^0E,'QOq.b8dHS//MQr ;B2Kp[z=={]צpMoN%˟ur$g! aZڶUUa eP9\e6OgjQxڕAn EbҁRTuE7=ĐTc,r zo4޲Ն#u~S9H@#QuY\v(A::7AQ|/Zkkc ߃$>FiBVÃR Q=g:71 mK_p֣8a mٯTxڥAj0 y-nI:Rw^ac][9cda"=r S̀Xf's Džf H4:mmk/}U*[3x)y^n'xq޹AZLmq\j[J_d[JèX;E4YxڥMj0@NC@) ^Țl`Orr|;.D1c(A[D2Λڄ9DH:86#h]χ^\Ƨ?ۺS`J]Y?y }r 2/<ȡY; s8MUxڥMj!@ὧeBHP˟Bd=,imlg پ`$*8hVcP6ꨒUXq&$DqYs]B!K 9&|+wmOxGoWJ"9?hJm [ uvze(}lPpxڥAj0~ E #vk-y~za #ŲI!))䣟[\Od)ـHh2AH"8OGsv[ʶ5+=;I*bqXcj^T?#g[Erh?w-zD1<GU6ZdxڥJ!@~]GЫ(<"(iQv۞s83CR&jO]7A*jۏZqVsMKvIH$NSZicq wEϴ%v =ZeAZ)yNC2 z;33s%}A hDכ[xڥJ0E(4٤ L&Sh[?rj&k)S bsy)YB1l ޓǛ˓H=RA٦DчhХu\zѶ/_e]+N|^.[u870ZDí֢*iSPYKA}%H2dX(8YݓxڥMj0@N1˄@2=F18Vj}&g->x@Cr"zۣs}XGr'2OZeQ ?8Zرԇ\Jb;)uj+ܦnڞsSwȁzZ"o.O/xTU0@2^mMIOg{NxڥQ1 ",,ͤN,.Ȥ)SЩ*x3fBIRh"1g!s*J9[?6`xڥAjC!нeC*(8K4X[z3toMU3!$qsNsK沕PA]ڎc,8]Fzy 6KlDȸZ\[| GQʥ;Nxڕ˱n НC(СK>F5a<_"I@"DWi<18QB:' (6=:Bц'Y&Skȿ?9V֯e 5\Z_@h'jDeCގՏ]Zcmk܎)JHwLxڍ˱j0]_q{NJ!n$vQ}3Wxǖ=14nNH# hbtQ@>!㨛&q)e/z9uz^y&l5iQ kFokǶؿ7Hrʳ$o)Q_-DLxڥKj0:E/ec>-," 9~fA3޵NTo~Y1xڥAj нeK̨1>Pz3$K[<" WJ R\`Zt),HW6ԥ*;!p;m5 eIS8)>dyhZ<ZDNUa~jOY Cd][ *SxڥAj0zS A^Bh) lHJޟ aUd&fEɳq$4e75i $8$qӜ3Yc8~TYz9uJ/I6\/G9zk}_{8wJYjiMyNxڥ[j0E!_ 2RZ X3GJIx =p.TORB.-Y*ژe FTbnKW`$?6$I49*S %Cw]˾-uۆ{=gm,o/}t9uK C4u\a:}}v}NNp\PgpPxڥAj0~[ e%#JiI)򉕴Md)(J_ 09hL{DeNSlQQÕ4rAiv>PD1$z5މ4/qi"\;|5"`,n$ohXm]y )|^k!x ֲq&8dmYWxڥM0}N1K̤c~@ć=Ʉۦ nwU`Fp%{ϥ>ili׵R$I2KGJr *E}l;}z i[|&鰶U@Zt1-,Sa~K: yn^6 bJxڥAj0@ѽO1ˆBɲP c$j#i=C.'bL +ݜ[ !Y7tplLyט2e_#"FxS2wp+$OtoU|Yb-QT?龷!0ΐJ 8X7O7WxڥIj1@ѽNQ˄@(M0 ^ i,5j%>d-CNnZ3zZ_ &gRZ͎$L\LRyd(%#611|ZH_iƯ A%P!ԯ2'?cwRZ*P̻u1 -QxڥA 0@}N1KE$4)BL&6&Fⵍao?.`1"ke:Nh]¡߸40%58כH$5 ёQ3d٦uub<' /]gPVRP]c1!̕@% JxڥAj0@ѽN1˄B)RdC( ^#F3X`K}4g"" Z| ^l@A'R;BruAsr*Lr28*gfO>~l='2ϭÍ͚@y lat۲?sEY,[Xv, B)4![ b7^ݾy 3h7Xpg2*pדnpj` )QS?EpG2Mg̽\+X[,IKʉ_?#~o(;[8aRcN=lǓpʹ{ rTJ- (0]+Ի Lrsӵv:pQxڥKj!- CH=lߓzQ'0O EA a)5Is`^-Em2Zs~)a!pDK5ۨ-g{>2f;6m%|V2z7T"ۭ4734Pf8{!aEWܛxڕ[ 0@biADG[hNu%ynD!}T[J'Yz v:Z,̀dL-Ϧ`9hzπ"l +ץ'xX.6NҮHtsRI)R30g k_?Z]mSYaK_6M=xڕMJ@9E-Q/DxNW5i =[}=m|2Eȫ<42"vظ*L#`Ȏ1?KvΫ"M|n\T᫜N%7`<<g̐|. D+ \6AB3KGYV;'RrKGMZc\xڕA 0y&iҀ"fK ֔='xa%Lc#u;q!R8؀’mJM ;qsOcfQZ0T<6s~…ۦ|Kd̪hϧwPe=HֶñvǨJ0xڕAj0 @ѽO}ز{ -FIh2e]P{HHJM)S$-r/SbB&IyàňSE3II^ VџsDʎ<}V^ֵ|H(_xڕ1N0E{bz$4;[B+:h86NV#".@+~+"@qt eO}aGuh u"k]txlZ!.:-G][K n97*1 wE@q JPoSLʾHU?d5]xڕM =hbx>lc oWp^,9 E){( KKk#l됁YWh xѽ[ݷex}κi_[}^':e6'w4I)Е>Fm=20_0Hڗxڕn0 w} J"[#hr(/tzS?ϖzFR C,t"G1h~i`sa$W$rfNQX6ek] _ۺuR}kyXxCh4K|jV^ taCJa*Zѧ(JxڕQj @b>[1Q(PQF0|]Bp\`U=1{.GZ M nfcB6d,Lؙ<:MD}1Cu0|Zk%_ ڜs^Vj<;ZTZijPt8{+?ੴxNod>&ey~VS4xڕ[j0 @B"+<2[N 7袥eGυ'tͮE&2I:P*̬$.V!ZuɊk|o?ΐWW4#21/n[OU!# J.xڕKj0 }N}a(PnNPJIdIQSznVE೬k5xe}?/р8J= !v\ɿcwy|=wRc/_|U HMxڕMj0 @O}acC)BwsR#[ĐQC x'VԬ=)͛M5XOVy]f8i #NѰ6R[!x6*_hcֵ _B7oCt>/hmk"ߣGɖk'i}?A:<6>E7p[멞1MxڕMJ1@}PLdV\$]Н j+f `µTR7GQחxڕ1n @ўSLmc(e96hZ!RbCֳV.8i'K$2 8gbFϖoE:x2|;g=z۱};\k&N^R_YƠ+A.;AZ<`TxTCڈ'2:l.~jRxڍAN }O1{ PZfc\1  m#&M8yg0XmXP i >řrt&gd񳎼XbЍt (GG_} >/Z,`vnOW8 OFNxڥMJ1F}Z*N DeIL'CO)v \=ى [&L&9"/ڻ9Pl}&3'v5rXct:Rњ(a!;P;wT)}:vxYzq] ε!̅; RSVE?\A FH@?Q;pmI:iYxڥ[J0E"n96&%9-}l߁nDYD((=jgNHN=4* V-E$3N5^zzM0C8x ^֖:}%xM9Wt s+RiBýPB n[b47nG'Nt0Bz-OpqN gxO'Oi=}Κ7f xڥMj0 93 q21? =i[V{OtgT 6tXs"^c|L^;Mˆ1(;(?6]s堺5m6S1"i >4%'y ĢEZΉ Ѡ~ dN՛xڥKj0:[6},قRR Fxz~dd9~.z.g7fJYANs'ybƥh:83:Bבֿ98TMZSmZz]gjWS.{slox/4jV1J},BT"_h'c%jGgx?~1.u&%"5fG|B2o\ \;bBcso#ηsOgxڥj E~ a$*R(q$t.]ùW3v@PB[Nё:@[mwf(s"^}1~ |vwSKURhc4AT[" NL J)"/>\; xڥ; 1>^X$ "^!LH H`l_x"BNyԡ$,ʭl*)8n4f3½A ~zp^꼀&(pZJi;3$&=  @&x340031QK,L/Je넋Xxi"+։/Ұ4r  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1YVnWYŮ!jҊj~l\bLAd&1,bN5tw O9]r?̤Ĕm\?96rv&yKpE`{ 'dL nM~ WIjq^fn:ޱoz;XtЉȩUSZS g>[ZN!6M+-Ne.6SoBĘ댷)1g#)ehHrY`Q?ǓWpq"x h?gSʻ`ʻx= <и]hpR"9xJsgώP)KtYJo+-`Xva׺e)v&՚A0xs(,./HUp/QINs(-IK+NUMTpHIK,/JdxڝX{o[) kst9ڀ9%Q#(hV tH]K҆ٙٙ ")-a14솷F u O jq G/Ԗ=2<,?/(V& ٳ+`pC ;$U*VvW_+@RZGŌ#1NnWk) ph@+ƐhX<ـDabGpkXϧI)!PSZ$ik} UZdnfHLյxIA"4~LYr0(=sS<[Z}4VӸʋZ wXMr8ܥFDđ,iH v+J5S <ue=̊R!K(Xd^KTUU9'$Qχ^9*;RPYw6T"Pn mk'i~(9=gsXqp  GJ92OVsR3P1{l7鳖 +0=ŦY2xg[{x&'q7-a $J%  P J t-b2O-UtD[mG'42Lumd,h0a$,;pyёo|ʏSs@s >ˏ?d_ e?/ְL6o&lWr$T[}T~֔ŀmY^֊/>.kG&_lTϝ^aİSIzc6~`uqI,6b5㧁 @Lw { waf%N=yT9Z;7̸cgӤ 'GDܠ~3)h0٨Yg @yq7P3W@o8e8%T&`'3Օ^VF[$~-+]V`7l`&`"<9 .E 4܃TV[>0Dg?{bV tO xڝ\ksȕ.}TEkc3TQe3%[@)".~Ϲhg6S1t߾s?v4ޘFQy|¼75~]rumN/_#s]Yk~I+k˦X5q8$|'-Ya5ޮ:[kse50w?}ߙ01g[JP9&k4ui Ǥ,3WWټsl̺Ĕ+Se-lYfc bOYdemi&n9ͅ?"גӒ7.`!I)MeUT.rSʁKLIrcgidpwI`u8y`Yj.όy,H 9(-yOJum nmB|D*UӀ^~d?x׼F;PXiMH 8Rtb3^u'фD Lz&[qi٠ gY왋4ՂK/!Jdaju>ѧ|+jO9tπƅRE S7PX[Q.K2D:vQ刃s"F,99]̘gJDfB,o+pjJJVr@}<7]`.OkY|a:ŁyguWV&G%sr@<72[Q}x`M7/7.ڤ2b!٧xʼA;2,U9t+4#C]=W+oEꅧIyXghpke@P UUa_YІ1-#/imgsL’F>ס3v$ L/ L%<\`# 0A1O,lJG4H^1(WDnCngzӢNb 1^!>77i,ئǠ }. Eb^rK$+|=H1`"FBiU.!1҅vr朢mSKQu|7MbD5"7B'/k9[>fwAl)/+=1WPFgLo'9[6$ʔsq$I g`ͅXġu 0dڝ{ @̢["Br8,7p#'_ߘVɪhk9N{ei5;W ~O_捋a ck 4a0>xy߄fl\+- J:Kb\!0߬$% qjçsg PK'|G0dF8:(%86O%{j`Wcj;Ƚ^1lMwR|&[axE1א,dE=Uu\a-Qφ7 %UW<uKٗ=(ttŠkgU86YNBz |-=ԉh+M -I=X}J%bFi- R)׭|XD\U: GxM !Vx֒7t[Iv_mo(ie(r2B6"y\0ȴKȥOyʱ}%Q~9S\ ++$.+UޥwS9y_DzMi&)GO=3H?c*aE%T!ES! ;~iwB{# 5 g)-h|.D+V-*(K22HO]266)|jG셷j&2B]1GpÓ= 4t9,wٴ6MU>x<T^ . 0*@mϸX_>ǣ/i}2xzB״++Q*f.+G&DYBG1gՁ QzJdmՎPE`-}1m4mY9RiuLysG.تs*ZSZ)ش/ v 1ZkM_wOdw2tcؤauI qΕ,`)߮"J+,*j;; eL&n֑o|\k-rh$ZdZ1C ß:@%2kI ]k ZzP"QE_,J#}Ra+%(ŶN,_>TRFQ0 >1dcy5_"hU+VŒc2@U[[Ȫn%L,G솮8t].ߪձYQDg]\R0$:Ӣ9~B|m{|bbp60kѶ=xWjP;:wÄ7 IY%u6j-KۺyytĖNbR//Zb?Vktԗt{2Gzc1td{s˹vQlc=>& +?3`%蘈qu]nqE5{Nh)C`uUSI7mSƴ^kip'}K) /(}C)rxq])0Ѷ/?I*yQT ( /kͶm˲P,}2V*sVƭEg%j-y"unGBu2L8۳XMeres>aҨeǿ~?2NyC%-|nJUZq.C#DtxY8tԪu~|}y š6Q:O{7S H:Fh. L-R +/al80s(e(/\Jsyu }Τu"@޿p+ biM775v};hw۬Pdr[ތ [K 봑lNOj(㏂b6RqC-7f3U7Rc$W{ POM@{B)*p28a@+G>b?*02*ѣ:$G];C;Ƃٮ`)05=Nͱ:ya4 '27@u{׳=L& b퇇wGmh m~\"-1v_` K _vp\Lsn9FGy}Wޕ]ܔmK?:ذaIIn9ޙdx;{;7tdfF~rq2l0{e'6ߛFd֝yvfG ]<=^܌+9~f~&w\LgC~05_',)㧙tws5Ȩ]>4l<&d٧YK<7}4^ h, u?Mqk?o/od +' t5ݰ: /7clɱ[pP)|f8M<3a͍]LG/K!cғ WUƒPnox8MÏ623{u)}<53:dc}Rt9#.@X!dEt5<8V dk?I>0P=F+"fqhC/2 u6޷n=^Mld64B1}1ۓ-%4|5VbU'᳹o&:B.) $(l :`򓗞YQ\˘GI` ӱɝ_釕G#RCE:oou|sT`yEl` =+ꇫd Z$k\~46"fGg%euۻ:J6Km8eP:dqE!x4R~ /l47Xl>x;߰vwu2åd 2Ң̶HpdOhA.62I~o|"Vc{J#XDT'RE_~`_t_JC=yh/6෻ӓQcwl׃8D&7]+LV9OH > [s| fqtVLA!ho_>ws \b?L#JOI^.z%Q^YeX)ސΘj߉ۛ翿ϋ)Zb aM%KeQ,p& ߗZkSCK%)YYyMi"ӏxO9WT `gA`ϢiЦo_/LË c ?Vx0*o3}E 6>랃=|2v71!:mI ^å͒^ݳ4V|/Oǎ5I?iOGIN/`nM%.@7kllрav޾/\5u?L&bS>; YdVgFqWckivyuoN[*d-y5?)CaCF޵x,wrWXoܛڍt8#@,;a9woAXۼ1NNj̧tVs$ -`ieZ\}0p 4u_m'7l M*vE)[U5ͼ'm& r;_4VwJI⡆N%̈K@p{H=UTxxڥUnFW̡"]iQ9Mpc%9$"wݥd},%YqEup͛7O \hIw+jLa"A/ni}޹:pMRxY9ok{+7cjԷcTL\C3N؊7 )pw=y7L!"NnoM<*_߯ޢx:WcD=2FZ/ZfXt8/TEj1DT nWkd7G&sj +W? j͏RwZpj樕vn":nPhl 9\%Uwikmo S]ލ&1 OumL;6_Bu }_rҹGJ].݆/Dg!ÄeΌ/Sx:\;ZK߀9(sLW'f4㒅&4>K';CI?ϋXm'Ө[`8]RFd2 &<>>J%*c% 4q H@{iMdD>xۇL[דe|w8NMd?<=*?Ӿ5x;%xXpV>=ҢT]Y2 L$xmQj0+-J9 )Zzim'_&!>fgf7j& eV.WL6Ə`@Bg=r8hĠ Йq, ]EKT+yT8콁pb;"yJ*m|\,*CЎ)8aڥmUw\s> Ct\]RnlnF(_{;)u"\`E 4N*x nV(͑SfAga;CIQ;/8A'jp2Y6һ[4PY{'u<ݩ^xLvr?+6//)Ix;Yе 5$5E!-H@xP6ԒԢ7 !x}P[K0~ZZ7Z2 螬s=]mRlLݴu@Sw;4o } ו|##h,q61ڂ4x7ח˟ C, xum8Jo *ׂ\(=FZwL5JLZcC*9(FyZV$VàC=a%cR<Lyh ×3oe{QY_ QDSűJ+SȌ&Bcjt֓T#C'|Z߷@xuSn0}+F*[a)$>v(j"L ctԏKK}9s3gn`` -j98#!8oX;J"p+Jk݀Xaf Y`qK:QSHB.k=`fK%cP)X'KƂ x7@QІY;=̆K֢./\8ϭ -A!XLGY?1F!{Rv1,5|̢zA?76zU[G6FlxMj1'a S/  =)x]fM7=y$}_ ?7gڄEd?4vވٛ(1*_EYEX~62&@#?v}l+ Y1F%J)=PqZ掊AI%>xNZ; #V7 ˺WO7zvykɫbײ*c ejkfxkhpyuf8 x340031QHIM*M/M+KfXSr]YIE ѫ.d. !lzwTanb^fZjq^n6É3~o-5tjPeeEI9 kmy2eV]zEX@wz< x=w6@r(YJlNk'vwg;~zHJ|H?73A$$lmA`f0/ ;[lqy̜2ۓ+=d7p8yH,g.{6Ac'A9{9Y䓾yzx>Љܠtcp,Xԙ3O=e;M ӧ= )n? h+"KY^:XӇ_߳_K]0`E[1'ÕɃ8) >gXN,Np\}`WC-WT,,Nl""tf^5;<~?<<Y zw̓0@WD_^";ywgŻ>LlyN/)6X hJB}N}Ź2X&aB,w`ܟ(mEu6w45,wzkxO<ԛ4b)7杦I S/:Ғz;ظ:'O/H H=d^A'ܷ>s9CEzyFVo[> ~Z~>ٿ|JM4B%qDMpV0q衂D{vr~5@T⪱-LRvL8,_W@gahQl5Q 42Z׬!z9KrI} {Q_􁾆VLrQڞ8YvY6OӸHl>"?.|K?ϞDCT!#H2y l{*X bNl% (`ư\,i)˕&&76ثFNSîݗzGbN{w}L|vts 䪋ߴԽd$L8}Pwf13 Erae-kRx>kMa<+~jžQ7磐^rmUm[Γp=dm@@+Ҕ!N)qNS؀U(1`kwaQD&sH ;HG3Ա^^A8¢.h[8+|;IA B5p9чO QmsDٮ7ČNji}(F|܎rI;!|߯%EN'gl'kK$v GRiEMxh*?&a ' Lr ^<6 Kro*|;(|#  394 nV?OTgDya XI0WRU}ug/a} I+%P.vBg.5* fkԎke\\X K\2, uXUE.]ꕴh(FO݊V- vopYtvB\vNĽOs4F|$#jCYBaH@fB=DJXSb׀vM%œTooǦ-nEa^\(*1"U}ęxca`DWE:z xQeST,g򐵾I2("-M-Udg:†V-s$7$c^`"D`R``iW~/HK(5Ó$e='*&8-DK FFdK %2ҟ BY\ `eyE'7J2zxpTQ_>w@[fUD ٲJwJÊl~re@٧8rh8f7 |<"Ć%IrHkbBԌ׎tug/KD >J\"3`]z7OO~ }[0.LJ&7Gmrzf}NM- w dN58 e"AmMq1\mn J A|E5UJC@!H ²?\[283ⷣr-D @N)Ǭrô G'G{*.)lWbb]+nk"OB?9^-)/DٮTi QjAYjcvB$Y٧_ϯ/?1Iԅ_hO޴ n+q9'oo!oQ~F}$Er%K-&*@qrxjD)5skuB[QgM/y TU3.21iu=%(j=~SeX]WYp*t݆zd %x"|vQKQ]٭*{)d8oE7_UFvݤc5F7PHENH]/#bUGցpcv# 2fY֨͊$SYJeR 4\jg!~yUn!U% L&xsɖiMyzp)#UV(m ۟*]+2T]i6b'CE"܌ zl6yDvn]m*[0] l]f*Le͌l.n5)/αe(*+fǕ dcSvEuѝnub+mTjEո.(Lԟp9ij"[H:q+I7Mn4*6 $?#( ֐H*^r :?ꮃ1LO{]Ellan dPe"p:cc3|;m,0ԏ\'uL #ī>-9 \"\ހCì)kv+ounB=y\ y1^W)CW+w6 * 8 vjےrco tw A_P.<ɡu/1J\9ߛ1(rRzW%A &_Y lQ.Ŭ6h1HPJ}5:qR\:juTf_@z&dTF#zDjRh.=4`WIM*Jœj4or 9Hj^ UN)8HKc ܞ.j^x5-ȼB@jI?r,+`ӄM ^Cm*U@ȸZQ M2F~n%j\ 86)\mĝ8 g%Q*<+A== 8 ]P0"ˮh˾Ol\.w1(ɋvM7#@LuoGym ̫ߎ/NߝEKC;0U^]0r?`/Ņ{ >WܡhblW]("*#-n-c=D]D:פHGw:Ӣ/B7!L֣sxW`H ZvIx޸"?S_7zË|N])M:ާ tٟ* wMlVjv {\:u]BK|$bm#54_BmedV@iM` %* |Wļ΃zeM^ⓘ%P'iY÷ie5IʽhIVa[ZX>X%A.KJ}HbnFAhsS5E*t2J"Ll 4LG`HJ3"/LB {G;{`Z=`f-sȩ1Ɇ]CEf[Rd!G.r>8h4r^שCrJ' zDup_ۥa{iAF;Cnp}\IqOmo_-oHgWA7uI9>;X8]\ZK"Lcak}3] k5OH2fwH@62&V E X-}kZl7{j*Yz,ӆCz }O =Uigb0 g7}ʭ_si5I6{g;]6'}tFs(!Z#7噋3?$D *aVQ&;@QL .  Uox^l1+)Lg&JCӡ"Olޥ ɞS5x{q< :wpo߬hwTx% !#x; IʓYY`G *X'+hNue2fDN濘'WXnMJx{]\+x9} ieԐۺ.ީRu\oԝm:eEUU锞WmGT2:Ms*ӍVYR5q87XUMi2 Zi5ϫ)`TKD_VF6`sumt!Ӵ 3wֹ2)2^TѺZ;SBΨj D֍**LHjYSޚ|Cb+]Bh#3.^;}I_4 o1YʭM+MKl H!xX*bh˥"(:ºnVԅTxA]U ik FPnQ#>"Hۺ꾪oi&mz*⽅Yl)]T!Ve9 "ZbPm17T2+x04ReQ]3˔zvJW6ə$_S(OO 60/Lǰx[U7DbQ0`TG E+c YrUrL b0,-n] R!'ƥUb=U6^;2 NaAy|ȟ dWi<7u!}.Dch!*Hov'Πܖސ7be23!*XӒ!BP(2*lژÐe'k|0Cާߎ'Ôgel֜)}%l""6TZn':xKq3{u0kG/CeP5~ڮQձjN}B6}c[7+@D0\HuiΖ eV)L/EތSszBs@j_lF]DV=t{no:ua)Dͼ'O?^ 1AE65<ms(KNXOaS9-G9SQk@:$LAcw~[b,#F{0iKiG]5}qg*x,.E~тE~5eN jo <y"'qbAWxXk}ʑGt\؜љH]N%rCń@؛$=Ж&HGC J) .@d2@˿JtQq-0*OC=I+b}L1<(lE]& |ӐqpTJg7lO|y8,$DGx1!M.Zu\>Aҁ$ `(vd E[25)">{-Ը{NGpt8nOTZy d$ܧgJ_٨wJzq6N:T^-ENSQ&g"՞\&t.Lpt/=DBfyCʎ8!+϶JLܖE~8Frnh1Yə%p9 [&b!)lֻI,rY%CpkONfx{x%)󵓓#׮QS$tqLYܫRUYqA@UQha]B-_"c2Yb1]P,c5hlz5*5vo7Fwavܙrba{]J"XRoN3CO efKǽDB|z̿~x_4;mၿ!7TA mw`4`=yAch!/q̉+3C.5{pyW;Np_gSYovRrkBhd+P=PIk`f@z Fq-Z ӭ!WprI!QoQ\u)޷9=uɭb¸i3GrD; s(0(N74!3''Iriא8w$ˑDܞGUxڛmndea ̒h\X܂6쓙$ؒr򓳋7;bmljx{o;vl͟YH)/xqqqtVUPppir&;麄{(h@ٚ1J\AA`E9I (51%97 Up8 x\sFE)$MvXGR2(bL JV߾^7A<$~g۾gj:J8fۜg`fN&͂iJ& /ǙihOy:I/N\g05$LzS$L^<17 zIafI؟g 3Dqb0ͣal,HGͻs&71I80' @Wq04}Cq1A ́avLf/#牉gk3-DBʡ # (!u8~`i0O:$oO18Ǹ\*&!Dn^݀}bx/9z~|r|0޽Ѽ~j̇ӳ'G_9 2q*< $zfpY>ߛѥp 9 s1xd88fOvww.9hɉLw{?`2b4% 'atAk7|^ҝ>=c Fff0%׻Qo< e{H2femAIe 3 l,wpheY>[Mv՛̃N.U5:8b*rAj|1%22_O}z_XB[u] Q Jp`0fqv0 FaH!&7'7߆\@`\M C6]w''5|O> a jZt.v8 xlHL`ђ$=sզiBb{( ݚI~BE8/wO??<.簺;h NP Ÿߝăw$$;)âa0 &C;fsv hLTzNYs Vt !ar0'(󍿬7(ft<,ǪY&9㧨/]) ,DԆX1 ]I0 X s @Ѭ R)Y\\&n3Vo?0d#΂̳78kckT%eSOg]" U}- %Zb_7?3(Ca3hr7@ˈhX[tqo9P%TK9~d TчrD%8`K*ܨY0{|T]C=C1+l. -IV5TqFX&dQku9'ݒ诺9ow*Mwuk :XS--Nf.z- դWt͓(Fg퀻z09~l`= PX2 P}zPKIRL_.f>}dSl(~n(Mj -,W%S(Hpd ML܎H6#hwܔ1oCO AJS'ٗ]7ΰ~]>sVh2F*fܴ3{3>zfo1 :,8Z9x:ՅCzF<8 <2` 'm>BP*DD4vDv]J$MqR9ז[wzFba=sM8;t ǟF<KsGOhFt;؎̝ѹEB%#m Pw+̂fMת1[X~/)CF`+ƒ$^)kNBB┖v* (G lk`O|Hcble'ƪ*Rj@ȱˀ0,hfD*pdY˙Mq,';OzeUyV/„YgcC"x-AvT]3!_&:AHN@iYk4AȅE@@:p!ΕW""פՎTβCY&'L,P(--]SJLϮc3Azv PB|ږPǃAqXe"R 'K{O 6fIxsI7vߍu~t9B`{P3TPU-Oq z2`AEK"YKXfb9JOj\ [m|8=!K"##;s`a!G.諵 W<ސej̚cgdU YxW.ܩ0 Dm(%[}c)>څ0<#jHEW{_֗舘hͶE&V65w"R7>\)50Zl.8%h,{Xn2]3h8:E9 漫j03M)('HxFFHxP./~p'/ ]km*q 5Y y𗵶߼8m#!kƽNxjL P{!"^[\$['N^C6elϟUq9RiNTޖ#CkU JL_D=ifQ ٤wc7{*S=[6FYSdb;Nq5 R*N@.}Fl:[E7CU߲T'!_y;O"N VwsܴPcWC8\vJ]ut¡OJYwVp;'.*Sʴ_}XJ.=60{^8Ƙ3-0 Aמ̂A$`U=-bDHM-~ ,*`}8]حFRq3m`<@ϋhxX!_=Bn%F-5 k@M=MJitL%  U;d?_ԼHJۇ$Vbj@Up_(}=/Un<"`氭V@r D0q"=X8|#Ipa#F`rP$Pq@䷐iEUҢK4j<1 + ".Y%5b7!xD7?nEd _s=;y__d6vcz}omAdIӠWnʻdk(D]Zgs4nOt-E=D}+Q.6t bR΢8rǯj2(!td%`:w+-ظI됖0rK(]rWa'>/N#4,;Šq B}6sJ{ dlb~a+|JL@@x7Lx N|ۇA0#q}˭`qa-=LA(g^L0/<y-cLUc@LQʏ-"(sQ rvoKݻVp!0 wܝbKQkg}0<> jd8ʓe"ú 0g O.F%)OHRJ~r>)tc8+(# ^Y\o4{rF~WF[x)m'| H&[l?Wgܟ{B~` ~[ f^Zmfj!%cwҎI-^h`O2I3K=x_{ЦPV+JA=J/L 9D4n,qd#Cxy"[7F¤p둈ӡe,B頿!{&8,H +a5䒪.$zWjzT[-x(252ouÌ@`cujQ$8K;߮`"=&;Pw܀̀n޿eϮdlo홟՗M (Ug0Y c z(rD3@LWE˰qCTq(G:KFE]TSTJK ] \dP0fV֙b",b3e)G%YJ@X 掰1[@CF^(ReX2)\fDJ% F MDF%A ue=[,W%ͦ(2Fq6#3>{sNDUy }q^Du3-ϣbd4"SHWu2a׊)yfڴ7Xɼk0{h3#I=ְ7Tn2잁FݐV"R<ČKWcs%Ԕѹ&*GsƮ7 YJ䑧YD.$?hIc WufhjEDV /lAv-t庑+)9Ʃ_WNfˑd=&#4nC(y5?8{{fɐd伃δF IyH|;>"ckZN!.c./vev6"/U89:{*kW;(#wb?EG@7|Ki FplfY|s>;+1<W8v?&*bT Ur} ɋc2v] zH&fUwgB7.^AdM ^eΰ&x|7;e ۈ^=jQĝk_ᗔηjyA8;|]W֓!z ?6vJ35L}sͰ%gmǗ谜V;;)~|w>Wo.)5ɟTȨx .ך?MKV 1=&xmzzAbIz,Vf^~JVzZfNjqAjtmP%z%`u)Ey%@`lPfY/k0)V/3 #RU]Ŕb\řU85&d㖟VJ =[*(K*'TIRP\r~9.m%8'MR&[ˏmd2d~N,X-OxmAJ@QKQ m2Y.D܈HLӤdJ+Ro0-Y{A+6iߛ1j qQhGq D8<-bA pzq PHwF%u|+򧄋ydQXv\<˱Y@W@ vnwi(XC]3@8r(v@hN1#9#"`?xhA; Â.G?GK[Vy.ȳI^=_fԧ[dz>g~KeDUq;s'mCZȆ76,TwMX):} Ʌ6EGەy2=*,Wͻl<_G exh589[o"BQVP\Y\PZYR̥ \ZpZ a>zzzd Rr2K2JRӋB(VSHİ6YV)I 4,42?hx+M+O+NˏwvqtVUu s QRр5c\C=\r2ʀ xkoF~ERʡ%'E6$m'PRZ/7}q\Z p8gv=mrNIEv]$CZU緧$f N8ʋ-5?ѲdUKJNY5 p=s޲[JiJ^" Q^.pNZe(c\RJ<"AFJ%jJXM8/IG,~@<0"Z(iV$ˏɏ4e`+rՇ ;*PH`}AV?rzz6 ӫw'9$Wӣ r~}qDS"ID9 A!I-8cD4&Y^-x5ߏ h$ ߰,LV@Wuhy`2`oC~g kWuPwG뇂V8=D2CŽ,f- {XЬ5^.~x<ل;=+L /N9G 5,O\cY²[+hjғw:ҥ`+#*%vi > nyAB1=#V(hF^? i*0dB*VLO31e 2وKPӠQq mrR,ja_5(2a ]sl<ǎ;˪5!fra0tm^msڽvm8J߲KMxO<\yR(_i{5i%2̚sK>Z<0]Cą ـKyAϩx ˶|maPf>ְp"  ;9_ mNy6\2HpQd;f.$l@sS$HMeP7! la]zPi q)[ɒ~*U ;*F^lmȴ' smw݅ む;DI<IwcC/`-"I†.Dhΰr~DNn$*i{k%Mog 3m}[q춢bZv6^azl(9|Di^ ϝ/%=M~me^֎Fk 5 5v.=%];럯[*CxVұ*ђβ0aYn& 4M5ͨiک:8pY\F!8t.2. У=]FcFXrH;u^ WvM%NE GDCsY[P*įOy~w ׂ(G40+XhU-gBu1'aH 6=I#IYDU9q @V@Xꎆ*HR;}< ij≨l,KL̓RAOHJjk;bi|D&D„٫@1OFسeVƒ&nG5.n"P؍Uhq„{'EeqmMܟ\̟Z6aC%`{XM.l6İqu;YOi`gNy1lkp\(V 1nSvm5tm]NSZ@\y7~4pPKBX5n,2A15HL=t2R 2~Q "88I1X2m!-kT%+\iښ|T\郂%( f `|呤f~Hݴ~aa_Lkb(ujx7^on(T{Ե}"Kz̴ rBDxtzv"xzbIBXv3 hG*bZ9U&f3tuaRpCAMm#pҗ&yE=Pg/|)>F]4T*mg}uܗe@7*dq:̚V߮2̌ J7!x t%3XX)81 89ƻe~̪/[4-Qp$Wfm ^4ܷ2{_R0|9dMl΍, ws.+BUcCuJO#BdL31z%|uܢ|ݭ 6+J.ʴ?$6"ZAER4HȈ㣑*~}Xg0}ǸL)~*GOq2 rBڵ#FI̳JZ! n8UNb;N a4V}38aչp舛cV49wrfSlRWl6dEoP.c6)ofqu~0 :!/7]k[]h DYܬ_f[>]t(g&u=AtSһ@oqmA"6\~ml@f|d5Kx,O\uXfa` fcAZ66֜2tfW~ ̛i맑ꚩ N@4xV0Ϣlt8k@S58y԰(8 PʣoPeDיaV}`C,Db[u҈ ܞ9[Z NbTٸr>U~\x;Wzp=͟O>gl5Y$U&XV,78 R4ˢ cu&hO0޼LB>x340031QMLO-Kf({qִ9Bt+2%dvkQwn݀m[i+0\Y 4_NF𐥏iƖ)|W /2p>;[?%{Ћf<_azSX%3<DԎX3<\ˣK [0XL!"x!\Ӑp} <$M+`* 0R:ğۀxax.0(ΚAY:hwQNN%}L ޜ EF*ƒM8 {av\LYF)w"tq//4! pRőyRCe EA3 3o< t?4ۦyBeܩ3}h,萴$޽H BJOƒa`zp%ܛh.0 Zh !fL g!KZ#C^0Jkm1 ٳhxq]d(Lp!|1 c? wƲ8RJ, 2^Kkkxc{)0dgZGUFYDHe㊥U );&8sܰ,1?h;bYԣHBZf\ V5 d9;Mq5 яgN?,`)+ I-bEKtS5zĜp/SzJƨʊ %$YPLۯ`c+q?^w'gnN/7NYu04%*xT$F b= o6s,-W@.S rHyo-Mi{N9 p Po]誄i@`cUǡU?DS C8XhLYqHG^HQ"r Ew_FoMx ɾ:ϢʷZ*0֤{[ $T-a$kVX.Ǝ&GySJys4qM21#sBs2<0   =b^dBY +rbA" K0NE҄w eP%Ƙ^fGA\BxWhCZog1^N=E%/@#lH/DP u%5}imVO8ןW7BRB 4ԦMJ4lc8jhh-jy]cv*FQj%aRʔd$q (:fBd7e/?ホטrHPG+I5KV{D;& ʝqsyՎ$!%y'x[JNG_{4f̆F:M9u8~1n\q%t}2f`+V.&W.OX ?2/t,PѿSL75,.KF8Z.o RU,U`;?P`qYvd*#сLRs1_^?vmK%rt4ctavCxMLO- VU+.qg]x340031QMLK-.fx6M9{wk+qIODCĔd,.?un$=IT74E F:]q\go _i-0xxڭWn8}W̺h")%@ l]Ik uiHET Nm;.leVDΜ̌ZCd,Ѕ BOф$Jᔭb Ω 'ps*$[i0 oFDҔlm[%~Mc|t"֜F,>'o`6pyN7@}!e! 6YH8HP `~0$#Ojs.h@2AGjE${4Εׅpؗe 9<.NJ`W /Z_3(CƎ#c|= &(/˛Lfe2Of! ˘.y 9M Edܢ #L^LOk8&b2Y-@#I@BЄg@e+- |dLv@\{lHOr+ &Di!Cz񸾔&Ìrf5Q_ (jKmN0Hj 0KB8g´9.eï_yYEQfocVU^r snI"YߗM:pPGWs /KRӪ߂^plfOlJ¨yؤcmwڨUƊI.V'ðܰUJbfrLɿ×K V&@,fe0A ԚE -o֕f)xڛQyB-N#55]Ԕ"E[4M4h]X[[uu?9W0N)cy!oVelWxJyL Xy'$xڥWmO8_1ҪEؽ^iڶS&vcđߌ,Ǘ&y3q%*8 scAw BF,屡JZC v NOv* 9te) Y.UI@>sUq̗pKuCaPHk> 9%i~K<@z-g - PCiU ŒpЖ%`Q:6{> OfgHЗ>O d1!`p(Kƅ*fV.q] lQz4T%TJq5Mh$Ma*ŌB0.#ta}qrjE2l Bu3sGwx뢵YQ,y`Ur?d )a?EM#hIt~6s܅MX̽+eowOw6us)Ir[ϊ$Rfc/KZ?y3b(VoN R0UFE}O-)Jl+.'%S@w/8-ݹq8`7z32pTd5+ R؇ƭ 7eZ6Ptۀ7٣K?Yojf$ހ_mzXzjRC9x. ^zCa(`'?/O(i%m5e姀/&ؿ 篘2ܔ;fo㟱Y]NY.дZIqLy/mn/XFtU ;z/N<5ɉ6pE1+7$1%$h@(9$MxU:idJ3V~ݜpikj,?4e-E dBw2Z~5mV0; /& O2wiGtHxc=2<L'3Z+ns # x+-)ˏwvqtVUPL񾮾>~::.~h\9IeizAA`JK3SS6'XxK*`ePZMcxTmoFίR"zU//:ʙ@dFeYk!4ŐVR-dgyg69gFJ HwW`m@_+癁f/F€ ! \&ceSGb2qyq."Uޑjncl4J%*΁B-Y ?JV(L) pDIL9[YUE UhP$s/7U,ྚ 'XhR[0[CceW@η96mʒ4cc+W KעrW b ie pܙ,(%fFV 0|No'SK/zM&ɋ \S/fE[;?RHh8}&`00$0pOB[#$",^ S|A)bHH|$j G`Ƞ 23y3/*+"OIwm ?"UJ`mR.;Iپ*h!NboCC̪D6DEEu\goμN쀚mx!(ԨxBs1:DԿ~}pWא?%^=;o`~j4q^#6Φ5x~=[JQ=\XG%YH0$hV1o5__7opϯنn/ ˕ӧMurIr/j xj'xo7uU u%SY ^DD(崤DM鷁D?ueVٞf# ~vȟݮC NM᤽j .ۂ:%y'Rh*U4ޮ-/]KޗI)ߕ[WRt_ :GxXmoFί} \*t)$^Ӫ{WȻU{gv cCK3<󲳳NjpOi)C`jj uRh0_\"\14{ 8k^"0a(5|vvOKHTs%'Z{< 5O"77pcY(\.iE܃!qd` i!&pxg8[ 3M k LoUO+z遈 v Qc3~6 pzu{?|ݛCu -JDP 2X>!t/:?v ]뎧uw wIHA8 M0p @X(ax }n„|^|joXctOY"=4qt~e7]!qmMR ,}O3$aO11231o8bwzңKp?V榲xMr}WL*I*䧱kLi+.M/K[ Qq?.ep\Ǯ9JvK:U]x W] s&xMG=cfgc(4a3aP*^³J}}cO!3CZxkԝK78#\!)$7@!3/-(7$3?OAK,?3E,78>)7#pR~\'本į8Y{X&QZxuPJ@oS DoB$*)zH=/aw.Q)|6Bq3̷,ޑ alI"G2"|]M!{f0&j,s >HeANShֽ)lˠZ X{FK`x$*e4ޖ >E%Yz0igCiN"i}aA*` oBxb *mF'ͦYA1};wؚqOO>'3">~2srj^Jfzf^LdU~I.0(J-)-5ԴBUŢ 3Ȍ"/xX[S~W `۰\,ĵʗ%lJ%K#{*x؛?_Hd {Ӿ LOwחaogv.Ӗ _"M!22U"LY4/9)Nt^,3A2bEGSܶ?!s)zXQ8i8''SaL4Oi℄Ai{'hg:%dJTE{qBaIz@"O$P$L)՘މH$N@7$.]HWD [3% &Z3ac(v& DbNb\aXb sk 毬HF,âT{&TY_GtrnO`VNU2·%ೆ˳{ܿ>:ΆC: ݜ FɀnƃY#bs''W;lᐋ$*t x'F ;W&ŪI)r4Sjjo=2N=3=Sc% ,rY| _Fl3AA{<guR 'uZ!:M$I@4ѴΦd(=!9USL pS.յ?ؗg'wWcBXmfp0ln8HC.ħQݙNh3 [6V,^ iADlE;_?+CN\HفYgX1@CP[qt#L[ӥ?;EU$uBYi1vi: lSk#S%_|t^&YY-օ8^υuf]kM$d}:p9=(SYIюLd~3 d%Ƚ(Ol앹H\A:ր[X<^IO?}Jm7Cߴ~q :}02zk}Jz[Cg=?V V\[Cg=/z^VCaIA:#BcjMםMh)&yYth}u i_I_QLjSÏK鼖G]|6 >Ivk[ 1UN]s[֤| :QEeis:fyrL̃e<4iB弴^} KИF4 S|](myv|}R(6ۛ"L597(w=bGH|,Y6CSqHkǛ% ,jQ+'2wNP}C0O2:>*~z7Žf tW\!oN؏ۢϸ%)w(sNDc x1a?N(X'8|yݼ_\TCD8K%|>J[N]D׵|bj|z[~[]N^.D%L e)ØaF^㾮v)L{l~NE'*8Z\U+o!N56&3E3xĠ3|&7qRq }lNt2aR{QGe`rQ~󲹅ofjFu˅Fj>]\x,sN m:J&=LIgSUBP JlxڻwAcCTO%7xXmSHί+Rq0+ncC\.I#nJk_~VctkTkZy"M+e uE򁾊׉Yi6~*VJPt?g-gWAg* Ś7-eJ'&qCO?R;7oi2܈\dZF-P_3eR$!Iɜ>H$n@"'Ty%]%- >>d hREM ݊$7; MR c%OH|Άk \UߢKbhKxBP ? |LBף|F'M;®9+ƁmFz `?Ñއx4%h8MWW4R.{٨?t9^^\ J??). ro y+\>}nD#"!+㷭M1Zp&;2m@]>gsdKpKRR"͵,iEʫ;-XϽg8R(#Hqq66YtB¶MoG%%eT'>~>wѩa>&DGS~r7\v;cӷoUyŊx&G't+m*\va@jb2S0ۀmP]G aT"No&ԈBTh{7}H"pYY ˪6W~Th+J"oAɠZ;B&gb4~H*$Œ9?sn Ш䦺֔Е=zE;LtrBotMGzaZW|Ǚrz7*)aۀ䰋`GيvOV<S}' UP;nڝq|Uv~ !SE⃻fh |ulKG@zm6l;.OTš- ͽNZřo⳻ۻBu&_3ٴ- 2 4ld*&ŭ7.hPEk!*r7صwB]u UTIn ]|^I55qVpL4?(Ћ4Ac_2@ mBR(ߍ Y4 [EIi~N7ՠ?:W ~خzsbvf 7}%fryMK"I$,bCHi#1:6qn}s:ITb:56b!f[L*}ʗ^!Jd~^?[{t[5f\ΦVR`a?\b %BA7S+rCV/Bg+ۣ ~)bnDp.\rjn0(#:<HC0W+;ö"L<$Ym6G'Ϙ5;t8f8bLy`ʩ`KZ6i c) 9G¾}rGpy},E$xᆂi!ꙇoĽk&67d{"9K[x@ gzsh}u3/Q.c+v ";7]֕{xXLy|\O1f(y z`Vevy*"q"n`{-q+;UTS'*4J1GX_2 o ȤB8+xr?}JG*R)CpdjJSs#LYbe-WB.Ɨ- 頲&63dϡ15$BŔrU$`PTfXS@!-,8o;jB}R2kvW` +Ů&$>F؇5vg`'9;`*_w6LA]wT0%qg+aV3O`1[^=,a|?v8b0-,+%e 7]ϖ ΖL0|9<\p0[\qJk{JPy  wI2:2=,m _EATfڋh$n74d"ȂmqFӭܩBf,E )&JpỨ :3/F̵Э݇T벅>l k_" ԾUIⶩﭐTm/u66~ |RjهKwF>~W{x~^y◺z5Oơ݇d%%H#ZWrQ"w+w#C?v2#UNJ0u aYbJ:XmR:<Ɵvߣ;ynkq,h61 * ONHDլ5IŇ˱#ư+&# #ԅHlґ`}twq?,K(xkS8{~0ؽڹq00KSnkno82qݹ~ݒmŁ;jwH$un (*4EJ0yND,"/4Gtݸ ݓJNˋt6qZ0q^Qv&NtA t;cYe(iT<}K霄AB2:364#tĢⁱy2)‚fӜ| ͂|c $$q$r<q4HY G(<,dC"H!nP Igr$ 8>到38PdH<<,&?~}X\STbY3+ b#'?g89;\ܐkrL>_On/ɧOW7%A>9l8x " !(D Ik~lr$-<@E1{}Qvb$9Bv:;rbr1Kx>4y1bYԖe,-b19yb[3 qHH tdIN~]: 0i8U%AMGT*T`R& Ry*?!)|ʥW +G}iɺb=9V:#W֡'6hZ*AEW 3Y;Y@2L/:&翔aIC%X6@@j6k) rWK1ߥcAG 3T|'f&J3ڌt)̔xT Q<mn/ sKH8F-CPtay]M][, dbİ) Q.98(1nuRپ߿R_0cMz <=0nyCRX筊TSvzr88 !pd䓦`V^f<C^פ :J,ckِ)cXp5JѬ=j[^Kvh^$mn>qNo>ëO8Y0-2nNO+#wRֈ6!bv;zƜMT we-%#}*e8c :j3L֦wA+J@[y5c2N%<ѷK"0?~59 _3-[X߫wtR~$h |QHIU,‹W) #G8^:#E2UT5GZҵkY!J{Lala׻H\F(ڭ]c.CлD9/Ct$9PS!znٶ7+ux5UoݥEJFiBI^$D8ZP01]m&gd0@rt]|o*6r. ,S۔$x,Mn8 EqGQT`垦_ }m&[ʓjeRޮjL5=qe6ٷ (׎EsQ.-:\cr/mExS=.-BĮ>oXV3Nk*,J =iJŞN_){*3g*Jqjt*L6pdUqZXAA3†!:c]1V7^͸=F<**o(7Tr&^?\=Ԛ).`e\s:lgA: fQG3͓ WxReIm'=v9' t~8 V`j#UܽCͶ̻&L%{[݄4ߛ4U{wS.YeM"7\k0լkW(9{v2C:%=Y|#li/5&tx69X {3cNiiFp!ã=4e\!4ytA귍ƳM{bܱ*ouj{fY|aȻiL1/_|\qH"K]٭XoYe35oؖ4>ca OYm`a Gܽގpr6-{bZdKq6GIM.^ Gtmo4=taؽ.0|ލz>'yB.x9 !n(⩲'W8 )&,˒w4 DP I;ȠNs$Paz K[>JI3هšOǘ4v cpwؘ0 'd7bɲ\諚yhl3g~]% ,Oq=smiӳԵ^`y"Nw+HKenMlb߳oQ$Jp#TN-װuX8PA!T҂ I6FB+ mƈXf$ UyiyY0 (Rx?Lؠ.5(ࡶ4ahLq7]Np<(ZAU^>~woM m0uU:o=22Li34[\oQRۊCfc2(b=P-&]SN"vt#!O˶;pJsl+L.V{! xj0I)ڑ@qcjN6+CSWݠd!ͱk#jUjܾ&l^%%Qqy;\BDLh"cіv!ŃB6h-z._c[RXv}_niҚC0R•t!d,$KBoYs_+d}gڽ2-<lhxfеF,kŸ4řOᐠ@ӵ!i'ar.l8!T]`KE oxQ!o0] ]soL ;1&@4'A:jpPv X !i_ ^t ~Q2eiic FnS]ya4^t l{Z\WI+Yr]eC5ns )t7!Am~cش;T$ksǜxd֟Yڔb:tHS"?pi,S%1R۞oUjP8܌Ғƛ#xlX:[&8U \!-~qc*Qߒo|DOoU.!^}]!40froƲ۫sMڧ*GGRѮFӓe*:Jsc!2{_5vJzKZ9Z=&3lqu{A^9 %RD튠7rǛw0Lѧk.|()9VhKUmTz#Z*RZTpj DžzQ:ʺ9m*eraPٸ z\{dиLշt(~@eEoxfT+$d h_$ ?!xƘa~ce@4up5ۇ]G`ǥL{ :SE9ɹ&N|#,:č '~~!T"apT! iG/?.Tods]kk(D!Z:[NlfL^$'*Jtq0Q R,ÌW_0C\o}ѹ&wBj 56]q:IUc/t3u:=(O7b%婟 z64Ow&2KP\Oy;Bu|~+;^KpQo[U[ K.#O3휶݇o[fջX|m$/.x;=dDy'p l Mz%x xkɟE%rӊr3K@) ]j^IQ5 @d&kAo&`eqØl:0dgVKaBW vfIeA*Ƥxl1D&-'1(R9}@$nIA U'VCon0 ]g5ԵDk3 2LfIjNqIbIi2ҍ/xXmoFί+D\rUQ!ל*YƬaukyp\_~{Y`$D yϤqT#zZ]gv5~+=W: .U lQF''<:R\PGzq# /ܹ_ݨB|1mTƋc_ϥ T^-P|ɱ} C9#A2"(jj*؟" DФ\@ xҡt0O\Libc؎$$Czo:l BS#F ^ pWـ]=)I͡>.=MZWgc>u7cjSs8lǏg I$"$\G+g w 4[^w'ۣuԤAs8^>C< v0Min?  &lrD?cmO3~ᘨ뒯:i|EFc\`r u5*o$pMR[uSy'+#jyB*/ ?^Z&|`U!nZA+NgDP*ޑ%G]Lp(s\mڿ e!e+U(ԢZ ɓ!x˄bi}K'_O>JT=: cTt=VH(ÇP8BLR7vXDKTKiu 56oR̗.d}8.#SϬ$y:n}N RZtewVeLj,LS(Wjұ3?.k^rFsrר0'[C)JҁphI+L"5MJLnYqt;c,#hM[?{(I_ME0uDicY3Qc*Z7֘kz8W'A Hfpk7b[QAܣ]U%^5J`V_F\Q^6i%շ^vJ@ϻ.f2w-J39EH{JhMmf4d IV.q:Lm;kJ*(\ՋE65*7C5 pM.o 2-`bԢ$#"y>+ U "/gEjpev";ٗCȊLeE1u٬ܖ̊Af`vsZ>ɬE^*V41i]U|(oɃMd_28)iץEq;e47 \1fB^ ӡXJS iiNĢL?gj-y:Fka`^*F0BucF߰Qģ,,w9,*nCiN0S.Yb;%xb*qmHK!. PؼR5ԠKcQkv~7M-̴>rYTʰr6IS{S.?(!\ y$aIUX|bBw oҭ]y?xڻ1QcC."OM9L|xڭU[o0~ϯ8j_qRUc RKV~3%RD#ӳ #?qE;c/Q+Y\.EJ2ګ I}L,J0GA͵xi~>Źx%o cGU־ic8>`'6{[ҭ=['"\'W⵸Ɓv 9l}xڵZs6Ng\ҡG?]r,{$rLC1*vK@ )q2m"R'rB#?IfKl <ϔ Mg8WG ~OƋG8/Ȁfa2|T@H葵LO. AC\>@&N+-l#d8-C>|奷 Ӑ3NP A,ɓtKh 6~SbRa6u~b7,<^,{+m- ╾F4Nwfj1@ab,/mv FcIApIɲ;pݫ| \db Yhz<M|\<ޏ̾B äL~1,I=>D< %qD#w5؉$$j[@_vn;cSil7iX=>zA UM'1.G ΰjN|)wUw曝Pv7 cϩksCy}>|Hďw8Uix14t\o$E$OFf>DzqфZ9xғYxNf5QÀmvg&aOPō6YؔI7Ŗʈ1a2hm0Ǫ-6 ̪; 9W788Dh̖#q;2~iD`li) Px" *BpEs52|Suq\Cн?xZ/iEd0Q ,"${^v>ȉ;[$Ͽ:lnd`5, 6] <fJ!T@~taj 32,Z:Z2ᮃф'`2("eObTzH\ۀrXֈ|P#όܺL`# *\e?XR[/k8Èj3M(zs%5Y]]=Ռi/%DP#^-rf ]y }aG'LȘ_j0\qA˥oz(k^o/ҙ"m hTQwTOb 䨞Pu)bd%,f^VjV1g&@C%iŖA7Ɉ5v2\`uIv&r,|ZMWeJ ֹ0x,ll:|Sl:)yDctx|;DiZؕ@e~OT*$~(KVMV0jKK)%JnWT{:.?;D!ƺjۀ"-.zG) X5dTzŅ_G,v.H(ZR,:w`|I\޻[%ZwzY[u,EjSo\;fkTB1jՖx݆e¿-WIe]YT-Z7NXka* Mζa~as&+4oН#`ۥG6qoo>YhI{nozճrsd ~-o啒=L^v9LiCrȞ? RL\| S<ۓ ְIup r_ $#c. L&4̨HFvHi TޫPM\[xa#c|dElQazU!f[ ډYv, ܽc5Vim%feo8gHJec/3/`o<" wǣ m}ĠzmJ`I5f^oN;ǧdI=/}D1͞‡T ЕRP'b^su._&#6opX@ CU~@^0Mv|ī?;%n#Dt1J=0*ǰ텋"ޙOvF<6HOI r'Uqo!s"ЙZeש &\Ξ-3u, %N-VM+GUUpioJh*X;TqmUR~οE[OJՃCjZkF v֪͋k#ҨH$GF T`Sn>irXrX~_=_QlV rm-(K7["Ljz- t i\Ө>ͪf@FG1Ғ36tar4x>4m a,P !P26zmM\lv^s8z¿΋Y=D T%.~l&_׫\ߧ#/snI#|J$M" &}\X)uF-Q)JšRFY5[6o '屪FeĶ?xڭW[s6~8 4} i, dt't<–[J2,H6.y( wsh<2aHk6HP^kCm7tdV|tps}:4q, SfS'<$t wIi,iH5{I5JILQ Z2"Zfh^Yf(pԔ r8(DHdhJ4H H , x@@д舆0s8vGr'.E( Ti|RY 1}U ^ÎdE>00iʲn!P'O /=*H[9OҘ#20konitzɰ;Cimxn&tt4n`~4CȒbʗh@q9R[Tƣg ƄEƤjjEf yo 5a0W;{qA,8 YUV6oBt??>yz52.7NikO2ey/0JnAD?W|N|RIIa:N gGV2roQ<yƯPnmPe0Nc ۏoF)*'V\WWk=m[LvrEJAS[Vᄁ|kRmyΠ)B-l95(zs5¯; p `&=Y1%*™سq DA c+nfx$̧fAĎ7e,R.t#h3(=8wgm!r!qaKHuKGLwꕝ9Uvwy.ۜ V^U.rc&9vc˫,ʭFM 9Щ\ qޯ9_uc?YuMw{ydH_axZko_1I)P~EuwmGNeCxQȡD"U>츛{AR%vW@,3s>f&[b[ͣ[fYRw ?dQ\D'x(J9/hixiG8qQfgqd8 2؉5k.[)>d|OOødв,."Ϧ?xr)EE彟U"SxRRĥ,,wU\Y?{OU5I@ǁL )|7Lbth02 2RW㹸y "I/I\d Zׁ"!YFZP)?h)BFU3D|?\^F|<7\2;HECU6(!Ao4gCq,P\].G=# SI'@w` 2Y'Y:eig !Hr8+4Dp&9="vv"QJA$oty=ǚq"J"+v0H(/p,-JmfHg-!Ԉ!٢wq$gN$"āe9QO.*O\GJʷaqZW՗'a Y dZ&O8lj yTU~aSw+6*怤JQe6k~_/Yė|c3M*~D*EI;De;q]{sl<">DcmgT?%P{|t8р'os"STrߪOå 5Hkx< 0k,8#5`ކ hqIZ /Fh)N*@GfYozĆp_ZI:q(K0 %q.w4bԟ ]"H;!TF2L$rc'I:ztXdS])VbEDPx6&tl`#+a)[c*Mm}4b 0&= ~G9y~5'8[*?gv4Cfl`!-9TZunX^AJеl56Y,WQ&Mxb_ iFh%5$5<V9.r+.Sa6RbT41( F>YQ RQ C$=#$Ejb ∺EVQTZF'S!HdfQ'3qR Z֕!R/U,iu*^$$i{!K!K5J!ss,ԐRW~Zxyrڲ l" ]KGqJ&.%e,ZqlT2![e8.TXZI!Fs4M~yo4!GoY~^c8Vir`IЊ]Pt_]e@DdH`,{t%ݣPN)'iκUK`<]?D ,戽O?M{fN27O9Fghߵ`,^\Y8IKC*kbYD6(Y|"2@o)-+B6C#N"}#&D }{8e?:;Su j^ֈrܷ@e ڈ lbY!%@h=|v~~d)^^P⁵&,GhK'*,Up|_L_pe}C/ԛJ2j_ZWaTM6`Ioj}(wjO*)Xtf~}N(8mݧ:.9a yms GtIdtxZt/q^)\>d9NmpH u&ѵc@€xNV5UQĭ At2y(A/+Œ`B[юˤybxͦ0 ,ԭ +=TQG n>ګT`lڬbޯ]۝=t"LQptoO{( Y6dugqs:z 񁠯\|OgQdMVrߪ%kDY7叔[7ɂhXeZrA6'uT7JYSz걊xQO Yw=ot38.zc^ժ+: +”Hi!vgǼ=ذ =ܘ#zo h9*aRpz'!u쳸cmXL+j*3!<1g4*l!r oxdD@Yx6Z.,:,hjhݪ4fӸ܍s@Dm Zl00lSG0#Nܩ~ϸC :],Lx(u&Z%:Aֲ>|/9]0U6#hݏx8LQb~<j$Lh eNt`Lh⾵-,3nCWnXsίo(ÍֽWΫ4P[lh*ԻPA/pǹG^,! O_S8vSHRpd6&h(ntSJgK:SH ͰUl^7Xoao[Fd'C,2bU3Pl Nq;nM$Ɩ ش{\ո\QB*ZR'exZ5Y1mfgM"_!s=NuRntgcg$T2Ak&lyе8ɲjgi$S0Q}d"Ўx _>Ϗ^Bh=.CިKL9XUi8;Y κ L8=/}yYEEAdHlVirॗ2<ĝ#O2pR4XfA  {,vY -,8$pq XR;lLŜ̅!Samm$qXSX=uh.$)mAHChRQOV8"!qw{X28K>Ng \|lpO)[3D0@dWj'lt"d:Y|Adq1rt0| 燣^3'kTa b&;L<butppww׻3ZDɠ= ښ;\1 ͱ׳xY;a"<9>+mn,+m-M=Cʤ {_j#-zdd:Z=oqUt2vrNWjղӼ։Nd4+0q.K"91v΃?%$aXLIb^6 x7 b,ï r&pE6d)-3u,Iݕ* cho,AȀ[&,9i{υ^k#NDm)55xE.C w饏i YrH(gq=- J)j*c;`:p1>קYt+e".Ԫx-7\^Z|,G-t #JG-;~%4/|a26zŸZB*^釥i%iНk; \P@q-1~{KoǭnE96^dV϶1\No3Lir7Ƴ/mVY[]yy265mѢ˿}(?6DŽٲ̈́dSF 8Jk[]WVyW+[b)i?F8|CgRISI朊 `R(>( ?^(SDFٮkoł㤳A>zmi{W=-<{(wn1䅀Պ,,- Å,`;Ȃg֢{HQ+q*R8X2lOm^(PZ#cQJP8@y"-49'}}2s2L}6!~/(S fl k7*գ q3ڪ6]H$-rKN 6u~md}8)TFetnsf*Ū~%_TDB~ TPӜjr 5s|JYa0nKy&ieaX۵&" EX;>!z+KJ9S2t . 5}iS:>UWx*`HEUQ[oO|0wK`0ٝpK|+lDcl#g82.s~uEvisd؎ִeƉmVanjlT VSN]%?TtPyRxsL Uf£Y^KSqƆX I9xf&:,uĚ'JEO|UusB6+ xڥWo8=h+v>nS %ZN8js˝Rв:TĞ<4TaXr 8Q!A"*BX(&-S6 %T& 0eBYH͢KϙAzG)tx%\iDeqS!0K4%1cR rAR <$Rͧ$&<,X*\ i,?[ДDp< MR\4ڊèmD2Ԁ2OaNSpQր Bb)=.!"IO%;3;nĽG|YkxW7z<ֺ% _$֙Fybf%-9!%Xs.je2&3 "s 8D8ʌx7scgX0A%*#X˃ft[CPaBz f2oQڏܴQ k]Tt2hT&~br~>cQ4o4N˺i  qVim{֝L0^/X铓W\f4<ѓNqomZ,[vͯwCe5w-p޹I8/ŭ)qh8kq'/m/F*xԉpc)-95[x3<,Lg7^uPcD\ȇDFhS67[V:c9vKsbHR  ڛ2=.gڞ!ZTnŦHd/ FY9'j&Y\҅ɨgu^ko$gpr~˄o!߾Yf^3 r9PofyRܤp7mN$Пt2XѝfWҦDRC݊q}Zb:^ )ۙa?coҚjT"2uhՒh ĵF(kP0;ӭ,-7z O=' fA+̊ZQ"/땟fVd#VREkӲf] fXIe3 Z9KOm=W:j?KBx۠SqW.yԲT-}.ܴH|Y[еl_XUXQ1#-'1h^ޤ$̰xYsFx( h7I%Q %R@}w vw 4Dc~>p<,箺B .`h~k0ogj4+R3OC{Orc/48vjݡ_ 5 ] s1ZLj& k>FL><; )Lhh 4lk. L*|wA $#U[ĂN5ިvs)OI< cbn[dcg4B~7|Fa |˖,2 e<Fc*ͻN3|C@3h? s?6ɯ1)-1ɃYam.z-oOB}\;,Q& 9g6)qS"+Shcš3ob9"P&{ZOܞaRhp7~_Dm!@QoԐ%>4hub~a +{F^;)0-FN5SGɱl@ۋي>mfT`dF&X1e+lA/^VGeU $KcZ$B1y4^FnO]`%n!ݸꟿ>yw>? Y>)}Ws"70`B8,UH6JRZ$vieA)!kEsX J5JtZ8#>`;yU;GrY"| 2V?ǝA\lM̺R %SY.>Qk@ݬs6z8(UI[={S0>9”-YE cr~qwAm[tA%o\K7;1l[ ‘Ȟ=ڷ#DWo/eL3~c4Q4sYnP'!`>m7E DH#BÃC1Q_A8o8]$;f2U, 戏݂0vȅ#%|Jo#Q1>+\ܨΕ,MҼPLIrAL7`)prRV4 k ME2]6*{mx~8J^q8'ϘGghAzuNHЈD~8}xQ(Ћ)|f2g4VQoՐ%cϠsdH ϊup 2ӄ9dy52 8#_?;*Fz8&7O!W9rP-PctGNlb, Fh2M# OyLߓ1foyF-3e*r3/Efte#]9[KճmuԘBxR@cʙ āM"1o8Bn( Q 29FSMȳGx0on'9Sۯx3f>lX5lQ񙇣m1thN<ķ+ftmL `{Yt+Jq(Rtyj%@:B?\22G0pFdV^8P.!ib*04] j5|ؖHSo_R77O*ٌI-z5KF~4Ӓy7=Y4̑3Ϧ+jRmx?7LL%<] ybv.LWxk0`a:'SZ@z.zבu,ȝVkZS_]T;/9X]h! O-!U ~G3NRi*cdD,e34ɔBq.4\\Xޜg "M딓,byZrjl8a fRL%I%DDϰ9$I#t/Yk LjBB*"/ eyQ #T Dl&pO3* ApB4S61mhf"e.aNpV@Hq6K3cWpޚVOlXfىD{(9*ã7~O:Jtb3$$7nk|@x'q5A?p5'wp6?a}:$dNN!estA Ć"hQy*C&t:zV[,i&DnL@ bC þmctR4BGW:Bjr/ ֿuG-U+?ebos㵮{5~ Ɯ!?Re-{?D%Y%Y.} )}PE_9tJWEF=_~E4_ jxE ,b/eS=]Wl~>@83>Ө\n縏6cE髬2V.70ŨQwJŨ`u[A{6bַds;m7\6[#,iC{ێ'`?ppb`˛gܚsg6QT<5Mm}lqQN&~1i/0X$xD9Si)xϙY<%[ a˿ku' G; ˃$x%8R IP.jIq;N\z/GC!%z6c}KT.\ E~LwU%'+QvVB/Q"`!/+]iUmө;`EbĎ)|tm2`Zvj1ڸuhyǢ+O2~Ax?!h7,'F$&4$gw4rz19=Ĕ04'tH Btpbb7!ԇ<(d_!:$IMp W>;OW9$~pO9h(a@{2db L>v{zy|l4/{s2 >Pʟͧ>`uEn<M4[n,t[ҹ!Mrݼuwr}ws}u{*  !Qpĝ:!;"A8$Md~3(DS$= nDd!?7] K `grl`lQVx7N|1wq;5 ~?agG?yab,0$[}5B" j lJ_n~O_(j t3pTڳ=S{ʹ9Uqa^G`c+ Ҁq@Uf_~'d=8.y5#'Èc`gÉp?"aga2oD[Eۮ R ox#5H)'W7Q(^w/5@'YU@{O U ;ͳ[y(@z $ c.N"ݾğ*+u/̑ [](I\zgI*8CED"x0 OjC~>o<^ l$|ؾ(lֺF;0[NIA?୏ok f S̆=)E. g`U y&t Q3 ;4V=uJB>8I/\;D竏Nj9D.Am)a6@֗h8Ŏ+ -Nnnf:KRRH!qa[% ZXi<][wa4ar䬕;'+bJ1t4YwA|mDފ6ڙcpFlL4x^:Z?c#Fc/ bN ]-u?sSpfc/E äy019ɨN6hY/;`a&2,98z4'TQ0PtJ5 4Oݪ!A+h™G3&a?NބYώY6W2W6 xrTr(富]},>k mej!f}F(e[#_p.t7%bt/L!5Ky44ܪDXTo0E\V6<?0ر ZN%W%~iZE!-jΥjG9)7lV?s\I׬~k4Uzٻ$YRẽ F]K]xBF:r@#>hg8Hs2<^h[ *4Dz:>&aL &NZ"\T )- I#+wŒi1pOffq1tz##UzD `!ZVSP ſM_tyDdžŲ hyݬ\`H{+r,H5.Ȭ~ èlRn\`k"Gʛ+*DNCO^om\;H:wfauA@aB.b:t;늩J3:f @gX;/,-~h橭Vr]U JKS|0Oje"tCԍii>bKL\vV1%IlSfDfe}0`\$,|"FEld}SQs$iJJʳQ4\$)-ÅڲL1qx*%7$lOu0%'HQ&߃F+Ok^G BrQBF)kۧW]}+uhvշjַj^&;, @0ۖU߉+kt 4l1զ6PVIU, hǔΆztc3φ2)n]< 2)A<}݅#9x ;'mv&EX%'(||8u6:6BL,^6k3G93Φ.z YMZ\ c c//rIZojtjq:ɩj6GChMx͌ wxLMBje9đ CC0Ր'000tÏIA1eį r)qʰ_< ]L#ap2bƜ`مx '0mFX}DwWGԲu/ˏVB!3@VtP:Oq86ooi uwZC]WgtpKjT JWcS i <.,Q 81Q(Yaq C bS>37c V\BMo+ujQ[-qGJq(NlX.A7Y"NVMj 7:hYC 5. ao,P[\3V~(!`ǃr̵vYUc{Uۊ#AB=h^d3Cax$2,ZQA@̦7L%nA ( EPClFXʜ/#^$āa s[/)uCm1dk*tceE vKur[QSt~H( ɋxRԍ>}1e?4~nP_UTQvHOST#YS~az$)5 &e6m4dc!ljɳ-B&+Yg{ӮaĚW+!8RNqv>!mw(ϦlD}ƈ-U(9܇g,`gVLg6+cQ,MVV"Q]gs ?u3fW qB&M̖p@a'ibV̈KkW.yOTC,D $Zx>Ìny=l >w18WAr]u7I˫o( x}R]KAE"Ub?D"51?Z!!1*a{ُMjlG }C# :ƦysϹ̷뙟_gBE|7Ns䤦M=aTV{E:V6Bг:i6fVs4}~QICʍ׍-ђP1lcZH]^ŲEYgEEBܽ<|=Ckc7 =rK˝ e`l#x,^9AfR8A(O1h"OFmP(p\4 . XomT q8-HH0ZdɓNE"{1wf;GeOXb7 Sn9fcBܦת㦱Җ(IM>*L~KU#vB5]=JR9?JI_y NkFx* ޛ[|/mfa[ x;qj !IIiv%I9řU N>Q\  @y)v@y% Z Hb`cAƀL/>f)xX]sH}UyV1dvǩb;v3R u!ZeBf-Klhu^vZZ043"uE/)2&b򂾊7\&u;S?HdUa4w2^ɇ5#YVbCWOЉ<.U5lȔD-gE'BP|v#mTFQ"=̨7~/ɤ7=^a'CUJ&N70Fדg,} G8A7z: 7 ބ&wOMBI OO!$Ƨ>ha{:\ |(EBZ?reL6ɉLؠ+!=}?_ˆ FnyM&m3tkCLi^^{%Vr}A?/%"e 2 d6폽5{[w+o9B Y^ú"LLwŊUO,RX(kEگ$ ٪:C%,D]B}rN $jjf49[q'o&28lvI',(v>zVN!v" v6~ lFo~*t0vK[7%Gvf/8.E,z~K7prd|0Q1H$"ĉ(' E@uɭAn p0今[..呵 d٩ع7`?u8'e?pmLjiĭ n#XzP]9>4:9 (%%IcJbJKWH/n92@U^!qpC¡)ҜݏX_Zxalu+OvR[pɯ JyEsfO/& N#߹Ulӿy^+GGPD@.{xa+qDf<}| |/G_9 \esfDds~I?͖h>I^~#t'~<^ GLJ/Ja‡ v Ht]A:0 ,zŢ;Is"Q/6BT mQҷ%zaO< j-U@bonKcAb8`$aq nV^h RLΙzԶ-JNG TikԬ7:?+DuKubFe?qj#~OS!hi Vhoszx?x׷Wbߘ:sk+'AeIYJInw 7tO+4MX)qe=hddu#@#\c6F8G/}ߢBu<w;ml];պ{•k(-] avm"oc7ʼ>&MS%vl2b$F>aDmϸZb8&Ns+Pm& мlj<+K9 2};f~1i^.S@qc_ Z=2]8VOW;E k-?,Χk;[iW&FP/Zoa!o*fl+y[*VޗXN3~!H-? CB|ɾ aSKYϔo"R*HCЧ;J{~6δN ۛ0v_V+v>_߆Ң޼`? dӝ No@`jg)PDW>y:CjZv’D@ԁ}Yx)%w~"[Ҕߘga2THӢ߱J@6]}48S$HnMZƠ&-pVeɴ ikZj ).lͥξwFcq+!gez7xO"ۺ \Sulܧc^ߥ_4PW-=p,x{nԡfidf֔ԲɷE66ep7a# /xЛCK_K!((X<#$#H!Q!=,5O!%,39U!(RVSϕKi (hY\\ E` 4"vE) xA"\\!w2߳xڥUmo6_q@8k0MRT3@4NQ4HJ7H/ue>s/ƃ .3*% ȯVK4,f+ȸ@5Kjsx=L ͍UaƅPSeQ?Yo7,q We)L*GJ`Q l5+F20`*H)|]YnJCRm*K -Ҁ>DWk J(SX{9 N3˕rkQ:.FG8IY\89݂`!܅PFQR CGA<{ X>c2zmȋ5TN̔fnIcXL A_艒)'J#ŦeeUL`]eÎ@/$>3UALAKJiN6cΗZ_dXsM>|='ʩy)i\}bx{}gM }-ԒҢbԒ"D̲<ԲTbHYnZq|NY>WR~~D">,,TdiZsq)dq(xVk6ί l@L&daYXhyly4}2Vb[D!4+llI>ng \q.TKm!Ag.I-p$TZUxh-S!#С$wk.:Џ,޻o QG,9[p+|u9! +'aV8=H8̡FX:D % nIH]4 }jPpk5"<\(DG0IlCbKR@(sX.^{$0H*Ts`K-֎jn-#)5"A7.iw4Bsxqs8pHLEOV(7hbǭ.B׽~ozN@7'Єxk1wI;#pZ̓M FA΁"|.x@υI&'^_׵E)DԯAR~Q: Y !%# UEͻʏmD]HK ye?F6to]QPfsp|pXYxB5mByVK_JsWH^Tp47]sVM[2 {ýuq|z n5c A= n3㩠Q04 2WEu gލ4I-KQ2a__bsU$VJ,) o"yӜ6؜~OoqDGFӫc9= 0rz;IcvD5F^iҒ1"#|&[gŨS ,I616׳N=MIXbn : r4>?y]{ϰ| < n-|7}~!3q*ODUJ=r*e%M<&{e{ mΧ)k%c#vjB>E$g:CG[l1t utTӱudqJOĒU 2M\aS1oD]a07˚!^OsBhsQp9'h+Sԅؐl´WTΟWmsЭ # CV؞Ub~寂+0n~&Y77ʪb\`[k}:v] 'y[;1Sv/,m.[f-́JQ*|w )rimnA2@qjusQ!%R ,Ϟv#3o^ïÎ)U_zV6Vc{Ckq't#ي}H&ElŏGYX߲(rm ܖG\GgNea‚byݴ[}2ǕReO̍ ё;Sa--=ID Ϸ?t~>xt\vQ!\LiœpRCx^.|A75Hԏ,zJ`OxڕVas6_| $L4s@B {u%Wh'+4 ΡJ#}dL4W ,PkmF_Q{qKa&/T)H"nU;Q–;PbS|tid!Qb)XxדSAYE'B<3=o42<`lv_rO{5Y>ErD4A:L\5LË-Jԓ^d-[1Gd+dMg~$w~ono2ZI=Fa:0wr?2 \X+~rB68@Gs)-n.Qyz$ˋ2#f)1l烇ҤZSIJKJ䱷#E#Q@2vO5yCOj9 ;Y2^̃D$##@㷞[,L^lgaH]l|.Jt H%Ƅߚ <дajgJ>氊S1Iҧ`~ҵþU,r?_tf^U JVҏ*K {`<"Rf4D3S=aVv!_HmY6cK6N, o .ߴ{mGEFj+|ϸzKlrqPvIzwe *Jvo9:L%[e R_~T(s׏ӌ{hDAJ|p秭f {M ϷHJsw.u M}wiLDVU5˳{ 2x]F,Jnă5\tc0t{$]i~k')ľ%?OߓL= 4בr==7T`wڿT~20@8ƗKfǂFR8c{&_ULΟ8Z2e॑#s&QqKY$D);%~g𥖿8xrmlOF HXFKY. eS+CrZ!ݔĄlẅ́/аsP?%ee=juo{ފEgc Yc2NWf~앬QCAX*~.@YbgjY/Cm,ĐaUMrՐ$Y&PפQ ئSU4SN*L'`5gr48OC˺]J9Jap[C[,* T,ݱP݈iPM ZG.gcðʹ.s ୞-hV픤Y!mE*]A.сSM/dR3TJFe݋dEIUvU[%:xZ$njR6%Ҵq_,Ս2!xڝ+a;ac6cwcI+2r#%.;hjvF38 RʙɝAr}vV${ޗ#튜xnBT$]!zz·DӉ4^K}2!ǑsjUB*w0IRx#vMgMPq_Ļd?R*3e/N/&NQIåvm-R蓀S!SҒ@CR8#⭒-]J/a"-' ׄ[n[s9UU:ʒkyň)t>IQ,3;a{T- %.O & dqj aS1o0FzN}^jWs%j6ˢ+p^4Rl^xڥXmoHί_ G@M+AC\.Ul/\ufv &;K̳3Φ~T#X w‹|wPz6:qҠgР}ݻ"!8q T(Gҙiq3hTi*9sCȟxVf<b4^;yhbz4|OpDQ %P19-ēIП 9i7pbZ3Jita.gA< SyΉ t ͓,~˜u1G_R.m$Js9B[@@YwWu1BsNqV܏WoR~c,翐LRI0ryiO̩TK7~u%S-PRs EPh߂ >2l:oA!1z rfJ~ R:ئ?*•RnT*Ǘ.տ.LI6?xjK_&R:''l=6, M> ja~(/ NZn>WmM[xh_5SoQϸ<*oi~س^Sx暲kdSe՞S-#/S$C*RkӜM{4Q.iL{tSʽ]r\ 5Ӂit2B76&)n2;ogY*IHa1"̸,VTjYbN[O GAņcRk-BCr$Am<(AXGNj&#ԽbRY 3U+αW+Cuk&M!xbJ4T9~i_\)oRCF# f*,jjNCJlXb`a@K䪹nojq銴Gt٨/ۺ\cX`{y d=rɦEn"_aϷxDF'1N'ϭoKг7v-z\C\3 ՞G-2•fAz)f^C[X r"`^0f]Сok rʶdW(qoG0$,r ǂJlڷcnw֤?X3$S(\!HK_CZ0wwoT ."T-I9Kr:BSҭw_3zdTų'QtnT/0'?O/VYjP߱nʮXSxڻRi]~ܴԲ zMؕSR2Ӹu_4x\)BXBXYͰrVɈH\#GCY>{17aLdg͟}5EHQ Eq(%DdQ ZT-EiȉQDY(AkQZrQGPڈ6ͨ-h+چP*GQDUՠZTzԀQjFP jEtBԆvt uNt@]$F=Bԇ΢sGCMhM!r(E(bP,C(%$%ȎR"%h)JCN2P&Bh ZrzP>ڀ F mFmA[6@%ȅP9ڍ*P%Bըբ:գԈP3ڇZP+ڏ:6tcuB'Q7A:Π>tCQ?.Kh]FWU4!t@70Am41tC8zGh=Fh 9P4A(ţ";JAb( 9Q:@( e5h-AQ.Ch*@&"mEv *Ch7@ UT^TP#jBhjAh?:C0:QԎԉ DݨS4:YtG.t]AW utDhB(]tGz M)d[EHQ Eq(%DdQ ZT-EiȉQDY(AkQZrQGPڈ6ͨ-h+چP*GQDUՠZTzԀQjFP jEtBԆvt uNt@]$F=Bԇ΢sGCMhM![?"QF1(šxQZBdG)hZR!'JG(elE9h=Ey(m@h#ڄ6BThڎvBeFUjTjQڋQjDMC-GAtFGP:1ԁ:qtu^t FgP:Ρ]@%4.+*Dnh[6Ewh=@#4I4l+9P4A(ţ";JAb( 9Q:@( e5h-AQ.Ch*@&"mEv *Ch7@ UT^TP#jBhjAh?:C0:QԎԉ DݨS4:YtG.t]AW utDhB(]tGz M)d"P$B(Ţ8P"JB P2Z(-BQ*Z4D(e,֠(G( mDfTmCT\ ݨU*TjP-C{Q=j@ 5}:jCGQ;::P':N.tuԋN Cg9t "et]EB t t FCw=t!z&c4m?"QF1(šxQZBdG)hZR!'JG(elE9h=Ey(m@h#ڄ6BThڎvBeFUjTjQڋQjDMC-GAtFGP:1ԁ:qtu^t FgP:Ρ]@%4.+*Dnh[6Ewh=@#4I4lYPDQ(ŠXQJDIhJF Eh1JEKR(eL(|hڌ Qڂmh;ځJ rUJTQ Euh/G 5fV@!tAm(jGPD ԅNnԃz)tA},:Σ~t]Dh]CC:na4nhAc.q=Dz&"P$B(Ţ8P"JB P2Z(-BQ*Z4D(e,֠(G( mDfTmCT\ ݨU*TjP-C{Q=j@ 5}:jCGQ;::P':N.tuԋN Cg9t "et]EB t t FCw=t!z&c4-@( EPԂZ~tDatCG'P:QEit:t]B2At nQt=B1DSȶ@( EPԂZ~tDatCG'P:QEit:t]B2At nQt=B1DSYΗ(E(bP,C(%$%ȎR"%h)JCN2P&Bh ZrzP>ڀ F mFmA[6@%ȅP9ڍ*P%Bըբ:գԈP3ڇZP+ڏ:6tcuB'Q7A:Π>tCQ?.Kh]FWU4!t@70Am41tC8zGh=FhJz܁٢Gtޗ4^zgl֑Xvz/ɓ's{F`='OgF;s^1ΜzfgfFBL |[|tDˑyI6'w,s/=%qh{i|8GYzVmNG{^ %#*6qm`ǯ ŏ^oiG9Ok{|=k6ÜsG[}i|~}rZif܏1}?msϥ}܏5}?sW;}?{ﳷϼ :Sw2,uTjuu딩,eNNR0딩,ez2hLe)#Zke*K:MS2 )SYʈZRgW^Le)uHR딩,eO;]s? #6x{y]O63'yL~ۿIo~mls qQMrs}v?otqvF}=@}| N{a,eεT2.kLe)OVqEke*K2Z+SYs,e jLe)/VqMke*KZRƐT2T2kLe)Z+SYʸ22Z+SYZ+SYZRV12jLe)T2M㒈3cFiǿmsfls _ORbڜ̟O~`@eRXۋ7405S&)GvG_FO5'Ϋ֨j֜==?3"ܙFQΜzfgNfߢ3̌ wfD |!̤pgF<bpgF(ܙ =35ܙѡg.)̏ wfLXYΌ =sg>|)̜pg037ܙ=3?ܙg}m;gn wfB虅|9-L =sg =sG3Bt;B,w3+>so?=*ܙɡgք;YGG {c3} 4pm+]{l-ݳzWU͛y*JkKzџ{-UWqIVY,%zguiqMiWJ_M}lOJt+_]u{sui/B)^奁)G>:*IU]VqEE_d^[\eӮKvWﴻ\ee%%vW$˾X[gKoQZSմ_Upt./-v^)ݩjJ7%oxKv_7UYav<(Dl{/ùxU=}@2GcU̾lيUvJ{*{j Lq@to/JKm>O[[>#˞iw+V.*/ϰpy)i/{MxO矌eY{wnp|X}3+ūvWU:+W6;YzU1hΛl_XFyg w櫡gN;sm虓s#0hYK+k,= $a)؝vjX8{jg9?B[wXs'¹<5r '$wV~)E1N-;44m I7|ULu);O026 hzelAvp޻e$dȃ\îk-E %NJӾ)qB҃mzC߇.x!̶uOIŮ\8 C=V(հ'38g8#\ =q)>7?'lKIu\aq =b$Ha< _`9!=&Gt сni,5m;s4?8ܔn{)dĖϮIv]! 1d0J)Ƀ u1: z G4L <1W=e;`bY]Pp,f"H:ǧgRW}^WCE:֐mKQY}%//9^*hdM) ,Q ouʶ#ۦDOk;-/ ߃Hr^:ufO"撈2 :hu㘌X0HV1O87'Yn)OҎsLR>0m7$&1r4+9ZjoJʪKo湡6w TP)ʦ|$^H$~I{%S\=[?v޴hf1_c8Rzʖ.K%#{Gsrl +e,yQ+IYQ+i%hϘ|lGltn;/P{6  Fdj#kLXWp`FtD"K(N Ft?osDa,%_hҦOǵYeSosz%@"GԋnAd0Ky| [meh;;N1x/UlX^bn{Bb^X`K(&Pj%dVVMwk0DES lVe!UXMCIXEECEHSs:+vx340031QMLK-.fPvU?˞cW3(+M+M+-NKf#tՋ.\!!sCYIE xEfSM6^l^ 8.wx r r VUL*M+VH+-Ncxis6~ū3uIƱN"r;4áHP☇ :$R㤛n&D>t`fI(v,P~xτ_.ή!b&EA/=Ɠ6^Lx$l:apq3?nOV\D ~ʒód8 *nC`I$`ʳ1!g DwgO>+R,@<9(DqH i8ax" ëxRƽ^8 /nOfW#Hě1ϢGXoBY:Z]~i; &y>}www9^bh$`an{.7_]Γ("@L!ύ5w''Ɣȃ8͏(7iڢ0N:2\N(("Jdf6 ,>AQ>jpu5t/m?O-bKMQ^bmB~y /9 Q`0ě6oUӵ5YD*iݘpg#g@SwsC ic*13x>(4bb?FE`߁720!W{p  ;9-6|sWt Zg4gޕJQtb ytiѻ]۬ 6BH9MXKʀI0k0yEٷi^۰k)XRV(*u׽{:܋2%'b4{48_N6MAa_cǵH^- 77@r:_̋ޙ4dkQ]l*u_&3x+wp*"zlt.:޵#6BN˚e+;GAyBsy#󱾰YBN(&P%Sw2©UҬ% p,K*p1AX\:jL*X5ŧ%:9ߋbm[TK L|/ă9˥7q/E"7j:nbx}%KHj[}K.W%I&C|F)= 'BU", 6<>V4Ee7D%`]«i? C\ZC`b-}j%Љ(2-!.Ym%Ѻl/ϖ'Unɕ=e `;ŕFzFQ@;^9GwLʈV+ YJW',g|j3ovU/oo=[=>7 sn8Z uCXY1} !E.G Y^~V%9̾CX?:5sGA7l>ěr&CThTr acrT E]5 L@‰1Ly{"f,wbțyQ\=),M |]yAXr-܆&a[dw^iw"B9^eBdZ=<ǏLw!|ck Bd&oZ`Uҡu۰zAY sҦbeY[̯t ˲cccisN0#.*?9W6l_$o!$u/d?lt_o +Or#üXl/PujjDcjQk"C 7G루^3 4\WߴqQ?J#3mqų{A{k6K71R[9֎)Hn0BƝ`)@WUƔTWW,Y  lcE9ȫƼ)'3A}O&U314dVIpmL뱚x5V.(8ska"Y65$ԴjfsG56Ƥ_`^MiɑXdr:C?&KrU2ޱH:f'/8szHYjߠxN dAm%9-ہxp4l򕝫CK`k1"W[2WP4SvSRY~4 s6ڑx[1m\LLh)%s#|~XizՔ;Dwߊm4Sͷ;Loo)e/a ,*5G͞v=3.(1 ^k,ݤ:ٺA1L*zL#Wҩ^ԡ8w[mܠ,gY_ wC ڋݺIQY=෭oo[]PCcÄz#r#%'^ZǾS%8?C;?Xt#5 G\]:{ bEIB*dIj5"]4\ܖ%QFpxVtsaVrv# )塳&`h~Y4 Pak *p{$!ΑЙV*)ڇ~i'xkAA49#HAK $ÚKAAq|݂}|}#]#B\B c7d1kiځkkkNv\kP( **9֓n i u& iO36۬h)v 4p yT ɧtNl+x {ͯ xX0? xuQ_O0笠7tq,aQ$f1+7hv oodb߮ww}s#fXC6w#ИN[OT@daeI΢l م7`qp!m(| MΣ4=?֔h@Ե9XOlG0GXWl-F~B~4F8(rR=бEQ)[C=-lcMG[G=fJJ ' pRN)k\x3da經dmn.KgJ˺+p\eu w߮x340031QMLK-.f⹾d+?iK640075U(M+)Kf8"X}m>߯is4WURQ{CePwϻ7E~}/w/xqqqtVUPppir;Õ麄{(h@ٚ1J\AA`E9I (51%97 $xڥY{SHO*D;q1)?c),9paǗ_#?RG_ =8Ƶ$ j0Im8/!c*Nu8_E|:K@p| }ܟ:_%hcG4|G7b MV``[DqI0 F:]\KE$,c]c Y"˃6͂i%1&QtHatBdl%< `G`Q414 f%ytTwV:{ѢD` z[wn RJ'čKR7^nO,.8qpf'9,GrlߩE*Zk8H&NXB1m}1h:DT9g2 0Eܜ .#5sͽ8*fp4AHmHJ|\?{)4&pI{ .@St,K-E>w[‚Di_V߾1ƝN{ON432mJ?%n ؜b6q9x",Hgʼn9bicD#joE췅17bb7I(~cj8<~7Ҩ g*e>%f)gRx~ +N%A47F~U$ʛ /^/ 35Z.hc$BܠY:- ppIK(N80AO< ꧽӬvI7o,*H8v#xV. 0$п0mVD4D#K2(g$#$=3!S[r}zGE4V@aA*",O}5폷v݆?e) :A[H.%.x]amqp@T+鏎t%e$~5aZʆ4/s h\ؖ<ɛN&M eDͅtP3( x/=Cf `^|dQ$t'%x= OLTP mngVQZQUa ė9+ U]: G6ը^RQKDˁc!kz,P[OrTmV #>;vapDОmK6W(d|S1`,'eH9i[\m귷 R9jsv2@2C|2Y|1v[ɍm$d2KT%l39yti.ls[!Dr߶࢒\A.)phY[ɎH+EjUɱP&fsT&PYMR4qB-g9óMĔ%,ovB*&/DW*B=s7Y X[& ,7NEȑ?[X3Hj/m:TG6%DO8øjpÌ JrRjUOfݸ`w笶Qq)7ha@yQ{|qQ8n*b|*ZC2Cd|2j/o^T˪VU蘤[GareA8o01pTKJ%NjzA>okHs G~μtQ"?ɹemPm<^= eX7Ľ?!?5ۿ0E2X`0EWOtS+&|,:,#.n倏 +Ӭ+![? ފ>xVqE'Cǽ&=M;t4ؚ2MAr&Y].Y5 ѣVz6} w}cm޲w  y^_¹>V6>bZ#x]kaqϚg/{C]DR9خshT4$%v8GTD !ryh߫!y4Aֶ?6U7/ԝ%5)[<О$ӚMcfR$<湞5%SB6Dl>dax?7mډq }΅Y' *'?+ܚ7HÖyp*WIX jUOZkyB(zy@KDܴ3Oݑiu{A[CTBډq}tqyAy?DuyBc6,x]RM0W-mԸ*Rhբ0U=xaVنv}!Z>yzJR+yT ;h_(l :dkbĀq@8K< h .PtD:=xEbiVz}}z9;P =ӗOTJDy 3!./{<:/Xd 'HSuz(w y͓^akFE+ BXelmG#kҋ 2D0yvT٤Qh.~1qM~HӪkϸTAv՛Ui)ΣyqGGzx{eȧEzZ(IuV#f7FiFr Ax3<?q Sv<_IDQOP:' oN.q8~תm2x{l7v)^ ;\b>sxz%,NsVl!99 mA ـ}K͹Š%7/al.89|WܡZn$`x!2ŚIz%ǭ5UF khxBϫܮ}"؋LYn2xk<8{zI8Tx92ŚIz%ǭ5UFxN {N''CUxBz7!; 8nA@ 100644 utils.ho3◒J]iTMz(N\x{eHKoOгc[mޯ 2sxڛ8qB$sԣs?}y K;xk<8 ưe,dj4yf?z %x{eHub_!-c x340031QHIM*M/M+Kfx;a&*1k]ìo>*]p *MLK-.f81uV #,(31)'d+8FO2_x{eu#-| I޸y4# x3<S6IRFn*}P:oNmN.Gxڛmnd&) ͎2b~xS  2p`+~.5245N5W^-P`a2CaWaYcambCx{eݧ hJe'}4#^ xxڛ8qBKVr]-6,ƱoG+ &8x) )"p 2-U\Y2 Z~oR"x{eK诜"&NR[nҌ& xڛ8qBUuj:\稔Y,o zx{{+l"%% e) Z%9e]&bB}|&/tUr!E1BYnZq<$4u6W*|3"ԫ=Y1@I,14՚KAA!3MA>%,395>S#X( RE%Ey PakD6~e״= xcBy㭷y-9.wXy|f&& %9z MҵϷjԍ'2Oئbh1YgECg姤 iz2%A;Jì&5` \d;fmP.桫`X9uDc;R9K1)= VSx{eȣ};X"\~>*yQc4# .x{eHКoZm> rXmwpIдh4#( x340031QHIM*M/M+Kf@払PLOS]YIE a9lRϛM8gVqļ̴l3Xg>=[jnk9b+2rRA^~pW^͏+>x3<?R0MWeFynFRP: w@ #ү9=#.kxm7v+r-x{e57IE٩%95 ┢c43K34KsRb5Aɉũ V.H$?D!9#HA jBZf^J|rN~qf^z<܊l@m4Dar0 "UZVZRZtP!Y`)i9%VztN.pv@3lV=ɏu'{inwi4Uwx{eH(/}zi,^/(Ѷ nx8qBHo[&s\}}B7{}o n*xkYe&z."W x!2ͼŤPXzFF@?_xpHR&A; xkY`%&&+K,RUP+/R"R_S (J-)K4ԀBf^JjHC|~RzV jj $}oe G.=bTl9 jT4kx{eHmB֙)g$ ;wxדnҌn.x{eƄᅲ*8c|o׫[̛ijx3<`+ApS.d1,8ycvP:7u3B~̘{ߴbyBx3<S7ck3r0EP:S]ttNkyI)Oo(kxڛ`zJrzx.'>7k)+ + 1, ']',oo.J/%1x{esdS \rof7FiFA xڛ8qBvVo'杬uxV*2U.> ,x1'(char **#+size_t(+,h%zaGx{eȱ9Jk nE,I~af7FiFS!xڛ8qBl1M2;x)fk' 4)mx]Q=KA%Bb!$a ޝF KF.&d!-JR (l?a?!w+v޼yf%tsz·{n79~EQtWMB4,'*Pujj!rJ6@3Tr*Js?O3jqv \Zi.6LZ >Jl 0Fn*ۋ2.=9bԘe 4$̗/ū0 -~,snC d&4~ L\ǧLi d2kN [k%0P=ş's~ 9|'Y6rn-AMc[D;҆{.WU3l=x3DQLpRT;50Aȗ*NoPpwx-b\!*¨Hý_z{#5xølM.ԜT. &V  4zx!224fz;=F`OxWWb1582c$xY[lY4: ٤8&3q&R28$i㶛eӊMab8̌-i4<Z-G+E[ZB+Ox> 8/Tswxg1{~g5 S'M]3VԜ!܇2ڕu~ M< ><:3ڹ9g2p*r[J)i ʙ"׫]59ϴ*ME77 lI*`S5򎤚J֐#/ WlafrlRnVR8fu31:ޭRc YAAU˥ST8u ޛQP)ˆ+GVCPmI4PP N@wYC܊cJn:EZmEE+չ6{ofcbMJ*+Ϭ|^)D& (F"O6qqviC*MYN(*' 𷦖M4joZʱ\5b * _kay'4]+_]0J 4:ikOl ~p:}py+[|pkGb j]h:GI>5J(Q4HƾG5c2Rehـu;bJ1U؊*ZzNJTX*K{!q*u,YewCX9*Uc!ٽ 9Oxu ><ulJh3%%YR>^ [UIo*Wyo Ҏ}8g|XdvK fp]^@aER(%k[HMuH˙xlV&°vNw YWP+@u_7GfzˬR*~@c=y^ 0+Ȕ}Qyȹx{]?) ׷f>>:6j/Y q±(:iąrS sN:dwL o)(Lـn1)ӳ>27_ y\F_VS!N!E ^ak-Ŕɞu71qr)TWwLv&ɧNnŏI lS@bua #"`tї aG#oPżN4SV5(֩ E֓xc cjɝ'v2Ÿ$/,F Zlm5.d' IeV{ֈuNb됒1 uZV)7]#&Q _mbL+ ;$]VIz "ѱ̆b\qXtr1]<yYYil K}1SIRczL*@0YB˧=a1XˤhfkN.\,SQ!2eJ<6px/݀_]rj{ b1g5o] [X>bh08xb uanN>nN!NQ7{s- 0xڻ" .̓e&2m<+%8YG/g>dq ZqIQirI|JjP1e6]6_100644 vmfs_inode.hC]ƓfQhR'~ p x340031QHIM*M/M+Kf86tr{k=`SD!7e$NR6ʖiPyi%z 'f0}z֪OsVB%e&&夂MdffZg+v`g+Ѣ"3eM?Vxڛ8qBKay^7LLY4k -x92zJc6*TœFxMe|W!,C* U?):x{aC"Cp+#dL[ ;uOd!Zӎdjn.%B+<\9^;?wf=100644 vmfs_inode.h^ĕ43贮O=fbɌ[~HI3 :x \&anN>n>y)vU9 j IxO?O?W+M>P\YWl . i 4"3Pd^ ]d7g*Ln쪡k A*lpxۢFgCs<8'Qqx82`,}zådRTNKPEySΆDhOOgNF% rxڛ8qBG1;qeK|0p,%Y) Nxڛ" ܘ4&/MXPXSIG!3/-_.-'1x._V!-8;)>)*]^A$JIjCFR9: yyyP\ J0ɺyyJk e6 2*x{a|= +g ޜn,Lu,'z-hi+< ZI|GU8100644 vmfs_inode.hC?-LXiO6~46vx{s{*4 ̼TM.9$8'MqrsBńqZgV&dihg(hii%ƻx;x{FsR4m 6?g&*lxڻ}{*{8e(~8x;{FRiBf>NK-OO ijnvlwx{& \Y?MR9 Rx4,+  &23Show!!0 ojlCxڻ=U{C+l$JFx82`,}zådRTNKPEyh=o GtQ͠#bx 5D`<ـ=BDI)xڻi2xM1N-}.4od'ˋOڬ/ۻ (x{e/HQ~ߚ[U !dex+ ,`xMЊD:9y խxM100644 manifest.mk16RCRd]p(0]QNia8c,x"Aer Vr~^qBYnZq<(h[s)(@D2SR`zjoԒҢ<4{4]bz9`&LVRe0nvpe4&Nqx"SbCsiQQj^BA~qfIf~BfBZfN>HE~ZZ9#HA+3/?%5>4m>6?V )x*E8)';>'$DܜɒļYq Θ \{R3x*BxE,2LE% i9 %E%E٤rAܴx *QJ+.< sQj=ғٝ"ȰOfld)άJÙ$-P~xU10 E%& x.=@; [24\B p4C!rr[jvD9bڀP޵g>Xn\;ZP=TalJp =U̥2FJ={љbnIz:[ 1퐡6 !ԑKFw1t2&4(ٴ7L!z8iQ i`x$2L.,A+1 P$ ړFNM x340031QHIM*M/M+Kf86tr{k=`SD!7e$NR6ʖiPyi%z f3w+gﯥKURMʊRSsS*sU87XnEvIsg)`Pڷ mnrwJ A%e&&夂wXoqSSܿ0Fe0xfP pxD'100644 debugvmfs.c -s Qlu}',(dA6Z I5IiPJxڝk`NW vO[ݚt[[D:/$d.%[ 0 ?7=(ɛq &i;As~<="aeA֞tUW֫Ճlzf9M6Th\Q0E0JYKX11p3VT2Ov5B=QWWD{X4b^k=i`Xj(b%Am&>⫠Vp&2j5/D5ttz45 P9uF[ciNV~jv6;_E=bz{ Q9G Rv6Z*G>ohu R/^LǂUCd 3捕u7#}HF.Z xcmоTm0;Lmg==\ >c|aoI:n;x ,KX5ypx}vB9e: ei@dGUF: ux+/,5>D/454| lx;Wt=͟o.Mxqc~?e}s9=dמgh``fbPVYXpU=|35߾uдe⟶ɫb\Ӷ৹e꘎JJdCҊ2'J lƄa_W#+HM,*IJM,ZfsjέW>'l xZtM͊"+AHx輁U ,7(51E#X,*(-/,I OdۆV f&ɢRѓ%]% n %E%E Z\ei@Tc&j R@Jzr8Kf#b @ҚKAAduJjRiz|NjYjDF.-'1XI(h}P5W-Ajqi9ŕ% e(ܔTִ|*p7Ԝ($<\! 啅2`">3/-_o9/q% l/0f ͋3:9'֛T儐42xkt>gA{<2~;]xk0zga1pNYn|QjqjQYFZy?9&qDNjb1\B xcV9d Ax{gxpCrf^rNiJMiif>؜,&S_Vkl^)j[(-/,I Ou,fFAwl:7Oe´gfn7>6lmx;opCNf7Q#x;w,JX670QETx۵q^  anN>nN!NQ>A9mⰐ s]e% Axڛq& 'XlopL#Px{nZ{!rJjZf^B[pOo|_H|g ܬl<6+rT&ԊԼ/8\'p*L~Ϧ8y-e9rOvRNͥ ȭ 3v\˭ S_tҀ̂bM+RSR5V8LCbx1o>"5%,3ymM\Z bڱ @\ E%EyL>9YLJ,?3E,78Ys,hMS . {tl0x{=A})ͪ%lRxkÿa:{li x]vQ!\9eEũEeiźv@ )0͑<AE%| 3&&#dձoOfy%a:$):~xax!"6I{1GskOxڻާd#ix340031QMLK-.fPvU?˞cW3(+M+M+-NKf0RMrM?iCO1T0WT1a:}d]f,Cxڛ2eȒ9wvWs1d)x% +x340031QHIM*M/M+Kfp?\kW)KW\n=Jw:/!4071/3-D/7`l 4TpJ)TYQjbJrn X%}  M].il4E JV>0]QNia8ĢĤT[ܛ h2,|pCah[ۣܝ"!qPEeEI9 xV%)7ugʴWO [bx"`#³$)N> 6'*[3m<7`cWb b(x{{ㆅohymͺ(f Ě )x^ ㆷ֓MlL7aTF xi18/7)m/ZU xhb ~fX K2&sl0NONgOIRPOIU/-)(-)VO6/HUH,KSQH+Uqqigǃr򓳋M4-ss%[4+w '3lx[bq|9,#W]x˟^כjռM/=W[xڛβ#ojEj俌RlTx V ]/חlޓj)Wx340031QMLK-.fx?[>ΣmMgaQVVV5>D/454| (x{Ȳe3lj>;_}i- OeaQP_/_z*_M|jib izei q.zŶFdґf$j便=vUh2]O:[7 xe&100644 .gitignoreϓ B?Ǎ趛uf& 8Hf̓SD(40000 fsck.vmfs ]/חlޓj/7&ckJ$#9X>wXoqSSܿKEy5x{q-M 398 zxڻ< t=&9Tnk Lsxڛ2eRF.mUO$WF]yD~d7 wx{q=/- {S?' V vxڻ0q\ &/al+0d} z“ 5E$rSSJ : \"xڛ2eLFӁ{lSg3=ksߙ Sx;7AVU)vܓh<-PHBsXmZR[xt_iC-pNYn|QjqjQYFZy&w43T"'5.1Y_`~u&T?xڻtLi9@NYn|QjbFZ9 H($&<فOQas8NnJ@Yf.ɹ<)MV4h!z}x z^l+v̒ͯw0gOc)L,R )<ؕSR2Ӹ*7Mx;/[l+8' qFx--~.vԼ4.IX8x چ>Dїn[LJRדlxH1irG~U7cnܜ1F*DTO!$#R!7$R!9?$13V@k qs@/2x 2k|!󹈕"nT~ײFx340031QHIM*M/M+KfP53^U,!{ ѕT0g=znN" 9#Pyi%z f3w+gﯥKURMʊRSsS+(=2伧O[|DSoe Ez **K,LLIy@;/_q%z\U ~!DW,xڛ2e鄾Vѩn/ xx3<0c_~{;*}3ZPbMC %xӟ| [ rxa|h@r~^YjQI|RN~rv|fd6ɋ&bfQ(.MPH,V(T(U*$pe*&oc+gO,M,RPne_ZRPZR(P5$>9Cbs,\ $=$CZl-x;ftpl"Llx;lx`C+wW' P#x 2ο\ R)n?Fz/x]؜^{Ģ+cc Qx[̸nC\Be7{7K˷RPP(M+OOΎOO-khifŗ(hi%攦(d4'ښ3MK+)QeN.>Yz|J֤̔2}`F,`xڛ2eLF/Q~ZRbvjO0y-cr xc9Ո;vl7x;qc$HM97\ueChx۵w/ AŔԲ̒T ̼T]b]\];,A^}0_x'x7x_`6`(y$h"axزqCDNYn|yQfIFf^~J]ZPps/-!e?x92yi#ľJкq4e6FS?]捵w clLx酪Ziji+-7mx[T7nCdj^iBYnZq|RN~rv|IeAh&̦Y;yIRfInbA|f^ZFif^Q|fYbNiHJ+)`lL&*(@6;>b-1.x`B«vPsĚKAɑf9 RxڻFuCUn! %} &`|CL)>)*XSAM!-8;"1Srɳ 3JR&3N,M,K˟(:@HfAܴxdVRnd}!Y\)PH85R,I,o g>7x[:Gu$ʂ3y'1J+U(M+OOΎI*hQ mSqx 2Ы@^oRTFM?x3<}B~Iv\*4P1z$2ً̔ ?:6nx;fkos;E%=)x[TwtJ̛n6ee.Ŀ9S]v& C.x 2{^Vt(3FuP=x{q͹s\_ /Y[!ixڻ0qv>w6odff'VDŽ7Q}6€gM܆jt '/al+0d} z“ 5E$rSSJ : $2&kY[Ofl nx;qc%6>dnz=Nf_?L\xڛ2eLF9sKr/jo>VqksIxI9^WZ4y G*Yrӊ2Kr Kr &;\ iźviII֓X''%[O6`+#:k5dDr 1)POj&pS.b59,6Kpf!7Y3h3 <Nl:xz+tCVu)e2x 2rG ⓭liXx9ae[9IQzF#)u3BZ> jΑOy_Ůl]x[:Guf',~{x۠]~C"7OZJVA(Nڜِϛť4@,?47U!)$7XAK+3D,78RJry-ɥG%+kbx.F~[!1xڛ2eȋy9: uɻd7E +1x3<S^1xGRCP/dIzR"+żj$z`x;f4AC)v\f搌 6' g_ ! }xڛ]>s2&yYy'ke|l̛pn~ͯ8y R&'))*TB-Ys)(('e&ė(hM6Ue+QL|krӦ΂5:  j ZXSJ*'Z//6x iU/ aur钑 l;xI=+rM|VU4j豄100644 vmfs_bitmap.hFHOl*eKOJB%$koKxڛ2eGd JtߺRnb =x/'100644 debugvmfs.c]I"p'Prxڛ2e3 Bl[.\81\ad7 ^kx3<$=lYհ 3P<qC놗m [x;fW{C)v͉'azx=i`EP%\"&w'  'p! c$LcNxڛ2eҶiO\둕jR{P|e Gx3<>L*<#X4kK_dّPN}Y lRX/_i^dx;ftHsTVә&NKQOLNQHocs;n70O'ӯslPx;UcT͏X(v"xڛa>f,ͺLy6 N3 Wxڛ2eLFU|42Tu䵌9 Mxtg:ްn hf7A*x100644 vmfs_lvm.h<Ziyskw+\[""Kx;Cm"IRfInbAq|iqbzWpF~BqIbIfqIfrBbR~iTXf ^d-[1Gd+dMg~$w~ono2ZI=Fa:0wr?2 \X+~rB68@Gs)-n.Qyz$ˋ2#f)1l烇ҤZSIJKJ䱷#E#Q@2vO5yCOj9 ;Y2^̃D$##@㷞[,L^lgaH]l|.Jt H%Ƅߚ <дajgJ>氊S1Iҧ`~ҵþU,r?_tf^U JVҏ*K {`<"Rf4D3S=aVv!_HmY6cK6N, o .ߴ{mGEFj+|ϸzKlrqPvIzwe *Jvo9:L%[e R_~T(s׏ӌ{hDAJ|p秭f {M ϷHJsw.u M}wiLDVU5˳{ 2x]F,Jnă5\tc0t{$]i~k')ľ%?OߓL= 4בr==7T`wڿT~20@8ƗKfǂFR8c{&_ULΟ8Z2e॑#s&QqKY$D);%~g𥖿8xrmlOF HXFKY. eS+CrZ!ݔĄlẅ́/аsP?%ee=juo{ފEgc Yc2NWf~앬QCAX*~.@YbgjY/Cm,ĐaUMrՐ$Y&PפQ ئSU4SN*L'`5gr48OC˺]J9Jap[C[,* T,ݱP݈͑T"L<&[<-!駐7\x$9량DŜc7ƾeC&."y.\ch]FD ZaU™+]rAۯۈ; 5NS1y Ks'ꟲ-6:wq`rm Hxd77bb7_-L#]2Ż%E&ΞY 1:j;N|:Ѯ˾| jN Λy}|s=윦]ZfFL8B^Z~%nb,qwl]yw`- t/0sMJ"S@sXX+pz{gqVæ"ofPUi| z}1Y:8XU),f5OɚZWf^:꠰L1cƦFQfj#YqRpVtm2@1ԯvKh4=~(f٢xڻ\cc~̜Լ/RKRsJsSKJKJRrӊ!% Z0n|2XaFbBy% po`=Zkg]c7PAqQûnwLI?4Zy-.meBZ-'[L֡r˷ .8 (H!*+3ڮ.*5tY7RzB  ]y{XP LOp<9hBOUNGlu}ıtsXہd#`"+0)xzA\>eR R2uϿ5zBrc`CŹ5L/jry\B[̐㉦*CIM.8ЄgM;]ٽ-dNQY`69Bؒxڛ2eH4NU%.Q?R)<ٍ2 x6(Z?."ǰ ^xڛ~{-e&Oc̒͜Z< 0cs'錓IM~.%4dKi E%EydvLx 2@c@zSBFFx{qmO̕|{Ώ2%4xhvOSmE5rӊ2Kr 3RSRK&?cW͡CփCir66U8e^rhQ%ʩCf)gD&83/-(e.ǥ.K]2+t!on-tNntFB8G{Hs)gD1-簪/dX!. wqOZ%*xÁ{::ei25[]3o[r QEo 2WaL- 4C>$} ŮEHD0WaPo[WW;x 2Kمn OF j5x{qGc|W؛|򕫫 /xڭVoE5 aCMk8!u5q\gwv\;vMT ?SYlŻGRYR8"Z J\"$.fvֻ&8 m|y³ʗ=ՙAzWWB;qpt+ k겍p!k`8a/)вut@&[r].65c9Z}i6sZ ":YP\܉\#+sa_3[R`ڴڇ0039nIlؐgԫM^_{OÓxе? [\ਐǁN>!j?ó(eDY=J+qͫtjDWizvxDCF&?I#fY11f0l) 5[ CsÌҝ]¸<6D*CAnZȾҳ+w+mDbQ%^9sAEXzJ4[i o#0laD7|v;vc V\6y]A]WU-lo BRxmh?]3X/|vv9'FwϨ{pψȐ.CzsqCyZra#Q8Zf(7]MunN;aj4?!lb* &,׎-fQja39R:w5D첕 ' s6}Vס^qA/y >//M1~)#ۃ&=^Fg8t [ dTKz~M!xdͲ-H#&&w | n~B)q7FAwJ>ĕ{*V1I:̖4:ih I$~rF$,f=׋ K9T[vQt\N`GX∅m4+c^HjZ@*=/rZm6/(+Zk!Zd6ޮ=F};,rmOAK9e U@`!P`՚ `_'?ỏ#% c4I}Ea%J7}:ԙ|Mz60+59]Fv>N ""): J +}U] (WC &(7CCC ٙ, s'pjCU);yD S,:kV? . \7YC m8xCy7 x340031QHIM*M/M+Kf8}*g iB?N*cAAc['N[yWꇿ@&ef3ͼw񯜁 .TI5*+JMLIMZj'w{r?aoMQҾn(Lmu{SZX$$HWxڻti L^Ozme|(H@_ !x;~q ߔ\SKrӊsr354-ʹb]ԲɁ27멈LKڼ8aMbQzY4UU V Dyj`Ն: i9œ'mސ"6(nxڛ}&162xۡMe,V X2sR+KRs7OdMq.r<::xҡA8#<,?'>)$7`lVe^ 47U"YMs5zB>.T=xP){UL80x340031QMLK-.fx?[>ΣmMgaQVVVpZrO`oՙ} /Gx340031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd i{5<>ϹEI|G'uxfvtá1,7 "?۴~87OH*2Kr 9L6.!uێw7X{JW-w.%,39UjՍ%{p6SsEy%@'m-srĹnn= E/Jm{)fۖ 1´̜TyzTP(cӞLM1e0LȻvĒng+WŠ(E9^MR|vES+=FԤ* .n0FVXT쌓a.kW&eN`f28nv K_ySP]\}] ;kk/bzSrۿwqoNzG N䉒OQΝXҶ%2S@~o{߂OWodl= JAlk1ߋ<.Y]NY.д͒[ .wx2F|׌T:;A4fbφȪrSKSKJϳSxyxͻ4*` s_rӫG[6BVZS 2-7Hw}W g~Xf06>$JHp- 7Y~O10zxu_KP)kVSxi,(2GwFn>@x)@_]3#s*lwskY; =ѕ-~N}D #34h_) @M N)64 Uؤ.d 6QΤT >iaj n7ܹ)T M*k-lpʕ#DXⅿysusQXl a51XOpEQt#F(eHpCڔ['wu-INKC%PRYuk}~c^?ET U:6DJ-Cn 5$*aM`\4dC_fXUIBi6/`Gi)X:pDzW>~#$x;Q^//OnjnqjFRiRN+M+b*ai HvfNj|zj PP#I.Mz]6{hV,(JMLH9y: PdA{l&WWL,XY#E'9?D!9#HA+/17uD[ .0-_f^~J*H9Ta fi@[)WUMxkY!ys1.Բ̒T b]\];XUoAo7xYvSZf/><kqxڛwUwCbq&dx.Ka>U3Srӊと(W\*QJ+F>xۥЭſ 5O!Q-XAK,78J`|FrFbVAbIFD*'1DOcJxVhVK%,39UAKKAA,78>,_dmcb2t6a)xؾqC gf^~J]Z/$>3UALAKJiN6cΗZ_dXsM>|t6mFvԼ4.gf'xtMiC7SZ); ~o /QxaqrCsQjbIBBY~NinBqIQirIiQ>WYnZqlKX}<.d7 %lx{qK'$oXs)S3]7,y 5xڻkztdSx7_A[fxڛ2e֧!S=Hodd7Y^xťl_x' hvxڻk:Sf}Lvbױjgûqs@6xڛ2eH܏OMB9g_ Y>ٍ2U x3<hyB4hD猤MmёPvip*q0u˹5I= |QxۡOe7:7(gAp exڛ?UgfF\5E 0-x |7MY2%R 5l0>x;\$2P#iT>O1%&9l IV+;4Õsv_ <&x lۿ\iXoZ+ۓlyxF&9^BRJYyu 100644 vmfs_fs.huX4`]k0_kv mx 2n{̓FqJx340031QHIM*M/M+Kf8"6U~I3DWVRQ ȳys67?^-UZ\pn6}ǿrZ*DP%(51%97h#+-M{G4E JV>0]QNia8ĢĤTf>)uРu靦 <Z[+xڻti J*im&Z x 2D,j9ylDɼ,F x3<[e;1t@]%+>7h< ʑPah˴:R~Nk{k exrDif=k<8@xڛs[nfC͕\7Mg!19WPhbAE0"8&¤}x 2JH6$ <2F _x{qfĄ42rlwk )xڻ-RzCVΉ\ H -h^7&mSb? x 25JܡQ;$׀F|kgx̀|,ZBI Lס\ x{)}Ot>: \֓8'l8+ds v<c~- ̼c-M;e'Y*{W4sx q.>txp'׸K%nlxF:'==[V4Kv+100644 vmfs_lvm.hU{gzEX&WscUx:O0C&w漡czG=a / a𥯵jkHxc Sx3,R|ןy&&ΝO3y3[w՛B)z<ƍO1&]!')(ǧe0=T:&w'>蘖-`YQFjbQIRjb^2CIY~)*]C5v KO>T"R '??%0f>]X;s'!S 42O?Izv.dU%)%@ǭ*5}\ם,.XUid~5[g"#+r,T*^7Z_//K:Wc'o-_xc ͹}v0_]\ՉD&+sNM=o޹h/?'&1[[V0&MtΥTi240031Q(M+)`h*iO[2E+ M-ILI,IKf.Y/a"4^v I,j]/re`Wtd-e9@ "'2q&Qra5/z;5xzB«vPsĚKAɑӯ+K 6KAִ/=M/^ĒK100644 vmfs_volume.h t_,U/P ~A6XlnxkP!yss5)}x}{C䉲ʓd6`"xڻ}k+ZZ]NYf1VF8o q/ eb8ӊKҊ7KfdLSИT'PH9FF!>0y]]T=̬+jxڻ}+pĒTD`⒢ҢT-}ܴx *QЂ1j5ܜ\RPP@RVlKV1 (k^TZc R^ (OK_K 5茴̜\#2JhyF1δb];C4'\'>Yj,!z}PZzɷD73)~fy#9'8Ujd~Ugccx>}@NYn|QjbFZYUQ$Z^Y *69mz~ V/xڛ2eT#=n! ֨x340031QHIM*M/M+Kfp\q9#HdjnFז|Cte%% iK_^8%G7&s s2RKrf޻W@_KB&$-5VPzdr哻ŽyO0{(Ai7=)-,UTX gjtF9y?!$:ZxòeHʇ'̻=.ti? x340031QMLK-.f04 r1w6' MMrӊusr5\01(.dhxoGpqw aFpg x  g.SNw 7Nf:\x ِii.K5喍ϫ:lHxڻf`!O""+xòeLF[N,>>ղ7N`MY䵌^xk,3_JjYfrj|a5Y} l+xڛg!KXs {ox[{[VvԼ4.2"x2EDA/=$3=/(ɼNmviFόXl#'Hxڛ2eLFiUW}Д{=3Vks$Y`x;xQD!%54,7X/٤(=ýq,>/Qxڛ}q ߔErӊsr35Ҋu퀜|ⓣy6<;xSVA| 3[h1#ݴ7 ~^uj}':{/ŬI)i&YbxFO9Tç++}100644 vmfs_fs.h *gf + d^TxyFg_c R"tHuS9gq`FmRHc-:geoUjվ100644 vmfs_lvm.hU{gzEX&WscH6x^[1-&]mw)=L^i7^9100644 vmfs_volume.h3e}N< *mxlEЍ057H@51>NBA88c-'==[V4Kv+들.eN׺o#.vNI)Z)/ xڻukVZ]NY]Jj^iifu9 ;xڛ2eLFCfLRfx1y-c˴ AlPx;ɿC%.{f Pkix{oqb<2"xڛ2eLF١9N<wksg,x{o|CfGj<2ɓ' KN|N8d Xx;ɿoC0.Lʩy)i\O7xڻuk-ޜT kVAPZ7_{xr28V3<HB?K|E240000 fsck.vmfsZBQ#;XE^j/$m'Dd9MXemw#{q11x/'100644 debugvmfs.cүHY:}W p'QEx;~) 9 R4rr';JOfO1ۼ!Eq tx340031QMLK-.fx?[>ΣmMgaQVVV̐2Ey6 8T  :x;Wzd=͟M~fy 9 XExFO9|Z THg100644 vmfs_fs.hl5)tW9_z qx;u}JYnZq|NYn|RPPP0z3<#+PVn2&]'opxV%a5?YnZq|NYn||% x340031QMLK-.fPvU?˞cW3(+M+M+-NKfXϡ,uӘ`i0A թ&j/6/A.>xkʛӘ% 5oqfEL^8 x928,2Qyv'9KFScGg #M FNzlzAx;xQD!%54,7X/an[R5:E?Zre,x L\Bl"vF$⓭lrPx[ηa,<ϰJOc1GF#l>x{i~|CR6'- x :ܠݦ2a[:kZol# xcCȄZ[x ]J0UC /Ci100644 vmfs_volume.hdql`2Q.Ɋ6Wxc)HęM뼨>ɹ߅=Y4_xڻĹAy3gXY4]xgtqXMbQ\vir(*vQ Mbx ޡ 2P 33ll^x q.>txp'׸K%nl@x ^9%Q7hlҵln :x;qcC:ٍ0Y˞޸&q9Z3 51x{Gg{f̼Y$9?D!9#HA+-3'5/1751kg245\[ܴx 3>(5$UCGL]bMM]b mpy #R Ledj|QXjt!fXw%xۣsE{CbYnZq|Y~Ninj|UͥNNl*8ѵ,-e{Pxڛ2eBUa>fgZGW} X xڛݮ%Z~:E0`^.;6k2&"#_xڛ2eB]"v/yis+&+ xkjڐ9fLxP\ & aede$)xEp8,2Qyv'9KFS^9%Q7hlҵlZ#xkjКϚ6QO|\yZ83 ` xڛ2eBȚ*KO`x'f+ͣ ZlYxk}s9{'/"Nx\-k M\ȴ ptcxkyr JY&f՞lf:d6Ul1 >{Ý1M6fw\ P_Nx7\eD,)=Hg\pP*u4LoN6Fv+bx~D}2F&Fɽ>`lK j8hLcJqM2ksdeFͽlvx;xqBH) ,JnHI0 e gMx+ɚ61A ^xv\XQ6ZX,7Rp8kn7h8b5Q40000 fsck.vmfsكpm1΢Ðؓj/$o?j̤5l]buX(2 ،Qz6RȚ4Bxڛ2eBAݫnqtī>`%# ,xڛ2e+KWKD'u_>;[ (x8\Ҥ@Y# nduuVC{p)Fm%희ÓlOFx\$?[g9|p5 x[}2F&Fɽ̒**!A!'*N>̇SVrK9U ܗʌ֛{ y. x;xqB/jxr2Sob˰ rx340031QMLK-.f^ۚV5  !rӊӊƇ=s_9cD@x+M+O+NˏwvqtVUu s QRр5c*@z\C=\s2@b\+x;qCD!71/3-D/7A"7.79(Ae +3x340031QMLK-.fhh^SPQz3e֏Jz2(+M+M+-NKf0RMrM?iCO1T0WT1a:}d]f(-x+M+M+-Nr r VUL*J($m xU}#^ckFi~ "3Uuu: 1l6f:SZ9[X"9}1 xix۪>M},+٢7/8x0'100644 manifest.mkp mi{״S'"?d"xKp {x340031QMLK-.fPEݢʍa eeeiźiũz f}^JZ7'9);F3VϛlR-Nx+M+M+-NqqqtVUPCE4`U9+r r+LIp =x۪Gu6&Լ4. CM}g7G`ɕ̑Yfy xڛ2eC9ocCQC\]nx340031QMLO-Kf~s?=UjfCļ̴l%.d5Kdv[rx{6!̼ҔTҒ̜b 6 &i$(hn>(%PuxMLO-ˏwvqtVUL*M+Kx3K}xX\1''j Ĺf9Gcpq8Loq{E #40000 vmfs-fusemj%xÞ?Njf(xۣGunV`zO^ƚ am`[$ Ux340031QMLK-.fxY'2o 4niQVVVZ`xb(+(ac4lujڋߋX/8x+M+M+-NqqqtVUPp vhr;rFW V{/fx;qDA/=$3=/(3Ffn^T&m~ TchP0tSHRO_aE,*q MNMIeY[~XΏfFe>T_+CU 1b  ijY WG_WS\׾MA0GmP!. ??/o[guӯVʛ*$e=u8gg]o>eTa!@Sr 9Ďɫ1dږtj[JjRizYnZ^2Úݒkt~ZQ#d &.qVj&9u'PizPO<:Ɏu;#$4n *| UZTc<ٲzF;B`m׌7P5E)ɹ) E JL|r79)fe0([YtQ^G;EB&{˖e3KwYKW 艜}sKK2sA_Xзܜ)y= /馕cxb(:ޓ.0u~{7nS9bծn(u@}Oܻ-}}lŤ(bv#LAֲ'7n=I\kLf>( x;{GDA/=$3=/(RbJKlt{Ln2f8;QLRro_lhl>`(&3g QVV#=y~/5R_n~::.~h\\*@A~H)I-/-Q ǻF8C((519Cx/2XTSGE V 7Taxڛ\yCV9IeiśX6/ecQp qt \ũ ':x;xqB\ m6GK|ԓN2X dx+ Lx340031QMLK-.fOmroK#Nڝ`!DYYnZq|Zqr^2g+'"=E!x+M+O+NˏwvqtVUu s QRр5chx x340031QMLO-Kf~s?=UjfCļ̴l+fN*eھz ħx340031QMLK-.f,)t^y-cu%z1B릕%3qx)&k&|4oJ*J+*0[>obbw+d^xt^xڅT͏Dn(lmZ ImťrolfC[Gj8[g4GzS_oƎ983o~{{}ǮOql ن|G4jزGol|퉦a>{,q}] ?󌑍tTnkX*aAȊeUk%8 <1<ۺ ûz&t NP47z5 J1}N&rٖ(EVJ|3K>tqMкAg8ԫztFΣ]nX 켜FSpC}g;v=k+dg;\jwєr{`7޿aJ~y'is/u3!7v% m%&)Sʈ/GлɃe~Ϩ2; 2}^E:*N>.AA@4̜"̼Hf@_THSs2+_p~y(;~r#NK8'O|_xP~fnbzj^B ԃ&2|Xh'#<@7x1'#\U 1 c 4#jd&ixڛ3gC9HĉĢSY[}r廯m bpZ%xګ,ϖZ4QOS,7X78U qxڻ~Q}C'P@{oBfnbzjV>dF561xڛ3gBHgi,G.ZRricV) 2kxڻDm|vN>.CX׳- rx \͌ ns֥yq:ՍupѸx=1 >ĺPkD_/:]E gK bAE&ĺPD 1^Y\.Ù  9I'3lVmQ :");/6xڛ)[f>̛粝eyp>Wk|ZfN<ں`UPOMQWSP/-)(-(J9LUA,89OqQ"fx-\fdCɉ<2\\(痖l{ 4x[.3Mv>kIQi^rbIzAbIzNj^:aeS(HUH2̴ 9722go6b;Ĩ=!F93X/&%\xǻwBy/W%c CKxT*&0Y}M$shell sed '1{s/(/./;s/)//;q;}' $(man3 }<P,1ikxǻwBHɄS,wO)jjun,ců x۩HuC+U6`IHw5xǻwB7WJ$ͷKhY`tX; L$xڻ^uC+UQ#ʘ&3걦'gmbUb\RPnX]o]o]h]?[DdN͍Y7O?Ȩ0VPbB!aFDŽ62$x{MuC3^g8A3x9 \ ~ t.7L*8FpcclX5q)(ЖXx340031QMLK-.fOmroK#Nڝ`!DYYnZq|Zqr^2ɂG=ٱwgM]Şo xK 0 }R0k".bLbѶ"<p2:Bd52&Ҭ'uP@LdRx/\x;{wBb)37ER|l [wf\l!9%"eΩs͵lUgH WJ:.!gc<1j ]o_?v>zF?8,4]YJṳJkćIs2idMo]z8مFk^ >,қur*'#DH#!.砿f<,p@.61,OeMGh vmCB:1hy`nT*o&>2dyWps'47 v{bHňxtu‚J ˆ(o 2.|zu9 3:u%ihAe9tя-QZYVz0}ܡ!$bX_m1p4*&wG#sal .(S#_7R6[)rQȎy5vN~f.#@ ڭxky^3U9SҖl`mh5&l+~a8@Y1vz>+M:WjoգާWDPѼs~i c( Z4&QRg0~Xv.s:S`JpK-)NnaFAQjZf&WqRf^Jfu*0qĢTDƷU44A\ [ZSSN!9?/-3]/919#U --J]$r ~xk헙Χo`e0dYFPOxkDH#L`&Ei ME9ɉ9\ [8)3/%"JS$ÕXX_WH,JMDh*l^\C]lxiży s5|xO \e}_+ ).8p1IQGʛ|t#n4|#O W\K?;1!Qx;%xHpAV̼ĜX1ZTx˾m^ckLTK"x7 \yb/G py+|IW4ۭr}x̕-xڥiw3W̡JھT.=mj %M!]j!-I.Z/=}̾ݙ'Mf[7֓0cB&r8,&ІF;9 d5q05gE)>p5ͧRB:ukt}+ 70[& LasXK^o; x'܁[ bH ={%s3Y݃ "4 $vxg{ˇ2(Q3RV kv74xl*BI\"NX&1|5390Zvǣޮo2v}kk#|VB303ݭu; \o q yf,aԹ/aj&+I[ETVa0XLKnrD#in\R0jyaPFtV1p'07>}foB!/eR z.{K=vH89 n=\rqpDT2'q!fm'mI?#^W.,h0\k{_^`>k-_ͧt5jW%Šw-RHSϡr1'Gw&W% #tkWY8^d6JplJ^:;Bm(_kY+d2_M;UBwrxp*Eyer,p,&6 &a‘fxU*'w/0W!6I3 U޵0l-}ZK qF ck;q΄HPYyHLE , h4%w(| ( )hK@x5C-g?zWl4q0RkȯD`6*n4qo z:b;!c<*V؉2yņeVVaP>B]Q?PY?i_%c[J ʧeΊbnY DYAbyOJzCiq0SJ>6lEZ.g!bĐ/~H1GfhQM:Ie|(jQR9` hUXY5Aoڕ]дBD%Xnkl6uZvAQR_ rKT_&Gmsב]&lMM>6q:V=W Slr/o/gd-8Zdp*\b~ %BPU;ZMVY٪.O: ba)-G~!ػ\RN*Y=5CX{鑋ͩ uo@ml׻2?}HՏ4TL&#-yӮZ~+Pj9*G[&|ԓZU nsrypl4ΰ.g"#4E“~s>s+j! fP(͘w'<9whߓkڴ;_:K\pͦxImy"c7UYCT,>@@W¼=T~ը"f{VO8h=!ۏmޤK^uOn>^RE)+KLd?bnrMw.⋝GI鲏 YMخGiD`< Ӑu@M}k=Gn\1O.`u Z5Cm} K8 Cm|~E7j%J}M\d6T32+jEֵr5b {tce\4( -7jS"7ƞ9B72ȄTxS[mBs/x y6R; qfg@ B^_di )!}@q۾p:'ֵLhG&.7Tt2/3c(>`xڛ;wAVauwZ1Kk ,x; cY_[u(׿04c,$E0&Hٻ+ W/6H Qx;~qY &=Yr")dn0&ϕmoV+f n)/V.ǷyDUӂ̊Ĝ< --M4`W`(W̪TMu70WTLKIMSu w swq lʦ69$8{bQzYtff>&'EOxڛzi '/5T:u\)GenL^( <_.q3#7O7w(]PPH*MSUiE99I9řU rӊs R4ˢ3curӋ5714fxk[ᄡrfZJjB[pxgp{kD_Hㆪlʩy)i_Xpx! I{6Y_)(?il~xڛ|Viͯ72$i9x!  δB%J̳(GxG#! 8constructor)) void init^returnQ.naxڛ;wC+z;\oiK5X lix;Wtd++Fx] &100644 .gitignore1-3ToA QdI#E&6 @F}!r҄-p{Cfsck]Q]$x @}О-)\JY/^/8|{xvGh\,E3lVmQ >1:C^ |` xڻ/SPZSHKL/-J rMʒ"mМ|lfZ^jFrNjbO@6ɳt'd3xr*zGx27O`i9%E%P%'&gB kWYjQqf~L[4A crUjrFBkP ~PM;.]X@MJKL,̋bvP tB0"'$ M;( l9n$ݓ' p#i)h;9CxF4X' ~' ;5{Tx뗼$=aFfp  s uqm '*q rx]!371=h!#J&3NN"x+z]|\}\|݃5'f1p+-)˷Rp *h";&?3"&TQ[CMƬX&gTՇKg"fO@F̴B ̜"5`nzG/Yԃ[`$R˹8S2@"BMBi\UnnLWjP^_Bb%ܯs =xd P/˗['63N$|(z4!=CuGXOAŪ;Ӹ*{:u.l1QPX7% k100644 vmfs_lvm.h, c Ԝ @k  OB$xڛzi '/5T:u\)GenL^( <_.q3#7O7w(6-RHx{si 5Jl2tZjQ|bNN~FRNv|qfU:›}4ELx["wn}Ģ͌ZB[/ x]RkAffH19LnصmEuHh`*m-Cɦ쏊Z?`Oq?ŋ{gf%I;00;÷Taf_sX|zHMf54rlݪZv*廕7j*zmZ VlT7fį2w q:u"avpHݶO!>٥fP*kL7YsqpZ!^`tYQVogGlmf5.6 F$ (8,^f L8\T袴ȞIA? A۲VmkIUĜ3ȍ<23Ücc'@>Y.b,< ;x9ϔ a2r~%)>I:[d/ ig% M72I05P, *0H1rrsWY~fBYnZq|NYn|2Hvvi-xڛ{GDA/=$3=/(a)b5),6M~sD&:7RrֳW{ 'Ųbe3JaUmfnpᚶ)KQ~9GAu\T8T>9?/-3(U/7cv^; .|T6T]JjRizYnZ^2Cz}K'ʭzdұ*rE)ɹ)@5S5rr*[qA#ɨ@F䀘2׫|htwEEq.`n-N.`TXcCsI]wzlҒ ǬٗDH}, DQt؍em+~`ۺ̍֫b ɩ2&=8jȯiũ@5`;a"h\*=uL "u|\$oyOg^^W-KI<8ysȚW{=[+ m?4ّV:89h_=pi//Ъ8X2[.ס&.ـR" +Z UZwKNxnd. V /~MrYSݧ9S :y?JV2g9C6gۯk/Mgf9r\=~<]NL>e9@Skm=+ԚnJRK5M(9x3WDA/=$3=/(p~|GS<\fWvf&sg?(ZwEO=Gda |PSC]Ze#[Nj,-|r~^ZfziQ^n6v͇77^TC Ԥܴbd ^<=]4z+f,_MVa4pMLO-*1lgt=C#I]!0kIE)ɹ)@E<={mqZBL.b42獟{zY,qO]L @5kt&ݟK+t~c)w:k*=S$3䓶[o)ZZs\ \d07~4}RWlfGH>ߪ9SQO~aC߾ss^W&2nS9bծN~d+ow~%ۿ儥Ɇ̽"zTP(cӞLM'_b`sjέW>$o}|!RS][Q^B_~^xҲAe/Ψ}8"nҗ\4ߤkݜQky?|s'gK~D[y]{?[OKY{ŃZ7e}~",~kx'7>kj6Oh]r+r]lM6 *ePvM`m @G&`tmP  lM6lMz66 lM6`lMJ`6(m0 @l!M6`8lMF6`4l1M6`<l M&6`2l)M6`:l*&Mj`m0 l&s`mP <&`,m "& M6X`)leM6X`%lUMV6X`-luM6`#lMM66`+lmM6`'l]Mv6`/l}M68 lCM68(lcM68$lSMN68,lsM6"lKM.6*lkM6&l[Mn6.l{M6x!lLY/ mP=lM:63lb&]`tm @w&=`m @ @o&}`m @&` mP  @9lM*` m0 0&`m0 (&`m0 8&`Lm0 $&`Lm0 4&`T6mP `&lYMf6`.l:&M6`lM6hm &K`,m &+`m &k`m &`lm &[`lm &;`m &{`m &`mp &G`mp &'`mp &g`mp &`\mp &W`\mp &7`mp &w`mp &`d^,ePvM`m @G&`tmP  lM6lMz66 lM6`lMJ`6(m0 @l!M6`8lMF6`4l1M6`<l M&6`2l)M6`:l*&Mj`m0 l&s`mP <&`,m "& M6X`)leM6X`%lUMV6X`-luM6`#lMM66`+lmM6`'l]Mv6`/l}M68 lCM68(lcM68$lSMN68,lsM6"lKM.6*lkM6&l[Mn6.l{M6x!lLy/ mP=lM:63lb&]`tm @w&=`m @ @o&}`m @&` mP  @9lM*` m0 0&`m0 (&`m0 8&`Lm0 $&`Lm0 4&`T6mP `&lYMf6`.l:&M6`lM6hm &K`,m &+`m &k`m &`lm &[`lm &;`m &{`m &`mp &G`mp &'`mp &g`mp &`\mp &W`\mp &7`mp &w`mp &`d^*ePvM`m @G&`tmP  lM6lMz66 lM6`lMJ`6(m0 @l!M6`8lMF6`4l1M6`<l M&6`2l)M6`:l*&Mj`m0 l&s`mP <&`,m "& M6X`)leM6X`%lUMV6X`-luM6`#lMM66`+lmM6`'l]Mv6`/l}M68 lCM68(lcM68$lSMN68,lsM6"lKM.6*lkM6&l[Mn6.l{M6x!lB_*h @{&`tm @g&M6 lMz6 l,lM6 lM6 @lr&`T6`(laM6`$lQMF6`,lqM6`"lIM&6`*liM6mP  L&`m0 \&uM`m0 & `,m`1l%M6X`9lMV6X`5l5M6X`=l M66`3l-M6`;lMv6`7l=M6`?lM680l#M688lMN684l3M68<l M.62l+M6:lMn66l;M6>lM6ȼ\ˠB%`6hlM:6  @&]`tm @&=`mm @&}`m &`6(mP`0l &C` m0 p&#`m0 h&c`m0 x&`Lm0 d&S`Lm0 t&UM`6 `lM6  @=lyM6X`!lEM`,m R&`,m J&`m Z&`m F&`lm V&`lm N&`m ^&`mp A&`mp Q&`mp I&`mp Y&`mp E&`\mp U&`\mp M&`mp ]&`m C&B_*h @{&`tm @g&M6 lMz6 l,lM6 lM6 @lr&`T6`(laM6`$lQMF6`,lqM6`"lIM&6`*liM6mP  L&`m0 \&uM`m0 & `,m`1l%M6X`9lMV6X`5l5M6X`=l M66`3l-M6`;lMv6`7l=M6`?lM680l#M688lMN684l3M68<l M.62l+M6:lMn66l;M6>lM6ȼRˠB%`6hlM:6  @&]`tm @&=`mm @&}`m &`6(mP`0l &C` m0 p&#`m0 h&c`m0 x&`Lm0 d&S`Lm0 t&UM`6 `lM6  @=lyM6X`!lEM`,m R&`,m J&`m Z&`m F&`lm V&`lm N&`m ^&`mp A&`mp Q&`mp I&`mp Y&`mp E&`\mp U&`\mp M&`mp ]&`m C&! *T @lM:6lM`tm @7&`m @/&Y&`m @?&` m0 @)l2&M6m0 P&` m0 H&`m0 X&`m0 D&`Lm0 T&`LmP @-lMf6 `lM`6`>lM6X b&K`,m r&+`m j&k`m z&`lm f&[`lm v&;`m n&{`m ~&`mp a&G`mp q&'`mp i&g`mp y&`\mp e&W`\mp u&7`mp m&w`mp }&`<mB_*h @{&`tm @g&M6 lMz6 l,lM6 lM6 @lr&`T6`(laM6`$lQMF6`,lqM6`"lIM&6`*liM6mP  L&`m0 \&uM`m0 & `,m`1l%M6X`9lMV6X`5l5M6X`=l M66`3l-M6`;lMv6`7l=M6`?lM680l#M688lMN684l3M68<l M.62l+M6:lMn66l;M6>lM6 -ePvM`m @G&`tmP  lM6lMz66 lM6`lMJ`6(m0 @l!M6`8lMF6`4l1M6`<l M&6`2l)M6`:l*&Mj`m0 l&s`mP <&`,m "& M6X`)leM6X`%lUMV6X`-luM6`#lMM66`+lmM6`'l]Mv6`/l}M68 lCM68(lcM68$lSMN68,lsM6"lKM.6*lkM6&l[Mn6.l{M6x!ļ }Tl"&`tm @'&`6+lnM6'l^MMz6/l~M6` lR&eM` mP`lM6`lMF6 ` lM6`lM&6 ` lM6 @5lZ&3`m0 &s`6m0 |& `,m @lM6X `lMV6X `lM6X `lM66`lM6 `lMv6 `lM6 `lM68lM68 lMN68 lM68 lM.6lM6 lMn6 lM6 lM6x 3ЗAJ6(mо@}孪y/gp]l#lNM:6(m @W&`tm @O&`d`m @_&`m0 @&M`6  &C` m0 &#`m0 &c`m0 &`Lm0 &S`Lm0 @lj&Mf6`6l9M6mP`lM6X`l&`,m 2&`m *&`m :&`lm &&`lm 6&`m .&`m >&`mp !&`mp 1&`mp )&`mp 9&`\mp %&`\mp 5&`mp -&`mp =&`<m @ }Tl"&`tm @'&`6+lnM6'l^MMz6/l~M6` lR&eM` mP`lM6`lMF6 ` lM6`lM&6 ` lM6 @5lZ&3`m0 &s`6m0 |& `,m @lM6X `lMV6X `lM6X `lM66`lM6 `lMv6 `lM6 `lM68lM68 lMN68 lM68 lM.6lM6 lMn6 lM6 lM6x۲-2!M wI Ke*d^};sQis護*3M7oF9i}$ɼJv6u=aX P`'mTaX Е `6u[6@az񱖷} ?lٔlLLof {$zi1m'zh9wmL÷ , 31h;%zֵ {;_嗄DEC~'ŝ@*ǭg] h <|W튚_6 KArP*i7pLIsLOPx5&嵄WcҘ\L>1iL.&HcҘ\L!1iL.&8Ǥ1ccҘ\L8Ǥ1ScҘ\L8Ǥ1$Ы1iL.&xcҘ\LS1iL.&DcҘ\Lҥз@akwѯp'* ̝-\Nu+w7^?Zٗ\{An~EӃZ?L@/MKZx~{چN/AkbΣLP.P!{ |‡> DKzn;~VOLcN{Z[JW@Ӄ'$N-$iWZ^!ol+SRɼb8Ǥ1sqIcr18Ǥ18Ǥ1dVcҘ\LzcҘ\L2;1iL.&|cҘ\L2'1iL.&y#1iL.&4&BcҘ\LR4&4&9&$_sLI9&$<1iL.&4&|11iL.&Y4&|)1iL.&Y4&bcҘ/f^Icr1/9&k՘4&'1iL.ɸ81iL.&rcҘ\L$1iLnIWĤ1dicҘ\L/beqIcr1/9&$b_sLIV9&$4&sLI~-1iL.&Y4&8Ǥ1ducҘ\Lb5qIcr1ɯ9&$1xϦg=5$s -}  ^V{w |'|躟\>kgӒD˿ugl.ߥX)72ʘƘuqii)7qii)YƘߌsLcLSLɆ844Ŕ844ŔlsLcLSLɿsLcLSLɦ844Ŕ491)dsccbJ}ccbJ91)?91)dkccbJcccbJ91)?91)d{ccbJ~+11M1%;Sqii)Ƙ91)dWccbJsccbJv91)wS'11M1%%11M1%{i4Ŕn"1)d_ccbJkccbJ91)Sr 11M1%Ƙqii)oqii)9Ƙ\ccbJ91)Sr$11M1%=11M1%GS+21)$^i;5?9z=I$}cy}봾_~ȋ/*\_z@?Jn#ѳiIҐ_|0~GC^n.&L՘4&sLI81iL.&94&IcҘ\Lr21iL.&8Ǥ1TcҘ\LgqIcr18Ǥ1qIcr1ə8Ǥ19&$gb?sLI9&$31iL.&94&8Ǥ1BcҘ\LqIcr18Ǥ1kqIcr1ɥ8Ǥ1)1iL.&4&ecҘ\Lr%1iL.&8Ǥ1jcҘ\L8Ǥ1ky\L1iL.&4&ucҘ\Lr#1iL.&FcҘ\Lr31iL.&8Ǥ1VcҘ\L8Ǥ1vcҘ\L8Ǥ1NcҘ\LbqIcr1sLI9&$/1iL.&|61?_1@hIr(9Ko y`i W>[0k)%b?*d*'|Jp)~)3|÷]a.>~| 62o[W>:lU~h H@ѓߝZ޽Z哋yzh[(Y `6@o! &ʯ1[3*Vg=<|j~BxC7_(4o~‡ɴ?Ο^߽~ ? g~ };h+g r,m"6m `6@6ml:=xh `6@13iteؖf8ml* `6@ϧh8m,w a Ї `[o c Џ `[ :mOF> `6@)7a P-m!iTlߊl>x 6x `6p6m6u#}"N`4.6uc~d.D?aX 0 `[ :ml8mlg8mO6@(7-wf6u3Ȱm3llaX PdioZCOl+ٟ^A?+mO9~,c璷\ّzvd͛3^[FݨftWSkoԠ?8fN}U-uQWSY_3sk>{kݱ'?3>/[Əqg奯 .-NQ?]?9/ή8կ&άi7k?9r䈎{ GvRe?][o^f+Wfd/f*_ΨVe*/UƥdW5j|M}TJK5z͚󦷽Xʹ5u7>ڌ7{ck5A; @K^|L`aX 7%6@ۨO `66m?aX `[ :m la `6MlQ :m-lQ `666m3lvl6u~\fdiaB `6>6m3ll :mCO 6*Ͱ8mP `616me6u'aX p76@ۨ<N 2lαlaX p `6u~mTaX p `+6u ɰ'3ln=h ͰS6u ˰xlOe% _(5mst/$-\˻|%1gZ=L+>--L ~~|ˢ_KL|\PSFMufB>_w^/_Ґ|$^T~?;Ҽ{-ɡѷmů6lyQ>2o?Z(1]q3ܓ^}/ӕA J<Ex;wC,!Y1 .T+ҲYUE{s!6+ڟ +x;㼁u/k䍲b3Z3Px;wBȻ{,[ռVџnt[=lcْ l[x/)gtFUBx;wCS͓n.AkkBFmV' xqa+՘GH x;wC,<1n2&Y=e( |Qa KxaIqM6gbԝȾSV!94DsEN p<f3USR܂bz͌'$0x;wC,ȇS*rcqQrΕ Y %x{pnn=.0H/RTU0VTQH.VRpr jkk*TO>#*eTZdlW\kT;[|=\Bsm..Y Px! ]B.ä{ߡGQutq+"xdwvCd}~ɋU'lKv%x: ]/tm,Ҭ)'ysVq7Q5w~p 70γ#y%xK>4 */ #define FORMAT_VERSION 0 M=vz!)x ȻDP@Qv}?a^dF?ۄ>D iGC#|+RH)WRK#t 4?sx;wC,ȭ~r]7֫}qͅڬ>vXxk4yoaB&d)h$m/ # Kx8 \@4?&;d pQp) ž'Fq+gx/=EzC bB~fnbzjZřlAl *xG3.OR|" U0s+ y* 0)} ,.߳&Vx! ]I7=yֻQ]yPq+x7]oZ E% % i9 )E Z\ ) i 0_`O_w%sMkTRiZAcH|kP56"BY8$Vxx;wC,>Uo̷_k2BFmVĥ 2 x&.*q \  B 1[x! ]\yW [Ļq+x^cQͷYY&pc69Szs>O&aɜ|) \ `0Y[E\j32sR4Jsuu'\usm$.)x$ \.8O GѪљp*r"Ax/@j[ߘNn>\1yWdF UxgC,/wY8j^#FоͅO x{o$a/,u>3{F*XMϧ2C*;y4'9YG)m>2Q9<8b o>)(ViͥPZRZar|-~xgC,Hwګ*8گkΗ<7aͅb*xk]*dU ̒T C؋J L- XxgC,ȟw3XWTnldadж| C xk]ŷ6dffWk'+((gVƗ(Ysq32sR44 E): Ii: NnQ E%PY%&`@-97}xJ &100644 .gitignoreKd&6@]Z'G~H#ECpx>f.dax tx"~hɳ ' P x ᬆ(wl %ZWRjx;2`cFDxsgB$ß92l"^g.ܸu>+g Sx;$+MB!1/˿ 58?'(XRls:F ]xP \-Kl&py\7]0(Xac%\\+!oK?v0EsV&Zl1xk-!urhvGk2xkxʾyr,*1xwFwfFge6˰SPPLS(/άMMLӘ) æh`V>lGx;{\wW )jx; gf,V:E %bƳ$ٳ𭼵x0<¯˂!LJx #O"MV-zE gfx;$x{=VP@x \Brn1yFƥ#pdtxkZ%9fnPY6IxsgK[xWiRőRTNƿ6%xkxʾa KLғ0iN<9yr CPxsg8#lnr w:14r *!xڻbybCBfyb/)ove PVxsg![on cYc %EͮL, m_x/MlDٍ**F x: ^cx{xCqx>^#axQ \9@2mCVϑpywFVKX?#pFYFq'!3Y%Dxi \+OvhuMy ;ґpy"KCz}8Pbza(llxZ(b2pՓrhN5(V{yJsZ׳E3Vxk.1aқYXtsRr&l^ }kixkʶ4XUx/&4th?͒iLBWx \@Z!͙a_\p kll x.MbC%*'g~ExC 6%X2ݨxb4 ~h100644 scsi.hy&ƁMe~$yG[xڛ.|Wp)dOf5ڛ13NNdj5q{f (((ihZsrhkHxڻ+xYh)3[qIQf^fuoũ%j)E: : řUi@U% 9MMMg!C ,Klxsg!ȇyJ:)mR&l+? % Gx/PpDٍ,,i =Y '8sS'dzymLc Ux! 1v }c+!E~Gkx{(xLp*duƾ5V xsg!HtFUoU KVٕԙ Dx/vHpDىї'0ɫh$'(%9٥1^abLSj8y:9k$gx[ HJ^5 [ak7\n/VG̦Q100644 utils.hEF) ?]!3(>~xkxĶAq=cXU/zrdxX}3f'ily)i\T)xT e? ǭS! K= t*Ңݬb1Q‚ C'cxsgBH߄Z&Y_zjoƂ'fLlxk+e{1vPxڻsgK-oej:>\.}pV ox{vmdEɳN,Hx: n<{dz6)$뷓< :i-"D]X3LHxڻsgCHӌ3N/iT8`vfeæ9L/#x4mf update(inode,0); $+ _mt5F?}Dxې֗a%

3gԐCVtIHa0쭋 Q5/jO8'V$x{v+l/yܴ̼҂ĒT 0G@ӚKAAk{- *fnxkxhㆉReiy))%`FS/ YphY0)??G"Q6cr%/?P3V˹" 7ڛMfڬ8y] 7;1b:2؛`ESdp9~}-PDuPfbMɊrr Jnfvkg.'Vw6i`=!fI?=\ 4AaYZRZrQxڻsgEҝ—KXrpqe۬h(rtͧ ݳ>Ô *~oGt KW~=~;|&Q[sv2039ɜ̩\~mh _n% LLrӊS2RJ2r?M/?WG˃%?|@V̠0e5a^'s= e os3Ю"P ۢߪqzŧIww; =^+w,Et \wfU/[/ci^*`rdFKK$sf[/' y) G+ ^[Vye,զƃ xېv)uC2mf^~J5BfFYnZq=D#X1JL4u 'IM:y3?삌z9\d3 f?,@&p@8e&4ԙ(9+yɕ6K4rӊS2KRtK3sS'OJQsoVud姤@e`FZDl?%xڻ}{s5<L:\ &ȱOÜoV`Vlť\Pk3R4\MMk"kY:"Z A) %} Z 4ܴx`|zjFZNRNv|fH[[]CMjB2yI9 % @P *T-,*bz5'mȪ4Tms9k'9&'OȮbI@PZRZԇ·ԧB}coa`}dO5i-T~+"nB#1?/G2s9&DqAUEؐ#仴%?қfu\=r%$.C9&<{( ϊ ˥@949s`P'*D@DUE tƄy@H,C]a#gq!?hl+vfC\.t#LC޺v3m4!9K}>sCOgN]J3_Uн rf{'@'|of3DHv1]< 0faNM/Z *&T)=s!2䊑wա" QABSOsԲϩ^t]h/јD1=4jPӀ ?*.ҠC#P*Z_{j>~3q7| sƉҤ%&2*Lbxr}RP"D#X׮(?$>%H'-8iGAmah &!6Ah8V&4\,$XWbl_X:fCwĴ5'K&'g+()jZsMN.(/ɏI56[ TWY`Wnf19_"[RY" 35>$2hk#yI98̬GH/+A3٘Dl:xCusB9;xh d䃂 |QAz%1YW)ˤ0x{iQܴ̼E/0z{:{:[s)((UgV**ځu%'gǃ$ԕTMANʁi8 q%C$U9@`9xLJDƻ9M(!.tsw qHKIOJ,N^`]Q Ϣ 50['4MSVAp2UlIB2@yRbZxqC=Srӊ3SRSK4Ҋu|݂|\B=}\4 t 4u4lmt ';J)l>*;l Vx{xaBYnZq|JfQ|VQ~~ m=`P_V2YORjIdM)I,e&;.LpBK'[ _ 7za;ͩRl+!7ZxۥS~C6`Ax^vtzxkj`_i+y֏ 76xeR]HSafsnMMFj9;z6(Ӵ#dHrgP"E R]VH]Dp.aME]}Yj7=<0-- NXTĈ%`uīۣ&-r)VxBH˥ J.Fْt1aiρSQշ+dD p˪$Qg7Eܘߐ{Fyk$ T4GQ!SVs6# ?$H@Ȍ6p m6g Θ\qlh\tn;\ jAǒq!1|Dz 12gЈAUנbDo|v^;+T|]pӪcG,Ռn#Vo `qTDfi%(nCӶ@Ag9f섅:;TzrA{*W{~+CڠaMJDIx=$sC 8Qμe"Uaz4LROD=Z!=i)#Ddq|Ms"c3}+f{}m؂&`9 z85r)1遥DQj ) xڻIkCܱNd\ȧ2{r>F} >%':9^}rt6BՅ& LOK/Q(/,=Y@H|.!߅& 'ͺ" \/b6ls6hxn X@(hvˣ6jZyl?|͸r'BpT<Uvep?G,haP˳R 6bu ǫr@3)uAW22`dٙE ޜ xۥ@nC6ZA% )E%E Z\ eii9% ZE@@M^3i^Z&O6lOx[ VvC 9"x{+An=nG.}-Ҽ""<%Ԝ< OI-V)-+16/Un- dxڻsgb& 8[mα]}sjv [x-[`Vbܴ? lVb8YCtdmR fxn BHn1Ks+$w:7/Ƿ6+C1RQJ)`V'X7MϤhMRQ˘;]d5fE֢8.t/5xڛzg" 7_g$) cN&xڍSMOA %D&h,,k cMHVBTf2HO? ɣg/#M6U]^իOc_~}X, wNimLkq{iZ]߃ i`ճz; %҈9a26;6dk!^>؞9I γ+? Z=mLZM tHGhihDPg?=,&V]V5'eBBmR4DD*4Q4i^j„G f%,yAnSłcB"p%' fhLK'.e+jFQIS1l5ebiOGLbѯ]0$ !+He0VQ !0 ~qfH!*7D鯹*G;9}?쉱V Gz b0#~Zޔ+/Sq}uW\"JW(8 󐥪Ziρ'H֯+FyE~K{֌Q۵s!Sho/?;t8~xA(_Do.,YNJ ,YEhsLNjL-S09^oO0}sB3NEUmr(5W-5 x|(t$bLIO-6:pAԒҢ< @%f87s|4x;}sCl,8y 524&/PdSU5|l f|.|"LE '.lg(Ѡ 2R'so>yB=6k Oak7V%gxk\~uV'+JLۜ'yr_0dC z3$aWܥh8y#dC_U2T/Ok._ZT__bť0YAZEIG- ,`kk8dI}C5' Nޭ^ im.pgdۥyst@õ Nޠ-Wl7fcY gZo6ҕ9MAcEV@&@ܩQV^XV:]kfٌe&ﰗ\`IF af?yI"ԑ\\)0;؈N`ڀ_)pZɳ9PM>g~fB En@NSdkY=#0hD'[M;l 4IdIlc3msDɡ1NkȁYLl]dE6[v7=Ax; XN@Bi1(哪{H+lViE.\+% ӮqxMݛa ]lmt 'OP\+xjr*Zp' {3L^/3pXdDdh,Ao"zx[6hC$f%R&RPBZ{!Ɋ2m96p3Nv\)6ydaͯe'[WU,>"&lIJ~^d`gQxڻsgCȷ/x<+Z-<[yK9L/sxۛ*qTͧEB7ۨ1MLxJ n=Bc),)}wκ R6ż100644 vmfs_dirent.haj=x~gǬ]0d@G x{4g$,k?2Goxڛ }Pjywr Pxۛ29~C"myDH-KxH ;<~"-A/̘p100644 vmfs_file.hZ}϶k..X3;F[jg4xڻm2"8o4x"\j/rj^Jf,xJ n=pP,(s# < 100644 vmfs_dirent.hȿ)z\LDL Mkx{tuC ̛k?2Po`x;(uAr5y'<82x! XEY f11tl2xۛ;rC"}e6sNQ|D ixڻsgCʆCf<maOF9L/ xۛ:d*ͧE8Y7LlZ%7 dUx{ nTx[vp<u.g[j9|Ck-F9#nR< HDuQ+@100644 vmfs_inode.hmCbB9T ]`ln5Yx{uC Kr 3SRJ* Rl|݂<}\C"\]<6+g\ sxڻm+fI y% E pN ]Qx{* $&x. fM~&1= y)v@țxڻsgCnl~F3snT9~f cZs q4Vfh``fbPVYW`7ʗ3}OP_´̜Td7 d2;74ʙXCY+G<ڝ<w '*W['6ri\O0h._Xل̼_̙;h)뒜s7fLN`/bzxۛ6d3oJfQ|rQjbIj|b&AE֛Opn9F-sJn Vx{`C$ ;rO~**(PZ=.Fɝjғ׉%)؂5 urӊAZSK3R5@xڵVMoDjjlSJ4[Z(DEBB-3N+{նA+9q ęz;3m(eeyy?yfWW?O#Ίz>‘]0g`]mw?J#/ IJ5ldf_l^Pr/!#As&IH|B#p“tF< Ha"O;Iz ,zĦ4$!^n@R~ͮ`H;nuֵ\F#MRS4+4;x% S!@Iۑ+_pb`V|2a1Nmreq5lzVs؅9T$ 1&ZnG0*']ꊙ0ƹȵˤW LOi獒h:+vck+ze󾋶Ih#)7޲Cd(m "jkb[@d<%]3ay3Ust䚴TdCLIEQ䜱e(nܐO,4b`8F@`ۤ!Q ~Vk[&`l`3̠ 5 Aw*c aӁDy* A @22Ns7J@W^H ("ɖ X)Ij*Idm\ ;Fer un_y&fD˨q=D"baQ @9^Ŭxzꢮa=.0YLY wz;2D4mDOL~8cq+G%JZǓc [Z9(p$)Ȣgyg)`3J2;~zIuX<׹ }=pOY hb\CT| g,~R i`Q^#RX\)j88ElEk"9zrucTsϢUkkW=)}EʗQD_D* &Nj_d%h^5-BwoIxڛ }Ql7rj^Jf)xڻ(vRbwsQjbIBB^jBZfNBzfYjP $CAK+3D,78>%(><>D.TXҢ Q:\9J3 Z`5@RK*;!7D=ʩy)i\T`xڻy|$'d 'aK˧Q_P`79WlC YvUY7@xڥJ1֭, G[QQv˖JI(A˲M@]ԋOyxOkx L6>Ž$?3Kgɷܱ Ck ؉׾ஃO'kqIN^-$jJGNSC(\V^z2Bq=g?-lpú4TE!L.'9<5E\(mBD_bLci#-5׃1Ԓt dn~iiBc_,S3Ǵw (FtJl)xarW*>~ 2&DCem-3b4Elt*(e!YL!x$>&x"5YtF 9n3+dqY{"xڛ,:GrFv֢ĒJlf+ Nn~Jj|ڼ1SBHQi^2PBBZfNFiqf^:Z\YP_ϕWPV/j@RJOK2rRK24pڢ$6pMl&:g$楧*fg+M~!Y P<%kR2@)ɳSNKL ͎xڻ $&'LU»YX2k~+&y%F% iII9:I9y *94ĚKAAYMfIj0UN~/)7:;DZ œhO!0CZ"he].[ZTcYlcA~Hu^ݓ0?6֨a=5Ϛk9K"8' Hd'fŗ(%'dC( /$5ךKAA(_W2QEqr sRi5*@:>'5OSSkDK1I! `%'gGN~"Z5PS_HPD&DX($j";ςG<=$_!("_d)J~Cm@[j  X"Drd5?~ j5ꮬ  ]vHɎ/άJ,U;&\&&SKo^kTQcӎP1ɿ'spBuqtfLSS(;ym.~?WsSe29iHyU%?3ӞYedCf2?Niz'ѴjZR})Ey%z |9ӷ.1k +LIKfx:I&pC%0e0rTϓ*pPp}r52[%9Rte/+M(U/[/ci^*wr.ʩ ,߉ٹ`p]!̼3w~R%9QZEo̘~l MxڻsgȹsIv7DSv:Yы^;os\s?E〡BYnZq|JfQj^^͝>tnxڻsgCH{ASVnx'9L/l9xkNMi%3xڻsgChKűsXD9"~鰶z~xk|λܛŭ6Ismx! X=9jItWO5lVQxk|k!m WьK\' [x! X>nΡo5Z\lB0xڻsgH &gz͘%fYр| 6xڛyq1 6o,fڬ#bbyI = RxڻsgCsmҐ9Q|ǥ}Fk LLrӊS2RJ2V<*U\wzbe%3h>85Cw{oWξP{ rx0gǹ9F2G3iJ=ilxeCf','klxڛ)V|CcBxn$ɻ 'aKl[]vlgxڛ#]bFbm,Huxڻsg,1 7.?j=6JJm͆m#(x;>t$9Լ+x>K]Jxڻsgm 4 6' uz +( -xyq1 +U6OU26)t; i xڻsgHFXGao5jH^W`t 3nxڻ4 Ϭ7_vj9!lGxۣy]c͌B#x: #y! v<{Q!֓1Q<1 \ ,< fYJjlqxgf^O&0lzxڛQyC"f L!Wxxڻsg&zٙgWv:vڤeYL%5 x;QYAF(51E#M'sRt 4mɂR(LٯXQVY_W\X:yPU{۶B#3/?%*4Ҋu b[64xڻsg oNuحGF,f VFq  xڻ4 )l&S#?z xH $<#g+xp7;r=100644 vmfs_inode.h  z4 zb!`!n{x;:qA/fz-l rxۤ5]c%KPjb5B2E@D^"4Mk..}-̒TZr XHGId#ə%) % )E%E y%EM'qKJKȦl~ǿqrj^JfG9xڛ1Ic^~̼t|Dl̔ &(+16/dgLNެ- QxڛG}%|z7 kqǧ'dgLn@4D$DA+4MӚK95/%3 i)xڻsgW&Y]Ixw,qD&͜<|xڛwGwvw98ӊs K2&g9$($g$)hmJK!y)Ii Lxڻ\wZQ̢ܴ"TMk=j|J3SRA=b>CJxڻsgr{˜}㙫?F62 lx[Ѧ G<# x6 n162c* \-ަCL޾ $2(4f\fb4:NtAUyH.j:xڝUAoWJ(c,yI MJ,hu0F PY n"Ǫ"qACO=V= ’fʫDlȧ6Rdhj3/N ̆Ṣ Uj˚Q6X_Y1̯T-GvynVjWʆY\7TV Ph1{tO1}F$!@NsxӚ{Ig)L'kjޤ f .hWf]5Q2)DoWzS08>k7E7{M'<$zBQIw}LuЊJ>c܄Gpq֡)5 4qEdDblsW,-R(GJUAN9.|rMxqmRώ]M%amm+n̺q9EixS>7xZy?sa0x[<;rdtTU!ΓŨvYh q^ OS}G=p@1yZx[f}rQl H.RPPLSPH+)MI -?''<27'3/[Ss2##"ei)E%i@K'L]F(8LTJ)H,1I*MԴS. xڻlrC6HԒҢ<ܴ̼Ēɿ'?TTPH+)ԵKOΎL, MڗRx[jybC#Bif^Q|BRNv|f5BfD`rlLI9U14`Rm ]7 (ix! X~U+誗~l8Gk#xmzC䅲R/xڻsgCc7lEeTp|fgxm=zC#.ֿJ>#zxڻsgC yOYx9L/Kxڛa=zr|b2N6c|HSxJ n=B':۬M100644 vmfs_dirent.hjʹuwgeŕs$R:xk4P!NfҴ0_x W`(Xk..4 [[PMɱb@-:řUi@B?sk!Ij*(* 5&?Cl3,lixڻ(vPlC9vS,#DrxڻsgCȔU5]a+^>/4uHxPg*̪4ԼJ]TMMk.$hC#X##fxڻsg%ȣ__Y{VNFg;fxڻsg%H'-2g'S>7_OEf_FvV[ l{x-PzC# L$ Fx! X,wDͭ2Zl! $xڛn}rrfWqIbIfBf^BYnZq|Ziqj|~AjFr~^qBrFbVAbId>%̜-mͥљY,/@2@;45`b ee|݂|\B=}\4 t 4RKJ4t]}]}5!&,SU@8: Wj:(9'8jU C2>sP9Z.U^:PvRi>: joe4K-9<Ģb= c5ݮVi=Q~,Q)Zqa+xڻsgȹܚ4\l$6eyU X 6x2NOY return(0)OvRbase=WϓO=XFhpxڻsgCs Ϥa8:t/YxD,78>%(5D/ၪSފ: JoGVz?Y(cMRK" a(`muoә:5 xڍUMldV-N$j4I}iΜ)lu)ݪA@2 ,7[Ilg{AH $.pT8  q,g;O+>gW>j'KC54A^~TQ !m'sC􃻁g(ClYn4K*$WMJen٤$G1 Lƙ.Ps6ղ߁MtffX46ԫyĤD|*ƂB˹HfM!}Ė"iVZ_^^ח_P04;_/;Rijj[Dد!L^NpuR0D,B{|1_oM=7VZ<ʍ YI9-׍Z$ѐH%b٦L#l aP-D0M7*Q5ͨVekVL3=cPjcִRtxrӤ' wC# IX&fC`7 |484“C"lFp=|/Xj 4?S8,E9o~b^?CFDi'{S})s2+d"YjnQ6WPf5GW8.MxnFdLJsj6=Rqѽ4jl:(@PC}BQHRrLk,!]GFKqccmrSڮ0[+Z{"ףLJaN/`2Doo'1p1gm,֭PG><5SGȢǑZk<:u ׀#nr;tiE NOfxq[eź2ŞXZiU+nr=Y)dj=|J if>\]LIƵ͹\(J;G!;dM:c CyX mA܂I7a콆ZQ5q 9g+mږR{gS"WsK|8NH۸Ξ104ՏXBLahptC8WcVa|$.Zd]}Rq)L;Obɀs ᝖9\ ڔMc23Q 9O1B"7)-qO nGDp ߏZE|5ɰ'P9\DPJ|G$*EBOڰ})x;L]+K{xhu`BbZZjrIBA~qfIf~B~BIFB^jE Wj^IQBYnZq|JfQ|QjbByfNBQjIiQ i%͜ "TMjɍv\ SS5Rt 4@9E jhjj*TOf0Jkk8E/g7GIw8'wIO~ :ـ}nL[%E\ U5 ^C"WGIOir|njnrA%M: `=: řUiZ LyNش"MɒӴyRv055xڻfLC3{qIbIf@Elrr:L ǓW\X5y2HP(3D!-?''<27'3/{r)-sQj\ylnəܓ'r $dL^} ,Q̣5y#<\ 0Tm=ٝg_|Ry@"ei)E'Wi([i.! '?Ƙ1EX2SRKET'fe((p *W[]x[JwbԼJ]̔k8&QU(M+O,OO-O+HJ,N57sqG2m.maVd??/.uREi9`A-=OP{rBM h%o *O#(Q)#$ϗktЉ BW9L(3/?%Usrp8+ؕf :YPDV R@pB4hNni« $D3%L&=.%)D=+ )x{Dw1|AQjbFFi|rFbfqIle*H,PUPWTR4 EҢɼʲanN>n.N>.:@R=&D(mmk9ũ)E `Z.<{86;`K?-!x{{Rw 6pѲܴ̜Ԓ̪T4ɯ85KsRl&krjj**j.0H+JM)Ҵ +祂j7p{ (HxuQJ1G} ҡHXEG:;"E$ %%":n}w_A-m)m~֞,aUWe hL&i(h_rK$J!0 F?$!VY*An5ʹ.[?0ؔ  2d-g :C ijˮ3A!)D#$Wu1BTgN:}5].E< L$캀ރ BTkL0A7fi8sbClHqydk-(ct@wMlyϤfmcQRҝ:˓R1znoNFX=;sD'i_m0xUN1#(HI&2.JI1,\TJK?1pvc"k\k%=|ks(٥g&tZrH)tIbAiOS(gW&ij(GL{Crӷp!DG3rxjy8zV{ pA<izj Vj*8tHFkه)YC2 6DŽhFzT''1߉LL MdeJq۞s' -9EdΑcޒ5ʵ-͘躪߲?̛`}\`25p͚rd6b%jּҊg`\Rl`x{/# fw$bx! nDD 1@cɕ옳|7x{Jw 6pѲܴ̜Ԓ̪T4ͯ8~&Icx! aP ׅ:@xb aP ׅ:@R<2۰~ %k><100644 vmfs_inode.h ?cw_ır9U]`,3ix[͸`lbxڛNm%|"- .xڻsgClUKͽS>w9LAց6圴sJ(ǧee0LToJWYц:·8:gsz;d姀LPxi\dc6ϱv1EgxkֽAy s$_YnZq<(h[O)ZXRRW\XUXP\RT\ʋKJ4RKJ4 eh(t++(X)L^ͩy V..U =0[JS Ryk 'o殘lc,W_WRdXoNbd1'瓛QU0JHk F@e j& O<㣳R(,hAyEz@"YG,QP{bbMbRHƃLW0zd#`Ox)1UtC,,̓U9'_~U Fx! n![0x ۴߻ 'Zlxx{Hw 68>"Zx! nUc2i  xz Ϟje_ ? ->O >犡(ړ<;}GX]2mBs۔100644 vmfs_file.h|zڀ[6 x: Yki!Ϳy*4vyUc2i,g6Ix! }ϸщg8]$!Alrx)qS|Qͪ","m6xڻsg&zٙgWv:vڤeYL%5x{Pw1LQjbFFi|rFbfqIm ;cxk۠hV6ّOr1&jK>xڻsgsZ#ZK|i:1޸fFV ;(xq '02LSPH+)TU(M+O,/J-)K/H,HJ,N$ELPなQ|_\oYA&pl,t (sxڻsgsZ#ZK|i:1޸BJjRizYnZ^IE C'-2g'S>7_OEd_ƹJ{k3Mʢ8 %9z *5I6ELf\7m:yLaJ{~ރwZ~<˞kL}]?Xk-m Ƨd|ꔷkNCo kGe%3Ԯt_2lqx{Og4N"+& axڻsg$^ƀcsğ%lVa4`1 8x¸l3l*MfOLSH,JOVPU0|QP7X!Z7'V $crd}B9Dx! /R'!yQ5U{C {x[ 7_nC67sJf|2Mxڻsg׿yeewou_X̘<Ix{xa佒*I9ٙ)$&a/H۬) u ^x! tDd,γ~k5x{taC8v) kEx! V(pl/ﲡ m%2ywsSz %.SRZ^ՙ~s/1[$|pݝWVvqv[Uih``fbPVVIu宙^><4tjTEz 5 rߴs{glbydRm xڻQa[?XSlrӊS2 RK4ҊuK@: %wz0JԦe椢(,,') MNfǓV_XVYCŜ ƛ9XY6`|hFf 5RJ*lrӊS2RsR!$%DuELvVなQ\ mS|$|F7uxH ;AV`mt8L100644 vmfs_file.hcY*/w5M{Z[[͖C| EDͳ5!lɶEL4˻Yj@2W8 IG0L7"7RIE7x$[,w8.-?EO~@TuD/N6[ķ|n5mO+tUQUU{gӔBYl \p;gKCGяCCI A1+mnXIh k _R98^b>낻&# ķN? v'GT]l!Dp|^L:DgFٸ=vg@mNl!'aNMä1Nc{E mz|(򞞡}z>yԯ\`"~m3T` oŲwEouΌt~4DP0x{ lr% Z)\ y% ei)Ey%@ɚlYgݞ/ɓ` !:ryFfNPyQ%||QjbFBdG@DP-4J@~Aj^|ZQ~n|RNvfFZ8]M! 3MAC1Mkyye!i%%i:j%yip-Ko~q#>9'8U#e;~Rؼ{r2~33El^+)K/H,:V׮(?$X^mc0PPm2d[ k:hL xڻsgCs}ħ__&/8b{ LLrӊS2RJ2օ~xB7w&*5|DV̰kФK߃k1e0on]FxOI_{|Z¾'s4/nC/Ox{Wgfp&"];0y1o#.sͫEolKx{/>Al!̢c7eaޜ>Axڻti'OJfH+,a# yCVl.x)qC|e&"@'x! ȮFk[n\%xڛ 6Al?9"63s2HTRxڻsgKì#g,pp<0cv֙.~X̘ -xڻsgk1:ĵr˥460z1՛۪͒Ԉ2S;'H240031Q(M+O,J+`( *k)?n T:e%3$_ꔫvm؈c(`du<U)kVhWJM+U5=Oay'ReZ7gbּUp xڻ ]|!̢cRS2sRRR2 J2JrӊS2RJ⋀*5JTQNr~^qBi|rF"PgRi5BpF~@NɟY7e8Y-tfNs9^2&Oa)эf0HҐSbqK5@l"xڛ.[lAͲlU Knx!u_yXm2SR'g9#HA+4mfd`xb O,)/ eZo}Y`&$5BR<b !ZH#TY0xH$ 100644 vmfs_inode.h#Ip 6(45`$ @xeCͯYKmV \x[xqi͗X~n#X\XPY\_TWRT99#HA+4MKAA43(`Tk O\ >9Au%ܓu$D9 t 7WI 68xڻsg&xC[o_鳪y*0񷒷\N4_lɜZo6م.;Թmh``fbPVYWJ]== 0-3'U/ZszNMܿPИ旞א.:ȯYRba V~C;J|r,fLO]C/x;QQV1D,78>%(DA+E'9?D!9#HA+/17uD[ .wm\F^x[Tw`i|rFbVf^~Jj|Rip> yx[PCvP~"̼Ҵɂ"y,^Yxڛ.>U|G"̼Ҵk9%&ppmV,d GAxe7`i|rFbVf^~Jj|Rid95l&iv`AB5ǧe'jMe5_Nnͨ8?˫qj՛-ģUB;pJL.VcnpXVxWDDG7P1));rec5 &!(entry = vmfs_dir.))e | + vxڻsg?[2(޹O<7ݬTᄄ?l wn540031Q(M+O,J+`иQt!$)bFgpNo\w`Xo b. 孝 rYQcрegBD 67%Vx{i OZQ~n|AbIFZd %, xڻsg,ES45VsJEfCfef@Axڻ{VeL(;3s OQxڻsgȼi5 "hYр ox{ lr% Z)\ y% ei)Ey%@ɚlYgݞ/ɓ` !:ryFfNPyQ%||QjbFBfGb2xhjR"ppl5yr$_sZ|x Ex{輡Qgr5{s:g0} vx! Xv!Y ?tfl xڥVmo6_qsRe')~ A3CSDD$)cY;R[ԑwÇGHx*$oӐL?/g2ΪR|YN2qV xYb`mTMV#Q:"zKUК&dq!x#VO*uGJR2Cd-J`]Nq Nztu`]?k26 KR`#FBLF9GJenGB7ۧl%硉ᰄZ*vXs_}VKlȀ ڰjPͿdShQ. C Q}jUR d\h{wfdžx%>:O԰yQTv0tVߓJfOtpb%G(t6lsl cOfw*0jeA[~ ;ϬI#uor{\}q4 } 3ߨ=.cf8?7EqW8kX0\]utYTk@N 1m.YϜY y$$ƈo;jW]o {F2 MNǟ \8>'ZX&\G%; OC.8>s#Cdpo̓L1`iTePNuYu-u}9ayc<k|) *Aэ]RPYS[V}?H5ޑoHh 1 sE4ѯv4A$]2R6PA!Ai 'modVFH愑&1MVj> zӼC Y!bhd={Ǜ3zɥ/)T:xڕSˎE LGbEtDR㜰IEXN}kV99a/+ p3JXMS̜r!7IQa<4NͣbOX6Mi%I"i9pmun;8etG~cM4A55} ~{e[dX$ )qS <]"teE@7Bl {[;yhf8 5%i칌!E2 ~Vu?JbmZ<ş#Cv{;~|˟ *V#)~X%7>4o#HԌz Bdsa*|*N€[}EdܑDUr菺O> ՍաQ5[{{.-.@ _ ϟÅ_) a8g2[YJs aw-\pU@fػ/Zy\Ik얛yz⛵gů7zGkzo(D^K0xڛ0IaC1W|ZQ~n|AbIb63FԒҢ<ܴ̜ SGA4>9#HAK34MG8 (VZYU-#$>3/DCsT &!a9ũiŚ֓[.ix: Q`t{ Y)*~^=9Aaij3Kkx*qA|ɦ<4T_xڻsgO㓲e;y,HjZuj +K  -xڻsgC3G/rg~s9ӽD,78>%(5D/Adkڧ&ZuվXvّɫ,6pr+'F㾝v#V ԝ!ۋ6Oko=qƕ 5cQS1slW,WKK_xhjR"p eƗ(h%%ƧdM.d\ 6>W Hrͯ7s3NbN+|Ϙqd)8jV0c37!fx*qQ|C&;KZfNvɦ<Zmxr]3'+KY'Ɨi{:{:kZs)((d姤gV**hLȖT sq l^RNv<3*KJ 6D6*'N>kݜP-O.6ūGIA ?ИARCh>H䃂 83i9x\CBuint321, *) /  Rblock #%u\n", wf (fdc_base << 6));  PZKkx{iE A7xPO/%8 x;X|!e̜G! i 7N~FՎ "Z^fl~H ?xJ n=/<);"w!go100644 vmfs_dirent.h.U%rY IFdzq>>kox[jl32#ox*#!%-3'us"{'8m Uxc ,lk}5f-=uן[C\50*100644 vmfs_dirent.hۉ^BtC0Rn*l*x-0]`f'֟L;g6x[j5C{ Q oCx{/rj^Jf0}6x nBc_Ƞt鯳 Px{yCBrFbVInA|^bn5P(3D(ؚ ISPԀ+*h$dhjN.[ -M+O,J+)K)H+I+ֵ+/L1Q+JMۘV Ca1ФS60g_> H>x! &:wqK}CԧyPtOxyC[6D'u#N Y]x! y_Cl:/*宝Lz(xbB>BQjIiQ~.;$E7`8 ixڻsg—+ YԵUd/Y lxڛqEmWL!#-x: < u\Se>zdXW#s,`Xnxڥϋ@qkv!Awe,I7ݲzY([ݮnA/C~L`~LU4?!ODœ-<{ia:{owgMA#gfRuQudH<;=I[Xq SF*2lW( T)W#b s(Jb ya7̨$f 81S_!@D9"*P0}R:$0 M8Xa[&gM#UTe*\J]IpI&3hR˨{gszne}̨c4 l|$ofs "Ϗm#EGFaңI/OX;҅Rp3LKɳsNb.z.(\7)H&-fMPr)߲O֗q<,sKӥj8ԟH|gRbdoŝTm[Նju*80|W/mX׌o(D 'F65qq 9$mQ*>IC[X-VS(Kz33օWml?~;cБAt+rƥ?)6xP \"+r%-wP đpyQuC?ZAJNtV^a h{H>~+),a%lBxp}Ic,!kx;ζm=d[yxڛkm Pf^Z~|VY~Nf^BZ\j\ i E)i):Ii 캹[GA h楥h**j*TOV|Ac_q);,hNx: ܗ)<,BG 1;CE0wWmYg2xڻ[g oSxTnC?rj^Jf26owxڻsgB{G^y#\[M,瑍OX (+x QuC?ZAJW-xڻsg8 aqߞdTXîn6& ,xڻsg HGd>RxUqH؜E-XeTmNx;]af|-Mqxڻsg ya?z5fNݗ2C マɛ-Xetx;x5bͫTY6_SJgy_w2 Kxڻsg ȆY%^Z|}̞˯|s # nx;x?kbͫTY6_Sg|, Rx: F1s#ɩ–qw1V*p&@Й%YgxڻCco>x)]95/%3 )vxڻsg ȩr>2~u\yEf VF} lGxڻu"iCJG,  :xڻsg H̏ZФ-Xewal xڻ(rCj|-8Ex: 5t9 2to#;̋\ԴApc K[x7~{MZp n$ &!']Gx몾Way%E:U8`2*y6;yL|6xڻۣw*_\.ɫe' N>6Wsz]6 3xݢ>dF6L*xH ;_z`VW, k=sa100644 vmfs_file.hc. Dw^I:[G: bxqC SfV̼YXl܊RSJ2Rrr2KrӊrAbi@ujiv0;8x3J@B֛E<[-άJ i ăGAǐ{ .ɷ$NΖfy+;|J0xaC sPjV 4]̼YX6fڜ(Q_`g_Y:_Fr2 x|RN~rPkZ:Ix9 ,t<诫xǫ4<0\4i_bV?n8gE/xiŠGOsdqG)Wx;$6_ed\ʸYm- Vx9 plz=4raZR[P4s0w5 bŝ^Ew=x#0EIn6C3ro MEf)l?ܧ0ׂF78h[Gԟi0qr Dgy~wL$@WM_ӿavNlZӶ;u#O,M,)hZbs %3VO ?f黲㺂M,?$3(O2n7NxhS 1e0hI\UL_f>.%(5h`}i6Ӽ=ySB, 3nwĝ;%tABy Ah^|ĄW¿pm[ܑCYd=.Y]7<_' E(}X&5mWOҍ};_=FS!ۋ6Oko=qƕgqx5?cԿO?e&$&cv}dzPcqlf00(*j1Zr2WUh/9.(jAFper.lζ_^ԒĔĒDyU=WBmaشXf0H9/գܭQW!+-)y_Ʉ8ox2O{,xaWEar{˜}㙫?F62arxڻ~YmKĜoxg?7O SZ5I+-NrvqtVжUP thn>*AWxڻWR(3/94%U$3X/7kVU,ʩ aA~ V *~PM;=YO:x[óg'H1?{{Z%-kya¢ͲL,n X~x{{71#;4@vƈN6l  x[3!Fv{Os֜ 86cc*L,1x (RnYJKU}#5M7ڬp 95x{(Lr'rNqvp:n4a} Xx#hE_A9v3Xvdx#Cey[zþt7X0ˁ lrxڻKi+ͭ,&eGx#P뎙6JĵؘfX0/ k6xڻE~BV~_ x#rh蟇o+7ܬc3X Pyxڻ~D~pJjZf^BcGwhDU;x9 \+< 2`}{pN~bqZ̐1^}Qa~z6wx9 \+< 2`}{pN媁u-$%Տ6%GNxS \+< 2`}{puiLAHIUjjvVYv_S d6&mx{֨"=q/g>xH <9rhOP'`100644 vmfs_inode.h) 'lLlf(Clx{ab|i'<1l_xڻvDu]͹ϙ'xP*2i^vyGb''N^|  xڛAqw͒*;8=PxpIE #{i$p&b&f9XxۡKeCE\#&/I#>wD^y .x8  23lEW>g>N82AsP̃@X$l xڻWjU͌j+}^x>  TT~ӻ¯Sd]ڙR y1P ks`eoLxrNJ);'`x;op>"397xBIJ]U-j>T6x}IN100644 vmfs_bitmap.h U9,$cKK`o x{Tqx$5R=e xڛ[k"d>AX0Tx z. r%[C  vxڛ< '-6k[m^-V9NxJ =tY,a9SeV100644 vmfs_bitmap.h' E|m=5_K9|hx{T` ^qX7/?IMg?iz /lxۭHsC$\"qr;TKx$"jsј񹶤+W=_lT | A+xGzm<C&,!⳵"rW$buf+(iN#),1)free >=%n&oex; wst >؊ rvP`hViziMO.RxڛtMqOf̒ ؔ6g2NȀ 5rur3e\fϝĨ0كo#k4;XxڻxFqOffɆ,eY&7n.b8y :^ (XxU bx +,"Uu ^~|8~,yjCЇ$H`h, 1G _iP9\R#kx;/v@l3d!n[*g{xٰY}E6uR"6_b6cc fxr⼁Cbd> U+JNާx ^x340031QK,L/JeXoJ?MSS14?(A)$v/˰VSOKĊ"A&fe2z:g%4{2>sX;=T_+U 1b  ijY WG_W/X6]F7LJ P!. isTwE3ASRJrӊ?2s|u/m`(+(a0֡{eۍn=kόePE)ɹ)@Z϶<ήf͓se0([YtѶ^G;EB⠊3ƨ|htwEEq.6#`TXcCsI]wzlҒϾ$Fu(w9EICf=o[E M6wT ߺiũ@(vn8g")ڨCùiq0QqIE|RfInbθnbzfV)\\Ea: z_?z}7?[9@M(FRs/gb=S]}ykoϢ(ײ=^ܛf;o)~MQC}Ϯ8=Hי~3{4ĢDg ?!m}i%f0|햓59ӧ|xfELPy꫻m"b z' CY?'yDɧ(NH,iۯ,3/?|Y_(㤯WT`.k#{C^[bZbmNY.д='0L/vZk{SV+tU u>per.lζ_^CVZX40,ߺY?Ȝlt ʧ viFDde9 /:ɘƻU>`Q}ک _]]}-Sqx+I,KҋN̏R9@҂,83?+%54,7 D覕rsVx;"Anf3&,,E)9y8 &qL*M+K|3 ͵1 *ExڛqL /T''(dmEYjʓ&P㛬n1YTlcErVW:Ma&\昔[ iźviII\ 0 5@5P^rJ='oQƨ0POjrEHjB@>ЅE N9 Z\k(N&pOAR2_BM3G虗:YBEn+Xp2(D>TK5oKh“Z еK8 (95~ٝQV SZQ4 :j-PQ?Q\$TDe!< 5K!Gtr6? ̾9Xi=4Hx{qCLRNv|NfqI|qF~ZLDz#͹5Bڈ6xڕUoEW;m!ʍK di]{Mvul7 E$k{gz?؝mSbUW$>|V R ąWSTVw>{ܙwgYm?gr(/g0|osق[b Br0t_[d(͖F~>:PĮCƮ9mC Gj}=a~## 0B-Uw.-#øQ!F,B/?@32JN: Glb;OՃ?9ﳋ#ө^`"VWQ$)bU2_~,2ԡ#d'X4C˘.sgW l{֟䣅\!ޛN '.blmZTW?'_Ja= 0d߆L' qEΏE~kkQ,J5vh:s$\;_ &A+4vkȓҎfm_Q㬝5vX]ۆ zP(hݢɉP:% Zh^ج(Xh#(6pRq4?b45ôb|7r\>I.<9% 4|*̑?sY7" VX5xHEDOzEܠ G8^N\yK O`֦* "ZMU-R;9%AfjSB2&A4.R/ʁCm{qn![/磳`;::]Kݒ08XN]Q'@Q'A6Kc"1ZFejd$ 6UD JU!cJE`JʾXL jn }%+c W*ICgX.pt6F:uݸPHq۸4)-nnU1 y;x4Lv̿n?1 xڛ8d)fA̼ҔTĔܔǘD6I7nМ9]`r #XtsH~^q?% Z@*'3d_)) PUh@UA|.\4h4&2օ)i5|ֵK,JO֜m"[,TmZYPS %EɹXXp$Ё cC/mWKrf(d:@H|YsqQlJAbPe=9AD&'X񂱢}ޜpݓ9-༂̂Ԕ֖jH -",Μg% 3Qar+¬Ԕ̢Ʌrp&_Tk&:D o]C5T£AQjm;x{&Bt,; &?`<ӛA 'x{!LdC.f}VO&ƴ͕Elx[&rZxCl"xV|&i )9y)9 \M&\~5ԒҢ B.xڻ_fԒĔĒ"ܴxd2 %e&@@ 9,L0  O^̶nQ6~ %..Լ4.o)@x=kSI+lG$0`kEB=Hjz/YU-a{斝ŨW嫪w7l}8?dE^yʚH,qYvw|$I|n:*vhOh̆=9&Xm6lKt|Uh͒rgE9s$bV[dbY؏]yXh|k oY']ד|v#~=ie\f l$}m.|yQƗcT.fS6j?ٿkS~s͞=cUp]y Z5Z՚&l2Gm1w6ЭIWkWBFSaL9lpˤd(t3ʭvTPwrƋr +hEtV.>BI'kQkiRMnbv>OT7#2s9M\6_&yrΎ G'MB6l!+?}W-l9e67^>;f=֎ߞEad"'@^`; A{f|qZ$l^ /_pf\3X#h{=mnTz<_^zwqVmZt%F-os$,D[ʹ~ߴ~Ӵ<bx@~޽M W3|eWӣ#nyq~h0)FKhT@*|@~'0t709erj?+p:@/^D aw X`oP醡`P]iҢZE|ҧQ"$`_$k˶8hO(2 /??PdFc2$}{(XH{^ϴHV MYci1ϋ$2Hq&"MZ]r2$dƓ8Q٢Hw7%LEF:5-FL,14xS=2>Ŷէe^Ɠ>J:ɗг^77C3^OspRNz)dau֓"u4PO|׶^G++h@^{ۧ*]0),%I=닗WRAuInΎlߠuk6{١s&|kaXus2Hu}a)݋p ՛ n;lb$,o5ǃ><ߠnLoFDٰkpC最(:QYtOyt 0͇iUAvxwݱfLezH9(8$2}£_ RPKb+㦓6 "#XwQ鞳{f}\I;؜rgƢo;]'nmm^2NP>|V+ C8S/I\鿅% y\,`KB c*;;;$h]ml,E~xe8̐I`?I҉%;|5K x %]zJ@Ŕe3;(BB{n"$I>.esfdBP,GA(I~nm.Ȳ\ 4r cp288ao!<{s a ?qF_6<ЏF>,`9dL}}!yz#JԔ Oyiz65FOt8@0y:Cm[{5|6ᯖ~WM3-go5M}ao}&q #=<,r6E#֡nge ~p9,6 w\Ee\xM/KK[YIΐ2~`t.ħ1fƞ `xErz6b&Mw{Z?f[:t{=Os/[(gh @[SFhHb9meوT+ U-.c[=v$6D#Ѣ`4,q %% < 3[N+ؘ !f%߳Px"Y]>%k "!~U'J'7ǿ*,S/9kG9+ 8LX?AaB`wSFc-LK+$)sOk-N[?vR61oQ%]yS!Ii^DޛVÇT| ʟNޑf8EF{o&i'L5a4.ph{lK ny34QMFvd{ۤ/8)h!A'wfTCE "X;6 w%N{WG+D Zɇm-S@n~>a2 G`Iʃ\^DQU  OCVəU7 ЅFx(CzVKddzH.`ק$ˋtk! H@Wĸ$"蕳 i5&mt+NUhxM: mt 57 )tlK2q+ۊ$m,=5IӭL3ʅJ%{TԐ-K<@.8,cJ\ 5ki13ʷhjh0FYR7h0OWE}哝s0T/Yk2R# *@ւj(:TMdr. HD|vWQx1SEɩm:Sh)Zd cHE7mP6:5WLڴade-m-'k% H_HLB[aA}kL"=`m+PT"Cܜ PIe[AF9e911aI7*_|M |zoH#w\j}H'W5JH#_ըCEjVsiI6B#$*e3 u=מYQw"#| C* ~w!Hzg(OU= v9XJEͣ@7Âo՞#B_WD*H( [UM$OS+Ώ͒|YjŔD5$Q>rn=b-M}klB )"+whޓ.z}:j5lݯ5j%)y aU{g4TjgKUCI! ^YY+!Vì[2~{*ϴMZ6u:"M\6N'p`xŴG7Uu1k4=YXTA Fl<c hHit:{FUZx8\MvθMǚs<2Wv/iU DAm,F _ r:+i['x$.z:/]*BA he؋- Qu ^pRX"W^-׵):{/冓Ղ/Ɖ]Lnne.+)bh' c?9ԴH{&/,T6f\l$^\nC!s S-i{_*4;#:hB{<q3CڦyK/r&= i#2=TG>Dx056A6ƦAU-g`.9]i-2髬x<50x`,ؿ5k_KgQNe\IkuWZx ;!hu.ee=cJ? #x*b~ ՝o^h6^lt! i CA}͚e Zgy>GQ")x|k'`!m59 nE5%G;r9ׄ*,[p ZEXߑRe=M{˥KZIH/d{VT6&6:^1>xnA,B_ϐP ߂v4I #2bilyв5\ ;jv˲ $R`?E2,/_7tbDP;}"l&Ð#r"4RG#dHP(cΚ k%<qO#ZE,8ʫ9'b`X]# jdUJq[+'>e`73-: V!bA<,'t:nۗWml|x;X77X|6P٢g&l#q4BZIQRG,p[:fY///QՋE[{sQΠpR=" "M-bn4qheHݧ "urJ-Bmz;3Y%ھ5YWw+ ;ւgͮQ] Ӡ**~A_lP*倗K,D(Jg1=tE615 5$%Jey WrmFAsa 1G{4Nճ4 zֳJUӨ64u'QcC" >QFs(^N7^u;?ͤjX&֝l0nT ڰK*ntϸ'?xFhYD˴NEpTdf4V$N7 J/g$')x8#3@@2=S[F[&RGA1gCY%Fy|;񫈴5,CfYk%?łg]joMJ-\0;])#%W-|J14ԚEqS^pV-"9bxP5kxjWa}AHE'51$b,#}QpϪ Zk/M%!*aqz A#EX|vu%"#9vmՎlHSQC~*m8_bf.x5L,7 3LQ⤊(rlO](ɽ\* :栽#zĴm83yn?a[}ۙf}T)eGy#x/E27M(tYq\'wܸ&Zv}lSDkV=cY ^mV w K|,I93Us}Iq)J2^4ߟwQ_*@M>[#P`-EJa2u#ά,I Ng]54 CMgTNUVHĒsp* 1= EG9[ %HUJ k WG:*򪝐B1pct^ˍhͽoOō&`7q.v2rwϮR]>mQ4Ckߕze*:`]{G2d<۱J: "ᚙ(Z8pMigQ%[M_M(!Q`Op?ر 1n!adZŚ޸/=5{L|v[[gfn%ކF7.[S-|LDFH:5lc9K ] = ? |/xOl2e!G[WZ\NXM+Om긇Rc0㲬S4BOfʨܾgbv$ o7щ x)v7IAr:k >tV o#j iiq9 2V!+Zڎ9AKak,ӄ5#mvC dlޤ|uuiD.2uB3Y+M9$' qy.lwnmv",5E.g!NIq-sIi=H[ s~u鷟N5zhxMU%BM;{GL2.$Щ{eګEUB.| j*W%_zlLu  ^܌"޼Rm EtCr Ub֧hU%ŖW[M{ˏPyQ5Dec RpW*7oxq{LH6hcAu\678Ѫz|LtbЩgFƬMEq55>u-?u1BI3޲-u`"l6C *00ݾ\8#z&q&*"b.ej;lC-^ZqՇ^\1ڮy=Jھ#2vg9&UWnmiNg|]u.&Ը'>teV+p\$j qnYqiG%U &_QtA l)*A)lJ3%!UPCQO&|LUS\ވdQsn0P,ʲeVAk$VC^YU3퇾]#uSTUwGwAz} %PNUedO-ո.۔id: yk/-\Ϲ/ػ+-Fo9 9Gס YRUl5S%_b},hUcy٦ikfn^YUy7qK'?E=fL5_N@͚j틋_r\nf5ބo4N |y׿IHNA>J>! *J)ٞWrg8'+SN^s(#C*j@&b༢b GUW/5{`>dzͻA ; !_0R1 wRz#߶|&?f(̫(=o' -.OgtѭOzɢV`s6`o З(FAX&IZdbգ85U7tlϻ+hdM;QH=ҧn7 w@ۈ6>9[1I`6odJ FM=}UqyfVEs7g6]a=@wvo(ѷze"9O+C74J9sqsy9w!{k̑7ep2֙y<2etC~ؔ}=tʅLGN7\; @~'qaOK {axڽXolX@adۡN@Nxqg )^{*eEUUUU//}Y@+QR_OT9ΗTy{ιw>=n'Gb0Uw` JZU*qbatΜ-eC sVs6k.0J݀m8լ1(TEiq62m&ۂ)6^Ue[:1_f8дu[3_u1p,lvTجF20\@AIӪVlpQE٦V[_k0[VnT`@óiũ* (PPVCf v&gxl\Tݲjcނ憼{8 FCYM2Mt? @b_,^^+AnϭJړH,fL2f@h5-4D,Wn#OnP,=@3P,-WW9[)r+pwmj7CUi CUa]wHVB]$=2Pԡa 86o&)YBd4Jƒ#@=P6\Sk:b/_2z`ug6 (Qp&G+Vqᕛá.z'=r:&&dZVmUeejM)d ĊQyu#{juA\-D((;o/GJ>D(址(kגGۆB&=[zr;{Nbv$)wIluvu"k U5ML>VVB7BF)Wހ>r̬4д{/<$8JYYtoяP SOx +V61yZA|koAV)Urʆru57nw*'(zը>S KבCV}wB|X+!GmB5bmI寳}C0Qb_*G0z#OKG"x >n~+!x $ԥAGLOuX% (E,>zM: ̊lXUJd&IXPP}Y,ۃD&y-\ M' _0.jFp

9vso2}|oMk#yOeNIgU{s@-!#b1敬}F!7!Tў\:| anHwpbt=ǘNuJ|RƎN||&60<tp҅{ҤqkL$f0 >;!Pc2!(\3gcO:7]_~ԳuHQc\-gWj72Ic?8=iѶGƞcABI{pf3%EKM+eHh@q_W??-LEvvWǝ9T濙}|"Z,n-Åҵ`z\?F?V;}a t O Wn~> iz.|Doh0yu;K\ȗww,> sj)/U2pxnO觅 *M4̽|~nA-o-ٵB!"2X8\Y~a9c尸?m]P҉":uѰl7m܍L(w)Ur< IQ$U DO!ؽJ2l8I")xuQJ@?DJSUIj# ic9Ş4M\K/v d%|_%PqyHֶȊެ#0XEa#C{͔s¡ F1n(fw>cKS79y۳i!K/$E|Ҫñ<+]\ SQRi@i v ALxFڋeG&KGu-IODbmc}9 JO12Im Դ^Τ;qO\1HcXGjͤ,xun@JiIT"TRJBVAwmudo9rT . <Ȭ]ܔ7]?]gSam69sf Og-x`$"ޗ=_6q*~}\I :mZThP H-t`mTs-{ @*#Ry.$& GjxQx]_: CføBI@DЗB8aLRAgQHHqs4 ͌ɩ/t}C%ء|-|yl}<дUqƢ5g6:-\:ˈ&g;(.XX댭4 SгH!($%2`k4o`ivTG 9yÉ+=0c@grw19T6_?4-|5e.j~QE^ Fl۵[Yʗ JD+xڝNAǃ K1^!/l"IT*D13ݝ3,Gb@;n/ -{3gsL|=|.qڌONfarjkYہج[o7Xx_񢏅 dBB"S} ;6XY@Tv'0 1΢ 3d71 6*16 e'tᠲ*^9oa, CL=ew 0OcȦ:z2FvݻL ?[ŞZLz/!w+S|/Mې1@œ)MX7q؅} DBT"rղ#`lfV]egDZ`^)\ZV&3,)pkN&6c2=2f>ݪȐ+rL>}*#栊fŠ^kUjcc0ݒ/LqŘ`_3kԬGť]/rPѹё;j0/L@㈋ t8x1z-5g=!=qsOoL^a #;kշNM\ J2=wK-Yx ڡw:o}lW䄈6P#ygd=:'oѼ,؍kA6Pwruh] kE_3V4owuv^VS?kygԧrz^]?W&vh&Mk<#V6-Waj&Źx%'#Y = هwa.*W(CESa2:B]+%7/k]:w 0,hh_oL0N [1"0 Lt.`L=I&u?{4C_5M6:S\F,T0Dτ!*Nb`)ٞ & ovއE_ӖF~:9a:mv@7s1s4gZJ<:˻PS盺61+.WuMl؅WxQ[~سšRUGjmBvUXuhmW5?--3hV1W#̫uVoV.5`'gxaX0[pzx鲖;boqabvͭ/^RG 8xڛ(^J]<̒9|j,@76cs 2覟9U-ޱxb)0"D@a,5V*[rM.tk'sd8Z_EJ\jl1XjT :5z(\ ֛j;E# y` dE/DOG j wQx4@I˦)p1'KJLfoo/ݶ42NR]M<-e+E6;{7~֜N1m^R^J^`K3;Q. iSn b& K9yo>=^ص -gmTZfVm2=>`H<aO?yXh6KwRauې[`ߌOs#D8UYέRt55a"{vƤe7lnFBG`Zx$v*^:9QK뵒w%/>'8I<."1eP3d?[JX7?~M +)فxȏ{AN5^dٙ.-ymSI՝o׍o_7~9b?D-%;c;WJꝂǶȇFuvp{O7$Ȏ>\k/upO_*M;Y@7oCN}R?><=3RAo1r滋v,z3 1/~s Yb*/3}:hGs|xa`U5 ʀ+KB=GZYZlF\]l?~@ĩC5>Q <}&;Iߒ@T&* iJ98*[\^R 3E^ե-ei6{Apj1[f*N|k`wi͎:n_:s<>vr^lBsXM[ŷ\jC#PFк iÞH~i0*+2n@F"g rdjJs)H{бgY) qҲlbI)Jqe~ZLa4qיc}_5h/Koϲg=}L62c{wloJ.Rx2=~ƨ+kb܅_+˅Xԯ4U}ݔs5-sSjV7&i$Q051n[p*UM:|9x[ EvwfҼ<Ϳ6/c´3i ?3" 3x"{H|H|i^v^~y5Bif^d+)Nd7fcܬ';L.dcLI|BRN~rv|qfU+)2. Iũ Z eii@5i) z\+2sRbZiII:Z@$ Q "2tKS2@k)8e&(d&TM-IS ,78> .dkRR|Rnv Hsfs 2N#7w[BY~Nin >kKb+xڥJ1ƅwTPJJ7^ o/(JL246uV7Ep+}W {Ņ[q&p? yzJFgm!\`t@.+Hn[GKٳѲClT. vEdj 72&K4Q{anjR!dH1CzPF>x |vW]9ÿ^5 zu[ Cc FC`;O̹ԖܽFj@Rn@莔JL- (9b"ӤB߰ 8u "̸j$z="3/0o&l]tx8x](0)=` *̬)kzw MU .5psw,XVF6b}Cxɣe0W@Bw`}$9r,:$i ֈ x{y łhlޭX4dYMqԢҼmmk.0쯲 HYHSV@S*7Y\Scrd6뤜#( 3bfY!L-}xڕVMLW I q0< 5OP@(/, &xݰ޵ 4BVjܿSUcVTUjժR]{Qڕyofy~Q3Ɠw˦Smh*zQ!xO×gCky?/£j6/;ʶ#x4RlOE`_t{7.~Z&:Μ@^tzSɀtdy@+k{?$;6N0ʺak !qDQy yx k.(:=|W9~/ ծE$I$+d^\uL XV(ָ[RN( ?3*\vv?I9| 7-QRi~͙jL#wm; 39 GɽfG2u8(mt%Z!NQQˌ)ɣey9c tNŌ"/˙fZT*T_Ϋ7R yRWLʜY,9Se!2q/v6Y/+li>QY$ZZ.fKjݪyeUh08RPrSS3+,X#DY†˪ zxl~ ?zQM, OTjP'귄YR ѺFDI3'[-j4)"g6b$ ɘ$B!p0?hR]<Od13E5:jfrYJ&$X,;k9[@"eA.)5m2IL]҉"@yERPOѽ>:͹gkY-fH-KXWy8)x=;ٓyzRBxQ@W\+O)Q̖s/A&R%ɩ´k zf3.lAl G3~JUܓjŶGE&MtAg mw/9xJ*,*eOk\b'k̽b95<x*> c? @Kq#ics%v~l^:vnK=L'.VpqE `2F/j!GAiNO3¿͠.+D7=3&A (6"OՕeU;wӼqzJ$B4=b Ȭk6C8HH$Y)@U˅5A. gBTYJ z.[x~!.4ɍR/ i'e&ħgjڥ$L/ eҊ;xǻ{j$dgh($m~)a'.9ux}ROhPkK;ҭǔ k]ڮ0@[[x$Qa( xxގ<"^|ymuߟr|x fLQ1F5-7CqBHMҦR7D\e"S~EZAs|v@[)OwlnT >Nb) 7zKkqZV~F8qDOZl;#n)S5'"Xo;r–k|\#C;:_{&`btޏ&aYSQPIjZwbf'v)pG IƔ=׷U meFLD;3:,` ~e9jzYSNۥN ᑓ$|pV!Z?\11tw0|s2A'tZXDlH;ȫYG44TY<3۫+%ZJ̬W#Z E-Kq $d1]Caq@8b)z^[fL3Rxڛfl,fܴԒĔĒ ̼T]ܔ ҴͿX'O㸤($C# *rd\n{4xڻ\aĔe&Glb/ E+x{pPaCO2@cx;!!gs;OSf^Bf^~J*LW(WHTHIWX; (QV/QJI+.Q(OH,RkO*M|? k+^x}JA 1wzBQ D; Q a]$=-XMo gw˅of?ovm1("EhuM-.~Fz8SH_rkTM4Bj-WX.۫ &gb2Q}iW.nLk7[b,W˶m+2Gd sn0Ƀ1~*~ 3ahj*W cƎɉr]s|Oa(b,vbNⳕm[B#2^u&6?E%m`9=w鑡P3᯶=OhqV)+e Ѧ !x;/ݪa3knbzf]ʙy%f&% Iũ\ 0,)^ (@_K855X$_!)U!-8;%3W#3ESA[PAKf̼'ìIɎ/άJE$_W2K/W^f~B5HdV-i+gN.g5euttȡhSX]&O`Sg (C}͆{Fv5VA&adgl, 'N:LfdSDk SElA.׳jA;YK ^\ Dā\Z (%6r adg1ʝ5dxkUڰY4D,78>7$1%$1>#((\!7%c;FwX0MڿِÍESy HfF^f xۣK{F^) R3%w<%.8\'57 el)(2dyQ9Jb~nN +=řUi@s>#<@ /*o8ٓd1M񡡞.Nn>~H3mNd|RmbQ%Eb= r Q~>ϋV{;xk槤jZoNkcS칸#4Ѽ+xkx$ZA_K!$#(U!KSJ22ҋKT̼6ERKJ4 4Z.Ɋl&O6 lWl~Xx[ WhvY.<`F%xH r; l&)d|ċzɅ><100644 vmfs_file.h&VTKzLB`4nl8xڛi-ӄ#ixڕUnEViRCCSZiAԉU$EjnvrQeڋ Q@qG@\O 3NM+,K;{oswfs<#s9d=òp % (v/-G@C (XYPXY;(sO\bGz09[7ieYRA*P퀵\!-F@A`> *r,5S8h & @ EAJ. ˡR E|N; f" Xdl| :$gg 5`IX[p\C c`g;99Yv`9CWS j:kbϣpnv)Bcf& ./J0xTcXWVV`Z",krTr\]YI`[ !*aBUh6(e~+Êd6Lh'ss\ͶP ) N"jN7 !L7<ˇ;!L=$M(̟?#1|DЉ/h~z6^bm8s;Do,4 cBjk B;#\dJ7%q"䘅+ W|Y1a~*gc9tf[t8beDtteE$77&׮f d9 =)Y$L!rVo ߬7RL!֎ŋ61#==bqUnZyu>usak^Q7ogVw){T]Ս;~Hߘ>>loyڬu^ޞ޸p lhhy/^5=ؿHD3GNoOL?6b- ׇG"S=N3~KVn*hWc0`zRWOj=GfݐC= T~fTo#rEԗ }6? y!&miWxڍUMlEu6$NKzq.E)V*iXg{w]G U$n'T!āQ.9 !T.plخ3|o]e2:dM\#;սNFW"6XSPk&Nt>&4R 8l>aTɘH-J<6޶q{ adu4U%V OFlz* ǧ06- .tYM)^ߕX*i Z)_Jd}ocC&7y˽C[ՒFvʯh<ދ.KE0W4ݓ&鱏c K ˴h\Ƿ˱*ύ}肤C<ON1Mߪܢ9|1ڱC(91h^'.J05&x-9QpJMqO/ \c/VZT d2Ll"en '`tCodyWTV=+cqɅG= yӡ̳}ݖ.L:pjoJǨ7aA_^`mj__deks>kFߏMR;slK6YN?/N y@OաoF8{BumnωGUD2P|>$7/˯cG(f.Æ @˃QwDX%œPު6W'Pt$iȿGx7CBƓ{ inode(fs,buf))#r ->f#->+ ` !FxڻaCd{?1[m6gX0@RK'?--D x27O-ux+'kOɿirvRNv|NjBIRiԦ$d99bQ'/vR@.>>~.NnnA>%@sttҊu튓ur3RK3R5'JTU@W49BTQCI4{;J4ܴ̒ĂԒ̒\  O+)@:ij*TO),iO+,54cš79)gd*&d+$'g($&(d榦d&T*hC䨢bM'Hm.c+y+@ik.ɉ¾ 5t@! iP(CB(d(ym[!@ԒҢ<ͧ%{wx[!|^lEI⼾! `Pa`:9Y7W&bs/_Bf^~JBRiZZjliE`Dy% E Z`@c';&FayrAQXt4X0W}ibBIFBqAjrfZfjBA~qfIf~>WqqfUj|BYnZq|ZfNj|QjbJbdE1i-J3ԁ*I< E\=bx;/Yt9l5L8tK 'ݜ B tx[3!F霴gn3=]8!vQĂ ۪Oz׊T[vs4|C/,hՔo+= M}kuXmEjZl\0N2ԅve׳LtН;^4sv#1&b hXxa$KqfUfsIWvEOx*zMtC1 ,XX3R7pf2oxxۣMgdV̪3YAɂ93ggx; wuyPt=ƻ]`hr!D.*sBRAR MJxU  UZ+-?s2"126N=Nfվfth4nj#Ø!iCHγvF!l{x[ )fA~f{x"鑟@+j.8&Hm;;3z+Fw^vxdwWOϓ;,R};'#~\$&D' sub_dir); #'l3n4Q85J:;'9'x"r޹RbK=njr,"x[~kCc7N̢= TxJ =!bȑ\ xۭ5IuC;f{.)ɓD6`&~xI$ wV1tNf^LVGxIT%tǛj2f>7 zux! Ӡ:靌Cг 2HYix&1Ah9¬fYM'w)k$dgh*((hh9vv F j i@“r!Ԣ*5dvv9!(ߠ&C3҄'2y4́mi}D6xI =C{xX=100644 debugvmfs.txtȀc]S3*33%#-x{&Wbd?vFXCwxBD's쿝"_4'rVE+xI/u[>Wy 9f^LUxڛ 4AhVA54TS0 St &HYx"2M2z ں_3nUlcyH x[}c[e7ײoܪ:dqmaMTexQ340031QK,L/JeXoJ?MSSb#V;x"byC:C9+3oy~f9Wށ  x/GA)"kih#$#!#'OX&x"׍GmNɻnvcif9Wg/ xUKKQApɐ Q~^vaHA"( 38KY⢖ ZnOh]':# ^yI2H<%M_/]ٺ]X}F5f}I»\&¸`6(IZU}:ͅBc:IcxHLkTj1*IZiƘ(\鮧&t2bE#ѧn Gtu jr ʎPvh"@1G3G΂M^Y425""LJΤ~ *  ڂ8;.e7Ķ^ST kӓG e-mx{X6D8x#Ե%P!J ZAuw/Xo, h 6x;"Inf3l;Jx! #տ]׈ɳlyxyȽe=Fx% *͑VT<\eSӊk*.lx{ab ~l"ܴ̼x 7519#>)'(URYP5CQQs:u,lߪl VP/(O,J״^Hl+E1x ~q >Y%ϊ8-P/x{{F1.Qc1-9y-2'O( # q-x{{Cp!CUOeī;G)LlZx[<1aduZ$qx{{C#3X}^5Zwx޶S|Dxڛ)~YOӊRS54jOx: {yW| ړ t60çpF.-[tPWlrxڛifSxN!EElxڻ?=%$Uwx:  XJ5D$6`@?X}'drvclfxڛzVy!t_x! Bcfߕ% k䳳  o/x!  ʋ fNIJHoxON?C!=  xk /Ê51yZEO [&@-pf6 xdzkF ʋ fNIJH:}\p ӯ+oDNrU1 axۦӤa"%E}&^P(x{{>f|!;i}]bSKL :xreADYAAa5u&R`MIִ|H؍es Ɋ22CeX&?VO MxF 9[kV$+6m100644 vmfs_fs.h{\cjOu3$zG&xezC?L3nKlVxF 9@,UoֽZ@h6e]100644 vmfs_fs.hU6~@rgjW[2x%?9 "N ғ c Y^(G xI =w%yZKsٰ ,!m100644 debugvmfs.txtipڇVg39l%x{&yTb,; 6?`gccxI =R]p)R ­2100644 debugvmfs.txtø DN%&"F;x;xqI͂:873MlF7x{&*mr۝~z<ӛ %xI <> &۾ 6jI=)w(100644 vmfs_block.h^O>ʒšd|Q-I RiCx(':k)$7@/!aݚ (@-r^9z cDr=T8W{z6$s }rQ77x:f,^̼l&2*LR֝&4ٟOyZ>f|*`ZUĔmgf'39CSP#{j^IQ%XZn 1ɋ &2/n?STz^q|Ғ$'K*{$Ts@$CL79MDyAL xڛzLi̿83Jr' pnvaW&3w'j^IQN)\)f0Nx*0Bif^Q|BbJJ FRNv|j^IQkj ^fIjdyn^~u&\ 5W-8ux! t ) Cqk볔Mw0x Vv` ιV{u[Qx;øq2~?E6l ɺYP's=4 xI =XFoM}100644 debugvmfs.txt5M^/` mW>#-޳%7!Y x[ZBlibMglx{!#2f}֝#&xI <DB9[`]$ {100644 vmfs_block.h+:3/gQWb\=hh{ 3:VQxk)Ae/fa;;J3x&xP`>{HgxH <&`F~0|>|܉^6o100644 vmfs_inode.hQ@3d/͌RgTU?}Pxڻus+gY7ϗer k x;C~C4'xa UnY~>}d;xܒ!ߡ  ctxڛ(Nh+3Bf6N{x{{FĠAO?LSl,2Dlxkrj!GjLLV#DxI =OnxcgID100644 debugvmfs.txtr(ԒM<9M;%Rx{ĸ mRs kVl-x{!LdC.f}֝!W~x! ȁa4ڤ"% 0x{{ +or=p⫉.{^q?eL,^`Xks LLrӊ2sR2^=<dwU\muJhۼf/vqH^Z@Z&ffF3ͅ I7 1M8iw٢hC-1zā^4,jpOF#3@}aEL*}1BʸC,iLʰĥřM H[;uxq8wh**eMZ$"fzi""e~}Sw*W/5k4#xc-uSKMahCA8J% l\%'nd"yy7$җ|,S웄6H 0#^P#[/)[I#ǻXU`|f-Ţ/Q|ǫ⯉͋˦zkM׋EN5:97Vl_fmg(B :4GhrE9%aCڛ2Nꪷ5`toT;P.uD50/*85-9REeɔ:C-g}NU]6Šx:m]|eGnC[GW"gW(_s.Ǣ(vkj^ θOl|Y4rܐH3!+>:7?Ϲq'|a`ěfn%=[.5hӍF 03y//_ٟC2V?k_,,ot5\lz: KxڍTjA%X*XQ7zd!FJ+ҖbQ ,n;Y -A@y}A|  >| L;{|ԿX僐 s 5 9vC{혁ӷMkĶ2@d""n;c$J8$ <.ͭ|>Pi]%̓Vu`@G>GtƑﱊx^v](kQ͘T^~v;[!][LGJF=J,Y25K]?Pq/*Bad%ê8-H[rx De G`Q8f"KYIxGEDZc۱ HbdLM`d0 [4j/ϟ4S++I3 K9{hk$0S>?F~_NW̳p gݺPy-L^*姪,Vl+ك~i7I=UG?_]y0؎ۏd3#W ӠY8C=MhJ{ao:n;^}55z]i!WmH%dywC GH,:\/x! 4-ԩ皍5L#%0x S/i4ݢZoe8v/xȸddͻէrlj&lQx! ە],.Dcj$/x{{F]nG%+N_QFiQF QxڻbjCfF/Fܴx JO-OO.άJHӵK+֜#9dU1ɤ[ĔTc#̼Ɇl“ojifŗhjjZsMR$lk'98U!-8;>$25> U< AA Ĵ% t 4Q|ULk_1^⾓gL%n4RLeL1$a8^J bARib t<]\n[QWɅR“y$8'7KLDBk2,IG 晼WhdE BRpAA$aZ.fb R6@oN#% ^Ld$&"AKLjKux[oj4]̼T̪'D9F *x[burCdU1ɢW'_ȮPͥ0YA\l ڶ I9EIK`d*ֶ޼P cLx{{F_O_h9BY"#GYd;)x[brCdU1ɢW7_ dSx{{F񚝢\Ny|T,2 oIx: &1mR.S+xBx/i]9j=5zxF'$Ghx{eru"lDJ8:ex! xW̞!"VX 'a/ x[bd%߅WM#k7YF4ۜ+qx1$&KjO>&$ iE֙6rE&䜬 ;91s}I_^Mk.G((OCpr&9X/x: !J)7 Cv[ci]WKʣk!x ӠY,(۔uCxE{dV̪3YAɂ93gݣ~x j\T $E¶Zxka ɬ^Y7c3nk Q'xQ{^) R3%w<%.8'"#1 /xTkWx/0gVN/(6YW}IA+ZL /x[T{:sN~qBbO>WY~fBYnZq|NYn|2Hvr"ɥE%Ey ^yFfNPN.'?1%5%>$5XWlXY~0r" \ 鴢Tn .-9x  WY(m^{,dglxڻ}yUFKH$xP \Q"~ pꍼ=n p1 WY(m^{JS& :xڻAjVbړ&馕r:9+X*hg$'AAVz%%ﲗMN8ق?`V9ѲܴbzV n>ڶYErӋ@ry9RSr2R'/1,ɸyqɟ'W >@0hs17|o2x Jj;SJf~6Ev'+xK P?eʧj?g/i#2100644 vmfs_metadata.hL;#=(daRZxT ۏ>ə,.)/] eI]bIx&3p+оGcxS>kDT'x{xi,>OB Do `6l^xl 1n3;_QĠŞ;g_)s)vќXM e"$'@>.8P+av_P7K^6dz,*3x[Yd/IҜ%Y Ay i {xڛ(ͫEexi,>OB LWH3l$a  6x{{C.5y)5StW:w6h&).x9 U"W3%i = շ%w<Ƌ0vQ Q x[YxKLdC)2Ɠy'Hso^#U+ uxH < [P/¥5100644 vmfs_inode.hKhSm+Sn^dQ"xkYd,x7w Tkxx}.U8>9#H!4/;/<(dsk.27p0Nʱ9G z9x{{BHPSϴofLht 0x .:d=f7TpL~4R& x{{Bȕ͇J4QPώ < Y?Wxk)I/89XVAE<3'%9(|iT68Vo^)¼y'kx{{BvEs N|fƂBVYox)od+X^=l bP8Gx \Q"~ pꍼ=n p1 WY(m^{3U"W3%i :(llxZ(b2pՓJx7Bcfߕ% k100644 utils.hiLAHIUjjvVt ) Cqk볔k=NtV^a h{H>~100644 vmfs_volume.h-ަCL޾ $2hx{{B6ٵ_6֬yrf/,-x{{B`#EGj?V6~+t #Xxڻ(Bjśn 9[TتUlv  TxP \gS2!Of&p'px;Oz6:NA1<:q;pQ;Fp._m7100644 debugvmfs.c=)=#@m<P&lx{{B`#EGj?V6~+t #+x ;Oz6:NA1<[1xka4َXcY~fBqIQ^JiBfBYnZq|JfQj^I|Qjb P4)598U!D(V(WM̫TrRdTtsS3>]+\fqxtq1 U0xڛxf)fA̼ҔTĔܔǘgh%)(($g$)h%**d楤VhǃDt524@" `ԜT$Q)p\\?K+(){)()ͲN3eG7|^Os2& Ff} KTNf>PSRNI+JMЀ].h@hLe, S-)-0k\*kX9DY, VGA)"DISKs 4(/,)GHAL^&6+Q9trؔdŀZ=˘{r +0T'ɉLNcE},9'sZjy)-Ր$ZEYYr!99Jf>v+WYE)E D'XqM`09Lt27/bf޺:j2G$VwY9| ,FSx{{Bȍ CX_Cy \"x[!5IjCd6͛1\R>x[!#78'm]`x& , } AoX8m}I g`xkay̼1# lHxϽi6S/3^xL &100644 .gitignorebIu3bbB?k@ʑ&6JM"=@l% p+$`Zx#r}ޮ?ho{uoc<+ђ x+I,KҋN̏*K-*JIM*M/M+iũ\H&vx499aJWؓ \9 M 1J n O ID`{x#2rkSoˌ,_dRp{c<+˪ oxڛ(2CxC-Lf^qIbN'``nj:=d9Na.  G`MP$ZBxڛ!Bh'FFUvԴ M̼8Pp{kx~5AW/471;5-3'JN֝^0yVhrlfx{!@hf F ex~5AW/471;5-3'a 3 4g]jVK< Yw54x{!tLh?f+Fc6>OgW`W WG_U3K2R/ k8x;&Oh5'jx~5AW/471;5-3'A9hO-Re۵CN n,g\u"x+ - GNUmakefile# !(po9sx{!tIh?f+%li9%Ei$Whg$'(hiN`tv vUrutu\[/=$3=/( ap;x~5AW/471;5-3'o ӯۮ~)hyV|[`xڻ$Mh{nxbN&Nox{DA/=$3=/(!ɳ:D~wg;r MNMIeL!=G r`b:702~%hxR  /@RMx%˟M}9رٓEx{DA/=$3=/(vU˳ ?pqBsS2sRʦH3ff3IZ^_F_yV!u^x r9ɂєٓe -x{uKD/471;5-3'!d3TiIfN^+낙>=Cg-9!gZ8iʉ)߰s싯73e3x_U6]5~ܛrneX&>+'OFi8֕Ǘ-Y{oϽ}X>-{fgƋ9ՕTA]՘7X"2rRGr)nmIHM]jKW"3x 8R7~vK8HϭJxڛ÷g"n}qs/dɪײJ0NeM ]l2x3{ fkb_NxڻSszC"EM sS5bL$7?h xڛPkC9Yj^IQ]^bnBqIQ^JiFrFbfRiv[pg_H?:MRFAT|g ,'wM>&9)Ey% v ٭@r@hb0ȼ';7sd*4]hfoa_&= 0x{uF{C3 Lnbq|u =\7OV疜ǡlf $xڻ$ZpF$&`|CVTx;uk'w}Q+eY5Agx6m5PŲ&#[AyQfIFlY6q \xD P7aZRA'100644 utils.hP./Xީ'gfmARx9 dZڹM i"bxA ?% n)ߪHxk5cGT)&OIgp;N2JlxڛwC<^~ lWxڻSf ",x+I,KҋN̏JIM*M/M+iũ\ pxJ '100644 GNUmakefileWZC' p]U7*8m͊lMt ) CqkM <Ix{uKD/471;5-3'!LHhZ2fgNؙMZ=xIeoMAT!qfM639gWTR|gC]EJ%{fvzN{Q ڗәNbro8]F~^UUOT ׹t0)2-#Ө"tXЄ4)ۄbY >U) B1!F J8l\Naf1f2bqr/ }(xQР5m1`ǰz04na}X״5fA!3^ Iz䊽 yYPBF?۳ѵDPQ޸TxSEjm)D#-К%?{\j)ad9n5a&?V`a JJI}>_@UEiŤd5I8gL9 ;J Cf6Gy~u4=Y+EUTt $kcʝ`#lUUPUŏ`ܡ$SGL,ƧT "?fmbi*xNNhsGtzwzJS.! [DE8JL2mk:f?Oco xڛfC*|\ i iy K24ҊusS'm6xn>x[l3z?[RfInbd%~z3> 5/>(?7 $C#X'-8)UӚKAA!X.-%YV,78vg, E|_t25~ӃMGrPyLv؁(cA0U6 Qz#>)8urRy'Hr@57Oc'7rO, >U7D@ꋦ%fL(1}f`8M^(f,uJt!TPL Lnt*ԯ9ũ`IIʗY߃`(>? xmSMOA'KD,A%f>J"FLc6vwЋ' o8&\x`ջ̴50y}gٙ_?DU}g9p9 gۓ 1!ǃv>2zNHF8a G(Iwۮ㩈p)nhԑV.].A.4vNX1ǫ51 gkjؤB_ŗMbX3Op8ͅܤd9EvD? .I[^_KJw}\E%nl(lͣpi7f𨭈ڦz  vi7QUNv`A?S"!~!"7Z)'l`IӐ)$u忏Bs*8P52*H>ұmH]Ӕ8sI tz!ag6 9YU$=f CyuXqX1u;4BX5, &{T߀aCmSIN%#ܻd34mSNijʸm YsrAabW0vjq< C8՞eU'`QS2Jgwq0?7=.x 7M_x]Y37l=xڻRjC{AQf^I6=W83codK i\hvi;N%,rx! Zaj&"oM z/x F.21Х;[xD 9P7 NBӟ100644 readcmd.hcOw]1cI!9pxڅRn1>4+q@BT.ޟUe+NHrv쏼Ui+ p₽M l?l֩Պ<Cq]EM1GƇ'CR> Q8A'ALNJ0,bݝ \:eyJ2^J)[i. "i8hyYЂ{-//e}47+P/"D O0@i&oX0L2z⃱mmõQ%J6Hܵ*׵W&`K ̲VZ`䯝*A+T`KU\bb{Щ޹+To S:#׭!,20 =mxbk΍g*@zS1نy%VRi\ @LZ(?DSSSKAAa񬱛Ond&zfkEx[1cC&r-96cxH '100644 GNUmakefilesܡȬP2'{RV 4bfMkg0InC5^xk dk _1a7[aWxH '100644 GNUmakefileM̙#x0~'xH^%2A5񎠱IRxsk dkƂo24tx oL,[J@KVr6P^TDlx$%e7裎-~E9>x7Vt_Eǻpe(izy<Me:vif-I?Uq_|A|9<*uփv7)S S4>Ma&K~} O0bfX|զ c{;GrE./,§,sp%7#E|{!/16w(UQOŞv~o xڝUMoUUhZ%I[;_TMdL '(N]R5Og8U?@zlXdɻn_H  gzc{g'NGb;=3a?,䑠9=\}(wנLp:-x@ !]̀ր:M CYdGJP^D*[k>vPg82v1:g`Ѡe3k m kM/R]Q'Z >:=}[hf`Y{y&D!vC$p3S0Bq,갅wT}9=NǼ>7%g':glm!/>'K}|r&EIS%31V]t 5O.tZrcYH`X?T3VvHt86N]vc|~b]r[:яxU$H6m_׹ 9]E&g,MͲ&׻ʼn!34 IL?U! ‚mR6%u'u&Z1/-Yf)eVހ\8Uׯ٥1WOԇWr`]Dڠ 8f;?ȩč+`/q!BؽLA)5dփD(",gVbSPVCEV]F7훭%C>zwR2.~vrye˧QmsZl!E.܎B:{݊QRx$ahž'V*xs VP(Ֆ3]ETS-v yvkFA4"7"SY},$`m :b LHTLnrOCl_I{hFGRǭ bq.*pxڛQ/)$7 DA+Iz2YJtr3&OUVgNҵ//âbPVMRFsL0-,bԯZP^-{$lx,ȟQV_0yNbJJdEɿj槥ŗ([s)((f@j@B daUMm̒\bD& ˂TiB4X\XNV\SV!I.)7C/%$18*v}aCvT 1dC>a e ڶ s4J6˸1gyoTDO(7ur3(&_V" 3NzsJ +3/hg &x눽a#aYnZq|njIbJbIb|FJQ|QjbZRn]nJNRi5X$3eN[9E&3rN~)XnrWE%9xA,NE Z 3AbZф~䋜⢞.:PǠȈAKKs4IBӊRSdeݐ򹩹drI%:k5-6 /o2d?Q\XԒt&oaЛ,"6YNP}eɞ~*n^)(b@d}ɶR{@ YѢ99PY|e:Ҋ@mƛkYQ9JuTد>VV1i 5H*uJ3J >vM}0'JLWb-dCƤG721dl.Qgғ7 85-n^xs43"Vy&s* h lexڻ+Ud)L(>IEx! *8TMw2Od>S dxڛ;G|C kfIf~, KYV0BY7۱%B2J'g$)$E{8{FN]YԜ|SsLF^nbzfLs\]LRmG4 xڭVKoF+CF D;έ*~H}(!h@ȥuȥ 0x/oA=(sC~J{굳ˇR||;}3;~wWoo@uRgm6YeۥGQI?t5wz}}6;+k4H߯7Q>%"`#oz}#I6 Fg)hG~$ tӫ> Ȍ-`X41K@L@SZrE3 i-zԎ :s`!ORP/%-zmh(:^]›i4.MD3%c1RKZe#C}!M+m:qЦ$$̀ߗ9{"! 8Xdt|SZ%ܜfˠ&w ]xIYg )Zd<րu4FC&,8fèL8f'ؼNn\u~2vpG<*Cʔ)&뢩EG_\#i4R& H1}S[Y9T4 Z`fJO5"u3GC)e#፵^+:RVEǰ@Ş|A'xoZz1;#I^_o_ٯcN2zX6ƉO>l5!$S) $k`0lِQ0hacs-J5/sZJi "ȫY_@ć_~DMpYnn8Ǒ㱁6xLx;u!3DpN(#N ն/T2$&p92⬌3BJ4Al*rpC1p,"W!UsP"mo/윎)à100644 utils.h ;Sgan=Kgtx;pRvI>s[ QxkT=%!$%3dr"ʂԔ4RE|Bn|)B74HhTc# F13Ȁhk..4Tf^jF||bn P<^Sf3$fʩy)i\7,wx;%TzC$3Gf^IIeAjxɛ#Y>r@ 0%xڥRN@ۆ?psM#)A5,%jxG&6)QL/vJk) :;,]{ ی±`☚a&FԇͦCl4jt|2y@, Beo3l%\J8MX;{Ad8 hɅeo]bczxSD/471;5-3'Y*ȯ~Q* bR]xڻ9sB|gLi9%E% *:@2 =7XSSGE(?(1WS/,|1lr SgL'XxڛƹsBkDHc{xsn;xs|2<ǥXyS[=Y xڛȸvܛ1ob Uxs|Q $.蔍=YߵFaxLyI,2]m3k> 3>'))Y5r5]#:"m:r`:0777:?;>x e@ǯڏs!7\VMIO x+yxD1Z1:3$33O_TRUNC,6wxs| sgֈjr͞,zpx{YyhC .|f 7ۙ2M>ob9  \xs|?6f3[\V\Q¢=Yk\xڻXYA(3$Mc &863yfw~oFBV8B‡Ι, a|_ej-BYx NJXv/F,*r{I 'lx,zXa+rx Pe8+REhICx,:XaiŒJӢKrR4LM]X[g 2J2s s xs|MLΜ?_ik{gG͞,$jx;Xp3tɗt&`XaC _x ŻmoS{SIQx{Y[!yrF̼4^,9LLr,P)T+쪓0)pM6V" 4[O$HI<$C!'?/]!-(7dn̢,'?b-(fbJfȳ\9<'gsXL^!8yj8'prd)hiN6S%58̹) M/*p ghZsqMҙFgf.0|pNBNg,p: J1+8T%4GSIG!97%9}6~(bIi%E9y@av&d5yfSiU7;Y,g%rx ޤ "iN9̇ID'x-iN2yQ̢ɱ2`P`jɩ_6g?-=ZZ]ZRR|Rnf5,ۅs7 1nnbFU0V\bF1+hJ2\Y&Z CE&_` ˕\8xڕUoEVV''iӵ1PIPB)jSB(?VY{﮻;NA(}8!'VRo[UKĉfw7&ZK+{}y~kw+42*[Ow.Ó[\Gb ѐx2c7n_A~{0MF*TBeFGB _A*:<7C”|Rt]Q YQ$ 8}E%KDf.vyùS0lkBrԙ.WdVwJ5˦dМVBjvTj#3rA%L4qs fIY;.戺*T6'+-`Km5Uf݅S&<7|)03zmyx)l)5nƆ:م>+kEiEimUZ.l<|IDD}ٟ]>dbo ǣ!t6W%-(]TKt3 xf~xrjBD 8+i05%rU/g*IS3J]7bwՂs:g&&z{gDrM*S&h hvQJ-bðt}GV4QB^s.+F%$&:LK27r_&`oG;8[ (X,|#iŨ=Tm\5wͅ1^&v 'w8)#K;)%}\Yȹ<-i(+!>8$%!Y yvaE5DF 0lx[^{C,lbYm2'5 tSxsC6ibF/|JaOQsN\R ; ox۩L~}N&k%\GY0yGx: *Wg<JD>g pEv`)jڠ9!x[ӪK&#I/71=3YV!-8)9o|yx&Kq)nĒk7 V2D$&HLvP\& .y4fVKyrhB䟢+`7x{(zOd9ff+_2>hx9 k;;tzl7:ԻA^U L O.0RV'gex۩Xh2' kkpx*Fh*<.vqx iF} G֗UxD9* vxh<9fyCiQjOxysBə,Dcx= spha{jv/+ę:Ey2dOAE7@1 PJ}d[= E'Q#fVE^YI@ke&]#R4>3Db`TMާ, 3~rdyK(6+BM6dL|T0qaRGxڻysCHu=)M)?drKvWx*^`CjvK'/dH/-LRPP(OH,R(HL160L,29yUvxR ;A]#rp7-=\Kې8*$9Hsn4lGB=(j'x;mbC BBA͛grvvx% R*p̐빑OfFVVx{?_,&˱x/&C9y#׽ew}..BjJs:@׷JbohBݲӝ"wDUɩ%BQ?:$I l x덞!sI#$|`l>xۦޥY`zvf Nl)xڻ%sLf*fKnEfl xڻ'rWd*f5v f-xڛf7fC,8&_xՀd>F|ɓy `:_qr}_i'~[>50.>y A|@:mNAB~Å6_rZ*{7xkU.p|rFbB|i^v^~yAY%z%)֛g|Xt Gxڻe|xKvFɯg3l^xkl㜰P$DΉ1zַqEf$ Y,xkl"?3o 鲫Š'DzhM R,xkl,2Yi,wt+us#њ `Zx{^yd%>)&j~xR PgsN!h878U[Gwȷ/p~(=`^5/ lU{Ⱥ})V|J<U x[W+gCw7 OJm}x{P|C kfIf~, KYV0BY7۱%B`1x^ 5dx֧ϱ1 D.ݑ6vc٭@ŵJ`x5100644 vmfs.h']TUUeϜhwfp,]Bx[W0kCټ5_3Oޣ{xn L lexڛG~C*jL"Oxڛ̿K95/%3 )Mx:{9EP\4DR/3;B 6p'eE~:􏳸WB`x>!sIB'JL^#*D) sxcN&;:n\]b-+iYlF x;m1b1otҊ3&[ sP@Z1vUQ,?',83?or>dO>A$YL"#8 ' v rմZ7ٗWSVbBNɞ|\h$'e&' Q@+-LޓB9e œ7 Hlu j)Zw *($'g+$L\"t gxcofӼ;;Z§dqY4+blFxڻehCf6+#-DxJ9V;mD;r9E797100644 vmfs_fs.h Y,""^)01zx@85   . Version A ; 9: %s\n",R H u P !<}xڻ%Xr&f#ɊyY&Gr<\̸ٛm xJ9SJMP!A@100644 vmfs_fs.hWLB{trvA 09Xx%53  > :F 8 O X ! =x[,9Gb&fcX&;?slNxJ9/M;R ۣE_A좂100644 vmfs_fs.h >J쭸_okY m\A0S3xkx:F⛏rXAtYx[,^bH|i^v^~y5Bif^d+)Nd7fcX&;?KK=x ?NݸǴ )1Sxڻe|xC1jfFNqjjFY~]ZNA~Nw|kn"E)pIi:9y'd$̒T RVhA u swr vf8Nxyx6I\aH&xڻlhC1BQjIiQFAQjbFY~]ZNRiNNjNA~,;aʋ2KR*Mgb Kxcofdk}'q7,J +xx8%?-=Zìqhc PHhdF0U)n6wx{u,kCFRiBnbNN~FRNv|qfUdC!'fhwx8(E!M}2~{Rhc PHhdF0U)x;՘Vqnt͙ZwFLcx:mMW5Iϕ+F<Yq8* ~v3Yo!.¤ekl[x;paeׅx)xkx:F⛏rm_jYx ^ݛ<ίڞW!:@bU~rmxڛ`jPpe~HxH^($_ik`iI/άJOӀYiP5y0$Ё9L.9Ho;.xke' {qiRJfQ,N.A߰art2SRu`pllfV (jiL?y1m"w&qx$7Cv4p|rFbB|i^v^~yIYf'̛֗pb OxH^ 3BǴ$'D3x;5)q>]ZZ1JJҵKج'yj:L\ x!{ ]e#4v/Z SxṐf~ZZ|BA~5Bif^P 1%Ț $b)*hLVTV,I+jOd2,H&DCQjIiQFYnZq|ZfNj|r:@ IvIz)%řU@m oV.Rx!{ѩBon,881xl0Z9M PPmD7ѩBon,88iArB~M۫[Ɠ)}sU-͠]l00xڛIas~ܴx J/NH+ִA *xۤO~C1W|ZQ~n|AbIb63ɟEK42sRuҊSK6pqʗ /x;~BQjbJbFYnZq|ZfNj|VN~ZQ_(?7 $csK<|vi:ji@*)Inzwg3"'Tx)SBRB @BApbPRnz^gğ3xNܠ;G{2?D0QZ/$((L$Sb=I&272VRJ*u,I,-wb?PZ V`7%j|k.l 0-x LvV4ai\ 30&T4 xXuRK633M|PY lsYnZq<%jCT[ZZ.Zx;uLS(M+O,M,OO-,I@ԼJ0 $SvB2l`R K3N(yrNJGqxQp78G^hlsQXJoRKc@eojx7kDtgƽ5<l&%~x;lJkC^}l>_x!;~FbAO`wN"̳lPx;lE{CfCI\$aJx:{H^3=̢  6#Hސ_k𖳸\l(xڛ{&|曼$Z`xH^<S_r2 ?/,E100644 vmfs_inode.hvKbn~Un'5VxcBH" ۘiˆ4zqRf qx8h$+U,ﱓ6/S U e#毘suGrƀHx8h$+U,ﱓz)9l%)!ϓrƅq8GxcN&e?5n~#ErŒ߳|V'xڛ(d曼,oB+@x;l`Ay1-fYe46xcN&5^wTa2ѱ[Âgc ˨Cx340031Qp MNMIeX~Fʲ憌O-_jQpUpBǂ/6F,jx$וa5<Ÿ|S#QjԤܴbdS/nnPI¡w2WA'gU8R9Q7ZyUd0T?w!߹K椮Ne6TEiIfȚRrӼ)% r3o'kzBáP% ꦕMꎺ&~r~/}slX0IРi-jT M=?rǦr$I%@PbΕg2()}Eaä:  Xk9oP'g tN=fOmLo]S]}"iźve  ) )8u[ɫv! *hON7|H\^RnƉ?qL%1yN~q24%d'0.JMLPAҚ֛$ױ1eL(/5|c|x[gf;fm)ׄE7OZ=9F.s&xdz~ZZ|Bf^~Jj|A~f;"7D9J3JLK&%&ȸZ;=C~x!mîKnfvo,+Է5Cx:mKuƳ2p3NVE$в}-# kux{|aC('2"2lRx;/Ltr" ;xRm&67pkVE$в}-#庣GQu m5r~4'Px{aC('eiy))%񹩹iźvE%)E]t#x!~`S5Hekdxdzf9LſAqxcN&3Y_?b lƳjA`ILٌ .xSFi 6DWLp` ]1<uΠB [ǬFeI3qƗ?%U]#!\dx;J{C< ݜ+6[ Lf`CxpaC+ sQj lқϱ1of䨕V N4x;/[drEɓﳉn> {G Bx| . ݟZvMTV?PWS҆R:0┆QDSr G(~Ͻգ#1<(xQj|ײLÓ V{ȑ+8!!'U Xd>IXx[Ғe4@g3N(YD^ 4lx'E~C1ZFN'A$x;@{C< ݜ+6[ 0oexpaC+ sQj lқϱ`292sRsS'e EpX'OQ+x;/UdrEɓﳉN> 9x82sRsS7[s0px!m\9>rc1 BS5'x@@@ '(vmfs_file_t *sbc; t vN 2 /ox9m\9>rc1 B&?4uo@fre_x{tiS92FXn~*δL+ ToxJ9T3;~",:ϒKxXB}\&1*fu&8yIE' O~+0YJd[L^V!-8;>)>8=?4@#)';>3EӚK rP5B!-3z=D5sbQ5xn:ë/ :ס.a bw];4Zar~&1Rޝf!OAڍ"24k'OM.+A-vP5-K r m0^x[&e"[^inRjd+E{Ҥ҂k okx;pa([^inRjd Q{Ҥ҂͵G 8vxksnsޠ&ƖWZ4YOL4)(`s7 xamDhtO ogs =zE9 3/YYOkƓ(OlIx;p~S<)4xks!}!yqnjD]x;/sLzC8V YLo"L *Px! "qG㭀߿[ng_0xc&~>={f<=LHAl x*ZdE,Ql#DxH^<8hRi׹6Փ0100644 vmfs_inode.hʁd6A1.v3Gxks>a!3kzQ~i lA.12O>*d姤ځgL$2Lzr̛qn[#;xT0.vx%֡`!{yy, 3li|^}21GVJW@lNPy1W F2~^I{^U7~śQnÌ+z2fq_(x#+wMQ fENzmwdEE%I U*5چ|[tv ;O쪕P\1lʵ5 j3S@nZXz=p00e0}pkKIm85#)=o]Unn<vxcBȥX&]jqQ9Y| P#xkNYy2:'BJB5Zruu'_ݜ3o bxcBBSolwV}KCxkN9y2ʫ7W`, @UxJ9VA4qրJ@K"Zjx{Hk(fMf?FJԼJ]T40_x Wx U8*5? Y, v-Ux{/"ur0k2&PY @xcip(?&9鑓vNZ.ZQlQc8)AmOg7X4}=3?aNx~,S@zhڪ ',r:L"L@o3UGcY%xC]x;9r/sNNd"0Ow{X8/,vNlZx;%Xz'͑,9'$xڛmd;'TAàB5'bs nf c$ f|Va/ xڛ#+a;sNNi`CDoH` Y"xbnC27sNNln36 49Cdn=Fo7hik1TYqrq&PEځc /ŋwc`YECsdNTfCUd怬 JQZkRs{(J2z=9uhUƍ383M=gBT ȭiũ@&hk҇^HIРI쬯Ķ{~d{ͷTT'e&=.:%^Xf00yH`ӭ ڷ=:?EaN~r6 ||[;-zew``]2HJvdk+du)Ey%@-uC&W7heԶn  <;<;#GBPwYl1ʅ9kg P11bF&|YO= N.*]fezgw>DSW{b/sLfHڜr YQFjbQIRj"ȳG'蜺NGf0}&[x&rrͫyLO$6fIZjicURYjͥR(IF~:/{]x;pLv"nn|Q|BIfnj|N~5`nf Lps K@/ x;%Wf?dyřy) E %\%)i 0V<VٜtTcfRåT49(:K gUڣYVZPm`al 6nCv50. kURyNV;'AD:8n@V&;EE4>PPC6_do+]x+]f?rf^rNiJMqIJf^do9r@"D!7HYsT) ' (F5 UI|"O#:HxڻxqChn|Q|BRN&W5Pdr#\w͍<١&_W,/n2YuU`U `Uj!$D6&g&[CmG>;-dx&TzC3sn|f0,K2R3R`)%EXDKKs3KRsa3Ƀ&g&dL"ř%y(d`"V朜|XX@ۜ9 KA`i?SGx[ 4Khwfɿ@fGFVV50}u3XbXb Fx3 xڛ*4Ahu6Rcbk.l :09Bx{/O`Cfn|Q|BIeA5L )'?9;>3&ys*`V Lìy7/8>$$xڻoqbS.RcURYjͥ33gVesR`UYɛ_͋r) n=x[!LxAGYsYYx xkk!97trK"|%̰f؉-e3KK3CH .x;$Tl fRcdk. +LE|i^v^~y!LX4)'?98*Enb:ͽ,qL%tZ )ω/K-*σkocWom+&q%0D0kxڻ'xEp#in|Q|Bnbzf5P(R_/N-'[(0q,rLZx,σ[ɦ7&[.XFb(*Vx[j7nC Dn|Q|BRNv|f&W5Ppr3޼#H1A8E )9U'HXCnf)es%F%!5C*{x;/EzJfRc҂k. P "kmh b3 ak//C-,HŪřU Mk-E5"C$C͵d-V f 91p,XHA$a+- 0Bgtđ͂y`760px;C"Nn|Q|B^in|jEIj^I5P(^Y <ٚ=gx{zMu6fRcdk.@* zs#kafT[Y S:#{>Xe G$̰Ҽ<#*9pYN$lZfQqI|qjznj^ L>ќDM4*A=ӈ'@>HXTmg#ax! e9t!I&u 0x <MH -h x"^xd+f lgrT+`Q4L, R1Ȇzd,M5bdT0E`EQH !9 C<}]O Ud #u\MPE`|]31 QevVɍr&1ܭH_x!Fbѥ[ܱnZc3x'podcfF"0TdCfQ!x'xO Hxr T{̝,Y5`xcȄc;dE%G:!|6#l^]E.xڻ"o dKYE&ee30 _&@ i``\k<>&L~x%|sFQ4U ȍ0O Ax{*Kh(d-Ʌܾ @`P19Yr5+/AV%Ȕ|µq}\}  S@bN>QDC.}-RH7)X$37$1@A#ĶT b|l-,u-PCxc ȍ6M)J(1ߔmA @ xڻzFu3\lF/rr{F*hOV`,ť+H %xc He 9^{n* *bx;zFuKfFɯM6 V<!nxc #}wU_z'sP K"KxڍPJA%vDž)#:XDEjc,h(}<gA̚Ku9s.>mޯ%IZ.[X@5mXh7Z{1Q"/]+0Tn#E01 =%P(m?lf~0 (*)"<σIKԓqgbq`XnLuyԁhiP!t)DӈSˉs]/A2@'xMlfJC%G7V*[p̾EG\tJ;qČ/T] s:ݵ??wX:O/?x}y^x:{j5m_R/Zdp:i=)*ʨ??x1A0  A*A  $ ~1 s^ g x{*}Rt g̛p2BL~'xcBPDžU^kp/HKzx[oCJ7U MCJx9 ->%N7.!.qbz7h;Oix%JAHx 2YdrRɇ*01YU{slGYA0-xww o'(OTeV ɻXn> ?x340031Qp MNMIe`c/[|fQT^Vtq9X/2f-Peř@/ӗ.|h$*2J ~wlM)r7ɽP%9 kv1+2yaPd0TM۔y9VǛyP% ꦕM³,y+ DL>DR4FKNNɭE65UC2#O,M,$mO: CGT[, 3Ys}O'򕹧/(Oh,a"χ97*NwT'7bɻJ1沗eեd ߼xZN1oZv  ('!do3x_}$- 6ڹ$Յ5Pez~#guj(Ekv?Obd# g6v:9KGSQ.ĢDg;Ք}_tv럪׋4bW ̰>N_:Ӱ9g姀o0?c-BR' &;Lxk>c2y7;0eb;\rx}L&NeSb-,zyLn x%C|rɳ86fAKx]D/471;5-3'A}M涊O6{k 3ZF3.xǾuFƽSy3sRR2&G0EL>d"ipGx0'100644 GNUmakefileשDZ`2D0 I'ڵx6=9=v6Dge=[̜Ģ-dM.'``p^^&W@{oƹ[m'1%gexD/471;5-3' W׫\|f䴍W m x[̺uB7Sr L"Yx dW. {nʦnxx^n[xڛGy5<X-uGx8#lwq ]hN Y̑ZN.E:T44.!)Bnxڻwc&&ln*bu,xgYk&!6 ;b{ "x}c͓Rn:U߫/ 4=Q+lEtOoI|wk611k͙|N2^T=f&& ei9ez .3,9Osa,8'ȪsJsS|2=8sQկ.U, EaÂBӕxoЎ8RPN ~nw׭1a6;(f~>b)BYnZq|Z^C>,I;ydA$Tdq\s4jS$o*k}ULnS5: x[sJeFɉJ+@5zxk9d&Q̼ԤԲԜ6KرI S5x%tg&6̼ԤԲԜ_8 \xFd:p ސRpov0W100644 vmfs_lvm.hfoJ)#kEt`RoL lGx;|Tyf1ޭ,3kxڻysC-fKx}4&LrߞhBͫsx%Bp( %,\\ 86oese{ XWx}4&ڰX{\n1Y"Ĵ{*&7F Hx%~w8 ,\\ 86oeseuUx9%x:$ f4rq%9ES-A, W*cnjx[&|{X X.MAxڛer&zk..̒ ̼T]ʂTMj$'*ǻyƇDƻxYA-9H)*{UX#T$&f[c1fbp7S}1M #!Mu;Xuf v& Box}4&9%Ooj+葹m:稜ULn v x%3!C,7X/Ci9VZk.b`H+/QJ+<#Zx}4&ӛRr2ntyEV[k,^}ULn,wx)W3}; pѓn 2NULL XHAx5'100644 GNUmakefilew9a8ҭ<'h:-CQx[:eD(䴲ܴb.Ĝ+  GҌ" X2xڛ̲eKk[kHgHF :Cݚy2Sѳ9^{fH*2Kr ?m84Ǣ0xkc3xz50'?9hI 3Zm1*zWb`09ulmGmZ ق.%(5hr[-s7vN_EacJbH­Jߤ?FVhyL?jJ{wf)c-;p e JLݺ*sQw~ E(v<{HvǺWJ%lm 5~tӟ6ɉ(#5$)5$ KXW* PoI+v U|ѐss/!Oy~ X5|tJڿS0FD/^6:w7窹G;Mq1xFً|Ky{ >MaV4}-NȪsJsA^uFJ-i]EaCZK>|6*UAWfcx;&{D|&~ͬ,6eKgl tlRx+3Wl&>_YE6K^b%2YU{>5d%SHɻy|'|7d;9x[:鿦B[BRfInbAP@Iʙy9) JeizJ7Gm60{ MJx٣;PI~IbBj^IQ^ZQj?\\ ]x;)oLٴ'ob]9qr:P@r?NE9b|ɓ86P0 xڛ%4g,2MʾHN q xڛ gPO0GO[ͅ>̓SX#CBLKJKrӊr+rKKanN>HZTa7@+/ĚՆ'٤ O,KHML**.ʞ[PR9]i9&p}-9T&ObWrLIQHTK-:?9[!D_!?mw %82'`ט]95/%3 aa zx3wBs~An~nyQfIBZ~BqAbQ1Z"5%94o#@DlTeəi)/O.`U&4yvy߱gYؕSR2ӸBClOxڛ;gÝ,L{ gx[Eye02NndjĸٚI,78,?475DA ͱ(hr!\5r)*%n~-7/ω,&RF6 !9< xAyC";GZq|VZ31YDoaaĪpRv؇ SkJ9%I9řUiv 9䀴]qR5O:M dW RS6sLv݀%b.a/;VV`8&J8%::Ii\\Ey}bx;cthC'3GZq|VZi˸Ҋust\gbw6i"46x;gth;QɿE?N6gO,%Xnr9ꒈC}pN+)H,1I*MԴ') Ux;bhC#GZq|VZ䙌iźve9'+3C0NcؼEOh;0&tL Fxah'cҊustҊlҊ'k0ޛ(>Yds4dÙYKxnhf}FvԒ̪T4]8̘y  vEx[d4hy޴4]͏xx x[&{&Fܴ- k:>drj^Jfz6l?x[={"f | xڛd`!qsc;8'?ټ  xڻsgC7YZ&'L^˺p Rrxkqr.f!aḏ 6kx;λ}L؄&`55|r[l Sxkyr¤=BW`\¼G&fC^>&ܴx *QJ+ɯô[pfk\"nx[/ϻS09B'7poMH+M+b9R'[q:Fcx;Vi2Zs'c:9( ;13|HlQ_3N6)f1ޭ, XoxڻĹsOɍ̒%RL@df=,8rxHk7fAFfɂ͙iI0BB&/ce:GnzȐ/i Dfxx%z]t ;dOrNNHҲ99'7pJNT+235rӊs@"'Ow\oVxڻ.zAt ;Kf^f'LOsJM6Z: 5x ^j`y-[AɈlx;n9ra_X.'Gx7۴8.\ҡܮABK~ 1x[}Cf!}A\Jx!G@o@G#~xk˿'8(51E#X`[FnPTxH<"Oג`LMFS0(100644 vmfs_inode.hΊp~WWeJ+C#l xڛfyhH[&lx=ó!e&e9% Z@ph4]W -x;sg+GZq|VZd~h*] >x9W|CQ5$A:a@UEou1ywj˞ۓr"l+x˿w&&j Pkxm)*̳ux I'Sޗ+Xf^+n xڛ+o+fC#o1NV`c߼ٝq6ـc"Ռ6 wm4x{o+&coK+uxx;~}CHtogl˜%_p 5 x[PkqAF|"5574duRRx9-paHvQvQxxt%9 ӤRQч^p.Pix˿gCMb` -(MmHɬLG'0AQex5%@pv[ &UʦGƓeԌΎ]+cgo(|xBkBɂliũ Ym &ʋ&h$ڥL>#;ٜ8vMDZyQfI*2@ oxL| ɉ@HќT 4X=1`bsqUКǡ sf̙*i gV槁@WP*4|#+=1MvjDV!- 59 17UGHISSSK R4& ;sZy VZQxڻ.zIt/k|qF~ӜR Wryx =@|ΐGIDoNQx% Xx;Sy2Zs'c*( 93|6,9S4&+2L~*6y6ElE%0u{n~b6Nͷ93dgkڥVGgڕă7?d,ƻU;x۩Jyvnr\]ԊԼͷi xoJ9$'d235rӊӊ@@s9t2JRRJsRRs&p}"lfx{sg fofqfeHx[WsC5Xf^Z~|qF~FYnZq|Y~Hdr_dE~ڬEř'|p2dW,ԀuD<،;">% x[78,DZoi~100644 utils.h#ư9u{P2շGvnw`7zidݮM\)!,HKx{5Ox& FӘ;&eVwR(J-.HM.Q-O,JUH/M,Qל"1YEV43%4 8UQ(.)swt)=<! l;x٨g~6!nxkJp(~}«;Ⲹ^=֤/+[f\M/!@MuXܚAkA6N]|PU+ =N)/FjxkdQ,2iźviyiz):IiړJgVa(М={r!,XK[p[?2YCard=!s9e@gkM+ (hYor0gM4ќq9m(0NOΎ9RSns3gD6OZ*WTZ3F"oͥ[_XT_[XYRR [0+,W.$58 v)bO!MRL'N l9x{gd+Fb6,')axgCIv):IianN@*4E8*5? Hs &mX4B J2sS'f1|E ix;nhaZ..J̼T]40_xO?x )>4E8*5? Md=V]SXxsJsSKj܌@dc>0§U*l,+ ]ZJ2A: > s$B%ԒlC5t@>Z X5NxmhEnMʣ RuJtB6@"<3FxfhnNy'ʔV<?֛+9ۍqv<5S=x{ih>$S|ҊSKr򓳋3R5tJ& )qVgYrxPmC0`njnrAFY~]iif$.QPO̪4FF7d 9e`MIian>a~n@6)0嚚֛m&.>$xB7aߟi'?:8$D100644 utils.h"y}tXoh7yxڛ'kB[&XdMA24' FƿĩqmrOҐj(h{*k|4"5Lx0.Gx`Pw Dl|\[Fiܰ( UKzi<=\/&Әb;o d;< 9нEyrJ|dV[T 5%Av~Seܱ_3:ˎ&쌊}yxsO*^8 |^pWhR秊Qã8y7?!P"C^"Yh6m+w"Դ^ e7ӆwYE`d1ojUiC@4mKULS <MstZ=T@BS;<?;B Ux{7w~JjZf^Bk[kHgH 2L/4>?4uXJNf^rf^rNiJMjQQD}ebʂ.,L\f% =>F f+f?F0,=yklk60PxڛaFn|d9VoǸY /xk];AibCByeE% %% %@nqIQf^>WrFbVn|2H/QJ.сH$gV˺qk@ox;~}C2ǗZ[)Kί˙Q?x[s䭌՛2f4e9xF=:;iU>z4 5S100644 vmfs_lvm.h̰ޓ~^{" wR;lhx۩U~DS9U8"Av x[y}䭌՛U4x;~}Vf?ߧyh/_(99diY kfxڻ.ZxOO9?#@x;~}Ck&;O]u沷}̚lx[]uC"ni#CxF=:Ө*Q}c&3-100644 vmfs_lvm.hEis{HZ>7@UxGwR)Hrx۩\rBjGF{M&~GAA((OCp*U'[s+h+)M`Q϶h>橜*lox[ymffUFGx5ܟZ(|;Jث伩I1T83wmnJ'5x[^~C.kX7wNc@ixڻ.zIxCVO9?;Fx5~2FS.:u{M.헯i\vt:ۏ_K^lx[/@zC\'n Kkwxڻ$|IhCOox;ɾ}BX`|iN4E]95/%3  x8Rm^G +sv]ڷִS_qskO\9ƚHx[/LrB 701m}+ Oxڻ$Eha}- TP?-6+3ʳncb6 1x8RA3$ޢqs Ͼ!1~Wқmsx%n%x{&]bBҿ[97_`dl!x"Hh f?g]xkeoeP,"-d쿺kGE f`x"'4 6?cRIxF9m Dg%(s100644 vmfs_fs.hwzXLdB_) ?FGETxkeoe`.rao,7|{W`cFuL'm{I,f zN̥DMf&& ei9ez Lk73 SȪsJsS4Czڷ߳Lh]ԏS :c5O17 Ux[湡Ip2PB}Y~Nf^Z~|qF~ZZPLă5r*R2 r+Ҋ@ iE % iE% %y% Z -i T*hhTAYnZq|Z1cbgL$_h|Y{vIA[l x{.9YtaX"kJx[9m#O}lODxmSMOQM UbD˳eԐHBc?b0fN Eư3n.Xٹ0.uč?gZ6w}{mÑ.ȍƣ! KsYx N9Dh*>8,CuyxvPCn6%Ѭ~7`ȹ3-8 KM?a;5(L9vhk8EE.R!]F׀ 7+pFGsw966p4-)9XUP8Ahe9-'EkJI\qQCN8a&}ħ t6b=Y:GK;PXoQ8&ˤoι`VA-ŲQA9Se֜S“vPH7Ĭ$VW͌0qTI-7Y~j,zl #=y[VI=~bDNI#LۊtJdͲ$)4=u՞ p,~!HSK˸aYÕpfS Ŷs}. #W\=Ҏ+xD/&Wj{A PLK<_՝{ӱbOqY) k!oai]k+`gi&uզ ޷ ^k9{'zmY?WZ1RtaoHid񒌌@JQ%EImx2tiڇ|OLjl *  xڛ*=!gr>[IbIf \(L$?)cDQbBRN~rB~BJbIB~BN~FFL"1OeV4YZZ`R˓XfJr)] rYwn~qs#Bc Z/( Ղ4ihZsr4xkeoe$f|fw,삃-*vcq˱@ DhVT7 [ܴxwRKQ:OYw%ɫx@y`أ De{IPt%'hXMMkZ.joxڛ>}"GZq|VZfEE7Fb[\`ZR>. + 5OWgI+ֵ\, #|%Gxڛm#GZq|VZLJWMYfXtJ v]XB$!, gLȊd'[p)BLr1stҒtº"ғs5''ggVjkN,*Errw6MZ9@Fna ) Zf.ϙzHƗ(hYd'O>Z\Y\_X4+3D,78>$_T,4qqRtҀbIũe9dj3˱ha>y.\rFbP舼T)I9e9ptUWVxڛûgB,X8I0x#5lxP&4 J@?F$Q8x;mƍw2Nf{0 Vx9BWX!sJw_'dU [B,H1)bxk4~fAU& (Ng|q' yLan e9yJx_Hlb$a raw block of data on log%;#J8 { *#7} return(0); } <nxk&5a6[IbIfY'Ob\(2d.RbzfFn(xɶm˂%dyOSd ggxڍT]kPfk(lֺgfMV7v-a1:"d Ku@8*{(x=A /{EON;17=~='.=q,>0;#CEBpsX׮W. R{饔<=zih +V2orVASW,^Ԫb8y,qŵRK2g( ։U`<wfkN5嵍&)+ ra9B߂$ g"˥9E&iqNuaG?}X|q@Yːsտ@=&C]ljc*Jg:y= f@ Di5-"LȪw }*ny'ED~X!gY?OQ3]Nđ42Y pd80:~<-<؆z0s/Ru3/-_or2w=s2?YTfgFIN$,x`e^h)Um3SR uJtҊuRr3RK3R5mL^)+} Px2zk`;JӘ:9'aܬ f 1,g3:x;WVW9*a¯j ?h7>?AQ1[&̔Dx;gdYnZq<''ggVjkNbQ`2ٜr|_xڛu7DӍs$sJsSK,Mk..Լ4. 63xu&bMk..Լ4. ![x$Wssb[sl< ?D'0)xڻtqB[BFjbQIRjbIPLOf /W(HUHL.,KUO.@F|U&iUxǽ{lf+Ԓ̪T =A@+{嵎Ycfozޫ6n'˩FͨF@ O@ Aąd2Wh%'7c0J;/.`TTfl. n cAvÌVї?0yI ^+,jstrz`P/Rt'8j0A;ɱKq Mgja#~=jF/&BC'Y-%1#zQXʁID3"UTs,>ȔT#(@G2ׁYrb *zH\ M3J28֐ITM:")5LK$y6.,!`6 (w.qF45`s^={jI0deR4!!d$"_8Hb-rGB4ʎ9ՆЍ1eWD/W0Y=цXǜ_ZeׁB[5l/sqq1fvЛW]d@U4QXy׌Ոé|Uqrv]ӈ+F7"FMvurŧԔNUQTVU-x}V>33e8-5PM5BFQwƧI >wI՝ sZ4OIh.> M¨wdlI8*y</W_& E=|0/J냬w0L _:PcSnX488M =xr7ky,g]Ѽ|K9uy#CW+>V5kn100644 vmfs_fs.h ':LE}?p$Zb3j{ZMn/25xN7ꢰ!kpɯDcȞJK;(HX|sn۰:v ư0[&ԥVް]w2%lFx[l|h{ %uxɶm*iOy)ks! 9%x{!'867Ɏ\"8u6/rd|kDxN7=b (DoҠ[F߱K! i%W?@Kn޳ е'پ½j9z(%wl2xڛb>|C@&gI*?x{!~VlɎ\"8u6/rdW2*.x340031Qp MNMIe*Wyҏ{X} C䴲ܴbdui^Zը{y>#CyҒ߰)SݾB卤ȩs(J23)ݨ-Ϙo޻q['T ؞ m[SjE^Z+4[ O,M,f,-O'o;gW _⭍"Hubj:œl'='kƷ%ǘ-^.Խ Mhu3g ̢ԼwNĪߠΉ]>icQe\pEQM&_$شo!+Eм #N{XUojQP"-/>!fYYFjbQIRj"ȉ Bo&.WC3̢ܴԼ Ɣ+JB-7˅[I0-3'U/!jCp>M^\p:CYA?6g&;h啮W 6>{g}~Vz4E :+,or|'(Y涙cdE&Lm'xy? c}6zp,8ل\lܗ'~*.x6R5*0w*HS+} yݨLAamR#bV&uEExaj%ھعkg~<;h؜  ae>100644 vmfs_file.h)(8GJHCM ~D^-#oxɶm.S"idV;obHnvBYnZq|ZfN^Cѭ%W;le夵Wryd(+KfpUVfHWEEg7K13,qxas= =mds!Qy|uS<](vr'I:Ubpn100644 vmfs_inode.h]ԫAGy!< ž ʓR,'Roxa'q%ؓ< }*~Lp2ѥ100644 vmfs_inode.hΊp~WWeJRW0oxS7=b (DoҠ[F߱K X.8ל7T# *&X~?h7>?AQ1[&yf ax`;[Kc^1_iX100644 vmfs_file.htPfbZݎ嶓MuXܚAzY.nxr8;[_^ #PSia100644 vmfs_fs.h ':LE>iq]p5?M-(-x=|#BuZn̥ *>NWssb[sl< ?mEaxڛbtC8.V6] Z !EE Z\ i`y]"[Y  _"X͗܂̒Ăbܴxhinj|5ّ߈Dۂ-P3-? Mk96G0 %R:Ii} &K i KL>+,19E( dB!`sD~Kc QEX ĕW100644 vmfs_file.hSFٱ L^-zDJ Cxah'cXҊu&2>(YIL :2xdhCP&fͱW9l?x[={f/X.xڻvm:^fͻy?`xɶmȓM>-f*/),$T rx;sgC+GZq|VZr֫NrrxodC6FE%'o~i W jx[={f/FeF޲- ks)3 oExordܢ 6[@x!jJc|*ӷM2~yx;bh%f;B߉1@+Ux[ǽ{(3GZq|VZf%&Jjs"x[={ɢXS$rj^Jf]x[#;S|rf^rNiJRYnZq|Z^FlpHLÛ89^;l9xڛ)YlC Y#L;`xɶm6"-5|^[Ωst=XU9S'mC3̢ܴԼ . -ʏrm6Y$} YaZfN^2CGOKKC*K7(c(`SRۊYat݈h,6$M>e0pL{&n[we/lL.AAUgv9.KAdprx]7-gc뾎|ñK9o՚9 YcB$$$100644 vmfs_fs.h,9e  ~69A}?'ilx6yE0n/I} ԱnVg(OSU-@Dxb7/g[![WK=QW݃v1aWTů0100644 vmfs_dirent.hƄ0 H[ b#I|\b&fpxy7ltUo킛r{L>=̱KJ=w3~<;owly)<100644 vmfs_file.hM/fq}DbRժ~DDk:x`7P&B\@jW4F۔Ko;R!fs100644 vmfs_file.hR󽴜c4]s̳De2-qxNy>1o^ m|x̱c/f,:P_x{vm?x7GfCD _xYy>m^z "x!wo:$ģ ԳV YxڛgCd9Ce9)I%ei@- KӚK_K!(51EY!)8U!3/-(7$3?OZ$5 ((3R!,IMQ+QXҌdcK75k x˳u-[sx!Bgij6* xe;OPSJ)`z oD'ɠq6mZhfhRg'V8xt:?w;oO' S9Y)cITA冮}uuP=bg($Adx93%yͳ%K:ExEREFH:kBY ?ݍ_l>dnvf54P4vJ[3r"}=ii|'[g[ ( PcN[LQP7U)b8%vйw]I,zW]鸶!f;ejN+BL֜"DipE,2ٙ&fIa.CWBH=[*8qgC-Ks_#Fxɶme&~s(_twʜRLw PQx;aztN朼\\\ e9Oi0_x7'x7OW?G_W5]ZRR|Rn5TP$%yyq.g ])(&L$%Y<9W`' 1e(ܱYo;++6H8xɶmH8Kg|-s8Mw6f)&yF ZAx;n:tD|g1LŦ:YKx2;- <]#EnE0[}) )܂̒Ăbܴxr7/ӛ'(m(`7S(51%TlesL>&o. {4[ALS)aV|LP l;AH<*h3@ҔV1E 4B1aD6L/%$18*UPgyp)"`:[DTD0cf3P# Exڛ\qBf ƫ?f'fuUxɶmJ*^}=8I-( njx{lJ}D 2xȳ}CV FvԼ4.Nux{um&q37*ɨ6:cs+`w ,x{'Rb.rw22m>Ⱥ`$?x]7V}UB(G%9zұKg=hl|{100644 vmfs_volume.hG0LġϹPZ +xڛmB : xڛqC>d%6U0^l@?-8;xr_}'pn,9Cq Nx{'sKx.'$kh``fbPVYWT'1es鍻6`jCV̰G .6>}"k e Y/\ySc#,ŒMVdf9m9_߷?JaKِ̼)v.8=4:&e e3xmfe=l?q|gxRi:̒c%ø9  opxıyr$p;%x;ctEoC8Hlrź&uRx[}kIĒb̜"|4BRiByfIBBAbI',^ʩy)i\ddxm4`q'Y7r(Lx f:l8x;sg7fAk&toqx{uBjZVi1c,ؘ̗ axڛ+]h;xf1&T͝",e]+Qx{uĕeJ^(}~& {;xyƍX6wd^=5;7IOˡ1CJKgܒ)y8/l~& |T!HQx7VkexbʛK,>xj썯1oIJ!* l S%x87VkexbʛK5f"c~"Fғuz<$'xڛlAbqޢԒҢ< MkZ.XhxK;c6 G}]3eUN100644 vmfs_file.hZNM kϓ! oxڻעA_tQV0AUWx[}sSY4ؕSR2ӸF\x{uC"! {ѳϞ_:ㄘɥLUzcxڛl_oa6<%̼T]\ }oQjIiQ5W-MbxBZ7|sd(%!m F=100644 utils.hSQ!}LFPi^oxڛ+g[96f 8k5x[{gjX=xHanr(|100644 utils.hwƾߤ2\RH [^kx[{Ckhx{u.Fk & g\,CeVtgNah``fbPVҮN6-/+ҽ{"dn0~Njs?ɪW<7Vd32S@x)}KO 3M;7jxڻEsBƬ" [x[cFvԼ4.;jFxsNkF QUx;s{F匬! 3YF@eّQ87(DP'?cV,]95/%3 ];/x{uHԶ>xeZ~?K;xklCBׂg=eJJxJj=I7{_v'zNHxF100644 vmfs_dirent.h ԇ%x}HB gx{4Uj(/ oxkXŶA]95/%3 #bKx{uC"J?V?t*ɥLUfx;uYsCnkeԟ,!?y  L"M_'?K(rm!s &3 OVd\.<k0#k $V xe7Vvbol, /ߑK2m⒔ !Ƒ`Ks@phV8ޕV~<gol SgB(Di^B&u=ƢǸ.7oX o|T*)Kjaxg6lBًj&xk}3Ak%.nj4x{Vr<jxڻwFsƬ"jgxڻ_sF"/xH'100644 GNUmakefile`<^p~0:1d'VId ׾S &hI^Wx{uC"b;"f+6J徝\Tt BxۯyHcCB3}K 򋵵ur3S4' OV|DH*;P䇂"ړk7Va%~x{u#~uF运T=>9q#9+xz<G] aY|100644 vmfs_block.hVEb|Q 9pMUe1> gFXq<xq+1!8Tauzzj3xڛi rMvKM6<[LR4757R,?G$T=yNqfUj~BJs_E`TxmPJ0^IlQt RN ].,Mšթ$xy ž`O+(~/|oݪ/z0r2k31 BЌgi @y`aΞ(`4U2 rɈ o9Dr13 Tt ՙRL xvA)m%"Q+d'.3gf>|4fdfu+rN7dKۄ{SLgdf%mT5hs4X|g}$xk*!Y((R./DV/gs(!3BpF~DFbQ-+Yn|Q|BI~IbNr~i^5Bf^B5 Y\kMnf+fi@ u ww rw фiE֙625@PP6MCɠBBϢBAIꡤXMk̴( LmCMUM[[M 1yJpյ0!ѵU@x" <\8xgBpF~w,*, Y)vԼ4. ]xڻwJ}Ĭ eiI99%y%jiv0p3 xmWuF-&bUB 52SRuJ'cT 6B6)g 6,μaIyXctjrP&x';3 ^\tr`係"= '?RbԜ!P:3MAC1)';>3Ed$&fOVј|Jd ;Tz91D'kN jrB$x77 < ȸ>u3K}03v 6rű7xgQB7dz% k _gx{u03\f tY^%/{  !Lx?YuTLÅg@r/x`7@<خӛ5#xdKNpMR"3100644 vmfs_block.ht^]%#]fP)OU' xڛ\qC+f|x6;lg_xڻ*wB6 x!j$)FΩJ~qcx{+FbCZ3 N`"W )('Ƨelɸ#QKRKJ4t 5'sneL`l)"XGx[ǽcFL +dqeMx{u}G.+\XմЮ{B7z3.P^wΛ LLrӊS2RJ2%kx_M oCe%3w+ڮU7i1*2,y:?gx>G s argv[0] !yQؓwV=Gx1Qtc& ɢQ-U&`חRPPH.-O,RU(ѵ+/'gK/Ұz160[WKRKJ4 5!Afm,@B>ՊHvO~ɣ)Up`qi5ٞW C>x{VF̔;o>Ȥ h,xu9~Lʩy)i\I u1x;ctQuĬ eiI99%y%jiv0|%yi1yJ֓ E6?aa(-KMR09"6.x340031Qp MNMIeHٸy \AJIeieiz = p cUBʿ =)-)ajvJyniAQ03)\ el U'A֔ZV M9V#H*2Kr 26>lBonXf0xom,پ~FTSQ'g 4e{*}2 .de\>*ǦLώ.%(5h` 嵡~ڱ/y )FWztqPdHWݮZjVU$G{Ta(`QkScb w] Z9G̐e&$& s~yӏ*'r5v 6[Ks]?[K~j3S@άX"2swB!eW`K+ήd\>A0\ߡgq[DU{ cQp}AO/Q!Gy0 j r%Xx[>As0ɅٕSR2Ӹb*Lx87ghNHG[|ҪmKg?ª.O 9T$/H'=)ɟrGx{Tn/f^,sBwx8qxVu5u x{u z>mk˦ŕDϖ/-h:O!we k&L|D,78>%(5D/ ҆KM[~\f医l:5x2pGEyM!&d姤 l3N_vyf7}<)C*x{Mz)ll5,pChxuq6`c?\lxzKaW3Ry*/lhxڻ={&Fnxb7E.@_C H,s7&K=FS2Hnj?% 7100644 vmfs_dirent.hx#梮?@'H#)ox{pG|>f66[? Xd6͗8 'r| 'xU75ɟ8 Q#A\CKb4;LP?v ! +\P鐦HAtҼW)^&`x{/ׄl̼ҔTܴb ͏X okxke_öA]95/%3 #QtxxaxVuIMr,-MZur& 'Zx{uBc(˟]1仴mƉqLYx}&A#H͑|=g1^x( .i='llJJ< fx0'100644 GNUmakefilerG`(AVᒠ'vk>xڛyCZiX=Ux{Dw#&0,qx{UD71;5-3'!O_4CuK,ܽ6`[tlx˼G//J!1' FIx{UD71;5-3'A{tGOs*=nQhxڛ2qBWrZYnZW&nJP(c2 oxxm4${ cRINCH26Æ\$V6]qq100644 vmfs.hh ;Ln􁐲GYo} 4Z{_D)0mtxڻusEbw(`xkcͺ!qH|f^ZBYnZq|ZfN*;Q('__$ KN^̸gr5rj^Jf"x̳GU93-/%5M!-8ٛKKEڨV xD<xk\=`100644 vmfs_block.hQG04 _ al xk̽!qS Jkx[{3x64Z;@ʮ]lЛHTO_$;]iKRkDxڛ̺ir .}x340031QMNMIeP]\:{JB$%3<9z~jȓȧ}@Քd怔U5MXl߼yb4֠(`9Lm1*"a[nT9xcc`"H3 Ϭ[t:例N_=@ e+xcx340031QMNMIeP]\:{JB$%38jxLhx340031QMNMIeP]\:{JB$%3XU?kjiIƹbvGx340031QMNMIeP]\:{JB$%3<="1)޳얖u_vx/1] 18PM7!4?86_|Fx340031QMNMIeP]\:{JB$%3q:4u/oWa0yxۼij W6_eO3ŗ(gdYs)((Ɨ%gۜgT)uNϹy1Fi zy'P#֨x340031QMNMIeP]\:{JB$%3|n&aQZ{*6i]Lw"5x۸l '>8y `rFbBn|iifJ|IY櫌LX7󲘰3ov'+ڀ^~S2mra|T$fU\RUͥPWPW tw uqIÁQUP EcB J{ bu!6ƱX@%M1̱YrCՆ0>CXMk.ԒҢ<``Zsrqk)lΗܦ'þm›K-65:3N00!H+8:&7ڋn4.0 MYZ5xڻ9l 煕3sJSRlJK3SA_7?aܬ}q2#f{KL Bx;2iL k$JK3SK S5@"M_@Sx340031QHN+M+Kf3L¢dUvm2Ҽk 5x340031QHN+M+Kf,v|BAܳ?`qx340031QHN+M+Kf_Fƾ[rsŁx340031QHN+M+KfaJZc=;W4eeٸ+ cxڻ9, UEy%iJeiE9e%V ^f^jzLNAIč20]y%E iy) @%\z'og)/HKMQ(.MJ,JM./T*ݼ$yғ$pN>_1YK2&9#H!4--(:VVA)$PLV(Ys)VZ5T e9:tԀ6kN6鲝'6A佝wY1_x340031QHN+M+Kf0T(&!yv{DfV Sx{=^+ӆ6,L* $jPadhynj&M@l0Y'L +px340031QHN+M+Kf8qT,}F. ~xڻtit&BhBAQ7xW)pm{føPW 5ԃKvmfs-tools/.git/objects/pack/pack-9f013551793d1456fb6038dfaf47eb702de4e730.idx0000444000000000000000000025717011733303644022232 0ustar tOc -8DP\gq.9FRahv #0<JTfkz,7DS`y%.9CS_lw &0?LUbkv $-8CPZdn~+4<GUgs #-4BP[ny   , : E P X b q x  ! ) 8 @ M Y g q    , 7 K R ] g u ~    " 1 = J S ^<3J[*_K6BQ+}lNXj|<t[{J fvV^u=}ܮ#pZT\]Drrr2U%lWm_DSQڂB/%UIDSiFU9l IV+;4Õsvda"Y9W:ug e}_+ ).84H_BMFyk>k焨̰ޓ~^{" ["R66NU  ڿ%XAZ5?@/g[![W>nΡo5Z\Q,Ը=T:2eY3 /M8̒|#BuZn̥ *>NWL9h:2PKIāڰ⇶Ϙ29 ӤRQч^pȿ)z\LDL+ITnM}a,VYr 4[ o-)}sU-͠]l/dIzR"+żj0_2B_)T]ɉ35QܷXko<XHWkJ}V.(ts# -SE/z~zw$n]>nr(|) 'lLlf(C͌ ns֥yq:ՍuW(Y!V Ku#OI zvWv4¤˪Jd~YvefْZBG؞wÏQr8Gs&8Qyb/G d^DyoeGDWܸ5b6  T##_ALr%Ho Cc<*h S~X V(ywF pwĚkh{!֡- }_i YtWR!zpYp'F*CSͿ!e$Q+d ԇ%x}K|;4 ~ݛ<ίڞW!:@bU~DhtO ogs =*g|qR\L.,A+1 P$ R'!yQ5U{b !ZH#TY0xH$ n{ư`؁o>Z5p^?}:&fS sC -JZԋW2W`9X~0x?Vl((#~ GUi֗->U B*<Ъꮃ@X0Ă. ONR T)q@WՐ bH'qi;V i<̴E.-b; t"T+0%$NM~k ʩsl/f\Lh4% ijw<* Hm) Q)W F 8!S0#ҠY3~ & aede$)xE 2:ϤY84e({G@ :~)L;ݸR I Г[ t}I T XcRLD O [s(#z~@R bw];4Zar~& P4/%m8AZ? i|Vٔ#\iռ9 TT~ӻ¯S 6#Hސ_k 6p'eE~: 0$w? k 9Mz #x(կ&EO _= >iOm@Gj gsO*+  z4 zb! ?R δB%J J+g+"֤ s"j+o& %66*1W>qC . ݟZvMTV?PW 1G%7sr.o.> ?Ҽ)-5 R`{xÀu7?/ f`rvvEj Zc54̕ pS(Υ[jasx ]xnI'$v[0 !2wxJNGD A7JBGc SZT" ۡ%Γc=b < v2DQ$P,hY7% U9,$c lڰ5%' C^Cz0$ Tp:u39 :i-"D]X /p(1ќ7< 23lEW>g K1Cj`IE^@] " MiHϡF6o  g.SNw 7Nf @F}!r҄-F5I>,E1%cd 9u>Yq(2 ،Qz6RȚ,LVqqT쏜B@]_jL+Q'aRysR`_.'9S_r2 ?/,E* zㆃbEzvmoЗ?p'xAtfkKx>Ԣ:qBWZzԑ)D Ʃ|OidtqWdsd}1 <t* i Vly 6<*} i?1Ӛ6}F`.d썿AL:9E,[ (6SuPOii;(HX|sn۰:vS6IRFn*}TMz~&W,_ Ӝ$v8k%,tLn6Nb0K]w^z)9l%)!Dz5NlEBB2庣GQu m5ԭ$KN<MH -MtK=Mt +{QYZ,lpy3LhyB4hD猤Mmujħ_}j[|);E]yL\m9 H ; v˻jŖ17ގvLmKhSm+Sn^dGPt;_WW c '5E9 hl|{>6B~ [@Ұ{t d1_v]qkNu/M;R ۣE_A좂5t9 2to#{Nfayʉ,1^»Q)y_zBh Q=0c7ب^zM,k3n)]Ù D8uT77];o'"YR}& ))>|imZDO݀U.6V.V u 'UW>)q}AEI '6['zQ>]hm/Y|+6l54;5LXSZfc|$H$wi|_']nVpQ" ^,'z-hiTç++}:e0H"Oorҟ) mJ=<8JH6$ <2VL[HD%]{Omm/YZR,ao+Q;ҼC%d &wZ'ub^ubHڠEmdЌpAn3—<:ž_2ײ&lFIYf܊5!pD$vXWp 코/j] hqD_dC{U)j&Y!r}tٔvwCeY5L 3W2#7;t7Ia0uh(:%.9Eou=ST/zE!xk\=`]l⪌+GF~9hn)7Pz Aarc1 BtEĞnAYhw+8~Sb* :>.fN'nAŚIz%ǭ5U Z3 ,= IADB9[`]$ {,2*[9cQT:+qT0,L6eg;ZtgzP3BZ> jΑOy4KA~{)xy26e7s6\| :L7_ZzJ}.8P Ҹ4BQԂZYHC/kޒcR Tx[vp}~F%XP-K"S-7|Z E' x]@j ,9e  ~69A}=(dxZIq溩֮XZd3%hǝpiW PƯu%丁VO-BB3b "=ʙ酪Ziji+-7ްn hf7A*x| ZQIՁU$T]I(9V5I9)XȄfߩIf9j錟Ɏ=~{Ćֿؗ#K> 2٪cu_7lH(':C$:!@Eo^}&yXVHb8"4WHTI[I8v+TNqR>ZB4cLdKUueaڍVlUIbs\O>:}\p ӯ+oDNr-bS'LpZKG-ަCL޾ $2j'b2OBW_mti/5|ٞt{5,kXAh b>)8A]8h˭TJ`p&ԄazƩMG/+ r 4,ɍ0p'QZ5(U-DRkP3Nx7u3B~̘{ߴDUݻ[S1Mقa}[*6[y"ta|B6lT9J짺E ;SganYuX\[>av_P7K^6³Xui4{yW| QT }*.`Tڃ HG$N ۉ^BtC0Rn۠R7M8<oVyYŗDyf )GA Q1[DH4A UZ+-;qw._@&$SHMcire/W|CQ5$A:a@UY /vtE؁0A&E*5? ԧ9J`s!;ޣV Jֹ/佪~7PO@@sT^j  (k>KXU=8'r0 ]}'̷#B9* ^|ʒ&+: f#Η!\I }76(v! X>\4ƈPO!*,5w`4!eZdipgZ 9"uɡ-G|܉^6o&c}+XWA ~z&u CE4R$&_/Qef!?&1mR.S+xB&@-pf6 x&A#H͑|=g1&U{bw(uPipi))\k +c,ڑ"r) clWhZ#0)HW(@G5I| |jkw)TqSIv*2ZW,)TNzeGo`+5BO)pPA Zv5w& ɟ)vkתcuf u%)z{\=+Œ[!)Au80LBgn )!Xu$ 5_3})+n> OȨ+rM|VU4j豄+x:n}@um+z(]R wO2?g+|IW4ۭr}x+Pm.YK__e}Y~+ w?K*, f =`|m,(dA6Z I5,(2>cSϬ}ck,Mk(iA&z /_BA,V!/!&V,bxqRmفP/%4T,2;;M, p [,t<诫xǫ4<0\,L$utN,j:%Id|gb ~s,I77&إ{,╬r#U@ʇVn, {:Dz`g-,̞J @J+(=->%N7.!.qbz-G%(-5ll`PҵQB.-Pq~)NWg-RQufI5P+H1-k M\ȴ ->O >犡(-r*4^[OnfL1Ok-Kl&-?ͻ*v~׮3`\-!˽OZ)-͵^=~0Eq-@N.ޒ3$.:ڇ9KL.54fzfH .lWԂ~Ӹ', gk.~(/Iٕ1)$rŇ.U%rY IF.BjJs:@׷.2Za$z.SYjԗv_.p,b˿˵O̟H?.&UH^ť_.*,@d1}ٌ}.vx%֡`!{c/0g<|_$q/>mԵ'z g?ˮ/JQcW.!8/K:t!?[yEE/yNh]L1o*dy/{ jG XU]Ҳb/ ps"J'/ Y.1s=/*~PA td5PE/Ê51yZEO /8D w4ވ[v/d=3CjbB0uz璬<$vZa19 zyZJ1 v'Lv1'-V}h^LR%2Þ1sQ_>m;j1맺_A;=DUT1.GzmwkX~1jJR^gz ac8l1n3;_QĠŞ;2rG 2CGiQ-ĽT;j2xw+XWc%7b2ȢloEr2"ȋM>24fz;=3 ZlE]"f ?n34 u !E 3 "4G8ޓn K8356ĭsxIX%X3?aNx~,S3^ۈ渼rxSL1VL3n)_%h392h(cB Q_Eh3b&5ey 83NjY_kH:׫]34ԁvcG)f3LPcH3(4hMY)"o3(nSh3䃼#[]l2눋@4r^U2xfS4/{(T%/ z4KF~?(r 4L{avHbc4NGd.Z`K4Pj:l6=T] 4-ԩ皍5L#4Ƶ/,eXv5Xӓb5lxP&4 J5$л'rx!oU529₞at QS57%sy|S[PRl5:%LҾ`~M'5^ ytJ2Gt5mDiVA>} yEkw5qLX0 +ؼ@Qu*5r/{:f8V5C0SnisR5~|5(1y*5I[1S!un/JS5¬w82$)5k{mL 5dx֧ϱ1 D.5,gm{i@J=U[N5YDZ7f† fT5N8<;WC|L05%׃̣oHL|֐Y5L1THM6/S U e#毘suG6ZH(0CUmO6b: U)P6m?`f@j.6J"]c*EaOM_6LH*3σs?-/ 6)WZlj2~s168k IU2Al*m"~6V9h^ e|6VAML[χ`6 '^nwOBl}6LR .ji.7 y)?9)lī7MΎlM'q7d}V]sE4|+T57g_^<q7ypk?'&Lv57h7d3ji-(B7M_x]Y37wp m=IG7)( `p(k'o7t%|M/,^7Ƒ 0Y1vv`07% [Q397ÒY,83]Z$u7=;493@ h8hRi׹6Փ08? GϔB LJ8FD*H}2i%0_DZ8H9 4shrO I8s"܌Xt-7] DE8`cl*6iQ8ULՅXi*[8QңZ Н`1^_8ŦYrK_?8;( "{孽z9 oݚ-'9-T /02ib9EP\4DR/3;B9^L'$!X_Jjm+e9^:Kh2',9bEJlLb؁9wZ㳫fkJ94]hT-9ziO͗8|{0`j#9q hYd@N0c9}Bw7)9BHV6ʖRk h:j㟁P-:=Qĭ{:$0-_Nxߚuti\:CYkB ^a:OV닸ຖnx:ugXisFo[VV::u9Y&+:w"Zf5>}IN:yp: {/s) TY:6e crrL.쥓:ܠݦ2a[:kZo:ŜEce.42:R0{G:d:a8FV;$̲ZNA 0l!e;B%tHiw!;[/՘kF~;}txzni@Æ\$V6]qqFO=Bu 5H%'6oD> &۾ 6jI=)w(>"`V_x<>;[O@F̮upp>kƻwQ`M(J>Eh=F͒W_ݞ>L*<#X4kK_d>^GR ԖUֈ>;0pv>S3J~O'_6>yufNdh:Me`>2>KƂ&>C+` ?]捵w c?ª.O 9T$/H'=?#pFYFq'?<P/csWIW`?R0MWeFynFR?qX'aD&3=acS?q Sv<_IDQO?y\gqt/Ѽ?NJ?EO1*? >]Ī9My?wʁ7#80m?Kf:(z_Hh&D?H,U ,,?777ѹ(?军~\]<}ے?lGϭO@JǸ$4,?=~@@A f+Dns@"R? Hb%@(hvˣ6jZy@,UoֽZ@h6e]@/ٹp9yHF?"Eu@4?&;d @8`#cIO@<خӛ5#xd@L+wΒ@\ ]yin^@]BXe@O,8@@a a<Q@c@zSB@k6T.и`P@]Z'G~H#EC@&śj^fuVݠ-@3iϹP˴Eɋ@ N0+8ku RA.U]-ajpm`n A6)Š1J߭D~AWGo!ucz rAhfzrt{ ;EPoACzc8ܧl3A ?% nA3$ޢqs ϾAnB}Knt'yAMG|_Ij'[i)AsmlģmNhAt s5-3'Km3TBc),)}wκ R6żB5M5Q%Ŏ~.B5OBooSGBDP$Do;FBQ _,c?~ߓ?:BWX!sJw_'dUBpK.g0B|YTNGLG7;BUq Zpk}<;B.ä{ߡGQutB.,U N-*d72B?f*hmkjB>N!˃Ȕ6>hC R1Lʏ|UˎCbQI`g:'C;)L=Uu nCִ"E^fWebCYNoÞc-wC?-LXiO6C"Cp+#dL[ ;C9y#׽ew}CC~*ޮ]xf`anC{bUjKSzD,M-tG?x!&D7@UxGE]sEOnmEakQ9AʧEc4X؆gEЍ057Eͽ}|\-zgE /+Q {i,]_E+R.<ǟGCM0eYeVE7}fR^zqV-ߙ9EEc8ܪmK?_;EG0)JWҵES-A, WE[yi7 P8xEmr:j١wۘ^ѪEou1ywj˞E{C,0Ӥ )fE|Wǀڏ Tq&E#}6"d@Nfɱ٧ETzNJ}Ӆh;+Eˉ|5=a5|E.@_C H,s7&E0&Hٻ+ W/6HEX'_dFS2Hnj?% 7F>3gԐCVtIHFDl;\#AtFtFf$s찷Fg_c R"tHF IZ Tط1ۘFILBqQFPlU[@<ȷqR*TFi 6DWLp` ]G yk_E)gJ-G%˫免}U8ЅG/WNjב^rG?JNzVMN$!GS܊_U| E㢙EGeK^SU? &'%1!PGi$a݆)$"GV4Dx#?QNBA88Hf̓SD(HRg<~_$ Hނ;+>m=eEϡnH0!O=uީ>IW Y,y)-GĭI1za6R"mfᨺIXWve?u$DIjHQ2rHI3B`WhoѱIHrђD"aBvITWe:Fͣږ^Ii(y~o1IlFX4;8OXI7=yֻQ]yPI;{Lʍ>mI7{_v'zNHxFI:7}hm ]It´z^gguJ'v2uP 7Lf1J3 #FyJBOS dp9h4ֆ&SJDsYfuXZYSJPszTxa|zh`AfJYK #".yo<= JM"=@l% J.fT[+ﰟo1J(a <aJ:bokF"cS}JVvG^f(AK i a@WX{t-Kшs9N3KLxd^b)K]w`z`ы2)eKeI/Y~ (*{Koٔ#qDe ?KS}T"CB.1KXv]"(?v1VK#-q`坤CoK/Yxͨ3wKr0 m%3Kq`IeJ08gLc$QkEU L rW;%ݗ"L"K&W'yd^͵L;VpL_7]MJHmL:KIp&9 LkZ$22le:Loq{E #LuIׂL.0ցLҌt2q7hÝ˕ 6L\Bl"vF$L?& z yݓ?-T UL"L@o3UGcY%L4;JKwZ}U{L;#=(daLxma/{T_"L.MA*Ҭ;-M" nȞMf؂u^RZv,⁾rM?: eUbHl6M8cM?Xb G9NձM:̡%u'Z屢MIDg#Ғ|;M:5Y_O!aq94M/^ĒKMj|VvukA7*~M tXuwZ`M*S]hL-qdlM̙#x0~Mb<Pl1dQ`N'J7O wzkN,:XM7@i@pYoNeKLשh =?N}S\f& <5Nejo-j06N@Bi1(哪{H+NGtr >eqNe\2MLLO$N}Y lRX/_N Y̑ZN.E:T44.!N82AsP̃@XwNoOPCPTTߌOfvd=#aq%&cBoO'?9ljO,)/ eZo}Y`&$5BO2B!ZcP:Utrb(d4PgsN!h878U[GPgh σtZPiqJ{'!/,Psw$ aØ[٢@@Pb1lXJ}G 癡P*u4LoN6P./Xީ'gfmPe8+REhP΂ cjsq@PԏXv tAKέWqPvt+ e1V7Pi<Y.d`+Z(6|ePP(wYIҚ}J%J P#+ŕq)xKpQ"UdF3Q"~ pꍼ=n Q]>?c~ t.Qca&4S.%Qs*qŀ 5dž,ͤQz?' dzrgQhVW0l'QCTd@FQe,AxMH .Q14'^Q gQiF^vdذ5MQƖĝi9HqQ ݶ@$5tPR:HM< PD"jRyV&[6R?ҧusXkR@BRQJ)`V'X7MϤhMRm+=iR>P?(RQr8}$@E]RgjNػ??R2ImpVԤS!*7SFٱ L^-zSk"YX$[Ƿ5SE~ <E{S.u<;RcbOjS/i4ݢZoe8S^ՏZ3o^2i'1SzTFϟ_T ԙSl Ҩ?R@]sSbŭVᦷ##qS?ZzPpLu SQ!}LFPiSU *|WڣAT65YY:La?ST*T#+Z5H׭ĵT3;~Nb mT}?b0lT l۪ר7*`TdK#FuB8>Tl0? ZAʼn/>,/U CFfkJ-4UfiU~R2;Q_1٭DUcDPG;%Fᒠ.Uvep?G,haPU{Ⱥ})V|Ubqz{ۊ3 ЗUM$'»W:.U6~@rgjW[Uz2-XUxUl 2-MB YU_g7Ff֐_r?_,V*p&@Й%V3<HB?K|E2VEb|Q 9pMVQ *qAg`{`nVA4 ]J0UC /CiVvbol, /VW9*a¯j VU a}*:x6sW38ÈnzmSW^&?1pݭ"ZW,rQ/eCRW5ӨRz>h*W8RŸe?OW|77r]_WWb158W JG< eZhLhgWltҧp:PEWx'f1#1A:8GJX.8ל7T# *&X~XTϛNv6WX z4ѨNX >? F7?,XNDvYcX:8/H{d$@y,XQ6ZX,7RXCD+kh0 X؈%*dR&'أ\XۭA eS'. X5xc˽XnQ9ݫy%!tI[%YyST3 xTZ)!!HRCÊ| Z;@ʮ]lЛZNזQ'?<ɽ_Z^.Mr{Vfv+2Zb]ҏ^k "VM,ZSoBAȧ^{-ZCɮЅSzp@ZS])+ O`6٠SZڹM i"bZyE4.z6UZ}϶k..X3;F[W|B/,x{Xm[(| Jj([4uKsL[e;1t@]%+>7h< [i;]v'$1bŶx[kV$+6m[vMoIR-ީC[[ء˂C y1[9(o[ ?d}|܋[ IŘy>x/[1-&]mw)[E$ -'(c\ `hؤyt3^\ +nHџK]B\/aԋƳu.3\$2P#iT>O1\+ꄗPr;;,:F+\eJ D"*N)\ieRlY3tum\`SQ}Lq^$`2\9^;?wf=\KS2p2> :]*]C `.G]) AUkIf!d94_rҺWɂ{jiOq_i= PJFFu} Z_ϕ "J4_ǐZlaR _5[~~Z(-8U` 7!``hW uJ$ÌM`9sfXO54' `<^p~0:1d`IA@p#ek `\U}33$՗_kMa`-SĘ-s`\҈n g0`>/ ?*TK `,}zådRTNKP`TYvzvwL鬽ew] Ǯa{=Ir`r6#aar_j|eJRya0b=/Vڷ(aBԾGiSC`_vaj=x~gǬ]0da=VaٝP2vj/ea0쭋 Q5/jOa[V5ZxnDHvabVtnMHwbx +,"Uu b B1DY Lb1`s!VlP{tbIu3bbB?k@bP:a 2ǂ>]6_bbۈsK0Wbk,!;hf{]b; n7uG M(b4;LP?v bW Ebg͒#Ο.ObJvP@z;uw0bH)wИ5c"BQhnZ(c PHhdF0Uc$vj`_98?Akc<ECk*!տ#gcCSm('jX8cNe,w1]|cY_[u(׿04c,c\#\`./}cwrۢޖ;Qc~ޅ_qhZdzcemw#{qdfksi4;|o Ȃf~ٓ;C--ntf|Dm4ԉ 4fK1@*S c󤀘2fA$`~hfCߥƢ+if`sOF}Jfjq|[Ux4УfCM/M%*5g pEv`)g"d}~fgQDY&1W]KgWe>F D^;ig_)s)vќXMgf,V:E %bghNHG[|ҪmgKl\,g#ԝ*geoUjվg[ёʗS<EgŠ\Ggvbm/g;T);oLJgc@wXړVg&cT;dE-g]{Oqʿ+cfh<+·AhmQ'0:g}`-ah$+U,h5(m_IhN5(V{yJsZhS]PVHLhORmJl o*h-ͭC=YW[ЮIhhMPD-\ ;2h=o GtQ͠hP.lh3[?Lh>+]nHϞh_4b/`AiTOefwi+q*&C͝RixvH^M5id:&'@0n inSj%76V@c\ipڇVg39li_bV?n8gihG-FFRiArB~M۫[iU/ aur钑 j ;Ŝ10;AxqTj!KJ ig 2.j'w&<G!j/H 5 ]Aj3P\K-c/x>{fj5m_R/ZdpjIt񇘵A$j]u8Tm//m1jۖ-6ϫ+4j:>0N=h^j\T $E¶ZjվZ(6DjxMw#NE}Rj#D:r*]jʹuwgeŕk >Fg=Z]VnYk^:ccF#fkA6N]|PU+ =NkP\>}5yM/u6kdߡwd Lܢ79bJk{)Iki{ kwe<,Pхk02wAbo)3L3-k|!󹈕"nT~ײk![ƢR7jcN(Fkf7gv$yhkФZbP׍9{꾍kNs.r]nlMnlZb(llىvQ$“BU%lF^i2l*7vNuB?s?mZngK[z{yf' m^G +sv]ڷm^P[#ۏ/7!{mep `~-)"m0.h 2mߢc@b߰U=msI,ˍai,^I?JfB(imm S1MMBmj%xÞ?NjmCbB9T ]m3Ҧݾg[-ynS%{]t8&Vnk\/=*n(Ɓ5txp'׸K%nqV.o-,KFp*$q\,J11|t. n4qbMK >Ո;vqfzӡ^>S4cqi?:)SSyŢrmq܎B4oЭ3W몐qOf u]vr;wr4֮'WbC@r+dz4#l&9[rYQcрegBD r8˶0X zr>Uf8$92r\UϷ%cY剎֎PrgϮ Bm%Nr!D.*sBRAr *\5NһWrm0I:Vb`rЩ\7@ιh{=3^*rڤՈD턓9m rۿ@?Ig㜬)W}gr{E[,bz=rҕ$J9O4sn4lGB=(sjuEbr 8έ#Zsy_>Y'}s2"126N=Nfվfts9^b6el4Vs;`}CD'jZՍqsOx 79y}ԑY4sf(ݢ 2$s@phV8ޕVs"HL _KM8Xs v`̑xy+sQXJoRKc@s0w5 bŝ^s?ƃa )+sssb[sl< s= =mds!Qy|uSsԲlʕΏ71O+s"@,5(gos~ZO )Tsў*r;lT3!t𾶪Ҋi}NQ~t4ž|0{PD,vp=4t ) Cqkt5!&O6;(t$=?hz̰:,t0f½O,6tJ<e:G5rtY,a9SeVt\ldj/sKWcU)ttU{Us zovt^]%#]fP)Otm=EϵOEtů'C:[CY)twDZHYJJ2u ]z y; u)D]ukJ}@h[/[u.l1QPX7% ku0Af)T 4ޝ u7~|Rh>JӁu?k>@i是ukƅNWIf$AZumuPkm }£BuoRHۨzucUPnuyi/ r?Ay[uQ"?%T4Vv!Y ?tfv)4 M;(v,wpcWp°tw!ߡ,%gituw/䘾ĬOC Rw>r=n7wCޡHλ?\wMA-aPgG (wo:$ģ w:7/Ƿ6+Cw Eu=znE◍syfw%yZKsٰ ,!mwgDWCR[B Wlwם+R,|˶w0j?NwvȖ6@>6.b(xX"R<ؔJ7^Pxm~3%9a1h"x,lAΎWrApxq+1!8TaxK+qUXi5}Nx+C'Gj n\xBASV,mpyݨLAamR#bVy&ƁMe~$y&1FJQ^O7.y6%oJAJPyi#ľJкq4e6yqO>gkCI]! AnyMS[7a>c7yЫ^fEa?yjGt^V ?ͽmyVcˇ:E%;&]4y4:oQ`e9Gzl_F$z  *v`:yHz+=AQdH8z,ʷpC/i{b ])z81C%نםN!z9o\(\#xȱ8Cz?0|o4hb,zz?Mӓ~Αzb"Yo@8@sKGH[zen?$GS;dÜ>?p<*AO29X<B~~2cTdn=iӛ16Cl(\*yHY6~%="k uן[C\50* >:чݠAD0$*X(z4irP ҢnU商@W.y`S?9.u2/f7sh_L"٬P:QV)&B#5tIAilk^U"^7:6B~,k%f؎žZ}e߇PqVEgY'mNgm~[RN{C @Ё/+q6ӁޢV#f/6[\NG$!ŧXL3h xj0C&w漡NBukYLHC,B Psx|􆌆'q%؆kn7h8b5QɆ!; 8nA@ *F4^ѮH [B,H1 ]/חlއ Y,""^)9|E';&+ZȯB%O}#p0ƀ0D#}D}xh<Gb5[Kc^1_iX͇6uDZ"ui Z]0r`x^0S"'O2 .f7D'vKbn~UnW+x)nԯ'QiX:i=)*ʨ0Dv0%͖n H 8aiAW12ltQ_z#ϼ|ۨcŕ.u"Ze ť}* ct@l⌍X+# L(^2_6tK@r g4^ހ藌yɜcOsA=%gꌾ ªh i^յjhԓGnX܌ !5W3Rs}ōN {N'_eĜ'RFO?$/KhƠ?h,1ZP}?AQ1[&Ipm"P0sKT\seUV%"KXJ/(ڝ]b܎P4mgn~ZL`pг% z6:sI@[- P3x3u~<*F Jɦ$'](u(l K]#Qw;kr0 ޞ]zkEҤ@Y# nduuVC{(kj}tkMR xa[U`i73T/JWVb2]',6 H/9m,]N}DUʋ?Ǐr ڞ@+5Le>Qw}UNуO>N?ViE.\+% ]z ֹzz;bW `Oc}ky,g]Ѽ|ukF0!3869r4c+#lwq ]h>HՒ;~2DK@+m_r5WDȀc]S3*337EVԾL{;伩I1T83wmnKSFq ab E88<-H.GφYB֌ٻ[L랉< `uiz>&DIK6r#oSjŐUnY~>}d;xܒ!NrgcFaaC۸$0,Pqߪ .s2[D-WuN5(9M~Ced MƸcZjWHWHVr(ԒM<9M;ց@_?n }6. Ro{u* Hȱ%WG{A¾~{Y8"Id ׾S &hI {6Z98|Aˑ, 1G _iP9\< 3FO!{RV 4bfMkg0IG] aY|š< -fRFWoykVXa9"K"90&g 2 xzdO|+Wy6y>Qg|yO4YEȚ=<谫ו\Yy/mQna>Z( Vzȕ23o\yW [ĻiKj;G#xЮC̒J;T30;e/M`HBo?> uYÿ ٵb{"AF'B7,,w,Pڝ%W>ؙYMwq.V} AoX8m}Qa?o R钒鳿y(p"U`jA}^jE#=gt.5w"njMmYxbf܅ZͩoL9)Gh ȷ6 Q^~< aD RRZHF< kӏew1# 0|VxgQ sxOל(Rq]L[SoSJMP!A@蒁:Mv 髚t \`TK~X N%@ސnʒšd|Q-ItLS2q2!Cmg8[>ʶfk 3BǴ$']TUUeϜhw D_C ԷV\ke_(*#E["Gc=eCd >\A)vK%c;` ^GzU,-u #d / z5*%b3%V?|]app5,lk}5f-Ӧo@]Bm3+K 6KAִ/NJXv/F,*r{).jj_PK0o%U{gzEX&WscFJK#$E zt+;:ؗ?'aUr"KCz}8Pbz h;PTԘ, tq$V]R PyE%\q3H2Hp#!b\CM&G8cV*ck9t91z$2ً̔ ?:I2n,${Wci]WKʣkh ;Ln􁐲GYok0L E]t:owly)<ۘvyNULc8V0J۷\~0x@1m>%>]dZ͗{(dVD bjeV>S^ %ny:$ ['wDj9le ;9 o%G=Pc* ~v3Yo!.¤e3Ĩ܅ 6kHAHS*-V}]C{as/m*zvpT_Goiql8h`}}""qnjH{J %ɽL&&^ˎF<(M>MO6lm)AmOg7X4}QuC?ZAJƈ83N3rcRtqJ mLm*$m'Dd9M3WysX a7~(ЀTABL?2 @fIR[Ro,)7NXg(_{s%h/P i8r(;+ =`O€v\lĉLŝkO Λgb.BeF[,\>ĕWlO:9[yŹfĵU\z 3 7^uO$-@qVdMۥFw&}JG0/eB';7K آ(bC]ƓfQhR'O_$;]iKS]ttNkyI)m+APBL~'b6 Ǧϊ-y_&avc٭@ŵJ`x5f@yjY}C~}O.$[;? aJ8Ekݝ|zڀ }*~Lp2ѥÝwzXLdB_) e]Fh:jv}R $߾8~) @}X){U2bb?yzG(> ; 1j cE?hӋykșv\uq:CV2uPci^] ܠԤgh}@K絊|x8:UN| (`6u'7zFHOl*eKOJBV-4Cvΰ˟^ExҔHEv}~bqZ̐1^}Qa~zu}dh SDK EBl;5Kۼo*4pʋ& 0 AHh]WF YR{6 -Hi!s7ͺxCfr&;?,oP[Π[J> <g/Ե ɌdүHY:}W p=] kv[4ÉB\oS"F13'/C|۶lorAUzhڪ ',$؎?׆grCbbաB':۬M"բ祎~ԡgMOJD2?{~)y1\2 k~`w{u}BWf;΅' \_Âuirъgӡp(Jrjŧc v' ڦGj*ݱ5ɟ8 Q#A\C!j8+%_u-ε:gG=<%0k]&-G*䄡,{; w.wNH^3=̢ %q *]e|Vv` ιV{uAV`mt8LQ@3d/͌RgTUj~+tIuy#CW+>V5kn{^/'W h!uM{.,#*E\ `6QVI׭-+>Y 8 ֝ /@R'p p4 lyP t60çpF.-[tP0f0}e5|r :LE'^ȩIcDAT,5o ~*Ħi1X1nUz2:5H]ԅDf ޭnB6S2FA%ھعkgNZ.ZQlQc8v~glۘļHɬ%1r XoB}31O3;F&X93,iF} G֗UxD9*)[P;Ӛx>x~O\-#( c>0T0[ڳmLuب'(b4$Ĝo:,\L %ԮO KϨVBv)wy#QVb'pǀLLjP6]C 験_9clt*j[ mGYϤ cYtPSJ~R=ޑ PV/H.Tz3JG[WvHR5*0w*HS+}2.}L ]Af~NLmX4yF\vv󩀇S1(]Q`t{ Y)*TC˹L<$ک8,DZoi~A5Vg7i*,eΩ]JڰDA~0(rf!+3jho0=`맂fNd54_II}%-`V&67pkUŔtF= ,YتcPj#6e ACWk fGO aiWǪoX[O`UuuMYE68ȬW1E߶o~G˪1@᭐|Q:g d0*HhLWh#Nj7Fan )<ݵNJ_ _OM ]ڙR y1P ks WY(m^{7Q5w~p 70ΫSahx4P6~$n喫VE$в}-#l+ ]WL)J=w3J=aFkEp^M]ЉN@|+%>싫nǞ,d~b6uw8A)Q\.{Ud2}V!o;Cլ-paHvQvQxxt%;CXx(0bmyAnB“E$Sc*z2[S#=lj B%9\?;1殬8!Vw,\K̬Pgď(n 샬 f+Wlxh~̆s2y-Z Ă' "܋0aHrW'G)L zI鉬:9ZBy\?eW(x ɄO$N4K6AbˬP?uqg| ̋rQ+hp0icϱϒ & _" dٳ𭼵x0<¯˂|z9<FV .om l%U&:{d+[mzH6{䦤sܭZN,)[}eK`\gE2рo;OYڭRP0M\6NB-2b[mܹIʁd6A1.[5좰-&xzl!a`@d 9*Cfl6 ]e#4v/Z4vj 7Pu X Bϫܮ}"؋LYI)u_f##8U}x,r")u{4m8sRDlY* ?E}PIP)%:Kj0w81aOدE3%\9Sa;0;qcbMY1V#UDXE ȁa4ڤ"U39<=ԍ~OtVA| 3[~2FS.:u{M.헯ȶgbKG՞I_ưtDd,ί#97w l14HrEf@Y/mdKې8*$9HOm.@9}Ʒp5fFbMP Ǵ+ǹ++ˀǂpApire&5{UF*>-WL '6@wem[LlGw5@fM:=ƉƜvFX0ҥOԚN{;o'\Ħ"y:**}!g{\ۂ= a8eư < ȸ>u3ujtJ8Mm-SٰMuXܚAcAvBqFϵOk;u ;z3W@SΆDhOOgNF%oXWie1K ]MW5Iϕ+F<Yqcm52s:g b4+4pdKKHj@_B'6mαNHDa%u5Sd%ZUݫ~Cxjȱn+؟xP)w`I}T}1i~,&`d~ƥiȵȱ2m1aRλp."I5bk ]vlWesEK|VX-$64n0I}@ЊD:9yQەI*^ //BS︟GYCm3!1~Wқmsx%Q!Y10ŋ QCFe֠Vf^j`y-[AɈfEQy;*@"k4kl(I9 5d5C 3Y=<`hIvWۆ8-1Lֲ(S3G"p2}ԼN|;o'a 0S߲nBc_Ƞtij~$G"Ek19A5"2ad!;SAeP،Wdz, c Ԝ @k 0:%`rF*C i3`+ᥳOէ${(u^2]RYxM lm!;Smtmz(ų׋?8hms]yE0n/I}8M!LH`?Ayft Y)At{W! Қ³?+vSIw|pA LOKxolUбr9ɂєz^xJKۋ "cJ1% -< (f8=/({9>.|ݷ8#h۩|f5 =mKd^8`(DegE HS2242y U@apl %%]e3w9a8ҭ"mo/윎)à7AVU)vܷyNc\"^k4?GD^*QfIo? D {ρ4GPR:bNWC=\_z4ٵ4. Еj`+ApS.d1,8ycv}] )S#3񏞷 ZI|GU8귅.{ㄋvyNP鷆ø DNbxB #оGcxS>kDZ XCRwib.I$>7J?-+ kyA:}s|ۗعGk`#!`t.R1nYowH31< u\Se>KuƳ2p3N͠>ҸYޑ8yc&<7+RsVG2:+OvhuMy ;ҸO˅Ο?J,uL!PĸZjŲ/LaP|Dq!xZ~pWG¾WŔ4m<+-" A_' '7BdaAv^+[}B;î0.5 *ՑͥG$  E^BRJYyu Hu<(JQGTK"2L{e>ܹБhaؿٟmPd38ܘmdg bA aTX l&)d|ċzɅ><pUeu[)O.snc"ϹȮ-$Oڗ/4p(P6F~=BWnMe|W!,C* U?} _>/.)xv!]MP:^aﳺكpm1΢Ðغbgn֐Q=T,}m酟U.F L!a_.r+ę:EV4C8e[%p;lHرv";G R}s@N.FK^~D"1 G,kFP1p"uTᮃ_Ê껮SL+wتyua, ZNMK:/<);"w!go iS12bf YL,\E +OB(GѨd;&+pRDK8l5M^/` mW>#-޼FxKs>N![HEccdn|c.EltUo킛r{L>=̼>o?b.cA.V<< /U~]D7~NeE/ܽ_a!d;jU.ie^iR:"H?|͸r'BpT4>d⽁s )<$k^f ZNM kϽW. {nʦn>RY<<;Lnk6cAHϞje_ ? #Ip 6(45۟A@A>^0E 5ccDN+DžvRDӾ 38aK 5XC.ڍ6pvoUDmmOi&~] ZoqSSܿRllHSH9N55~9;ƾe(_W7 &l FDwBv_/]8'$ CWG >g*b^@n=+ۧx(Q˘;]d5fE֢c. Dw^I:-M;H˿q;|R ]cGDF ~LI.r/0;(* XzPrp\o)[d3 ! dԧV㗷Ÿo-zֿ)< %iMϓ B?Ǎ趛ufFC%%3:p(k!fLHڸ{'p/>a2ZS5&վ~^=9Aai >J쭸_okY m\A-URksWL#3e}N<Cy-LD ʴQkMzG^' (}dw |#Å~$UaoeÓŞ丮X.(sIìyQm?y5?_û862WAS U۴AC[C5ͲM}''(RhTg?&g!ljH=\>e+Ad'9G8} .S+Kpwƾߤ2\RH [ 7JFHJׄxav+׆$/ooW7uΠB [ǬFeIİibOr պYgNTJBaS;8k+<&jfnߤ\]rXf㴩#W>*gi^MR[쑜vnTaNS^1xGRCl5)tW9_œ0/HTm'EŞV(m`KcŻmoS{SuX4`]k0Uq/4/HpP,(s# < ՜q+A=5+ ECU蜐kfH+/c[CTo&<[Aoh!Lg㬻:ǯ 2^&&˶3>zE9 3/YYOk@Vjxox>{P/ 41e`gk5Ƅ0 H[ b#I|Ɣ5[Շ2o3◒J]iTMz(ohBݲӝ"wDUɩzNGnǫ+7~ǙM`u@ jI#ǟDxk\XߪVǯR=!J>ǽjeҗ~ǿ14W o|ǿA]T7D yKYj|'uJg]!eVܟs![0x ۴߻;A]#rp7-=\Ux>h)5N۶(a A6IJ굕X:7x0&YtP&B\@jW4F۔c>ݗ{γyxKO7 Ms'0~+O2hE:>NȅXN K^m8FrȘ2PeU;%WlȜQ멿v֩Ȩiq*WꌧȮFk[n\ȷ/p~(=`^5/ lȷFH6z1.8lg{ԩ :%˟M}9yV3M?AHGuyPt=ƻ]&Oϣ܎ zdFZs}L']9=UxZ\ahɂɻ& !B ۬u y; Wbo\f ?e^ס:aCu0 y] ZwH9%~(g׳KB/7%v-`wu8<{dz6)$?X}'drvNHloIEL\qVD 3_q>h2x 4 WΚ'{ Gu*("s=$VJʉaNwM$ qP&1Nu> NTI>r廯m b̢* 4uB6qYKM8̥=,cR\;3,̮inuVn̵s]P*?h̾Smlk NҨUp}@>pNo\w"îyIJOؐ+?~gFnov ٰbj >NpMR"3͑VT<\eSӊk*ͼ 3hLQiסvEͼŤPXzGM(K%48( ܃b_/d J u WԦ<_!O<93s:X,$!jxŮTq;"#g+xp7;r=hoBP0vY`YօuC皕tMR"#}Κ>xjΝ7 rxwά2fݙ 0WC*SJο\ R)n?Hqb>lZ#A_RBgȁn=b 3㷗UڒwH>!/n=9jItWO56ewt)_2?-:'Dn.VOas->5jH^Wx:$ f4rq%{cUKH=J6Cl-&ΌVw$ EAsudS҆R:0┆Q)F@6D(/;)%&4n162c* \T;n쓴~֞zsv/ 6w>;Ѻ7Ѐ!Yn)恚Й&|j@Eje bZmФLz2WڕХQ QmҪ=bCЩD0ڕ%zЫ@^oRTе'پ½j9z/<[#6=Wֲ>8 cf%4XTb#TH…8õ^M4K9%W=n>&UO|, ,P(Va=Yޜ/Wѯ ıCQakC2Ѹ3ʗ7ћ8RѩBon,88ϽVO#u1"0SpyI Tx%}mܶ z^o i%[tE&b&E8#kvf$k{ 'ҒSvWǨ pAɸ,8k OTW_j7 6j+Ǩ1J&4SI(~]lHU)'iAnCk.zuX,[:X>FlA^oKȋsDXԱnVg(OSU-ԳqB2R` ԻA^U L O.0bMC %xӟ| B(Di^B&(xQj|ײLbbکϟ«71j @ԨۣaDۭ\G Y0z%1yuwio$ Q5-|S7R?!Y]Ӷo{3(jǽ)cª—nE#Վ'xjHF5!d՟f~X buaQ˟^כjռM/=Wױv0|ȑ26 ,lE :af])ܺ0j؋{|kLu2+RCQYdzvQdwE"=h$T0և*ʚ51RW z֚L5Ò}ްnG֤/+[f\M/!֯!HlðrmnִS_qskO\9ֹ{.Jo"YhLcOw]1cͲ hfoS$?[g9|\n?x*8ۢzJc6*T5@ۀ>qրJ@K"@?Uȴ,Rg5y^K1NץÆF<͟WI!Q5׳ ̭?W폛{׿gju '] v^tYgv1V+8W592`]Y/hBSV9P<4 :ig.`~)Lu"g6؝/vEN`k~4ح.ݙKLN`ZMذT$8߯$1>طQv8Kqݴ+sd,G@VQ-W #|7MY2%R 5}wx@sY%ل/^u`Xِii.K5喍ϫٟ+WJ^L\RK^'ٹ^/BzG=a / a𥯵jLK=08,+j|>f 0[{c: )6@u,$k Rn[}7*5VݚĦϗ%aI=03v 6rBpʊv ^pvzKgZ̦,167eIR9z*wYLlظ(fA چ>Dїn[LJRڏ!GL uڕE''FV2ڤ6{w/X EMa}JQ;r 6bu ǫə,.)/]ە],.Dcjۥʼ!}ӱhlۿ\iXoZ+ᬆ(wl %ZW;;tzl7:+1MJc7Ǐ"VD2@@bhcC^ XR]p)R ­2[bL;\qs ^|?C)慫ܗ)<,BG ܟZ(|;JثܩUx6**Ȭ-D[_-I$0~Ⱥv+<#vtMdPW絖z)r}eY*;/8oR!OLi`ue׆1=d&Ǩ7'uςFZ hèh p -hƧ=#1u|q14"Tq N}'+t `  p>'aߟi'?:8$D‚ C&r;fK+vR0ưݞ}BSs~i{d\uF7;3aP ׅ:@Sk/B-B7t G‚:"TJ4MS_"(kqP 66sB@ix.hH]#w|gOn #=Qٱ͆??>Shz`**^p~ޝf!OAڍ"24k'޷LFrGvS_OzEErKaC*A/+ɺĻ[pq{R FY'~-F#Jc|*ӷM2L<KI12&Hqz>yUsC@z^\mI&$ E&e<4iߒ rw-=AOF?ߵf.Y\W +HʬBeu(ofVW_ 0dR~q >Y%ϊ8-%Bn,"HP<>7cB^2NtV^a h{H>~QW݃v1aWTů0Yv_S dfyO93bn}HI :36_󒥟?[P&+=&Cͻ"a{$]M'Fhf,¿_p^9m*,zvfn>7,6ܔb2| lQpzaTa"kmRI941S@AOM.+A-vP5-K h?gSʻʣw})fka:GQiv:| t_,U/P ~ … tMj۟ % Qbԑ5q̮TD)M4:gѡ)N@;mmRB HΒ$ Brn1yFƥ#I!_\Ml_8(CBl5dn$⾹`v>XD^ rj(JYgѤS?KLs%!b'x0+H?lwa92S` mi`Jc;M+LZM-h,6=f%Lc[9="dftwx/6 $4b cy8}sS:^|sFQ4U ȍ9Y>рTq?(}iNF1s#ɩ–qwa`z`S-bViziMO.zk{f*L/a`|?g3u;iU>z4 5SSVIpn[u{5V _ga j3lv{3npXd~r@C1-%>o0?c-BR2/98ndSAAΜr3Fힴ媁u-$%Տp(He_Ҿ2_I;OJk!7>6(Z?.""y}tXoh7YD `2 +F5 0Lxnz2Ĝ*|/]QyvH%:&Iq(td,ufa,0J aU?b-] O ߂tY'uXXWGS,JVkexbʛ`ӏfId,^;|Z THg~%B4o \sm/cB)(z4!=CuGXr{D85 (̸v\#O${,!e⛲CK)wZSԗ:GVwQ?PN׊.Ī0e(7| sP7 NBӟ6];(=ܷ>Ka\n/VG̦Qx' j O!T gAhe^ͥj G"oWS/x K*8t#xxNʆ5? [P/¥5$m8E-:,(8212~thkئP=[-藂cX}^*{ٖ+BBK{|O &G螃wuz[YbȢJ$`zh >ަ+ P/˗['63NI1Pq~O ]~U+誗~yyԽ"Lg$j [ Pc (K̶NPuG0>f*h:޵Hc.Pz]y>EEG!U'?ܵF,lMaSϠ rQHa`&R!WpSSuL;ͦi ONؙĔ饶 F +I~AZiLAHIUjjvV>ք; <lr[f: n& <gu>5-3t;)(8GJHCM ~;~FbAO`wN"A'ns}@R`*w&>l/S%uW_@@Aw'z?ꢰ!kpɯDcȞJRAY\|O9$҈h#귀HxˠNLz@M׈P̺A Cχ;ר$+;7hq KR tp,G ''9JS&VTKzLB`ps=f߮¯7}Dvp}] V2Jt$.NfgC7g [ G锏te8NŖ=X7' ;w e56;Lڄj`7ӈv›uv}.bL`qvyC{xX=p&L:M.2H/.EO ExVih1#ݴ7 ~^폝U ~عbO|͖t6%YoVKÅur>Wh/wTx'W'b-A]`R+#3P=7 dWu7h;Oix%7v,= ֶv"J?pRՍ90jnz\pF^|6'5OgNv$Kمn OnDA٩t7OG̀|,ZBI LסXpOE\ Ec2$gW8g9l>wh؜  ae>'==[V4Kv+0Kz3LJ*τ]wjqg6QOfhPK|Ej)} FlKЌV< s|1> Z.e.*"yft>,˟WVOPUxL.3"x[wyxqu촫Z N8cV -_Ѭ;GA˶d5nCNpNqW&|Cm`͙[2cutق32"B«vPsĚKAnF2>x]XO>Fz:@J:6/68tKz> #ȣ[0X.t&s+VQ-^dz*lzH.\$VIa} :6rMk^к w@ #ү9=?~+Wh3T&bWzuK2TaK(@[NEk|3[ZN9*?]*ʼn*7u}uya@H}iHIpU:eo3Sť`2rN2lA9(Yo#L4JmLXŌ~ {< R@Du7)8ddr^*IRH.TG҅1ZOSe:#O"MV-zE5JܡQ;$׀ ~tF^ 2/*gn"woq}v1je5-4YAXR!fsSr G(~Ͻգ#V!4llDLn2eXQ]. hk>WӴ9_VGZ҄W&e,(r=R$1@gS2!Of&p'w#e9>ED)Mx{fSg {>\[4nj#Ø!iCH|ZDvs\DWR*Ahٛ:rr7a͓ujU OAŪ;Ӹ*{p$Zb3j{ZMcY*/w5M{Z .#eb$A7`ѳx4[%@pv[ &UʦG:>^;ppIi1> gFXq< ~ t.7L*8F.@Y= K*yB1oEM7zVmM/fq}DbRժ~q^ f'JOuN)a} 4Z{_D)aZRA't C^ݐxVrK"v[&Wk#ZN3`?68PftL$۟_;4)̦髾ߎOůeV>݊ݔ WΊp~WWeJ Orަ$;> -927g+&|fQEOEO󜦚5Iz47ip(?&9 M&M5 (}ϸщg8]$!AJ|~Zy_Cl:/*宝Lz;v,q2y!>ߡIQGʛ|t#nVwEDo/wL0|t-iĜ@3ן%=; Ԉ~5J0sũ.;ct8!@ڦR3Dk?NݸǴ ݁^\Lrg͋-gc뾎|Qª3S2%b>>۹n1,wSg1hPj\LhX:u| wyb"̒榩LP*|k`x}vG$o?j̤5l]bu8>k 50@ :W#ZQ`WW ok_7-o |fxRO9k-;6wst >؊ rvP/]՞%.(T3r`̒ZË>?9BAeԡ26_$@VE7>?Жm'3 0#8Y9P}Z(2l[w5.HGS$ժx3{#\79u{\yKy }8@7ᐡT~˳5g gG1zD7Rج^!YY΀}7kV%Ȭ|uQԨ#V?ė:D@##۵\՝+CN,P0xSiN>m68I3Jh3:sSヮoVsi\vt:ۏ_Krq}&r]}zfnG7  H_4 p:ë/ :ס.PVZ6Q-"!%jHSd0¾#ځL9^򦈘U옖Cȥܘp[4<`lkZ-'"w"N$E7[*Х!kzMN~Qfjw\RޮSAhDOuk9?BEu& ?>! A;5'@>Wp^At'AoVJK\f@i z{g?<2kW^*\Q %oL1 !/c}Ib+iؙ$&2z[%29t6ǚ}^őK|-I0g1RnQU^b"B<bVK$SODu>Mp%)O^QѧSv3tdp }4l✍ւYn8q) jxז9,s gݰvC'3KZ .+=2Na'-%31-C8u!Ernr uk ftZfaH{IU,LɓRMR;/zu1/UaCYф<tޢ3&6u4YL @ly[lv_f-k}$,_ JhuZЬL73pn8l"47/Q?\B <&8cj 4hSt&4h7%vEW Hܡjp0:9hy.mdW1Ɛ&7WPOHʔ`Aۆ0ӳg3- $L"U m+y{Cܵ8x5AFk;P1Au LR[:WF2dURm ݇+Â^k~^mtpS}. `3ff`9=nə" =LѳKf`%uL݈&]uc1?J5QߕyX|k6Wͤ!wɭ\݂) 6j)G_|oINz^7%mRg/E8kL}ğ1mʊ3teDep ˖ã!:A99OmR.K I08Qm?tR s%R nO*?^k9\^ tɁ8"o?DPa7Lu$̱T(,-o&9UpaZuǯ C R,C^u6uI߳@ ~dI^0鹋bϞQ+$?O=ȵ}QM@)U?DO.pF3HrE3t voWMK@)9?_l_xNs/3m- *rZ\`Vf TX(a}ͥj1bjl`s5E˯#8Jk4+vk{sG UmRݥ`]ט/x`v sl7&4eBW(4Q}-.s 3},bK)H.Est).""ōse'WAؓhyͲ j7)R6jT]Ag_Hڊۏ}uCLTVA|(X \&uFuC%-S+l?t~^C)AʈFyoaډ3.4M ,&(^,}U@hGle9T`+(gT-_vA۠|S Tkm}Ų#D@;U?ogjhx[#kFWzYLU<>3qmLH%Fufo3 :'y\ OR𡈔u(FFb-sp o?taH=C~p]_EoZі' g ܞ˯8 b|uH[ z1 rx(ӊDo A%Yb˰1T]p"ܮ2X mfnrn$2TE NB`CVmE/ido9QY˰ #7N}Ӥk~dTJw?[.16+ԦLZ&gNI}aQJ/=ɂ$N쟕((Fs_i 8zP^~C t)F~g2yxs1z鑚/_F6LcL1ֲsI `zzDKs׮P5]AƠP"VJLtj;Av !ҊR:+il?fzQs~s&m#ImhOATC`w!&NwF63!*[5vUIdҒM*֭ ]>e h?f}LdňsVvVf{hq"ZmÑ\|.vgr?;_XfF@f v(;TL^'NC U,*Ďg$M|P$omi8@Ϳ-Q NY/ ^j!2Sj.#jk%]eD6-O+boqmڿWg愻{tk*TJw_*ĺ9uz)hKTgmsj.G6N-Ո 8tIĮb9kXbK}cAiBi5 )shfpQؒ ӓxbT=Y%bXS$d.jy{sY-]/2hAz-:@}-#}jn3*@ȳ/*Z(ki1˭DxZ9aJ(Tr^5G_n xLikՔqGO{vM{HC1]vt3;!'z~mi' GzQer2YO0SV)3a&4hP9_\ *'@a(J*zZv'>lk!'Uzi}C8 !/5# i`|5gBpԤn?/崸 ÓEQxޔ 4u0BzWቍFKÇtf=)#Q,(bC\?O _#Rfsb'q] alvh\ϱL,0n<b%Xh~>,<+c8ǣN6WZQ#VyºVo,D [2 24 Ik^(0_# `hPy칦[v-Tza Ndbʏzgou/n0"0,`9,i"7z([PQIEyLEb8/p&fiY]'wB#eW}n5ciP+OxNyz-bto>:n ҉ecO)}*^PP!brpX Ĕl>јc#-<<#/lU? F$` - o鱃x3mO1z n+ڐ}VeZFg"n#8뮰P9 Y#q ,f8zexp~+k0ܿ,trFܣA8}7ͅ謵?S6ncqFL;ч5~zn SF|_ӆ| 9(Ʋ(BpststFuA #Y|;6s3MM!:>_&/ BCź NLS eV^s5K4ֳbgrx;3ΠLQ1ڊi*4d(qqA.sgUP$gT`8%(¡=8\D2뼁n`o~6,:w{QuwMpT;gV5,tc)J"Fplkl݉8J-h(MS]z0M4UV%A?.+Cpu73.mSKӁnOʇJO4&ZӟI?!}uE-s ?|lp\䍯KvP.ۮL1S9܂!Cݜ96Vwg+()hlCڥ#֕?"l@YwNb`xn9[S{8zm{jA/")D/ `&o`y"h[?ӿmIZL o\u&PH/苊g(DjrM(]Cme4{3!|WG;Q\*FR2}> ๯Yū]/YN*RO P/Z{)$Cx b.4!\H۶5\#ɍ>ҧGhEȹyxkOU ~nl)x/LcR!6AV1ಊ!\h;:% ^3^[m2f-TvPB} VVlL\^ ajCJcaeWS%JL-Z]@F'nܪT|Q-'[Nt@+mJ K5Z:q E[5M( x JI\ˬ_/W܀XLt %I}!z/˂Kc!lDh'9f`o@O=D܀hT\C-y r5JQGJ,I֭-$&WƦS 48B i}+=g( )Yb,kZYooSF;7hl(*X,ISڋ%yf{d㒚T *ew4egObD{xKH9H) a5Ojdoȿl)G-%%n?t]<>P‰w`j׃>V;;!l0-(/;XjS!` VyVCJrܬSz796 =y.xŽɩO2VRn&fcqb:?ɧ'qې'\w^5A:C*V8b GπOc:߉ݓ!gdU:»"Y<w>lygi ݹ2d"C96sZbbԪ!}P=gY7!eGnлK2k&EIH!錾c cFWv A7Y :{uDpgAߩ] /xaS'.!È"nÆpSn/⌤X707u! v_ 씚Ȩo-u¹纊t\3=?ˋ5N K"'H[474ۿ/LJ*g/22b m1ăCy":ڳXywc O_uNwag| -*:/ӍdʕS$ )?AD}Ѡ \ ]S9vwxw_|ֶńw%%0YГa4) xυ|[blJ+4!K D KwxVc!WOGOey:cȚKɖ+MچKDR;7#t1+R u&cq6@"f-O66H3Y AeFPMvO:a-#ցN^(gu5nBԲt}'e_ EE>irQ.R5 \fqBb]Sn0Rƹi庭M5R|[;9RA"[-FB=w:}(i̿o|c;a/ +gsUU6u >e=\b{W:tM[*2dա趽RJ@/) .8mN\֓Y^04׉ ~ @,\yayVGHdYy,k [$%>h xgt-kg I )KZࢂGڕd΋[]LW~‚ipmIk838,KwCtY]W!#ڰN0F9Y ,kmC$_J#}#o~>]CֶHfh6lkrgM Zq2BqH ;[^3ݚש"nw5!DvcN01m:">$aY{8/n>/leO*'%>+pg\0~60b&_$Bie+9L_k{/I3bUISna \+w%"Rs)ãIv_xY[hRԬn0"~yVq*=UJxE`[50! -(h.zZ7uysd-K>|U@3dX;GS' ȔR"p7 nlV_x#uwS ,o@sƒ(–L`xh&U]̞IΤs%7y\mILӸC`T|E^yyk׮p! Z"AM޳b +\;3ßUds`0qS݆G5̃#B!79 OqO?';Ly!d1?%;7A)OHk}}Om*jEL8#ij:)RQ>'SV;2n @%{c*?hCRr=oֳ ϼ^V6AgFэS6R @m/qcv,XLnUS좠 +;:'βM~1%@X'MПjww_K|# /!$"Ls}>K٣Si5lW]mBR#o?->Q>t 鉛-H?ۡ L$}uEwLPޓȁC5ߌ'ߋcBTNM|:ȸk@p,iJBrFo2B89+cc]L@>^5]W!2 s0-%5h$qewYD s-mQx+0q1,K|:R)Vw)5 t%\x/S^5|!FDȡw- H695!ہ xXXO.˩0R8 G&N'O%+!%Į4*6UD3A|FC nφi~Oίpo9V6ASj[Iju ?s mhjS\Q7f \'5;KKYIE֎`(99rܚB X ݾ%l)dZJI4tFVP $ #*йQQ . P@¬&<uѢZX^r$= ,R&Lx9qhGu}U'f;Ѳeזek{t՚(Vu–U3S.]IU_`x@1v13y Ktf6he>(#k]_sGy\xb|钒BNXuFFxYB *'k^2 p5G[qUHQ7h헮}si8}$솊6$>%G{Bm1_hR' u]V"*9M]Q dJ׷%[8npZ-Ӂ7$P t@ݜlhvw 7 LvpD XSأ{d go(\ӎ STPa*f0T8`h[xXl #Bws6q|U T۲kh}~0 FwpH%Dx(v`ƶ9 ie& ߗHt&!҅jN,ԅBkiI] XL r8ɱq/t³u])&ɍfYJy:h&DB@m 2\%E7Б3ZΉrrXX"Tz֥ľΌ-$ *@B.xd ]8|FFٖJ Z@6Jw"h0^'hr"7L"Yv9պm4W ǃb-D^>![$uk}B%)ʂ$LT}y|!Ձʁ< ٷ0ho6EfCU_R(fRomNb*(;] ` s;F >R!9/oޓIξ6KW|"^q0M )t3OZlБ}Lh}ԷZ>ZߊR ѤD7Ik[|. ߿ ;hv#'Ոd]G. dTѷ _Fk3vöWq"o/Q\Q^a-OꦽO1U/5a ΉƝU'x_ImnCmZǹZ5Q+p=Lc7X(n:Gj#LBUr[6j2Dy+@qkV>IpU6j%}`(#kOh4IorGB,^60(I@j~+sP+/>:lWdD3԰pZ7zo&Nu^zDS"oHG PǬf')pG:Q oC>CYG5"a`lϓ˕8 hNV.:B? c$-.ԵLնt 4r׃lB@^i29U-X5֘<>=VZ#9 =|(6v.8F{GQ3P#5y^!nqS;2[X'yxa鲠PGq(u NqxZ{$ Aǿ,~֫ }'1a^9zY\6bn{ }Z$@=_;hA%1TgN&]Qf7g#ã0[X Ƈ8ZtU u[Mbfߛ>W]91S*]MlDTFMRffv3gfr{4E015Ŝ_B6ngQ".5a=>"*P܈dcR A #4!o2ZkPm#z[5h\I_Hi%BGLp#jٻS2L9_~|j#R-_Xdw<$VVlf c|Hqs/"$āنЮcW&^cg-ԫՙlr[~8 ,dĤa$}`q0jRNv|0*sА͹2Br_ ̌Z4݅8V$NOS0e†X'-. :l!a-l7 q'bT6^h*E34}3(m%KUr48a%b.3 3Qy΢ `SY]?(S,`|#G  DO=EU;s]d"6Q}w  %x{}skEFtZB0v0N+ "|'utNT(}JS$$h[TG\ø>,!t[#Uq.й>E{]TPoU E?\;'>IZ¢22[/>{@S Y =")-ur+H=U2&Uۤ o#>#BJkbRMnuUb<U; haz<Xq77j[7׺#lWQr!~p_IN1kNNb14X*7#F]qeMtuR?NuQT?/wEzk}~~=k pCk!W(/KK/0 7.ie4{<;>#IstII}1&0|eT}~c}h6AJS?p5y|s]I}ZI(c."|SI,# sWJdl&_AIkJxK@KwIynq_X-s[_zsj.89s=26Wc3;isZ0hxST[MKXF7o/;b -m>HMW?3&t_l.K2cz%_+0g /T,Q03jZ"(.۴e8Nd?%L >|~,TBt{btͧ99xzb#5j\ٮ4oC6A.KwVv=XO=| cFF0@E(F@.19i9}x` 8k$XYZz/ۨ[O 4]I1Wxf9ZL?rnI{WGJ~cW+xE·n!R05_:#K\i{[]D8xV6hc!Al6%y)FdqT|%wu c;X&$t9 !)}l]*q-#yTmB1*Q^:3}A{vT-?0Yq416FHb,g6iD7RV0З5#o6!oS=tek^ 4'GfnyE7Q<sLE.DbK][-v  Է!.l<, FUKI|)zGMnA9:r~%:$Yo'l#9^s%oϨtRyCv4zv20 29.j) SU[,W$ZMl7~vJ82fE:]H/ڞp%aVO[J?i ! ;pS7K)2+,ao}:dz2X{r=fsB.|:FdʃCXIV4;OnJX.ETn`&hX/'Rprv[[F w3ld3R;OaCx4&M*5LU ],,/\] xx~6gIۅ**\uuާg/']Fe+0KhZ5r\{t!|ua"42zܻ4#Vy8WJT)po\"O >.WYe5To jElJj[^YO\lNeQ+8~Y_;24WT/Y~%JHv?Rd~on{Q7j'rF_+5z+ M8Mr}Ar2#]߳w9"@=a;iY0?H"{O?csNN ^8vr+Yn39M>CW .4J.~siyxY@w7Y/{3pr.<zXڼPn;J{8!-i_{tNNz.)Q._'G8A9l3k/=q^GcFfcźQ . `4 Q[˯ m?G/6sZuj,QjB|{H7muo+-qhJ%mz::R_S%9<tfm)19`VFM zjhI#\U[FtOӅG%9Gq1 ":UV:J0mF9 D;f0WDYwe>="B=HZ/4qG4xG^::%I&َLA #>85 $lmkS<o)#a!,d. g)m`K1=h5F1[ n-5J7]r|L_u=q4E<M,T0Vi1M3lv [BbL\8ZdN~!&2LI,gUvX;+e`U%*n}kc-S D|v,n 9_^FwhS bo7t< ;4Xf7q*clvV}J2&9cs qk@^S?XOI95-Q0\%;j7Cw1p /p[WTz#E=6A1dr9{0+X`3SlW{A[*Y !rTթ|*K>C"jr_ [X! SN(Onk7Fd:?ED" w0'T",<A2;=u)b:y wXSސU5ũr2d_8z$>~ cp/4h;*F$\BQ.**;p{-.Y߳4zlpy:sf1^xlH6XtHN5|9J:)'9N2A]C]g=7Y. =0yg/OX4 rP-9P#"(8KK.v |~*n%D.8KW  F~U (2r|2~Ex[ ͉D>XQ5D,MLbRjh5Fd[7kibpT5D `Pyu;mT.v"3*L D s6I|"z)r]29sH rFχ`dVASi[(]KN+B*HcFX0 #4t:xk|*tX$WfQi3,I|E;~KS6iD%<9Jo ª  OajXuEnf5r?ΈV.EQ3&E!b!:/cxwm+@`0&q7k->{9!| peI;\{J_Q5~c/;;|zm5J[Q3$+|  l׎3jT{1[R ~p;u (GyMD(kP7qu3O߈:7.XFY(>Z<M)A'xK#`m\ywſDn-?*@ږD].fޯ#VgY-WvZ{LY2 B  \ i%(oFEc*iVWi~A~CUI-[G_ ~8F2CWȫ\^d׉$04՛ڡ AjP?\2G9\|ns:#' G,0SsZhu,8Y90cz:X[ ?4i׎}{H!r4'/LK]movaz 8 |jk.~Y0/dyP}q:z~CaF<¯^r0N.#@Sow7v.{h s{OZmzLzE+}.pSJG'Uh-u9R79M>ql ER{E\]$nr|o)p[9y@MPJcJ'oˏ3(dJv>InZ0iVMi==Pc&th+K8||}x%X\32!x*4z3j|:0|D:C[$@W4z:='UG0gخoG<9: {v_$U6Aw 6gA$?GW/pA/;+Dg|q;N Xi vYF2u4!uXCWtz =^88[fxBo/wT"&. =kLAYc-m1 G.̃p$mX5JJQ`L%v3/՜q61{\&%)(~wgUZ-!Zui9qgz;jjNb?j QSt+K oUX>  ֔-'5 ]|[82&1٪(wb}v>.ڨ1qB8 N Rѧ70aN)6  *^7/u[ 6C]2e{(m/uCsF9POXwc^V "w%HL;Ǧ8 GS}M2P:CU D,}[di\4INI"|KK.ÿzoeiZU:IY!}z# MЯn3`0FiY7MK _C"`^a%PlRH[>SV}I=Wm'9-l:}lfnyZ 9zs/<5e"M9ry2Y7IfsLWq&0 b&[M/c  3m{føPW 5ԃKf %GJHaĶ8vmfs-tools/.git/objects/c3/0000755000000000000000000000000011733374416012665 5ustar vmfs-tools/.git/objects/c3/18758ee1c90daf2cb697a216e0e895ae0bd45e0000444000000000000000000000016711733374416020171 0ustar x+)JMU04d040031QMLK-.fPvU?˞cW*+M+M+-NKfRx su§ňA թ&j/6/@"0:vmfs-tools/.git/objects/f4/0000755000000000000000000000000011733551143012663 5ustar vmfs-tools/.git/objects/f4/f33b4fb002339c23493e50178f714ee7e2b0930000444000000000000000000000017411733551143017572 0ustar x+)JMU04d040031QH+N+M++(a(2as;odTn{8N 071/3-D/7!Qf_ܬͤ3JlTȨx kz2JL9gbC0vmfs-tools/.git/objects/7a/0000755000000000000000000000000011733412720012656 5ustar vmfs-tools/.git/objects/7a/241f6761ae6201959287f84fe982876c0499df0000444000000000000000000000031311733412720017473 0ustar xڕMj@ F)ˢ`F,!fFcZL}CK{k.HLйoq1pяwPKنo$XIvmfs-tools/.git/objects/df/0000755000000000000000000000000011733555634012754 5ustar vmfs-tools/.git/objects/df/4405629091f29efad7f27e29695d620d6607a00000444000000000000000000000110411733555634017617 0ustar x+)JMU031b040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 kw2aS/!Y1?,T_+U 1b  ijY WG_WS\׾MA0GmP!. ??/o[guӯVʛ*$eT.a߶UcmϬ 䫃WP!vL^'h׶U&@u`;jjtGK 4,7;(wUOQ|DMZqrX͗({=a2DMfnbzjkWe ;X/i.\QT°g:džZN.$;]t l1kI }z|Pe3KwYKW 艜P5%9ŠY°gwY[S8&5iũ V<3x6 @RS/yw]=I5K˯^[Bvmfs-tools/.git/objects/23/0000755000000000000000000000000011733536556012611 5ustar vmfs-tools/.git/objects/23/caccb7a5585fb57cc90a2060b9fbf9f4e704400000444000000000000000000000013011733536556020152 0ustar x+)JMU07e040031QMLO-Kf(аʙ_sL UZ\pbIS÷L_۷RUr!vmfs-tools/.git/objects/23/8022d6a01a6a1d60a7ba3c83b5894c053b8fbe0000444000000000000000000000150111733535574017772 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9h-ŏ[ݱ3sט2*l_IMxaaVz|;ԲTBWeW7nb;}w+" >fMy9v< R̤%c?}q%{ F u| x (#$b,2 )2& |#|bnlpnǢ[H2gS(9O:(Ml`Kxf2pa $ ܔ4 bZFuidS=1Z4Gh & Y` _c=CntӹiQ<.F' ϸ{9wЅaaax??a|$}f'gQ=$ D4S'"ڐ`@>4~鼼̢@ :@'&zgyA6E)I:d>I}IL<--NYB, Q*)0ie_e>(E\1,lcJ5ãTKce3_>h>9v_-M[4 IGg4YZj[J0`'A?yRÞW/ߛGz_rTU_:qjidiAi԰b"Uۥ-ePL]:Z=W khÆDݸ 6nqWn2{ L`nnz_sqŞ ͝2͂bdi&#ML?JRIR7<\:SQb?!?ʰ^Q |)JqeJt>XMliH@1"\\\ 7CW6N7IOe$VGd-ڙˢI@$xwMtS<}* &9yt<̗žv?\n]ڹ|{$mFmw3 ~կM7D!ʰ:f&/o*4*J!K],]|dY$:%$OblE;l(jƊ$Rժm[W|n\Q9/ʢF_U>omu41R򖕤d#rkCdjUPɖ}UZ97 YKġbv<4`Y|Wr\-E . |BMV]]I#k[Ǐ,ew:;3X"XopSf <*ϫtLL\j< .eL> jX(Qd䫧k[E`YZ 8S3YBT+AR{u8hNڐ٣\vq.- _eZ#v\̤cZEOsu: EYUD>ѡv b"DTitZ\m`uz SAuE^d>2 /հE_mzv^GMHP"LDElMgoAE<_g]9\߳HuLⱄ2Iɦwޖp|2]=kUjP8܌B #<"X88^pP 98GG%~ ~B"Ҿ;S{WY>;-e%U4NTlˮQQ>rX4:Q:צ2X1pWٽo:]cVi-L$):ǟT*@vXMJƍ~C״XBhC o#!C7IӷY?︋`P6Ld^ }4wn'%۪7`QJ*toue2۫'{r3 M nU,Bvcc $3#I<.Hj||)3* ՜ Gq,ǜ6sGKvq*kSkwՆ@O5BwV}yc3fr*|Q,dIf'1B?5fl2vwUŲvJ1<.X%ɵ[Xle:]]1_s  wT>A'LōˀAqjPH>[TGAq髿_ŊFoCtpjÂH}Q;m/mۖY~EZZzvmfs-tools/.git/objects/21/0000755000000000000000000000000011733536625012604 5ustar vmfs-tools/.git/objects/21/22eb23ea777600b805d22bef2b77902944037e0000444000000000000000000000013011733536625017500 0ustar x+)JMU07e040031QMLO-Kfx4z쳋.\r 95&71/3-D/7 棙 jooīT!wvmfs-tools/.git/objects/a3/0000755000000000000000000000000011733543674012667 5ustar vmfs-tools/.git/objects/a3/8e31b0fedf51b632a088b0195a54fcf365f1100000444000000000000000000000026111733543674020002 0ustar xڕMN0@a>b Ği-pR9=}+nmH!g4狵:RŇœB!Ƣ.y6RDDK16,fVv8/Wxm7-e7<ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lOÔW}*vCנ*I-.Mg;2M~G:95jJK2sA^°gwY[S8&5iũ %J]m"/&,rS8&ޝ/e` vmfs-tools/.git/objects/ad/0000755000000000000000000000000011733555434012745 5ustar vmfs-tools/.git/objects/ad/bbab9493e177b9cae8a23ef99819789f67c71d0000444000000000000000000000355211733555434020231 0ustar xڝX{sFOqc] R6MTc ;jd 9miLmݻ;3u{}IO6zF2qDA7qQ< ,Kgr9pGAfa(/, an0 ›E&"t("teO^n-2˒ I,l8 a@x'07hԧz?"ͧs؝2C}AF7$"gʟ0\F.Q|⿲E#qa Ŀ 8X'QRR jĀCxgsHOAmxѡgF '|`0 ~0,yHS/c"rc[a C±<&Ӎ`r~ەZa8>fm,%ؠl҇pV<¥?J@RRDc" 3f"&C".BcdMt3]^ XLB%n"+<>Fϋ`&ӆc:X_&s+wbz….wb=-A~TDp.I!{>|HÍnbd 5' ͳW~`  g YSi׼!~I674J]Ѷ 7>2O+hRGjtji`S2R Ƀh'P`f87)`\oa;ZM0Č+SoԸ@ט;5)uHtѰ o),)YhnYJbuX'2?߷cXMbtT NV@ Ox]r=~3|oP{o1I*!G@޿:`yR9GU: %LŦjČ>i0?;ws p#Hŕ&0rJ|`щ>,MA5S5t-Q9ɸ>l& Yr"? Z}&<+iYFfY*%!({'OXފewcͳƭ#ͨn(?.ĥ!o@PS )9JD[~5ѼReY nJ<|lu*,bħ LkCF ̉S`E0 |?԰}(Ŕ>LeŅ?]żVBҋ1z.~0 WI#K6]MnVހO+=ǯQKAGկAyX [,ɟ{=>L4p焊>!UOS~P 72{hV/"%k3vmfs-tools/.git/objects/ad/fec0c75b32ce2da75156b8e4037359c37d4dbe0000444000000000000000000000332711733376453020245 0ustar xXmo8Vڃ*[(]K۫hQ^W'EIpj#)K~mTgy^2 H?&2[4@YtģdbiE֣/a4:!# (| zuC[Kx C!8tJ!Rd.Z19~3_@?~%Wٮ]RY~Ы6sĘ.0!JT z$FT-ݺFW2 ")9ߊ[f{s7;F;W#spX2ݶ)+-uդ9RvhƼ+e/o 'ۼF'ӣjP.5nDIoW_-m/B{P,9R/Y 7ݻ5Ԍ jFgF*|`6հ3VC],֪*ۼ7,E[RNK4<̂O>[`"V~$tgY+29b%+|jʠ-;;lʒmXd}~B<|٫ #KD-֍l?3we{ػ2iM{\i/{'3SaT̕}VvE ˕]94m[Wvf~=j=o}^ de VURڶַ1F!y'(4Xz` V|=V/߱ lcа4>*R^5C"{Źg5\ggVHW&xf'qLY ~e71 kƥ$vmfs-tools/.git/objects/ad/cfea9ad65bc37a3b92a755dad51284f55d77be0000444000000000000000000000465411733551143020407 0ustar xڥY{SH W!2^.]CuP~d7R*YsƗ_#?(,ݿ&n0?7NV?ڃ#XxNT #`Z"r]y\Uȧ 6?맍s 7 νٯSmx ^"51x0脌A8 ,ӇIb<dTB;+ko^#|YhpL\nA[̏(Va"Et:@'@f_} FN3)ChfL̉5ゴJ/xς9Z4Ch㒻.L$sW'~>ߎGZA?,l$+]ѮOnڃHҺht~{8Zp^kw׆`'0x9t*ͅ?j] !€x~V/O(d/I߹o]>26T֢欴t2Ӷ<6;P4he~c?.8a1Ŵuctԃ%c͌ecYe<̹1C1,4b8]zbX33ĩ4Sb!9" .)qqPGӟ0H"?4uiE3߻c=̏śu?qhJAD O6Aߝacd zIGdKX{N$|}5XƊsmհNQEp!q47 CB11Z paLpUG Z@;T~ 4t @;h!rxEIĂ#0$!/p 4d{x(,I0S9+! hT?K V4ɔU*C'Xm(8Ly/D^Rq j~, +ߵ鿍e0J>H2 504]1+8@91~XjRKխ9?ev=c#"Zv 3Ml@mVYMnʧFkvd nCꟲؐLs"iq$X^2G[6q8d %e$~5Zʺ4/s0}( 4ؖ ,ϛ~& EXMP+ 4]]& g6`Ao$t&%by-T WPJsn[QUē9+ e(]:6U[U^CBQE߁61\'ﻇ6b܆~=vbpD䞪K69GeRPв`*l I=@mKQR5W*GmTv}f.Q:JfYyo51S&ob?n5e2{- !R%Uډ;MF^8]KCS1ۜ>lmÇ8(%lq蒝Br{XY)bH5058*9ʤŒd0 UJnPR;gxâI_Ե"אe'TTDũRg6&B1Hvі7.4RӉcf^8udm kEC\3Hj;m:Tǯ6X'A|5 Ar`Ƴg5]p9E)pJbGCn\ЉZvҪdQIJqA7ha@{%zdMh+bZE2C31|2W/o^T˪UT0INòx~tkF7'EK96vl:|@eSo&s]έq ۣ"Z>9&11j_4{CMDR9ۮshT4$%v8GD rok!y4#k˛k* ƛwBT}JКLk߻,%ӚMcjR$899%SB6Dl>dС~GXkCMdvbf颶t܂zbߦsaxV8I 5Ce׭Yf>%3i=2[UjrD7Z%8FZGP>`^ެ'Q*7- {;2:noTUS=3O[ *Rᇨhsvmfs-tools/.git/objects/6f/0000755000000000000000000000000011733412720012662 5ustar vmfs-tools/.git/objects/6f/ba1af6c09cfed7b3863a3aa6f33ce867c8adff0000444000000000000000000000032511733375666020560 0ustar xڕ1N0Es H3cm%HڞV6 ނ}/۲nMU h8fMDk J#xϼ &ΜeC92D0!tr`%:uЁU)V- Ӑ/jH6i:ulnۧcmHւoqxy3ju_]k~&i/1u~N\vmfs-tools/.git/objects/6f/a5fb9a7f3ec11cf0fee2a72b5fcf4acb7e8e470000444000000000000000000000025411733412720020616 0ustar xڍ;0EQjbz$46JQPxH"){,X8Ļ"sSSҜb3/nd)eϳ-:Jvmfs-tools/.git/objects/b7/0000755000000000000000000000000011733555434012671 5ustar vmfs-tools/.git/objects/b7/9697526d1cfdde1625413c0ee7a5c04a1d53a80000444000000000000000000000110311733555434020011 0ustar x+)JMU031b040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 kw2aS/!Y1?,T_+U 1b  ijY WG_WS\׾MA0GmP!. ??/o[guӯVʛ*$eT.a߶UcmϬ 䫃WP!vL^'h׶U&@T݂paߗ\Z;4,7;(wUOQ|DMZqrX͗({=jNfnbzjkWe ;X/i.\QT°g:džZN.$;]t l1kI }z|Pe3KwYKW 艜P5%9ŠY°gwY[S8&5iũ V<3x6 @RS/yw]=I5K˯^6vmfs-tools/.git/objects/b7/b7d1471f52ae809066c4fc810b8317f6d7fb3e0000444000000000000000000000033511733410134020014 0ustar xڕAn }eQFJtCx D7Ks{CK-@3+%W8NְF "JV+1-*pzr~Dgmϒe;{5 g;?pDz43岼DTB 3aw[6]C-hBx@HB~H YrKߌ3mG dyvmfs-tools/.git/objects/38/0000755000000000000000000000000011733376360012612 5ustar vmfs-tools/.git/objects/38/d4048024d19847400442330effb4c929c6a4860000444000000000000000000000104711733376360017365 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lO*uM7WK~0 ꯒt~c)w:k*=S$3- {Ϝ}vyٿ?>ClYVZpXI:ۦ/{b:+qHjrr,'/?cbl]R_tvmfs-tools/.git/objects/41/0000755000000000000000000000000011733376055012605 5ustar vmfs-tools/.git/objects/41/4850b2c4cbf73b9c3a4e1eaf66299f65153b3e0000444000000000000000000000026011733376055020020 0ustar xڍ1n0 3 HStdrGv*C NjOw3(SRE .,ʓOVC{m(g)HXKX)qYg~Ԯ-hm`,q^J,NMh{<AGvmfs-tools/.git/objects/c6/0000755000000000000000000000000011733551143012662 5ustar vmfs-tools/.git/objects/c6/04d693c71c8ecc672e507febcbad169f2cd54f0000444000000000000000000000150411733551143020322 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9heOCX .)^:qA% +{Z?co}ԲTBWeW7nbilN~;CVqI8Lu "8yOd~lJMMُO57NU~O2N{E~g6EG M-ILI,I(9+JiN?}>~UiN m7'ic:)6 +-)y+8SݦąM+s&Ǣ03D)]n`w:Mͥvmfs-tools/.git/objects/40/0000755000000000000000000000000011733412720012572 5ustar vmfs-tools/.git/objects/40/adbe6f02ea4cfe88cf9c6dd7e2bd4d3f693be80000444000000000000000000000026111733412720020544 0ustar x+)JMU047c040031QHHKOOg\#j{r?DZǫ̘y`;LQ~nAb C}?vKnN\E^IQ~ٙy'*P.e<{ey&ʢ}kzN]O#/kVWU*3y,8^//v}j־3F J vmfs-tools/.git/objects/40/05003dc675247d339d3c4d2174562cabcf9fa60000444000000000000000000000041011733412720017630 0ustar xڍJ0`?xې[x@DF_ ݎ`,IooE 3?J!6K;mĄ3d.H.vtrᲥڤ6ˀ#Y=9_$A`-+9Wp錶Lv^ŹӽmOɍMUߒ[;)_fvmfs-tools/.git/objects/14/0000755000000000000000000000000011733551143012576 5ustar vmfs-tools/.git/objects/14/f750c61a67a76b2b8f1f3a69712572e7491ff60000444000000000000000000000026211733412720017605 0ustar xڕN1G6PQP!ϑ+{"~F3պp^FW].b٦haJ3*{{&bm/V9'QLYKJ*ʼn8ar``>.zUxD^t[Y:~>uDfdZD[4o{x@/m0)L~B Jvmfs-tools/.git/objects/14/f303c4424b973ff1a4a5c2af4e06859275355a0000444000000000000000000000321411733551143017565 0ustar xXmsH/)dvJ-!ء 𥜭+ ҌvfdB_$KX}8U*F~U֑Z۟mAJE^*k0?gKDX0R^Mh=Fƪ$p)HYx; =Π~3I1û8m14>SzCi*6ŀ?9Wث<&As9hN-azJC| Rs iZc*np%,t p`VL}Xg88, pY\s \ ,1נA{}zVc>a*ABDwXsH !ϓէ wyX 竻 §P"N"hf>!Ƌ'20NVwh\NVr pn.nwJ"Bv1NYr EJn2(3IRY ]hmk62$E9'BO"$v'cS'\.G\c}8 ߗg,Z|߯za; _QJp6ry z6\WHsW8G1 Ӓ3/H(Ҿ.^<g=a]"j+A6q7d7~nUgc+#%%|)=xўo;pH 2 n*R7ʟHjYב揪t[2MK[ DTAcu \٢n0oN25\QA`Et0:((Zt2L@qC>׵8ղNV @y7iDѭš4(^yXE kk-l5Uy-Ш9wh}5rfsf?Pϫ26>|i >ן`WN4MGwMrt-Cs| )'lmYGŽK/JolwlV#w6^ iNM+Ap:Ev% *α-TsCC,Ή;.pGR1y]9㐭s u\u'zXq*ǫR,qBaSx%dtk>S")",tץnh~t%Z̄ AyNEԈ(ZA*ZSҁyy!r tW‡vN[]2vi]!J֨b)0wfpO.ӛN̫x-ēDN/;JA"x+n xL!}3ny;My ]JX.Deg\nL]E$=!yXVVN#g XNݎo$}NHTUgpP6=*JÃLil(|>gQ-ʱ>IuJxLx*FYUTCksb?DiQ[[`7*~$F䥞Zf2p Cx!geK9o/[vmfs-tools/.git/objects/14/ecc2c4f12e3d16fc1a2187e0dd0a7f4813bf4d0000444000000000000000000000033611733411503020203 0ustar xڍKN `]ř901M1qEВw/޸9هވ@s!hN2I^Y- 65*Wͼ@>ZgCpr1h4g>F)}K^ߖݕ\ \Ja\MxpN+)B9F{[) Գ*Czz6_nv 6l86e!vmfs-tools/.git/objects/1d/0000755000000000000000000000000011733412720012653 5ustar vmfs-tools/.git/objects/1d/34fbcc08e7e41ef8eafc5669087c5aee54df140000444000000000000000000000026111733412720020323 0ustar x+)JMU047c040031QHHKOOgp`e=VRkvmfs-tools/.git/objects/71/0000755000000000000000000000000011733374416012607 5ustar vmfs-tools/.git/objects/71/31f59f6a861175348f7910580adf46eb2246c80000444000000000000000000000464211733374416017466 0ustar xڥY{SHBdm {,v H&9RȞCݯ{Fe) ˣw{?0CF3 v;,^ b" gˈO 58><Oa%_'-\0# |N>w&b6x\K>D% P8`΢q.#chBNHP%vR6_Z4ESd6.ØA3/Mb_`о}md[6gf>GhWdd/z+3Bfmz>> ;_1>1 ]sqrLc@Ll?-n.y Ąr:MIX,R5}$nB͝s}>0јkkqruI3VYڍ:ۘjT܇[pMbܓch:E"+SkN(|'=(EVL-gjGzN`9@P+bA8g$_b^1%>k;w` 4&pIЗjX.OFطDй[~uuqvlVf&"QDSMQǸM[3tB&n21O֞mIqav(Xq+Z)H,B1fQdnGt# F}C!WpKpWZL8L"^`beI`94{X`NB҈`[6!󴑛b{wx_y#R,Q0P+a 38~ Foě큡xҮZ%i$*˧8q'4Sq ˢĚcׂwi7 H"Ð(TCb8C#VD4㨖)GePHUG#Izf)C,TP9l ',z´ZI D^(re ;:#kw%"e+<m#P?UxՒ Uč:Ym/?8i)K U6Y ^xTLі~^+hX('z:eDhǖ*Dpq1WA~]r$DH$XA}C@(3YB lEFVGZ~*@m.VtU,+TV_TonTyKEiwK,]3wȭjF|t:Q3yq{wJJk\<ɣI9[@AO("IfƆg;KBUހmLSr&L~kdjS- )\'ډ;MN^:]K#31ޯ Q6mo{;$7σS0ޣK )^EFgMJ"X( *'c^)Q* eKqw8E1%ke ˫Rd+Xp$l o]Ye d̢q@ބEC\ Hz;n*T/6%P'gaz1 5Ara&p ]p$9E) *bCn\0 F~Ϊ6ѧqA7ha@zTMqؒQ2WU2{mfgNj,3mןN38 U狔anUU!Rg:QMK˖X3:&uʺ2m<=7M;쌊斕C57tx>(//Ta]x+CW*C*Sv A`H5QȋU aVeqy!|acꠜVE 5aENWWtų`弌kE<7ѤirVf(5N"%ҒƢ$]jƋ-Ww (G:K [Hb4;Q ,G7 b vmfs-tools/.git/objects/e1/0000755000000000000000000000000011733410134012651 5ustar vmfs-tools/.git/objects/e1/cba5d38c6545e2522c7389556529fdacc68fd40000444000000000000000000000322711733410134020031 0ustar xXo6@MҤh$ vbIib ɔMD tg%b9-EwN$@Ç?T`C_QB@O+1)uLNb$s1|0TP=p>Tb4dA xv?0a&pNI+ِYo%b1O?f ؉LDA>np'bEgIg1(dXJqqs,b=I'rjh+-"2qGh (b] N pt y}F4DHqA"Ad]~snwP({d)GGd+v"5Ap_Ii1h{7M˂m`ֻ]kZ){\N> G1. 68-NcC$dhoo<h/HA)ګ>>ܞ_ٗWGlaeo=$c%֊ҀM0{fӾioo JXfZV)h'GTCœ[e &hFqe5EWun#j`n#SOu]6Vك԰^r ];K#ڝN @II>ʜjNZYW_]K/*v<u>i7t}ΒTu5V8-W"8W1 8yt7DqaK:n0Au;~EoR!DC7")wbT;@wf> cjbͱ$Ԙe݉xp"+|uZ맽ϙct:f?cc&@[J]H+=0t+~; :7ZZ1^zx3[N/zզAb^?D*JQARȶtm-FW+iyjI4OĊr1'uj1׹Y,;zwf.6Z]Ө64 SJ'JMVF+QJ; TH5 xrtp=&Uem6wf׽ɬPV ܗsyL9n7V6 *)͑& g1\T' (l^hzƬ22e:3K,3sKW :3ՙIgfImM:3Wg tf@gfg]¹HioZs 3XlZ֭VԖ erc夶a.ImC9-EWv(ml`R wKx$AQؙ=ܛXF/>4l5A p\;h* 3fӢZ#;][arT"`A>ݒee]jP#i6ݗ W=CNᰟ_سy[8כP/ |47#=Yr|utۦHK.({.[hkO?MbehJmq1inFQJ ~f,C>q(NF/`QFSuElpL&?ד\SEY,n kK*vmfs-tools/.git/objects/e1/b4db8117c73bffefaa4741895dc5344371eaeb0000444000000000000000000000505011733376054020237 0ustar xZmo8.%N^$vkl^"Ee&*%%=~͐ԛ-vq-lSp^y8C{ ;C?9N8zMǒ~KI„\x!luՆI*9>G!K_^Ys˿2,-c8aєgቐ3ZCs@,L![_2WxnMq{'Yʀ:BB(_ˢ))aW>='10&{,J5$s6C+}ݔg& =@$!DLڨ7-1r W7>> G\'OS 1[! ǀfJ[\`C$R y:Y:t.HNs$Pazk[dSS.NOcLheliltE.f)pmeFHO, OC7(,D,JgaSBOe *5X+߽wPxS:&CzmtE'8Wt.o~tOÞͭ|rHC"\*Q[=치q5yNy6Nϖ3R{VK %K 7Oܯ.m(o7`ހbݍbh_F{6t$ w0nq}7tكH`nvs+mns$K3Yﴸojgf)NVBLiE95ĤX !DWzENPgOQ$+Um jbKC?U"X*hE,EwIJU,#ɶ>귄%@ l|^Mrpn$6.5̓N$fA0_ {WHh0rݻq7Owk=X̷u ƷݡTg4>WW 4T(}+M%_OhUv)BX>Ȳ*HhuJI8".wivn] PԌI\U%2g;\5 r^2=EX}hc<-+IFG^6dء-rn;Cq'f6W*Nqpsm66!5R G\i[p][v.FO$I%Ơۻ|=l]yu\u@.!G}C2 ^72E e4/ 2 p2_"f6> }e,^$ٝa*25ڞٛ2?E@W44'ނxڍ5κ:(sL.S[g:E'Lⱄ2Iɦwޖp|2]=kUjP8܌B #,"X88^pP 8GG%~ ~B"Ҿ{b/%2II }vZʪKh**<ٴ]B|[ 5it&tMe2:bJuc{54u f%<) -By̙"Klr\dSKid'Kd7w%b&uJ8Od[:F;)ˬ?.dW9U)NN%g&@8ݪYR76@HfFxD?]RfUڛ9c*X9mՏTbqЧZ j>cy(DvKf:QU.pXHO",k ɒ,H Nzc#ą~j͞ۿ!d9\W.}慠eCMgjby\±JkرtbO:=(Ob婟|64O??_ՠ|#ZөW3A߆JpQ-[*-Նgv^÷-N ,vmfs-tools/.git/objects/74/0000755000000000000000000000000011733412720012601 5ustar vmfs-tools/.git/objects/74/aac0fd22e8d579eeb936e20143426e0958516d0000444000000000000000000000044111733412720017655 0ustar xmKO@F]ϯKX#JKJ>2Pe5'_NN)(vUGb Y5u&QW#OҘb?Q*_VuYfNXDV=*ɒ|'Q*dGx(OiUmKnG(S[(%ľXVWl\ĥZˡF?Nb6\J S$ARv4fri)h{$&4ɦd/pG".,KJM*#AҲ$?="1KhXVtQ,,l^OvvI+,Srƒ$~A\{;{-MXG0K4b +f8^YI"c\PJ,"ْAJ  .+JXE0+"Xx2hA* Ţ$Y_~|wC~)-\, 9 iZRӈL9q4\IYeO(Ӣw֐} * Y@#I:~ˈg9h(a 2dYx/7oѻ䗣ˣwF\3TbĥP-s`!\BqLlJT <.(3a*'{ӌ2]N4h?NN'ގOOo87 sfmFE<0E [Gфy;d6QAUmXo<;{QkCN'FO|s4950I _dRIزK' ?L8S={@tVMb=v3b|ꈽxf{!I}zl+QQ|fH$ ;9/v6'Dk^dE8gV3 b}(?;I@1T9'$t 3ZM =8- 8e+YޏXe!s:AHh^ V03Z!ޟq+̵I{_4( w,0n&F|*} Hp(Gke 8V ;庖&4*Mm[ iD@>7A9!nBPPr)09LE<;gKz2Cm쌥^֎Fk u 5ּr/e]3.;*CxVұ*ђҨ0`^}nG~i8Em*8Дk7r =AdqXrT~br{$rN(3OQq~Uɖ;ۺD-1B"0:HWDG7J-NѢϧ(믚"8NVWu("0KŒ:Й7Uз#Bug9̇T E2$cI2CorӐKjJ)2Uo7&X*iтϊtaծ6I#UͩXPeMr @Ad} A8FXd"l]j!,y:*[m, 䑔B#3X&Ss#i"aU'ɂV𻂄&nGM.o"kVحUhs„CeqeeܝmpfQ TY=Gfg`'6[c} g406Q-Yg1J@ o+嬛vSc͖6zz7P,gj-&!5*Ԝ*ቯ*n[e Pi@l뎹?Ѝ''pּ̣_T8 *<Np$x Vd <@ۖ5N/ijx Cvc0D8D˩>s-ꬫP]ay@lI9 Dݴ~a_Lkbh>񞴽)U\S(IG gQ.12<& Ie%:p! $\7E]2T*msէ]uݕeC7*dqw:̚zV߬2̌ J3!x t%3XT)81 89˻e {fm.(8],3/ZXG=Z'e=hɺ٪/n]Vƅ({ f%K˿VkjȐLybDo@5&y]Bgʴck*׋PM Iу,XAB<5 T$ʖؑRLY#qPx*$?h-FHwrkǾ׺eʥT6ֈfp|ƩrVp @C!'Ƒs}Gm]*yK6`s&%,*#retLy_;7~oݞycþ[=l¸VSb uztU Vg>A?ga) yn,位"Mmҳp%G7TlثǴ > 'g!ȩ@:zERbʻ(x+1,:,Ɨ$G GF=>٫m%gֺ 5|AxQWuQF[oܽżQ7i0D4h#Om'gGSEYzy5;N\n̩XWlyu]z?~U:` Z<汳oN*Sk:pvƑ;p.Ζ7qQki{Ͷy86Ihs:'Um$6641WE{Vlr\l\:.4Uvmfs-tools/.git/objects/3f/13362169a88e3ed77e0a17554c208c995dd6a00000444000000000000000000000031611733536625017613 0ustar xڅN a\ٛ~ &Ƹ2nZR`%ހs >JFxV򉸒F%lr1D=;}u Z5 )OZ[_KS缾.?閟J]^@Hj,u*%(d)hcj+жtXj^/Uvmfs-tools/.git/objects/a8/0000755000000000000000000000000011733374416012670 5ustar vmfs-tools/.git/objects/a8/aa469a0be6b6a884560575e43dcdee0c6629d50000444000000000000000000000023011733374416020103 0ustar x+)JMU04`040031QHIM*M/M+KfXgw*V`Tzd%0T0pzL&_֪w+A&ef3:RCw[?[ UVX 6ݖ'_PfՕWtͬU<vmfs-tools/.git/objects/51/0000755000000000000000000000000011733535574012611 5ustar vmfs-tools/.git/objects/51/e72318e819e89e61e519d1f3e714d7fe4a7d030000444000000000000000000000037611733535574017716 0ustar xڅN0 EY+Fi&4BcÊ1j]=kvαjΑ;ZB ȭ#N<.Hzbb!\*Db ]lQJ#* 3;-uxFxkK Ǽ| F=hxs~#{!G՘_:MJWhAXPb!a;62t2t5ۚy"lR7@,B)կ6MZL';A7f[p`ߛpvmfs-tools/.git/objects/51/e708a66ee7c677fa4e462a3acb476f70d7d6c20000444000000000000000000000105011733411503020075 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lu .}*CUZ\w,e>Vg-]%t'rj@ՔdaV?/=ӧpM ktJSK=<ɻ^gEb^L]}%IMNY.qL;_+e)vmfs-tools/.git/objects/7b/0000755000000000000000000000000011733410505012656 5ustar vmfs-tools/.git/objects/7b/3e75d7a1dd4105660976753b64bdef34c4319b0000444000000000000000000000541511733410505017661 0ustar xY{s8)PwڳSI&ufmn<8i/v4zPzxD*i~IYۛ9׍% (uoGp.HӈHv]9L#`1'^:@@׀WGGA/B.y`FQ* gx. 8f&~ fCl 0̎/1/Ck'1B' B(0 N 98'@e1ԗ7o%,#ʝ(ta, lFx$hy1?>m1/ XvS+dr @F#kZ?\j-qZܯ-DJtխ͝5D%"H iU(u?.Kc0Hw?%$`X͐ /8fx9>vN7K{_\S~GxІ:ϖhH[&,iɩqR0hk%&f9rڒ x4."6]'J`r+ a?T2af˳1izןwGL6EܩJ٦´$q eZ6 Yb"疋ITw8\Y̐0fUiq()\niVo:JjpQHV#Jub5/~pK?J42b .At d+`jGabse?MnvV#.9HiYQ3@V<8ņo7N{,ꮳXl< .,b/|W{?ht|&QʱFxa{QeL\؜mkd%+O$ hp!\~ïTbQ-xNvBRDBc: 9l [ٕgmv&Fgam-M>@[tkp$/cv8L3^ZHi2f\ل (ndjCԲ:-wXVb4k~z,кGL'Hji~ 5:V<ta I'J:fbkWD[tD/?#vfЭ0O?}20o_x1ߜmM1,+$ci*(:k//$m/CeBX{?d.XcJQ[}MR30\h.BH O8K.ȫwJqr6d 12[r%uȰ(ҍ@D_@3iRQ"딮9V),y`9 ^G6=0ThQI&?)[sP_(- 𠍊uc?3W# ޤK:RлJ,tX%T{ 4*&=;A@.`(k[8ĨȷBXYɧN7"4s$'9r?({p`"ƧhQ8 eaQM&Rm'+7Z)L9xOY~)cJ ˺) ӛqRTAӣƌ2*-jVҁWE{;K+ z o"M/<4ֆZ5kyRe1'TҁsŴWT'6FN63|n>.:{zPy&k+vmfs-tools/.git/objects/7b/41aa27292cec1985f1832fab1b24d92be092460000444000000000000000000000150211733376360017726 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9h-ŏ[ݱ3sט2nT}ݩ?!Is#KI-LN*tZ{u&fɣ\5EafQj^ (g8񪇞ڕ{4`UaGXf0\m am +LI'k1͛\ZqV2]r;^bI3WbP"viӲ/d\uWR{ϡMQI.*_9+][GV{dEE%I 8沖{eRV[wav+6`Wg< Uץܰfb/7%G{Ww^K洫w>a(`'?/O(i%m5e姀KWOljY `.!*Mi;c6kxK{MۯV+nDW'Sӟ8l WrSKSK DΊySOb߄_Uƪ4aG _/oژpʺͽ&JsJsA^6RA&.t*+XfcQRmL~ .s7;& fvmfs-tools/.git/objects/7c/0000755000000000000000000000000011733411456012665 5ustar vmfs-tools/.git/objects/7c/e0156dfdfee96c50634bfea2d1c36568b108e90000444000000000000000000000023011733411456020160 0ustar xڕM 0@a9db~@ĥ1&3h[ [x,4vpvwUK`1$\sмA9:1$_cI~.9(ٳ?)pݢ /N gD.Xaє^Q?vmfs-tools/.git/objects/7d/0000755000000000000000000000000011733374416012672 5ustar vmfs-tools/.git/objects/7d/b544363582a69be9e068d15d472226ef0824ab0000444000000000000000000000501611733374416017612 0ustar xYkSR#5#)nR1T%LlI#cc,OL _ߜpa #Oi,M` .,LI/q??c0 v˸t-:Wq;xz-3r,lɂtHm),x!ज़0i[3apg`$Aoe;,rX=, S]q~<,buf #fQD4zKƀ|*`#8jy+xs qB 5 KҫwTmn~9KH`{g!$c,en4pvq5Ag|;Igm.6q A3rxpmO7ýsӫ{Gv9OM2Uۧljz{dL 75GƠ5Qܹ7]jy*UAh&*!ruLZ+eq( 0 MPfQZq8tFGku g&phenCXTNR= 6/?6 1 ©i+l+'$NxD593oJ!G䇈GÄ,;HD $ISZtȍPpKG\J ߏFw>'5qE(8riTNwa˔ǃ+ۙŬA3gmȯKp4zt X߼~Wxyy?K4UKKIlK"֐~X4͠(ù2 eeۋͷ>GҊ G9Uy5?j?8Aז^Tº*;g(Q Q;}:fVe  K."~?16@Y>ͥac.;Fj>iX6CVm͆z(eQr>75ь4re&(/QFn 6k{чK`UN &ZbdboE|_Tu(:aO(o!6RS+K ,.)z1kcί%XQ|k h$\'m:N@uyuN6Q)$` إban [V!/&Ѹ2=ݼ-jTo>C8Pמ!8,+<=M1>eOTc`Or2}ӿ$bO)7]&̹f/Dfʁe9rG#JP< o Fm0Iph's'Ĕ.|/|W)lA3pɂX c]KYέ?zE[KAxx\.KfxT Ta|Si!`hګ.V ^B~;_s݉KVҘQohe ,+_gȌ Lb*N_dm^pxM74*GBk]p{8ƖF6~ 6.EwK#QkD:X@[Wۡ" E駓/ؠL5R\ݚl2(fBv >+d\뇀Mm@rW^%~oɈu&҆xTzSCҨoAg0(v``YH? `9@zei%9e:qqrW͓"*nj=>zC01J)*\B}$8"-ī-'or k*+5Qh ZY#mpT1ibY"vkTgSp%3Sϰ2+i.: dٴUQ nʽCş`Z`-*^|lOr}C^2ZMmJBxd v]gG:;z2% ZUa=z]$.DB~DjЦP]ޢ{N˽xޛ#HH] jC?^hA}Zi,ӖD/G|1zeI_AVex+oQ aHp}J"K\/ŗ))vkhJvN٘nlŅjlŧOZmDHNLOĖOߣ)>ǹ#P)=IEրl`!Fj^ aҨ$qpv&ɽ{- *LNӛqZG+/U*}Y޴hUI{&+;2o-$B8)L+JzdMU߰6k;6,^HzkYQ΋WǩxWx=TX]aq:X=<A%Svmfs-tools/.git/objects/3d/0000755000000000000000000000000011733412720012655 5ustar vmfs-tools/.git/objects/3d/1e6cb9e0b90cedbbe9d29929668c5c865373080000444000000000000000000000030411733412720020034 0ustar xڕKN0DYڿ-!fņCәX$8HܞҫWn[&zfsp u0ddcQ*3:zL*EJ2GG6D8R;|/K?-5친K7z"F %H9s=C!@ڮoGZ〼@^2Uvmfs-tools/.git/objects/3d/4743164e8a4db08c07bb9787199e3aeebb38300000444000000000000000000000221111733412720017733 0ustar x+)JMU045`040031QK,L/JeXoJ?MSS14?(A)$v/˰VSOKĊ"A&fe2z:g%4{2>sX;=T_+U 1b  ijY WG_W/X6]F7LJ P!. isTwE3BJjRfbC O /4^DR!ܴbd̬;>`]i?J*JLu^Yv[g3c2TaQjbJrn д-ֳm*k+*mY=%4E JV>0]QNia8L1":]Q_܄.c*2*;t%sRݿ^2$3o-Q :ks=,@QYO?bV~H͝'UnZiq*Ф;ݽ'-;I_$в :/H7mJ>*f~7)Mp7j[q5 [azw0|n6i`kڻ ?+x>%|ً3˦67%!'[bvmfs-tools/.git/objects/f9/0000755000000000000000000000000011733412720012665 5ustar vmfs-tools/.git/objects/f9/24b4c0d0020361de2eed614b7d21de4c9652710000444000000000000000000000044411733412720017710 0ustar xm]S@F_^4 ,M6(bhMw RSz.s򟫋) 櫼IglʢEA3"g, \Pr1+?,At8ÃCr=R% ]⧇KL,{@B-,3y 0,,'+VKIF!eAIT`2 Wi@3R͒LSy1-qȧiNNs>Hq:LcX<,䰒!:e <#lt6"WԤ5ۯw(l ;ZK38))s,`1<}{t29b)}U,8þ2/-V>rM>xv h:%7rJnO'MnoJ{OB,' ~i"pmaqm!㐤pH(CZbǂI 2DL)ؔbIQJ Jӛ٨Cqh>X(}0,Kq `ZL60uXXON(q|ܮ27/CgR <1A&nLZA+zvdinl'x;>7ac, zdt˕%y^B y$>9]7&ǗK|yF2K!.E%g?:]v'Gs"  W8MYi[|2z !@ 04?"^5 #D ?R{Ty<qQ1cRe> dz ֤:9|{ң8OnS˂evV`6' 'K\,mʥrImDX RYWMJ(}"Xl3\2ܩoYҀ+؃ȣ?l"4巄p [vʈ T 31 ,Px2 jR.jd.Ux{{P~`KiMdu_rU "&ǤPv>I8۔ϿHz|{~r@VK'ECBdN"Es/xm$M![?WAd羗s8ښ*У@ |FBbU#:AOd0 *3+'2ܨV-q&X5} \Ɨ!k2T߾>?bLh1+ 4ͪPPZ,yA45#;`8y,HEf?rɆB`:䭴"JKZfzPVjMQ=}uMŸ+nKvIՔ"oV8>SЫj+14xesmЀr{wzu9عY)똬-OXLui=:A7UB[c"0YMq쑦4m")p0Y -d)tW2EƭMW㛎`ԕ<+SKRe*Tu뺙O4<\],b, #oѨ ˰X|_T[`i'|9p*-hͶEv;Y4[y[Ly7Q U;W[f ;Z+ȺV(ͩ[,x+ka$JY@%pJ5TKe9ך3  N{![Η~ i~v5 & 4:o] `G5rOޅYhN6Noz5p8vz N浒L޴v5dO4`goBdo%)&O`n t*G <:kpo=}x3 r _ $#]! L&4ΩHnEn[HHTk{qKpnxfZc]|vTElPafU#fWl X[v Zfu tKη^R? q b)p^qfhb-<Ȁ\fr8s&=kkRDLSü՘&7fs1)kO|t&䴰v|vXeTis>FJBxSz~x$6{԰o={xU0T J8&2Åizͥ'b"bWH.F˰;N\ֹpQkID-fI^Je ]> 42 * 4)0`ڜ QQ~Ǻ[ FxhBBꇏ~_oٕpL5BX@U;Ӓ c!'_e=9{56+P%;A)Me MP81H4fQn6kuv0zfjڔS4Fǫ}Аd> Wp)}Tm0 3%ʫ3\Y)ُč}Y4Nwk W]V0$>p56ή.Xz7Y1fU y"d-dQyPJ ISK9ھ֋g4/w\WA]50HsQ 6GQ/Q][)F@$ٱ*n~^?[kO o/}\gp,ɲXҿt'„7``kQ@GY`֡J^Ӭh! atu;[#-59mC/f)|Fí/Màhj\F` u+ićώf'y^"o9HJV~n)o}U:kȟ'}JWhrv>伬h%ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lϓS)O\_VYKA/@UZ\w,e>Vg-]%t'rj@ՔdaV?/=ӧpM ktJSK=<ɻ^gEb^L]}%IMNY.qL;_+vmfs-tools/.git/objects/4b/0000755000000000000000000000000011733551143012657 5ustar vmfs-tools/.git/objects/4b/52644da598d78168517ae377af95fb6873c7f80000444000000000000000000000023011733551143017635 0ustar x+)JMU04`040031QHIM*M/M+KfO3PaAQKzW~CYIE ѫ.d. !lzwTanb^fZjq^n6˵L"n/ R'ĢĤT}wot v#wsunwCvmfs-tools/.git/objects/4b/0fea489618d5b505c54585b697314b49af89930000444000000000000000000000044411733412720017544 0ustar xmn@Fe#0ȥMAXq708`6[|991ӌv۝ZS?t CV-ם' 7&{Gongrvmfs-tools/.git/objects/67/0000755000000000000000000000000011733412720012603 5ustar vmfs-tools/.git/objects/67/0ac9502ac8ec55610b5b9015576f89484c8b0a0000444000000000000000000000025111733412720017571 0ustar xڍ;0}e%(ihCD ܞq'͛KcD |o:lrl2dslb&EQ3+"yZیJRV%ɣۣk/I |?SqR(xBga/QJy[J lAE_Cvmfs-tools/.git/objects/49/0000755000000000000000000000000011733551143012606 5ustar vmfs-tools/.git/objects/49/f2ab4e7b48208e9f62f79f40796f1268082a5f0000444000000000000000000000530011733551143017626 0ustar xo۸y?:9'; .5.qYC([$$*[\o7%I23cC&Wpl1r x pΗț/m8vȋ_.\zݟaI3y=8C|A.X<`Gs&2 ݈1+VVĎ`" #7KO"5$tXy, b|y?,dm2=<1 IH`$$ƚM`GȢ0#BbX8/ DA\JP^%J@( 3I7 .ɇ ht:pXpeL!f+BF utANW= ɰ?Nt4]nt{3ߣ}b$;f#FnBbj˅eKV@Y~LyS|j2 >?vMvN(4z[%rV'ȩG7ve GEl6\۾|0dq)[[ΐ)g)[A+ cȑ4&ՋuMʟOEұ& F*f|̽!EP˸|gCFyz+.<. `RwsR`)=ԓsC|-n3#}S薍|)O%fJ}%1cWh j,b焣n%)}CT@[AXtͱ0ؚ"wIl劗\<"c*ӢKJSdBSC,4K^KYT_XVeQOI9D˳F^b&l*!rUSj}ZfȂؿ)?2r l`C7V;#WjHm 1LV$eer*RXjFfTJWӢZ8l'4Mm8GΫ %P9[&b4ߤeι8{8͒9A~p\Vr#oAO?ӧ;i{kftSaROm_gٯj?ۅl4f؇򠑑bܧ #%_y](E8ž"1S1ȼWZWeՁBLd^hh@+UVi(3Ȏ2DgPc)\"ssyv +t<{!ɗMk`̞Q%޿>mIjltq y\ o׀2{^VG^ g*,SQ\+EYbWX8$CWz0qfK}Bӏ"|_N&X3 9fLBb7&|WH\GO:-N gNU婷jiӡ -}QJ-tōi:RqR{o;6CfUlhJ˶XEj!5w{; //!%ir߿=?%ߒ_ɗxT]ܥC0qY!7 ͛Ԣ7;ի%y _t 7yurZ b]Hͻtu3rRΔ'"= C5gw6}dI,(힆.aoBG(Wfէv<<2zdwDG=&^s#F-E :IpexKU7W }2h kps=bHeD 8wY19obԠby!OJ!vJ=ZM@Б(,u?wity{,RzٿEVie~ +4\gn7 $W3@$&lՕ{U0>]țv/?WGƓAkά7)$hcg;;źRtyFFSy9U%!Y>C I:R W#)wNTUIvHbXayKDbʚgwu2,ghIkofYac::B{dk[(\ SA9Q>l!/ղ6bQ~vn-*(^?6I/,4ƺ`>9"ԭbJC-*![F1=MWE^vԆ7o$ej0N?TEdr_L/#do:UK6Y{x Ovmfs-tools/.git/objects/49/133775d98c2da941819e3630b65dcd5f9ba0510000444000000000000000000000025411733412720017603 0ustar xڍAJ1E]$J[ ҍޡ382iۈpkk f} F \|^Kɚ4 1I:&2j *sf2rSmvz_>Ao{thŮ󲵧^(p:IRG޻;ob?}}?e:.;&Gvmfs-tools/.git/objects/c0/0000755000000000000000000000000011733376453012665 5ustar vmfs-tools/.git/objects/c0/51a35ad1588fa993effab0d848882e93bf75630000444000000000000000000000105011733376453020043 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t l̎_.~xa^O'_%%z zR&cuUB'z"TMiIfN1 [9n9kҳk8} F78DiÓuM_$uW2XN^jغ߻ lvmfs-tools/.git/objects/26/0000755000000000000000000000000011733412720012576 5ustar vmfs-tools/.git/objects/26/8dccc3b274daab1354b937f0a954dc56f0fd5c0000444000000000000000000000101211733412720020214 0ustar x+)JMU057`040031QK,L/Je8t~2m{ťz_l]U SeX!CˠJBsS2sR +> Zy4w܀*tv ve*8!F}cx# WQ5< Uʰu{Kڷp)&^H-"ş!祗smwquҪ]@ysSSRJ؅>۶Ro 홵~|uPCr 9Ďɫ1dږtRR2nu~&X`ÆYv)03(X]jW?> QVV3c_{YLrDMfnbzj{/fT[3Hwska,(Lq\mu;T*[;QSIjq^fn:ޱoz;XtЉȩUSZS g>[ZN!6M+-Neؗ_i[o3a}^6L vmfs-tools/.git/objects/26/855f4a7c82a514f8d43fe3a65cd6c0c813e0860000444000000000000000000000503011733374416017746 0ustar xZo8+=\ 'Jv4:;[dLD%Q伇~3$^nl6E{~3C{ ;_a 9T cTy,I|d,L)XWmxzK"3 )|;Ś3+" >gMy93tl< R̤%c?}q% F K>R<$B1ZM%L >I7a6 7cQEִ& ##vS."L3y6ID,7%%εQnZ=Y~xhE͑$ ,a~D7×wOн?t.){f#eKQ@m3^n'T]o4ta}o0||ޏzOS 1,\0 fJZ\`C$Rty:YQuM$\@VI ^oG^MJN8_ԗ>1)mGEI1Kh\<%BZ!!?&<  "e( pt8 ۘ"D{*}`pM(UYEgRX>ăMkԶ-\Yҹ? {ֻt7mP$C`pFib9!\Zs8=[~BƀHKg0ݖR-w,t?NL$sjlr]zKw7~xZ+b;ݤPsp+1AJ _CA$0u6v 'Kw 'Y:~}S;59l,4Oq47M bϥZMQb?? >@Q l)Rqe 6>XMe@ڧj rB]FMTQQȰeD 7r8sC[wx7wIY&s+j8 W3MӤoVܳJ"!ǜy.5&MZ9V.LvzMLxsWbC7~ U qɶtF1ЌvRX.fa5Doh%t4PG P…N#y' x6uEjҔ+4fܐXxRH=2xE=K/Bٷ_`}=^'ڇA2`Gܱ6D"3n*C"pY1F UZ"u{G\-l1Q\PI}9B;U r\Mr^0*_-a]A$2K#'(2BR ;mD{Iц 7lFBnos~F3l 4rɼ 6OJUPs󧍣T= >˜?.hW9)NN%g&@8ݪYRW1@HfVxD?4RfU+9ǵ<洢W{W?XS]ÜZkl+QD4g5[&6h6ׁrb!] X %YR44<CIiS\W.msUͲvK1y\c$ײريtfw:= O7b䩟Ш|6t|O17V-UA!Gn#tSK_"T4r}*Em7XF⫟־m{I޶̩;2avvmfs-tools/.git/objects/72/0000755000000000000000000000000011733543674012614 5ustar vmfs-tools/.git/objects/72/f21f19dadef7e6e1f431bae1861929ff6f5cab0000444000000000000000000000616411733543674020345 0ustar xisHv?W 1[Sd'\TԲUiI&}nI-!0K.>k11ݽ[ІO;Y)t`$ei oN.BޥRxx0f`<3awlʃ4KfS'A&!MfϮNj_"ЃsN. n.:z'LW |̂ te';;IIsH ybeߦo9j= b7=0 Q3awzM1ēNq?l4[[`H#{ܤ9Yؠ(O_'sckV(D׺JcA𴏿K OcLo 9 Q㭢m*B:7 *u@uZ?h$ @VDYL(I7  ERu>$uܣ(}'!i$'d+ "ӄ{|-܃ԌlBIB3ނdXH8-!QͬfMI 7)")+W4cW1y 1258#kjvm4KҊ%E.ؖy?F}v_ĠsIHӝCt Ebɤdl^$Ψ&XlTF.*1ŭ_U"M̔HZ]9b-ԫԬXqk9 *B3wz>6-xPu*GMtzwpho~kOMqsJ}h)jTq[5|Sg k({: 7LR Y9Tgd;÷ܖ3KaA!F hppѨw{FJRn]#7 qfIfʍb'bHxc7Zs[w6Q{Qc rꞄSf/>  DZxm "e:1)iwjG)>Sw2)eҬ%p"J*p6AXl:ĪMJXŧ%*9ߋbmkTK L|/ă9˅7qy"joZTyk%$>EKRƟNDZ!R#Bt)PǿٙiqLbkZK{% slD %cma|0\WljuO|W⧵"zGxZDDI8tb2HwKzKd-j.ؿ-( =r@Q59PKO݌Ө9 4cTgO˄hUb5(py2r"kc[V Cs\}~uzJF}B06ފTج5zӗj dܦG׶q&#*bQ2f"OJ|MwpL>k,rfgtE5u}{L@>\=BQW@l :@,ɜPӖ1Ec8AX>I, TqrxrzƮ(,n}[ƭDYtʝȇ|M&u>{hPW|vϫ8O}i.ęm-]LMݳ@ :n{]oj?( YT|n^ЕBp9k'ݰ,;;v>d6l;'NUSk<3[s[cæޏV5ZOBPW}^JA)ʰT ["/V)>LLB**e ZvsҠt˺ )_4-d=8ǟUfu^#+^R:q"}{,rs-&)1*SjUSYqdP3> fOdCשAt l:BwW+鴕) ?6WmL[mMjdOl)f!Z|ZK޼{%vߗcS'mҙ%W[s)ne{I1)(;{*XE.NcAm;y\0.ל$Kō!gs/ajkNj{=bg2%bc ^ ԝ,I1TȄ5Q.2!6ՏIbv[Z& ~0)(A$>ϡF}isvN2Cman~H~E?anL]}F:es#XGhm4qNv}nx^4sONmX!K3QxDao~N]mp;U(<⩗io9ᾭ0`xSGƵt-ܳ_qTxYKI>6(ae/ϝ@Opa/^ѝbH<csƔZDפ98ǥ{CHz l@"0cYrGq R|I+=%HjH1tՕrJA "~WTLYpPQg9F7Mi7NC(,Դ$-CX]m"Бp튥:HUn\Nu@DӺ=YB,;|)y~Li{9 h()d-6U3fICŞOnQ# I&D}IoD٠ Aib3ULu C`s7YβwP`Ʉ !TSaU]/M3Ҩdw0bYK)ls 19N`1K[Pv<|l iFefBOw!f}FENu%mMZ [)Kf%?i-"ЬR:4(F8GyVYK369Tf[Z)m,\a:v?T @)oG@nk*VoUCz5;)02G v wwZZ b49C>7hu GA4jLJi ÷w3nJVHzQ /ojN$} ju3 HvgÒ{ AkPjk4a=`o) [T !wc`|+ZF=!*k#$Ivmfs-tools/.git/objects/4f/0000755000000000000000000000000011733551143012663 5ustar vmfs-tools/.git/objects/4f/b6eef8b1b0277b58e66c723bf051dcdaab0c3f0000444000000000000000000000023011733542455020361 0ustar x+)JMU04`040031QHIM*M/M+KfXgw*V`Tzd%0T0pzL&_֪w+A&ef3\$vҼW-,?۸}*+K,LLIY{CvgGܘ"G@7vmfs-tools/.git/objects/4f/19d5fb620ddd21bc88627c2179a577d5d3b3410000444000000000000000000000017511733551143017740 0ustar x+)JMU044g040031QMLK-.f._qesfJN5<TfnjPVS̰YעWYOZzP}PJ*Jzx(Lyho,o5ovmfs-tools/.git/objects/4f/26966094276be2725f08cd15be151419f3a2610000444000000000000000000000150211733375666017451 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9hZkWMRW/v6Lu T\>*}JPRR2S ]^8Yz o35GQYW 8{Nꡧvv XU{ k&o[ësCeF؁D 2sRIZLyWVp@偕" iyw܎Xxe{0eHbfڴlcݕsFSpWNJ֑߭YQFjbQIRj"ȳ3N^Ֆ:] f0,OAvqu)7,Y6dMlƝג9O28˓'J>E9wFbI~Mdey){RqbiD{C&Xka`JssS{^du9e@k%90nbʷUe0`ꉾ8''|zwŬԒĔĒDt7W>뤱*`Xvs˛6;ns Ҳ\Mķ-l ݹh ִYXf0yf(߂? N vmfs-tools/.git/objects/8c/0000755000000000000000000000000011733543147012671 5ustar vmfs-tools/.git/objects/8c/8859ba88213427b9c2ebd87669ae37b3fd73fe0000444000000000000000000000243411733412720020053 0ustar xm}4Y9A( 4K/Si Z2M# gyּ3VR& ۋT 2{yNR^ڴYմ9#sw1 <}'F#Q(Eb >z{~:ce\DGm ӣJX o}D{'-B(7^p1UWBX[2@]s/S/,񼇓HF@P(ʉP2[OqH4> 1ےG[ouub_9b$0EV g]T,w, PM*s 'T٘ :3ɱ*Wg.~s}Í IhymMB$'> #7)_* u.ԥ+;Gw{#X a Bxy..]I3R9 v}SXakiX JͿuإtG|iS7C3@5Hf%+fG{?6Ouy?vmfs-tools/.git/objects/8c/5e858b21f7479b68fd6253e50c3e10a03dee0e0000444000000000000000000000030011733543147020016 0ustar xڕN0@#UŎsBmP+%:6jӠ= 3듞ދ82Md d9 I3ʩO\ r0QQ(:C֣9R (x7܍4\4T֎V*v_kv _ڏ[^Mvmfs-tools/.git/objects/dd/0000755000000000000000000000000011733412720012736 5ustar vmfs-tools/.git/objects/dd/3c52f0f619612ad5fd85b4cf639078522c57db0000444000000000000000000000043111733412720020015 0ustar xm[O0}ڵ`1Ȁ+cV`ؿwy:9')ABU}XAj15t1'42HDXBAS$JSN_uYJԙ" kR3 8>ˏU"R}JǦoQ!֢ (w ]o f6\?;xUMkT3燽0g2$y磭9+,ckJц]n+wTOeV8ʲOy}OvŨX~nHY't}?o?bavmfs-tools/.git/objects/05/0000755000000000000000000000000011733554775012614 5ustar vmfs-tools/.git/objects/05/425c4d29afc9ed5592f96fc848cf0cc481e5b00000444000000000000000000000027611733412720020114 0ustar xڍN!D=}71,͐ыg=н;6,$VUŚ:|HУ-qL9 z6uƥ9w:y춊0xcOLP}2M)s*i Ld kQU[>jR$ 3y*eH3S6VTsvmfs-tools/.git/objects/05/960642284ef18954ab54e9b28ff1a47844955e0000444000000000000000000001146611733551143017474 0ustar xPKdGp9ߍ "ldēğ:N(%i<ΞxI?" p( 3Q8~FȐeJ˙(3yr}']}߄4VH9p֕Q G g'Hӻ"H׿:#[&7~}KnooRd6"S>> @*8BgM]BzcřGR`i-v'hoƑ{8AL(є?}hwֳ$&3$Qt{N~~nwzk bhF0x8ȘZ GajA ǃ`'1\%ƃdoEP8[&Qk <]] [5H/4ukn}u#sjOIQ9Yy8jX llE @8.}k4/1O~e`s`tploh!IM7 LU lNꂔ;o_~Mêp C?,lV3 r<'iEEp˟@zAQ8HBDVoϳpN߻G@RI{G'U9*r% ̯6䇋-/6Oj'z Np\-$@ˢoa7@;ħ5C)fK؞niN~GtMFsV|%tQ1_g$Ӿ;#|xT6zT>`\SČ2A#K0Wgk&8Njak50(mluƔVC#P]#9B1+z/b.P"wFyq]Z;PV`3J( ϖ0+x/0x Ds]H52?ޣ ԉ TjP~U{-Rj2u!& {5Ӗ v>x#T;O P[J!fi(±FFˆXY;ϵ\c얬犅`I-[,bо_:٭mq_Ҍu/RVwݝr+L2<Ȏ(f@8G_s`ҝcx"Nq"^pf,LIq49=?8<+r]_`: /j"=T)w\0W2:kH(4r5 ]*0J} KU˙/~:%e` 9IHjiA8S@Vvm5oz!` hɃ:1R M90{dpFWD*\GqZLӡ28Yl ǩ$t B^#ձ #3P ?>B7n'`@/.vM"p!fH,vm|y*`T:THzBlm9HyxE%MDLZr~ʬz{v=wfMA@EqF.S:?~59NB4Fֳv !dXHVr]U yTB7*'U~R[̐[:~PNYZzl-vK+f 4X[D< 42~A3h؃q*jJ( S$' 9CZ+ߜ#5IuOm%J%+a-\$OݎBzs~p,%vxx< Aȍ4A4=b&̈Ah]:S)emRkլw٬pKY0 >]5?*oSXՑ 1PHNT_;FӐ!;bLgngJ8:1aB]<#]UA?EucL%狡+5b˂&lejpZk̆tZlpDg|*Uf,熁+^'-& KD>''rد=-Ck+g@J_MGz0o!Y+3+y ;tzd1lVXd ,MsGC~d-4S +ӴSڞL "yh{{VFfq+]MKxP $'Gu'-d~]$rR8 )Pũ5{3MqXW c<#9&zN?VkX_>`}83POb3$ϝmu 3;`E%LU>AU|_~6NUKƒ1<Ò8x *=CZV:U{PϿt 錚f# UA< PԚ< ˒B]h-kG[ʼn"Wlq$U|qzzj:ՆE &){+Yt4<QX7-4Ƿ=WT@rk} M\mTjȫKe63't.0OK9RPpG Y3w>jvɳ_h 1 =r3YV@ܺSزnTU`Nn xwrbv˶!}2o*wφZ|nK8Puo 8#(߼b'BæMZ٤`F+^&TUHa]sj$,L2b<$\h_mE_0 WbPb(D4jofr+svи F<뷛5)3ƕpTɁO2F#SICX-W¹~+ 2`5m^ e7÷-ϒ+{)eVP$u\k*p=}׭ T<#y _[ n]*͈AKMҬS\h>" cN oj9Clʶ\B-DK)ߌL{ˏ=s?Kwn:!&,(&Q#iK soiUdkAVMiv@IUG0\E'ny+zHf6c<B=%e !+1x da Ox*OUfRXN-93<'^'.~$p^VSe\=I],5S5~vpW-:H+a͝miG`+?vzVO˲%`dsh]hȸ83)Ve7g_hAQ쇝_>,UIOrVm SFx[g0ֈVᭈ(>~z+))J&** Da= 8JioFu{˴#a GB'3_ am99g7lMY Z¬MQ-QVn8aƭv~{e^a\pI/N&ݶƷSBo}KW`akm Z((w .v;( ;o(ԏ&,h2S<]D` R\X1U[MkD :"vmfs-tools/.git/objects/05/e0bfa68f4a862b02e538be371b676c5da188b00000444000000000000000000000043211733554775020022 0ustar xm[O0}fAKgd0n!ۂo,4yNI|2!MI 1L njئe K-  ѫ Rȵ梃S+X *"*,0 oKmotm*J hT Ӱd2md8]1/A/ ND!!yMȒųȻnf5s5eD^HR0e9-~l_R-tT3؁e+4j"NA5 n2kQ̿ch 5P JzZ<ٍP^2L1 π(. (B8d1hi\'i=y#[] `"va"RN<[5DΥO<@ȸ+pǠM( 'bnujKW^og3!QQ}y$rcCŰgXIi-Nf2=Q7DM1,RIս_/WC-;:vUH-UƧi [5&8l P/q9I_;2YWe !JZ8qq21]Ӭd1B`H'X۲/!S=Jnbf>s(oymEuI =޳C+)PHiUv4(#rb+VHprJ?Pgx>Tpq MaWOwHU8E>s5Мn)a5161"yO@>N\! ٷk.C5Z\ɗ q>޶ Tthgu\>ikP_Xv{c"H1Cɡ8qo3mH~xY$xvB|N{ct9vmfs-tools/.git/objects/53/0000755000000000000000000000000011733412720012576 5ustar vmfs-tools/.git/objects/53/ca710f2e35ec741e2c34029222e3fa9e9bc59d0000444000000000000000000000031111733412720017775 0ustar xڕj0{W-YiW/(^+kvJҐ}fc.UA9$dV[ .HVFSD]v%#c"K+o a? r0C!? {1Gp 7t7q/#߁N66:v\rs} \0!F[<_V{0!'xo!|ӲV~\/d0Ey m?qD,ߛ-NJcc,B^YcabE]/ kfŨ$t!m/t.H0SZ5S7T6c!c[ jn}n@ mјp 6㮱Ck1D! o//9Q\QؖOV>"/8:X(S$STx|%S)^JQ,e3ƴYjlev"Hk De*텅αBX(I#ToRz02$c{9hBt~1L{(|VJёraY03P/Ss^-BOj]ݭ2ͽ@"DU r;uΡ QH菔ͦeo:'UI B1n @^x1rsrs?L=fC9([%kI ek"P8?k(-vs,0,eEj%=%=j(’TE3> M89uW*bd?'FYVN#/1r6 S!rq pS@-~d:otqCԐ(bZITkmTL7Ԍ̨4NAY;EL[-p 1OiEqW^!HK\s22MhJz1sQ qq#wN6K#Ç%v5vrYb 8۽ENMI= ].Ϧt/Ԇۅl4z؃򠑑bܧ #%_ym(E8ž"1S1ʼ[ZWeՁBLd^hh@+UVi(3Ȏ2DgPc)a)=*v ^ȯ,ow'?>;*(Ad_ B6A`rQ6 Ez8PFLUkE>ڧEu %[#]1ɮ6z) \ I+[(&j@sDI3YD#alC(c%eUPe;͎ /SL3yR PiZu̕l:EzτDa$K˗c%ғoT(L+L.GG\A蠺]>xw^+\ OCyNףUWUVt} B or']#gO+:ޔ6([UJN- dCQIoVdq$&H7dՏ9QW&Qڅ #)c7v-Nh)keˀs&'Aƫ ͒m\s%n ̮zD}{;96, ~w"6cU@vn-*(~?6IϼӊPVc]0wM~Ts1%ru֡-ޘ׋ڦ"wS/jԆW$er0N7TEdr7~uNL%aB=J@g)Evmfs-tools/.git/objects/e7/0ae062238c17372448c6ceab18b1160b0229cc0000444000000000000000000000043111733412720017616 0ustar xm[O0}裆8ەֈ&ooղ^y:9'BCBYlTB!.rS$;6VeFl I(a`ZiA{de[Tj WM~ QIӕV[m2 {#@ %vrya| CVjv!%{l-9WsSuz|0b>]Y6G 2 xa&x |-a vc\v_d"`qkG~ߡb;vmfs-tools/.git/objects/f5/0000755000000000000000000000000011733555634012675 5ustar vmfs-tools/.git/objects/f5/52e92f84815085ad0e349925d57fc6539bebd20000444000000000000000000000114511733555634017713 0ustar xڥ[s0yί^Zdm*.CaLR ؚʒi B ^eWgwSI|vXEw!TKFS.^k; !v>8-8(=t$p.>ٶ4 JԺ i4{p,dgs16)du 5zAڌjO7;p )cY< "4`+~]ZŶ@KW%ye  y:I)pbln?rFu &8*+@OBVUP0 dfNKYry\`KǐfAzU ۳<Ēp-Y2K>Y^OuMVSj2H87POC4E>L kCtA!w҉S)$"&Wn݅t6hKVTXHYNJzODxBm<0a'%-KlUb i1_t(ksj,E.xqw,?>1[ˉH&ӋD6'oF%ٰ,}k<ƹɭJ/,0vmfs-tools/.git/objects/13/0000755000000000000000000000000011733411503012570 5ustar vmfs-tools/.git/objects/13/1dfb84e4726124157fe38f1ac801492c2e17290000444000000000000000000000026711733375666017533 0ustar xڕAN!=󊾛hV1x4d0#E*Uathc&%\+2xM}(| }AF5grhQrCi[- P*,$m2(&NqRo$F5zÞQm\>@jV{xC(Ӌ_Ppt@aS5-V.~ Pvmfs-tools/.git/objects/18/0000755000000000000000000000000011733544003012577 5ustar vmfs-tools/.git/objects/18/0b818668e397c349c2e61ea0a52bc1e9138e830000444000000000000000000000464511733544003017611 0ustar xڥY{SH W!6\؉IKdidϡK;,gl*Kw{&/w?qGݸC F7 m3{,^ c" 竈Og h7: .ٯS 0^! f͸ݰρ`'Ƅx>`*ͥ?]01 ƀ\̒d~h,4H)d7Hy`{=>>Rꚝ欲t1˱}>;P heq 8a Ŵ+b\QAğˈ'L y[ssbXd&pԴgVϩ7Sb9E76MmCRA{+(Lc4uIǂrآY]^3ƾ&,Hė훞u?qh3$LDh įop0B16脘M}d`#%= ӳDƊմNQEpq57"B11Z+ $aLpWǏGp Z@;[R ^b\by&eI94{XbNCpӈ`_5yZM?y| R,i0S+!K8?% whN:&6]/$ojEaxO{=&Z튲nXRdY\XqFnu"Q @aP$1a!YiƩ)UPHG$=3!S[r~fGEV@A *",O}5v݆?e) :a[H.%Ԯ|]amqp@ 鏏u%e$~5Zʆ4/s0( 4ؖ <ϛ~& eDMP(# x4=C& !`c6`Ad$t'by= TLWPJsnV[Q~U?ʉ/7sVrP.Pu*m/mQ7%'HRXڈrF|tQ3É{JJs.\\I9[@AOe2$- .FI۫^Sى cDp(!b*Lob?n5U2{- !J%Uډ;MN^:]KC31ۜ mmo8$Wׅ ޡKv )aEVc.$RJK``kppUr,j `V)( l e āw@E1%k e!NhUD%JVg&B1Hvі/Į,2McfQ8um oECù$6|ZKuqh0n 90;®R8Z~xYb7.-?i9-|ԩ'|p8h^q G-YSzf4ETv̕M1A~A!y>Lk /*NAByU+"etLҭӰl2D4^|@r7ݚ8d%z||sNǵM]Ǡ75P[Bnsgu:KOrnY;S~mEr8}@ qovo# _fG 3?L]D-jdJ ,5Wvŕ#7_trAt/Dy!]^J2WIdH3Фirnf[SI5V$&Ғ7Ƣŗ* KL\tmR4}{;X-֫Nl'K.CtD{ ( Mx$(o>&J ֺBjyu=8ބڑu&8jPB eSF+la/vmfs-tools/.git/objects/cc/0000755000000000000000000000000011733411007012731 5ustar vmfs-tools/.git/objects/cc/604eeae5d832a3acf6b3086fc1b2d4affadf5f0000444000000000000000000000150211733410505020571 0ustar x+)JMU044`040031QMLK-.fPvPy.[88S/a˜7~&]e5?=wUd08růi]ۤ37پW_ZAUd u_};d~Yp(`RzRHtos0n*)MhZ;n['PJ- IE|RfInb6Y~Vo.ٗrv<_s_aQxD7=wz쟚V0'?9h-ŏ[ݱ3sט2^z'QNqgh5 KI-LN*tZ{u&fɣ\5EafQj^ (g8񪇞ڕ{4`UaGXf0\m am +LI'k1͛\ZqV2]r;^bI3WbP"ڮ»ie){ߛ1(_stᕮ#[=ĢDgg sY˽2)-u0q`Xr3j*RnXY^Em~1ӛ#;%_}s;0e0p'O|r4Ē2S@~ϥ ,L֊Tg榴ϝ1{5rrJs`ip{ o7`H}qON+Y%)%@"gE<)'oǯ*}IcU㯗7mL[w8e^Sde9 /o)Z siٱ(`x)6Q&J؝Nηvmfs-tools/.git/objects/cc/732a314216af1926e69f7ce5aec33b8825a06c0000444000000000000000000000342611733411007020005 0ustar xYmoFg~H'8.9$=\Ab5U%6kXu8ήͻ7j(`<3;xw#ûoj'88%c0ҟDBH#"BX(k6[p:J^[pVSNd)"&*Nep>}$p,*5(y")"1.%r~{p}*f=`n!t1u{8n^${"8OOƒ (#^ĒF|tCHA\M]jtjQfD+@+bf{SyOhBVj'ЌXr1#B)$up|,5?ݶ'C B%$$ka6 :kADՐY""t&qF_ʟ}t7Ψ{SI=WѻoWѥc2j5`)Z}.74}z'/J$}oU5ԂY~g;]Kϒ{USHe,>Ȟt[> dHwKT3jNM+H|q0&hH3&ۋ#aH\R QmMDAq[u&r"1H`.t,w_ƨӊԯ|0 & ,@U`zp9ST|;R@4bjQP_APk|fB9A6 0\ aB pFƧ&(hF;QbD[6!cojp崨 LX]\Ռ, ׽vcRdrn 6﻽VU>`EY@q Le5cU$7HHo$/.<j5H^+Q1TAg Te9O oG5z԰~0k*FiS :l7$VThA)*[9i!I:)W8n]|BK~ rڙ+Ne禶Ur#}aܛ/_Ƚ{_2H}>ǝqAdr_-α/XrSXGZ,CdSpʐN:/X8eiwKaS[nuZ;j(jsޣUr#[m+(19Z%#-j;Zg\mEWv;*haB4h4 YvbSy?m{ OԿK}J]賁؛6[o꽽2lp0!Rë-j?Ok6+'SU/[O2-L*1C롰w@$?4}h JGػKB@d{do3ERj=}?6EZ_EG3e˖;;g EWU$YBO( :.QL(̄m– IC;$S]G +]S,gBGi|5I߈|1vmfs-tools/.git/objects/e6/0000755000000000000000000000000011733412720012661 5ustar vmfs-tools/.git/objects/e6/7d4b73698e595ec861494a66495fee919c0a6f0000444000000000000000000000101211733412720017717 0ustar x+)JMU057`040031QK,L/Je8t~2m{ťz_l]U SeX!CˠJBsS2sR +> Zy4w܀*tv ve*8!F}cx# WQ5< Uʰu{Kڷp)&^H-"ş!祗smwquҪ]@ysSSRJ؅>۶Ro 홵~|uPCr 9Ďɫ1dږtRR2ޙʼ[.̽Kx'3(X]jW?> QVV3c_{YLrDMfnbzj{/fT[3Hwska,(Lq\mu;T*[;QSIjq^fn:ޱoz;XtЉȩUSZS g>[ZN!6M+-Neؗ_i[o3a}^çvmfs-tools/.git/objects/fd/0000755000000000000000000000000011733551143012743 5ustar vmfs-tools/.git/objects/fd/be29511fe15ab3f8525aa48da9c87f8bf287d10000444000000000000000000001103611733551143020250 0ustar xO&MNŤ#$TnAƒ4΄rβﰧ`{M g@h3N$ Xyf,8ϓ(*Ј6CA$G6^@gx+"PWC}GSN͟U}7O(%yGi$IA*c-te܉k" ]}oҳV&Myw DB]T+A%8!F?'fpF ^1^)6j#SP1f1t26peIنBy gһc>7{o/,  -S.A~yyz(}`f6XH)[ַK\dʂAVpPqP|+".Z xz-+Iy^axxBFY 8nt4ӚbX݃`-q8o.i ټwUoFyW'}!nΐ]5"?6'A"KQ ۀ/@懅K&QIb6I'NS!ޝꄭ(rU RZ,yv:reݱpINZݖ"1tU@bS|oK'c_'-t4L| 3hQy>ԻffdYّwc*] `3b4Yg LO'r@}Dߝ6n.M=[N %;H|-I qNѮ_Y}D3PX^p#U,1`Q^EaT5G~8 7qyT|m6|ylP! Y]ɂh+;A-v^ B]oۢBę(} P&EN'gl#=B uBz8QΈ,>0M Mlm-9F\0r^ٲ)?m{7T+oV$Qc ')}Pɐ߯}[욛$@kH|Y(B%+M9|A $fw \@=BF_2D Wt"{!9{0,aptdf65;NAV'6 mRqNjh w<doL_ !y;0gz(uvSq:aIA>qa6p$ D%CܛQ|:+aw!PlרBQ+1,DΘSpX1f!o{KJ -R %˿%A|Ktc(P9 6/\͞=Fh3M!2x ADOijwXR}_Tg{J%+ Лٛ3(f"%֩O_wik{]Z7IIu<[FPLw4@! (E̦O60OP7(a>sCy[m5 3Iы(z,/ gRnREDQ|R3Ro!a:9n\+<,>aS?% `@XlEf)" ̵ OhüRhu3}$389R=bZa*݊]{] ;K{=]vpVpp|~sY3'7~L܊ Tab91 O[eOL/CO^ >YGiq6)ݿXdT$JÆ?\"`Q; UeEĩR1PmutGqOGO.ӈs:ft6+a܁{$9gD[/B.* /|_ͬI[A%ɯ!T[:MktbjЯWM BH9 iL7@/ށ(rgmhYoQO7Mz)sU2h۞&B}afo%?.P$|[%ZUē׻[^^dej=VnfcSw0r1(0֖&cڬuu -|,R\9`Ȼٖ Y. w$jߘVkXOB@6bSq8M#cD'NC"qƢ<Eg B2d%(bWC5D5քxͦ_YJA-I_*HlHLeT+hK*j1$sUe׋&FoD " KB=8a FhMH4(K~3=>-Oɘ|J&k_]^FV)JΞn!x Jǝ2g"Y*Od:3Ք1w§jj0PY*,ڰ*ђ H*ӷA 92Ɯ9UKšH2-!SKfml6J4s攇r[==hlW皾뚾bئ0(EU z- C/}vmfs-tools/.git/objects/48/0000755000000000000000000000000011733551143012605 5ustar vmfs-tools/.git/objects/48/a057104c211f01176adc2c08b31f8b59bd667a0000444000000000000000000000026211733412720017623 0ustar x+)JMU047c040031QHHKOOgh}ZYz as K&8_zv{u*Js/Nm%IBF;Kq] dm(%gi3wwϦa8D ǃYχp˓!>CH$`\3˂k$ဋ^ x"ŕ>$ EwA{jFq6 om$ o^wW2y,Aז٨ fVf3&$};z+ ͼ@m}556B%iŒTl=/bPp9$c!:PT|*(49~"ydRG2hp:/zgTI Eu h#Tty/*GfJs@TUjV,\85IwMΙ;c|5 +:b£l @nL:;u8qD7597C5- KqY5= &odڜ*3[FnKřȂذvMf#xLB4s88o{EewwKg#\%)J7Б|tG8$N3FB$S<}YkB_-[^`(ƽ(~19KuO©hqKaJ"yXBBI2;orJ_)SKO2iVsi 8% pvO ,6 T^Pb&,E6N\A87<^sXk5x-YSJѼ5zV%)OK"UIRɿߨ!D :@ovfyy@}7چ^ajI\4!vCIdXq= !(kǕi5,QR("ݒ&YQ xzx~R_Ŗ\S~(L]viTR@Ɏy1?VeBF_gU<`9k!-ANGU><9~eA%oux@oE*l k2hn#kM8(eAk'%>֏J;mxJ>k,rfgtO5u}{L@>\=BQW@l :@,ɜPӖ1Ec\;AX>I, TqrxrzƮ-,n}[ƭDYtʝȇ|M&U>oP_V|qϫ8O}i.ęm-]LMݳ@ :n{]oj?( YT|n^ЕBp9kgݰ,;;vg6l;'NUSk [s[cæޏ^5[OBPW}^J݆A)ʰT ["ůV)ޯLLA**e ZvsҠ7t˺ )_4-d=;?ßUfu^#+^R:q"}{,rs &)1*SjUSwYqdP3> fOlCשAt l:Bw'Vi+S@>|h Sۘ`ښȞR bCLĵ*~aIKxPq4| F'Z{v_j%ЦO 5wRвL%My-1_v8uD""c"v- Tm)SwI8]>w?cS'mҙ%W[s)ne{I1)(;{*XE.NcAm;y\0.ל$Kō!gs/ajkNj{=.cg2O&bw ^ ԝ,I1TȄ5Q.2!6ՏIbvSZ=CZg;] 7Vhu_𮕥"sm,:^vmfs-tools/.git/objects/94/0000755000000000000000000000000011733551143012606 5ustar vmfs-tools/.git/objects/94/423a48f579e8eca35893f79dcb931357df9bd60000444000000000000000000000101111733412720017771 0ustar x+)JMU057`040031QK,L/Je8t~2m{ťz_l]U SeX!CˠJBsS2sR"<>_T{6L7'J|<]] Ns_X&HUsT B:2l?-m W>mwgy}:{s~jPT!9?/-3vl{f_ _"lBc*|=|F4*51Ԥ<mgoSN꿇ʾopei l/,Vlu/n~sՏwBԤ'gL6^iV|9SoQZİދ: -<wZ r2F1W09{/ʖ#NCTZ\w,e>Vg-]%t'rj@ՔdaV?/=ӧpM ktJSkwLw߿.vmfs-tools/.git/objects/94/f34e0d0e25694d5e251fbc81ff0f78bf380d2d0000444000000000000000000000357511733551143020115 0ustar xXYo3EIA],S"VQ$[l8A gzȆ{r[='9$ >ꫣ9r?|U랑Rh~ A2#\0ц%.\F€w듓Bqmr ! >9=;;$lgǹ҈gI_9]װTrX1Zf(620HAmP| Hx!9S`LTA'xRﳙ!򐥚AiE/X3+n\ p-Qp`L8+X1;.t  C+K磹_yO\G >10cigK"0|{x'x1_O> YHe+Dd)8JFT OƗnno& _=>.xrst{1OW0>aBW"Yr HH d: >M 4]17zӌH4NȠAǑBantPd&|_CJⰃ$< X#i(W9"f.J^i6OXjpY/T^tsB+'AIgԆ>"N:>' ☇E9: BӕY¦^ٯbLLOOc%c͌T(O @K~D K$NSnAXاdxa. .9xd 3@#{#!EW=> GZ~sohMy~̕6GG5J1g/AM_Pd*._[\Ւ-+(yy*xC~Zdk:^r w T+nT%O:O9{f"&ݨ{Uhr917E[a:E]Kn6 ¯> %,5̄ P>a} sbpSXR .eפCA-Xέ1@nd Azʭ9<EtXH1èeAUa&x th!w$^*402dv M#:QƖTg˥Ta;(Q Rɭ2~v(PJ;IqųUgaE:*"5T8߭HWh|Tg? ǚqazt)®e؅7' V}"(GfRڟ JoB%vmfs-tools/.git/objects/b3/0000755000000000000000000000000011733412720012653 5ustar vmfs-tools/.git/objects/b3/47449cec84c90ca6728d4b7e66725fbf459a3d0000444000000000000000000000026111733412720020034 0ustar x+)JMU047c040031QHHKOOg0oE_Qj':܂~F Ηݞ# 8u'35'NT:\yMp%E% 棟tGN_^*275U(*I-fjYp_2^-Ԭ}gFIvmfs-tools/.git/objects/61/0000755000000000000000000000000011733536625012610 5ustar vmfs-tools/.git/objects/61/a087204e03237f316b773985566f8f4e502cfa0000444000000000000000000000104711733536625017454 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&348pVg-]%t'rj@ՔdaV?/=ӧpM ktJSK=<ɻ^gEb^L]}%IMNY.`݅-vr];$ vmfs-tools/.git/objects/82/0000755000000000000000000000000011733412720012600 5ustar vmfs-tools/.git/objects/82/df36cd7938f705de9fc466a8be6cf203f80f5c0000444000000000000000000000221311733412720020200 0ustar x+)JMU045`040031QK,L/JeXoJ?MSS14?(A)$v/˰VSOKĊ"A&fe2z:g%4{2>sX;=T_+U 1b  ijY WG_W/X6]F7LJ P!. isTwE3BJjRfb}L|u{^_LP*Jrӊ?2s|u/m`(+(a0֡{eۍn=kόePE)ɹ)@Z϶<ήf͓se0([YtѶ^G;EB⠊3ƨ|htwEEq.6#`TXcCsI]wzlҒϾ$Fu(w9EICf=o[E M6wT ߺiũ@(vn8g")ڨCùiq0QqIE|RfInbθnbzfV)\\Ea: z_?z}7?[9@&k0@τS[}WT`o Tmu3ugY ̢Լ}OhM1Z (`)wkNK; !+eyxr4L=]vV62^=<dwU\muJhCQe{4{͹7vR7 -fu]q(z>3+fhdEE%I )~42[moCڤ:K`-'krO͊,S=Ρ/y@WwDk?,]N N䉒OQΝXҶ_YYf^~ (P~Wm I_g-q.](=P)GŴڜ\iRk`Άw:^4ޞR<]UfǼ%+\!׵U妖$$$ L=sX;=T_+U 1b  ijY WG_W/X6]F7LJ P!. isTwE3BJjRfbfw9oZN,+K+:jPEizYnZ^2vUfV~x e%% &:t|ҭzML(51%97hB6ٵ_6֬yr }+ P.(wHHTQqrq&H/n^fd jkl:xw9_S UQZٷĨص9cwW(`جr{+[*[78hRGԟi0hr Dgy~wL$@՞|ht8w] m3f_8*#O,M,MLԵ9,_ݪ# (`=5VR@AAG&g]~0'?9hsҤ0{jc{2l㹺}jyͱs;, DVYW4Y_i)F@k! r;eΝ:tiyug VcuߥO5R0'"+-)yԩND6D] DvNMz#kvmfs-tools/.git/objects/e2/0000755000000000000000000000000011733544003012655 5ustar vmfs-tools/.git/objects/e2/963ba09f6bcda27e8e72d0d24652524cca9b0d0000444000000000000000000000641211733536625020157 0ustar xڵiSHv?W6>BY 5\a2%- YȄ!uK2٭#u60B7f 6v,:p)f1x~=9CC>[!^=$| N =_Ћf<_n|arSX%<񖀏Aqy ۅ8ߋ a3f " ,ь%-d,Y|bKi}8>Rtf0xx+0F^ ~,IB؆8!$ +s^#~) x$p/J@(C2SaPa糫K88 \\^~l.e_BQċd0.> .?pxty:_]Gh3Xx 3~$ )"V<ɉDvn% BQ9>D)U8 摛qw츘vSEhi_*\[pi%Cp!ጥ>#$.m45jF,f4 NhoWߠf)] 3o< 4yBeܩ3Y!i=H;Iq[ 5 /z)8ȕ%1r}DUPTr>,_`L p~>.^&'gW~Yu04%*xT$F br ԁ79+ ‡ZI<Է=ZQ8u(-tUBGMB zR汾qfjXЩS"ʩ҆.ڏB,\,8Nv/(hx»._֖9ڰ8tp C[ZX]2d)<\M,|29r]>kL|z6,0l+Id^j~I,k>P¬tұ·g{sQ%:EWUFʓtyx 2իwx"*GSqAzE*T]Y717|5QـdC U:^nPӮox4e +%N]) dA":(cTjW]'l!]'-VM*~W68"d4eo8 אfu[j#H[v%MK)ZHZv{U̡=sFܡU# Bq1sxB- m/Wj]_ m to)]t'${sbiOnh(W+CHqD JeHqtxwU' 9EY5u'e=6agh[e2ɊTp6fRj(*x!j#P&kZ8c\zטMz\ˊ^_ׁi]%˵tl{a%OsW%lY$pZUVY\b% zTjyh4WUk  T}7rtԶ}ۓYIYH!#|B nH~8bmz wn~l2+WEiE~d^W bB]A lo}+Vs&yZI¯ wTQ[5[h6!1gǪ.kQ/qD2a2ܙG<7=aD$|c'mᄾkL_G'\=6xz%UZC=I¢lh/nI8J_ nUKLaq6]`:63\_{zQrV-Wj,yXƮ#&#f;ޑFV(,hJUzDz`f 'G om=YI1IXH\Gm#E`ѷ_NEh2XK# ɄٗL;OX訪H(RyNfGV, Ԡb೓YI/5h86P v{ zkëT5yUQѐEnmI-}mv:HޏPh[d'9g_b_`r77Ǔ;i6Y3fdN}]BA^T1T?!dBY9 QNmXzH-5QpTiG~yfym6rpewŭm8!p7, Ǝ'ymEv!.+%Pm!Pn%4 x|a"GpV{^\V8]#[`KyZӘ{TzzHX=ԃ2Y6Iyn2JxЃ˵%./(#ߕ䤚%æto'yICw4rѹͼ`Gzʼ FNu4jm Ӹc64"GW6i*D͑H aaJՏջD. 3$^p6xvzj錸Q{D7~A F aӢ[/Nfje8eTKwS\֤, 7xo d՜MGLS[}W8ر~jaRvmfs-tools/.git/objects/e2/a2d1b91480092daa693fb6f3fe3f82d15c2cad0000444000000000000000000000104611733544003020215 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&30K->7fPl=Gl9n>e*5E J_1`^| sDANfRQjbJrn 6fj9uL'fȱIMNY.TuKlE4>|]/vmfs-tools/.git/objects/e2/25d4d3c510818bce817a20378bd43ccf550da80000444000000000000000000000327611733375666020025 0ustar xXoFOABKh Abije3b,9t߾wgHZmV}|ώxKA1; է``.>v[O ppɢYLT+rS.X4!ТpBӥY?ƾhx,upB9D1vՋ <1cr 3kT*6L{I8"1P8uC]r6wQvFK0bCö,4P\Cu#3h-d1H0Xj_f9*aF49NH8ߐ&P>׷wCS߯g(,& W#IM )ZƼb;3 _Z6רR;=& uۇ}yש뛷<{NLG.lp@}U(!@ۃ 8nD\N0 *^ o zƺ.;4$7 }1$L+#,_ skxo6m C^j .!%9XJ^\ CzVcp74 %ְ$4\VX5`ёb([HKpq%dm?!+[Y:I*ypPRI__Dl"X(N ]y)jJ\I]Wd/Nǡj{$8?K-ɸqBnrlǟao>~ i3VtECgٱ!{nBñUdlTRb|Ē2[dCY ġdsTeEVwϙct:%?# (|zUC8 S! EȖoϤB ɜ'$#-0խ]l.+Ԯ(ԮźPo& @O$fdt ('WO hjv%}J/Aaa/-E [fP_DB8.i ڝFQBj;`I5@~MTe5mݶD s$I(i燣3(4Ĥ /x?bDRuK5^Ưްbm3֚].H>: k:c3&]"hOrA; VԒ>Tu}vl&6Qv6]&IDvhTKFfjcc_B7f 2Nϟ9^I7ǯ se s1 Sֹ߻̵G>ȗ|e%s^ ܻ2xT#Eby6t5HDu$VuH8kT B۹_l8ﶬ{q`g%_j==b缴DJÄ&GUˊv~0 *@X" ; -_FDNXz!r._ 3F UyqC[;cܟ32> ?T!Nʏ )];CLGe|^_A+vmfs-tools/.git/objects/3e/0000755000000000000000000000000011733551143012661 5ustar vmfs-tools/.git/objects/3e/209509e85173c9f900db2e27e2025c494a0d0f0000444000000000000000000000104711733551143017567 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&3x.q1#q3I+NeOB6LMLO-bPTza%4] r2RSsSqLp0S˩eda.9rmq3zOsꯒt~c)w:k*=S$3- {Ϝ}vyٿ?>ClYVZpn̓l/_1n$59e W'UӑTX͎<vmfs-tools/.git/objects/95/0000755000000000000000000000000011733544003012604 5ustar vmfs-tools/.git/objects/95/2300fd9fdc55f8a1f2f8c883e3748cf7abf44f0000444000000000000000000000025711733543431020211 0ustar xڕ=n1SGBOihr[X A\K;qoĐ Vax}>N?iN]S)d` zщ5 4'6#Pi8Q<轜?OV>H# XUxYT(J{za]纨?Jvmfs-tools/.git/objects/95/34aee18b37743c0114296a1ef10cf5a32e62560000444000000000000000000000017411733544003017557 0ustar x+)JMU044g040031QMLK-.f._qesfJN5<TfnjPVS ؖxaC,>Rj\UIE CBY<3vmfs-tools/.git/objects/77/0000755000000000000000000000000011733536556012622 5ustar vmfs-tools/.git/objects/77/2c14bfe13187d4ccfaab51fbbe435c19627cf50000444000000000000000000000640711733536556020247 0ustar xڵiSHv?W69vIb2* 3ɸ\]ȒWG&}[dxnf 6v,:p)f1x~=9CC>[!^=$z~87 ~K]^4r;N.) ngIxC ѵYR4ȻEvvh'HҝbhՒ{5>D)U8 摛qw츘vSEhi_*\[pi%Cp!ᜥ>#$.m45jftiBZ`B3GS'K+ol.W3r qJXTI^"9*C#18| pNpMH/g(#je3#'O&?gyśk aE^aMҍyDV]ԙ~g,萴$ޝH BJOʒa`zp%ܛO0aE׊+ju3d11 H$t8YyGTZ]sQȞ^N^GgL!"?SwxgXwT A!̮YdKkkxc{)0dZGUFYDHeÊU )Z;&ۘ8sܰ,1loo?[h[bY ԫHBZf\ V5 d9;mq5 ѯgNm0}Mӕ4L"Wia楌ԠEl0tu ꆲF[A+f0 m򠭷үţ51SjmN vۀ'̜N_]0DA@A<ER}S8u p> G qx ltYb\3})s履9g4K9 q VƋ8Ʉ+ $r,`SIiRmhp6,_`Lg 0AUm?J\/ӓWgի~,L:Ljs}d <*X#1rԛGT{\$R[KSڞSB@e(:k)tUBGMB zR汞qfjPЩS"ʩ҆.ڏB,\,8Nv/(hx»ƥ- ?saq*[ A8d|R,&y X%\dr了}ט2lX`Sȼ԰|X|LY c'doz i%JSu'dW˷E2T,9>UJ [obnj5N=A 8-8uP0B0~J@ɦӳ1BUA1=Yvym2:mT,:85BEHGAJߕͼ.=MY[g*'5@VggSRև-ǵir`l!\v`H煝M͠PC9MF ޖau6+G5/6J=Oܐn[:gz69[3;R&ˏ>r EWנ6Kh_ZgQ; ^ֆݜdВאjD"}DD˸F";Z*_,cG@t)9O8ltϙ9Bs44|?   b~:R5(44 +rbA~۰TAuDQA 8敶ِṖՖ]Y 3Ͽ`Q0v< D" 1ԵxxY .ynkjcVBʾ'f1,O~4 wa%uᚈiʼn5 5G'珄3H=x*3IσuQb$4#ooL-q @A$',Y4;?=#=K{F~Cg7bIBJ(v:FӨ+ܷOZЈ>]Xl5G"5?{П?)W?WwR,]VMCw Ibmlzqk)n~*)M?l@W'E^^-CU˄qp**(I;NY ̷o@ȎXg9O?vIKrq4c,?Wvmfs-tools/.git/objects/ff/0000755000000000000000000000000011733412720012742 5ustar vmfs-tools/.git/objects/ff/eb42db543e683ae7a1f2c292f1e475f56533c80000444000000000000000000000031311733412720020076 0ustar xڕMj@ F)ˢ`4JɲB8]$7]>|Ou]:x~hոDz.)%mY r!&DĎHs2*.+a`imR P(3bPl ~,o/<V: {=?9-;f_NwNl}jemXvmfs-tools/.git/objects/2b/0000755000000000000000000000000011733544003012652 5ustar vmfs-tools/.git/objects/2b/4f440d2e7f7424ee81a52ab5a6fa1ce40be2a50000444000000000000000000000026411733544003020204 0ustar xڕ1n!S#GrNnR ,ww`a,+ h4۾4ٗE@)0#Δlrpd1?9 wx1:`lN9fl:|ׯemk}m 9DސT6Q`kKUp^K]oOvmfs-tools/.git/objects/2b/77e2fafe5caf88b75e769c5a9baa63652d31c10000444000000000000000000000013611733536175020254 0ustar xKOR`qqqtVUPppir;Õf%甦*gqz%s2@@tQjbJrn r vmfs-tools/.git/objects/2b/989807a62e5ae8f0a8c20dbf79df2240eb757c0000444000000000000000000000047611733412720020112 0ustar xmQMO@bN(V 6$HBntuwo[TLp͛0/duMBRd^IN9w;d|߼y5cޮ-w.q)^Z܍C4ӥ~`VY<\*EF/NN'IijWw–RqT20x1wpߨA)czuȕ @4yC MY"0d"u;I_1hӋkK:>K[?U[ˤvmfs-tools/.git/objects/e0/0000755000000000000000000000000011733543674012670 5ustar vmfs-tools/.git/objects/e0/a7cce7a1356d44289799c45f3b0057b97dae0d0000444000000000000000000000104611733543674020036 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&30K->7fPl=Gl9n>e*5E J_1`^| sDANfRQjbJrn 6fj9uL'fȱIMNY.`݅-vr];}vmfs-tools/.git/objects/e0/3149dde0be023ba2828cbdcb56660216c7b7d30000444000000000000000000000104711733536200020046 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&348p*I-.Mg;2M~G:95jJK2sA^°gwY[S8&5iũ %J]m"/&,A펊 ;L.L]nl vmfs-tools/.git/objects/0e/0000755000000000000000000000000011733543431012657 5ustar vmfs-tools/.git/objects/0e/541ced19c98579673eceddbfc4c9025ff9da310000444000000000000000000000105011733536556020263 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&348pJRK2sL|ӻꬥNDN Ғ̜b0=srgp dnZiq*aҾ'ylH븯!)erEpS Sx'[(8vmfs-tools/.git/objects/0e/2fe517b0e53277e1420879f67277dbe17622c60000444000000000000000000000104711733543431017527 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&30K->7fPl=Gl9n>e*5E J_1`^| sDANfRQjbJrn 6fj9uLqeZO;bc_jX$BBRKl*/CMnSA!  T4^sGI^j?8ai2Cʗ颴EˢAr% ׬Kr)n PăRA?Ӆ椨21 qiQcpjlӔ 7~#:6 .pIđ-A 1ʆqfY=V=q䑩@@p!2*SSk_K0 *[mNp:(l=:sG%7R  }ƿJtۋo*N[^F*Z_Zfn O#ve i,_iתōWppڪ e HO `ƶ)2lڡ+wͬx`Τ 4Mp@jiIˉMd@ g:^4Xݯitscq22Ƭ+"Ar;=.m5g:u׊{wbE.lp.Xj8b"et[YD$t׶%g.&>ENklJShuG<S [aۏ@^f~PMcHO*w=a>"m4fBuc@uڪ.!FZ2yn*6]“;)B`H%Ð؀[>K;JjfovUzoe5yIݿ2B缪HPHYum3,_r<%d8hkw圽~DLxkS}~1~*0.n"$/1("T* t.g*:Gk{'T ` @dwz&{4{vҁʮY)\VDNtغ1~Iv4Uė %߸r+jRui, 0圤bOXGnbvmfs-tools/.git/objects/f3/5552609925c3c5e696d2c0fa8ffb9a74d0e59c0000444000000000000000000000542311733551143020043 0ustar xY{s8)PwڵSyN73k;NYN{у4#RI~Hʢ̹n,QD;<}==_sxwy>?Ŝz1 ^~^\yE7{.ܖieEwxawfYz1य़1<ŃcxLsp2YA(ĩ$cTS,޲ev׹. C%SCD) E&M`!>eᨘC lB-H 5PGlQ֘_ZAHA:C6> ϣ&@bx?^\L33ޞ R|Ƴ(DhWf'' qY:p0E#|0'8C;w3f|}5p$ {b;J;-h |HR &bvкKr H .n;=  ձ&W7^yQxr|r N+c^:mVPۡD1f)&GykQPk~mW%enh ,qMDMDwY˅)Ds,!Qoc({O,M҇A!ߤg!L&Nz K8KdL ?bS/];*T_v&L*oe ŵ^#홽Æ?I=MWxyy;5J VǤVU_GaY֬IARyoGJP//^^Ԛ,i 6Ґ4l&?lzw5|+9Jɭ$ ߇%SɄyU"+Ƥ2- E_Y1s*e i+@i$_;gB؞Y.b+QsmnFSC+˜U}[!e~[Iys38k1yd;,1&^>5PʫE)N?\+ =ݥft[ZUiWEbX-9*aFϳ4tecbl5+rbbP7C,TjxO RW84Cy0뙢[MPIl'b+I-B!zTF7á@$_-rfrp:ГZ|6K3*5&b)%J%*Z?^E? ;W{p؀nm^VJL!֠eT:iFy w1r}!0e2/l/abCcVIaB9dw."Iը2sHUB Xd g&з'S1XeæG#錫Ԕ;Φ}?<%S%uh=H-G)b/k0_ PIhd\Ȗ- h4n!F]3 г^f6i}͹w vX|]eYA+]]Xi^4){N~J{'3{z{M pc幍*$2˘#19ԎJVH%Z+C_ļh)D[ZKǃ .tr@ل(!^+>yL8JZ}7vQp4I^ʣř2px`H=ǵ ;"er)Bٹ~؄ (nG7djCԲ:XVb4k~z"кGL'HjFi~ 5:V<tq I'5JO;fbk[D[tD]CVNsޭ0O?|20o_x1ߜmE1,+$ci,*(:k/%m.CeBX{?dXaJQ[}MR30\h.BH O68KɫwJqr6d 12[r%u0/ҍ@D_@3iRQ"딮9V),y`9 ^G:90ThQI&?+[s7Vj Jy\X=@<J)vmfs-tools/.git/objects/98/0000755000000000000000000000000011733536200012607 5ustar vmfs-tools/.git/objects/98/10fc4cd0e67ccba756a737c68c2e37c430c0280000444000000000000000000000037411733536200020013 0ustar xڅJ0])f/&)UQPq&ӓ`H*ٸt5yC R9#R.F5vtv줔3iը fTc`5Q(vwlXԄQ bP\Mran4T%sBp)iypYCN00l7V01JCH6nZ*yu4Pw{]C†;mjvmfs-tools/.git/objects/29/0000755000000000000000000000000011733374416012612 5ustar vmfs-tools/.git/objects/29/cc6a690063c772b6426d69887a18c27dbc324c0000444000000000000000000000025411733374416017614 0ustar xڕ1n0 @:ERE.]z]8 rumv C@b)e|BTcf3#11jܯltH,{)gT,( aeK?d%)")OY2G8Ƚe; /G &ܳd#JM"p(1w/_/o/~=,ZsTA4 J8ÛӳӋ_aۗ>W1{|~q9{/%dI豙a&~.6X= %?v;8, y6ݛxBr$}O…H+z(;,&9[:8# `qIYc'uMҀ[#g ^"΂,Ls`4sSMjI౾տsҶx  *Q,v gq}x#őbwA 4;Py20h sXvq.{7@HA9գrq*l5? b4 I~ {do??޺#L^O%bR)ukǓ0 qkvF0M}Q8CpKdmqͫhTy}wQ-lLG57sa26X`¢4,B-W!p{ӰL "i* : 齗lMW_[ٰyuV\KEՔ޼|sR8` 4I#'hfke>թPrEgJH k;*Ppq8kǓι9`73ClRvXj-}o!`)I~y:QZ4ar5"?wx9㙗^^CB 9#:ހAI0,3: S]Qq3xe?nd?.xw9q?~5pi1PMcO5!߃jmnjᣑl<FI ZR!ʊk,%r38QwB8_\dUDr-hO_vk@("+ߺۙ4M慯>L#.SQ$wB_3,{M5!%hEB pxA]epk|4qjƪs5q'#Tπ;OX=G'IQOبspѠ&Vŷ_Ii x^)|Is N/NK%kY@UAa^c{vA+"mE*AamTp wi@h|uH/ =la>J xp돬4-"o&vg8,{o:Rt.ޮ.&JEN _)ozBGt4 Z_eԠq:ß5OFDԠkp'iV jH\uMr\Fk#ON Y޹?t9TLў { [˨ (z[}=, 3%W/NqeBTbn-iRqucͰn}X+MlYeFJg)޲,f<c>WL%yz;x#P #J2 be!kKEc*pZ-f9uh{= Yj5J=RW\UƠ?HS)^Ui]W*͆F6l$ R-^ *̪3MRfɆ|0^xLiQHV$['s`慲j5ɤjwZfN+a+|T)+;).i%{!LF2&sPpGYEKcM1p53bRVZjW7@ؕ"UY{ГB<=| ԾG;WJkr7#5J'V'1Mgdx)^\ޯcrށma ̢~7T < N*mV 3`G~rWOa-R\͜9ab0 jt"ΔԽmG||]>^У[Ehgȉ.y;8EahL,`kw1k_lTd' Bڶ,b^of#_XZo1;cϞIm S /psg4#-k&Kv?]BW\RA{~#6[Ɲ 8c*䜄ӆ10ģGK m @#[5JWw 78+ĝG7[@#blD&/+Q:V+?+/g/7uZFr/E ch_4",Z`vjFd Fc:],f&FحĬ{7yFFV$+uc|nFo YHiT+kƵm9>B: ;4]6,r$bJ6&U, TXu4}I gzA6^tXdtj(-1X"ղ*ZBcw>rَ˶M\F7;T,fؖga*;قSz`3MzڪLX0 lH'y06҇ohHʃXNM5xjl(8+B ե> RD}#o?9 atUɀQE{BcFRRW;]Ce&Qe} ,. ݳ勜hJK_LQl7#h{ ȮYlǿHN7*Z7ȓ<|TUp ^3;m;:NBW֦{-?5ݏ-u8.>k  t2^=6Z pZ%hEmfCa &IMGWƸe">q'UxROl(>fQ_jrp"xQ  ̉ƘvmJ𭞀=#Ռi(!{b87#Ď#Gw\W})PڢX=::+J!eS 4B LOfpM6eWP l{V~DWr]-|9>j871o3?vOȵB3sd<2g726/tƣ6u`~+Q8}kY5#eiXsNJ|]T&ڹ1 $pɀ +4*A$rUooV\Ld˯6+ [mT&(Y`|cz(_R ^{U5?2]\w^%Do GhD3͌et[`Q""$u 2b򃤗-FMbj"Ђonz8bA)$DFf'H܁cJlNmWzx5.pc@i_cQI(Xt¯Jh`fLI ckujEyrF+$/|}|vmfs-tools/.git/objects/02/0000755000000000000000000000000011733412720012570 5ustar vmfs-tools/.git/objects/02/4f9f005b675a48001bbca746509d42b9f0247e0000444000000000000000000000031611733412720017554 0ustar xڍAn )>R nroxQ 0JOߨz=Xi0Rdegm,ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lO]ij6MZoj}JRK2sL|ӻꬥNDN Ғ̜b0=srgp dnZiq*aҾ'ylH븯!)e/uwK~vmfs-tools/.git/objects/af/6765ebdecde36ff3cedf5c21aeff6ea67e16930000444000000000000000000000243411733412720020634 0ustar xm}4Tigs hÐҶSi SZ;2M# ̝wgLܱSDRNEMPHi,iJ+91e0L^tJ MP"﮷ߑgDž'җ,N$3&z}x&_¡~dĦrKtfsao ,@0߮=퉞rkؙIeZ,q >7yYɯ$ c9ّjv'S `.!ÃÁt&z//]OO=>tâDEH}1lb ץ: S#w" $L @yisCx35ad-1<>MҎH`!'쒴9OD#nXfiW'"ABXf0+ԌdonNvA`FDq%Vf&|)R^׋]so@ 9ObZvB7JBYw EiE>*BnsU,'mT(pTl,\Wj wޖ SO!Jwf F>XY<~âIO /(ᴕ-ByKYPG"ƌmSش@YG{`ք 4mPl_R)y GO3[L71hLXUT[YAJ*F|XoP!\T"O3ɿ/ ƛ;$i\hv aIq;b,dBrr@‘4upV!kןs_* !>CZg*w1gf-+oOꞑ" yyxoa[/_0IR3bklτ&Ƽ Uf{fxFE9wFbI~Mdey){RqbiD{C&Xka`JssS{^du9e@k%90nbʷUe0`ꉾ8''|zwŬԒĔĒDt7W>뤱*`Xvs˛6;ns Ҳ\Mķ-l ݹh ִYXf0yf(߂? N ̺aQl)#˿B{V,H.(zPpx6dY(~)$bMhyąkgE%$IX$z8;Tςy3M 41 @a.hS:3MhcM|aVUt *Ĵ.'lYqX)aC#ʥ%3qBw\+![k"t\ΧìeY&ھ=2A*c9]l?JW2vmfs-tools/.git/objects/0b/0000755000000000000000000000000011733544145012657 5ustar vmfs-tools/.git/objects/0b/da594ab54b8e3c1ba3f5b541246b57e6e7b4470000444000000000000000000000104611733544145020070 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&30K->7fPl=Gl9n>e*5E J_1`^| sDANfRQjbJrn 6fj9uLM2R[JRK2sL|ӻꬥNDN Ғ̜b0=srgp dnZiq*í(/h.3쉤&,aɺ%6"Yry.K vmfs-tools/.git/objects/83/0000755000000000000000000000000011733536200012601 5ustar vmfs-tools/.git/objects/83/5430400af9c32cc6b8a55be041d944d55167f80000444000000000000000000000023011733536200017560 0ustar x+)JMU04`040031QHIM*M/M+KfXgw*V`Tzd%0T0pzL&_֪w+A&ef3\$vҼW-,?۸}*+K,LLIYn˓/(+fn=vmfs-tools/.git/objects/ba/0000755000000000000000000000000011733543147012741 5ustar vmfs-tools/.git/objects/ba/447a9cd52ca5344c0a87079aacad4f39f600030000444000000000000000000000342611733411227020054 0ustar xYo6@ݤh$+fvcNYa ɔMD ngߑıxx$2^NzLZ pAfR/bq:UD0u"z ]Nw;4&7+h&8t8pYXs{wہau[ c }X6{i676!q&t.qE߬ʗ~>8^w\\XJ;;kߩzC'F tb ޽Eq2+wgy^_}rÄlQkpueC5'-YFVR/[J;<$y^ӐjQM'꟠X ]TC;T\ )8_Rm"(i?z.?b˵(0B$.Th<ʌ X(SjDI"J|TνU:({  0!%:VBE¥LCK)/Bh bԁang#SiZ,(΀PVPwVj2W7=(QQeCJQ? iߟlslߴL~>VXaHXRi9ba.gvk h:Uj|V*rMMte #[m'9clf%73ks=VE(j;ѕݧS<%gNO;^ܣ=Ra'!rV/^r\;Q]0%Rӫj? VHW&n_]u̸> UuzG"jf×4bbh" }^D5! h< =^9pF?+,# cS P7qفsr8s-Ȼ*%BŠJ&ꐸxNO>^) ߡq#JbA83aq}Bg?r+ 5R|awkʔb!4X4qevmfs-tools/.git/objects/ba/2c5d54e699ef94e5781cfbc489b6044af0cd7d0000444000000000000000000000343611733543147020271 0ustar xYoF#B $9]$=\Ab5U%6kXu8{g}ޙy<7^DEYu4e&)S3*`ٔ׀rrr K9IJ@u!b,U<A"CIx$xOb }XpZ32OQ]aq.,P\LpZ Rub΁͕_ .!tԐ& XǞ9f4ÐkD -co|{0#|lͻULP4#c^܍]^7~$uF# vs8# >6D5PAܐS783i r=r~Y/i&iQ+hMvZm1=Y@+dL$ҳxjQ g`??C:\,P)!>m,Glho mFcCfn{M\34*_UKj䊧8PܡïCOX:Vى| c ޽E 첰pSrt{~ EL!ԚpNqڍ>4>5QOoY(h,iHںKKe(!zMC뜶?QZ>bZݥ t"oI;U("Nzg #f(\KS Q--GArKSϨ>*2(cxGJz\L-;KE[ˊ7}v=FgLv+Xp""uwR+UwKHY&(rz`}}\n~G}VẢb]hIDHUτ3295Q0DmήfNx 1Wyo fŚJfVعwõSƊ ^]Uk{J .{::eTkw*8.I %_^ uKp['|"9^/B<8/ҰeZ 2%5܍k7hgas8oi 64R+fk=3AE c.7 ~}kVQ-4(DZ[̗D|Y*G%%-ܮFnTӴXP(m\ɣ,a䯀=8{P/2>D={x E 2경/m|3[G&Xa >VX"aK Kq. ]F,&'̜٭͋ iQ;{uG ָ0KZ_mIQIfN嘀;풯; s#QE(7j;ٕ}OiyOicBėy4XP\;<{sWz =;PFTZޏ-)^ulT{qD}ֶhB2PuC}c.z:T.I0z =V3nd CqvG}r */IAiH^f_Y_ gRV1"}N͜;D_36_3/{hdAQ#qvV+C?){'5E!T;49z8T9,3[ϟOX^HGNuGp\.ŗ9qLU U,1$ *Yvmfs-tools/.git/objects/f1/0000755000000000000000000000000011733376360012666 5ustar vmfs-tools/.git/objects/f1/74bf7107dfd779d45c2d7a19fedbf3aaa258820000444000000000000000000000336711733376360020264 0ustar xXmoH* r!^/I $Rdf ^˻%oٵyHUyegfvKx`S0]p>x'| T`4E p1),hQg\D^|W,΂#4 Y<:Rm0b;Ӌ <1crSk!TY Ro*q]I =$80O}KLС. 9M7|L(ђ>31WwçZWܟ3\%$ASDƸb;St_"t+T۝V{puۃޠ}qש뙷{F!G&lp }(!@ۃ 8nX\L&0ETS^> E੢ۋk А,34"\*0 TX\|-4ٴnno*Rn|d{C'4 e [U ݘFw4O[(|;-_[b`XP_rSnScs,:Eb!U,yV)>~B, ܿ|_DlyE 8}nIŦ2)'v_8eT.#~r$2 AJɱi2XQJ ÑcCܘ#ū.2 H?KK$bB2n~Pe dr3Q[?g2 &)HUJ, P'1"[F= $s6n|=\VvOEgr^mq1\ aBp!DbF:WFvZiEJ] s%^F.:Zo#sp\ڝFQԦÒjR?;)4m6漯!ۼF''ժN\xI  z_JjX.6yg\-Y]s&fy@_jVuG듻sFI>O4(*ۦǕj&ՓleLNYKSZ22gJ~[lk~gY/>h)\+:;7La41esӘۛ. s6닃NWG}ej׮Qr+Ǻ1segwnOˍ=+{%>}ߍUw앴:7v#< _h%_T{6L7'J|<]] Ns_X&HUsT B:2l?-m W>mwgy}:{s~jPT!9?/-3vl{f_ _"lBc*|=|F4*51Ԥ<i'/NN-yj +\AizYnZ1ۋ"[勛fq5iz`5>MeWU:+hԛ/'Ad&1,bN5tw O9]r?$gզ?L^ËA嫲P?e3KwYKW 艜P5%9 ?/la{쳻K)bݴT}v6ڝ=%'vmfs-tools/.git/objects/52/0000755000000000000000000000000011733555506012607 5ustar vmfs-tools/.git/objects/52/2923d57f3429d48353c62c43d3a31328ecaa8e0000444000000000000000000000026111733555506017576 0ustar x+)JMU047c040031QHHKOOg sb}3 [ih|S[XP(6ҳsu`WWRðmbM"YULo[yJ *23Jg`_ÊC++9.*275U(*I-f;s(FZ_bVnjIbJbI"@YQ:Os IJcuXf0h9MNYYiY~Ni.&[6ą\e|kڬ`v, 3^J./$!f:dĿmk~̸eֺ ļֆCﴠl~\|2Svmfs-tools/.git/objects/58/4e28227a6637f32619c73845742e2ed1283d200000444000000000000000000000323511733411503017303 0ustar xXaOH#U% rj DI7ICof$$CI;o{ ~٪<|$TcRǫ>HBIgb4`zVlshȠŃ@(83a&p? '$lȬ7FNՏ)|5vbvD>(\Bp^Y *_9X`&n=pE>,Z8@K `cx`߰7 b: FdWC57.exb cceH'A8>{7=_z[d58X Q㊝HM>!\5ghR?mwڽ; ZuӲuӅ:n}v۩w7VsGC:y? <,k@ N fh e9*5:ۃ(" RsBv*E뢶O;7gE[Yق@x&#&ɘEIb4`|L-/ޝٴo;CSBpT < Lk>J7DSjxr͛~Uè|;,Ҷ.ڭ^5t} lMxxd{1j޹mV}Rj5Qא$K$`gp"ڝN ]d.vׁ;wVYDjHJg*HvI뜖I+vAn1Xx`q<"8Ű t7Ɲ?"7֭)ۑ;Ah3v~;12Sej̲EDi:w{3t~ &{LZz!=]b;'a膊]w82 o5b:۽l}}y3[NzզAb^?D*J#oQA4Rȶtm=V&x i bOubޯsX lui_ XkNJ4\%L-++5Yr0FC+$PQ#y,Xwڶeܙ^n&BAZ,r_έu3 /DGJF:":fZd <fIc 4fјi,{,3:37ԙ|\3sStfH\3{uf@g tfљy:+~)Rb}cj,9zRÙR/zlZ[WƆR[V&k-%-FZNjK"}=Bte_e^Tq'&ёe]jP-i6KcD櫞!{lsܯDټ CrN(f>yrl-8dH c:MS% E@Gg=-{aU+VT;T̡3gL=fhhaR0g!"n)?oĸ>ode?\W dc)>q55UEZi)&_(+svmfs-tools/.git/objects/db/0000755000000000000000000000000011733412720012734 5ustar vmfs-tools/.git/objects/db/4c4deaea315bab85ae95844dc0406786aed55a0000444000000000000000000000031111733412720020274 0ustar xڕj0{W-{{GHڕcE(}KC>ǶLJOV,`N`drCLB\L-E4H%U8OJ{). Mo\-9:۸o~vy[yG_^LD Tv[/L'XqhY>9Yvmfs-tools/.git/objects/db/d80614e091373bdb1e51d04985c1e7c0eb31250000444000000000000000000000044011733412720017704 0ustar xmn@Ema``6A.E06.OnNN-R`(=&5B"ږy51uK e nI&ձXBЎvC)V!3- lr7t13f3)%Ļ[3Ÿs r,fES ņ Z,'Bgy̝ "Ҟҹ{Ggl硽2l<_]|]g&< åĢm'Ӊi _LFeNvmfs-tools/.git/objects/39/0000755000000000000000000000000011733555506012614 5ustar vmfs-tools/.git/objects/39/93a58f8fcaaff441615d7e6dfbbb6f1a303df50000444000000000000000000000017411733374416020332 0ustar x+)JMU044g040031QMLK-.f⹾d+?iK*375U(M+)Kf(4:?MԤR k%PJ*Jzx(Lyho0vmfs-tools/.git/objects/39/5739bcded17f5fe600d0b5951e287135e881e20000444000000000000000000000116211733555506017700 0ustar xڥTYs09bgxi18JᱣYru$ uҴfڎ绻K$m8}=rxp|9DW)/zO`3e5J mp>ڦ94Jĺq4;p$"S2 wA5n YE^6acgj{y|l[낧!8E72fg7i8cwt^YB A,4<*wcT;ws/0:Yp0`&3QURȂ : ! ̒]AzY {ydKA=Awx˕ }R]_b[1Z8yWOo]4y6'wL5LWvYK;N诧ܓlD\ugH`  TX9!lPd\ oȓvfa{uAd)=Eչ/Cڙ/5w46g;9|f*ME KOp"Ȼ/0cw-dTPR_!5KƃklJ/Bvmfs-tools/.git/objects/9e/0000755000000000000000000000000011733412720012664 5ustar vmfs-tools/.git/objects/9e/766d7f3e5bc9db8f091f551e90fc9d3d558a0b0000444000000000000000000000346711733410560020214 0ustar xYmoFg~H']!k . 05Jmְp\_~{gLZVw^ysww S7O<92YӀ$RŋNg5h6?,\xFG SɕFgH ܰ0$ g?O'4$NfԃH 8Z>32Wّ=1@aGP@('D\ i<K]@&u=c1F4Cs.? is|sw?|nF QD2S41ĉK UZ?~ v- zw#hygup~8: &0sΓGpÂ8<҈hТ:}"& 8!3!z}>NTQ=ȌT>n?7WFda~y 1RDizv- R=~0m>@ .!'i%}4ׂ&!pCX[?/*)d[7޸:44=-{Kkp߭M'dj!SU.74}''H$u_b+kiɳf}h|md׏_ExUM! {,2J&kʥpd4R!.l3gEC77] NCM)E0iPDNbȮh9C0$& %$]"$g'(@\*]2:w1"1:=/HVJ,D(Δ6"Ɓ |ԛTWLm?WkJV&,j֖p1/_ aʅL7029AA3ʉw-ҵ]M19 ..+\Iq.̢ް}=F+MFZ8!H,g5}Щ4,)+(N찜Rʘdp]aH$fS3o/^[\04Qk7!_q ACtj`<](ܽVmjkah60k5zKWXޠi<\fǸ(ǢHc\1',tUa/7:dg3٥/YyTQ\eXQ&S‹gl(€iҩ!ԌU^{x߻to{+|t6wWVZ696k0Ҍd>汔iLX4̒x8r̸aFfP*Lmc 봷 }m^gwiZ %[qtJZ.sdmUӇrۜNmH˵NYm{(j[ѕt`:#.SOlg]Mqִ~ B` #Q2[oiVt#rB,8r"?k0Y.r:ު50KԹyM.Sӑ| кύVn9;)&} ;‘:i/D4y-^=9r$~)ZO21wM0cQsٲ~b (*P|#N%qLG>u߬ r.߂K`/13nepK HPUG K]S,gBGi|5Ivmfs-tools/.git/objects/9e/2d9e0b95d20a8c9db0fa13409f05e91d196aed0000444000000000000000000000101111733412720020142 0ustar x+)JMU057`040031QK,L/Je8t~2m{ťz_l]U SeX!CˠJBsS2sR"<>_T{6L7'J|<]] Ns_X&HUsT B:2l?-m W>mwgy}:{s~jPT!9?/-3vl{f_ _"lBc*|=|F4*51Ԥ<>Ywt86wGM+(M/M+f`{Qdb|q,~|&89[fJJs͙z$"^ԩfn)縫XQ6⌹vx1|Uaw꧒t~c)w:k*=S$3- {Ϝ}vyٿ?>ClYVZʰ/0w_gԿ`~vmfs-tools/.git/objects/d3/0000755000000000000000000000000011733412720012655 5ustar vmfs-tools/.git/objects/d3/7ce7485ab763594f08c67fe3ab5bdc9899c0b70000444000000000000000000000030411733412720020122 0ustar xڍνn0a\őJ&TĴR27U8*RYƆ^M.3}6"RS${X^#u-ņk3t}ڡc:r9^Ebxsk?^Oеx qi,ˡ8[oz rA$n!VlBTKc+Znvmfs-tools/.git/objects/b9/0000755000000000000000000000000011733374416012672 5ustar vmfs-tools/.git/objects/b9/40bce6db27f96d6f405c791beff35b8b651b6e0000444000000000000000000000755311733374416020271 0ustar xkoF>Wl\$ZkF?Nb6\J S$ARv4fri)h{$&4ɦd㻿 {d/rʲ$;2!-K+'g`yE>yOr DR^,y} wE:_2",Y;JL)Y4^&>`kr=W F="O`}AZ|5L9z5>_Mӫ+r%xwu)a$"BaeH$KgZ1 d4|R@UtJ4Lrx {X&*Jt0?4-S`oNgַU9,jV9-0'Zi?XΊ!`֢M߶О^o Y4#0 %r hL`{˰.`bˤ9a] +_=\еЧ!$N뒥7/&A,(?N.ٖ@ 9iZ\C),&`@?=^JN'sAY;;JsR4hIf -tuܔ`1VUd`&0lOZÉNW R'99Ϸ{/@o~߾;9o^z.~ 87>lḂnGr_E@Y|SQ,lKb#m@WJޜ[swqiG7ffP}s| p)ҫ9՟9 o ,7}8LW& @ӳ0o!έo |Y"z*EfQGϨ0L!c`Q4@;B (Ɵ jTPU;u$O^SQ+M0sC(!{N| L``gyZvd g{ȠݪYvGlO5 ݬbo :OO~|[6J0~_, Ę{>'^$h9Lnzvh%1s !f;򳿫IJsBJ:ЃbS%U0wTT[`p:E2 7ڿ\۝wa %)Hrɸ wb`Rm:˧Ry>P:37XHrԁ Q13lSJF1a LeN"SQ4Ē m&|6vH/k^#օCf{^9򗎲O!G<+X{hSgiT{Hp0>\#\ ? 4MhʵQgZq28UHR, *??_a9v'Bÿ(sC8Td˝m]dcex+qأ6$hSMd ~;˫IP: %aF ̊*n[SYRw~W[C3ќbCaxVSh@|$uf*P +0]vRh*ܨ].`;1w4ly;{}-]{V BLAPߘzep  X6]7vi%A5%`fܷ`4hgEdjW+V!t5 q."* =%o :F`%DsXeULpo4. ^4QԨ`}dH445QH%|S4;dG0 g'\!DGB NG/'τcNzO~Ё'|lFStI5,FF*ruGkAp.ÍD Ro BYtTXfɊB#3X&Ss#i"aU'ɂV𻂄&nGM.o"kVحUhs„CeqmeܝmpfQ TY=Gfg`'6[c} '406Q-Yg1J@ oK嬛vSc͖6zz7P,gj-&!5*Ԝ*ቯ*n[e Pin@l뎹?Ѝ''pּ̣ߟU8 *<Np$x Vd <@ۖ5N%/<խrH6rrހ"g,m,E,ktr*$wx,JvOlr6v&F!W0uq)%,ݑ/ʇ\>qzx Cvc0D8D˩>s-ꬫP]ay@lI#9 Dݴ~a_Lkbh>񞴽)U\S(IG gQ.12<& Ie%:p! $\[F]4T*ms]uݕeC7*dqw:̚zV߬2̌ J3!x t%3XX)81 89˻e {fm.(8],3/ZXG=Z'd=hɺɪ/n]Vƅ({ f-K˿VkjȐLybHo@5&y]Bgʴck*׋PM Iу,XAB<5 T$ʖؑRLY#qPx*$?[!9O9׮}A>otAʔKlpfS-F9*8H=iCpD#O#LںTfMt'l6_&ufCvKYTF62&0q=Wwo/ׯ=A`}c {ޅq>AIY@e&8๱]}R~Y3{E6$g/Jxj0鎤U)d|zy5~`?ׯoذW > 'g!ȩ@:zERbʻ(x+1,:,Ɨ$G GF=>yQ۰KNujZB<ȍ"3r7G-~ޤ*#8G.>:o.OifW39qrcN75#D`{2]@XԮMcr$E7xfv*O<~P9ş\Ӂ~G1܁#wp?U̼IVXK[oͻƱHBo9j' uǰ9մqNr//ڻ0BgReq9?}hvmfs-tools/.git/objects/d9/0000755000000000000000000000000011733412720012663 5ustar vmfs-tools/.git/objects/d9/7e89f3961de313c1561621e1809ad2ba2003530000444000000000000000000000026111733412720017477 0ustar x+)JMU047c040031QHHKOOgh}ZYz as K&8_zv{u*Js-R̙w)[SX DDӘ 'ث>8Rh̠}_(8rrw28Ap?|;$|m0Xb;Ō1;HCI"@ 7%C  ?N/ᔅ,}0.tBtGCmʡm"4q,Fh l+<_ӝonA*C=V4FHqA"A1| ήP^~99Dc58X Ń爌uv>!\z'gRot Cu0A[y3Y78?Cw eC"!}th.@ǃP($NXZL&0!UDV)j&^[gxlf _$krhVy[e]^]wCt!8E@5²8 ͅ)xH*6n77tc)<FaiEV[V{Vo->4 u,x cs@;nPQ>"PNQYsZzbUB$dqzXЊ'vZP$zJg޻C!ϷG`?o* CJWc;צG(P6c-)!, -#Rg1GZWQ]T.  b|$LMX-qB%;u[QAKNد(kb2 I4D ҊGZQ-#ߞC@b.w VgкO/kO(1žpoQ&TԠ{ 6-JatZoJṋUKoуJ9ޟ-x/s/NzoPG.6aRظteZSFJIjR_ˊ:i¾;eT_$o9 U<=mduydkٺnˣp! RQ_{q.*@Liol "igP 4479 -ih>ACs[OQϠ l,BED|]+fw?~-`"Z.3_hn,L% LDcr͘T&&ֈG0bJWg6Õqd>+аR*PS-R.u(>=?DD!l<¯ЉXs-76S'pdzYOR/xj^FO,ٶE_X D+ǺeEOĉM<^%ȿ"!L~g,Ręǭή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lcFif8U+r&WIjq^fn:ޱoz;XtЉȩUSZS g>[ZN!6M+-Ne8,Q$zm=x1u8$59e Z11.|)ۯKvmfs-tools/.git/objects/4d/0000755000000000000000000000000011733544145012665 5ustar vmfs-tools/.git/objects/4d/97b756972b5271b7284a4120e1b0b198a1e1760000444000000000000000000000026011733544145017432 0ustar xڕ;n0< >A4i|]id 6" rS|JY0 IFat*arƌHz@NyDxIl^ޮ[:NKy:-z Ozkoh(׾c"v4zH]DLjvmfs-tools/.git/objects/4d/226b0519309172f2faad905d1695e12bb6d22a0000444000000000000000000000043111733412720017623 0ustar xm[O0}8ڵYTxۥ]679ɗOEx'-$(S2bņ'S"̤,@LPgF4K|/'X~>"Ҽ-O`1J- rwS܇)u8?;x!ȫ,xͽpU{ r4盏}Y[Bv {wlBN XkWب~,w1ria8MOS} 6upUtzavmfs-tools/.git/objects/info/0000755000000000000000000000000011733303642013304 5ustar vmfs-tools/.git/objects/35/0000755000000000000000000000000011733551143012601 5ustar vmfs-tools/.git/objects/35/567cd5d3c5978ff970bb6d5cb8dd6c4dbc68290000444000000000000000000000025311733551143020211 0ustar xڕ0Wlt]۱-N4|Kb#c \=䶮uk]0A%sĒXؽlXe`Jp)8N%DCB IM*>:'qŭ 5O{ဌgoȿEuK^eFrW/Gvmfs-tools/.git/objects/b5/0000755000000000000000000000000011733412720012655 5ustar vmfs-tools/.git/objects/b5/a9cb735396b90ce88ba7a5c767bd4fac8bccd70000444000000000000000000000037011733412720020406 0ustar xmJ@O1b Y0Dx(L()I ޖĝn&7 vN|S)SmW}ՌQ ǭIK۵?@t⹘oe$Ms`#X,/e, 9`ےD!w;#z.w|WIo?/×<ۻtTAHDO>@G|>@&^-,1 d!E8y⒴p3 4^Feh#Dp+sLӟ-Xdt=sorv;4yG7 ~İ1Hx2:S Mʒj,W.C~aa7i@ l"4巄p [vʈ T 31 ,Px2 jR.jd.Ux{P~`KiMdu_rU "&ǤPv>I8۔ϿJz|~r@VK'EwC?ȜE"#^NH&\5bC~R/3}//xq5AU:;G1ˍĪFt䃞1anUUf3WNBeQÅ[ Lj:%#9b8w?ݍ/ϭC׶;d" _}ŘФb;+WkU0ǵ*59لZJuE&Ti$7"]7Aܭgt$*ᵽ%Us87njnM1>;"xb^0a3G̪+X6Qdh-MxVV^3ĆVic%e/8הHyRtc834vnh~d@G39u9xb赵Z)a"ajLFi9T5'E>x: MrZXb>;E 9@k\[O <@\=?fz{V1VI1+$xMe's F(ӵ$PY3$oO2LcxPCS cC0mN(z[ac]S#bjc!jGJSdeBS!,hRiuoqp}^fJ%TNGfStBfAe+T4jm7'MYT m^6 r$4d!`\J7U|l[1LD6LI ja'uqc!sA .eZUש $\͟-7 %^MVnL+ٺGU5u$oKh&YT0;TqR/"=Uk1E7a t56,\MQԋDj-lTV Q+A5Iv _{0 re8}wED5Y1i,V>]0)2Zw2Q2ئu(R4>mkv]HKMxY7pvӴ0(Z5@5?;,`gXCh5!z#같#u^[!Rp/r񲕟[ʛz}߬ro|Z{I_Fqyy!;].N.gޟ˹nGჱJ몍[£V2΅7YҭJYon@#NWT۪Gz{vmfs-tools/.git/objects/73/0000755000000000000000000000000011733551143012603 5ustar vmfs-tools/.git/objects/73/e193589ddb32f1386f51b053e63c72912acf580000444000000000000000000000150311733551143017604 0ustar xڅTao9# AE&E mwZq@t<{33v,uLg7v@m}봖RTNKn-} :^XΈU5%F+zsH7l*Dj=6,΂^vmfs-tools/.git/objects/eb/0000755000000000000000000000000011733535574012752 5ustar vmfs-tools/.git/objects/eb/25508054437ca5eec8dbd29333a507b7854d3b0000444000000000000000000000043311733412720017724 0ustar xmR0E]+a,I_!8PZA]I)Kw՝{gΜ&)a+x@̰M bڶܦє40SUU693H5|aP9_~$2/JSuNC调t';G$ۄt{?;xT2F fjkκ~) 7t_]-X4ϛ"vVD?|Wn/yGa88eJ H.VTTU^8(avmfs-tools/.git/objects/eb/7d272a0087750bd65e891b4a8d0bcf6e1792980000444000000000000000000000104711733535574017763 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lrҵRY w4oaWIjq^fn:ޱoz;XtЉȩUSZS g>[ZN!6M+-Ne8,Q$zm=x1u8$59e Z11.|)ۯMvmfs-tools/.git/objects/b6/0000755000000000000000000000000011733412720012656 5ustar vmfs-tools/.git/objects/b6/a2216c9d582edf826b147d776a107a02ed850c0000444000000000000000000000102311733412720017717 0ustar xmR]o09bxhKr x9Q)Gūcookog}GCBJxooS/u" Rݱ'i|Hlm@iD&ZKX &û!|>8켉 p]}>3,AF 32]7Esy|f- ٻvw+R$c-궅$:"^ Y1FwRib!a9e`2xDp^6=qiqxhz#I֣* &@ճ`u#LMxL"B P:`34ڔNF-B2XS>_cCGbxk|0]@0¤ 1- v:xRC5#VJX'urkL%x֚#i,iH@C%aLyв tXf~Nn[{SwFΛ$4$vmfs-tools/.git/objects/a4/0000755000000000000000000000000011733544145012662 5ustar vmfs-tools/.git/objects/a4/193f45ce0c827536cd570076ca09c27eab255a0000444000000000000000000000526611733544145017737 0ustar xo۸y?:9; ׸.5.qYC([$zkH-ihc~3x`7:0߂e,ៗp=X &3\G|!8kÛpX}.{ύ7\z > `kx,~VxIǣ9dŰ<G7b bCXl+9H>f` @D]A]KBE C ʗ[xBY>\'3߳³Y34 L!pyGĖxhp>oR <"$%|K{ϥt %_D D2P0cM|Pb8|>']Y*/XbF"+kd0\gtx1ܡ0NF\OƓoW7;OD|C;{@m@H,s-.0t!„ n!]V{0!' I=&.̧>-[hw[/z!)4[/I4y<Ƣ(e KFw(;-jf_3+F% o{!ǥu?EҪ y jVˇvs Jh^< GTĶq`w]Z$ at{qα2Ŷ|r($yIB"̿ .zNQV He),'Ș(5Pf(3EZK($/SIm/,t%ZĊEH*X6%x҃yP [TȐϙ@{vTaCCR Ȍ|Ԗ —D(}ʧl, d}2VL^ݝPi$!J"OSU鏯7@Hl:^|0_e+4$]S* > :!7S*SVRYOƼ#5q_%iLjK4)zJ<Jǖ$]^1!rC-fQJ .#,魸 ˗/"IaαsxXJRO+ ǔMe[6|UP!SNPmR[`m7 `kܡR&Q+^2s[أ؏O",)MUD0 lJL 䮋O/zA.SgQbZ!KMg=I$4-JryPR}5fاe,2j##6tPK"}FdJRFZ^i+"efdFqکt5-ejy\L(rDJ AZP 嚓Il"FUZ֋ᜋhsQ(/Jx{n~ӿ^2I0'otrv![-8W5^cdB 1TT0J|Qi+f>ssIxU^f#L\odK}Bӏ"|_N&X3 9fLBb7&|WH\O:-N gNUGjiӡ -}QJ-tōi:Rl>R{o;6CfUlhJXE?;sچZ4W_JLVo/~p%^=Wb&w!d\Vt4Y?^L9v12VYVUڬڜBz71TjI<' TUTɦSLHH⺟4Q<=Qb )=Yv_Uh"+ʹNȄrtuhᓎg7thpw OQz*BAMLD#ozzIr5Ug֛Re1s˳N4b`@=DdT^NoI8OOGBn陎|UHʝcqUn%]012~sXlGRm.]d] 8`;gڛyR4Xok,ږ/1WB*}ԿpPGԷ?csȢw#W-o#oRSr-WgjQ i2*`퍉qmJ,r76z&-o./dKMQA&gz]gz>#{ӛ^ՉI$,^hWIY迎=vmfs-tools/.git/objects/a4/9d3e76d5ba5bdaf465a490118fa56906fd599d0000444000000000000000000000026011733412720020106 0ustar x+)JMU047c040031QHHKOOgp`e=VRk5k_#uUE@vmfs-tools/.git/objects/3a/0000755000000000000000000000000011733376054012663 5ustar vmfs-tools/.git/objects/3a/4de4161ca6299d63534142a45078d2e5da2a100000444000000000000000000000313311733376054017554 0ustar xXaoH* rM^B$&:ɲVȻ%ov;*aw͛ٷî@wTJ/_)! ?m&RPéOc>)(VV{K%#mBL |.sl '0pO}ɇ#.aa섀1c &N̎`*b61wŀ+@!O ǒhbPP8 |Xb'3qA{,  M#rjh+m"2q,Fh (b_N!pu E1f4BHqA"A1|ϯoP^~տ=Fc58Y qHM>!\zRot-&NeYоAz9{`k5#1H0sp<1 bh٢" '#Gd2F  UK/"F>/Ru@ML3Pۥ &[ `yao͖}u}ՂߡfOЃKX, ͅ)xD*6n77b>Vy?j.lCGU݄GұuOMw6:@^BXr@;n PI>"PNRY@k-}~Jh}U)pF$BTq:ijuS,(zI.;moؽ$FzNgc)?p0ox |O; &q)M'H`یuK@`:h6"NlОh*vl; ~ Ԅexpmvr6cw.+6n=o|c ۚ'0OZΕz!*Jw<Ѝ8pR37vߺ/kϬt&wzfAb]HD**QAR!ۭ8JqJ-jP)0zK8싁nޛ?#s RظteSF*ujR_Jwhu[w~$0E M&gG?r4in=Z(HVF* >> "Jq*>,zQ]}Hzm$meN(Y[Z6w]emnM6T3dm>C66ڣt_׊Uvz ʮ|[+;  OLy;e/m3Hs3Hs*N#_W5xx`g]Js/߱P9c":cа U wۢM()M!iӣ miB_| }-N֚].G?~{WwMBh53.Pׯ߾h)%l^DgO~ T-).҈LK2>&}/4MwC0<}py}pg1:Ynfd8yoP[w *Vy\=Y0bwd(!\tmjE6ir0v\7EU1ÿq|d;d  2j;Z(4yπ֊e?)EEauB^NR/`;)4Q1D 0m<"8/pVܶ߁|<[$IQP`BiY:z &<&b!u(EmJ'!m@1J15>. TTaR;P<)ѡ+%rH~֓:zDԵy&N莒keK K)=DD{' HlYqm$ӛ_/nog]1| L0 WD>_ (g7Avrzs~|}N.<9==;bWNJϰ>Lzl =2$G瑷bF}`}l`ᡞe}{^E,d?}`% oʡ> ȷ"lBπaR2Eg-d4œ3[:i9\K\̷:y 0@GKD_D`o_[Stbi]{64 ]2#vהE!XMjO 8Q|nf0@YۥߣV{w\#4V<۷48OR$Ypn4q9Ð#1⓽΀S[MG3+&=&ܢK73n6x  p[0[}}WuzvkT`G9~'BA م_ csO{[lE$fCt`/<}`}B AJ٭Nj"W BoOnc,W \@m)CH@_,6!8E6Yt;%qBG䙋?ϗ9ӍH=aV `F&[-Ϝy7֬6#VOuatR.ATihSJ/l{kٰPגm %7y,@4%G 8")\( Fܘ5Z}]qNUs{'șpXN#.f˅lsg;{f~/ 0wirSxej1 7&7&Z7 iDڀho)hR^6FKAO)T;0e Q=Ka fD&jЈ?v.X|V챭⮬qU156&wF(^ݭE͢X,TJ6(vk;:ݎb}ƚ54OPECʯ[Wz_Wfç}*;X %`u,᏶rܿR\n,-*aI ؇!gR4~rzv6H}^# \'GiD -m`֒ mT|ͅ #-wq#L&+leHuO>rRY% ZзήI* ;1 "T" d÷A AbVwP X#DiD5a*c>NpE'"Si (ҁV* ` O'AlvȟnS#1Ϟ`u{2l6h,f^?.}!yAvO=40[e bǹ sGRYga75wipy d'fsgIKT?Ľ%8w̯sy"v 1+  B*쌙?c&fݮtԠR,~,Y;XgDG;ZLa0 U1˜`#EQpc$ |<́1"DDva)%*lOe}_"Z>0yY:hm&Rb1Y~g\+}ȜT7ȳe tGcⰀZlj`u!NV8G;9Nb4F+ejFNq+wB@jNS k. >0e,*a|˖TP5 [G7TFt]'t'ڋU0:B̏1lW$[8zP'K(ph6AGR2h@yG6ΓW8bķ,5%0 "s5}.ķ͹"mpB+kcr1jM.NLuvyV d!'\v-|jy|X}֪އR⎡r'*i}q~ѻ4(ſy,7ڍT{t Hm##fgybB#,M/|j^k7UmwVRvgnmz JwZw(I`EyG1<~ N ~#ͺ,8*W,z tY.[sZCB4K\ʾ]q1W(z\^ܹ\ݞ-s&ޞDQ3^MY^s)|+Cկʢ̮ -IЉ:}{}N@_0;#m̙/[^ʈ[ی!3ڂ2i&NYɖiK8yiNy(g#M6tFH6Tq׮ɁTx1:-cmy1=R=jI8_wmsVIi\{d!Q9q'o |ӛ:3t'^.}$ B*yP,AXI9&_C%*'e-|ꦜU=/+[No'gWǵE|(^7-3ӳVf{>q y*(m 8 R[ojά/ײ9J vmfs-tools/.git/objects/ae/292b9699740f9aa74b7502a0d0a5f3e8d76a360000444000000000000000000000024611733412720017741 0ustar xڕK 0@]$ɯ ҍ!MfjX)-<{i.ej72C,R=f%b%AMؤ` N0aұVD)\<N?/x<-e7"4l5j/ߠk*9X}Hcvmfs-tools/.git/objects/d2/0000755000000000000000000000000011733411007012651 5ustar vmfs-tools/.git/objects/d2/5f39d7c1af24cbb965b0c89828fbd7477c5ee90000444000000000000000000000027111733411007020177 0ustar xڕ1n0 E; (1Pt (JVCn_7Oj)ymtUY 㒘0-D&gwx̣ jB),^a>WQwsm3")_+)΁)v+4V݈*!}SOʼn?9q<ӻ(f妖$$$ 4ľ 4Y'Uiʏ^޴1mu{MM悼l"haL\UFW fǢ03D)]n`w:Mvmfs-tools/.git/objects/20/0000755000000000000000000000000011733412720012570 5ustar vmfs-tools/.git/objects/20/7da4bec6ca00c82ab56cc07862d72478b8e3ae0000444000000000000000000000101111733412720020125 0ustar x+)JMU057`040031QK,L/Je8t~2m{ťz_l]U SeX!CˠJBsS2sR"<>_T{6L7'J|<]] Ns_X&HUsT B:2l?-m W>mwgy}:{s~jPT!9?/-3vl{f_ _"lBc*|=|F4*51Ԥ>&a֥] pei l/,Vlu/n~sՏwBԤ'gL6^iV|9SoQZİދ: -<wZ r2F1W09{/ʖ#NCTZ\w,e>Vg-]%t'rj@ՔdaV?/=ӧpM ktJSkwLw߿;vmfs-tools/.git/objects/20/0741ef5c807274a7e3560cf2713e530cdf14890000444000000000000000000000102311733412720017500 0ustar xmR]o09bxhK(Br x9Q)Gūcookog}GCBJxooS/u" Rݱ'i|Hlm@iD&ZKX &û!|>8켉 p]}>3,AF 32]7Esy|f- ٻvw+R$c-궅$:"^ Y1FwRib!a9e`2xDp^6=qiqxhz#I֣* &@ճ`u#LMxL"B P:`34ڔNF-B2XS>_cCGbxk|0]@0¤ 1- v:xRC5#VJX'urkL%x֚#i,iH@C%aLyв tXf~Nn[{SwFΛ4!vmfs-tools/.git/objects/81/0000755000000000000000000000000011733536200012577 5ustar vmfs-tools/.git/objects/81/e2c7763cce4215b28bc4b80ccbcf6a917618240000444000000000000000000000017411733536200020006 0ustar x+)JMU04d040031QH+N+M++(a(2as;odTn{8N 071/3-D/7!Qf_ܬͤ3JlTȨx ;<37!RT<13/vmfs-tools/.git/objects/57/0000755000000000000000000000000011733412720012602 5ustar vmfs-tools/.git/objects/57/d35227d197ca11c7ff1fc55b7f12c8622522710000444000000000000000000000026111733412720017565 0ustar x+)JMU047c040031QHHKOOgp`e=VRk}=)^>N_`PhBGbw}?;.q1.~f":<8HFoJlyi2bϓP.iXX:j0d,˻Ў"Wz.J-y4~:Jdث!볞({Z$z|w J~b |2mvþYg?,kUD=u7:j27>ԉ1w<>yf8sdtUH!{YL!C`}31gf,/LMK,buAɸX+MiD$nj%߸TZ:3ż9oBi  E3=3c<#Y1vmfs-tools/.git/objects/1a/0000755000000000000000000000000011733544145012657 5ustar vmfs-tools/.git/objects/1a/e514130372f9f272a094a7149ec20ddf29ab510000444000000000000000000000104711733542455017642 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 >tI'N}\SpUpBǂ/6F,jx$וa>ohSLxl[$TE?COK/sU榦 yi@? }طmեd3k꠆f3rWc3ڵ-dmU(&3o{cg9EZcQVVx9'MGv>5LB&371=AQ2kOta(L*JMLIMa3cL-ni.WGA,لlvZ$D/37_X7}ZJDOԀ)-){a 3g-g~^zoO@覕2({xwζJ\.;* [700uw5Ìvmfs-tools/.git/objects/1a/9e28bf5ddf5d94b569480cab62ad5af3d377bc0000444000000000000000000001146211733544145020332 0ustar x ˌ0#h/N<gϖш&$f4$WF4gf904>ItD Btqwbb? #4<$@!z$NIp W>iݒUH1x+JXО )Yty:w}ҾzO޵ooWMMch Ya]e0}pyv{+;^=,t{;ҽ%mrӾN/ڷL='Af#2))# b=? -t%7&Qy$Mlq;(D{3$; m5"d2F(-G%Fp;=%a4$bsf~f?Ӕ&רq[[F0QA4r&8H? gpT (9S?!r-0$s}-B2j lFtPnAlp :߮1F~&ǯ_s;8S{JŒʹ9US8Ŋ0߾O`c+ Ҁq@U_3~gx9.y57+c{GSxpLjawO`2ZXewRy+9,FJNЄ; w`P*,=u!Ugz*P'&TPmBUH-ԹT@Sְ X O[J2iP< 8D./@m)a6@< ǎ #bnf<:KRcHfpa[+y'lӳAw~uv:wg.Dx}IJ3aKZqbww*ʭ3DwG'";V >gG~yKwg8ʼnxb:f{I‘s 0%]fVEB 2Z s@@>xw}H+P\fQrWlV0 \& ae@3,L#DQ HgtLuKt?a # Ŧ}yAB*K|Dߋ~:vdsFJA_GbG$ hE@d<.,sɲveM];o ZjVgIO-T)o2iQKO^oo7u#l)H(3eJGg`]ѯ&q<ǩcX(>#XtzzuY;i;m\q`tPj"I3$EΨ:"f֧V[˩1AFwvق.: '4C1_rP`Lw}0`\$J<~" El 7 kuS[RICX )>fP;i<&ޜ?KnI{u0!>o-r"M>`1GX' 23bZWrJY9<|iw5+i6+ha]V>,Q]j0i V5ͺ&4r'`璱T{*T5^! nL1AϑiUb4l(3}7=_/ir@H.s[`<==a[ (IL🠣Jt {="7bbM]9ʙq6 'ӔdžcwP@BՖR lSS.U;ՈUPlIc4 y\\#6ԫ/V|îө>&P˻Q3U\dQ7TrbQ#,h2X V6lH G$\`~vj[ernhhZ:bпTJsr"Jأ2rtD›2SꪜO?A!C6f%E4wd߈}0Vy݂mO0,2M8"vgedߥۤ+*UpNBqrTwB&L^? XQH2~(z/# EplP:^7Mu93Y_ccwVI7cj[ i+1q.,Q$1I2(YVq I^R>3޹c VdY\BTZEC[%9u`hnTYh,X;3,oᑒl3eS_eڭK`KΨj:APt3*x Hɓ`o,)TۅܲV~Uh*!rp ̵SuYU1ދo'C2^51/yI/2CiSt<[uH鸖f#8b6?u;z-V/v[V{"!767`ga.*:LL5wKh^FZiS7eyLQ]UI[ik]pq9ޢջP+&WfVu8( T-V;$QZoj+AyeRAՃ:yL l"c2 h FlqJh.Y`:%59e8C= BnwnoX @;pYf_eRUZAZI͌]WĔW]p+9b%5ǧWW9I}%q` W"WEmdB(t-}A5U\UDZ3yM0& VիUKUԩ6,RU6)O[r7Ï屈>@L ШnY9-]su]\ %Q>ޮnu=ՐLUnw0oJWSE^5^*kݎ9syZʑsM?Z̚IPkK$BV Aӭt N.ڷ]–h^Fv0D73v/vC7XUy&WI~6Ԛt[]{s!YG}M77K_ۇE]\@66Y̯IW0l}Nd~y4JXn9[iymWo+Z(pV>K奄/ۧJ[ArdN_V.<~R)|al-8*;p:vD6#bC/6INupzD'91.iz^ Qk^(r -_'3xhW3 -?f0/ݹXg|[ZhXPD\KI/1νbVKY5^%eWep!@GL8,R?5#ٌ'N`j!_0|X4E6 )<쯺o? d u V "ܗΤ8[ȟ=9GQʲv~O0vHpJ_T%>%ҷ2n vG4:yմF'oED ӑ|(!~*!|,ȳ+B!=M/ +Q n|- K`46ղ^Bdu/kY :7EGYy4jF+{vyC`wr%]8t>F>>#L 'S/ \1h^=.ح\5D'S?_S2:S"~h@W)!BXW ,xY៭{xb\Wp;]7+;^"Жʆ'h B_wkhㅳ7L59ԣ47_$_w6k&8kw:p~e>+3M&H+ :2}G'b w[3b XfC䮒 j|nΎZ,a,pG~y;Y[}\ ƮDմ"6̆CC0O1`3vy~[ gT`xDB43&tό  +mp){Ch"[<X1HsA"nFwzpӛz.l˔(=%];O;dGh G`>t=xߛ-F7|#Pg2<'[TaQqZEM @^m8hnoo jyJh&@ 2K|&C9n@(|'EӃusf{x>vuͱثDKf\]5`\+O67a VȘ3ɕy +[_ɟ&`y|ZOe'I*ѳB2#w]#B)l~C'!Mw$1#xJFc~2]\V[uK$ZxB[-'D87Bi$w!@ ݓU7/ug2N}PFV渒oܠCDrg w͟3/Mџ+K12(Vªaq0]N#P$aȣӫܰ,b*\+o$8Zfh\ύ]&pw()-M]@|H싊'q'/ueTKh.F7zjh|7TnAnF)TkDV^A[~-Lߏ Zаf QFFbr/.!E4:P#H*(>gz5菍xv22,L bqeژ^&ǍD_p4/294)A!dq{^92C訲{:n!Q=L b_ĎMd&n~Lnp*bQeIKL!,,7ӬO7!DO;%`m6g_;b֨2?Ey|j@6FYoh) NI@Z#~O Mn!e2r{^4gRrDR3D7tږjY[rA/&jV*W=S3kqVfzUC̵@yTb@>?ݬ#yJLQOhmثb :rl&;Ed9x3B%]pyCȶ|h$'Scvu3 0?ʳBVF!_6}Y􇌚EXNrgSnrl>h=q)1r̍ ޳&fv'+Aq5 ٔfjifWR&܌?xD Xq#'#,c/iJ%.%QBhŮ~}O>:7 oh|3k^ FL5Qkv;EJ0;/j֭{Ggx/FK?".HȌc.2ӡY#.q祴 ; 7PE"%$˽>vu7#;)3!W2BŁ=4rJ#45! /A'_eֽ 5vmfs-tools/.git/objects/4a/ea1f7bb609dde6d773f0de43b8cc5eead451e10000444000000000000000000000025011733412720020441 0ustar xڍ10 @Q;r%YXA8PA)*Apeǡ [NJ:f'2'#zSSSHQ h5hR/ pD?=LyBd h| 4=7ּ{.D9vmfs-tools/.git/objects/4a/80ce18dc425778aba8eacdfa8b56bb0f79a47f0000444000000000000000000000025011733555642020405 0ustar xڍ10 @Q;r!B,, iRA)*Api D*P` -1B^)H,Y}D+dVM]`0hmI6&e匙lq&.2p OT_/yXf=ض%5{U4>7ּDavmfs-tools/.git/objects/4a/ec64a68b348d3e79a074a0884f1a746d1282d70000444000000000000000000001413211733543431017664 0ustar x=ks۶RmYq8v^1Nz4HYlPIJH)iޜb`a{`}v$aƶ s&?o^}` , '4znp`4coO>)"=f}:,$>@uD ,7N?eɂMdygAn(-⁲E)g>4X2o?~N/0`ǙK1 +რJI<`~)[il$,IHyʒ9@- i~9J1%s Po0d?]D/?x~9>??~{4g K yfW-޼<^ `N/޾zwΎώ}x)'NB͜4%t H9@$ND-4.I>`LȳYϟ\ ݐ#vݍx.Á'_//>|w:eZ%vnWUoX}LH4Co'։M%ϼrZQX9M  =X5O2yd'qȟN ڌCS(v  3Os3͉~>x(O7A-NjS%@` !<TksO{@OEKpzC:3r.}[!=5(}2&];Hj8|UCR]k#24\|rRȡ*`Z4\P@[nZFDm@St׻晫=9猤s'ԟ$ǁyf53+MQi8M01B7UZѼ}W8JOxL%1 ŕW{kjKSܢh~z_m;;0M_8K'n:Inwng!ۆ(#r4@gN|wJH,o+aIO*͌tj]?nեWuh p |꺚g؛toGȏi*v݋wOytOȘQ [,Q4%ϑ]]]*JV%\hU$ua'ijj4gUqeVli2K6+seJj]Gj %95ت<ט 3/UKH&Uۨ?:5kv \ #5X:MA] LqH+30xf71y82.ZBk͇IRb®2&~.*I[lO=ڹBWZ蕻&Q8 '>]o&7<$ûN~lMOfņ9hitrwPiR|;2Cz kaXl!iT+^1pܥh;7*B;[DN߂};]{e+%7f~\Y`ױʝ^]yq/83}IӪ7]un~)(GZaZS5&c6e450Zn%f4N޻0%X5"1_ s3zBJ]^3oaIءQ"yvFf#WH)4`Jtw[H9'7l yZ%&8L.WSDiUxвW-Dvl^m *7*WaԤd!L6ö,= SaL!j?ճ hrVfti8`E*>3>瀙YW>|X0|SOV>Ds@R"woeWcCpy^RW.}Qj&W)~IE 7JnmML*ŦGM3B\!"(/3Q*UCfEvo|-/_TESZ d펒e۸a,gEK@ve:~f >uXDudW2)hG!磪dlہApb26k4!(~4mlcqYS XulӔ/w0tnw f}8R[e*A[U.j4s< ]^@4YLmo=e=2- /<zg@p1rHW{O[&bgpo=`N4kSofLCMǹ9!v)=32*,Kz pYQ퍞)Kcijq {]AWpۉ:ٗ\]P' R%;7/f\ŅEH ~Ux\7u]<s N g1}P۞U  |X- O>*|SD\w\'ĴA1`7>՟|-R_ {#e Ɠ$Coa2>̢3GYho|B\#lg_wq6/3c3'oq°UhK_@g|W'mm_/N~:;~2a* r#TWIwnmB1VJNj%TeȬnu/X~d]fQ]ԫd+H:ib⸽WήH&Փ+%{ۤ}:g81F aYGK\?͊ tT (L4$[\*۳db";(.ψ{# SD)㋚ЗVY 2&gJa|5p.k)]jȦf۳ܐ@C%$#n %QhA[V2\`sjԸJۯp)ƆKJ{*MjW@9Ҧ;0~-WD+7cJvw7XS+ʋ7^}&a{vmfs-tools/.git/objects/1e/0000755000000000000000000000000011733412720012654 5ustar vmfs-tools/.git/objects/1e/af5b466e93352fa566f2b35a1e3681262815490000444000000000000000000000104711733375666017540 0ustar x+)JMU03d040031QK,L/Je넋Xxi"+։/Ұr  fn ]2ReP%~٩i9 lïe{m=w%Pe>ή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lڴ)ُ9Ί(ꯒt~c)w:k*=S$3- {Ϝ}vyٿ?>ClYVZpXI:ۦ/{b:+qHjrr,'/?cbl]R_Xvmfs-tools/.git/objects/1e/4a872ca0c7704f195f174666d7956abe51cc320000444000000000000000000000035611733412720017660 0ustar xm]K05t*x1(حU>: I,I;6/=Wyή~ W'Ĉ/|,bo9gJ\]|]Nys_6+ɶEBU3trpn=9NNZ (onj^ S Ї}V]A=/j\^n6C!1y>L>]rNVBJjRizYnZ1ÊUnm[Z;4ͫ5iz`5<_ؿ>Zgum]"^ԩfn)縫XQT°g:džZN.$;]t lOHLҧ?*wxP<ꯒt~c)w:k*=S$3- {Ϝ}vyٿ?>ClYVZpXI:ۦ/{b:+qHjrr,'/?cbl]R_(vmfs-tools/.git/objects/cd/99286e2fa3619122c02375054b89cdd4a778b20000444000000000000000000000101411733412720017573 0ustar xmR0圯] `]qX)eձ'UV3nw"!%J<~ot:~wzQ=O%cbShJ#2I/E^o4> DaMlK_qd 5b#\jKrv]@qAe~C>ˆޑ]4seGڤvR? Usݼi^Wս3gO>n_'[/ɨ PhbO֊e?)EEauB^NR/`;+Q1D 0m<"8/pVܶ?|<[$IQP`ByY:z &<&b!u(EmJg!m@1\J15>. TTaR;M<+ѡ+%rH~֓:zDԵy&N莒ke뤱*`Xvs˛6;ns Ҳ\Mķ-l ݹh ִYXf0yf(߂? N zJvmfs-tools/.git/objects/d8/0000755000000000000000000000000011733542455012673 5ustar vmfs-tools/.git/objects/d8/7b57ff92e607aecafc54f7a3528e3e1b52470b0000444000000000000000000000332611733376215020174 0ustar xXo8+4iUV(z[۫hQn( XMbd;et P .MwQU~Ol{!c^1 ;X(d>>u=hHTH pSN# ŋT+p1TH6h0dND?3t+Ed aDR돨1gCF_Nȉ1LY'4ϩHT h0U88AH ˛;$1nvԇ6I,hZqFS|&C`WR[@(sx$\old0@Ts`cWBwrohGlc`#$ P>Ww}Z[ߟ1%$8qq7St_!t݋+Tڭ=VA 5k~]}׵o{>'McAl^,joQx}V1\ӑry2DQ9LADL9T.A9o^\;W78Bcw>8t`AX,f%x b r@6[v  P.i>PNPY̽kJ+Urח+EXH+p!KڤZtU |CtWNщ t0oJ3=evz{ #fH\SJ Q pznDUdlKDQb|pEDNH-,:QLR2f1"q0_|d>E:V!Ef<rS)2?ʈ`ΝVљ/+l.{P?U bL| BE%B=` h#Wn][ϣ+CoR/-Eћv֝?DB8,ZzQԺÊjRߩ ;i4c֕Ds7 }^Xqj懃(i"zǤ7+/D=nbej㗬k_s7}֊[jFXwbvp#>P0Jj.yk\}ޛou)%sw|fh {Iem+f%o& 1J6V ?ԒA-?[mwv`{zW/l7u WF%{;~mJ w{?ڛ6+6em/M>+Vvw ˕]94r[Wvf~ch}^ de VURڶoַo1F!yg4Xz` V|=Q#߉<$cа4>)RZ53C"{Źg5\ggVHW&xe:PZnd0*4?DDf!48̯Ў8s 패_xߌ{>d 铲.R1'vM0bE;l9 vJ?X Ie +K+N♫]1%>Q7z<]B&G Gl [?r9OXę9s]|$.ה)ō.i 4A_;vmfs-tools/.git/objects/d8/1d9023bf78e6e7813321a7598cd89417fc2fe80000444000000000000000000001414111733542455017717 0ustar x=ks۶RmYq8v^1Nz4HYlPIJH)iޜbX x7X-i'ImvAyœ2W46(C6 g9l48 ؛~JȿeϢ_Nh'Ia/fAir:i,KOm`'fY"Y3@,J`zx"3~e,k?S'dnLY0gtO1 +რJI<`~S H!X"ɑ%s[:y 0r b=K01a\-2_N/~zr|~~hx/}*aa\@>bxOr|rzvz+ :x9;f/N<;>g?ᥤW : =6s>Ѕ& 8a_иcS'e0!fy>{sss/PvC$=Bv76I51ޙiϼ0pg=Yoc-t sc08d椬ϟc'/oġ8rX]PT2 * FF]`M5wnG|kpZ O'B҃F@xz{?ڀ=\FcsM] to]R/Hק1K:ՉoǓ0 qkvF0M}qꇾa xb$WY"e_ǕZTE jndim8l{Ei/,16Yd_[DB"֧aDTt:{/ZśB89FOfͫӗg/wȵdjY>7%7/ߜT1:36Mm;Ki@JH(w9r3vWk$f Ppq8kǓι9`73ClRvXyj-}o!`)I~)u&oՈg^zy -b {'O``8O'L^tFmơW<v :Af'~gc}(Pzo.W[ǝ3!4Kb1{P}>1#th$f҂VTH*ZK `NԝΗu!Y#\q ӗdZ:J.ʷŰ;vf1Myӈkj<ɝ@. @) & Rf8 "URA寮z $twߥ"jC<LHgR(0 i­? >mj=pY:Qu.1]];]u#Mh~SWPi@܅˨Ac:ß5OFDԠkp'iV gj{o5$u.pȁ&9r\G ȵ ''mܟi :j"Ӣ4DsA=8xnAV0ڀw?3W{rIN?IR:jf-/fVpD-Gacx?NfѼ}n*"yZ4q 3K8\cRڋ+uh~z_m;;0M_8K'n:InwnW!SmC9U t3';^$7|߰Ǥ'afFtw_K:_.7Rҭ:QKS7晶7&5g͍!5[m A%n+]J^[Vt}+!yyWtU$Vur*0,7o347]t>[~=, 3%W/NqeBT"{P7Ok4IrV| DM*އdVo]V~-mlk`.9#;pE`,C6E֧ ~OjJOP!=/ҘIw:z%X~'H갻0Ժ"ʒF&*"^ D2Nj8O}Ba~Xm(:@tQ*0/L) `KK}ɶJp8*GT1DS (q>âu%s?]5ƴ tI61:(AKj%BF/W6_ĕ7HT!P[[ AEЊ.8!;懙2+]J(g @dL+*\bjғqpA9BmOSg^{%xB Z޲e J>n7y^)Ձ4.b*CkGee$*BܝKgi1UU)yzˊ $ +u(ԅ\Jy%,uP;"0lH=)N&VuE֢feQ;cCׇlT&8*fG=CƒRrSƵi1eؚ[+akM .QhK\miq*D85U0I[ݮ! Wϕ\0mT ->T N݉QHZ?uY̌/ofAG R}Jww$ѼRPFXbDȥbdzFR CiVi AU|)/;z4AzuZbRϴTuEfW1dTWUtuUJ}Q OrѬZlMʬYVB5KMѕ+K|"caY P>l" R-^ *̪3MRfɆ|0y_xLiQ}iבBINM?*O5}c ek4;I>6׵N͚WBH VNASPWvS\.J CdLq3.ZBk͇IRb®2&~.W@O /I]lO=\+UlFD5J'Pjp&aarëA2<a/.z196dfQ[lyH*  < N*mV<2g0,߫LᮞZ8 '99s`"-芛E )Խz?|S^.//RV"r1KNc"ʝvѿE"8_Ҷ#Ff6;[<=>`Ve3`Az(0yq>7wFMҲa`i1.x_Q.秋=­ lCy5άThĹŝS!$|6 8ZJhns]WUITSU=Y!m?¼g>߂};ݛtG3tFa?0XeW2+/g/:z#Gg}9wtLkFEZ\k1V{NmȚ>hLK,քbh=8=z&(cȊ|ž.b|6ћ4}R?=@ѕ5FA!uO.Zs0gl rhbK6&L"]Xu4I gzA6^t8id/tj(9X$ղ*'Zcw>rَR˶M]7CTLˆؖe*;ꂗ فe3^ڪLڒXn9 lHe.\1iٻÇeDó|% 'Sw<\ y%Qaz{Ca}/b1"`$7,p>,/ۚ f'ƦGM3B"\ڮ_&(O7Q*Cf2J>P9U+jJKiH(ed9(^+3G<["&gӑ&ʴMA;9U 300xJ-%(dpem:ߝiSCPitcqYS XulӔ0<`:*jmc+9R`2j*oqt/O$,&Qop?Ǟ!㖉aT J=srlHv/'Lʃh B(S~l T3Ħ쉍;.y!s\J@=揊pqX>yFOlOdijq {]Agpۉ:ٗXm]P( R%;7(3h܁"q$J%?ӊB*IBܿ.n9T҄ZLn%Զ'WĆx/~zi/c͈Kd?`2vCg"2U1.kP+p4W= m$`}%L9dA(63U|H(<F=d{1۹QޗfB+U#tZ 1R KӢFCFDh5kOpږ?O" ,U5-oX1F@{&.z>ɏ(VQYSbSL KDU[NB(qVh-*{jPn;?TW5wn6RtS m9j-{((PQU/l"_@0G#0WYec$m7{{\ֈ$Lèl<}CnGԷE-anɺ|o̼͐IM,ڄpC4c OX>t&kP&yqG9.~3đa }Aj2`l 55  lW@LfFl'CẰ`{7?Soc-k3wE&eܭR!$ExQ| DG/TkmR|!uWBg(I!98DX;EyrGwevmfs-tools/.git/objects/b2/0000755000000000000000000000000011733412720012652 5ustar vmfs-tools/.git/objects/b2/f0f7243dd9359301fcb2a029eeef8af543adc50000444000000000000000000000111711733412720020222 0ustar xڥTYs09bgxi6Cak})ǎbmlMep~=i=fN3og> j{,R}1TWG#'psE 5 rGT EeT~ ,`B#¦8SǮ.x=Eh J̮ ƶ N&_ye  y:I)+BSGnNM(ἓ" T`k%VI~fh23Uh3oЀl.D "} I`V֫r$nHI$!.>ڶ51S}ZW8XǝqeF{˵K L$vh$ZMUje=Lqfn.ih<.|29J*:YK;NI)$"%fݥp6bDJf+ kg5YNHz29/268~A)=EչůB:4/-w(wg9|f*"/yqw,?bvD~'bq ٸd>8z% J$%cY38`yZ5NUvmfs-tools/.git/objects/11/0000755000000000000000000000000011733536200012570 5ustar vmfs-tools/.git/objects/11/8a46dc242da18411b0b8350ad095a7344b633b0000444000000000000000000000017411733536200017532 0ustar x+)JMU044g040031QMLK-.f._qesfJN5<TfnjPVSPhu~V`I@}Jn'UT0Pxz/ԝMѨ~ z2vmfs-tools/.git/objects/62/0000755000000000000000000000000011733536175012611 5ustar vmfs-tools/.git/objects/62/fd328bb30393f4fcd97af66b0228b95a1693200000444000000000000000000000010611733536175017661 0ustar xKOR0d(M+O+NˏwvqtVUK)MIU(K-* r rKd&tqnvmfs-tools/.git/MERGE_RR0000644000000000000000000000000011733555642012104 0ustar vmfs-tools/.git/gitk.cache0000644000000000000000000010554211733446506012661 0ustar 1 31 13ffcb2067a74dc2f628f13796343566a6a297fe 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e {14ecc2c4f12e3d16fc1a2187e0dd0a7f4813bf4d 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e} cbd1d375688cd545a2dd2276155335634fc0b973 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e cbd1d375688cd545a2dd2276155335634fc0b973 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e {fa4d3dd570656ee07ec953eb95bcace65becd495 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e} 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e edbd18073c97e1dcd274bec5eb79197eb24114e2 {7c33aa6f03074c143c6190c0f5ba6ef345541022 0a32e13a11cfa4b4f159383465287b16a34740c5 77e276c89636d3403ebecd36fa93fa2ee862ff28 b06f27c4145cc4a6b49f22793a2a2a7dc121671d b666a0e0e9943c3f5a3a23f5a756be2458efa5d6 bb7f4a23a32be5728fb9553eb6b056344338e865 c34379c52d4cc3440cadcab4516b4d7afdf49e47 e6b7fcd8f7aafed497f83a054704fe5677513f06 faa798555656b7b69ff1f33c06b91c6340f00a69 8e885019346ddd7f676e837ea1ab9a5ad4d5064c 80621dfae8cb91136b21eb55c83519758287b409 337f6e810e10a8299d5f1d19bc96c71ead2568bd 15753d5393f254aa2fee8ead7afadb458b2199ef 02e89b15f1e2840561c22c150756e1b5f3109996 220943577f1169b57bcd59555c7eb291599002bd 0b0f60f4811e384e80b79100285d8c6da461f8e9 451861fdad6be9eb519f3981ae1fa3ac41caa7f7 96f65b80b4dc112247633d136543838964a0a38f 8cdb0a21cc3594a3ef571933dd1752b573b87dc5 4900572059f08f852ced79292df947c4ad18938b e9a94c81903bfdb9cda669bde70c4f4ed899c494 ce9dbe3720bf2001f97214a799fbd978801c77bf b6d1f47911ead7865e61f6384fb8b7372be585e6 f8adb7e4bafbd633a705e913446bfde4dacae7cb 0265a959330b0d2fccc3124db638cc92da049113 129a24011e12951959189acca12c319274f30b95 071e0d54bcb82323a6fb5f9681b6bb89414c72a4 60d05459769f7a76774ce9acbd6577115d0bc7ae fe9e0919167d38403719aae190a1e254a2978e00 dcf27a07291b727d12de65ac59be2a068b3b2fb3 41d26eaa427dd7e44b6e828ddee274a627b579a6 c0d9c4cf1cfa14d9aee9e444f2bb462581da00c8 edbd18073c97e1dcd274bec5eb79197eb24114e2} edbd18073c97e1dcd274bec5eb79197eb24114e2 55dbc35f67374666dfd6905f109b723f849c5f2c {1497b877845a9827e7d5759a17621287995e7562 4753dc8a055f5501ff7cd60b1ed045e3a299fa45 355e110da097cb79bee1748996a4f5f04a324774 c4e9a0666ebfdfa45c5d180e725866fde3b4a9dc 55dbc35f67374666dfd6905f109b723f849c5f2c} edbd18073c97e1dcd274bec5eb79197eb24114e2 a7dc295bb286c6503ba0a395d39a783ec678841f {8eefcdc7c528c76b6a8f7d749eb5956b8d4d52e2 3ca3afa53344bb212f47c4a33016da34898892e7 738c22c9c2ee484c0f0cd25f4b9f4da8385885a2 b040931a664d3a8ffba63dc68998e0c69c76468f eaae5241be595c7c4f9239a212e01c24d2886823 1b796c0537fc6b491972bb0ad20d6d19c85f6e66 b6a4bc0a019d5c39671c99f4f3a5fa32b0bef377 d2925376acb585a85700b0c7a83c6419b013cc97 4309e6a1fa959095523cb564101f2e5a23bb468f defe1c717bea520ba646f45927f8cf7e2d4623b2 14fd9414f70706437b55298e6a01ad9b26fb591e 30b0625059be45000baeacdf2b0d268d1f16f020 0413ad4491081e583711b9db923cee49ecccee13 2fdb384408a7097734de88c615d95bfb76188113 62e91683f3579d0da1eb9ce0451e0ed5ff8c801e d0543b96b0e6e46e99ec93b47e87ea01d69e107a e8ea92f8e4c7797908cfd4bd22844c67bf246af2 538b126c0dd8efd2a80e3f5240b7181cd95d73cf d7a5c386463ca3cd9f570e491be52107c35135aa cbbf58e4a8a7d6aa256038c34350d0185a5a7563 a7dc295bb286c6503ba0a395d39a783ec678841f} a7dc295bb286c6503ba0a395d39a783ec678841f 7537087e7cabb5e4521e681df891f23edd4ad381 {8954bd039289344ab6fe887554182d6624ed0d05 78a74b2b9219a87155586988357dfe04bdc7da4e 70e126aff58fb40f84c3e9cdacd920da12f3a2fb b303c70ffff88411f5837e83b524f34722819b45 f0c37ece55deccd8c2b5ad9f5f68fa2f031134c1 b979f5ebc98a9bfd258d1a067e06f3e3317af68a ff23f323dbb5cc5cd59d2b12bd9c439eacbb4e8d 7b5754d8613a71aa1dadc1ee9b5575900da21d58 605c18d0557dc6333324d2d5975f6bfce94dd661 67c28aa2c55c470767d876e28b626db2cbd4d32f 2e9832f70f1817d75a61d405a383c624b6e17a1d e12c96c2bfa65f8ec970895e396d2a2c7af3b4da ccb5ab8573e7c31f5d80f68850ea192ab73faf68 d9ee1a4c0fbf4b3d3038192cb12be96ad07c3e03 9d1ed3555c7a130933eb09375e86bda303754ff1 5183bad90868b256985788fa30996cf29dc327d4 07b84bf3ba81d57ce8d105bfa53bc5340d7eb5b0 9af9df491cb3ad8a8cb876933ff7b60c01df7428 80dd8a3daebaf823f3f07067e90324d1c4aa1e02 c3bbf5f7f718381c368c93ee8732ebc30197c91a 6aa0c1db96fd2d36cfab1fdec0af2b34ea7f9800 76a5a1b74f41b1214f718a5cb693383177bb9d23 fe5b0f77352ee5488c471bfc532481fbbdd5aada d62b52435159648fbf7a8f84761051b764acf2d6 2eb590c9d126554816b9c75ecaffe8c5a517c25f 7ea8333756444d8f26d8aece8928b874bdfffa27 1b6556fe1d6868e5c828e71691b843ae0d1853bc 079bd1fd53cdbf2165c0b924bf51b4e7cb2b6486 aaca154cee94bbe9801f57ac682381c78b1137b7 eec49d0acf990c8bd898c10882fbd10ccd237278 403893ae8cfbd660f2df2363498d4ffda0dacadc 4d06e1e8c722edb2a6d87ff6b0f39b0a906ec89e 5efc9134c6702e64831882d19776bff157bf3bd9 122e3680562e06885604ebdf0abba6faad75df0b cfcbf0839bbbbf4afb369614f5436c2d1226b38d 0cfd6c0207eab613181edab035be2527f10f1687 7537087e7cabb5e4521e681df891f23edd4ad381} d8111bc254373e679ca0e46aed9de185750c03a4 9da49766ab88f440796ae1a3cedf591f7d438e1c {90e40241c2bed3c0047e7bee598d38ee19bc22a8 9da49766ab88f440796ae1a3cedf591f7d438e1c} d8111bc254373e679ca0e46aed9de185750c03a4 9da49766ab88f440796ae1a3cedf591f7d438e1c {e03c3efee095ef3763e79fe97f42065ee532e28e b3ae9a7966b38ee68ef074c1f01e2059d1294174 e066b31e793c786f5276e35bacf8ed0974a6bb07 9da49766ab88f440796ae1a3cedf591f7d438e1c} 9da49766ab88f440796ae1a3cedf591f7d438e1c 4ca63f26097aad0bbd8579dd933f1d2d540c0655 {0d06435ea381b5859a0e43a97ac630e3249c08c4 fc60f363e6f3ebc47d8c584d8c9c16284ad27d06 f5569dec2198a4346c6c444c6e32e5c3655851fd 92694b85d76a3b47e323788bb4d0aed3f61443cc ebb9024e669567433712ba67edcd080d5b849f82 03305fb71b324287c85f291c54915de00fc989be 5735bcc7dfd3a8f152cc7afe3e6890f6bd152abb da157bd963c2d73a0f092936dd401f752c010e24 dd681e8bc6a7143d230780addf31081504ac757c e8a1247fc6f460d2127a680b3ec5dea62b0ce480 eb903790cb7dc1447670117d125da2b58c12e2f8 e37357ce9121b3672af2781ec1dac72ef05a3351 c6e8805ff60debd255fcd320fc4a58ee51c90d05 473fec4a4ecc7aa156a18dd54d4e2482bade21e9 e4ea817a956b7bd8caf066e62aab9f4c2f9161ea a9ed5d4ab2e7dab08e44a3e5ddc4f5b0411f7e30 0333b996359451dcb7c71d58a46b196fae028294 1f8f3fd020d4a712394a9492df6007739821bb3b 2f1339fb5ff7c0ef0a0e37e78cab00277c4e3e63 68eaa807013e832b16f45d1fa3d708cf6e48cf9e 1d94f33e6a162762801832b44f00d310901c42c0 93a565989b77319823889b0c1e8a8fc6030fc930 d1af10c0fe0ab6b6c4b143bd5113616b43b232d0 3dcd6ce1c1e30594b6f775aa18e5e3ce39a6ea2a a58e269e32d72671aa540ae1a63b2b8684f52637 41aa86437af98f6338b4dca7e0f5e86c33e6e110 1456f9904cb3a95b48b59744251ae05d7b4fffd8 9a7b66bdb1844db8d721608d6ffd1e648a9ec1cb a908bed9de91abc4f7b511800be6d650562f482e 73e37e155a4fbcbed90ddff71f0629fd54b0f503 8b5a1d2625730316b4d7c5e862430d2795b5c325 5460208620a0f983c40638e73e4ef9620ad26d86 736628dda28f0ba6cf32e42404d1d4c31eeb03cd 3a4f56eb8bb8c0fbe0ba96d16e18ebabcd7805e0 220075ff12c9a1bd2db1c306cc47c0143c3f8105 104df974934b3df04d991574090f1c2be1167b51 db0d6c5607691fcceb8dd8d6865950ba80f4d983 1519d465a8d759354ceb0a0f33f6f3bddcf157a4 344eb5021beb9047db642e5a9f19d5c6cc604bd0 57ce04916b9fc42870bf3e7cdc371b37720f5d5f c7999e4d9ec960e575400c6a9549a2eb0423deec f2898e14fb0a8db79e46816c014bd08c56b03c0c 4ca63f26097aad0bbd8579dd933f1d2d540c0655} 4ca63f26097aad0bbd8579dd933f1d2d540c0655 a0b8954b3db88c6129ced98e00f3caddaa40bd74 {8b74e23e032e9966b5c7ff37ffc444b42715ae10 e8b7f9493150001c71e0b57e8ba94f12bb0aa75d c8d8798e955633814d3f829041a49048b5471ae2 6018c013dc68570a75f0c64a24c38cd9ce4dfbfb 1dd484617ae9c3c6a9054db90e9612472fe3872b 35fa82ce4c13d8d9e6ba04fa3154484dc60eaa1b 4ead9565bb5c911432f2cb4d044c4c914f022489 3d42750c9cc73c99442dc741191f230df3177ee6 4d89491aeb03f744a6679a237f02b21bd2927c3b 1501c121727d74d994ed19760487b3ab770243c0 369d29570ec45a6c6a1a32a67e8993bcfc739531 596557a1f10b0af7aee2c7fa68aa61f1b242bc7f 4725cbabefa8b205d8ff9f7f7d558b38a3ffd085 20b4d3432e901b5ac42875c3f96b910b765b2486 2f840bb3ee70b2f873cfe39efe0322f44ae527a8 50facf23992bc5957108e4b6e11dd729784b70ef baeefd6267ec186e89d690d41be151e63de05408 f493538dc5a58a6032af7213e04e326c41ede312 edb33efd57db111a68abad2f775478275727622d 9322d4c78c4dfdfefb6d5997a678620066f5dc85 5ba8e80a3f8e10f0647d177c9b06dc8bcaf4acbf 2c2832123e63d653a4cfac81b9c6147dd3636bd3 bca1c6e644df377e894eea65adfcd945c311d32f 54dd6c30c53fac0b5a41c5892f3eeaec882cb02f de2ebd68485d23777cb2674fefc96e2023c1923d 51631d1b61b02634bd8b53ec2ec1c52506be1fa1 88524b9149725d00fc88c638cd4c1a418faa8465 d6088c3aecc5d861ec668d03aed55d29eddcba30 0b95133b58b09ab553a2ce23f9425a6f3ba694c8 ba22c7cfb98fc8aea9b2819e2d24cc164fe1da97 3b7d74787a93a06e69403c5a10f93031fedbe95a 9b8ecec12b5e5b129edf53d69283d7701179e025 7fd1582816be96b07a34ff1969fe9d720fa1ef50 2aa9ffcd2ff443ccfd7ab66dae1170b064d9c1da adf4a57afe6c1cbbccc31c21bd616040648fb2a0 afe20f0898ad07eb922b111301cb80eac782bfe1 1c55ab7507c2ee10a49565a7ec61b9da8d560ec2 8ca1744bac407215bf090f67345ede809f1de897 aee755337fcf39c3dc3c3da7d48d7e114f9fc074 10aac347b51ab21bd45074ae803b5fab94eb5757 fa306a811b77dcee8abf2d93b817c0b12277ef86 90d681ff40eb5f3ffac501f16e20827d1bea367f d984b9b9b0a4bfd92f5e75076058d5ee12bca38c b73f0d9cf29044a90b7ba68ccf81b4340289ab87 4417e6b25b7c6639d8a2e242d29aaad96b8e6c8c 1dc1e568ac0b0a623eaf293841a55d3816ec680f 3127d52df0d8567dbec1f8fc68f45e3c52d1c72d f925ae623e3ea0bfb883dbb9fedb6e31ebc62c77 5b1dcf3475ca4b809b818673c8e8f5fdb34cb099 793617f3db25a397eafcb66fab1d4a1c85414a50 61d55bf5881f56c402d6d7355a78de6e44d44876 26fb71a66f9e73131fde2b80f148331e886dfc86 c071f9dec5807cc9cc35d13f2f94b2387b5ae720 bd81939dd7fb8a73d80c293c246b5e17668a0c13 5939456324d9de92dd12453cd8d1298674aa47f2 0b100f983bae1315cbe389145cfc4b4af0f7786a 390c6f12929b04dd9a8f2d138d279bb18bf1ee9b 9f235313456938db1de88e830fe9451ab979f378 a0b8954b3db88c6129ced98e00f3caddaa40bd74} 4ca63f26097aad0bbd8579dd933f1d2d540c0655 4d8d1fec933acb35da595fe34f16211461713934 4d8d1fec933acb35da595fe34f16211461713934 a0b8954b3db88c6129ced98e00f3caddaa40bd74 0536f77ce17ac75a1d5f1e94108497161efc9925 {955a504a96cf15f97716187baf60b64766326438 6b093e4602673df9fbd75a5dfc9387ee56186e59 68358c289704ba6d8599fcfde1cb5ff9b5db49a6 9b95d4a6674cad9031223ec5fb4f9ef9366c916d accc8b98c1728213512b68c3701ecc30fb690463 bbe22c96bebc5c450d2bde4fa5429adf280efcec b3fdf73f2b99deef7653e6e2d749777ca2701c41 c32d0655529e6b8873e703a557c84c0023f4b4d8 f9c81cec57235a51609ab2d75757c4f120d9fdf9 a0043bed113fa72cc7c0fc6f50bdb9ee5bf08bce d831569a2beadf3857fc81df353988999abddcce 205dde7dbe10bd2780ccb7cfe8ac23974285392a a11abe22d5a2e7a58efe0f9f7ed4a180674d4fa6 0536f77ce17ac75a1d5f1e94108497161efc9925} a0b8954b3db88c6129ced98e00f3caddaa40bd74 496c4658f9ca34b63b38f880049ab64f58adbd7f 496c4658f9ca34b63b38f880049ab64f58adbd7f 496c4658f9ca34b63b38f880049ab64f58adbd7f 91c5a1e13c0a2d66f39b52f7c4141d001cf846a4 {47f22a1fab257b7b5164687f844cbf56e0d490ad 3f8eeca70aa23ec0f5ea5dc4aa39814dbd7f8f79 f137762c8a3d8fc920d6b67622f5a58b4a063f70 e37fad26f54a6fea71c25e2a4a08d1a4f9cec535 3584978cc44330ffb9d4df536eff6973b25283bf 91c5a1e13c0a2d66f39b52f7c4141d001cf846a4} 0536f77ce17ac75a1d5f1e94108497161efc9925 01813416b394db14485fc09f908d4202e14d9c7f {a102ecd88e3fd78667ecbb724362c7c7f962b8d5 9d267d9e4a47adca08308d972f65be0042cfda27 0cb670539c172890cea5c85bde6ab1617378b6b8 daa4ad367bfc8577c92faf9eab8284000158aa20 30fca4f41e75a9b17ae792ac3c24765acf61e5ab 01813416b394db14485fc09f908d4202e14d9c7f} 0536f77ce17ac75a1d5f1e94108497161efc9925 91c5a1e13c0a2d66f39b52f7c4141d001cf846a4 91c5a1e13c0a2d66f39b52f7c4141d001cf846a4 91c5a1e13c0a2d66f39b52f7c4141d001cf846a4 01813416b394db14485fc09f908d4202e14d9c7f {315e78473286b8c9486029a59a54bcbfcf92e854 90de2e9fd60da9f29152d26f9be27b801d75f4f6 8c7da62ac00f90e7020c6312749f11a3406ca0e2 813e36c642d37e2c6ba125eb66d8d88edfc29ebd 4157fededf476f21d87563e6017a0009d5c772ac ea1cb567b475923e04b4352d33e3e1743bf584aa b5480f5bd5ccc3215465c29fa449e76e688a7048 3e3b5b871e4fe1fb40f746c9ccae7570afba7013 fbe536f29e58d47d9428db96dd20211d9a777a2b 7da3d9fed25680c9c202a73c7df39ff6a88c0f37 92f3ade9b3bf79bb1fe128ca70221587a88555f1 b81ac005b9bcd8dadf59cbdade91073879fe63aa 70383fc5b772f69837e86728fe97cc46fb631533 1970d908a969bb5710fa0cb050a0b0c6afedce01 9ff2d873371e0fcdbab878d34366a10372e626af 2e7e281b2fc5188549d995f43129fc2472c587a6 d9642cd1e5e44740fdae5604a551bf2df4570b23 058329e3e4ec152768e61878e34d0fa87f8dd98b 66b64b31fc402a5312ff0963e8f3a48098c132f0 01813416b394db14485fc09f908d4202e14d9c7f} 01813416b394db14485fc09f908d4202e14d9c7f 9cd6387228e13b8f2b0d3de5cb608dbc08f89e4f {2f8cbaa79b0ad3592e3100d9e673d13d9fbed3fc a3d9aa3c9aec95115512c3355f6ee7ea1054f3f2 9c4066495288f53c4a64e96aa43bc79416b171b5 f565a82cb0fdf2ef2872c77fb33d52c324b13140 a1b89eed21aec5146a38a8142b25ea5f0075172d acab18b2a24f9b24029e12eb4ecf344b364162cb 2315bbfa5628180bdb5c029f7eb11ba50fd7eb77 17c3c6dc432f6b100ede92f5b16316c7520debd4 5d0fb09bd4f8430ab503efd2c1602ead4792ebdf c91717bce7465af2737ddb4c27b55d83399902f6 297050410b0ea65a7635e67718ef26ade10ac99f 4b1497c2dbd188beb6f1cac6c6733983f14e33b3 c2f2ef70addc28ef84aa116b21b013c2d766c7cd 3662aea2b094fe3ae59df486dd0d9155bf29dd50 e4a539593ed180548c71d33f1128137dc6694e8a 6c0e110fd989da00b5a4d8763c4324e922841910 a67892b6bd3d55e4ff49a6a235e7c164e4a109d4 8739ea7c1645b5273b26a02bf3e0dd0efb5a6fcc 191f8b1d40ae6ed5c3d30967d83ea87e16dd46b0 27509751feec880838c0ef566d0f9ae6ffab7c07 366d3fd2149560c5664018841c8a6aa6ef13a62e a1adebe68fc3f17627eb20daa6476ac8c72addb1 8f129227d1f42c36b380810ca3482f39b7a19e6d 74243daeac3f10687ad4ccb0c83ac8cf2c9de00e f41116ee3fe9a57eef2b5782bcb9b5dffff968a8 217f37f36f63edf2205bac6450c10dd83868ee33 e410463e6a28eb4a9bf2596784d1a4e11a533f4b 3bc70701d45be0782689415082c6a60ffb27f088 808e14d9e2797d488506d94ea8d64ec7e41fb26a bb1c04c498cee968d743cd96a0456b66edd5f0e3 a6b7f5815df49af7606b33e988c70de3089c840b 384839c105dd0d340773a5fff46872e84f0c491c 219f5c0fbb13490ce6f9eddde37da7373628761e 4417123c7245c210ff6782159cf304a3ef6abe87 aab5be055731ca45dfb6981ba8896f107e1b47cb 451fcdbda07d7cb0e2865cb5c9dee92d7a67f798 4d9f6a9e7c56767516c36be041372a05e27ef1e0 b30fd86b31394135223261e9648df9d4d121bf3b 1b9b3d7e82fdd97bc486d6bffda197a0d897234b 5a86e3536f4241e5f1b68cc8a7bbb45e7b2dce14 a34df8a02a1cff48a5c816ae1985899970127326 882bfe318051855a7e487ea22a6c46becdfbdf56 f6f4df8eb24fc5afff65561bdd3edd8add942057 8ef60dbc107861bceb5bd85560f885693733f654 1e61f27c8542cd366c5494c9394aeca7badef045 9c6f2c29374e58671ffed528831dc7db5f7b7315 4f1f9688278ac0b49df9efe13ff839a1166c6acb bece65285f5792ee370b26b19b146c0d46d34480 221c506a5844730f5772241617f5dbdfabb5ba5f 4537ef907d6652ca5ed17a71562ddf998f39959e 3e2287bf60af08b0565feed978891c84ae1edf3c 33954e6a59d6cd5fafa6ead16b483a95d7ab5dd6 5a95ef4397ffb0c9aed085537ab5dc01701cd140 877d447d78c2fac8f7683cbe7f0ff7bc4762e035 73aae73f1ac683610e0d291ca0a62b1abcdc1f73 4cd8343bc1ae8d4a4b775a7d1491b0f5afbe557b 05b05c5bf1e0137aa49547129784bd670328d5e7 41eea373f11595106dba6ccfc4a36dd44e916819 206745d0ee67668b74084bf61eb15ec7a1edeca8 a0089b8ae8955bc0904a3eff85c80a3c9682b0ab efdc098c627baa0aa68a945d6187e5a16df6bf42 cf1a2d3ab91827fdd34497f7e2f36e2e83564f61 f62e40593dae0a8a8dc54bc12aad79c18feae4fb 74ad966d3d9345cfb588e24fe5d845df02fafee9 f2b9ecb4abcd5ab00b4e3863cbc0f1560aca2dd5 2cfb09957b3af8faee44fbfbc67aab60a9b91467 124b08fab3f68312b4d2d1d64bd540dd727cfb92 b134872b87efb2c6ccf808cbc1f89f34c1e57064 83ca4fa3cc3d26ab99b322ab36abf66bf08195bf d41107289b18ad7e17b61dbd5d6c994880550529 a36d19344be16e41c6ae62ad7597a6a7ee13cc26 ac869d1dfdf72587395c3fbb3bce153197bfe6ae 59fbd5ec798305ed53b3c454330ae1fc785493af d99f2bff5785a34a5e4c5ccf524b5e9da627b71a d8ad2edd994b0f03bc4ce7e7f8f54e6097115a4d 1075ba85956ac0c4a70fab5f7ddf6af2eee9df5b 3e80824568fefad4e13d46cd92c65791085fdd9e 9794c0a0d5d125ebb9563fdaf1e3c9107c055d10 0716645eb844796f6547a0ac0344e6579bd7dcb8 5498b1b3ea0d6c9994dbaa11d7a8372a60ecee90 87082a9ac1e54634a9aa5ed1aec2e61797be9b48 b69e3cc105e48c0d4169419c349c9eadd5c17c1b d2e8518dcbc704ba8b932423453d174df9c89026 6a21ba4bc1c14a20b36967060ad71032e69d082e 2663907d04fa2b58d75741e8ee1f0ad57eaf7a1e 6c65bbb7afc92a17e18a918e6cb4dc67da879e23 77d367b54457b343525ba799e342a609576c0eb6 83f7b8887252ca5f1dabe840795ead7cda5642b7 72072b9189647a3423faad6cb7268239e282d35b be203338b2db1861e401f44bd90dffd035cd5881 37c319250da15b18511e9d0293c6113339bcc4cd ca0b3f83655eacfeaca5aab6d7a13ac8eb614375 a4efe627eaa5a87c6ce28e29d54c53fab332e171 369a4caeb948f92a33cf83733f19e79d2d892f0d 73395e1362df360f8e65ce6c9efa1bec34935689 95df16307157648ee9c5fce4e15c39435c18bb42 4e2c3ab2584d370840db6994407001596fc507b2 955a86bd3a09cda40bfa807662cf1130592de85a 07681810e0870ab3537e587f0b56c0ca2802c579 6aef1478bf4d77238d949d4e8e45a0e2e87d52f0 7bb50517552a18144b175e11849584b253e1e240 ef5c9ccec420266c4f783c43afc312681023c257 2498bf05effe329a0d7de19a03157c1295f3a382 1595f41f0c7f41618ab51ce09bb4c53c61e66714 ca7156440dc5335f71b68794dd3e6811b132f6f1 fd759ecb1abf165ffbe7f75e55c17f90d11983c0 7b1658e927ac6c168699992ce3b1cf9907c37e3a 3d15f16c37282d62af9eb860e37ddf1339de6246 d89d2fdf761cb2dc454e606b11ea907eb4cfc434 73d922f7d6d5401b90eb2c3582982867e3e96fb1 7b71f1dc1f55336679f28a820b62aca79bf851d5 4c6b5a24cd151c32dc3285986cffe5a8653a120e 00be82028615e7531051a8da8242f3b2d9131ff1 f968c1583ac2eddd17b4a5e775aa7c180587ab0c 02d82b80ee49a4a88712546ed24d03c37dfbaad2 121bd7755437371e5d803b6fb2068b27dbfda114 63cbde006d658b446fcdce6c9b7ecc341db89b8c 9cd325aa8b89f69168f18d2fae50d515c50ac969 ff16cdd4a8f9e523c456c93f12c4973a4440c506 853508a0bf83529caa7a1fb1629c634b729eec12 a2d24364a6be6da679d8f4b25332be3a3bfcc36e 158cc0d3ef46c61bab7e39c168866e29379f507a 9c377e0ff3bbbdeb28d080be544142984c3f3209 81039a8969e7727b5e9aa1f2df2bf1cab5108cce defd4b1cb780611e85432a412f2bc9bac4bb5b70 0d10549c70a807cd7f951a873ae07533e4eb1c39 c6508600a8158b2f00093431e765066012676b35 89b74964d3df3a85a67dc061af6f655784ce0a5c c87e2b1da8c9dd4f9f3268fd7f45c53a3e4ea182 21980cc670dc11f99c6e72e42de065a0c0163918 3ecb797566cbf3f74e64aa683a4d9ff36560b507 ae34c076f56abf0db78237a650848d750a5809a0 cc4d11fd24bafbcb0ac971501bf42688e23185ee 03c3034b56f12af27ca64bafbe778c942774b943 64e3ca1fffa124a42970fa8c50cdbec5fcdeccf1 ff2cdaea9350c9ea30f4c41984c67818b2e892ca a45f4a30533c0d8d8a355e600377c913689706fa be43ae2e11bbda8d369e70ca76dd086f02b3559a de28c08fb16bb4719c500c363673b442408d6978 4933baa4024289a4d6605705d7686f84b7d1b18e 87b209ac5a5d9930f802726016c878a65e300e05 025186a1b9c42cd4b8183ddc54ddd93adb32e1cf 47e5130d539f230ed0e6722e65f2b5db08f43969 4520c52f01012bc6510d7b69eac42c1e5d5f0613 8491311f62ab5e702d2dd408b8d9856e8d24190f ac87168eb3013882962188ac9756772cf65c4bcc 9b18bae70c946bfb833af56a97f4fe7ae3592be0 2d50a19d12169ba214959871a6f47eb7294e5767 7926b031f2464a8805515e8989a44f379db62e11 e4fb000fb7607c19cb3f9f6733ccf619f6ab8d75 0ec31366976b4b8d789ca6f43ea5d4a2f0e5fa15 1a663462688f67939017bca71d2b6d99a80e2b1e de5368b0008c157abc60d82aa8be052a5e70d37e 06738419230d159cccc22d8d53a6452f7ae67ec6 8f8e0ec093e8c7c21bbe3e48d5923b947efa3244 6bbb66378d678876b72479136894f5e3951fe6df 85994fe769959803f086b47ac8ffceabc576da3d bbc12c7f0c025a1f15cc7f0f854ed34d4b3ab7ab 701ba006958de23d47b0781d56d6ccc241122766 3ac510bd14bee7be5230ce7b47f2ac169db4fcfd 9daee9e27ee97dca4f2eb42493cdc45b3b3f15b2 e3e3701068f7dd9f0fd6a9d59a79be64dea657a7 b506706c98190d25b208d725a4b75dd4e9658f33 1e28552df7449252ab6b1150988a334e8d78a8d2 8b0e1eeda87722af1b2579484c8f01f62fbdb6fb f4af49f48f5248df2ef31e8ee454da03ee8747c1 3f828af845184fe431fbd2e48bf4970f2ac712d6 a0425c8c006fa053224631e3eaea33272fed16ae 33d34c508d05010eeab0f763b0cc17fe100348c2 1dac10a0357c14d99e747bd035931c2c6b584190 9c1263d1520374714abf0defe9e59e6d4cb56d2a d30c3afdf65fcff5cad95c3ff44e11da04b57e0c 81de14b50304a6cbc70cc8eaca789f8c6a3c6719 74eb1d7744b35aa28b48ba594aff054a18be8f32 a26a7e2bb9d7748214eb89e9f3f34985f5cfc01f efb22cd4f309a27e5f82f10bd5e9130d4c670947 ad7f528bfd9d501b304dd5f85ccb36b1f44e7fed 04b82cc5a9cc1f415024297e2af22a023199b00f cb6ae492385d8734d1ef1eef535b528c431bec19 b5626503275ceaeab61b4ec92a072d5a56f11ad9 81a8dea2ac5688f22394662f36b8cec5fcd45b95 49045857a3e2769c65883f759d24a507aa8c9b44 4a96c3594b0e098d23222e796f3c3dc10bbba3c9 6751ef44c513fbafa8eb592631b412575d4bf704 4f32e0f342a2e93c61a40ee80bd9006ea1995ca7 a7a8883bdb4607c2f1e2c32691ed5839c433882c f85677dd4544cd6f2f0f774c1dc53018b3cf7ce9 feedb2dcde7d376b56e325c8acdb7c80e89b7551 6da113cbe1df73493c4b84777e8cd562c6b55171 84748e2eca7d40f7408fdfeadb460db205ca6a99 03aefd64ad07992ecc1bfb70a6e0fbec3085ecb4 c4c2674e544ae3e94261e0101a53813b38fbaa6b 6dff33f2ced2a6f6d3c1d1ddbe67fa9b5b852d79 c69bacb573c1e289f2fde0979bc21d3f654b870e ff8537a50b130ab81c481c5f92340ca77018d8fc 6b64dfa1bb90ba77c1640d4cdca2963739da624a 5a62daf6995d94d28f5e6b0a22b0a9c1564dea2c f04191e3d1a8b24c9f9e4f23a5b7609fe6692e36 83be95df135252627e3204a6d3a4175bb94215fc e4d2ce0861d3608ef311b47a608f53d0c82de362 62f74a76b6119fa85040d5e01b7a3b75c8773083 35729f81f816aab8e12fe57b3ae6d566389fc556 b34320fb1369f7963360cc10cc14ee2bb306e1a5 8bbb304476d5309a25c7cd969d85b51a6e020ba7 53e855da202abefe7cf857f6daa3f59841888b88 b1f91653efb89f47c559437fe5af6d1ec619e333 9aa9c8c3ae747b4786ed4d685bd1991a7899b69b 899d9fefd38baf4d5a9ee91eb81c84784bfcc4eb 51c696c49da869399ffdd102944889948d71b5fe 1ee76f12567959bcc597a4447980b1b966d10929 7f8d0fa100e28a44300ea78d24a2d4c42adbe3e2 8220569258219fbfc303fd7e60bacd540d4ad804 6d08b95a6e9a674b935bb5d2d97a0f7b7966270a 98fcf2446afcb783b3e1110e398d6c65060d3b1d b2a928533347b7229b70da327d8d91ead4bc4e7c e60f59440c83f760320ba61b2b4680350a30144c 2fb42a7e5013417fae0c74b2ff64023550e145d6 2293b8ed2c3f4df22df0a32cf5066e5dcbb55a1a 2905e1f7e6a329cd5c6b0afbb02b632cda912272 4f582eebaee28ff6859273a4ed280dc23a686943 7a7d327bc7a0a2745730be9d9d5311a841024b49 d4466c415e6f4ba89fc88ba5b11673eb44a6dc58 57c13b2c523130d98f77083664e75447328b0b84 9b79d0ffc1615c2fa11f47145ab247ebe8ca8192 fae35fdf95881f889e0628dfa907f6bc8bfa09d5 ac96c4e8820c227fdc8b053012d6fa8c61f348a4 438d1759c24e14ee82d5c46f0fc39e63a21b2d77 bb8d223b0f47960d52917d9073b2404ee32e8346 85d376800e888c201518751cacc05311eef63ef8 0cf3218de33277fc78164a4e9616478844199ab8 11c2bb12a8d15129b2cb79e25f049bedf17a4212 3e6bc6bbb6b7775160e8ef064d1fada728104a86 427cccdb59c3121a7f544ef4474c478637b33b11 ababc9c515118e1d1f4a053da91f6185a5ae469b 89a8d34e8bc580538df6077882045b31a90c69cb ec6a60c337d388c7edef76f0fc9fc29b758b9dab 9ef4bc2cb2966cfa6cc70f68062a25cff66687d2 e824bb6db738459b2d023a2c8c0e283832813132 55a5064d9eebf5a724bd27e103c2bba8573a2ea3 a392a3c4011e6c2ce8874bd924d8c15c32c083ab c3ff21c789e712483dae1b5c3eb8f111f39b0065 5e452f9dc457a06aa289d129d4875823f9da7acc 365a9c482830435599870efb6d4ffcaf02e49c02 8d68c6a0e5db043f68f42c310ef05ab1507d3c56 0777460b807090e4779ec49a9cb50e6b687b211d 79b16a910f93e74774f75e56093fcdbdd36d9f8a e07cbd6b3e1e9ffcf9b1894f393307626efbe6dd 7aede47571553dc19bffa68aa7d707f58a584856 d0a4ba4c1690ae7a32a9e6f78757da95fd8b871a 49b43bf4937b4c04f5ca8debe4af7fef173e126d 0191cac4c346ab796b3eef1c6ba881f1e784a819 db311c6f567cdf9f9a2686b49996a1e7a60a52ba 4dd42a8d1153bd5d8e9168c80eb74c2d71646cc4 518f198865dcc02c41bda2784d48ca0d2eedf7a7 ce09b5dc83625fdb2fecae64cce8099affcdcc4a a5fb27709c14cb0c70d0347f09988aad6cf77950 0875cc9b60ff99e91dd8816f3e5a35ee70f6888e 1e449cfc1084fcbd025511f1bbddbb5b53311fa1 75e240f9a6dd15ac438e769f232dd0cb8b311166 715c1b2c4a8c98ad319c317c158a742e096ed734 f3326303a89e75c874e5d982d0020f33a73222da 572c10725116bb03af2f659ca5024394a4529614 f5316a65ca352d0834109259f8bc86a6c84158d7 1734e94b4107f8d07e7ba48a298daea3b1bef6d6 26c7e2a95fd62fb4eb51efdb6566c4f3213fb68f 0c3fb0d2bc0099e229bfb62d8335e4c0adb0b3fd 3c2b5c0a9deef123fbac1076ab2539fe09667638 122259bdf85204e0a47f7dccc7f0d326840d1d1c 12536ea4906271a35ae1b3b7ea9489c35db45764 d27666d2cfc70f24b76bde7b03032027aad51d0f 236c158ed7537ff9cdfc8c32816e2c00869dfd0e cb5007177695a99c080782f1a38cdfb53c5665f2 b41f131dc1db8b0d2207634aa6a03104258c0ae1 e42b16f9b4a748d70eb693e13fa36c7761a4ca39 f2ba5fd1ac953b4741cbb664356ea9b9434e708a 8838b5ce5b31da54ace89ae499879f06c8e0bd79 c7bff3b588418ed11eea9de95d54379144852079 52f1d0ce32f2dddbd8f549196d70a387561ad4a4 8375bb43f4fcd0980b869dfabe2a17fd051c0e13 51c1a86912ed468a5eeb7664d8b0c0e7354daa80 2705a14fd22f84b7c7338f6c34b6bd8094390418 6ff49f770fed39099756877bfc52053780fe88e1 12a5f2b2b6376a0b5a1a9950f41edb6511b25682 224ecdc58a367ff3021880efac6749e4c8d78cc1 9cd6387228e13b8f2b0d3de5cb608dbc08f89e4f} 670ac9502ac8ec55610b5b9015576f89484c8b0a db4c4deaea315bab85ae95844dc0406786aed55a {a991b72033d0a62ee62f209151f4fbc39725cd4b 6fa5fb9a7f3ec11cf0fee2a72b5fcf4acb7e8e47 2c4047e6949ee1d9fa4bacbec519ecaadc85e703 024f9f005b675a48001bbca746509d42b9f0247e db4c4deaea315bab85ae95844dc0406786aed55a} db4c4deaea315bab85ae95844dc0406786aed55a 7a241f6761ae6201959287f84fe982876c0499df {4aea1f7bb609dde6d773f0de43b8cc5eead451e1 05425c4d29afc9ed5592f96fc848cf0cc481e5b0 14f750c61a67a76b2b8f1f3a69712572e7491ff6 3d1e6cb9e0b90cedbbe9d29929668c5c86537308 5833664bb2b9500800c519498c998188b795d4cc 7a241f6761ae6201959287f84fe982876c0499df} db4c4deaea315bab85ae95844dc0406786aed55a 55dbc35f67374666dfd6905f109b723f849c5f2c 55dbc35f67374666dfd6905f109b723f849c5f2c 55dbc35f67374666dfd6905f109b723f849c5f2c a7dc295bb286c6503ba0a395d39a783ec678841f {2999ded73c41b701188fbb59e3fc02f4153933c7 eb10b247e803050daff62795fab127bb394a1453 f7094f1172dea686e324e6b43b3e0c81d8db2d15 aa55c5948c837446e41b3d1f209305ff972c59d8 8a46071a87c2e192abf5d0d65b49bd53fd1fc015 1edba0ee52eb37acb0a2914d10383ce30716b9a3 a3372ba55cf2847c1b2bccfca775adda0e1f830c 5cfe4bb053327008323e0a088def993a5d951e2a 31d0739693c8f751afb35f3ec76decf9fb3b976a ff53a195fc698f4e3e6d363849f233a24adcdfcc c2f8bb4cdbf21df6a18f48eb9e1d19dab87bd227 1d725854441b959b8bb6cec0858ad83872dd1a9b 2df10340b34ee2fb97d62ec6dade92fbf9993324 671d8ec80522a31d64bd909cff157d7e90a566cc 47ec6ab263b4d387b1b15d60ac9fd532b0b341cd d3fefefca4debfa9c5c09c0acb3e0dfcbec7f4f6 662b8470c69acc579aeefaa8b304fd4deec1fb13 810d60e3133f004027effc8a82e93f958f6d42bc d2cdccb26b5384bb9d38b0864a620b14f7a8d368 d0a55120b5bcf651dad5eaefdb6dd2aa3d621c43 cafe7101fb80816dae074bfaa4440f6ee39c79ba a546c0f6c85b639c27ddb47acacecff726cf3b82 020adabf8299152558415a19d2e7c183353f40db 25ad2f476047b4516e2ffac7c743b4a5378368cc 26461fec6c836aa66b2ec00d78118ec2fde4cc95 0a5b7328efc9c0d7eba414b6237a7e4052f3e7eb 659428f8ceb2a6e067cc21d07daafe7631b6ea3e 4fe512884dd2d106a58bbfc5c198ef7ec0efe8a5 f152d58d919039fa301a6a6ee77ad35ca9f19ef4 c108481529aa5527f59b14e1df671df3a5df4efa f0233c58f78ee3766461523874285dbfdb1917d4 046c7fbb22b46501d2ee493f418796da2364a5ba 9e755063ec695e145d0ddca0d4a4c7e3fdb19967 ea1881cc6cad725b663a0c1d6ed001ca26093c99 4389d5cc07d6b422c0aed7ed455e176657659262 5feb04ea355b7e817e5a28ca18f4972dbd9f3855 1104c9f45b400281d2b07b99be130190c6742019 97e0b329de2e8a6a6a5f8a504b30cf6f25aa1f0f 2fef643df4a633433cef50887bf02788d8086e5c 2c56ba9a9e21bc2f21a91f85911e900326038456 a36124539a1c73a98d9d5f0644706c6527243ff7 e2ff61e93d429e429449444cf132254457da112a e0a236e6e6ab03a05ff392a59f3fd35b9050919d b16ecd2bd89fd5785029f97760aca9f712f88649 4ab428b6f9b5b41f06d7ed61f8810c3c8f1a0e61 888fdc266b2d2643dcbef77a66115c94fd804db0 fb2a6134664d29722689a45e1420bdea8dfe6d5a 6142fb98d4be47c30669a5c953b243608ac65f76 77d79d2ba615f8051a522c9dc47c0518cbb6f0aa 8c51cb5fbc867a23f393afcfbc7cd1f4a4afdba8 3537177fee199c25cb73e379e27c535b5052ef6c ceacb53266dd99f52030579b43952a03e6a8534a da1b6bb5d21dbe9aa109d852df6e5bf57ddd3788 b41c8c197a99bb5eaaf578a7dc4aca4be2f29bf4 0efd69f80bc3f656dc6c79950c88978836b73c99 a7dc295bb286c6503ba0a395d39a783ec678841f} 7a241f6761ae6201959287f84fe982876c0499df 53ca710f2e35ec741e2c34029222e3fa9e9bc59d {49133775d98c2da941819e3630b65dcd5f9ba051 53ca710f2e35ec741e2c34029222e3fa9e9bc59d} 7a241f6761ae6201959287f84fe982876c0499df 7537087e7cabb5e4521e681df891f23edd4ad381 7537087e7cabb5e4521e681df891f23edd4ad381 7537087e7cabb5e4521e681df891f23edd4ad381 d8111bc254373e679ca0e46aed9de185750c03a4 {3020fcaa3bd05a9c9da3ecbbfcf8db0ae68d2873 b490d617945e95f73860284465926745c8f2c506 30c385021b05f816f22d076b646e189dab3b004b 9259792fed9bf66dd5c3dcc218516efe61d83e9a bffdc1804dbb8e50dd3002f95f55573c9354a8df 3596f3c2ac157738e5328093e124bce6088a2914 f4ab40440ee319cf7537d52938ff646472ec5e2a 27a622f77c96d70288ea1514b971ebb2128b1aa2 7e1ad861ccbb8ac5f5525ffc9337ec27d3344105 50da76c9742b0c6531daf2f8ab56ff168f83c837 e64a0ddd61cdd7f955ed3f11a56210c02db75d20 a3bd37f061ff1fed9991f100627397b2a1a32e74 c87891be924b1b4ff1c70137b7c10a4d98732730 bb01849a0f060b4cf5dc00152187615f2e8472f6 d0f3d80f3dd157d6b2a8dc133e1714389f0b63e2 00316410c3a8cc7bae813d8abd9f74b077431830 08f130e80ecb783fb39f92566c2828d2237e9c14 1b83c88466bddfa997154966396ae98c9f83c98e 46446c3b5c23b541ca74e7aa46a1901f0fac747f 84b373b1d40a0a41ae350c5f00aea8fc50b2c7c4 b80eb3dcf5f89ecfcda0ab00a6c73efac0891dd2 d8ddb42bd0f2f273d13c6201c7ac3610b7053210 6883fc4f520e836dd11cdf4a6ccc0abc6fb82ab2 c2fb702f3ea49761325aec53bcd23526d5be9398 bce0690fadf2655e69fc52eefe3aa1229448fc1a 2948c15728fc404735497c0bbad77cefa06a6b77 405cdddd20b7be925df07901691c1ef56e5e82cd ad2b5b6de87a48367be6e4a6a4c8fd73ac08b3dc b63b96f71a7eeb4dd80ce0ce4c1349afb7261c04 0bf88f193fabb206a9041f52fa8daf9ad20fd3d6 a654bf19a32c356f0ba49ac47e9a2a98bbf492c4 681d906d51f427e11530f03a1ddd677d602d9b61 e66012beb2d38fbe66844964a42cd6e3175e3ba8 92d899ca59e0e9ded306b54d9277fe712eb61156 177e4d86c5103ada99c8497462fcbf4e2fa66870 4a271376a932751ba1d1500937d64cae66cd31cd feda37e889528c19aad8acb55eaf218c5959ce80 857af9794f2b234c488367df2c156c9bde16f74d 0f3653758be1b41d82d350a5bb4f699cbbebfa69 10816d390948ed0c3b80f5b5ce0d8676cbbbfb19 b78502032e7b0ee3848bdec0019576794e50e8e9 389bf75117ecd2a35a8b20edd09d60e2315e5fed a9a64195a4f6803556679da037a16914952afb9b d59fcf1d667e58c40c6296d57503615112a8e6c7 59b8030ea3ee0a42b5c5eafaadb16f7d0c455a91 5651840c2a71411367c5609100b5bd7b60d1ee6e 2f4bc73ac4f674e289f8a4f81421d23f5b794545 fed37eeacbb317356709a767a4473182827ac444 4a50737a54a778617cf498a67a68c807604166a5 fcebe388d718f44431be35d57596fb886e4164f8 14c3de039db17044ba2476be58578470d50d1413 5e17f65473d4a20bf6a37d2837c2ff278c6fd921 9b930af4cde7113153030ad049911bf62ad28a00 374dbfd3ce8e016c4dbb27ba03e7719183a3bae2 a00e86d6672fd4b520c98cd5e064ddee0ea0b8ee 8f756bc9c6f846f5a430fef1b721fccb0633dd18 7abb42c61154b9602c787d33b140a4739e37b81c a186d566e91e133bce852709ff0af4cd0dcce85c 5c0dd3ccc82b876e89160348d19f4b5d428305e9 c7d9c421cc171bb16581f356a4ad9602dc9f73fb 12487ddad30f71d17fca6295425b5252ff366158 353239e2829e8a61740daa51ccf29e53a002b1fa 9f3ec77c9e0a969f0bc0882860a7367527db377a 535ee1dad58fdc5a336f5e329118e5816927c231 c3ec9ef53582b7a29299cdb2034dc6fac8157d27 cc114631700df0ed0630419b290f41093862b167 cdc247b8f6d5e7c04d28a44b0125eb8b343828f7 3980341e0306c35d8698b10468ba8f0854e6f02d f59deff6a886c9c52a41ed68d99b3aab72729c98 e61a5d8151ec1ad87fe2cde31a987917ac7648fa a3ac7a8a2d38cb4179cd39e7054bcaaceacd5947 951fb5fc8e1c5b7d8b6e508ae1afdc4b4709a69d f042b9f009df4865a80c580698febf59939c1289 a0fe4469362cec95e2665c513a397e3edf24a59f 2b7a1d28d75d52d00dec8de177ff174f32ad3f67 b62b6d36f55fe39feae2b5f429411ff342f56f2f ddfd536b2f42eca52d4237740d0747e8c2823a9b 03931fc36137e3af66cd7e53031242798167d976 5b0e287cf5d20905c5fb8dd94a6aad2802eaa7fe fab439a29a51bfcad4ab569705c1c9229faa8999 4c861ad28c74328df801713768c39dcb952036fb 74745511907bdf55731f1bb109107a6f1476aef2 06b98ce80def9a9d7a9c7657aeb98676341ec2a4 f0d1b0f378e7959bd71aeb5b9150a0357c641a4d 10d20a630927e01b35458686a539a5b999d6eb0c 3d3715ffd973a734979362593cbc3b846abbb3a2 b0baebcfb51d4fb6fe6b3b750c3b7a1d33a25740 19096a79c98f4d6c7f61fb565f3a205166ddaaae 66090e08b2168a268d9939006b7196ac6964dc58 6e1218c18fff1ebc076bae5ccb16872f9f3de62a ea9ad6dadf5f40bb1c40411277bc277aa43ff616 12ef837d7b18b14741e8b43ebdfb0827cd17c655 6f029e61ef0900c301b6b521f7f649efe66c7b47 dd13a48060ed8d7565d78699e1f7881019fa16bd 10eec33e3692ae42b980b77e180d13d2f9d415b4 5c8ecbcf017f6053e7517d4c08715e24ec6032e0 5d9493bd7060e9bbf180bbab73e013cb955ba4e1 04da991d1554a7e9270297289e38bbe3beea1301 330a5affdc6c455d2266e9e907bc0bd41ef73f6e 41eb984d477c1a5f87f4496abc271a5bf869e229 58980903973e3fc2ff0dcb46373fef2c8ffdbfde 753fdd016b038d1284b13e8b4069e698af1696bd a14ac1c3ef44eb32e5c7cf108fb3913f9f14ea7b 4e806500006a9bc66f2dcb07ea6a3036b9b01005 6093ab5c93fae71bd288df6e7f0b046790a030c6 e07fae7d9648d6cf49b483e0bbce203a883397cf 4d183f3a11b809b5156555620285f19c489a6c36 057d5470756a7d0fda374be338a3a5b0c859782e 2f4a010288ed15ff5163cc572ef79ff62106ac38 61c53d88c5c55661d99df750fa12df32766a2f65 405d98a942ff58ef6540b0af4ff8eb2c3840aee4 b8cda547240c13f7ed0ca6a5208789b4d445a7c0 9948fbd2d70fa002532a2d56f97d5da58e43ec7b 3779f3fc708089c26b3fe027f6264c76359df519 f071189efa8890aa364604c7938c24bf8860b603 46668224a7bf158273f1fde80283ecb0b7eebdf7 13eb7fe8cc22ee4f6fca72ee108c11d29f04abd8 1840abf252bb332c193c5feebf9d829e45ee6c08 542395ec1fa32b5a359c48d7adc4b5179fd4c3cc 1c6cc55501a5ae49a515ef6273b75c4fd83e3af8 4badce58769e955d1022c7283f0615b87631cc56 b2ad943b8cf46fde279161fd9320ef94be3053df be447f6d106d4fd1f6691226d9177e5dab0b8c5a 411481ef2ee186555da2ca2d616a706d606ee30b 7c7786c80b28a5e807107ddbe6e878ee716aec20 7408e8f134c5be7c30a8bd7b50442cb176703d34 5c8790698987ece265526ced5933977410756d90 35ce2c676d7bb3c469401a4a3d108255b75bdc4e 503a1311ae13a9558a741372621f281564ba34c2 9b82590464ff7c8b0c75c8088bcc5a70509ed6c2 f6d73638bd506674064ca91de9e024db9f1f5fa9 a0b26e4ec8d705045f4621c92afe958e55f8cb05 1242e4d6a2cd607169d4270db7eb3cb42491b711 6b1d5e3ab5f5d50783a7806363462308a685669f c7fffa550e783e682935bb4edbb6cc0f2861c3ff 72b8091d1b2aa38c0f5c35faa94ed2bb579ad0cb ba05de1764331ded9838dddc986d9b0f641b67aa aa6b1bcc208c66474f870cce618f69cc1357fec7 33f728fb9b34891568ae8c4d5929130722c86fbd fd4f5e4b0d9c10dcf628899d9062e5ffae0bf9b0 0591d68dedce8d0b8d855ff9c9fdf5172728f8de b17ec6a502f5ec1193a58ff6fcb2f169cec8b5c8 0a97de697c569bd99423a45cbbff69d5bcd03919 a4c6b767aac8fd20046ae36937a4bedc7db2ce95 b409f491004cb54f4b786faedc6c55eed0b1acfc 289433bd71ab30e93a27681c9ca5171a84db791b 5069719e4abf877b27f0fe89218a2fe503872cee 1dfa70f9cf27e6519ef492acee5ac735f4a9dbf3 be1cc78576af1ff5fafa5297aafa91c106d744d3 773e728af8823de8eb896e8037bf1df6ff9594c5 2d2ccc9e4a09404afda92bb82800943db71188f0 bddb9fb3054140ac41eb3e91bbd3d45e1ffc3045 57185ee126f53f31709812fdfcddadef22ca5af9 b4f0bac92048539207df32e332ea8134aaea3279 9245c89a3da31291aebd3ce4e8b0abd7951af85c 4c011fb3e1d5d9c863d3249251eb6b45550d88aa fdb115cef6b8271537159f1c9c61d490f3be3ec8 54c6644b2390f2bc46887500f342388cd5dc3e1f c13b39360b61f9c0182c81cb4986fc3b5344b6cb b8feeb3c53f87fefa6ab16610b1c8dc6f4067cae 6adc18811ed5beed5afdd3e818dac62836829144 3d971fb7e97ff41f978a328036c21212f3ec27a7 abbfe712acb39e40ae037c0f2bf2251a063eec8b a9322ee17de58d4c180daf5d131741f88a668ca8 e68a727b0844380ffe35e10cc228c1e4bfe0bde4 42f6823e1f4e21cb839408bcc89400363e6884ac 3584fbde7e7c351f28e7a831791fd3022a191b9b 7f5c2ad379481e59bf36ce7e07253def226b09d6 0a54fe095863524cb5df44c604cccb170d9c9c4f e41d4cb8a0b9a973252162d727d8781ca73002c9 745c6cc464a26ae72f73b64b570fde63559df029 c593a33012ca03d52f8bd01f114854c66d274594 6049c741124070231eb265c6c46bfe097fef05cf e8817e74fbaff7686becd8a6af503d5bfb072d9a a893d9f45fcfc139636cf7c5de742aff05fd6a5b 8cd5b56af49d129ace68d493478ac18fae6e58dc 8944667803fb65f080b4d49e825390453cfc988f 579848355f180d7bb712b88b6bc9f1f5d701eeb5 290ade021a63c06c5787ea685a8897a623c930d3 ac9db7729057c42747d7294c0c05197a498be989 c74e207d179487d818255f3ac83e32f081f08fd5 4ea14774a1a0dd72098dc83ee99ad665f7da7117 d35ebc74407ebaa0f6023f471da8127ae768a51f d8111bc254373e679ca0e46aed9de185750c03a4} 53ca710f2e35ec741e2c34029222e3fa9e9bc59d ffeb42db543e683ae7a1f2c292f1e475f56533c8 {ae292b9699740f9aa74b7502a0d0a5f3e8d76a36 ffeb42db543e683ae7a1f2c292f1e475f56533c8} 53ca710f2e35ec741e2c34029222e3fa9e9bc59d 4d8d1fec933acb35da595fe34f16211461713934 4d8d1fec933acb35da595fe34f16211461713934 4d8d1fec933acb35da595fe34f16211461713934 496c4658f9ca34b63b38f880049ab64f58adbd7f {45fdb81d19178de4a658e7de27f1fbbf5f64e3a6 67e626639f5406d93b19dfd3f36445e3ad2de402 496c4658f9ca34b63b38f880049ab64f58adbd7f} ffeb42db543e683ae7a1f2c292f1e475f56533c8 91c5a1e13c0a2d66f39b52f7c4141d001cf846a4 {5605a28306acf98166c75ecada17c8ae0349643e 91c5a1e13c0a2d66f39b52f7c4141d001cf846a4} ffeb42db543e683ae7a1f2c292f1e475f56533c8 496c4658f9ca34b63b38f880049ab64f58adbd7f 496c4658f9ca34b63b38f880049ab64f58adbd7f 1 vmfs-tools/.git/hooks/0000755000000000000000000000000011733303642012043 5ustar vmfs-tools/.git/hooks/pre-applypatch.sample0000755000000000000000000000061611733303642016205 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. # # To enable this hook, rename this file to "pre-applypatch". . git-sh-setup test -x "$GIT_DIR/hooks/pre-commit" && exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} : vmfs-tools/.git/hooks/update.sample0000755000000000000000000000703311733303642014536 0ustar #!/bin/sh # # An example hook script to blocks unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new # # To enable this hook, rename this file to "update". # # Config # ------ # hooks.allowunannotated # This boolean sets whether unannotated tags will be allowed into the # repository. By default they won't be. # hooks.allowdeletetag # This boolean sets whether deleting tags will be allowed in the # repository. By default they won't be. # hooks.allowmodifytag # This boolean sets whether a tag may be modified after creation. By default # it won't be. # hooks.allowdeletebranch # This boolean sets whether deleting branches will be allowed in the # repository. By default they won't be. # hooks.denycreatebranch # This boolean sets whether remotely creating branches will be denied # in the repository. By default this is allowed. # # --- Command line refname="$1" oldrev="$2" newrev="$3" # --- Safety check if [ -z "$GIT_DIR" ]; then echo "Don't run this script from the command line." >&2 echo " (if you want, you could supply GIT_DIR then run" >&2 echo " $0 )" >&2 exit 1 fi if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then echo "Usage: $0 " >&2 exit 1 fi # --- Config allowunannotated=$(git config --bool hooks.allowunannotated) allowdeletebranch=$(git config --bool hooks.allowdeletebranch) denycreatebranch=$(git config --bool hooks.denycreatebranch) allowdeletetag=$(git config --bool hooks.allowdeletetag) allowmodifytag=$(git config --bool hooks.allowmodifytag) # check for no description projectdesc=$(sed -e '1q' "$GIT_DIR/description") case "$projectdesc" in "Unnamed repository"* | "") echo "*** Project description file hasn't been set" >&2 exit 1 ;; esac # --- Check types # if $newrev is 0000...0000, it's a commit to delete a ref. zero="0000000000000000000000000000000000000000" if [ "$newrev" = "$zero" ]; then newrev_type=delete else newrev_type=$(git cat-file -t $newrev) fi case "$refname","$newrev_type" in refs/tags/*,commit) # un-annotated tag short_refname=${refname##refs/tags/} if [ "$allowunannotated" != "true" ]; then echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 exit 1 fi ;; refs/tags/*,delete) # delete tag if [ "$allowdeletetag" != "true" ]; then echo "*** Deleting a tag is not allowed in this repository" >&2 exit 1 fi ;; refs/tags/*,tag) # annotated tag if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 then echo "*** Tag '$refname' already exists." >&2 echo "*** Modifying a tag is not allowed in this repository." >&2 exit 1 fi ;; refs/heads/*,commit) # branch if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then echo "*** Creating a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/heads/*,delete) # delete branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a branch is not allowed in this repository" >&2 exit 1 fi ;; refs/remotes/*,commit) # tracking branch ;; refs/remotes/*,delete) # delete tracking branch if [ "$allowdeletebranch" != "true" ]; then echo "*** Deleting a tracking branch is not allowed in this repository" >&2 exit 1 fi ;; *) # Anything else (is there anything else?) echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 exit 1 ;; esac # --- Finished exit 0 vmfs-tools/.git/hooks/applypatch-msg.sample0000755000000000000000000000070411733303642016203 0ustar #!/bin/sh # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. # # The hook should exit with non-zero status after issuing an # appropriate message if it wants to stop the commit. The hook is # allowed to edit the commit message file. # # To enable this hook, rename this file to "applypatch-msg". . git-sh-setup test -x "$GIT_DIR/hooks/commit-msg" && exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} : vmfs-tools/.git/hooks/pre-commit.sample0000755000000000000000000000325011733303642015325 0ustar #!/bin/sh # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should # exit with non-zero status after issuing an appropriate message if # it wants to stop the commit. # # To enable this hook, rename this file to "pre-commit". if git rev-parse --verify HEAD >/dev/null 2>&1 then against=HEAD else # Initial commit: diff against an empty tree object against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 fi # If you want to allow non-ascii filenames set this variable to true. allownonascii=$(git config hooks.allownonascii) # Redirect output to stderr. exec 1>&2 # Cross platform projects tend to avoid non-ascii filenames; prevent # them from being added to the repository. We exploit the fact that the # printable range starts at the space character and ends with tilde. if [ "$allownonascii" != "true" ] && # Note that the use of brackets around a tr range is ok here, (it's # even required, for portability to Solaris 10's /usr/bin/tr), since # the square bracket bytes happen to fall in the designated range. test $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 then echo "Error: Attempt to add a non-ascii file name." echo echo "This can cause problems if you want to work" echo "with people on other platforms." echo echo "To be portable it is advisable to rename the file ..." echo echo "If you know what you are doing you can disable this" echo "check using:" echo echo " git config hooks.allownonascii true" echo exit 1 fi # If there are whitespace errors, print the offending file names and fail. exec git diff-index --check --cached $against -- vmfs-tools/.git/hooks/pre-rebase.sample0000755000000000000000000001155311733303642015303 0ustar #!/bin/sh # # Copyright (c) 2006, 2008 Junio C Hamano # # The "pre-rebase" hook is run just before "git rebase" starts doing # its job, and can prevent the command from running by exiting with # non-zero status. # # The hook is called with the following parameters: # # $1 -- the upstream the series was forked from. # $2 -- the branch being rebased (or empty when rebasing the current branch). # # This sample shows how to prevent topic branches that are already # merged to 'next' branch from getting rebased, because allowing it # would result in rebasing already published history. publish=next basebranch="$1" if test "$#" = 2 then topic="refs/heads/$2" else topic=`git symbolic-ref HEAD` || exit 0 ;# we do not interrupt rebasing detached HEAD fi case "$topic" in refs/heads/??/*) ;; *) exit 0 ;# we do not interrupt others. ;; esac # Now we are dealing with a topic branch being rebased # on top of master. Is it OK to rebase it? # Does the topic really exist? git show-ref -q "$topic" || { echo >&2 "No such branch $topic" exit 1 } # Is topic fully merged to master? not_in_master=`git rev-list --pretty=oneline ^master "$topic"` if test -z "$not_in_master" then echo >&2 "$topic is fully merged to master; better remove it." exit 1 ;# we could allow it, but there is no point. fi # Is topic ever merged to next? If so you should not be rebasing it. only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` only_next_2=`git rev-list ^master ${publish} | sort` if test "$only_next_1" = "$only_next_2" then not_in_topic=`git rev-list "^$topic" master` if test -z "$not_in_topic" then echo >&2 "$topic is already up-to-date with master" exit 1 ;# we could allow it, but there is no point. else exit 0 fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` /usr/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { /^([0-9a-f]+) /; ($1 => 1); } split(/\n/, $ARGV[1]); for my $elem (map { /^([0-9a-f]+) (.*)$/; [$1 => $2]; } split(/\n/, $ARGV[2])) { if (!exists $not_in_next{$elem->[0]}) { if ($msg) { print STDERR $msg; undef $msg; } print STDERR " $elem->[1]\n"; } } ' "$topic" "$not_in_next" "$not_in_master" exit 1 fi exit 0 <<\DOC_END ################################################################ This sample hook safeguards topic branches that have been published from being rewound. The workflow assumed here is: * Once a topic branch forks from "master", "master" is never merged into it again (either directly or indirectly). * Once a topic branch is fully cooked and merged into "master", it is deleted. If you need to build on top of it to correct earlier mistakes, a new topic branch is created by forking at the tip of the "master". This is not strictly necessary, but it makes it easier to keep your history simple. * Whenever you need to test or publish your changes to topic branches, merge them into "next" branch. The script, being an example, hardcodes the publish branch name to be "next", but it is trivial to make it configurable via $GIT_DIR/config mechanism. With this workflow, you would want to know: (1) ... if a topic branch has ever been merged to "next". Young topic branches can have stupid mistakes you would rather clean up before publishing, and things that have not been merged into other branches can be easily rebased without affecting other people. But once it is published, you would not want to rewind it. (2) ... if a topic branch has been fully merged to "master". Then you can delete it. More importantly, you should not build on top of it -- other people may already want to change things related to the topic as patches against your "master", so if you need further changes, it is better to fork the topic (perhaps with the same name) afresh from the tip of "master". Let's look at this example: o---o---o---o---o---o---o---o---o---o "next" / / / / / a---a---b A / / / / / / / / c---c---c---c B / / / / \ / / / / b---b C \ / / / / / \ / ---o---o---o---o---o---o---o---o---o---o---o "master" A, B and C are topic branches. * A has one fix since it was merged up to "next". * B has finished. It has been fully merged up to "master" and "next", and is ready to be deleted. * C has not merged to "next" at all. We would want to allow C to be rebased, refuse A, and encourage B to be deleted. To compute (1): git rev-list ^master ^topic next git rev-list ^master next if these match, topic has not merged in next at all. To compute (2): git rev-list master..topic if this is empty, it is fully merged to "master". DOC_END vmfs-tools/.git/hooks/post-update.sample0000755000000000000000000000027511733303642015522 0ustar #!/bin/sh # # An example hook script to prepare a packed repository for use over # dumb transports. # # To enable this hook, rename this file to "post-update". exec git update-server-info vmfs-tools/.git/hooks/prepare-commit-msg.sample0000755000000000000000000000232711733303642016765 0ustar #!/bin/sh # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the # commit message, followed by the description of the commit # message's source. The hook's purpose is to edit the commit # message file. If the hook fails with a non-zero status, # the commit is aborted. # # To enable this hook, rename this file to "prepare-commit-msg". # This hook includes three examples. The first comments out the # "Conflicts:" part of a merge commit. # # The second includes the output of "git diff --name-status -r" # into the message, just before the "git status" output. It is # commented because it doesn't cope with --amend or with squashed # commits. # # The third example adds a Signed-off-by line to the message, that can # still be edited. This is rarely a good idea. case "$2,$3" in merge,) /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; # ,|template,) # /usr/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$1" ;; *) ;; esac # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" vmfs-tools/.git/hooks/commit-msg.sample0000755000000000000000000000160011733303642015322 0ustar #!/bin/sh # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file # that has the commit message. The hook should exit with non-zero # status after issuing an appropriate message if it wants to stop the # commit. The hook is allowed to edit the commit message file. # # To enable this hook, rename this file to "commit-msg". # Uncomment the below to add a Signed-off-by line to the message. # Doing this in a hook is a bad idea in general, but the prepare-commit-msg # hook is more suited to it. # # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" # This example catches duplicate Signed-off-by lines. test "" = "$(grep '^Signed-off-by: ' "$1" | sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { echo >&2 Duplicate Signed-off-by lines. exit 1 } vmfs-tools/.git/ORIG_HEAD0000644000000000000000000000005111733555434012170 0ustar 670ac9502ac8ec55610b5b9015576f89484c8b0a vmfs-tools/.git/FETCH_HEAD0000644000000000000000000000274211733412720012260 0ustar 13ffcb2067a74dc2f628f13796343566a6a297fe branch 'master' of git://git.glandium.org/vmfs-tools 670ac9502ac8ec55610b5b9015576f89484c8b0a not-for-merge branch 'debian' of git://git.glandium.org/vmfs-tools 8eefcdc7c528c76b6a8f7d749eb5956b8d4d52e2 not-for-merge branch 'lvm' of git://git.glandium.org/vmfs-tools 7537087e7cabb5e4521e681df891f23edd4ad381 not-for-merge branch 'stable' of git://git.glandium.org/vmfs-tools f924b4c0d0020361de2eed614b7d21de4c965271 not-for-merge tag 'debian/0.2.1-1' of git://git.glandium.org/vmfs-tools 4d226b0519309172f2faad905d1695e12bb6d22a not-for-merge tag 'v0.1.0' of git://git.glandium.org/vmfs-tools dd3c52f0f619612ad5fd85b4cf639078522c57db not-for-merge tag 'v0.1.1' of git://git.glandium.org/vmfs-tools 85a2e693bb2bbddf32af47e373fb70ee4898a196 not-for-merge tag 'v0.1.2' of git://git.glandium.org/vmfs-tools e70ae062238c17372448c6ceab18b1160b0229cc not-for-merge tag 'v0.2.0' of git://git.glandium.org/vmfs-tools eb25508054437ca5eec8dbd29333a507b7854d3b not-for-merge tag 'v0.2.1' of git://git.glandium.org/vmfs-tools dbd80614e091373bdb1e51d04985c1e7c0eb3125 not-for-merge tag 'debian/0.1.0-1' of git://git.glandium.org/vmfs-tools 74aac0fd22e8d579eeb936e20143426e0958516d not-for-merge tag 'debian/0.1.1-1' of git://git.glandium.org/vmfs-tools bcaab586b2cc4e1d1f5fbeb674beecfa5f8d6b34 not-for-merge tag 'debian/0.1.2-1' of git://git.glandium.org/vmfs-tools 4b0fea489618d5b505c54585b697314b49af8993 not-for-merge tag 'debian/0.2.0-1' of git://git.glandium.org/vmfs-tools vmfs-tools/.git/index0000644000000000000000000001325011733555664011770 0ustar DIRC>On`ϋOn`ϋD-WuN5(9 .gitignoreOmiOmi=T]I(9V5I9)XAUTHORSOn%j On%j )w>xg GNUmakefileOmiOmiFC\G Y0z%1LICENSEOmiOmiõLN `YREADMEOmiOmioGSl/=,bTODOOmiOmit𾶪Ҋi}NQ~ configureOmiOmiq$i2l}zu configure.mkOnۖ3KSOnۖ3KSR/P4%Sdebian/changelogOnLKOnLK=`C۝,( debian/compatOnLKOnLKe!lX.߂k}wjz debian/controlOnLKOnLK+.Z y"@u|debian/copyrightOnLKOnLK3hn*浄Ү debian/rulesOn%-sOn%-sFi)QZRZdebugvmfs/debugvmfs.cOn%-sOn%-sL rW;%ݗ"debugvmfs/debugvmfs.txtOn%-sOn%-sc*4XonWuΗlibvmfs/vmfs_bitmap.cOn+ROn+R(iTOefwlibvmfs/vmfs_bitmap.hOn%-sOn%-s*1'*T0!ڇ@*9libvmfs/vmfs_block.cOn%-sOn%-s98̸wHlibvmfs/vmfs_block.hOn%-sOn%-sEЍ057libvmfs/vmfs_device.hOn%-sOn%-s*=6A^+}8:s=^_zlibvmfs/vmfs_dirent.cOm :Om : O|, ,P(Va=libvmfs/vmfs_dirent.hOn%-sOn%-s'IN{H b@yoh*_libvmfs/vmfs_file.cOm :Om : D_C ԷV\libvmfs/vmfs_file.hOn%-sOn%-s"UR`%tlibvmfs/vmfs_fs.cOn%-sOn%-sߒ rw-=AOF?libvmfs/vmfs_fs.hOn%-sOn%-sИVD bjeV>S^libvmfs/vmfs_heartbeat.cOm :Om :  p{ $~d8ܬ(libvmfs/vmfs_heartbeat.hOn%-sOn%-s藂cX}^*{ٖlibvmfs/vmfs_host.cOm :Om :oPI Zd#m(at)libvmfs/vmfs_host.hOn%-sOn%-sUB(NTT鲏xD^libvmfs/vmfs_inode.cOn%-sOn%-sBK?¯Nu5Zlibvmfs/vmfs_inode.hOn%j On%j N %iM^%x8 -libvmfs/vmfs_lvm.cOn%j On%j FsX28oQSqa/l}libvmfs/vmfs_volume.cOn%j On%j )̶NPuG0>flibvmfs/vmfs_volume.hOn`SOn`.d썿AL:9E,[ (test.imgOmOm 5w{u}BWutils.mkOmOm s"j+o&vmfs-fuse/manifest.mkOn%j On%j 5HSyqMN+uOCEދvmfs-fuse/vmfs-fuse.cOmOmxy26e7s6\vmfs-fuse/vmfs-fuse.txtOn%j On%j [b+w\^vZce-1vmfs-lvm/manifest.mkOn%j On%j \[z;U]wvmfs-lvm/vmfs-lvm.cOn%j On%j ]ōH eUGIZvmfs-lvm/vmfs-lvm.txtTREE#62 8 Db~)i]b fdebian5 0 \jL} *$ǒJ!zimager2 0 !"#wv++w)D~libvmfs29 0 ֓g.P˭,Ovmfs-lvm3 0 Ob !b|!ywӳAdebugvmfs4 0 KRdMׁhQzwhsfsck.vmfs3 0 ;O3#I>PqNⰓvmfs-fuse3 0 $i2HH5Plibreadcmd3 0 gi*BDREUCGNUmakefile100644100644100644XHWkJ}V.(trSs;#3)ذ"+ԒPxyWdebugvmfs/readcmd.c10064410064403 "4G8ޓn K83 "4G8ޓn K8debugvmfs/readcmd.h1006441006440"q FmT^"q FmT^ɛmKb̡M̦f%vmfs-tools/.git/branches/0000755000000000000000000000000011733303642012505 5ustar vmfs-tools/.git/config0000644000000000000000000000074311733555424012123 0ustar [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = git://git.glandium.org/vmfs-tools.git pushurl = git.glandium.org:vmfs-tools.git [remote "github"] url = git@github.com:glandium/vmfs-tools.git fetch = +refs/heads/*:refs/remotes/github/* [branch "master"] remote = origin merge = refs/heads/master [branch "debian"] remote = origin merge = refs/heads/debian vmfs-tools/.git/info/0000755000000000000000000000000011733303642011653 5ustar vmfs-tools/.git/info/exclude0000644000000000000000000000036011733303642013226 0ustar # git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ vmfs-tools/.git/refs/0000755000000000000000000000000011733535326011665 5ustar vmfs-tools/.git/refs/remotes/0000755000000000000000000000000011733411711013332 5ustar vmfs-tools/.git/refs/remotes/origin/0000755000000000000000000000000011733555337014636 5ustar vmfs-tools/.git/refs/remotes/origin/HEAD0000644000000000000000000000004011733303644015244 0ustar ref: refs/remotes/origin/master vmfs-tools/.git/refs/remotes/origin/master0000644000000000000000000000005111733555337016050 0ustar 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 vmfs-tools/.git/refs/remotes/origin/lvm0000644000000000000000000000005111733412720015337 0ustar 8eefcdc7c528c76b6a8f7d749eb5956b8d4d52e2 vmfs-tools/.git/refs/remotes/origin/debian0000644000000000000000000000005111733412720015763 0ustar 670ac9502ac8ec55610b5b9015576f89484c8b0a vmfs-tools/.git/refs/remotes/origin/stable0000644000000000000000000000005111733412720016013 0ustar 7537087e7cabb5e4521e681df891f23edd4ad381 vmfs-tools/.git/refs/remotes/github/0000755000000000000000000000000011733555356014632 5ustar vmfs-tools/.git/refs/remotes/github/master0000644000000000000000000000005111733555356016044 0ustar 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 vmfs-tools/.git/refs/tags/0000755000000000000000000000000011733554775012634 5ustar vmfs-tools/.git/refs/tags/v0.2.10000644000000000000000000000005111733412720013356 0ustar eb25508054437ca5eec8dbd29333a507b7854d3b vmfs-tools/.git/refs/tags/v0.1.20000644000000000000000000000005111733412720013356 0ustar 85a2e693bb2bbddf32af47e373fb70ee4898a196 vmfs-tools/.git/refs/tags/v0.2.00000644000000000000000000000005111733412720013355 0ustar e70ae062238c17372448c6ceab18b1160b0229cc vmfs-tools/.git/refs/tags/debian/0000755000000000000000000000000011733412720014035 5ustar vmfs-tools/.git/refs/tags/debian/0.1.2-10000644000000000000000000000005111733412720014550 0ustar bcaab586b2cc4e1d1f5fbeb674beecfa5f8d6b34 vmfs-tools/.git/refs/tags/debian/0.1.0-10000644000000000000000000000005111733412720014546 0ustar dbd80614e091373bdb1e51d04985c1e7c0eb3125 vmfs-tools/.git/refs/tags/debian/0.2.0-10000644000000000000000000000005111733412720014547 0ustar 4b0fea489618d5b505c54585b697314b49af8993 vmfs-tools/.git/refs/tags/debian/0.2.1-10000644000000000000000000000005111733412720014550 0ustar f924b4c0d0020361de2eed614b7d21de4c965271 vmfs-tools/.git/refs/tags/debian/0.1.1-10000644000000000000000000000005111733412720014547 0ustar 74aac0fd22e8d579eeb936e20143426e0958516d vmfs-tools/.git/refs/tags/v0.1.10000644000000000000000000000005111733412720013355 0ustar dd3c52f0f619612ad5fd85b4cf639078522c57db vmfs-tools/.git/refs/tags/v0.2.50000644000000000000000000000005111733554775013403 0ustar 05e0bfa68f4a862b02e538be371b676c5da188b0 vmfs-tools/.git/refs/tags/v0.1.00000644000000000000000000000005111733412720013354 0ustar 4d226b0519309172f2faad905d1695e12bb6d22a vmfs-tools/.git/refs/heads/0000755000000000000000000000000011733555642012754 5ustar vmfs-tools/.git/refs/heads/master0000644000000000000000000000005111733551143014156 0ustar 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 vmfs-tools/.git/refs/heads/fsck0000644000000000000000000000005111733552640013614 0ustar 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 vmfs-tools/.git/refs/heads/debian0000644000000000000000000000005111733555642014115 0ustar 4a80ce18dc425778aba8eacdfa8b56bb0f79a47f vmfs-tools/.git/rr-cache/0000755000000000000000000000000011733374416012413 5ustar vmfs-tools/.git/logs/0000755000000000000000000000000011733303644011666 5ustar vmfs-tools/.git/logs/HEAD0000644000000000000000000001257211733555642012330 0ustar 0000000000000000000000000000000000000000 7c33aa6f03074c143c6190c0f5ba6ef345541022 Mike Hommey 1332578212 +0100 clone: from git://github.com/glandium/vmfs-tools.git 7c33aa6f03074c143c6190c0f5ba6ef345541022 29cc6a690063c772b6426d69887a18c27dbc324c Mike Hommey 1332607246 +0100 commit: Refactor block id masking 29cc6a690063c772b6426d69887a18c27dbc324c 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e Mike Hommey 1332608044 +0100 commit (amend): Refactor block id masking 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e b7b7d1471f52ae809066c4fc810b8317f6d7fb3e Mike Hommey 1332613212 +0100 commit: Check if number of entries and items in bitmaps doesn't overflow our current knowledge of blocks ids b7b7d1471f52ae809066c4fc810b8317f6d7fb3e 4ecf4bc441c12691ef14afb17c4c6e7ab4ed6537 Mike Hommey 1332613445 +0100 commit (amend): Check if number of entries and items in bitmaps doesn't overflow our current knowledge of blocks ids 4ecf4bc441c12691ef14afb17c4c6e7ab4ed6537 d25f39d7c1af24cbb965b0c89828fbd7477c5ee9 Mike Hommey 1332613639 +0100 commit: Support up to 64 items per entry in sbc bitmap d25f39d7c1af24cbb965b0c89828fbd7477c5ee9 fa722409c034d7c864c014df02601196f3af5a4a Mike Hommey 1332613783 +0100 commit (amend): Support up to 64 items per entry in sbc bitmap fa722409c034d7c864c014df02601196f3af5a4a 7ce0156dfdfee96c50634bfea2d1c36568b108e9 Mike Hommey 1332613934 +0100 commit: f 7ce0156dfdfee96c50634bfea2d1c36568b108e9 4ecf4bc441c12691ef14afb17c4c6e7ab4ed6537 Mike Hommey 1332613955 +0100 checkout: moving from master to 4ecf4bc 4ecf4bc441c12691ef14afb17c4c6e7ab4ed6537 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e Mike Hommey 1332613955 +0100 rebase -i (fixup): updating HEAD 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e 14ecc2c4f12e3d16fc1a2187e0dd0a7f4813bf4d Mike Hommey 1332613955 +0100 rebase -i (fixup): Check if number of entries and items in bitmaps doesn't overflow our current knowledge of blocks ids 14ecc2c4f12e3d16fc1a2187e0dd0a7f4813bf4d 13ffcb2067a74dc2f628f13796343566a6a297fe Mike Hommey 1332613955 +0100 rebase -i (pick): Support up to 64 items per entry in sbc bitmap 13ffcb2067a74dc2f628f13796343566a6a297fe 13ffcb2067a74dc2f628f13796343566a6a297fe Mike Hommey 1332613955 +0100 rebase -i (finish): returning to refs/heads/master 13ffcb2067a74dc2f628f13796343566a6a297fe 51e72318e819e89e61e519d1f3e714d7fe4a7d03 Mike Hommey 1332657020 +0200 am: Actually do the right thing in vmfs_file_lstat_at() 51e72318e819e89e61e519d1f3e714d7fe4a7d03 9810fc4cd0e67ccba756a737c68c2e37c430c028 Mike Hommey 1332657280 +0200 am: Make the version file both a C header file and a Makefile 9810fc4cd0e67ccba756a737c68c2e37c430c028 de039817c9541873b8909718aae88ec6ae538af3 Mike Hommey 1332657518 +0200 am: imager: Fix FIBMAP on files which size is a multiple of the block size de039817c9541873b8909718aae88ec6ae538af3 3f13362169a88e3ed77e0a17554c208c995dd6a0 Mike Hommey 1332657557 +0200 am: imager: Fix lseek offset overflow when skipping zeroes blocks 3f13362169a88e3ed77e0a17554c208c995dd6a0 cab1c0b622e9d1ba4a9451fb6d7e2544727ffd7f Mike Hommey 1332659501 +0200 commit: debugvmfs: Only interpret blkid flags for FB, since we only know the meaning of a FB flag cab1c0b622e9d1ba4a9451fb6d7e2544727ffd7f 8c5e858b21f7479b68fd6253e50c3e10a03dee0e Mike Hommey 1332659815 +0200 commit: Use VMFS_BLK_FILL for VMFS_BLK_FB_TBZ_CLEAR 8c5e858b21f7479b68fd6253e50c3e10a03dee0e 952300fd9fdc55f8a1f2f8c883e3748cf7abf44f Mike Hommey 1332659993 +0200 commit: Remove always true expression 952300fd9fdc55f8a1f2f8c883e3748cf7abf44f a38e31b0fedf51b632a088b0195a54fcf365f110 Mike Hommey 1332660156 +0200 commit: Fix sz type in vmfs_fuse_read a38e31b0fedf51b632a088b0195a54fcf365f110 2b4f440d2e7f7424ee81a52ab5a6fa1ce40be2a5 Mike Hommey 1332660227 +0200 commit: Silence logical-op-parentheses warning 2b4f440d2e7f7424ee81a52ab5a6fa1ce40be2a5 4d97b756972b5271b7284a4120e1b0b198a1e176 Mike Hommey 1332660325 +0200 commit: Remove unused but set variables 4d97b756972b5271b7284a4120e1b0b198a1e176 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 Mike Hommey 1332662883 +0200 commit: Update copyright notices 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 Mike Hommey 1332663712 +0200 checkout: moving from master to fsck 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 Mike Hommey 1332664758 +0200 checkout: moving from fsck to master 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 670ac9502ac8ec55610b5b9015576f89484c8b0a Mike Hommey 1332665108 +0200 checkout: moving from master to debian 670ac9502ac8ec55610b5b9015576f89484c8b0a d5eebc3b760b53f527a165c8fb1abe5e5d0d21f4 Mike Hommey 1332665116 +0200 merge v0.2.5: Merge made by the 'recursive' strategy. d5eebc3b760b53f527a165c8fb1abe5e5d0d21f4 4e6898fa469eded3c522f518132ce2c653308b43 Mike Hommey 1332665158 +0200 commit: Initialize new upstream 4e6898fa469eded3c522f518132ce2c653308b43 4a80ce18dc425778aba8eacdfa8b56bb0f79a47f Mike Hommey 1332665244 +0200 commit (amend): Release 0.2.5-1 vmfs-tools/.git/logs/refs/0000755000000000000000000000000011733535326012631 5ustar vmfs-tools/.git/logs/refs/remotes/0000755000000000000000000000000011733411711014276 5ustar vmfs-tools/.git/logs/refs/remotes/origin/0000755000000000000000000000000011733412720015566 5ustar vmfs-tools/.git/logs/refs/remotes/origin/master0000644000000000000000000000044011733555337017016 0ustar 7c33aa6f03074c143c6190c0f5ba6ef345541022 13ffcb2067a74dc2f628f13796343566a6a297fe Mike Hommey 1332614056 +0100 update by push 13ffcb2067a74dc2f628f13796343566a6a297fe 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 Mike Hommey 1332665055 +0200 update by push vmfs-tools/.git/logs/refs/remotes/origin/lvm0000644000000000000000000000022411733412720016305 0ustar 0000000000000000000000000000000000000000 8eefcdc7c528c76b6a8f7d749eb5956b8d4d52e2 Mike Hommey 1332614608 +0100 pull: storing head vmfs-tools/.git/logs/refs/remotes/origin/debian0000644000000000000000000000022411733412720016731 0ustar 0000000000000000000000000000000000000000 670ac9502ac8ec55610b5b9015576f89484c8b0a Mike Hommey 1332614608 +0100 pull: storing head vmfs-tools/.git/logs/refs/remotes/origin/stable0000644000000000000000000000022411733412720016761 0ustar 0000000000000000000000000000000000000000 7537087e7cabb5e4521e681df891f23edd4ad381 Mike Hommey 1332614608 +0100 pull: storing head vmfs-tools/.git/logs/refs/remotes/github/0000755000000000000000000000000011733411711015560 5ustar vmfs-tools/.git/logs/refs/remotes/github/master0000644000000000000000000000044011733555356017012 0ustar 0000000000000000000000000000000000000000 13ffcb2067a74dc2f628f13796343566a6a297fe Mike Hommey 1332614089 +0100 update by push 13ffcb2067a74dc2f628f13796343566a6a297fe 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 Mike Hommey 1332665070 +0200 update by push vmfs-tools/.git/logs/refs/heads/0000755000000000000000000000000011733555424013716 5ustar vmfs-tools/.git/logs/refs/heads/master0000644000000000000000000000720711733551143015134 0ustar 0000000000000000000000000000000000000000 7c33aa6f03074c143c6190c0f5ba6ef345541022 Mike Hommey 1332578212 +0100 clone: from git://github.com/glandium/vmfs-tools.git 7c33aa6f03074c143c6190c0f5ba6ef345541022 29cc6a690063c772b6426d69887a18c27dbc324c Mike Hommey 1332607246 +0100 commit: Refactor block id masking 29cc6a690063c772b6426d69887a18c27dbc324c 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e Mike Hommey 1332608044 +0100 commit (amend): Refactor block id masking 414850b2c4cbf73b9c3a4e1eaf66299f65153b3e b7b7d1471f52ae809066c4fc810b8317f6d7fb3e Mike Hommey 1332613212 +0100 commit: Check if number of entries and items in bitmaps doesn't overflow our current knowledge of blocks ids b7b7d1471f52ae809066c4fc810b8317f6d7fb3e 4ecf4bc441c12691ef14afb17c4c6e7ab4ed6537 Mike Hommey 1332613445 +0100 commit (amend): Check if number of entries and items in bitmaps doesn't overflow our current knowledge of blocks ids 4ecf4bc441c12691ef14afb17c4c6e7ab4ed6537 d25f39d7c1af24cbb965b0c89828fbd7477c5ee9 Mike Hommey 1332613639 +0100 commit: Support up to 64 items per entry in sbc bitmap d25f39d7c1af24cbb965b0c89828fbd7477c5ee9 fa722409c034d7c864c014df02601196f3af5a4a Mike Hommey 1332613783 +0100 commit (amend): Support up to 64 items per entry in sbc bitmap fa722409c034d7c864c014df02601196f3af5a4a 7ce0156dfdfee96c50634bfea2d1c36568b108e9 Mike Hommey 1332613934 +0100 commit: f 7ce0156dfdfee96c50634bfea2d1c36568b108e9 13ffcb2067a74dc2f628f13796343566a6a297fe Mike Hommey 1332613955 +0100 rebase -i (finish): refs/heads/master onto 4ecf4bc 13ffcb2067a74dc2f628f13796343566a6a297fe 51e72318e819e89e61e519d1f3e714d7fe4a7d03 Mike Hommey 1332657020 +0200 am: Actually do the right thing in vmfs_file_lstat_at() 51e72318e819e89e61e519d1f3e714d7fe4a7d03 9810fc4cd0e67ccba756a737c68c2e37c430c028 Mike Hommey 1332657280 +0200 am: Make the version file both a C header file and a Makefile 9810fc4cd0e67ccba756a737c68c2e37c430c028 de039817c9541873b8909718aae88ec6ae538af3 Mike Hommey 1332657518 +0200 am: imager: Fix FIBMAP on files which size is a multiple of the block size de039817c9541873b8909718aae88ec6ae538af3 3f13362169a88e3ed77e0a17554c208c995dd6a0 Mike Hommey 1332657557 +0200 am: imager: Fix lseek offset overflow when skipping zeroes blocks 3f13362169a88e3ed77e0a17554c208c995dd6a0 cab1c0b622e9d1ba4a9451fb6d7e2544727ffd7f Mike Hommey 1332659501 +0200 commit: debugvmfs: Only interpret blkid flags for FB, since we only know the meaning of a FB flag cab1c0b622e9d1ba4a9451fb6d7e2544727ffd7f 8c5e858b21f7479b68fd6253e50c3e10a03dee0e Mike Hommey 1332659815 +0200 commit: Use VMFS_BLK_FILL for VMFS_BLK_FB_TBZ_CLEAR 8c5e858b21f7479b68fd6253e50c3e10a03dee0e 952300fd9fdc55f8a1f2f8c883e3748cf7abf44f Mike Hommey 1332659993 +0200 commit: Remove always true expression 952300fd9fdc55f8a1f2f8c883e3748cf7abf44f a38e31b0fedf51b632a088b0195a54fcf365f110 Mike Hommey 1332660156 +0200 commit: Fix sz type in vmfs_fuse_read a38e31b0fedf51b632a088b0195a54fcf365f110 2b4f440d2e7f7424ee81a52ab5a6fa1ce40be2a5 Mike Hommey 1332660227 +0200 commit: Silence logical-op-parentheses warning 2b4f440d2e7f7424ee81a52ab5a6fa1ce40be2a5 4d97b756972b5271b7284a4120e1b0b198a1e176 Mike Hommey 1332660325 +0200 commit: Remove unused but set variables 4d97b756972b5271b7284a4120e1b0b198a1e176 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 Mike Hommey 1332662883 +0200 commit: Update copyright notices vmfs-tools/.git/logs/refs/heads/fsck0000644000000000000000000000023311733552640014562 0ustar 0000000000000000000000000000000000000000 35567cd5d3c5978ff970bb6d5cb8dd6c4dbc6829 Mike Hommey 1332663712 +0200 branch: Created from HEAD vmfs-tools/.git/logs/refs/heads/debian0000644000000000000000000000125211733555642015065 0ustar 0000000000000000000000000000000000000000 670ac9502ac8ec55610b5b9015576f89484c8b0a Mike Hommey 1332665108 +0200 branch: Created from refs/remotes/origin/debian 670ac9502ac8ec55610b5b9015576f89484c8b0a d5eebc3b760b53f527a165c8fb1abe5e5d0d21f4 Mike Hommey 1332665116 +0200 merge v0.2.5: Merge made by the 'recursive' strategy. d5eebc3b760b53f527a165c8fb1abe5e5d0d21f4 4e6898fa469eded3c522f518132ce2c653308b43 Mike Hommey 1332665158 +0200 commit: Initialize new upstream 4e6898fa469eded3c522f518132ce2c653308b43 4a80ce18dc425778aba8eacdfa8b56bb0f79a47f Mike Hommey 1332665244 +0200 commit (amend): Release 0.2.5-1 vmfs-tools/LICENSE0000644000000000000000000004310311733303644011067 0ustar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. vmfs-tools/debian/0000755000000000000000000000000011733555664011316 5ustar vmfs-tools/debian/compat0000644000000000000000000000000211733555424012506 0ustar 7 vmfs-tools/debian/control0000644000000000000000000000154511733555424012720 0ustar Source: vmfs-tools Priority: extra Section: otherosfs Maintainer: Mike Hommey Build-Depends: debhelper (>= 7.0.50~), pkg-config, uuid-dev, libreadline-dev | libreadline5-dev, libfuse-dev, asciidoc, xsltproc, docbook-xsl Standards-Version: 3.8.4.0 Package: vmfs-tools Architecture: any Section: otherosfs Depends: ${shlibs:Depends}, ${misc:Depends} Description: Tools to access VMFS filesystems VMFS is a clustered filesystem designed to store virtual machine disks for VMware ESX or ESXi Server hosts. This set of tools allows to access these filesystems from some other non ESX/ESXi host for e.g. maintenance tasks. . Only read access is available at the moment, but write access is under works. Multiple extents are supported. . The VMFS can be accessed with a command line tool or mounted through a userspace filesystem (FUSE-based). vmfs-tools/debian/changelog0000644000000000000000000000303411733555626013166 0ustar vmfs-tools (0.2.5-1) unstable; urgency=low * New upstream release. -- Mike Hommey Sun, 25 Mar 2012 10:47:13 +0200 vmfs-tools (0.2.1-1) unstable; urgency=low * New upstream release. * debian/rules: Minimize rules now that upstream makefile supports everything needed. * debian/control: Bump Standard-Version to 3.8.4.0: No changes required. * debian/copyright: Update copyright years. * GNUmakefile: Avoid creating the config.cache file when dh_auto_clean runs the realclean target. -- Mike Hommey Mon, 05 Apr 2010 17:47:10 +0200 vmfs-tools (0.2.0-1) unstable; urgency=low * New upstream release. * debian/control: - Build-depend on libreadline-dev before libreadline5-dev. Closes: #553889. - Build-depend on a debhelper version that supports dh overrides. - Bump Standard-Version to 3.8.3.0: No changes required. * debian/rules: Workaround for inexistent upstream distclean rule. -- Mike Hommey Mon, 23 Nov 2009 18:31:48 +0100 vmfs-tools (0.1.2-1) unstable; urgency=medium * New upstream release. - Fixes various corruptions when reading data. Closes: #532557. -- Mike Hommey Thu, 11 Jun 2009 22:53:15 +0200 vmfs-tools (0.1.1-1) unstable; urgency=low * New upstream release. -- Mike Hommey Tue, 26 May 2009 20:24:00 +0200 vmfs-tools (0.1.0-1) unstable; urgency=low * Initial release. (Closes: #530022) -- Mike Hommey Sun, 24 May 2009 11:32:52 +0200 vmfs-tools/debian/rules0000755000000000000000000000006311733555424012367 0ustar #!/usr/bin/make -f export NO_STRIP = 1 %: dh $@ vmfs-tools/debian/copyright0000644000000000000000000000075011733555424013245 0ustar Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=48 Name: vmfs-tools Source: http://glandium.org/projects/vmfs-tools/ Copyright: 2009, Christophe Fillot 2009,2010, Mike Hommey License: GPL-2+ On Debian systems the full text of the GNU General Public License can be found in the `/usr/share/common-licenses/GPL-2' file. Files: debian/* Copyright: 2009,2010, Mike Hommey License: GPL-2+ vmfs-tools/.gitignore0000644000000000000000000000021311733555540012051 0ustar *.tar.gz *.[ao] *.xml *.8 version config.cache debugvmfs/debugvmfs fsck.vmfs/fsck.vmfs imager/imager vmfs-fuse/vmfs-fuse vmfs-lvm/vmfs-lvm vmfs-tools/AUTHORS0000644000000000000000000000007511733303644011133 0ustar Christophe Fillot , Mike Hommey vmfs-tools/TODO0000644000000000000000000000074611733303644010560 0ustar Expected for v0.3.0: - Test suite - Make debugvmfs more of a VMFS debugging tool and less of a vmfs-tools testing tool - Better fsck.vmfs Expected for v0.5.0: - Stable internal API - mkfs.vmfs Expected for v1.0.0: - Full write support. Any time: - Check if we want to read/update separately metadata header from the metadata itself (for example: vmfs_inode_read/vmfs_inode_write) - Add locking/unlocking/update functions for metadata headers - Improve build system and portability vmfs-tools/vmfs-fuse/0000755000000000000000000000000011733555664012007 5ustar vmfs-tools/vmfs-fuse/vmfs-fuse.c0000644000000000000000000003275611733555434014076 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #define FUSE_USE_VERSION 26 #include #include #include #include #include "vmfs.h" static vmfs_fs_t *fs; static inline uint32_t ino2blkid(fuse_ino_t ino) { if (ino == FUSE_ROOT_ID) return(VMFS_BLK_FD_BUILD(0, 0, 0)); return((uint32_t)ino); } static inline fuse_ino_t blkid2ino(uint32_t blk_id) { if (blk_id == VMFS_BLK_FD_BUILD(0, 0, 0)) return(FUSE_ROOT_ID); return((fuse_ino_t)blk_id); } static void vmfs_fuse_getattr(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { vmfs_fs_t *fs = (vmfs_fs_t *) fuse_req_userdata(req); struct stat stbuf = { 0, }; if (!vmfs_inode_stat_from_blkid(fs, ino2blkid(ino), &stbuf)) { stbuf.st_ino = ino; fuse_reply_attr(req, &stbuf, 1.0); } else fuse_reply_err(req, ENOENT); } static void vmfs_fuse_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr, int to_set, struct fuse_file_info *fi) { vmfs_fs_t *fs = (vmfs_fs_t *) fuse_req_userdata(req); struct stat stbuf = { 0, }; vmfs_inode_t *inode; if (!(inode = vmfs_inode_acquire(fs,ino2blkid(ino)))) { fuse_reply_err(req, ENOENT); return; } if (to_set & FUSE_SET_ATTR_MODE) inode->mode = attr->st_mode; if (to_set & FUSE_SET_ATTR_UID) inode->uid = attr->st_uid; if (to_set & FUSE_SET_ATTR_GID) inode->gid = attr->st_gid; if (to_set & FUSE_SET_ATTR_ATIME) inode->atime = attr->st_atime; if (to_set & FUSE_SET_ATTR_MTIME) inode->atime = attr->st_mtime; if (to_set & FUSE_SET_ATTR_SIZE) vmfs_inode_truncate(inode,attr->st_size); vmfs_inode_stat(inode,&stbuf); stbuf.st_ino = blkid2ino(inode->id); fuse_reply_attr(req, &stbuf, 1.0); vmfs_inode_release(inode); } static void vmfs_fuse_readlink(fuse_req_t req,fuse_ino_t ino) { vmfs_fs_t *fs = (vmfs_fs_t *) fuse_req_userdata(req); vmfs_file_t *f; size_t str_len; char *str; if (!(f = vmfs_file_open_from_blkid(fs, ino2blkid(ino)))) { fuse_reply_err(req, ENOENT); return; } str_len = vmfs_file_get_size(f); if (!(str = malloc(str_len+1))) { vmfs_file_close(f); fuse_reply_err(req, ENOMEM); return; } if (vmfs_file_pread(f,(u_char *)str,str_len,0) != str_len) { vmfs_file_close(f); free(str); fuse_reply_err(req, EIO); return; } str[str_len] = 0; fuse_reply_readlink(req,str); free(str); } static void vmfs_fuse_mknod(fuse_req_t req,fuse_ino_t parent,const char *name, mode_t mode, dev_t rdev) { struct fuse_entry_param entry = { 0, }; vmfs_inode_t *inode; vmfs_dir_t *dir; int res; if (!(dir = vmfs_dir_open_from_blkid(fs, ino2blkid(parent)))) { fuse_reply_err(req, ENOENT); return; } if ((res = vmfs_file_create(dir,name,mode,&inode)) < 0) { fuse_reply_err(req, -res); return; } vmfs_dir_close(dir); vmfs_inode_stat(inode,&entry.attr); entry.ino = entry.attr.st_ino = blkid2ino(inode->id); entry.generation = 1; entry.attr_timeout = 1.0; entry.entry_timeout = 1.0; fuse_reply_entry(req, &entry); vmfs_inode_release(inode); } static void vmfs_fuse_mkdir(fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode) { struct fuse_entry_param entry = { 0, }; vmfs_inode_t *inode; vmfs_dir_t *dir; int res; if (!(dir = vmfs_dir_open_from_blkid(fs, ino2blkid(parent)))) { fuse_reply_err(req, ENOENT); return; } if ((res = vmfs_dir_create(dir,name,mode,&inode)) < 0) { fuse_reply_err(req, -res); return; } vmfs_dir_close(dir); vmfs_inode_stat(inode,&entry.attr); entry.ino = entry.attr.st_ino = blkid2ino(inode->id); entry.generation = 1; entry.attr_timeout = 1.0; entry.entry_timeout = 1.0; fuse_reply_entry(req, &entry); vmfs_inode_release(inode); } static void vmfs_fuse_unlink(fuse_req_t req,fuse_ino_t parent,const char *name) { vmfs_dir_t *dir; int res; if (!(dir = vmfs_dir_open_from_blkid(fs, ino2blkid(parent)))) { fuse_reply_err(req, ENOENT); return; } res = vmfs_file_delete(dir,name); vmfs_dir_close(dir); fuse_reply_err(req,-res); } static void vmfs_fuse_rmdir(fuse_req_t req,fuse_ino_t parent,const char *name) { vmfs_dir_t *dir; int res; if (!(dir = vmfs_dir_open_from_blkid(fs, ino2blkid(parent)))) { fuse_reply_err(req, ENOENT); return; } res = vmfs_dir_delete(dir,name); vmfs_dir_close(dir); fuse_reply_err(req,-res); } static void vmfs_fuse_opendir(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { vmfs_fs_t *fs = (vmfs_fs_t *) fuse_req_userdata(req); fi->fh = (uint64_t)(unsigned long) vmfs_dir_open_from_blkid(fs, ino2blkid(ino)); if (fi->fh) fuse_reply_open(req, fi); else fuse_reply_err(req, ENOTDIR); } static void vmfs_fuse_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi) { char buf[size]; const vmfs_dirent_t *entry; struct stat st = {0, }; size_t sz; if (!fi->fh) { fuse_reply_err(req, EBADF); return; } if ((entry = vmfs_dir_read((vmfs_dir_t *)(unsigned long)fi->fh))) { st.st_mode = vmfs_file_type2mode(entry->type); st.st_ino = blkid2ino(entry->block_id); sz = fuse_add_direntry(req, buf, size, entry->name, &st, off + 1); fuse_reply_buf(req, buf, sz); } else fuse_reply_buf(req, NULL, 0); } static void vmfs_fuse_releasedir(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { if (!fi->fh) { fuse_reply_err(req, EBADF); return; } vmfs_dir_close((vmfs_dir_t *)(unsigned long)fi->fh); fuse_reply_err(req, 0); } static void vmfs_fuse_statfs(fuse_req_t req, fuse_ino_t ino) { vmfs_fs_t *fs = (vmfs_fs_t *) fuse_req_userdata(req); struct statvfs st; u_int alloc_count; memset(&st,0,sizeof(st)); /* Blocks */ alloc_count = vmfs_bitmap_allocated_items(fs->fbb); st.f_bsize = st.f_frsize = vmfs_fs_get_blocksize(fs); st.f_blocks = fs->fbb->bmh.total_items; st.f_bfree = st.f_bavail = st.f_blocks - alloc_count; /* Inodes */ alloc_count = vmfs_bitmap_allocated_items(fs->fdc); st.f_files = fs->fdc->bmh.total_items; st.f_ffree = st.f_favail = st.f_files - alloc_count; fuse_reply_statfs(req,&st); } static void vmfs_fuse_lookup(fuse_req_t req, fuse_ino_t parent, const char *name) { struct fuse_entry_param entry = { 0, }; vmfs_fs_t *fs = (vmfs_fs_t *) fuse_req_userdata(req); vmfs_dir_t *d = vmfs_dir_open_from_blkid(fs, ino2blkid(parent)); const vmfs_dirent_t *rec; if (!d) { fuse_reply_err(req, ENOENT); return; } rec = vmfs_dir_lookup(d, name); if (rec && !vmfs_inode_stat_from_blkid(fs, rec->block_id, &entry.attr)) { entry.ino = entry.attr.st_ino = blkid2ino(rec->block_id); entry.generation = 1; entry.attr_timeout = 1.0; entry.entry_timeout = 1.0; fuse_reply_entry(req, &entry); } else fuse_reply_err(req, ENOENT); vmfs_dir_close(d); } static void vmfs_fuse_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { vmfs_fs_t *fs = (vmfs_fs_t *) fuse_req_userdata(req); fi->fh = (uint64_t)(unsigned long) vmfs_file_open_from_blkid(fs, ino2blkid(ino)); if (fi->fh) fuse_reply_open(req, fi); else fuse_reply_err(req, ENOTDIR); } static void vmfs_fuse_create(fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, struct fuse_file_info *fi) { struct fuse_entry_param entry = { 0, }; vmfs_dir_t *dir; vmfs_inode_t *inode; vmfs_file_t *f; int res; if (!(dir = vmfs_dir_open_from_blkid(fs, ino2blkid(parent)))) { fuse_reply_err(req, ENOENT); return; } if ((res = vmfs_file_create(dir,name,mode,&inode)) < 0) { fuse_reply_err(req, -res); return; } vmfs_dir_close(dir); if (!(f = vmfs_file_open_from_inode(inode))) { vmfs_inode_release(inode); fuse_reply_err(req,ENOMEM); } fi->fh = (uint64_t)(unsigned long)f; vmfs_inode_stat(inode,&entry.attr); entry.ino = entry.attr.st_ino = blkid2ino(inode->id); entry.generation = 1; entry.attr_timeout = 1.0; entry.entry_timeout = 1.0; fuse_reply_create(req,&entry,fi); } static void vmfs_fuse_read(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info *fi) { char buf[size]; ssize_t sz; if (!fi->fh) { fuse_reply_err(req, EBADF); return; } sz = vmfs_file_pread((vmfs_file_t *)(unsigned long)fi->fh, (u_char *)buf, size, off); if (sz < 0) { fuse_reply_err(req, -sz); return; } fuse_reply_buf(req, buf, sz); } static void vmfs_fuse_write(fuse_req_t req, fuse_ino_t ino, const char *buf, size_t size, off_t off, struct fuse_file_info *fi) { ssize_t sz; if (!fi->fh) { fuse_reply_err(req, EBADF); return; } sz = vmfs_file_pwrite((vmfs_file_t *)(unsigned long)fi->fh, (u_char *)buf, size, off); if (sz < 0) { fuse_reply_err(req, -sz); return; } fuse_reply_write(req,sz); } static void vmfs_fuse_release(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { if (!fi->fh) { fuse_reply_err(req, EBADF); return; } vmfs_file_close((vmfs_file_t *)(unsigned long)fi->fh); fuse_reply_err(req, 0); } const static struct fuse_lowlevel_ops vmfs_oper = { .getattr = vmfs_fuse_getattr, .setattr = vmfs_fuse_setattr, .readlink = vmfs_fuse_readlink, .mknod = vmfs_fuse_mknod, .mkdir = vmfs_fuse_mkdir, .unlink = vmfs_fuse_unlink, .rmdir = vmfs_fuse_rmdir, .opendir = vmfs_fuse_opendir, .readdir = vmfs_fuse_readdir, .releasedir = vmfs_fuse_releasedir, .statfs = vmfs_fuse_statfs, .lookup = vmfs_fuse_lookup, .open = vmfs_fuse_open, .create = vmfs_fuse_create, .read = vmfs_fuse_read, .write = vmfs_fuse_write, .release = vmfs_fuse_release, }; struct vmfs_fuse_opts { char **path; char *paths[VMFS_LVM_MAX_EXTENTS + 1]; char *mountpoint; int foreground; }; static const struct fuse_opt vmfs_fuse_args[] = { { "-d", offsetof(struct vmfs_fuse_opts, foreground), 1 }, { "-f", offsetof(struct vmfs_fuse_opts, foreground), 1 }, FUSE_OPT_KEY("-d", FUSE_OPT_KEY_KEEP), }; static int vmfs_fuse_opts_func(void *data, const char *arg, int key, struct fuse_args *outargs) { struct vmfs_fuse_opts *opts = (struct vmfs_fuse_opts *) data; struct stat st; if (key == FUSE_OPT_KEY_NONOPT) { if (opts->mountpoint) { fprintf(stderr, "'%s' is not allowed here\n", arg); return -1; } if (stat(arg, &st)) { fprintf(stderr, "Error stat()ing '%s'\n", arg); return -1; } if (S_ISDIR(st.st_mode)) { opts->mountpoint = strdup(arg); } else if (S_ISREG(st.st_mode) || S_ISBLK(st.st_mode)) { *(opts->path++) = strdup(arg); } return 0; } return 1; } int main(int argc, char *argv[]) { struct fuse_args args = FUSE_ARGS_INIT(argc, argv); struct vmfs_fuse_opts opts = { 0, }; struct fuse_chan *chan; vmfs_flags_t flags; int err = -1; flags.packed = 0; #ifdef VMFS_WRITE flags.read_write = 1; #endif flags.allow_missing_extents = 1; opts.path = &opts.paths[0]; if ((fuse_opt_parse(&args, &opts, vmfs_fuse_args, &vmfs_fuse_opts_func) == -1) || (fuse_opt_add_arg(&args, "-odefault_permissions"))) { goto cleanup; } if (!(fs = vmfs_fs_open(opts.paths, flags))) { fprintf(stderr,"Unable to open filesystem\n"); goto cleanup; } if ((chan = fuse_mount(opts.mountpoint, &args)) != NULL) { struct fuse_session *session; session = fuse_lowlevel_new(&args, &vmfs_oper, sizeof(vmfs_oper), fs); if (session != NULL) { fuse_daemonize(opts.foreground); if (fuse_set_signal_handlers(session) != -1) { fuse_session_add_chan(session, chan); err = fuse_session_loop(session); fuse_remove_signal_handlers(session); fuse_session_remove_chan(chan); } fuse_session_destroy(session); } fuse_unmount(opts.mountpoint, chan); } cleanup: vmfs_fs_close(fs); fuse_opt_free_args(&args); opts.path = &opts.paths[0]; for(;*opts.path;opts.path++) free(*opts.path); free(opts.mountpoint); return err ? 1 : 0; } vmfs-tools/vmfs-fuse/vmfs-fuse.txt0000644000000000000000000000100711733303644014446 0ustar vmfs-fuse(8) ============ NAME ---- vmfs-fuse - mount VMFS file system SYNOPSIS -------- *vmfs-fuse* 'VOLUME'... 'MOUNT_POINT' DESCRIPTION ----------- The *vmfs-fuse* program allows to mount VMFS file systems. The 'VOLUME' to be opened can be either a block device or an image file. When the VMFS spreads accross several extents, all extents must be given. The 'MOUNT_POINT' indicates where the file system will be attached on the system. AUTHORS ------- include::../AUTHORS[] SEE ALSO -------- debugvmfs(8) vmfs-tools/vmfs-fuse/manifest.mk0000644000000000000000000000003111733303644014125 0ustar REQUIRES := libvmfs fuse vmfs-tools/vmfs-lvm/0000755000000000000000000000000011733555664011643 5ustar vmfs-tools/vmfs-lvm/vmfs-lvm.txt0000644000000000000000000000130511733555434014145 0ustar vmfs-lvm(8) =========== NAME ---- vmfs-lvm - VMFS logical volume manager tool SYNOPSIS -------- *vmfs-lvm* 'VOLUME'... 'COMMAND' DESCRIPTION ----------- The *vmfs-lvm* program allows handle VMFS physical and logical volumes. The 'VOLUME' to be opened can be either a block device or an image file. When the VMFS spreads accross several extents, all extents must be given. COMMANDS -------- *remove*:: Removes the last extent of the logical volume. THIS IS EXPERIMENTAL. USE AT YOUR OWN RISK. It is highly recommended that the volume is not mounted at the same time. This means the tool shouldn't be run on the ESX service console. AUTHORS ------- include::../AUTHORS[] SEE ALSO -------- vmfs-fuse(8) vmfs-tools/vmfs-lvm/manifest.mk0000644000000000000000000000014211733555434013772 0ustar LDFLAGS := $(DLOPEN_LDFLAGS) vmfs-lvm.o_CFLAGS := -include version REQUIRES := libvmfs libreadcmd vmfs-tools/vmfs-lvm/vmfs-lvm.c0000755000000000000000000001536511733555434013566 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009,2011,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "readcmd.h" #include "vmfs.h" /* Until a better API is defined */ int vmfs_bmh_write(const vmfs_bitmap_header_t *bmh,u_char *buf); static int cmd_remove(vmfs_fs_t *fs,int argc,char *argv[]) { /* Dangerous */ vmfs_lvm_t *lvm = (vmfs_lvm_t *)fs->dev; vmfs_volume_t *extent; DECL_ALIGNED_BUFFER(buf,512); vmfs_bitmap_entry_t entry; uint32_t i, blocks_per_segment, items_per_area, items_in_last_entry, old_area_count; fprintf(stderr, "Extents removal is experimental ! Use at your own risk !\n"); while (1) { char *answer = local_readline("Are you sure you want to go further? [y/N] "); char a = answer[0]; char null = answer[1]; free(answer); if ((a == 0) || ((tolower(a) == 'n') && (null == 0))) return(2); if ((tolower(a) == 'y') && (null == 0)) break; } if (lvm->lvm_info.num_extents == 1) { fprintf(stderr, "Can't remove an extent when there is only one\n"); return(1); } /* Get last extent */ extent = lvm->extents[lvm->loaded_extents - 1]; /* Check whether data blocks are used on the last extents */ blocks_per_segment = VMFS_LVM_SEGMENT_SIZE / vmfs_fs_get_blocksize(fs); for (i = extent->vol_info.first_segment * blocks_per_segment; i < extent->vol_info.last_segment * blocks_per_segment; i++) if (vmfs_block_get_status(fs, VMFS_BLK_FB_BUILD(i, 0))) { fprintf(stderr, "There is data on the last extent ; can't remove it\n"); return(1); } /* At filesystem level, only the FBB needs to be downsized */ fs->fbb->bmh.total_items -= extent->vol_info.num_segments * blocks_per_segment; items_per_area = fs->fbb->bmh.items_per_bitmap_entry * fs->fbb->bmh.bmp_entries_per_area; old_area_count = fs->fbb->bmh.area_count; fs->fbb->bmh.area_count = (fs->fbb->bmh.total_items + items_per_area - 1) / items_per_area; memset(buf, 0, buf_len); vmfs_bmh_write(&fs->fbb->bmh, buf); /* TODO: Error handling */ vmfs_file_pwrite(fs->fbb->f, buf, buf_len, 0); /* Adjust new last entry */ if ((items_in_last_entry = fs->fbb->bmh.total_items % fs->fbb->bmh.items_per_bitmap_entry)) { vmfs_bitmap_get_entry(fs->fbb, 0, fs->fbb->bmh.total_items, &entry); entry.free -= entry.total - items_in_last_entry; entry.total = items_in_last_entry; if (entry.ffree > entry.total) entry.ffree = 0; /* Adjust bitmap in last entry */ if (items_in_last_entry % 8) entry.bitmap[items_in_last_entry / 8] &= 0xff << (8 - (items_in_last_entry % 8)); memset(&entry.bitmap[(items_in_last_entry + 7) / 8], 0, (fs->fbb->bmh.items_per_bitmap_entry - items_in_last_entry - 7) / 8); vmfs_bme_update(fs, &entry); } /* Truncate the fbb file depending on the new area count */ if (old_area_count != fs->fbb->bmh.area_count) vmfs_file_truncate(fs->fbb->f, fs->fbb->bmh.hdr_size + fs->fbb->bmh.area_count * fs->fbb->bmh.area_size); /* Adjust entries after the new last one */ for (i = fs->fbb->bmh.total_items + (items_in_last_entry ? (fs->fbb->bmh.items_per_bitmap_entry - items_in_last_entry) : 0); i < fs->fbb->bmh.area_count * items_per_area; i += fs->fbb->bmh.items_per_bitmap_entry) { uint64_t pos; vmfs_bitmap_get_entry(fs->fbb, 0, i, &entry); pos = entry.mdh.pos; memset(&entry, 0, sizeof(entry)); vmfs_device_write(fs->dev, pos, (u_char *)&entry, sizeof(entry)); } /* At LVM level, all extents need to have the LVM information updated */ for (i = 0; i < lvm->loaded_extents - 1; i++) { lvm->extents[i]->vol_info.blocks -= extent->vol_info.num_segments + 1; lvm->extents[i]->vol_info.num_extents--; lvm->extents[i]->vol_info.lvm_size = (lvm->extents[i]->vol_info.blocks - lvm->extents[i]->vol_info.num_extents) * VMFS_LVM_SEGMENT_SIZE; /* Until there is an API for that, do it by hand */ m_pread(lvm->extents[i]->fd,buf,buf_len, lvm->extents[i]->vmfs_base + VMFS_LVMINFO_OFFSET); write_le64(buf, VMFS_LVMINFO_OFS_SIZE - VMFS_LVMINFO_OFFSET, lvm->extents[i]->vol_info.lvm_size); write_le64(buf, VMFS_LVMINFO_OFS_BLKS - VMFS_LVMINFO_OFFSET, lvm->extents[i]->vol_info.blocks); write_le32(buf, VMFS_LVMINFO_OFS_NUM_EXTENTS - VMFS_LVMINFO_OFFSET, lvm->extents[i]->vol_info.num_extents); m_pwrite(lvm->extents[i]->fd,buf,buf_len, lvm->extents[i]->vmfs_base + VMFS_LVMINFO_OFFSET); } return(0); } struct cmd { char *name; char *description; int (*fn)(vmfs_fs_t *fs,int argc,char *argv[]); }; struct cmd cmd_array[] = { { "remove", "Remove an extent", cmd_remove }, { NULL, } }; static void show_usage(char *prog_name) { int i; char *name = basename(prog_name); fprintf(stderr,"%s " VERSION "\n",name); fprintf(stderr,"Syntax: %s \n\n",name); fprintf(stderr,"Available commands:\n"); for(i=0;cmd_array[i].name;i++) fprintf(stderr," - %s : %s\n",cmd_array[i].name,cmd_array[i].description); fprintf(stderr,"\n"); } static struct cmd *cmd_find(char *name) { int i; for(i=0;cmd_array[i].name;i++) if (!strcmp(cmd_array[i].name,name)) return(&cmd_array[i]); return NULL; } int main(int argc,char *argv[]) { vmfs_fs_t *fs; struct cmd *cmd = NULL; int arg, ret; vmfs_flags_t flags; if (argc < 3) { show_usage(argv[0]); return(0); } /* Scan arguments for a command */ for (arg = 1; arg < argc; arg++) { if ((cmd = cmd_find(argv[arg]))) break; } if (!cmd) { show_usage(argv[0]); return(0); } flags.packed = 0; flags.read_write = 1; argv[arg] = NULL; if (!(fs = vmfs_fs_open(&argv[1], flags))) { fprintf(stderr,"Unable to open filesystem\n"); exit(EXIT_FAILURE); } ret = cmd->fn(fs,argc-arg-1,&argv[arg+1]); vmfs_fs_close(fs); return(ret); } vmfs-tools/fsck.vmfs/0000755000000000000000000000000011733555664011774 5ustar vmfs-tools/fsck.vmfs/vmfs_fsck.c0000644000000000000000000003436511733555434014127 0ustar /* * vmfs-tools - Tools to access VMFS filesystems * Copyright (C) 2009 Christophe Fillot * Copyright (C) 2009,2012 Mike Hommey * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include "vmfs.h" /* Forward declarations */ typedef struct vmfs_dir_map vmfs_dir_map_t; typedef struct vmfs_blk_map vmfs_blk_map_t; /* Directory mapping */ struct vmfs_dir_map { char *name; uint32_t blk_id; int is_dir; vmfs_blk_map_t *blk_map; vmfs_dir_map_t *parent; vmfs_dir_map_t *next; vmfs_dir_map_t *child_list,*child_last; }; /* * Block mapping, which allows to keep track of inodes given a block number. * Used for troubleshooting/debugging/future fsck. */ #define VMFS_BLK_MAP_BUCKETS 512 #define VMFS_BLK_MAP_MAX_INODES 32 struct vmfs_blk_map { uint32_t blk_id; union { uint32_t inode_id[VMFS_BLK_MAP_MAX_INODES]; vmfs_inode_t inode; }; vmfs_dir_map_t *dir_map; u_int ref_count; u_int nlink; int status; vmfs_blk_map_t *prev,*next; }; typedef struct vmfs_fsck_info vmfs_fsck_info_t; struct vmfs_fsck_info { vmfs_blk_map_t *blk_map[VMFS_BLK_MAP_BUCKETS]; u_int blk_count[VMFS_BLK_TYPE_MAX]; vmfs_dir_map_t *dir_map; /* Inodes referenced in directory structure but not in FDC */ u_int undef_inodes; /* Inodes present in FDC but not in directory structure */ u_int orphaned_inodes; /* Blocks present in inodes but not marked as allocated */ u_int unallocated_blocks; /* Lost blocks (ie allocated but not used) */ u_int lost_blocks; /* Directory structure errors */ u_int dir_struct_errors; }; /* Allocate a directory map structure */ vmfs_dir_map_t *vmfs_dir_map_alloc(const char *name,uint32_t blk_id) { vmfs_dir_map_t *map; if (!(map = calloc(1,sizeof(*map)))) return NULL; if (!(map->name = strdup(name))) { free(map); return NULL; } map->blk_id = blk_id; return map; } /* Create the root directory mapping */ vmfs_dir_map_t *vmfs_dir_map_alloc_root(void) { vmfs_dir_map_t *map; uint32_t root_blk_id; root_blk_id = VMFS_BLK_FD_BUILD(0, 0, 0); if (!(map = vmfs_dir_map_alloc("/",root_blk_id))) return NULL; map->parent = map; return map; } /* Add a child entry */ void vmfs_dir_map_add_child(vmfs_dir_map_t *parent,vmfs_dir_map_t *child) { child->parent = parent; if (parent->child_last != NULL) parent->child_last->next = child; else parent->child_list = child; parent->child_last = child; child->next = NULL; } /* Display a directory map */ void vmfs_dir_map_show_entry(vmfs_dir_map_t *map,int level) { vmfs_dir_map_t *child; int i; for(i=0;iname,map->blk_id); for(child=map->child_list;child;child=child->next) vmfs_dir_map_show_entry(child,level+1); } /* Display the directory hierarchy */ void vmfs_dir_map_show(vmfs_fsck_info_t *fi) { vmfs_dir_map_show_entry(fi->dir_map,0); } /* Get directory full path */ static char *vmfs_dir_map_get_path_internal(vmfs_dir_map_t *map, char *buffer,size_t len) { char *ptr; size_t plen; if (map->parent != map) { ptr = vmfs_dir_map_get_path_internal(map->parent,buffer,len); plen = len - (ptr - buffer); ptr += snprintf(ptr,plen,"%s/",map->name); } else { ptr = buffer; ptr += snprintf(buffer,len,"%s",map->name); } return ptr; } /* Get directory full path */ char *vmfs_dir_map_get_path(vmfs_dir_map_t *map,char *buffer,size_t len) { char *p; p = vmfs_dir_map_get_path_internal(map,buffer,len); if ((--p > buffer) && (*p == '/')) *p = 0; return buffer; } /* Hash function for a block ID */ static inline u_int vmfs_block_map_hash(uint32_t blk_id) { return(blk_id ^ (blk_id >> 5)); } /* Find a block mapping */ vmfs_blk_map_t *vmfs_block_map_find(vmfs_blk_map_t **ht,uint32_t blk_id) { vmfs_blk_map_t *map; u_int bucket; bucket = vmfs_block_map_hash(blk_id) % VMFS_BLK_MAP_BUCKETS; for(map=ht[bucket];map;map=map->next) if (map->blk_id == blk_id) return map; return NULL; } /* Get a block mapping */ vmfs_blk_map_t *vmfs_block_map_get(vmfs_blk_map_t **ht,uint32_t blk_id) { vmfs_blk_map_t *map; u_int bucket; if ((map = vmfs_block_map_find(ht,blk_id)) != NULL) return map; if (!(map = calloc(1,sizeof(*map)))) return NULL; bucket = vmfs_block_map_hash(blk_id) % VMFS_BLK_MAP_BUCKETS; map->blk_id = blk_id; map->prev = NULL; map->next = ht[bucket]; ht[bucket] = map; return map; } /* Store block mapping of an inode */ static void vmfs_fsck_store_block(const vmfs_inode_t *inode, uint32_t pb_blk, uint32_t blk_id, void *opt_arg) { vmfs_blk_map_t **ht = opt_arg; vmfs_blk_map_t *map; if (!(map = vmfs_block_map_get(ht,blk_id))) return; if (map->ref_count < VMFS_BLK_MAP_MAX_INODES) map->inode_id[map->ref_count] = inode->id; map->ref_count++; map->status = vmfs_block_get_status(inode->fs,blk_id); } /* Store inode info */ static int vmfs_fsck_store_inode(const vmfs_fs_t *fs,vmfs_blk_map_t **ht, const vmfs_inode_t *inode) { vmfs_blk_map_t *map; if (!(map = vmfs_block_map_get(ht,inode->id))) return(-1); memcpy(&map->inode,inode,sizeof(*inode)); map->status = vmfs_block_get_status(fs,inode->id); return(0); } /* Iterate over all inodes of the FS and get all block mappings */ int vmfs_fsck_get_all_block_mappings(const vmfs_fs_t *fs, vmfs_fsck_info_t *fi) { vmfs_inode_t inode; vmfs_bitmap_header_t *fdc_bmp; uint32_t entry,item; int i; fdc_bmp = &fs->fdc->bmh; printf("Scanning %u FDC entries...\n",fdc_bmp->total_items); for(i=0;itotal_items;i++) { entry = i / fdc_bmp->items_per_bitmap_entry; item = i % fdc_bmp->items_per_bitmap_entry; /* Skip undefined/deleted inodes */ if ((vmfs_inode_get(fs, VMFS_BLK_FD_BUILD(entry, item, 0), &inode) == -1) || !inode.nlink) continue; inode.fs = fs; vmfs_fsck_store_inode(fs,fi->blk_map,&inode); vmfs_inode_foreach_block(&inode,vmfs_fsck_store_block,fi->blk_map); } return(0); } /* Display Inode IDs for blocks incorrectly shared by multiple inodes */ void vmfs_fsck_show_inode_id(vmfs_blk_map_t *map) { u_int i,inode_count; inode_count = m_min(map->ref_count,VMFS_BLK_MAP_MAX_INODES); for(i=0;iinode_id[i]); printf("\n"); } /* Count block types */ void vmfs_fsck_count_blocks(vmfs_fsck_info_t *fi) { vmfs_blk_map_t *map; u_int blk_type; int i; for(i=0;iblk_map[i];map;map=map->next) { blk_type = VMFS_BLK_TYPE(map->blk_id); if ((blk_type != VMFS_BLK_TYPE_FD) && (map->ref_count > 1)) { printf("Block 0x%8.8x is referenced by multiple inodes: \n", map->blk_id); vmfs_fsck_show_inode_id(map); } if (blk_type < VMFS_BLK_TYPE_MAX) fi->blk_count[blk_type]++; /* Check that block is allocated */ if (map->status <= 0) { printf("Block 0x%8.8x is used but not allocated.\n",map->blk_id); fi->unallocated_blocks++; } } } printf("Data collected from inode entries:\n"); printf(" File Blocks : %u\n",fi->blk_count[VMFS_BLK_TYPE_FB]); printf(" Sub-Blocks : %u\n",fi->blk_count[VMFS_BLK_TYPE_SB]); printf(" Pointer Blocks : %u\n",fi->blk_count[VMFS_BLK_TYPE_PB]); printf(" Inodes : %u\n\n",fi->blk_count[VMFS_BLK_TYPE_FD]); } /* * Walk recursively through the directory structure and check inode * allocation. */ int vmfs_fsck_walk_dir(const vmfs_fs_t *fs, vmfs_fsck_info_t *fi, vmfs_dir_map_t *dir_map, vmfs_dir_t *dir_entry) { const vmfs_dirent_t *rec; vmfs_dir_t *sub_dir; vmfs_blk_map_t *map; vmfs_dir_map_t *dm; int res; vmfs_dir_seek(dir_entry,0); while((rec = vmfs_dir_read(dir_entry))) { if (!(map = vmfs_block_map_find(fi->blk_map,rec->block_id))) { fi->undef_inodes++; continue; } if (!(dm = vmfs_dir_map_alloc(rec->name,rec->block_id))) return(-1); vmfs_dir_map_add_child(dir_map,dm); map->dir_map = dm; map->nlink++; if (rec->type == VMFS_FILE_TYPE_DIR) { dm->is_dir = 1; if (strcmp(rec->name,".") && strcmp(rec->name,"..")) { if (!(sub_dir = vmfs_dir_open_from_blkid(fs,rec->block_id))) return(-1); res = vmfs_fsck_walk_dir(fs,fi,dm,sub_dir); vmfs_dir_close(sub_dir); if (res == -1) return(-1); } } } return(0); } /* Display orphaned inodes (ie present in FDC but not in directories) */ void vmfs_fsck_show_orphaned_inodes(vmfs_fsck_info_t *fi) { vmfs_blk_map_t *map; int i; for(i=0;iblk_map[i];map;map=map->next) { if (VMFS_BLK_TYPE(map->blk_id) != VMFS_BLK_TYPE_FD) continue; if (map->nlink == 0) { printf("Orphaned inode 0x%8.8x\n",map->inode.id); fi->orphaned_inodes++; } } } } /* Check if a File Block is lost */ void vmfs_fsck_check_fb_lost(vmfs_bitmap_t *b,uint32_t addr,void *opt) { vmfs_fsck_info_t *fi = opt; uint32_t blk_id; blk_id = VMFS_BLK_FB_BUILD(addr, 0); if (!vmfs_block_map_find(fi->blk_map,blk_id)) { printf("File Block 0x%8.8x is lost.\n",blk_id); fi->lost_blocks++; } } /* Check if a Sub-Block is lost */ void vmfs_fsck_check_sb_lost(vmfs_bitmap_t *b,uint32_t addr,void *opt) { vmfs_fsck_info_t *fi = opt; uint32_t entry,item; uint32_t blk_id; entry = addr / b->bmh.items_per_bitmap_entry; item = addr % b->bmh.items_per_bitmap_entry; blk_id = VMFS_BLK_SB_BUILD(entry, item, 0); if (!vmfs_block_map_find(fi->blk_map,blk_id)) { printf("Sub-Block 0x%8.8x is lost.\n",blk_id); fi->lost_blocks++; } } /* Check if a Pointer Block is lost */ void vmfs_fsck_check_pb_lost(vmfs_bitmap_t *b,uint32_t addr,void *opt) { vmfs_fsck_info_t *fi = opt; uint32_t entry,item; uint32_t blk_id; entry = addr / b->bmh.items_per_bitmap_entry; item = addr % b->bmh.items_per_bitmap_entry; blk_id = VMFS_BLK_PB_BUILD(entry, item, 0); if (!vmfs_block_map_find(fi->blk_map,blk_id)) { printf("Pointer Block 0x%8.8x is lost.\n",blk_id); fi->lost_blocks++; } } /* Check the directory has minimal . and .. entries with correct inode IDs */ void vmfs_fsck_check_dir(vmfs_fsck_info_t *fi,vmfs_dir_map_t *dir) { char buffer[256]; vmfs_dir_map_t *child; int cdir,pdir; cdir = pdir = 0; for(child=dir->child_list;child;child=child->next) { if (!strcmp(child->name,".")) { cdir++; if (child->blk_id != dir->blk_id) { printf("Invalid . entry in %s\n", vmfs_dir_map_get_path(dir,buffer,sizeof(buffer))); fi->dir_struct_errors++; } continue; } if (!strcmp(child->name,"..")) { pdir++; if (child->blk_id != dir->parent->blk_id) { printf("Invalid .. entry in %s\n", vmfs_dir_map_get_path(dir,buffer,sizeof(buffer))); fi->dir_struct_errors++; } continue; } if (child->is_dir) vmfs_fsck_check_dir(fi,child); } if ((cdir != 1) || (pdir != 1)) fi->dir_struct_errors++; } /* Check the directory structure */ void vmfs_fsck_check_dir_all(vmfs_fsck_info_t *fi) { vmfs_fsck_check_dir(fi,fi->dir_map); } /* Initialize fsck structures */ static void vmfs_fsck_init(vmfs_fsck_info_t *fi) { memset(fi,0,sizeof(*fi)); fi->dir_map = vmfs_dir_map_alloc_root(); } static void show_usage(char *prog_name) { char *name = basename(prog_name); fprintf(stderr,"%s " VERSION "\n",name); fprintf(stderr,"Syntax: %s \n\n",name); } int main(int argc,char *argv[]) { vmfs_fsck_info_t fsck_info; vmfs_fs_t *fs; vmfs_flags_t flags; vmfs_dir_t *root_dir; if (argc < 2) { show_usage(argv[0]); return(0); } flags.packed = 0; if (!(fs = vmfs_fs_open(&argv[1], flags))) { fprintf(stderr,"Unable to open filesystem\n"); exit(EXIT_FAILURE); } vmfs_fsck_init(&fsck_info); vmfs_fsck_get_all_block_mappings(fs,&fsck_info); if (!(root_dir = vmfs_dir_open_from_blkid(fs, VMFS_BLK_FD_BUILD(0, 0, 0)))) { fprintf(stderr,"Unable to open root directory\n"); exit(EXIT_FAILURE); } vmfs_fsck_walk_dir(fs,&fsck_info,fsck_info.dir_map,root_dir); vmfs_dir_close(root_dir); vmfs_fsck_count_blocks(&fsck_info); vmfs_fsck_show_orphaned_inodes(&fsck_info); vmfs_bitmap_foreach(fs->fbb,vmfs_fsck_check_fb_lost,&fsck_info); vmfs_bitmap_foreach(fs->sbc,vmfs_fsck_check_sb_lost,&fsck_info); vmfs_bitmap_foreach(fs->pbc,vmfs_fsck_check_pb_lost,&fsck_info); vmfs_fsck_check_dir_all(&fsck_info); printf("Unallocated blocks : %u\n",fsck_info.unallocated_blocks); printf("Lost blocks : %u\n",fsck_info.lost_blocks); printf("Undefined inodes : %u\n",fsck_info.undef_inodes); printf("Orphaned inodes : %u\n",fsck_info.orphaned_inodes); printf("Directory errors : %u\n",fsck_info.dir_struct_errors); vmfs_fs_close(fs); return(0); } vmfs-tools/fsck.vmfs/manifest.mk0000644000000000000000000000007311733555434014126 0ustar vmfs_fsck.o_CFLAGS := -include version REQUIRES := libvmfs vmfs-tools/fsck.vmfs/fsck.vmfs.txt0000644000000000000000000000067311733303644014430 0ustar fsck.vmfs(8) ============ NAME ---- fsck.vmfs - VMFS file system check utility SYNOPSIS -------- *fsck.vmfs* 'VOLUME'... DESCRIPTION ----------- The *fsck.vmfs* performs various integrity checks on a VMFS file system. The 'VOLUME' to be opened can be either a block device or an image file. When the VMFS spreads accross several extents, all extents must be given. AUTHORS ------- include::../AUTHORS[] SEE ALSO -------- debugvmfs(8) vmfs-tools/version0000644000000000000000000000012011733555535011472 0ustar #if 1 #define VERSION "v0.2.5.19.g4e68" #else VERSION := v0.2.5.19.g4e68 #endif