[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libguestfs] [PATCH] guestfs_file_arch command



This patch adds a new function, guestfs_file_arch, which is like
guestfs_file but specifically intended to determine the architecture
of binaries and libraries.

Usage is:

  guestfs_file_arch (g, "/bin/ls")
  ==> "x86_64" (or whatever)

What it can do:

  - ELF binaries
  - ELF shared libraries
  - Windows Win32 and Win64 binaries
  - Windows Win32 and Win64 DLLs
  - Linux kernel modules
  - Linux new-style initrd images
  - some non-x86 Linux vmlinuz kernels

What it can't do:

  - static libraries (libfoo.a)
  - Linux old-style initrd as compressed ext2 filesystem (RHEL 3)
  - x86 Linux vmlinuz kernels
  - ancient stuff like a.out, COFF binaries

It turns out that x86 vmlinuz (ie. bzImage) is virtually impossible to
unpack.  It consists of an amalgam of 16 bit code, 32 bit code (even
on x86-64) and compressed kernel.  The only way to unpack it would be
to either uncompress the compressed kernel, or else reverse the (32
bit) CPU detection code.  Neither is very realistic, but I left in
some commented-out code to show you how far I got.

An easy LKML patch for someone would be to add the required
architecture into the setup header so we can just read it out
directly, or maybe someone else can see something I've missed.

Initrd unpacking is relatively simple.  We unpack the initrd and look
for some known binaries inside it.  This seems to work OK on all the
new-style initrds I tested it against.

Finally, in order to run the tests we need binaries from lots of
different architectures.  Obviously building these is difficult, as it
would require a cross-compiler.  So instead I've proposed we just add
them into the images/ directory.  These come "without source", but the
source is just:

  main(){}

for the binaries, and (literally) the empty file for the libraries.
Hope that doesn't annoy any purists.

Rich.

-- 
Richard Jones, Emerging Technologies, Red Hat  http://et.redhat.com/~rjones
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into Xen guests.
http://et.redhat.com/~rjones/virt-p2v
>From 25cde23d4533e8a82a14f480ffe6c7ac16cf0751 Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones trick home annexia org>
Date: Mon, 27 Jul 2009 16:26:08 +0100
Subject: [PATCH] New command 'file-arch' to show architecture of binaries and libraries.

This command can be pointed at just about any binary, library,
kernel module or initrd, and will return the architecture of that
binary.  Also works with Windows binaries.
---
 .gitignore                |    6 +-
 TODO                      |   16 --
 daemon/Makefile.am        |    1 +
 daemon/arch.c             |  563 +++++++++++++++++++++++++++++++++++++++++++++
 daemon/daemon.h           |    2 +-
 images/Makefile.am        |   63 ++++-
 images/README-binfiles    |   13 +
 images/bin-i586-dynamic   |  Bin 0 -> 4616 bytes
 images/bin-sparc-dynamic  |  Bin 0 -> 5060 bytes
 images/bin-win32.exe      |  Bin 0 -> 21617 bytes
 images/bin-win64.exe      |  Bin 0 -> 44557 bytes
 images/bin-x86_64-dynamic |  Bin 0 -> 6484 bytes
 images/lib-i586.so        |  Bin 0 -> 3834 bytes
 images/lib-sparc.so       |  Bin 0 -> 4536 bytes
 images/lib-win32.dll      |  Bin 0 -> 16402 bytes
 images/lib-win64.dll      |  Bin 0 -> 34777 bytes
 images/lib-x86_64.so      |  Bin 0 -> 5467 bytes
 po/POTFILES.in            |    1 +
 src/MAX_PROC_NR           |    2 +-
 src/generator.ml          |   46 ++++
 20 files changed, 681 insertions(+), 32 deletions(-)
 create mode 100644 daemon/arch.c
 create mode 100644 images/README-binfiles
 create mode 100755 images/bin-i586-dynamic
 create mode 100755 images/bin-sparc-dynamic
 create mode 100755 images/bin-win32.exe
 create mode 100755 images/bin-win64.exe
 create mode 100755 images/bin-x86_64-dynamic
 create mode 100755 images/lib-i586.so
 create mode 100755 images/lib-sparc.so
 create mode 100755 images/lib-win32.dll
 create mode 100755 images/lib-win64.dll
 create mode 100755 images/lib-x86_64.so

diff --git a/.gitignore b/.gitignore
index d66ed99..f2064a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -81,6 +81,8 @@ images/100kallzeroes
 images/100krandom
 images/10klines
 images/initrd
+images/initrd-x86_64.img
+images/initrd-x86_64.img.gz
 images/test.sqsh
 initramfs
 initramfs.timestamp
@@ -123,6 +125,7 @@ missing
 *.o
 ocaml/bindtests
 ocaml/bindtests.ml
+ocaml/dllmlguestfs.so
 ocaml/examples/lvs
 ocaml/guestfs_c_actions.c
 ocaml/guestfs.ml
@@ -156,9 +159,9 @@ python/guestfs.pyc
 ruby/bindtests.rb
 ruby/ext/guestfs/extconf.h
 ruby/ext/guestfs/_guestfs.c
+ruby/ext/guestfs/_guestfs.so
 ruby/ext/guestfs/mkmf.log
 ruby/Rakefile
-*.so
 src/guestfs-actions.c
 src/guestfs-actions.h
 src/guestfs-bindtests.c
@@ -166,6 +169,7 @@ src/guestfs_protocol.c
 src/guestfs_protocol.h
 src/guestfs_protocol.x
 src/guestfs-structs.h
+src/.libs/libguestfs.so
 src/.pod2text.data
 src/stamp-generator
 stamp-h1
diff --git a/TODO b/TODO
index 291d220..dbfc3c8 100644
--- a/TODO
+++ b/TODO
@@ -182,22 +182,6 @@ Swap space
 
 Allow swap space from the guest to be used.  Is it a good idea?
 
-Query guest architecture
-------------------------
-
-Need a way to query a binary or library file for its architecture.
-Using objdump or readelf?
-What about non-ELF files (eg. Windows, BSD).
-
-To do this properly requires some serious logic, eg. to cover Linux
-and Windows we'd need objdump and i686-pc-mingw32-objdump, and more to
-cover a.out, COFF and 64 bit Windows.  Therefore this cannot be done
-inside the daemon, and should be done by a separate, external program
-similar to virt-inspector.
-
-Probably we should go all the way and have virt-inspector able to
-determine kernel and userspace architectures of guests.
-
 Other initrd-* commands
 -----------------------
 
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index 7b8a87e..f238659 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -20,6 +20,7 @@ ACLOCAL_AMFLAGS = -I m4
 noinst_PROGRAMS = guestfsd
 guestfsd_SOURCES = \
 	actions.h \
+	arch.c \
 	augeas.c \
 	blockdev.c \
 	checksum.c \
diff --git a/daemon/arch.c b/daemon/arch.c
new file mode 100644
index 0000000..bacd6c6
--- /dev/null
+++ b/daemon/arch.c
@@ -0,0 +1,563 @@
+/* libguestfs - the guestfsd daemon
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <elf.h>
+#include <endian.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <assert.h>
+
+#include "daemon.h"
+#include "actions.h"
+
+/* This file implements the 'file_arch' command, which goes further
+ * than 'file' in trying to determine the architecture of a specific
+ * binary, library, kernel or initrd.
+ *
+ * We use a series of heuristics (see do_file_arch below) to
+ * determine this, falling back to using the actual /usr/bin/file
+ * command at the end.
+ */
+
+/* List of supported compression formats, straight out of the kernel. */
+static const struct compress_format {
+  unsigned char magic[2];
+  const char *name;
+} compressed_formats[] = {
+  { {037, 0213}, "gzip" },
+  { {037, 0236}, "gzip" },
+  { {0x42, 0x5a}, "bzip2" },
+  /* { {0x5d, 0x00}, "lzma" }, - we don't support this yet, would need
+   * to add 7zip to the appliance.
+   */
+  { {0, 0}, NULL }
+};
+
+/* In the end, vmlinuz/x86 detection just doesn't work well enough to
+ * include it.  Hence this next bit is commented out.
+ */
+#if 0
+
+/* http://weichong78.blogspot.com/2008/08/vmlinuz-parts-in-memory-and-file.html
+ * was very helpful.
+ *
+ * So was http://lxr.linux.no/linux+v2.6.30/arch/x86/boot/header.S
+ *
+ * Nevertheless, vmlinuz images are almost impossible to decode
+ * because they contain 16 bit code followed by the kernel itself,
+ * compressed, with no indication of architecture.  Instead let's
+ * just use the kernel version string.
+ */
+
+struct setup_header {
+  uint8_t setup_sects;		/* Number of sectors in the setup section */
+  uint16_t root_flags;
+  uint32_t syssize;
+  uint16_t ram_size;
+  uint16_t vid_mode;
+  uint16_t root_dev;
+  uint8_t boot_flag[2];		/* 0x55, 0xAA */
+  uint8_t short_jmp[2];		/* 0xEB, offset */
+  char header[4];		/* "HdrS" */
+  uint16_t version;
+  uint16_t default_switch;
+  uint16_t setupseg;
+  uint16_t sysseg;
+  uint16_t kernel_version;	/* Offset of kernel version - 512 */
+} __attribute__((packed));
+
+static char *
+check_vmlinuz_x86 (int fd, const unsigned char *first512)
+{
+  struct setup_header *hdr;
+  unsigned char *setup;
+  int setup_len, r, len;
+  char *kernel, *arch, *ret;
+
+  /* Get setup_sects. */
+  hdr = (struct setup_header *) &first512[0x1f1];
+  /* This shouldn't fail because it was checked before this
+   * function was called.
+   */
+  assert (hdr->boot_flag[0] == 0x55);
+  assert (hdr->boot_flag[1] == 0xAA);
+
+  /* We'll read up to 255 more sectors, which seems reasonable even
+   * if setup_sects was chosen maliciously.
+   */
+  setup_len = (hdr->setup_sects + 1) * 512;
+  setup = malloc (setup_len);
+  if (setup == NULL) {
+    reply_with_perror ("malloc");
+    close (fd);
+    return NULL;
+  }
+
+  memcpy (setup, first512, 512);
+  r = read (fd, setup + 512, setup_len - 512);
+  if (r == -1) {
+    reply_with_perror ("read");
+    close (fd);
+    free (setup);
+    return NULL;
+  }
+  if (r < setup_len - 512) {
+    reply_with_error ("file-arch: vmlinuz: ancient (pre-bzImage) vmlinuz");
+    close (fd);
+    free (setup);
+    return NULL;
+  }
+
+  close (fd);
+
+  hdr = (struct setup_header *) &setup[0x1f1];
+  assert (hdr->boot_flag[0] == 0x55);
+  assert (hdr->boot_flag[1] == 0xAA);
+
+  /* Is it a setup header? */
+  if (strncmp (&hdr->header[0], "HdrS", 4) != 0) {
+    reply_with_error ("file-arch: vmlinuz: no setup header found");
+    free (setup);
+    return NULL;
+  }
+
+  /* Try to get the kernel version.  Remember that this value
+   * may have been chosen maliciously, so we have to check it
+   * carefully.
+   */
+  kernel = (char *) &setup[hdr->kernel_version + 512];
+  if (hdr->kernel_version + 512 >= setup_len ||
+      hdr->kernel_version + 512 + (len = strlen (kernel)) >= setup_len) {
+    reply_with_error ("file-arch: vmlinuz: no kernel version string found");
+    free (setup);
+    return NULL;
+  }
+
+  if (verbose)
+    printf ("kernel = %s (len = %d)\n", kernel, len);
+
+  /* The kernel version is formatted as:
+   * "version[.-]arch otherstuff"
+   */
+  len = strcspn (kernel, " ");
+  if (len <= 0) {
+  parse_error:
+    reply_with_error ("file-arch: vmlinuz: could not parse kernel string");
+    free (setup);
+    return NULL;
+  }
+  kernel[len] = '\0';
+
+  arch = strrchr (kernel, '.');
+  if (arch == NULL)
+    goto parse_error;
+
+  char *dash = strrchr (kernel, '-');
+  if (dash && arch < dash) arch = dash;
+
+  arch++;
+  if (strcmp (arch, "amd64") == 0)
+    arch = "x86_64";
+
+  /* XXX We should check this looks like a reasonable arch. */
+  ret = strdup (arch);
+  free (setup);
+  return ret;
+}
+
+#endif /* end of non-working vmlinuz detection */
+
+static char *
+check_elf (const unsigned char *first /* need first ~20 bytes */)
+{
+  uint16_t machine;
+  const char *s_machine;
+
+  switch (first[EI_CLASS]) {
+  case ELFCLASS32: {
+    Elf32_Ehdr *hdr = (Elf32_Ehdr *) first;
+    machine = hdr->e_machine;
+  }
+    break;
+
+  case ELFCLASS64: {
+    Elf64_Ehdr *hdr = (Elf64_Ehdr *) first;
+    machine = hdr->e_machine;
+  }
+    break;
+
+  default:
+    reply_with_error ("file-arch: ELF: invalid class");
+    return NULL;
+  }
+
+  /* Swap endian? */
+  switch (first[EI_DATA]) {
+  case ELFDATA2LSB:		/* file is little endian */
+    machine = le16toh (machine);
+    break;
+  case ELFDATA2MSB:		/* file is big endian */
+    machine = be16toh (machine);
+    break;
+  default:
+    reply_with_error ("file-arch: ELF: invalid endianness");
+    return NULL;
+  }
+
+  /* Our policy here is we'll only return strings for architectures
+   * where we know the undisputed canonical arch string.  For others,
+   * we'll add them on demand.
+   */
+  switch (machine) {
+  case EM_NONE:
+    reply_with_error ("file-arch: ELF: no machine defined for binary");
+    return NULL;
+
+  case EM_SPARC:
+  case EM_SPARC32PLUS:
+    s_machine = "sparc";
+    break;
+
+  case EM_386:
+    s_machine = "i386";
+    break;
+
+  case EM_PPC:
+    s_machine = "ppc";
+    break;
+
+  case EM_PPC64:
+    s_machine = "ppc64";
+    break;
+
+  case EM_S390:
+    s_machine = "s390";
+    break;
+
+  case EM_ARM:
+    s_machine = "arm";
+    break;
+
+  case EM_SPARCV9:
+    s_machine = "sparc64";
+    break;
+
+  case EM_IA_64:
+    s_machine = "ia64";
+    break;
+
+  case EM_X86_64:
+    s_machine = "x86_64";
+    break;
+
+  default:
+    reply_with_error ("file-arch: ELF: unknown architecture %d", machine);
+    return NULL;
+  }
+
+  return strdup (s_machine);	/* caller frees */
+}
+
+/* There's a potential DoS attack here which is very hard to solve (XXX)
+ *
+ * A malicious guest could create an initrd which contains a huge
+ * bin/nash file.  When we tried to unpack this, it would consume
+ * all space in /tmp (ie. physical memory, because this is an initramfs)
+ * and cause the appliance kernel to panic.  AFAICS this is just a
+ * DoS, not an exploit into the appliance, so it would just cause
+ * libguestfs to stop with an error.
+ */
+
+#define INITRD_BINARIES "bin/nash bin/sh bin/bash bin/modprobe"
+
+static char *
+check_initrd (char *unpack_cmd)
+{
+  int r;
+  DIR *dir;
+  struct dirent *d;
+  int fd;
+  unsigned char first[256];
+  char path[256];
+  char *ret = NULL;
+
+  if (verbose)
+    fprintf (stderr, "unpack with: %s\n", unpack_cmd);
+
+  command (NULL, NULL, "rm", "-rf", "/tmp/bin", NULL);
+
+  /* Unpack the initrd into /tmp.  This will create /tmp/bin containing
+   * hopefully one of the INITRD_BINARIES.
+   */
+  chdir ("/tmp");
+  r = system (unpack_cmd);
+  chdir ("/");
+
+  if (r == -1) {
+    reply_with_perror ("system: %s", unpack_cmd);
+    free (unpack_cmd);
+    return NULL;
+  }
+
+  free (unpack_cmd);
+
+  if (WEXITSTATUS (r) != 0) {
+    reply_with_error ("cpio: failed with exit code %d", WEXITSTATUS (r));
+    return NULL;
+  }
+
+  /* Did we get any binaries out of that? */
+  dir = opendir ("/tmp/bin");
+  if (!dir) {
+    reply_with_error ("cpio: initrd doesn't contain any recognized binaries");
+    return NULL;
+  }
+
+  /* /tmp/bin was created so it must contain at least one binary ... */
+  while ((d = readdir (dir)) != NULL) {
+    if (strcmp (d->d_name, ".") == 0 || strcmp (d->d_name, "..") == 0)
+      continue;
+
+    snprintf (path, sizeof path, "/tmp/bin/%s", d->d_name);
+    fd = open (path, O_RDONLY);
+    if (fd == -1)
+      continue;
+
+    r = read (fd, first, sizeof first);
+    if (r == -1) {
+      reply_with_perror ("read: %s", path);
+      close (fd);
+      goto cleanup;
+    }
+    close (fd);
+    if (r < sizeof first) {
+      reply_with_error ("read: %s: file is smaller than %zu bytes\n",
+			path, sizeof first);
+      goto cleanup;
+    }
+
+    if (first[EI_MAG0] == ELFMAG0 &&
+	first[EI_MAG1] == ELFMAG1 &&
+	first[EI_MAG2] == ELFMAG2 &&
+	first[EI_MAG3] == ELFMAG3) {
+      ret = check_elf (first); /* either sets ret or calls reply_with_error */
+      goto cleanup;
+    }
+  }
+
+  reply_with_error ("cpio: initrd doesn't contain any recognized binaries");
+
+ cleanup:
+  closedir (dir);
+  command (NULL, NULL, "rm", "-rf", "/tmp/bin", NULL);
+  return ret;
+}
+
+static char *
+check_initrd_compressed (const char *path, const char *compressed_format)
+{
+  const char *zcat;
+  char *cmd;
+  FILE *fp;
+  char line[256];
+
+  if (strcmp (compressed_format, "gzip") == 0)
+    zcat = "zcat";
+  else if (strcmp (compressed_format, "bzip2") == 0)
+    zcat = "bzcat";
+  else {
+    /* This is an internal error really. */
+    reply_with_error ("check_initrd_compressed: unknown compressed format");
+    return NULL;
+  }
+
+  /* Need to check first that it's a compressed cpio file.  Old kernels
+   * had compressed ext2 filesystems which cpio will barf on.
+   */
+  if (asprintf_nowarn (&cmd, "%s %R | file -bsL -", zcat, path) == -1) {
+    reply_with_perror ("asprintf");
+    return NULL;
+  }
+
+  if (verbose)
+    fprintf (stderr, "%s\n", cmd);
+
+  fp = popen (cmd, "r");
+  if (fp == NULL) {
+    reply_with_perror ("%s", cmd);
+    free (cmd);
+    return NULL;
+  }
+
+  free (cmd);
+
+  if (fgets (line, sizeof line, fp) == NULL) {
+    reply_with_perror ("file-arch: cpio: fgets");
+    fclose (fp);
+    return NULL;
+  }
+
+  if (fclose (fp) == -1) {
+    reply_with_perror ("file-arch: cpio: fclose");
+    return NULL;
+  }
+
+  if (strstr (line, "ext2 filesystem")) {
+    reply_with_perror ("file-arch: initrd is an old-style compressed ext2 filesystem, which we don't support");
+    return NULL;
+  }
+
+  /* It's compressed cpio, so make the unpacking command. */
+  if (asprintf_nowarn (&cmd, "%s %R | cpio -id " INITRD_BINARIES, zcat, path)
+      == -1) {
+    reply_with_perror ("asprintf");
+    return NULL;
+  }
+
+  return check_initrd (cmd);
+}
+
+static char *
+check_initrd_uncompressed (const char *path)
+{
+  char *cmd;
+
+  /* We already know here that it's a cpio file. */
+
+  if (asprintf_nowarn (&cmd, "cpio -id " INITRD_BINARIES " < %R", path) == -1) {
+    reply_with_perror ("asprintf");
+    return NULL;
+  }
+
+  return check_initrd (cmd);
+}
+
+char *
+do_file_arch (char *path)
+{
+  int fd;
+  int r;
+  int i;
+  unsigned char first512[512]; /* must always be 512 bytes */
+  char *file;
+
+  NEED_ROOT (NULL);
+  ABS_PATH (path, NULL);
+
+  CHROOT_IN;
+  fd = open (path, O_RDONLY);
+  CHROOT_OUT;
+
+  if (fd == -1) {
+    reply_with_perror ("open: %s", path);
+    return NULL;
+  }
+
+  /* Load the first 512 bytes of the file.  512 is chosen because we
+   * need this in order to determine if the file is a vmlinuz (kernel
+   * image), since 512 bytes is the size of the obsolete boot sector
+   * "header" for vmlinuz images on i386 and x86_64 architectures.
+   */
+  r = read (fd, first512, sizeof first512);
+  if (r == -1) {
+    reply_with_perror ("read: %s", path);
+    close (fd);
+    return NULL;
+  }
+  if (r < sizeof first512) {
+    reply_with_error ("read: %s: file is smaller than %zu bytes\n",
+		      path, sizeof first512);
+    close (fd);
+    return NULL;
+  }
+
+  /* Check for vmlinuz i386/x86_64.  EFI vmlinuz are just ELF
+   * binaries, so we don't need to do anything special for them.  But
+   * there are probably other non-x86 vmlinuz formats that we should
+   * try to detect in future.
+   */
+  fprintf (stderr, "%x %x\n", first512[0x1fe], first512[0x1ff]);
+
+  if (first512[0x1fe] == 0x55 && first512[0x1ff] == 0xaa) {
+#if 0
+    return check_vmlinuz_x86 (fd, first512);
+#else
+    close (fd);
+    reply_with_error ("file-arch: this command does not work on Linux i386/x86-64 vmlinuz files");
+    return NULL;
+#endif
+  }
+
+  /* Check for compressed file.  The only ones we promise to decode
+   * are initrd images.
+   */
+  for (i = 0; compressed_formats[i].name != NULL; ++i) {
+    if (first512[0] == compressed_formats[i].magic[0] &&
+	first512[1] == compressed_formats[i].magic[1]) {
+      close (fd);
+      return check_initrd_compressed (path, compressed_formats[i].name);
+    }
+  }
+
+  /* Uncompressed initrd (pretty rare). */
+  if (strncmp ((char *) first512, "070701", 6) == 0) {
+    close (fd);
+    return check_initrd_uncompressed (path);
+  }
+
+  /* ELF? */
+  if (first512[EI_MAG0] == ELFMAG0 &&
+      first512[EI_MAG1] == ELFMAG1 &&
+      first512[EI_MAG2] == ELFMAG2 &&
+      first512[EI_MAG3] == ELFMAG3) {
+    close (fd);
+    return check_elf (first512);
+  }
+
+  /* We could do other checks here (eg. for Windows), but it's easier
+   * to now run the external 'file' command and decode those strings.
+   */
+  close (fd);
+
+  file = do_file (path);
+  if (!file) return NULL;	/* do_file has already sent an error. */
+
+  /* Win32 and Win64 binaries and DLLs. */
+  if (strstr (file, "PE32 executable")) {
+    strcpy (file, "i386");
+    return file;
+  }
+
+  if (strstr (file, "PE32+ executable")) {
+    strcpy (file, "x86_64");
+    return file;
+  }
+
+  /* We don't know what it is. */
+  free (file);
+  reply_with_error ("file-arch: %s: unknown architecture", path);
+  return NULL;
+}
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 5bf6f35..9aa831a 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -62,7 +62,7 @@ extern void udev_settle (void);
  * printf formatters %Q and %R.  See HACKING file for more
  * info about these.
  */
-static int
+static inline int
 asprintf_nowarn (char **strp, const char *fmt, ...)
 {
   int r;
diff --git a/images/Makefile.am b/images/Makefile.am
index 256259b..a27e4a2 100644
--- a/images/Makefile.am
+++ b/images/Makefile.am
@@ -22,7 +22,17 @@ EXTRA_DIST = \
 	helloworld.tar \
 	helloworld.tar.gz \
 	mbr-ext2-empty.img.gz \
-	empty known-1 known-2 known-3
+	empty known-1 known-2 known-3 \
+	bin-i586-dynamic \
+	bin-sparc-dynamic \
+	bin-win32.exe \
+	bin-win64.exe \
+	bin-x86_64-dynamic \
+	lib-i586.so \
+	lib-sparc.so \
+	lib-win32.dll \
+	lib-win64.dll \
+	lib-x86_64.so
 
 noinst_DATA = test.sqsh
 
@@ -32,20 +42,32 @@ CLEANFILES = \
 	initrd
 
 squash_files_src = \
-    $(srcdir)/helloworld.tar \
-    $(srcdir)/helloworld.tar.gz \
-    $(srcdir)/empty \
-    $(srcdir)/known-1 \
-    $(srcdir)/known-2 \
-    $(srcdir)/known-3
+	$(srcdir)/helloworld.tar \
+	$(srcdir)/helloworld.tar.gz \
+	$(srcdir)/empty \
+	$(srcdir)/known-1 \
+	$(srcdir)/known-2 \
+	$(srcdir)/known-3 \
+	$(srcdir)/bin-i586-dynamic \
+	$(srcdir)/bin-sparc-dynamic \
+	$(srcdir)/bin-win32.exe \
+	$(srcdir)/bin-win64.exe \
+	$(srcdir)/bin-x86_64-dynamic \
+	$(srcdir)/lib-i586.so \
+	$(srcdir)/lib-sparc.so \
+	$(srcdir)/lib-win32.dll \
+	$(srcdir)/lib-win64.dll \
+	$(srcdir)/lib-x86_64.so
 
 squash_files_build = \
-    $(builddir)/100kallzeroes \
-    $(builddir)/100kallnewlines \
-    $(builddir)/100kallspaces \
-    $(builddir)/100krandom \
-    $(builddir)/10klines \
-    $(builddir)/initrd
+	$(builddir)/100kallzeroes \
+	$(builddir)/100kallnewlines \
+	$(builddir)/100kallspaces \
+	$(builddir)/100krandom \
+	$(builddir)/10klines \
+	$(builddir)/initrd \
+	$(builddir)/initrd-x86_64.img \
+	$(builddir)/initrd-x86_64.img.gz
 
 squash_files = $(squash_files_src) $(squash_files_build)
 
@@ -86,3 +108,18 @@ $(builddir)/initrd: empty known-1 known-2 known-3
 	rm -f $@ $ -t
 	for f in $^; do echo $$f; done | cpio -o -H newc | gzip --best > $ -t
 	mv $ -t $@
+
+# Create a dummy initrd with a single file called 'bin/nash' which
+# is used to test the file-arch command.
+$(builddir)/initrd-x86_64.img: bin-x86_64-dynamic
+	rm -rf bin $@ $ -t
+	mkdir bin
+	cp $< bin/nash
+	echo bin/nash | cpio -o -H newc > $ -t
+	mv $ -t $@
+	rm -rf bin $ -t
+
+$(builddir)/initrd-x86_64.img.gz: initrd-x86_64.img
+	rm -f $@ $ -t
+	gzip --best -c $< > $ -t
+	mv $ -t $@
diff --git a/images/README-binfiles b/images/README-binfiles
new file mode 100644
index 0000000..00d568a
--- /dev/null
+++ b/images/README-binfiles
@@ -0,0 +1,13 @@
+The bin-*, lib-* and vmlinuz-* files are used for testing the
+guestfs_file_arch API.
+
+The bin-* files are generated from empty source files (ie.
+"main(){}") on the respective architectures.
+
+The lib-* files are generated from a (really) empty source file called
+lib.c which is linked into a library using gcc -shared on the
+respective architectures.
+
+If you are concerned that these binary files "lack source" then you
+can just remove them, but you also have to patch out the tests from
+the test suite (see src/generator.ml).
diff --git a/images/bin-i586-dynamic b/images/bin-i586-dynamic
new file mode 100755
index 0000000000000000000000000000000000000000..4f770633b47386ce8ab5a99eb6e35d1ae57b9de1
GIT binary patch
literal 4616
zcmcIoU2I%O6`oyh8VAzWcGF<Mz?JG0r_{G=Ym;ms2s`#VcDv1wy(x~O<m!6&+IwMt
z%<kRPeyHNG&4Xo(0tK}^pc3dqP=(+Dp&}}j$W_uxMT+{`2g*;SjR 5uTI7eQm+zao
z<6f^DA%r;6*_m(7H)qb=duHy;o=>I6B9VyD5*2NNXzAOr_5{jDw<}9R7-GBV6FuV7
z;vO{7mRJG `VQ*UZO|CB4Y~_Xc3p_IQy&1P(njA Dd;PpqcBj}UvwzDZ2JLh&~>(>
z6UU`Jieei4Y1pW*15;_|7}P%S`!F`u0H$i&iFdsm;1<#SA1k;sj}>zL1-DdNFso&A
zQ1!*oGWH`!Ps+ZGgMD^DS?9btH#rYO4k_Dy x))QqIr{$r^P^JZvb9|p$qlTK$FkL
z+8J}FxK9Ynnk$w|R JjBo@EJym}O}Dg*9;utvR=3)v8VoJemSt(RNGXNP6P%h&5=&
z)eun`V+6mP50%p4y7zJxUr|sPKa92CgIMAyx1&t3#3WBHzgxfE-f%%{H2L!~jBl(7
ze_tOM{+>tiOBeng_RO<->m47mhaU2 -MR@#17+avXP5s}|7-JjW->ot2V)68C!We@
zP&96U`2M9!7;~zAJJulo^o2DK&u8ViJFs1R%iGrYJ}T3v-&ngOCEzZ7b%=q~zV^y-
zBuIZ6KiAfytJD7FLufy^cJ2$SzkZnh>Q^H_W0Sw B1wVy>BjYKbP%b(7CU`rZPj~N
ztiJk1^40t=XTZI9)$4kNZK&+H5$k1}e-nYMrh8+UlK-tcV4pa3X4SqEL?`Fc>hJ4M
zO*PKK&4slebt0hKJ&or-^!?Skfr%}rnyRul)x7phGrDrJiAjHHz+b+;`WueDlIp16
zh%Arxwy&giqKK`e+LvR!{_gtq*uiI-wLjKh>p6YaI<vOY)5{?Ee16A8g$H_Bmg~N^
zv;Mc3e{-d+zV6rFS5pq2qkiVdLDBdL!a9W~t 4~1uLN<*_o+*^A}eHW?L-;JUV`Kj
z-N $;KJ?4uSd&~MS5R{O<WYVCWeWO9D0A{bD1~G7;!SWgw(o)>7V#;l0l%zwqvV=l
za&ezwiBQYy QawrjHQY4Jz!M-YvCTFJDtT?C8)$lMn=AD^kF;LYb4A8bI=%!#}5n)
z3?_`eNhfEF+n#FgPYhyx|L^Q%{6KuG 5Ehv|3BGxpQTw{EPD2gFsoigm3durOP*7i
z7iOvKIp*-;iGI(X6Xsm0X6Ef`UYNPX5<08Wt0>Dkr&4vxrA $st>P5OSC#pKCrr2G
z;@5K)@H-0tQ#ogQwlJN%HCwTZjxe)cxl+Xds`y40j^M;Dx>*cRMo0XZ(wpizQw2L)
zE*71Vr!(L`m!AcNImeup-#`H7r54&K4?+2PC6C`JezOeJwQ%pJ3_$;d{3VZTXFT9(
zJ4-6}Zmu8lxTf;p4WZ7phN|Rn4UIs#uE Ir-W3?R_Oy^oc>>DyLmt=8doVEZ^|)-O
zPD8ogSm&Bs2hTt~JT9P^gYJNm$2HrHO4uL$63;_5k89ijk8#t^`DxxF>Wr0p2=|yc
zc-$AX=s5Z6G;bWdaq!}rgpxe!d8p>`{Idk!3v394F;Ff-HII8*H#+x7i~7;yt^_=|
z5ee`TFmONAqIu7uf&R!F0&fTgZ6jCLe~dbLe0SWsc}7wj5gH(x_Y&%w$B$b2F1(jR
zJbt_~;AtOWf4>6YGv>JR%mvcxsPp|&*oSfa7OKbP`N068)gSTiLp<*7z2I?Q*Fp~U
z22}e?f|vXlf9&%ID92}f{FWaA 8h1!Td>og7V>yb)uOBXrqGv`<Cy&08lcoXmV9Sg
zzJuh9BXF*N<`?I{oMA49{k?j>5b01y?GLmq!u^Ad>Qt`w35Asd?gt915xDLZ=ICmD
zD~!oP^f$0gzEQPam7P10T9*o|C&=}uFlV9GnZo>HV?Wxkb7cy7Z(!LLWIES}!aM<}
zb)YcLv=HXI!gweU=C#6VwK0Dc=35bhd8#nK_$nV2Ry!>7PGOZ%%rAx2iGq2g NO0|
zUlb1S9E`tPzUP;M`9(1w6 l!Acl!^YYhK68)AS?2I^GD_Nnjms1gH8GF!PgdCW4)6
z3Z*<{26zVL&CqxYz;T>|Q6SH j{hv$$Ajm=@xKSGpJzneFJ1%=kI(hq4EehTtcCM=
z6F|>LL_5TvTkt=D_4ABG9~3)~xMBY1T5!At54Ye9us&Nwq7R5O!210dVz=P;i+2KM
zZWrdi0L*<EP~!8zS`1Xa+k$ z%zc;7n|G+61M7V368DN<27G<zdJ{Mq;=fHC<Vy$Q
zX#gJz^0hO1pZEZn*9*qb8SNBNEJ<EpTwuoA1<dzNdk3EH=YdB<_ Ng2Bfz(U_tO>K
zDTaZ04`L?M-xx5zbM)6Gu>P`kp%A(jifqNJdbQbEGmC5BNaon2m7bW&;I?R4qnps<
zBO4~3g)BF>VD39`FfMS`nJ+k=lLJg9(JxoF<_hH*yI{#flV#Tyggi`HxmvNfsK-ei
z9hJk3O%6YqvNYl_y8e+Pc?gq^X53Q0yDzz4#yekec!aa;O2uAO_g8r5NiJw|O1Rw~
zNgq2roVJdQjZLL8R%ZBcI>qU2?kt(%uJYClT4(^p2{i<q(Njl<pPU#GJOFM)A+OZg
zYEAkS8_k<;<ksWotVw6it>Tb7Qn0I4rz))3c`N k3XFr{TW;n<Lmyqux7^}4ji0NQ
zt-M{z6&!exuTnqOjmS6?7;$3N;mH{~ *s<u 5f`Fb3AK4YkB!v>6_-vf{=d?$cG~S
E4Rlo`%K!iX

literal 0
HcmV?d00001

diff --git a/images/bin-sparc-dynamic b/images/bin-sparc-dynamic
new file mode 100755
index 0000000000000000000000000000000000000000..138839af7840cc549a02937310df21c799984b7c
GIT binary patch
literal 5060
zcmds5Z){W76+idcP7DMvAscCE$4g;rkifV!MXY1$Gf4=PG+}8vwHw;AV>^jA$42%G
z3)LzTK>MevLlc^+im6sbt9 wEK24KW2`jAxAJ7(c{kUl<?X-UA2d1fAD Ay}-+k{o
zPR1nqbyqs?oZmg?o_p Of8KrX?7+|wWhrSCOWGkTQPvW8ugE$LA=wg 9(h2zP|>1w
z3biCWe3A%+Fen5JT|gpRQAeV#VZ0(mY9b`G_d~%G*a}G0Av8M*eQTh%pnnf~pG0mz
zM`B#;0|a{&kVrr3NLrWm{(b`OPl^gi<bLQ#M*l6ycPrZezCwO{Um?4<kT1^6#w(@x
zer?LOF_0P e%iD}oH{1vl===(i27}dKW}|Dl0W}^&&^vqUVJEj`RoIO(9xd6EJSQ8
z1*UQ6({B#%t9@|%O;)Tae#TH~`-<ISwR}X8ouYJMoMYhOEh3x5btk7wMYrOm%bx2B
zhLYhB4v2ef1hv_G(VeN}vaq8nu$xZji!wNL>~NpEKc3KD85euTO2L!kCdtNpo}6R&
z1~Fo(!ieLh{1?by3S`7+X?gzbrRddAZQHLuxK`aKk~~|lFJFx;MME$=7fXc~A~iKv
zO^G!pVRq(7a=p(b8StNw&tG4P&g+ru9`xfaM00s(we#Ij^_fed>Ph4vxeat5=wiEV
z|Ehf{_0m?`c{wJ^5$E6Z(_9!+H(W2YJ-Eym+8yb72pGF!{`HRcZ~S;m_st7-ZR<|p
z*A7;#g>Xi$gs;`-s!sc3j%+#?v(>8|8965 wXn;P^F1lp)YL0AM<;F}><DewkJLY>
z4eb~9Jh(jnr==)kVgE)>Oi6 w%|t!MG{0bVFX|jQvhHGg_hJZk$Q^tmZ;t4^nLdrb
zd-2b?q22!~MsMa2G3vfdjKQ2bnA6X$MsD?j>$&1V5yaSbAy$pv!W 4XsaaQc&22e<
zsJdf*E+to%t6|HL4b_+}%+tk~bpA3X_g#uf7spZ!+iLEL=-j;;PKC|55JRZB|8C `
z+R^>aLilma;n_NTMyrs0ACE6DU}v(veWbq3cE%6od&xh>^h4dwtUrHeh}s_F9_R#F
z_4=I;!4vg*o##M5NbeW*+^B?qv{`L$+k`4z*9qG<AV*n&!uESm_j_<pk{iFWw{P9%
z9n_$}U%i>@N`Hyae;dy67r-~-3~);IJD=c8B*r<bZiBag{}y~bXaKYU#CHB3<rG;h
zjD`D|ad02Eg0{hLLCeZYfiu=!AigZxN(dHu^rvG};J1MfK=;K8&vzCpQq%OsT629R
z64&bg;@m(!1o<{)k}iXNeUI5aIF5JQz46|7!rq qd_B>-{}H=qG?%rHraixY 58%A
z{_l<Bl{3>`dR*cauk7<FBjt-;u6#=3#gdncCl4Rn>!l|HG+CU9kI&@sI?QJ!PBfLS
zOi4U rU-vN_sYKJbgo><mx`-^3tc%^NV7p8oho<|&lmG}dbwFVCjg);Wz$|-;<+hz
zqMV-2xl>uRHAvzauT-v}L!W&=10{T>r}G(fSb`hB`FI6JnbP!huIQPCa8G<YthjWr
zyK%4K{l>r3n8s#V?L-Cl2<?u-4kR|n6z+ePhe5_}3U(m9hp1yQcKz5tp90e#_O9N)
z+-p2SS!hQZ266w=4trYfYX`Um#Mo%Vz5Q(vwu8324HZc5eK1|jIKCI`U-;wR)%!OJ
z3)3&p1kw*+cSp<0a!>`*<8AI2Rq`B&G0<NM421J(#UFLV7eK}iXN*2)c=oX0F9$l>
zy$DhuoM9H)kmLl&6#8Jf1TuC up^~VXNnyNFM|hm5eMCY^mzxSi}6<lq8-M;dzHRh
zF)yYVyWgO~*qwwONZ&En+WoG{ZWeYRIcki+jlUXX`oozVflO+=BOo^Hu0u9<H(&?4
ztKA=)>=t1MYWRTIkpB#sbIE?+gB_ G*M_L=qTsmOnSNU?qY21=$APnO9HgIt7+<UZ
zZqe_TAz)L?c;81wFpieb;1AS iMG_S`~$@P`L0 q9Z0VuFkOtlkAX}Zh_qAsrR$qD
zbhu8zSEEGvZv3PHSA5VH*MCqp{uJTG0PY7RK<t;8 5Cm5TV6u5J*YFKDJD}DaDC3`
z#=ea{Pc-)XRr<`JbKk%JZYS`^?7!QI{XOfy^NBg17>WN*25t?oLk`S*QlBCN<`{?z
zWWdY` dYwqo;$=#WWa6YymOENZzK=CLx}yn^ZN 0cr!WlT>He#8`2c1kpXi~h;NVq
z`=2(JUbDpfwxphGlemK%>)|pPu=(bABfvaIsOOrZ9-jm#di`kJsd4at9-j-1^?~Hp
z{|Ve?;=|-HzAh6VFyre1UIb D#`mbGkWGxqV}6bY{VC|#-*?2))4=;P f7T<;Ku$u
zaIFddLX<zvfj>0!OAucb{lCK+C>Y<H$nRSLW`6&$Ccf+Nw?uv5 2{}8o3PFmap3=s
z$*;1QUwq>Q^92X!PknU_J_viAf7m1cY7}}sU%;3z^<C(7ALtbGp(YTIgYKe8Ci10D
z2kYx#fS-p>7h6B|d$Ac;5x>I<*kk>v*Wv%80E4Nwp&x_be;12-*YuC%u>Ze7{|xQ7
zSX{5_W5jziz;LNPM|>$@&yUAihxW_V$MpKZx2 Hx_fdecK33_w(cXr6Fh1*R7~czQ
z4}TjZQ}!y}%)~ IgHQ3kv5`@C=-5+Z_+oe6{#EFSz9v<+<W3e!<LQE{uR(5lW>#?5
zIaSDcxorH=1CJaOD%^Z_7N|ENnRKDxy6)ZD`IoHh%=Gjb->kVJh-qNBUx##LH2LI!
zYY;;+ ``7DKl3A6+v$pGJYVF92Zu%uCx_gTBS)SZ7<0#xhld6 a$XAEbh(^9<K~L|
zN6}QF|7eJNVsxZ$p#SO70px4=cye%{(YpWH;pCIY`h?d&|Gx$t=${;!%8aY;n2qXH
z|47^?PP?PI$$SNu;J!k-Qpr^$uwVO=#Bo;slKj^Xl~o;QD<yX-UCb78W=2iM8X T`
Wu<PQ&YU0v^&gpxs{w1TwFaH5_!3g~T

literal 0
HcmV?d00001

diff --git a/images/bin-win32.exe b/images/bin-win32.exe
new file mode 100755
index 0000000000000000000000000000000000000000..db6d5758da020fec5272d4ec737f4d7d946da3fd
GIT binary patch
literal 21617
zcmeHP4Rlo1oxk_Jm&t oAbe?5kU@gb-7+K)0=A+9Nsu6rK!SpbkI7^bMkh0IW`baC
z4TdObq#L_-?Y8tRRCd>P*<E%^TUI^WD0D?vyKGO7+pX=^wz3V?y8T*fPg}FU|NVIH
z%}juT)b4J%C-2>RfA{}&|M&B~c{gir8Db`5%)&J~%GeRa6vE<u=36g{$Ip0TJUd+S
z;>;s_^ }rGx5hKU?sTd%9q9^2Bgtec8*GaO(>=*xJQ=KSY6*6w+GC-zvT>D4baMk^
ztNC~~slRI#Tfo={Ib*M|VqVIPCCmq+04{^Es)>lpaRqUab(989c7sL4h#32k%zSn?
z6ZH}dL`w`Jb|L~9YX%Dmc$Y&c8{3|R&Lc&*kzG_*s*ERWVa;1Y?U8H*m qwv1nSJj
z;qrtqs~QfaC86+Z6$*)teCG+E3y0b=8G`ER7N%Qa=w;#IP+ZCrzJZT~yz#lTq<4Oe
z#DWxU!9{w7v51{eZp^Q~M&$O=y&D(NO`?o9fNtR;0W^{Ay|_r{6kIt0bTx|w@;u2I
z!bQHjN<f|)=xVD){x7JF_u(S?t8wK7&@Emlkb`tTgp26rQpOvqjQLAy1t6+8j3m+h
zfq*<W$h$_`S4rh3aFKoQ^^k}p=&GxhP_lw<uizs3DqK0CoY3D&*f3Z&+#F^DCpV9N
zXHWKOhWwG7{J_bUzSk?CwJMt hS|tGbl1Mut&ypiGe)RRdm4WBY{SpUw1N7{^8G9r
zX3y4FT2>gbRml(m5A11p3z2{1AHlKT53ql XVu6sa)VPXund%s9EHTbSAR6}0e~Z4
zpc3Nr?<Yw}So?)6t8(NX1G<imd=exB(<(<EBhu-IVe?}`5=aN $_GHW2_-@qu BZ&
z5!R54H4|11>{M!WbX3%T;AG$HewYp|Y;@{D$Q^m>?a|SpJ%>fF*`Uj*KdJJs=a$1?
zQwAISgQ&sMhZ!5b`~6GzAWGl(B=L}U5RrHMh-AIr;uCh6DD5Af(EnMW)x&+qrrf&u
z8H+7_1gzOjOaFwTE0+E-qMq-(_W7k~hhefe+pu&xVJ~{*lKhc7$)9iWY^HxWdkD%1
z+_R01o;ZS<j=uJ1sy {(pSlBi4|geX&r{qjuxMA32&_sf7*hPFZUaX8RW%gcF?6a<
zNfULIYDc~eX9~5aX6Kd)T~9lu#kr-zKaZib|7F2FVb_1c(<1{AEv5Y%IX*YY_Sqi@
zQXk8{59VRgV<Y{LGVly~ZvR)s3YVQsH7-NZz?9076iU(RU?>3t s6H&?&y%}51WsA
zRP0$ X`!2r-t{YJT1P|Sd6;v{rp<dIzal!IEqnLgGH_z&PiW~`|EayVe5(4yXDB^k
z*O%bI>fs5WCZ~Q5=_6oe6F&XsKk;mFUs)g=X1t^St2<QM`1v!8^)g*#QI<KBevvhF
zY5C6YqSVsa;G0i7l;Pf!!R)x5LVhoZ$N{|*KE0HpZS%<n<OW6Y!13M}xR4ZnjLgZF
z_r7Qjh$7WrZq4zAsPD_)^I-o_37>A*`3s5$PG&9{TxSjPzNh{Ce#XK~;^`l_4642S
z!7zpk8sO5=6N6JJw`aNam_V0Xm G~`cXZDeU@!yyO&DP1gNyb}4YR(tN3-+#-^@<l
zGwt(~?-&}L-1nN*_Xh8I6D`?01x<hXFGolFj+Nhf`{twQ|J7f8% }xQ&vHH(=qHZ;
z=X!oL X~8f>hZn5JPi8>PQnyx^U;o>&CeDQLJjp=AKG_x_P*vYqxdNmKd$0qDn6j%
zLn?km#k*Dfkcx*y3{{&?-SBG+CTD)xeCk2uRiDF%8103f6evBU(gL^uH<HQ1Sn 8g
z+zVjZMG^0U2NLnN&gdO>Ce)rtFniTDdwr}kp2^12b%{tO6U)2{CR|kUJM=)f*;RgU
z9b>zZ-{`?!1-8$Vcd2FS1(baQ*Be9wS{<%LI)v*wT&r>2j%zEfZd~`^dH~lDE*&m}
zoV~1Jdpz5mPDNvQ$XUm4h-KHL+IteQm62q7BDRdN1Ytz5ti3%=MC^M;ODww~xm8fK
zH*Al_y0h_Aaz#9WF~H_9+wP2IyCU&qB;A=|*CO9-+p*-fcsi9t?PR`#o@(h)(zY|P
ztR3m wzE6Bf$U&*GzOcn!DMzk)doLsJCzjBE>6UfbD9ys^B~a;8JT!zGLjH}A)k7#
z8ynWIZCJf<ff%bOnu4<5<m$?7i>9-hOM6_#(-0XVDR!lJb_+AwkX;PFA09xLRPDdJ
z1TP_q8B;y+dL(sM{Vvis$CGO?4C>amwqzseY)?1yVSi2|!vh #WMia6*>RQHCfv9{
zXdw;HqHjHf%eL!Uo7UT_8(Ug!n|($g^&aH+!~4JcTJA!d!1)LkzhUi$U|p~#v o=Q
zam*Oip(vZ*))P;(x5v{mF O1n#?|%nyW+{tyVKcu3q#e5Le=v`b|D&>CXY#BA<nRh
zdy+Jl#oF=iFUt(0II}gC&IWT)t4I`DMTu0hQxKY}*V$QSeS#k#%Pe{(F5>s$Zuljo
zLvC<ibZaEdd^ErIbg-a#{}$}li|y`gnwfo+HfA9kg$?E|A!3$QY_~-+F=qD5Vt=vS
zk%)9M^8r~NKt7&8`GYcF4tD4u #by`O@WA>j!gU>W)4WCqS(%Mb$28qU10pM6g&;K
zKMkw>D;iffFmv!Zs)11?9U&`TENYVDloG2LwNkzll{2{Cp^$)I@)a`s>u+vaU(bq8
z-iMm|mv3rqU`21x+b_eiIufZ!mie1+YHF-!zMH7w$62NJiq%caS{v8iV7Dy0sli^h
zzF`^b_AM*^A&LWasbn^tO5B`Ew=>`J;(wLy3}6n(_GBblr%)@<8tIf!y LFKhIBfW
zZtCd3QpbD^3JyrPC6<UqvnjOQ3RO ZsK@J0O 4zyrwG)gUa9bkfZnVwOUEM2*C<Rj
zW=#v!rK{F<Zzm&T%(qIBCs^5k!2DmMTH_x<qKTPf)ZBMtu>pz+c3soj)`pF(>;=QO
zy7(2Wj=~psYr6tnCBuAclvoz1PggPDT9vhst!BO^mGvXLfcctLHh}Cx=3A$-sBgNK
z`PQo}Dw<x*d U+l5m-SD))Lu<TC^6E;Z(VnSmzDUzd=x$vmWAvtN?P8LWTs=0OV$c
zJR*>KAR86(aUN)Bk2BvUmEVhe2Kif5ejoB}+nMiHl|MlA$ls>&k0T#NezVFSL_UK2
z?J9qW__0RVDt{RHIPzOm{)n)s4i-fe@)RhPYugkw3 8JpsLCG`Of6t)SIBWtY|qA$
z?Xh;<7f>1#?Pbn-fy*ZUF<P&jntYTqQ 5+HqqqWZxy)t<SXnZuh-MoiFSQ#s)-^P@
zHa4xb*EiJBkZSfdmV5;S(5QBab+qmCtt!! !YNSoxKWi@6EW_YZ?#}IW? ul33?yu
zTT}8=F|-1KwLM*Jv2=3;KcU312Ss((Dlz3QUt_W(mF|krRuz4%<ZCd?m^B5qS0GhJ
z_PmOO=;q^5#e%x{nuRUiS~fQ|qQkFmVSeAbl6w3cA&p*NLXt3r>h8Zj78R30O9>YR
z7BgM(ju2mK$=fKltQaIs;&<UbndV70#WJpX2)W{9>~697HD<~A6SI|_kz0#6YR8O9
zVw!5J#l?;%<5}C;i5v6T_fdRFdrw!_4rfDdED)d&0|t^(L&{(WO~{w#3X|J*zKpX9
zu68}Vf{SH_R<Zyt3X8G(xeOCK<CpSlkTxD>>~d~dgjYD*c^>5aqo6Ja*EC%8uKzBF
zbA~7*&MRzbgzecj h5l?EP;t(wh?T!-I|tMj~SCcNxs>IYx+J^BMhQ6F8-C5Kyszd
z&iE3_jEB2td`-l7b_o8EDviKjVl#Q+)(t<e p5RJi|bL4UB&Y a{Sl43S}#C9Yy&p
zyEEBi$8 i?<>OMC vZy;6gPv6*8TrN`fsrDt8^*FuSmR;&@0da(^83cmpg95%=Z%<
ziHfew?;vqQgy8WEk5V1oJ&fN;P7pstSr&E7*>a0%loQU2O!{R&VB456kvae{`q`kY
z1A K}%~!KI;_1u$#5a-Sd=5F^?o8l;%$OmB08+i7M(2q{VM` 8S9FbQv16J{{eZp4
zj(6c{P<Ne6cngX+dd7PZ&lN2mC*qHSRuk(jHJ{FRD(X#$*- I@SqS&MeOM?oU;c?V
zHBriRMx*m(Zo!#%XbTt21MNJqqa!Yr5?i|Y !BP|^SYyY^QI)SD!d4!YX*F0=-t_G
zw3SmEF;j2E`27*cu*61;_fZ<Nh$S{+eAmZNXJeLS$&DEAm&JZdZp8QlvOIu1ZN&J4
zGG7jMwGrdHB{T&h<VK7SNTkAYH)8z5Qt&iZWIY3wKCuzwgU^%tf~}-y7kc(xTJbyC
zr8%21!*51YUEPV;_MqII8Gfrh)zgMb8|6-sMgo D@ab%YL*Rvd9X-jY VfDbx1vK8
zSrOd*yrdINkVJAERyTSX!9Nj2j`NZm5z#|g;O{|!H8c0&%>1nXUZN{9>4iB8z0Yap
zU+KbwD7+Z{uX%t^<g *gOHKb3{)v1NFURa RI<|2>i}VMbO|&4?<;+OQR8Hc<O#qj
zQ8bm!2~ff}nVbI7QV^7KWQ)rrHHemsLyuF;f~Q0ZMdu?a*k3uUMZ_9VtWZR(Wt=xo
zCVc!%);M`S=qCvJBC>_>a)D!mF%gX8rG>;eX)2!+AcDz7V8m`?GI#Bp8iKiGY*3hc
zNsVJJwgw UnG*;?T}6mrACOh2s*-EMK9YM`k>e2q`YtC|U} 8m=LB5RX|8+&Zk;}z
zR|`QKOE(GqSC+#0lQ80D)UfKwBrP}{i48s?U~FcHxh6=dSg0MaRI9 3>}vO#TB%Hh
z|4ILB*PQDEr0wdN=&W<R=(VWIT=JlF{(Dpz8s+)`m9ew*7N<=`{jA*XP^7z$&)YAG
zb-(aSPnPJGA4k e=35ug{h`cj8`b7wI4=*-rp#bF!OQtC$Cu&GfnX6}e11<RU9d~Y
z?8wYZr&3w 3TS>j8BO%iyKnWn2&}YE$F>9^lWmWuLR(1~lGw4x^xbhhu5~!+WL73I
zuNbuLHXk+k%vjZoF1ne2dS8cGl0CJ_GR&WTXrsB~+7DRVn0uLd#gO?+cKo*bEyk>h
zTg;a~biditVU}(j rTXNasLxrpEr}oar^#<j_)w9 ~<+>H~N=8+HaPG%qQ-<- Md#
z5BD#%*O<5ahqfcpZ-)F?(*|9a|G4>H|8f7)=Zpz(MjxtSun*$?j@&c$CN9TAoo$JE
z^fDv^Z(y}`_jkzr7DG8?({I3>@q7IN%i4{`nxgfgHE7f?8}IKoR+bfMoE~w!xcGJn
zbo31Kx~5-VR#e|-I<n|#gXn}TlxbP?l;Op-EPAB43$|!_l65g$cn>&lBGhC3h1YOV
z;{SFJV3=Xb$yyZCvnbMjifN1+tOxr*8ECGcmqJ8K ntgYr&#`u=+Xv(&6MR9#j|AE
zPjLW>ymF5K`!X)hT5uPk93&G38B`&jEYp69=ZdtestWmPS#D9hP^SG9uM}yQwi)?#
zvfQG$MW+1})6bq>vxqh(${!YSemPB*AIHU6^DBscB9m7_$^u+KuSL`-lN%7lWio^4
zL799Q(Vxqtt~d$&q?Gh?M8A;9#ULVS5V{r-NkfvJ<wzQm^z=s3kUWU!i!%8XBC;B&
zmVXxn?iE5?=rwn-C~YCxQfLcFkvvXgXx wQ|343;QKj9uX#CN*ycmAJJP;D^*W_IN
z_9$bW`iEbS8}u7af;bB V~l=cs~4NJMhF_ge-G|Kg~<KeN06h*-KE(Ngr;y8`8yyq
z`4VC>eNqA-5WJJ%G(F9xtP}Jp2?9_E8mGuf=#viw;0GSiI18IYLy3P Ia&ctPH$uj
z! nztB$%AOYp5(BI;jwPHZ?iDPAxR*$BG7z`=B|9JFU67;cb;ILu_*KU3xA7awSSM
zy_Gh32kwQsE>jR*1%M`qdtudRX{A7iE=;cX;sSDRwTgx;H956+ZqPld3b5)?J38q{
zoOyUgY{S=uN%?fR407ZS19F6jCLkwZl;{acORj9WAO}G%dyDQHl8fxw00#1c8_uO~
zP<zV0;qvR0K4C+7ve)D b&(T??ugQa>ZzCZ27L!3z0sx};BbjwwUDbSsFy Y7e4aO
zYtsu>FLe^BS!gF+j$uxsP#1YAH|X(oMjxJoF4AzevFz#^!=CffHHI8 Vv71Im5${f
z@&uh+lRg}KhSYu4_4D_ MI+x0+Rs$4v(??Tr_g4S_)*vsM$zd;6MkD0zp*(q&P*#2
zs%h>>BB|$MA<YeE@)+$yo6lgO<1s-)_RLih$r2eZq&;7RJ-uhJ$L_}GPS-49PU{F0
z=={ea&4usU<Y+E0(sL9MeG4>>Hyl4pT~x2X22Jie%))v>Mg9z+dZr_Jtl3zNf+}Ip
z*u7Wla%N*#n;-P(4x)f8F?r$Yq361(;Foiq`xZ;f(`|a8?5T9@(He4NTFq$<m#eur
zeV9vt9IfWGhEuzmoW4+`H8MBQYEEmoT+JWMEmS#Lg=y`Tt8gt+xsEKTyEB>`&ok|3
zr(R5+#H?KWO$b9H(vC=+&8%EBj9d;<vppZFeZb|)?+NFm{cElqrJbJIbG3KpBemTw
z*E`aF!j+ 6AI{fRlgLMEx4K;KNc&T+9Ho6<zOI^$`AF RE|=221nvSzEhrDydiM!x
zEEl%>*IhYE`&0S4YO?uA?L97+(jGo9?Z;d>O8evax xxMBemDLTuS@O^V0r`D SQR
zmanVk-h8BX$mLSno6k%8uq#JtKaj7h=C*vKHso?C?HkWaJ3d~^9bbzM<?E{1nvc}p
z?r?1tU!vkPheOkm-P)79ld*jcqGzNn+Cp&Whl0L37EONd9g9Z#Z~?vfhdRu(l%k!q
z8}!UZ^R%R~+(MO7G&QYfqEViI7wc8idnS8S|2ckkn#Hf`7Ua2mL$EqK2d7 =G?P58
zB|9s~BibH~)U3`&YH7+6ZQ*F&s(Z^hX{X(ulB2w_J6~5#I3KBf!9`S?cAuB_eFfSd
zawSW9YU=Zm+Hbgs(!Tw?v>zzYKIBSP+E?ZywQo3x9?M||(PP=;LuFyFwh%h=!-XEp
zBww`Y8OHK1hvxKS`Pwtly!-X4X+D!Zs`q~U>@<rH>UQV!_9i#z-7>8g1 B4lMYDWM
z!q^W`9ssL&9uy+zhXL8jLCm7LQgto>@*&X^K;w*Dw{OVbZZtK;7p!mOzXRcg?N0h;
z!NLPhUnQEts#JmI&>3j-`bF|6oZHUoI24NBt7pGO2O%Q|scFwgYF9g4wmRG=*LOVi
zlL>4oqDsWHvPtANL{A|{k|mOmk;uv92M` pHI>MR6%GAY9+`X+k=}Jng#P<USa50W
zF9F$-gZ#H770)y>X~8tT%1DGhgr^5oS68)In1deVMj+HmE={MPkxxrf&W-|PumJfa
zkOMj1_*)={bC4&2$a!AZ>tB={vOwzk7LZ&&3-fYnQ33Mi9B*6=M9;la&UHZKtgdy@
zI|&N(6ewxh3Xn9AV<?Ak(AYMPPvaaL1=l~lipxbl24omCl8dP6-<Qxn$VKRXpP*Ge
za=uJRPQ6|RQVEcpA}#y{kjIhJ_J~7x$jdg9G^Hq%YqzfH<v<`<$dEL1fK=g<?^lVx
z7P)-_(Yor9qu|!76-Yf07 _Rh0>qz#BovqH)q8Ugd`O+{#A{NL;mY|4Xk6{K`XXDG
zOPfDMa*%ZGp*e$SBti#v+g0nh+P 4My$3)Gs$;kEIVGrS omuLj>;dBF8IvV<s*>@
zuH*`Vcw2Bb5Na!zYoX#|47&IPloif?D?zglC8Sc;bhF~3NFsM2srLX9xeo}f7urXR
z{Sgqo(~~rZfsj7eo)>^naFK5*gg7ME2#_T(#_bzFQ8ccF#d!H~2pldlRlP)XC07?9
zjX?C=D|OjGDj~=1;X8>&&ApQ5Q6-0rFxX!r7iy2S^>m^mMUtKP-vuh$-P1<TLQY;B
z4AG=*ZRyxHO__)%V>;bI2XJ&IgTsW1Baw>gq*6og{OCZW_eh6bc<4gB81$U_z|r!t
z4poF}wD?GlZC<NSYp2J!{95NZCD%n%KU8B?opU4?Ih+`<)9T+r*wP&eZI2b=(e56*
zBZgyvc&jW9>p-A-#f(&UEWU6_t&RT#myLJDAQqNJ=<FXPwx`5dj7Y+6rw`zAA NNd
z4$tGO!gwSRzbDpC<z#5X+IkG?JPU1cpwP}YP)KGW`GH;SqDA;GV<Dj|Br_1Xe#6?<
z#x)Igb4$a9`X(IuTHREq&nMgRq=$20A2#EhqCBodHspR2AG$jhxibVK3;vr1z_Gn5
z4wC4zAt1uB5_$H-ZaMwGCqPdDX*QAZ7=kyh^0>bpfzPN1<9`ysYj&!GsG h;IBw8|
zlT>7NZUOxoklq#(C0&s_QfWKW(}wRov#~CF8xEr3teLDUe#f)7Cp=1RfyBo^<ixAp
z=l$Oa8l!^<cK&~A5H-U)1+T= w~y)wPIb1%BHi9<j-fX9-#~<y2opU27=jRN 2H~P
zULzEeQ!TY}h)DoWOJ#Dr<vk)~+c2%&_OubS#JeJ$F>wq=wh4~JlBdzvJCj|pq-?3v
zSDxBY_8w2C %$eQ;Y!h4wb42M(IWS#2kK0xuAF~hVcXOQn$bNGrF|21%A~KNUSD|+
z_ g`H98X@QWG5TTUt{(M 39lN?~2Cuc3o*n)@w;4xp+C9_y(WTr^$1LL)3Mr_aA?#
zai%>X9G>rF+dBhlF=rdT(g(5+cn28{{$dUjr=c>UUpOb$L=%aVlWupqGnP)q5(^jD
s5v^A}n&?jH*4nECs}?$Jp>oxq^18z5`=B0x=-93$&h(=jL^|((0C$N3NB{r;

literal 0
HcmV?d00001

diff --git a/images/bin-win64.exe b/images/bin-win64.exe
new file mode 100755
index 0000000000000000000000000000000000000000..98bddc028a5f0f95d155a970813d489265a624a3
GIT binary patch
literal 44557
zcmeHw4}4rjwg23^yUA|a{3&gqNDB)M5Rj%xo0b+^*fg7VQ_^NhQYfXc+3aqb&`q*#
zHf>sYSV*hHB^Z#uico#1yeDe)Arvf{QnbZCSn(hJKwnkB)S^~J<cCOp-!pS&?{032
zkI3`){%}9d&YUx6&N*}D%%3|mox6Jduy6<=ocJ3X6JifSdVKQt&40Edx#+Y<i^PMT
z 0`BJX!y?QEghY`-bAuzV=~<3jfA_qds5!Em^azi?d|OL`Wu_QT|LoQMPXq<8M6-7
z2@(B3i7<C|tr8tVybH=46K9Jlrny+m08t74+(PWqajhBQO{F)nauGm}&k!O{h>t#C
z$Z`qcm1xOF#wa5m4#q`=Xcgj4<e%(w*eAryNo1}_#rjjoxBCSAkZx4oae8<~u(cu@
zPKA+_z MnZ9~Jvu1Xzzx1V<{8iqH#l2p|54ZWjKs9-nCSRkZc?66#Pseu7zvS<&sH
zb)=$G sqY`MI!1%oSH?1s83XmRMa-L5EfOblq9)l5nw$&;Tx$)#id+gBevs =*sbz
z^$@>#)e1pH6~p)=x^oH0eoD-FRZAq|U+H%j{)p~8{N+5LTd+`K{&YHm-S|5Le-#py
z^#i)<^CkQwHIBphqXuHL59k(EAwh _ki28~BRXjTgqa6)=P!_utPg=oA^LS00*?61
zd5agx_yv?+0y^Tio|7{H_$^WTJwiT0Ov#W}We7L|x~j^>1RMs5sAReAoSX?tNZLEk
z|3V7{23}g6cAe!D!k;djhoE7|B hILN`HS51%<yrFz9++0<J$%Fz7Gyj-E1&&_5-3
z;EBcii%;7jtp|SP?bj{)=iiNutzLh?^;e{m=N)kUITItk3ilTXqF8Ec)kwP3s3DFY
zM(WO|Q<ptLE;;&G3HTq_H-=}l23=IT^eFNK23-%XkilaVq+P$h1X)W)i_r+uu5(TU
zhmpQQ=-%zZs8;#_QmaOwX8Hc%M ZgiJJ=rmOz~+x5r~v7gsy=h*B^dMfz!NhF^x&Z
zJ3Aq>_~GEpz))aj`*p8PF;WXCFpGCKB4uC?mA9z)1Iq!VZ+I2J&L j+8!3Kh<VY3e
zWP1#3-2kH5z*LP4JaPzR0#rweB#B>$nzdCUj}!u1)3WxmOPd4Ny>usl^xT(WhQLru
znRn-J0)s#PW8kyJJHG^r!~$vOnU$ajq}REtMveuFzc~9zs2kWhl3Ey8vcGu8jVNFs
zy(}0+nO`~Tk+^=~9vMYXHumGd;4zu$R+Xvm-_x$U5UqN4;8mk|M+Agv*9}1I94X!r
zgunx?A1zarly)V6mt<=}w)5G(0#e|Eu6kmXp8fc2Qsddw4A}i4#79p eSyu+BT#oV
zg{ldl62=b30)x&off7|u!pR;WtxC^rMCwpsBLt3>4gp9n`{RYkJyyJ9iY$-o7?8-2
zE-8M<T<U#)*NzdGamSM>=Z=xSt9Oi~rUV8aH)PtizkkJFw!wI$03!NY;m#-j2F}w0
zIfJefP?q$<^YFX#mEs+ P-$nswp13zHF|jw75;Ys1J^x4wQ$8%p(|@P)LglL LL0a
zG?t!G?Ee-?IkGjYev2P&C~G}>SG%t7x~h>!$#bio9Q*!}JP W`OHj>UfhcLaogaT=
zZ0r$us2Ke{sy*#G1*v4zou5Sl4D!AW(iBkyqrU^i0oR{u)o5{K5ESXTO;E7v*{WBD
zRvUrHlYxCdcZ y^y86K<sz% }>19hmaIL iwCxarikW)az&DK18$se9>M&MEe$y~`
zWOS#@;hYsn&p2)M;AmiQUtnOrdvr6<OaAo!Zw4Y?59~Ya2&7A2eh*k5a5 z)SIrvq
z5QAs_2-tMtLHq^=OB&Lyrzn;#{ThPNU!$mluKN)^ax)ca OxvW+g1be{dH_?7$tn<
z3R%LBA~ ihiNcX>Mja4+<W7*J3**G*FH_M{PDAJNQuzVbFHj_UMz2JzQbRuS#Ou_?
ze4PF`(j}K=I{iLQZw3QzAZ?_ vYUk%*|K2S5Q5|?Ss_(VKSIOi=pB$1ke+=EAlg##
z&ifFNeTMgn{mX7emeks1w^QI<_7MbqzhwI!eQ24B&?}e0<wx3w` RXLWUbNV%ry00
zYMlQjk?q4{hxWiJ#*Ti9^H)84WHaE5{~-4i%I(y-SCKk9-U}L;!1<4~0YT-L1z;q>
zN9vLADA_`3u ~G14vrm}pFvCZpJMbW8MHLSO+Zt_mO37J1JyTr)Pt__cNzU)PB$vR
zedM2!I6OQ|^)tGKt-fEv=$D8B03LK{pcr_~OqEi-?IF#sxN5(}Z)o;UE{DyB7CueE
zl0T-N38WolF>~w?`6N(%zsbqkj;BJmH^m<V#t8$jIZ}nt#}X1qFC4<GFtGEL)TpLU
zpE_{V=${dY><^^<-zXtLza2XS+}4)@>8sq-f$a?p{ys4Hv(Z76>gab#T9&-#z#uvS
za;Z|9aRwlHR xkR_0-hjK;+=Sh%sme1~+`OMEec~mXkquz*UT2de8velyT7YdrZu#
zMvfkQgj{# kFaxK@NsE*;yQw1?Yp2jK)nf4mb(LkrC(K9Zj+{!KU5zL>DiC00u78_
zGxkd>jbfA 7(7U67^8jEUhMFY>rZE^{QJ3lm4S3&7(>wLUN{Jv2AZ+ItUR? wU-Z)
zuIWM_5qyjY(uHL-UJ=dchX{d tGr<d^Mt_QPt<(j3Yn*&tUNHdf0SH4kZz!4*K6qL
zM`J)p-a!0>5Y^Hg&p_|WEB1rQSm~)$#KHZ92 F1S1-THqPL!v7bS1Gv`#qT)4}*Nx
zL*>o(M}ph0Te5n6DxcATNX^oKvG2MiH0<~Nx x5Tx~(%Y%->4P-22DXzqFsq;V*vp
zlDy)FYi87;y5<%?JQ5i48#Ak(Jn9S#jFkJ+zNvMC`|6i`Z;Qw8 VOh7Jf18V*k|~c
zd uR$EL!z%&}Uiii!@(?v&0ceVPKWADLqnp8&Cn` #`*-3O?U{-8QJ#_Z-AG<<$>9
zS%1#H;)j<@B QYj%$ZeBA1%=K87WT(rq&D|T)kvp((MSi>z6#4oPuG zvSuU&xeoR
zN= LyX<r#h{PUrGqo<9xU;pZzBk<|6*1%w tfK){FnCQ_A~5(ACMJC|0%=M~BPEa~
z^uQDS`{l%?W)IC%#!6pYiCTh;Xxd-qA9&T7@(#S}OP$g%)KIpeW{;1YJKa*YSh~Yl
z>26Th4?YtZd=0H|^hLbg=xn!Bwwq-(KX4neb8SPeBT0C{s54)P?DmQY)eR8gPrDw+
zixm|kK*b1B8P){`<7KUNJ4YG qg1eXS)u`H{SAYA%eEs^Y5^54K!poZ;noGxpl?VM
zF=B}ZB=k3=6*1-vBnV|MJ&5T|U}*L}1P5FzA(lG5z~G_4Iq>IK^RN9E{7$)cb9(N*
zpxF7FzA5QtcTsFCb;)pG$^SuL_yK^MuMZ5(z4Cc#OxKhx&GcUvJ8SmP_(B#kj-(BT
zgL+A{yrrW-8g7^TY|FDp{4j;8|MbG;#QGIf)X?nrAex C^U1!u(zQ-Zk#9-&x(D9C
z+~X)Q9N0g#VQAqL&;*uzzjy%4L1PU=XFmH&3a%-uJo;YhKL*}#7w<R;1 cp44;=89
zQ7w!5bN)Jdvy1FZ*r7lx%y3Sb5OtUjk8VdogAp&Q9C)Loc*kCl7k AX7T`5pyyFGH
zR(~$FSn|i>f$LD1^d KeJ^pm9yQcV|V-3cy8jKgfq9HvmwZ8ZRRNVt_c#C&D3I+pj
z_*8j|cSeARIt`94%v2z>W)BT*4dhTqM(1LJar9%OFT#S* S-^s1X^nbkBvSH)RCzW
zTKsUGXvdg4xDVODD1eCxI1c$;usMobvxj<Q=J!)fGmZoxQP)rLLv>=u$ku+9kyOdb
zNPfT>X?}8~80qOcOp>=Q4p1q`<fMDRb0|9-RX1nrqHNEQmi&G}B{fE+Vn=_7{vsQ`
zDHlFMuPU%u>T|GG y=VorG5CwPZ4DGmumxqFI-A(d#JDmOD{BfC&o&Dfms +_-AA7
zBrvpg6q8(Z$)n|D#hoMdgZqki+y@;4Lv D(>9wP1znH4SH85HMOGZNy+O+fy*Ac9Q
zP~1EEI|pKE*C7Z(hQWo6h#YX8iFA)sj2v*Ch8WolgF+c)O1nOXx6Z&|-3X%ps-g$S
zN;i;pLxt}JVytu{fU(je%Y}H9m|$i*R(dgTqrXPAwGRi<br}C#S3(kWqUayMS<b=q
zc+wHrGyjwSKKHJ7lc)`4J`{YBl$D~s;~MHa;$`co&uGQlRcdbF&)*LW&ZhTa>MlS|
zbm%V7XAm8_i&pfC9T<N7B(wq6(9LG7v;&F~N#$7SGDHWz&f$T<-;9+u149|SgWnh&
z8!K%g+67U7uLR^gffj7*t6r+FdcD5t<@(c~Xc#<PzvQ{VpAV&GVv>Gc2^GL~Jp!IC
zlKeg2zS8 2`w!q}dlzsik3MZV0F7_Y{!)%U5~=1_fq`Xb(0WsP_68IE;`)KVjHMQ0
zs&oqas#U;P?RW5*u^HdMbgJ(a IX&cm`1iMt~%24s+zA>J&P<SA<NNxX^+AEL$$`>
z<AH&tKN5X^IQm)SIN3`z7^<PNm!1Rwh4_^0yit|qgdTM51S~6!^i8|21&ATWCG|ew
z+5}Mg4TiKM7r^T+{Xkz1=UH0}HfcF7&Bi=4?eY_1DCiEPeQ=7>g# C9{3WI~=aB53
zPo}1gm43*F=mFPsVCbPD=8TrZ!((S&2n{JL;_xgEHNJx3+d14kF4XiZ7~jsJhM)4~
z _&Qj+d0&*4#(pcG2KI$v5}sqGW;Wkb^2M1f06M;4By1?D;$2B!)wQdw=;atIJ)ul
zmvVZA3aJakBluB}1#A2};oD;YV;q~-6MZ?DOhqtue0_{uqUc+jRCxaxDir+ap7cB1
z>uCHt;eQPatnTbydD+~{7FBzj`npq{T`_M}MWwgAEtU#<=X%SNvCS3U%5%Jxc;?D~
z<J3;{#`>Z?p=2!H6A7m}d%9`+FVz$2iF-H4lD&jDGwQ{zU|;v9?w&2(-c*k_MZ1L9
z6C`mJc*&+`Ehj5}-YkA?ohff`=e8L5fVQi5b0nFnh{oe0-qXGD>aK*!f85{gKAGg?
zur;V)UqXd4 qh7;uhlBN7yCjFhJ|=33wI-M(Kd _e5@>@Fv~d%av0 s8;8Rjev-on
zIed!4pK<tG4&713cNT|>I9$bH2Zsp`cW}6i!!L1|t?%QEJH+8(4qxK%H4Y16EStkh
z4lm#^z+n I8#wIXFu~zA4tH>PBZs$gcn^o4=5RNMk8=0~huLMI_<tvxlfM7m?d}mZ
z(debINUA3pi`Ml=VhQT#0^#mxJeCxH5i63hSVL!9GMwBh>Wr1KRBc}}8S733lRc3b
zw%1qKarIGApM`DdNXEiZAjKyMOBo?DNtwkXglSHNlc~N$eRq3Ljrg|2Z0$|Ox?0eM
z*7UCEjK?S eoiSZosmtoJ?LJASYtNygrlq*=8^ZBm-NMwTZ6G=drz_}+#QKYLX_f=
z*_4Xch7+m2ByipGG{TPw*U;0msV}jjuRB78uIo;rkm6^Qa%m 23dh%WZ|UrY=0Qhu
zEVZ_~Lz=}h6Ld>~{{}~MJQhocsG}v8?CR_er()VXBIP)4HgTha#eh16DiGo(jgdt`
z8AT|B;h?8G*58>DmjK!rOLc`IBDt|wGy(4H?o7qHH;ZP9_q2uDQ5f1(4~629p6<;u
zU5Hk|y|Gj%oJfRHTd57VDNJ84G!CaaV#y>OX$XZQUD0^A*n(JB 5Yc6E3Oxzh>Cqf
zgxcwpix4jh$r{D)5~mv>jF6i|w-I7ZpE5#y-4a)6hTD3QDbZjm4p*7&iDYMYs$E3Q
zcK8-fq?lb{6cJkAV|K;5A_>&NBW7>s#_n)jh;Ny_sboCXO>GUucw7H2u4`IT*RWu|
z9C5*V2KfJH{bh~qko3;;54AvvZ$fcF#*dsdak_qA7#a88Fd?&dkndRF9Si)IvcP%J
z2CH#+Xq6lfxA$e(d3opgpKk$reOC4V#nXgvoPsxOOr3CulV_Y_9#EHccCXIG=A9}q
zIf};G!+mi~w$$Y47?7CSZQK${L}<=M=QlElL_(s-qVuIplIMqL1An1VZA)WQsG+{O
zB _~8NQ^%VL%H60{xdA_In;uxf48x6&024*x4NPlD?sxrE0<KxuUzCUkM$>FNxWQi
zr^4}bgn`wUdH9R<$0{OXUPn(?Y+mweOlf=PB@<n3eVy^>yya`_8~pR6C(PZlsCr%s
zYdxDRcrLPA{Y=)p!3<$WELVx(1SKwqJD-+#yz-~7n`XN)EG6N+#$n_|I>JfeaJwuD
znPBGkc3>)v)uwE6r%NU}6*a}3?k~fdPWSWpbvW~L$X)JypeB;)&d^EmPWN&wpXM2B
z S9JZz_0~zcc^Y%ZC$XXzHv>csjjxM$uI77o$G;_J(;)1T6#k;hx0pKu>YK_gcb2H
zUR%tYImKD<IdC* $tNM^9Jj?mzaW|)$$v#MDe<i7>uQT7gJGP$kKwHYY;I*XGp&5|
z4oUAbc$*XEZTS~qQO%s=6;s?!_cW+DHB{TUrloFOi#X(Ty_?kY1giq5W??RM{fe~>
z&R3XajB$H{3l!!;#*}!1)e3VFV`h4S3l+x47_TR|NMULiQ|{q+PqxBxm$FZ#XLWyV
zZ&H}GjHvcB$2QiYfPNQkJDYPB6T%Nf9V0FvL>&+-7_pQPD}Y$Zhzkj^5{LjJe1vEQ
zqMi}UJ$0<eDwgZ__>+~wyqNV30IU*b1A{?;^M$#Z!F2!^2y+dCtpFDZvys6LfaeP{
z$Y8?L6z&)1B Fg^nj!$3B<Ps4-S9L;0XH*z1K>8mEesC>?o9}DEyH(GI^atg-bLx1
z!n};(`vFG*uVZ*O;KjncoWVT+mk4t`gChW|Q0yxhK1eXiy BCF1f$?rGW-m|DEU<k
zA11h3m?4Ho30^47R)&uO?u52shF>)be}(fuD7NWQ>n=^Pjh$HUfCp IoeYmfQXVIf
z$0U2=!h9d+-sSQ5V{LsKGYQvl!u=jkL%27!Jc)&mj+P!N }D?ucXrx}WKWk&y_Qq=
zsMJjB<;?Hr<dJd7nf%+C;Gjno`7fi6z;V yXvjsE)vsCJ*w`Q(A?i1ZmS5gdCmi8-
z%OpwG_LS_IobB<RFm+cu;pIgQK}Fc{X+Y=%xsOwQq3KdxA9Zg<Ya1HZtPBNPnuK%i
z$4G*dzNlI_hb0)iw6WeV%p0jwDyj|CG@&b?9<hk>3G)s*5aM(@FbRavX0S0oeF_1A
znl=80I$?gBG8PlD%HTF0Lylr8R$)8_339q)$W~&=e%9 b_Vl&IW5QA5l-(<XPWOjE
zG|f06w7P2k;u=w6p6=QUjHjVzi!je{twx;s$Ux`D4n$l_CF~Z(irg%7-3ZL|(7M&D
zL(Mgp)`e=C>S`8XmSLJ_xmICbD|;3A$Ynjrs4&mw)-61k<D~j}6}FtQrl%#mQK8Op
zk=4yPPES(|Ye1W0QTY71jC6VGlF6QAV<IAZ ^^FgJVv*-V=YOT=W)M*ew(P9V{y5R
zD9pJ`KQ+S}?Wcl~MIJx?mro<}n8!RyB-Ub4$<#A4EYRet7<r=ZG3RscnF<kF9q!#E
z%ms{{<yk=vrkfY~zG`VPj0m1}U0qrDg|79mq+<^CBy0_|=tZup71kkUP?Zr)>2$bp
zzJe)L!o^|+8FQP4L!x+mb(!b8z6lm5?lR1n>&IySo&Xj_sm- bkX)c4wlN&pD$I 9
zTB2v_kPaiYgW9O3PDY?(0|K_ani1&BfPkeoF#??z5GYHW5$LUeK=;(e2y{<CpzH2t
z1iB?4(0TVTVpt;3fhHKSOCr#PzLycZC4xH9Bx6Pt2D<h#=8(cb*%V_AD-5*lW6Uvy
zfx4R+v)w_;P<Oh8F~eLL)Q3vr8{#Cig*Mr9&Rh{sHHSB2IFGofHUPr`6ecP$C*K0J
zs=jm3)k+R0i{hZ37ns+%rl9rD_z~)Jl_n?>#kNV0d3!!hhl+#tlsohP2|1l^%AY-5
z3O3eb^3l|c>EE=2NK><)&*w)Fr~2pVK~pRuoAMX(NkdGFvZZHun7i`_knD8R 4MXQ
zR|-m}P=Px!NumZO%)JFPb((pp+Nl)gV+Azd5GRDzw1isfmy5;bLj_+!9&7g0fMH0O
z4;MTKEGdL8B(iCFxEJ=^Bbm`0O(GjQyYLERKEl`%Pjg>eGcVe=3G-3L&n!G5i{SOt
zB(c>=n+R*s*#vvgkCX3zjp oUIf=ImbEM!GQgo#_C1;ws67Nn;HQ94c!|5j7oo*`i
z38DJcH7n~v_&=DTKwXW$u1WaJTMHvN+~$dey22YfBNze-)ntlLk+wKS<l7lz5(e-c
z3_A%<#*ybv#^gzgaIzx`rSD>-8%SF0muuJNM;Ti{*l<5%KgQUpz+%6{yqn=7f+6zb
z43_|o^!9ZL^B%^W01QnV?qzs}q!8vVhED_>Zx2f~Kf$<}!1ZkI?h)oE8S^e+u+t*U
zf0ouT=gcCKSXU>8iu;(Rj8T|63-eQqJWFLnbNzH-FYIW}DF+4uyJHx(K2umMhpDAv
z1{swIWJ^NZBzQo>9#L$o8T0<aQPf#+aH5olkkjd=bX}(_>Kp2GrOq%NMR(vovUpa9
zBORUHa7$;Au2l7U(AeILF$lAN6xqdT81(Rlhc*#|>tajY%qvn8Z>NVHv8AVZYgb!O
zyd_KnxS7xCZhq$gQ<)5&Zcdu&X~wR7V|%0AEepqWXYOH{C7xQm!-XU8a<r+=2(lJ%
z(h1ro*(Ecl6zxUPb)o$=Ej1y3J>IXdPH?$!o6Cy+LgnV|qRiXTg{%&mD%26?MY?2K
z#yCc%ujq^5qs27J*SMMnZQsMDzi2v+`oX k$*j=UEw~LGhq<yyO&QFBmkA6o=qUIQ
zf%RH;0iE_VS25 =I1SyTc`<`i3(hC7fx(gjyrSc!g25Rc>TMd^RR^|)u`>&{6Hz0B
zvkK^c8<;@`y#;CFcnO1L1w8~dvFhaozaX%g!E*~{p?5c17(B1w5T&kVu%h5%0xxB-
zvS1Ynx{Sg31qGCM9Sf>1m`<seGq|`QOnKKcxU>KrA6_aL^bv%23TEXmc#MdzWN<~n
zAxgc9i30`Q1cn%FD7c %RtAFwza%isU`xRp#Hx+Kbp>}37-4WjK`RkQWwn}fTEz_V
zqdBN!p19~{IL;L?!8Bt<e$YAHGjUw-I39yJ_c3!zQ57tqeWstwB$Ur=&GngWxjyqg
zR 13`<{AdsXa0#n_L*xLWS CIgEN$OY%fwX>6ywquH#hpj_Vm ?-*bu**kVH$lkG&
zLH3RhFv#BVK?d17ZeWnTV~_>0cYKIJ_Kq}z>>W2U$lfu;tk^qlVvxP#!(2f2j$sCa
z$~$gmaGmmwTNrFr-tiF@)S<lNRtDqBJ8om|Na$W;oHL-7&D)Ds!5NO Es7usFTkV+
zWYc*(#zaF6$IYN{8|LSVo+D3brmbDtix=kSSrg%*ZGPR0enIx~^lmb~f88y8&73nc
zqe_kp^NU5VN-g^FtCh7VFu{--=#-X*=1^ -L&Nf#+KaJXHLZFEmEZ#W<{3f!%C#rC
z$RuN8mO;Z_E2aFB8nio5zoxmRW=(A!*7Tf?eIG!|?7nX7sYiulAH5c07KOG0nx>Yu
z!TL2T8f!#H-VJ%vPlOpFZ6a?lPYp%F6Hn+j50Uqwywm0I>IT*y>)n*<Nr=2OBTIm6
z=}cju%Da(KGd<BQ>qOoVGxGwxT;$!vU>T*# geWSj4CGzg&Jnmc|;`-Owh>HEAnpU
zgi4~#PPl~=s*!+Ni`S%5$<DUE6cqXhCoQHVxz?9=E2EZrwlsJ2Y{6=K6feGcx8<pU
z+Xpk~g3lLuw=;TqmOX&JBkuuBE6h0oPe*eqTHl MONqQY^D3m3f)d%-my+1K7`skl
z<%_Av`zRw MR87D<b5oU>MR>6 *a}a<8=QS^;Z-MUb^B^kzcw4q5#wraAF9+sm}bJ
zTTqR&F(HyCBJw|=E4(Pwt4_3Z(v&LygBw70T0XjEXa4ZF5ckqjFl`ughT|BvqY{&W
zvBw|`kYo bFvaPVKmV3AvKNP1<f4ZAOAcDqIKv2GiWiP<?0xSR`QC8UY0y%p<J6PT
z)9d%_qfT<PvLwB?zvQF^4sm9rBNo|&$!d3aV=PKXLxgd<VNfZI8<Dpxf%!ByNn?(2
zH|8g0iC~?^lo ZJk(DLZv?vUQ4C73Lh87ElW^bHjTmm{w=v(TR3*!u9jXput62qIq
zrW1{?LY9Mm&N|zq-|}hr#p8677ARgly)4jSl3291rz;Uo#;{g}qc|I5nHPy(r$J?M
zyk{oLj3$$!LpX8~xYsFhb^UN_<iHE5lU|GF5T_Ux%V1oEDNEoyDBezGGKANF)j33(
ztAR~)Ka2h_iEhEU95Qjgl6q-4-UpHWis!k}zC^qeCrM+WL;|N;P}9A__?BT9$0%<&
zLI9b6PIxm#30oH492drSjHRgfvQA+<B?-#9h4Ed9JF5)IKafbW7?Hgj1;P7FLLL1v
zwi|leGr-%QWZd&45tBq^etjC^ebanIA!wG>cd`(3$&u(W+AAs%lwSyV-X-{XFQ9o5
zL}<oWzD1Fp7YfM}N?F %#;2r!?acV&Gkl=OVhCLNukXUm9q~l(Hq-|^5y!bOtv5bH
z=mSWu!jxT~4HL%w<tU!x=0n$3c6R&aYTG4!I5;JYf7y(B`YY%wTEVxHd?h3g7a3n5
zw^)F`%657)#(R&kn^4yf3L87A7%*QXqtgup^QjVd0Wdtq)li}0Fyiy}1Nj%E&igJR
zeg}&B6GSS!kXQaZVt5vO1cm<smv0Y;#_mVKqxuCXJw6G3zi>Qm9{K$?u*b9L3B+3=
z!1&S+NsnD5Yp# a{t5)kPVh;(l^h!1UA!IWk0bZl?^P-}-9LihCC0cdPvc{<E_QJp
z?B($L$hpL ?}Zw}l6-{8p5t(eQ-}*f8 u~(LX3|LhScG>q%i6Y<0!N{%(Q2psC2DG
zo>6SLzUN#df{5ZD25xCjJZfdW*jS3PK0|oCK2Z}k8YH_eRPj>0%i<JUd!kPmtEFNl
zx?=b}EvH-%qStY3&~A?P3*!z$4%U?{d>MyVf&RQ%T8TTP61NkNDzscQz`ExV_c+`^
zA3}viTU<r$%Ht }SRA-RXL+&0&eT|Np#IfZqj-2Vo ziQG^zxrl_0xb+4BZfTA5Dk
z2=|5}bShIAm#8G6ljP_k#}=cBh9HlloRgN}d|<q%O)fr!<M3`;0>;83F))l}q0X*E
zD8wiD3V!`p#$rIm&SoTx^<!hcCd~|MVU1ClWtTw*4)Z&yf3mpp$-(??vI?O?)CF(G
zI)`e)6r!!>-+K3KN<W82LOYQ>Gnjwdh ^44zk%>V(i=lms15Iim}nVuXnnyF96` P
z%hX1tE|5B+Xv|ZZUu4_MH&#gBF+2`Y>4Ool-q#3i7GjIvM>_R)hQh*FaxP$55Ww4n
zae;zoEC*?8hBQK??^&B6jS%V53>@9s9l~u;(rTdyDy9ufYQnhi6EZ{1Ow2wYP S4=
z!#)t)-S?PG!v?IfkV=eUq%vw$(lX`enZuk$tt#nqh35kbMk^Hxh4dy=Av4K*T)_yF
z1Q58HpjPFlnMXX;8^xj25VlhzFzqSIV8%EK6pjgIO-Rt&*P{t$+X*m+W3Lu%^;Ay7
zsvTx|VlDcj|KNswMa4YzFW%X<F%ltw0tL;dO?<g)AMH%4NcQ&qqUyPzohy$7P%eti
z)kg!Eynpec5a<$-xzaQX<}+&%JYCsThl z_@jLeBaX0zR3HS0%z4c!KZY3^LZS5nF
z8%nhIWscj<ce?X|vTx^`#<=Z#GqXQsI(gsC%-yJRxvxjZn`fBWdu`AtXCF=~mT$Tp
zXmp8qtlz7)@XV47g15a)Zw8aS8<tPUlS7FVmQmk*4aB*BjvqQC<Ef&ED9Al5V|?2E
zd%}Ah!)GXagCP6tjPV&wu!{*q)?-XF&U8<o;&7kh#s-{Gf_~mC! -IvQ!c~`qoYhv
z#DNU~XECDn({a<D!od!u# SO1VDepp65P`b%6Gw(_e>$Irx0uaxay}b#?Vs$u*d?Z
z5IdYUka=7>PhlZA5p~gtDzlVW%m6r{&P&DFQz<fyB6xMoNOh6a=^2I+oM9OC(+OXC
zIyldR#1p3*Q%IgnKIx<^V5X(85GRu+*fjtFl}J*bG95}Sh0Ix0a>aKxXM&=n_o?8X
zvA}6g!%<{`-g0E0g?{;Tl!r_q3wK6^anV#|DB|grwwvS1*bZ~r>MY>Q3K*FbvWU;3
zE0WH330h(*ua?0%3#InwTEvR)yDJo{DQ8cm+V;^%&on^QPgh8?*WB4g)%3M_>!w@|
zn^jCP)`Apw l{Qy*+eC4gaQzVt$nEzfv~~+Ojc>N1q2df;zg{hvk;iDESv%#JOM>m
zl*uQ_&d(x)4vVRPByCBBV1s3;jH!)P*6eb;2bN^Fqs&V!TN1d;()^;SRI?W MBBK?
zBD!cQmB EGur+5%n=a4JLW#B6)Widgal%HWTM`--xdpW^r*2Cw-MaFWSLbK zgs)8
zM>}yrwoFoD($9Q3oIFWN8-FP(#IJ#>KsO`kq?ef2*PEPY 8Ns5_RdZA^rY0Gu6do^
zk$7J;hF94N9Ty^VNDRF2KSa7y71+F&Q5+joahk1Q5LEzX$q9>wk`!L<gJBB^5C**z
zjfg5CLjOxcMSD|GjAts2p2yU$bB^tXaq%YiXEwPz92*WgzG<v-Y#YA!-g`gcIHAJv
z>1!)u8!!IE-sm&8UvckKj;`w+2aP|tPycHD#qRQNI<~s++2#24weEHE6Hi6gpV#3u
z9sAtvXwmz(3?u&a{8flQ*8jj207mlv0AQql)olR2lAn?(k2(t0IX1UD3My`WZr87o
z L8GVnf`m+zq-Ov@cawk{OMjtp?m4Y_18E`+y{Sh?-h>A-0ME=C~%+P2>!uwH3G`L
z?iNSEJukZFIWBzO ubnd(mkiX 0P%Ym%HbEbWMw6@3jx0R4K<p*Iw`VmJCy|WsZB^
z?>^`_ %bO#>o_FtaeV0gKf3td_4SVAunfLz3}5Lu!(HJhS@)GseZ=9Za6J0{cE?F(
zh4GcHD;!t3+h6%g*GC)`?p2Nu{<_ lj`Q5@FI?<6!9DCaaaFzPf{!%7MNF|`BCnZv
zx*>!$-+(`CY>UsOiF+ qjNI*==l_=lFu9huju^t|FPWO}o<?_$;=%i$dP;mU3^3>~
zQm{_fD<X7si5`Cut$(1SmA^vh1&!HgyYwtCDyc7;SySY#DJriis;ntmyt3$!G0l-b
z&6zjN<(ih~oHo lt<co`^-H*hHGd83w{8vV^fDzb^M<{W^{Xi=0m(E6dLsGgeEKCA
z!?S$+MI{{jpB>;(0y=a2PeM^kOP$TwUsv0<_4Ga|)Lx JtZJ=dMCt4VZz9*ku~R{Z
zgT?C3ZX9sZ?DUZe+NSh(CgrK8t<1Wa&P>o^7S2aVF(if4q^Q;5t9z1I=GqiXYCcLS
zETif 0IjCAMl5$k6`hp8YvxQySy`skG?#rS6r1o>T(Mi5y%a6Q b+?JyZjH4a*b6;
zt!)O#D2|g%y^5xhR#mb5x=|em(M6=~9m|}0v%YC_xTZTwTzUl-R MJK<?}E8c)WJp
z9=a@>G^%DRF~<=}|2s66RND|(*jg~3GpR*cS)d$V*$1 $XSa+0ZKZQ^flaZ+t>e1S
zcZe+`HhTma(~^} $KS`DEtsj%AS?F=IX=jtA%ZmdrzglEQ0q7vw@`}4`qhl?VU!`7
ze#g;2S*Wv^0i9Z)2UME3))FX{X8mqwYI zLhpeLGX$x1P<8<jR)6LZJAq(f# tZ7M
zxsHF>!d2?{?G|paj(?o11+_sZGIF0U _6<VhlaT1OdfGpatKsz9w9!@)IZDQYSOtD
zXL8w$^Hr99j6+n{A32(zVH6BAgN+$R+G8?W?B!gv*+7pWnsu&tCRejcvwk)88Y`Ek
z-fiXTVQbyOA$VIXRO}DT;IvGxwLj))IFoCwW}wY)h_%OK^lC<<mPc)jblb>emRF$y
z(&mI2Gie;Th#7`5jDs6F8n;m6bM0c~ 8gi1SI75SI9tmc;j||#8n=!=XW?x54s+Vi
zEgH9uzhL1?bo^|*c+)dc 1S`(u`oan+U6{dUT&eba`X-hrO2({LQXn0LlSJ`XwpLM
z;^>zw)LxDruuwnb=<^opC64~ZLeXJ)dQRYQg8J0ToMGkK!cko$<a(G<S`(nY%_yx2
zP`_f7)&!_G7^O7<iVp45<2}Aof8{E|nv;CcQm*Id2Q8FV#?qi!i_!HtK +QFvDF-s
zE9$uZAEv;SD9P5Z&ZlW6=%Ov+cVd5s1$4Khhhwxj`RKuMJnOeg{{`k(%pGEay-jzg
zdc4s+?s$0*alYA{ZvlrFa9GCSc^tmo`46-F=Q%87IVW)VE5_rl$q64l#?ekaJ$lf5
zo#E#=Jj|h vVQ;G{1&H)V- Xq>p)Tk{ xhF$_y?0ssG%WlVKY}hVbHl9_1uS0Pj!O
z 5Nbq{E;afxE&?AaWi7nxGhWs5Oxz7gNV2Rf8`kr<)V#XZw7;i_z3=j_><BJA 0Rr
z8U7S!!h9Bg+o737^HoCQVd=cbOpuj}Rz7zDq+Du9{RuE5IhdD#Im{SU-A>4%K1#{b
z-|hh!Fetl0{niEoGmrjm4<Sg-L^jml;vpKTp>ZBXZO=3kf(Hx8;6q<Fus?L7m>yai
zb{O=3t#?Q``$w<YOqDdWJ;#}{i0CM?7ch0;4ufjWPE!LErMwx9o`2K&io _C2M*be
zd-TK{hiO40zicy(0;|d_-Xm#J__gcP%P7*xVN~LmCrgOwN6+TTI~~ShI}_lC8B3Zv
z4BFSreRSJd40NXL$Q^3zs`8_K!zaCk_~;ZXd H^|rBS|N<<E|hZ;(eQ->?hQI=_ZY
zO6RuDZcAOs3g_Lh$u5M_nc9WD6l9ZJ?r&!)J_go7X)#F86(cp&`Y0N*DwQ|)vFk&2
z%YAf<do!zQS*`zp8YFM}TdmuYHGw|-6|lEUmJj+UZ?VfFOMD8pRk9|wGfu+v<JhD8
zP?c=mxT%3K+e9mJD-7}ZGWd*eeZl$gd>xnsLMdHh=%uw1x3gP4?N5Q(o}sbZ`BJ1)
z-()?yPAxmzdn8?_t;nXz?ggLRM}K{cuuuv9V<Umj$9v1xuU}6*j!T0Re7NGdhI#;L
z4cS8i$a?6DXrNgi1n#&r@@s8nEr&rv_H!8J_$A5K!+dIeKv{fp^=2A>;BV6SYu4q^
z0LXe2AOHGR;4E2L1RVVh#E)>DPS~ tKPwt4*9piuPG`BCEQA*+s_o>Kn?&h4-HxoP
zPA8y|cCN1_%UL?-$|7Dg^E#~k(4I^rq7aH4(=-xuDyar%Q{Jn6Rq>&6QLD~nrhS!C
z{#KtrBaJE-M2vg%m;4B=d}IDN3fPD3Tp~3jeQYG+t?08WqmSLr#JL&;QnHTIZ{Qdk
z-NrX!vzVpf6X26O2Y4$Q?#^g9K}p#fhu MlCa^qz8}aRu<%6n!%M;#Imhx~qb)Dtm
zx#d?aw|+f&oz)5^qN%MR?BAeSU-Bk2lz%x2r0hJgCuq;K>f-n#wGaIM9{Z3!4PbCg
zd))-BfM{AlQ;7+rH4-I&*`C2 ofRKyO=aMu#x=@MkM>m`;(xEsH-Ui{6Lr#OqLxeY
z?g7nVrXhKB|06zN3B6>$k?8>xAJX{+D6Ec~OLF{7PG@@$pnD`Ac&Z+$M~lb_pM-`b
zXyVe&$Ek~-f`;ltm4dSW4$w%ZT!e8zNGn1lpj^4_lyLN%0-6qlZ$@(=XndLmp_(a|
z;B`ZJg06R^Gs$`ddf=pK)?>FJwGgd^BGjW*rW8hk7t*pAAxg{ECCGj}``{3_Jj|V;
z$<(sKkcP)^O+nUcB9GD<`Y^^x%O9t9HbX=2n`zjwTHePU)O=`uDBm7NbS_!sLGTG=
zXb5#XFvl`9p+v=^s)b9cGdgEVs-#m%&w!58B{%(}>mrkDg7;H<NvZeDeY8LC1{!KX
zR<0bP*1i#(M)gHBgw1`lKCM72Kg>-hNbA$8twAR{$36NTtqV!&9nCsCqe<UxeG(ac
zw1nJ{-Ye<Qv3jrU%}r#8)*NW1L9IE^-EO&UmB?t#fmRySngi9G{fU5v-t5&o{vyPH
z821bVMQ`LZgK!wRZwW+dvrne?YegzDqNa6SWXdkoSB}fhUx#6lnk;DKcaO^!K8P$i
znChj_AP2Lk2_R#529oiXw<JAalYXmB`YfAt+9%1CzE1n<Taw;jlYX~NI*o cOW9{p
z<=Z5Eu}yl)CjE8POs 39=)~TRveVu~4(Elm&z6I!e%U7dkWG5)q%7~ZNx#u1eTL2Q
z1yC=y>>ZPm-eQyffK7U}O?tp4JuxZiw33r!=Y{v#q QP#et}JT|D>efV3R%reO-<|
z)py&ZKVg%;eNxh|u}Od3R`wk>>2wDeYskIL4U>|--6q{>D?6QO$g#$v-8SjNlaju{
zCVj81?0%c{4L0d_PD*;hCjEJv^tes>jW+4KCMBKz!*q^S7f!WV{#KjxM{UyYpOo}|
zoAj4$WxvKI{T`e2-IJ2;vq|4!lRniZ{WV)pyJu3;qc-W^wn=ZXNvByn*B7_Akx5B!
zwMl=%CcVKXy~8H`;H0Ei+N4Kq(qFQTagW<9e`r$DJ8aT_V3WSVR`zYSvOhB^>2aI%
z=WNoWHt9QT(hpBcI^A2y{=>7%Yi!b;Ht8?fEI&Fa=_#A^mu%8gHtDx!%HGk9TV>%F
zmT$DDI&fbvz7J&a;dXIMYY2YhpSSXsl$n`N#7Eh1{tO6^Ry8Pw4m9i0v-b^J!*Qzz
zM9MVPqlha$F!;DfzfJrD%T;}!u8ZUAyl|EtFOE-hKHZI}$~D1S!T9=mOK%EOHD_(Z
zh39EIYfSYXZB>m~)M4}ISGBjiCFzGyC|NGedEtZFVj5HJvq>-07R$UL3T#P`d*NM=
zcOqH=p&)PihUm7Hz06j2T2IK)aM3DT+1-<pK58rb^R}`lY|=kzD|^YLq|dUIy}?%Y
zXKd2HWGnm3NlBk+lkT kKV*}>%O>4BDe14<EI-vI{Z5;7I#SJ^z%8zPQqpJG%D&Vl
z{h&?y4x9AKNlAakR`w sUPmiBTvA>c2->`E uZ}e*vejQEBlB|I-NJmwY+aq(&?CG
zPPrDoWGj2WP5OhjvIiz5{W+WTZ`-7=vq_KIqz5M {jg2?4{Xv~ZPMwQ7Pc7s{JKd=
zKW3BuvQ7GSoAjq_(px7b{Z*TEr_JkzZPI^hlio2Y>B8poGi=g#*`&|1`Fvth(w#Qx
zvux7uw F`Qlioim=`Y(X|GKT-Z?H-Kna%RsCncTEdgEW#3h;9_=^ZxdxOrLUVxPZZ
zQqq55lfKs`Jz$f*JR Dt)qNQnJy*|~Be90VT0=+}|JY_k6VdQ4`F~`tPW+`+-(;@-
zfG+9r=d{&JGkoA|;~qU%{|A<<`Y?1*<#LbHCi8x=utm3><Cp7vuWoUM{(q<zJH0Ek
z1$;864RPg7_TjyMWZ6kG+7&touT#51cIOE3M-e;Z4ByN9r2m2(UJxT-4Drw-BZ`OT
zr$ocnP?-Nq<ah{D7 Ae>V(&HO$uzo XeQE;5j5(4Ga=Oan3r>%gj{!n0o9k{a~3c`
zeg{#Q#lU<!hh`-(st?zELcq|2jWg!c4a_j_qbWW+nZ}Yu^U&uqoar=OJQNW= K8D<
zB0dKiy)&!$e2w^&(Errdvgr1&2Qz#q*Na3Wyje6<M3QXfqCKL;z*w>>h#+G_#KpzH
zxN|VH+FFSe5}@>H2gb59<?09Kz8rl%1dJt1m2{gt#m%+DpTAV=NZP6&MXqR$tbYT>
zmxCDrh8|0wr+~ zsNWM!j>S9>tNSQbiW7m+s|N}*4;U{pDh&}4bdq~r4yMtDp}Q{i
z$}RaJzD9~WxahGg-$g8QFxLa4-<Os24+EoTl?wBDV06!~F#9AQUl!*>!02&V(ToD~
zJfdU*g?X8B<yfNteyZnDs_oD%UGxwsF#MU(8**CismQe>hx2 3)a*jnpdXmrx ZID
zb+mU&pUuF~LxIxpdPMcCQeo}}W*7dfT7D3a9={aLkAX=r4~2Oim~|PQmDh!Bei#)r
zda9BlBL0Y6dc074sFT+7RfQ=AW;^ICeNF|YH6x4oQ~={eNI6ul#lRfO$>j$|zc(qG
zD}m|A$ M;9toB9cKyV96yIS|tc20w)6}c>Z?f~Yw96Nsw7<#OdehnBu#9DRnLtuP4
z?ftjF<XYpegaKzuRv|X$^}J4%;uK(pGuF^o=<UkMbrxu%IntK^qxYK>pOwIn vOG9
z9+)5G<mv?GnjFmgfO$O!GYHJgoO0a-OnHtq?gxg-WXXCA7(HVIJ3QY3rZvL{-wdYD
z_zJc1Pjx{)MmO4_d1cx8MdpmEmoyltxle#8sd#vffhLusvw =%dM!oKlmc@wV^zv^
z1~Ao`Tp_x93?BjBl|w x^?Jgh;g1Jz&!Jffnq8T45$CnQyp+jBm?$viIW*S-b3+a$
z4b0x0Tz3OQ-Hm0{F9Va?iyn|P+5OlLfT1DY%JmCi^gb-?tUi(~)XG0uo}Oc%sYXbU
z!gw$lS(>BIIl%0eW!E(41Cz+HMlCRlbIP?An0OAKtAVM^ku?BJNhX)Rq;OA;teZhY
zb*?-C5pfSNdd*YmOyB7s8t!}HQFNUm$+BARw?IP=<xshP3QQc3)hho4%*#1C>!UH2
zRZr%_G8X1sU>?ZHwHO$^qNrpw0z)w?*Ct>pGi67TxE2_CESlSanVR8@>n-JHs{1pR
z52=rWi(@$!`vP(u&d?CYuK;snh7V!B2TTV-Rd)Uex41JW*AdXn$jOzDX>}`dQAy|z
z7rX&emP4})m|#x1E&)cbx2RlkU~<Q}n}DGnz~cNFV7BM<evblkYmTg^fpO+weh<uH
z S&EVWW5edZrhoPLr;2DU(uWej5nk65<nGE`UD#OHyz#R+^fMvUmNY>WMFwiswQn~
zquZSsiqj>-9B-%Z32Fd!sH5l!b(F<~a_&`D*P2QhDnZ?)tgq9iJ6+Lvj=u>R_uT4h
zUFA_i9D2reE_B1O2-z>+#ci$=-mnYCU74G1CoExh*;Q%zcy*0Xhp2075L0H%u|QU_
z$J=w9xpR$AmZQ^=>SL);F#F<DvV?}Cbfs;GenWBk+z=Tlo{ViAhYxk&N^?xqwq}3E
zo-T5wFOr24`~e}l*=8JqErVOQ eQ98Dg{@tGmgJa9}3}OHu?WILm}J+Lo2y4>!zMi
zXa%mQ57zM&K+vzgcTG?CmSks&z7A90UE7yT;z}TygS4j<eDWvO)sx%`I1%eyfJ;O1
zRnQc^I)j_pVbQQG^A=P+U9DQNXnxh=#gsJ}OW=E+p^d%m;m$aH4<WP?A0)sh|6=|4
zYMJ~B6k*2Sj3XB=%BUETJ_z3$iuCks>Le$|eMELVlIgBad5=*JJH9==msH8{A`LY|
z%yZNsU80Eg ZG{8dAXU8Wzjd-=cH3rN~TR~*R<5Ht_ua5>(= k@ww23##;Ry+|bIH
zz6d^;?1{vBd+Sl(@QJoX)%1(&k-B5?1 l8;2%;tm4NyGQ>@eGa#O#YeabLc?+n8 5
zmL<a7$1(aCXh$qb&Z!8r6Evmb4KQ0 Vg+s_rF*93Wk<x8uIt5J#i$r5W!%+Ca)uO=
z?m3aNT8<jeL+z22Iz-%nkG-zK$A 5P+;$Y|X(ti5r5tsGo1&zo?8}+QlhILWe4|g&
zb<qV<p<aC%6|TEZ_CkN9E%`j&x-<GW$5Ly%)y>?|j341LCi?sqRRQ-t^=KwFP)^_a
z3^Pbhofao;;I7_{YDBVV)clWInf>-)@}0~L)1eTS)UvpSj_)LOYy7fM+G6Mu64?gh
zYm 0_<na~KB~NbSrH_^3E0MLziEIUAK@;dnXcEhA!V^!~&%)R}y*XBvHKj&(rYB4C
z=g+!gHNAA(6 7F{vs;mj#Tq)>==*09m35mnGk`nt$DP)8<3dR)k(46;r;%))<f9>U
zSL#MGOI3(&>7*;i(BtS_Xh)Hr?#;4^iqHhSk8kvh3F!JP)|osb(<-zKtNpfg(Dx ~
z^PTw4Z!Qb&6;mHPjajZ3z 7hb@<r9UbtQy0#^lh6Zkl?M><?&@*Jc+u=kjb+FkKLz
zxfvU7%$H0nztjAsZLJb;4+Ke8N2og0oX(RQMI_ Z>SpgK?why#fOzQ-bZLK!WciyE
z&2<gh6mE}GEpcN1$t}AY_O0TLt0ZcBXxUv_9auGv>zCPyq-0+DK-Uf*oyebf<;r5w
z+0z!HYnwHOU${c!%b+JE>RaeE8K8bDx9Py-Irh1vFP7XIj3wn)o4X 1>BZ6=$h4|u
zOSNHNl#TA4XG^nm$pAQeL0e!4`U*(Qs$9j1d+-TH4_=B8q2qU%<6AP_r=Ml oUSUn
z(^lPSD$5T-*>eu7H_x;`exCq;9)UJTB5 4&^s$#-d=`Q2aC}vBJAqKx>bQ?<nsLoe
zONJBC|9i<u9&dZDE9#Tpw2dq8P2k%kWHMQ6vG#CZ98H}EX+=S)xPaceJ)X-dKk1<z
zt5bdxAbaq`w?1*<U#OivJY Bcyh_h3;DF<XJcvBra5_;3p~&sRrEj69tqmvW(^fo-
zqcV<fKjXWooHEliSzW2m3Lk%-l9{sc^p7+Atr4H+uUVb8RNYoq*`FVOoX~ FW@1m3
tW_{rxYcgQ<z}%A2Lr*X>d-JY9ep3s^l!J9D(*b9ui+aG<lSO+?{6CJj<B0$O

literal 0
HcmV?d00001

diff --git a/images/bin-x86_64-dynamic b/images/bin-x86_64-dynamic
new file mode 100755
index 0000000000000000000000000000000000000000..033ac759b0b3667af0c5dd5bdb79516806bf4127
GIT binary patch
literal 6484
zcmds5U2Ggz6+S!TpG_LaP8w4;F=Qn+l7s50V;r+74I2MuTsD7>QyDeN?0R=?Z&>eI
zyR(&3f *1#ip99yN=QiX&^+{^5>GsUkXnftBkVkY0tgyNRYHk{>5p&(jV#n=Ip wj
zyEEerg$G_Z_RP8GyXV|<?%g}*{yaYv9#(ulU{c^qKvGH71!TVg{M&^nu Lw{htI%1
zXh5VMA6?WCw b{g$)=h6rJjnsj>?Jz6x}XJ-fm04oFgPo{;H(QqRsbEKuF910zxJ`
zs%n$<Z4D8DGruDpY)Z~{6dsxA(oUCl%u7<AIroqHMo+u!U%R5CM6yl{2F1I|#aJMA
zYR!sMc}{k6u3i_K%!5J#V9s`@(N2aaHU2&0I3G_XCwhAxPsKY^$#j0Mb1u}|+1sP#
zGFrEYzXhA2E*?8^Ry4 tu^T1wy$2uqEvf$2_s*yPQvdZQUJ4%lU99Qt)9UKRBH8kT
z#s8SdCQw6rFJk0-3z_EBOeSsStZ3FUO~7u&s29CpnpBn*Gtp!kj)h112h47*TRSY8
zp+5QWkNQdvQGRc78% r~Y!PlWMns9mm||nvka!~k ~0M6M&W(``ZHKuf0tfAL>r^<
zGyih= P)bnln<ov-MnAN63NqK^Vi$ua{15)BgJ2xH;V5Vg*zLk#zt1I&DZH*tSprT
zTe*a6eFYW&Q7VxSW1)T<Heg)2W+~+x!bQnRXN}_88B&}-+JbtJ|MHK!8X{mUv~DM}
z&JGfmHdSMBylfo#L+(KH{&@<<DE!oC6kFF+40g|Nh1Nprn<$}D_MM;CFJsY1?w+~6
zJUKb3HSfPnW^mRh9Q~s&fDIJati64&6L$Q{Evxw_A p>;ul(o9=KX^J*OyBr{4f2T
ztR417F%`TSF2;kmjm6F!HWXewkRpcodbnr>H^RkB!A+xhE{MH-KNLQ=)>r&^q<GI*
z`dA$)zPVnwUoIP0KCs#k-J<ag7ylV9-Wx3bt*^Z2Eu*mPGmgBMeb-nx7sR1U1zW-k
z nBmROM&o$73>HvTnct!w?Y&fQDyvapx1Fm8imcW_2}!AHbg&+!h3!k_XU+I ^|Hk
z*uTyC^ArpH>NIDZvjgRQ>KB7JHX;w=&#7bCk9-_?8}eD?MD%?T`JNjE-&~7t-;PE<
z<r=~%H@<-`ob!?J9(-Oy-06{gh4HzHco8|A{#N}94dzaLxX}2L }jy}M_`pO1VM~=
zWyaYze>Xd1#ki`AQWMKEk9~N*oFOQp==iSY@>NAAQRG_U^NNmd0A6-NLIQY5@;1p^
zC1*zCNp!O A~=r$>+^Wh_e%7L%|Ms&GTtF&&Xa79NkI_HIGmzCeyNY+BxIk|+mJHI
zdI|r}8Lv-XM=v<zI5sfwM4$sx_rXAq)}wU=y1TlLbRF*M4Rnkq;sGOS*?4EqLCo;~
z 5);4;*1rY04--_Z9dJVWZFt(XF*G6tc2FrKhkMMr=&EM&TA9-Brc%IIA|nIM|0Dl
z#V 9@J)2uuyXM(MHkZt#U4n^q*+eQz2C_7pvOr6wllZn0bNHS_0qZjHs1*e*F>Ov}
zqcaI}I*zt1fflne*&I5w* YNZVw=&KWDFf<uo--5qHVjKi5zOjGBY!YwB?;9|Fygi
zEojd3_XdiN5|RXXA7_KME|-aa79Zyt%KIeVKLtq1L7sF4hp^6R|D>V|?I)#w%70Gs
z+7DvoJ^WTV{)nO LU~HC%09H-7IFXUrV}VqZesg+MMsJ9m|$SoOyoBjC${H2 -$+U
zyV!nJ(NO|el|V>H)fctlr1L0H?qT~%zL5!$_ANvlKkG67D%MdhW0~`rU)l%A7>U|(
z#xFp8J%<mCDcf`Y?2z`{PxkNa|7DN8uIh*Y=4HXaX-{j6*ZxJsC $_NuRr4+d%HDx
z_Fw yt%*+iS?Pb)(|<PM`NQkpw>|bHX<w4|tJJuI*p8v^V!`Quyj~Yo<8r`uvZCbd
zpW&-mAbTGFX=y(#?Y;hZ{Mi0Ak3F9^_#6^sMajMXf8?>hD*a!T{=FH->;Iaxm&1kU
zv<M>A^V%oHzk<5df3~L`D^Z7>5T9iKOVoARhopT-+I!>m%D+K-Qf2?V{_4`6&xca1
z%wLY{EsuXbZ`^3a3M8*TmYM$vb)50 {^zE&4^SfxVmsz^N^#n6Hb#W rnL9|-d=eF
zwW%%cKlp9?kEA{KQ#2}dxlH^+e8|6-*nX#{(j&qyG_3e`G_qZ8*zP+pDthfn=5NQT
z`VDFrX<g3aPh(lbhsTZc61l16e^zcV`F;V_1bO{4UW=;~t)g$KQZZs)C!LilM#Af#
z8?USEyWMzwWxwsl8*u&6oscN2w9=}za6j<6;WScV8}NGI#<y4Y-ERCL;QZ~zcL3*Q
zH{MjauX5u%f%B*vZwAhfZoCEWU34cT$|}w-&S%a_6>lOqPr31jG4Dj2kSMEoYU8}(
ztW=>D 0V)nf2wlt;MRYna=vlnZNT5H8-ElhY_0a`HpNZ$chCfHcz$2{4C>%+*{yA#
zL47sG;d7|ygRSF0`xsx1aTr2efhM ^@k>`IKB&e|@ey6Xhj72_7k`g)h*LYK>U1ns
z=|S;dMiq)b;2Hmy1-=Vf8uV%-Sb9a^TYtyzBTjw;p82zcc&%|0>y5JYcf5o8pzOx`
z%LtV!MES86?#BV~DO=~yF2n=4Yx2&AcEopMobz&gIOjbkao)GE<IjtBSgP{=2jEYO
zcD8<Z=LBB0=hD{ -v!n0k=K=PBHmIX{_l{!(hRenaeh_c4+C9pIq3(8Q-A6DjEMGm
zL`$OmyXB7>BSPlaFC^aL`Cfkg0R7*~_UT Z2t`3}3%o`ii$zl@$5kc7vR2N@;|*90
zZz>1IPL7)4kuzg>gK3(BF6pTOM^!vyPNgyv(Ud8UduB902Y8g5O(m>ET<h%)9R{i}
zlkqu{z5w=#F`l29xyXKoP7De+!=ru2hfJ2p4VSB4#Mx4KnMkJTlGwycVvP7$_+)=y
z*gQErd}e6O9P8^34^iZFcr~NhZ1kd;NXOlPxS<7e GB?!j*kogoki`-SyU4@wXs~@
z6er#a?7G=CpL*6DO-v<ocqAW4MRU1C4y3;KrdQXUSH0%QNo+BmOq=;!f`W3nj^{Gw
kbTl1LC9p<}JdZ*pC~+h=O*}VqWTJBkahw)6%cA4(FRYdo0{{R3

literal 0
HcmV?d00001

diff --git a/images/lib-i586.so b/images/lib-i586.so
new file mode 100755
index 0000000000000000000000000000000000000000..e82023a166c5a428ab399dbf7e9fc0d80cb15d3b
GIT binary patch
literal 3834
zcmc&%U2IfE6rODtsQi?Q }o9!qtz6Zo23>gB*wN&TS^K TNJ2px!v7%SNEsxy;~My
z0?kztvTlOZcOQ7s2#L|gpd_Yb8<d2H1~K6Q6B2<eT2T_z#t_!;yR%boOG)&}vpIXt
znRDixGc#vq?i_0AX!UqJLP5DG7nF{b2~iK4nJYE*!Y90<Ry-z_IeKMJdZ}FE912y!
z(K~IApdC2Lb~trhK Znr0(~Z+BaT8QQtt(Bzix#<?gOPqSI3TdGG;|ce9V5-R{+2I
z %Y<;mhUGnzqPaa%iQhCpTGOH63x?qeHHk?Jg)>$%GD)#Hw>Qw|2pu}qq4C|+%C3*
zz2K5xnIU7CViN}nSc0sUfsQb7z!I Q2wm@wClk7987WKGg&s{rEur^;Ko!gwWQ|z#
zU|8sz2ldWyf7G<XsX)vy&9EtA(cYkDCbhLf4~GoPK%ZXIl-|&k2#L0i_U3?Ir>)jr
zlu<eFo u|Ap<tc_^U3H#v oP73RoA;<w=ZjF6Q7<QjBMW6yq2Jorm^sNg?kzdflF=
zD7=I&g#!PchVpz~6hG(66i?6>p?G2;{v%{>UM&JnFoOuyH^(8uPnSL6r3=wBl&@YQ
zM0WTN6z^WN<`ljLv$N-X{ 4`2{?)F+DOeBXZ#^u8JyCV|%nJ5Szm~P{vg4>#nX~=i
zj(Tef?}6s*TK*5$;D6=#*~zlpKrw4$AY%Qw!N=`U&rwGxeqhr=Y4+bZXVbCA9;@ov
zyC<Lff>D nK?5_CPdeef+2I$^3+XP+4o^yMLC$6y;ukO4W8R)U`D}HK9E8mO7ifp_
z8XV+oANbtB-E8Asd$MRPv~PKf<Jr03({~saBcCxxlbFH6oqNUNF3b#bf`g))lIMD2
zMFiKJE5O=Z1j?HH{a!IS0-k#*10(JuF2H<X9EfUl>IA0ZG^UAV%~j)!A!V ~*nmdz
zD?qVk!Usf1r-qPPauR-#R+2gV26_X`UnLn${~360C>TV{BTT9-5ZK_WZQHtIrLP`^
zU+1gy``4{rU03g`?F %}n+!{~ud1(GIlFa(f1Uq+>-zt}`oVc?=7G3n^a{<iQj$g#
z*Plph5yOlKEp#9OGfAzK(5M*<r_5+FF-_2+ONC>!m&`!S5}I=uX;wG`-Z_%Aa76D*
z8S${tf>ttR!m%W81mS=ukmDtlbRrt Xb@47=#4+kaf#yzeUtHcIAN)U`xo>H*!+Py
z;qtOZiS<Cr1fDL$XMn6zwzGDL$AGL^)*NkEv#Wq?qaACV$QoBbTf!P3>y>t_RU+$J
z#U&*+16kkXS>r?>cz0ZgVmlBAtkZ{kgy<{DAWnW2pu2&}j(dv8yg{6Hj)QhVAVN8N
zm3x`UeW-wTguOszw+}W%zoU_Vv?E4=%8qwGv4#yLU=D;NP}%Y9Aga5PdKEWavV$8j
z4jZD<x$O>>?4WkO6)u6{_!Ou<N6^5yw7Y`6f8_yoIhWlv*j<C2@&VNpf81rqv$601
zyANT<^N?|!?-ekkB^ku=$9z8ms{D9oo<vZdvkI64 f1+m@hm-!Mvy5`cD!8ZmvJw^
z-~tr0&C40+=}!UeZYTj%>3BBNmx9l5*pDdzRN0Yo% pjzCE!Cx-h9sinICI`HR|?v
zc##kXl sV(ETri$QWE8trrfJ+DlbLmo|LkTz`ZABMwfd`%Dl1UUXn6bO70mc&vRt;
z9adhNLGA&m=O|>YOPM#GtZ6CpM3J>CWx1mKrj;@V4PZSI%7y&QWZg-5u|rv3QkJ_&
z-CgC*jVZseq E{?ykn&-J97P{?5-5XTk6a+_bQ<bH#XN<ffwJY+?y(24{m&}p~}~T
zd>bIEd_7{ZXo1XloM{g#vkP<_GM9jIFX*T%UIubwsSsw1{|@w*OXFw!_aXBvAb7At
zxWC--KY JM<?k#FOTh7b1D^Ya;3>OZ`~g(Wucxd^`~>-`idR-C{)D_=`74_*Dlrf>
z|LniKR9i3;KH#%6<PDH{#u514-UwN(2j2l5klpWs?KAW{ArsU)!h)>ok?#T#G-5H=
zQ$Pe$mT9H?`m`Xv=>y%{I`xkBu5P{%^o`S`&4DQu?_xa~%4loWt jIDvIDWO6%Ijc
zXh6SEQtyu?dySaxT-v&k&Iso+*F))e{D6wnvUQ^qrnR$aON*`~hEe=Kj+~DG#}Qs4
zOtr0JTXR!~zOA*jtEF4-ZffpmVag#hsYi ND28W@%wPG6u5DPW^ lBeAgEiBbmC2|
pHzV|oyS6rMX%E17`s-+xCy;t8&3N}ry %XysK!S3b4b3m{syTyoD%>5

literal 0
HcmV?d00001

diff --git a/images/lib-sparc.so b/images/lib-sparc.so
new file mode 100755
index 0000000000000000000000000000000000000000..7feec75eb2222139e80c33095d8061bdedc6546b
GIT binary patch
literal 4536
zcmdT{U2IfE6rQ{7Z3`5vfPhNkN*YrlTo)(=i3ztXOKB-Bl#-w^xxMW!?VA0;-CJyl
zk>y7pG{(gE<WJlfjq$;T2Tc48n~LItMiMdM0h98hA+d=Ng8 Uje&5`g?QJ0j9(?d@
z&YttlIdf*_%+H-U80*+#gbY!kDls2A3aSc_%|g_jldxHYg(;fE{bG C$A5*)vqF&J
z;fKOMu%TEOI}l?J?6t}sg8d5YJ_}KTja&n+R(u9hb0c)Jw8gz&cS64%1?w+_Lse_%
zZqfeYo96k!o;gDs)7cB(+>A9}o&1|NF#XwM^CJ<jQ<!r0^RHk0eB$R=bm^XF&(6F0
z>Sy!*`000)--fD|vJk;$NuyD7OktHrS&HOIdej#}V_BDF%Y4Jr!l;c<Z4l+F5N*Is
z0lZ dZa~Y-3nz{3V{Xin!gGY<45YIeC-1pA&vAs4%p^VG?1g}-f7qq!rjiE|!fD^{
zbSDOqc`uQRrrdl!kr%0CU%!>lTI+<9h`XMPI(_-P9}PvBxM=NY+Z1(HTdS-!Y_mck
z<TUsbVk2zmD>|8cC=Y 87cMc@zy$smNomv^SNgaxYCcu^W$0h}I&xvul$5>#`bl3m
z&p|(}^a<!(H;j1+`gh0?*8<wA`5sG1>s+%+udRpAeZEia5|m5*(AVR2qgAEF?_4}l
zd`t-YV7YvA)Vz3<3+He{?~*aIWE6_MB2*C72Fh$<U-6~brQ`_Zp;O~^hc3(LxBTfg
zB7>razB8F^vpv=RHMC!iw(G~y_85B2_UGH;5!I)rN}p_Ds<JTp^}}iSD_s5Cl-_V*
zN^ks F{^EHG+bKn!TMt8{pu6tLeZYT!4`85H-wGDqSqK}w8fF8-q2We$#}P9%l@(s
z{bqNSZ_tOnV=FN3AIIxB9*nJa=D0NG_yT^WF4uC#_&*snFL3;I9M2e5k<7m>W~s3)
z4UAvTiSA>d4Ot$HAF$oh{ u^d`8fKwP|i>F#+!xW!E(qJbw%jx3*{J2F_zEoD&J&3
z{;mBx$q&}$b23g~os~fdEwrSrh_2j^T=P6T=JL$QmM5=4zYaFB3UTK1Y&0;7Vm3Gp
zo&)9{uEIW|9oZMyD}sBd7Q7fHjEs7y0LgRoZ7|QJ`fRy8iSk}Z_RE000^AOH1DL*d
zM*L>{M}##LiJU0^$pk v0=nGK#G*AC-4JfV=VW=f*=n{T;nk7I<B{goYr;+4iFkOc
z>-ps?S1td4I$QaXwCDB-EAQoeIjFTv)=O9enIWrhD4B|{OvZ&ogKmCMSn-hzYWmX4
z`Ih~OTt1o2Oal&VxkSok1*PpvdBTz(CCf_;LzkZ>D>3No&AI7>u=>4hE|1W c%~mA
z_$6W-E0>jRy6I#;+R36ezD}r;O{WtX?=F|fgYf4X=9)gEn0rGL*EPw)di KMe%veM
zW-yN*68*^Q!Q3zK;~tXx=$Nw6mp<G}Hkg=x*i&-faj$8TOAlbH+BfhEwfijZVY*$E
z%RcRfANCpbP_NG-49xZzi;@%vQ>S0SXK r*$D<ABgUEoDANRK0-`w-`TcB+88wN8z
z&J5m%<eg{-uqMVJy#UsJ1^9tOwwR)@QjbC^KeNR137F MCLQl(6wnXjFfniB${6XZ
z{oa61Kb&2-llphn;F+WS-U|4Q!w)>|Y|?)31^n=3H^G&*pjPw`1AY_m16OQ8zvBSN
zo$MdZH+jaDfOUJ6?C)1#H4ff0<y~_H$~4iB%sUqSaNp)xEzj!?U`;yi7z!8{dEq %
z-ZhCeX}?n_U_3?A 4QBk+IBB=y@sIH $5eh)};L?F=v|UPokO)#I?oou-yhQ>j&aB
zpxj`tH0gL62PM}6D{G(Y3afVIo}^vHmwS&ujhXvQ8u2|Og?jl9JLd_+eIqf?4QjF;
z>?(h9573`upuHgf{qHGMv!pQ336Na7^skptu2UHw-)E3vj#I!sj}rJY1 JwTz!Ma}
z%p36)3SiC&@U(XcG1i5&a~}iCIi>$XiPax4 4`BVNRE7$)FVFjku<P>4*-uV%>Ln?
z?)MKB*}t`DsYpAL&-=tS)t&)6+j|OF&bz{cn1%w%wf_;|VgSE}d=Y9ps`;e)S48`A
zd !(oAM5-AGrwQV=pWX%X)}WA-!H&LK#k?vAy)Axbv}&{^I<GRJehwZ#QYl%17D&)
zF!EtoI^W8FE9`Q96y8Z+Qds^Qy;9&WEEU5;e ayG&ck{!4(R#v--*Ucz!BONer1OJ
zb=pYF<i9bB`Dmmn-;Mn_FYgWQ-D~yZjTi0d>UKKXcJ=VZ=xm;b+M weJnIakvVCsK
zk>6*>9U2z+`tD05yhPkuyKc>TL4%Ww4+AwvM8BI#IgWF?dh&bk#D~)95#KFXp!yW+
z+$_7arMqQ&%+ZKl()v_nd2#T2G_%nu6CSu6acf7{rj`z;Ys;2hu^y+VWm89tBai2^
z&Y+u#r|>%V)1aE!(cKk|ZQk7-LzX(XwY0`6bv8fQ*|NPY3jgWv?%O=B^(%bFi NgC
P4!+K9JNVG{U-AC{m?pQ;

literal 0
HcmV?d00001

diff --git a/images/lib-win32.dll b/images/lib-win32.dll
new file mode 100755
index 0000000000000000000000000000000000000000..e1a2d2e6d30ec35ae4ada8fe0473ed603ca99e2f
GIT binary patch
literal 16402
zcmeHO4R9RQeSdFvWv$W4oGsfp;3nr-1RBsuI(^tAq&{pZV8_ -wh3SE>U6h~4xjGS
zyFFv5J5enQEQC9DholVc1UyUwZON2|wB;k25!e$$noM0!n{;S01F6XvOj}Q<!_bhR
z{{HXdcK1#)AEBvf{GWUK-uu7*`+vRvd;50x-SxK|WF}+GLYkRj>?z~~NpU^<Wem*=
zKJm-~_Raa<U-1;*`27{zhO?#EXt6L<OpV0SseHcR#RlA1v7C=(^Rb ITVo@Ij2mxk
zyr5aJ-qOq1M!tY;ni$! KE>E2oUxbLycG HSS^%V078SY=_qnaF(fKc8F<ngT||zI
zu`{wV_DL 65*>(^I*43lTNvvmbU$O46N9;6RFKTo`hoFr&)w~z_jTla(u)kC6o7uV
zr9YlYc`4v*!pD$cv#cOjkYsJs uDOYer-bo(OsY^WDdGye4tdK+BUi*=~4 0EIA!_
zB|qUK_)74LglPr8tfUh@>{oO&W&x1;xw%4G`4T=A{K)PAfNpJTr$odk8$%*H79oWo
zYP7arB`{^W9z-I##Z(Cb=sLOtV*fm34<nHymm-A#be*dN=DQRNPaqM$j|)`b0=n*Y
zQ6DC{X(XbHA%y^Rt2zW`jIPI#i0+eA2|}CEx>|UcJxBarMj|>fh{!7tCG7tSY d8}
z{EcN(z4o!5W;>c>QREgwK4~?d`g 3d@yLO{A;|~6bs1%6rGJR%$KT=~n?7>zz&A0Q
z1^w3XH>{~8#B<_=*L|3T9JuM{SG{z{vID!=lsPf&*)zu_!T4$Gs+V 1o?P5~Y8`kT
ztD|1T=9ndXa;gj1 uSwQJC6ALZ-jv8)Q-sb+uU0{)f=6>t=XD{H86^dcnO{ze<L#S
zFO%OXFE}jJnD(4g>6w|C1MXXsXKwxN9nVKdz!>D5`WC1srXL|P 7iO)F!l&(eCkPR
z&7&0($VW6 0V$r6GClbn?~&7AYkxDq`&0pq?Qb4qG=EOtdoT#XpY~xZ2JcLJpCLQj
zAZ-VFOg<0CO`H%bve!g18_`6*xmF0X(P2J1P~Vy3FT&;Cr)Ye390>?`x*2`8|Nehd
zHu-94>C_F 6d!-i=6j(_RN{-T`(2bi3_Pdc2=5{>G^ia|Yds>cYpsdt@@qOQKrj8@
z)z-wK<L}IPEfa5gO$V0$HPr_X&NN|6$N!y|--M>oMKJA|U(C#mAC1E8M=<{FCr%ra
z&mUOJry>*7W8%f~naLlVepbiN;aC#-PreFOtQ|)N5AHZtM;JJOogRms+n=H$jK&y}
z*)x~k*UzGqkEwjW%J->!kIHi 9~C*62q6ExHuMf+qY}S6UV9XEVh%vm%tWCl5mPy)
z%Ch%I 0$FG>;KX7__?KVE;}%kzTGLsGr1gdHtcfx+ WmAbBpV8sZz-mdxdjL<MY~l
z*d7pjZ!o=li`+|V{#4fqanf=}Hs6sDfubqS=O1+sB>Q~}-a;97MLc!*xaBFvaL1ez
z?nm2Wf%a!megWwO(vOf%B58Q9v^Vf;UGMrrrkr!HOXV{;_ZsL$xGlv(`kG9p=$5c9
zH8aP-qE*PdyR#m9fH`ilm hEaW(*GI%B5k())<3D*JZ3|jHEz_rw>5COke2j+tj<!
z59h_eSErHEu5{7+e;)AI$<VW4W80Fp&$acoW!s8v_qILMcBbv3_U86`+W)Zq>+MI{
zUui$p{<C(LxF~UHq9w5*aZ6$(abMza;>pB`#7l{vBwkPaXX0lGqocDU*#TxTCbqiR
z$)1OE+yl# pCNR#q^408Ezy?xJp5XC;Ipt&j{kEe-bSJ5s1<cL$|=01!s7ZGiaoj9
z^{H%rUEj8?UaIJoM}>P5qC0gx2Acb*yR&ZF=00cR`mNg>hy9tr^aL=!7GC}682N1s
z9mWV? oP72kFAS!#yjE(#&K)K&96P4W~~F|Y%Y_ 7G<Gz?e_H>ds;`b`Jp?CUQ0*3
zy(`|{BB~t-2U<TC%I9OlsxRkD*`d6f!Rud-8Ag3+xKQ+BVXRdr8m&6q%ZCJ^sbbLa
znE4=ol$5i+j%%HGYhl=uvO;d~dFkO)k<D|mg N)Qiy3><Si<U^QLo61aVi tQB9K$
z`}Ts7vC^t{22v%L856SEu6G7=sUc?EE!!igXLD%3N7ke04jIJW*e_9w!J<4^%HG9{
zNr_oj?|37lgZb15I^HW8FNf|&A=3W*`i;HJnED=xH|nG#q~Z0#l8{s8TlKI?`A!&T
zaJxbw5w`4C+u82<;^w{{X1%%>mfK%kziI8}%^R8ZQ&Q5F<=0;!r&!itu8{KB1(v;W
z%Z;1Y_prJf>kJTGcg?0AXj^wb)ePIp6v_i|hCS-Y6~P(IGk$Rrjh6L!TpM_V>ve<w
z75_2>Q6Q{Dq9QFNjqnTOPf(L_2>S!B))szP3~C!lZ$i2f?T=Q-A8tXB$QOvco+DNx
zzK8dN@@eV;>VE~vg};N!qexN5!E>v}_?HO156z?^aaqV~S1^7>4KCS^*gpg3OoJN*
z *jbNhe@(%7_^LkdI +P0d7&|jy^Y4D!`~u|0C$ krw4f``nUS+~sC~tq0{cV50+l
zE;PE5xITcyng+AQlBZnB_$8!joyn3c+Jw!l->_UZ(Cf#=S#<mc)L6onQj{~}!ADW!
zoE<@DgT>KYHG$*tR{0Z;_-U#PrPHmlmN@&o?ntzNwnZ!j)Jv7bLeQG+Ufta?n$}ZZ
zab(Bwa*xt0u+Y$R`aLZGYWkXb`trRgGDl2bK2Bv!UrS71zE1?uO3RYdmruxM+mh3l
z-!0oCsMGZ2_sDt_-PQEv`z2~ISjg$iCnaW?<xgLJuVlQO)mhKOqIqKa ~Q8Vbu|l6
zVC{PMxn2Lu%<amYHEc6o7#YpEyJK<^`_t5jR+`krH6oT+CUkXKg&>HYH(1W6<)V4T
ztrU}13Rj!YAHopiQM`aPh~VQ7rcvX3{uhwZO+WGtP;k~5zWJMfZto$wI+Nb)qA|D+
zF#kd~UVZ)*B!cSy2>3#Nsom6I+Lzc1`63?0XELLiH8lJdP>h*NnQ4Ef;j?w?n=m0S
z1fB|YOW0)*D$Hx*rrpp0f(DLieWRoX(Q15pv{h%(XTD^L7$PpXV-ODnPMoia2oVj$
zl2k~}BVLVl6<!8-Er>%B$+;}z(_Gj9?H3{PqMbf53|Qzhy(ejh`7R3Z1!+^DC&Vn~
ze0>v%U$O$ vD9x|6S<l`-n@&q!tSub?x r5n-}y;z4nVO9Wq~QZ~<x1P_02^1zX?L
z3jZ~#7L3fA2zlrO!jI9<V0Yol`P&N`apiC*<}%~0<x;U`u`k_OYAF^9p4|VnX7lM>
zIfHjB{&o?)OI{{hhz}DN6miFqWxPMkxPz5)-jhWHltH %^9jy(+7FqxpWJCb{PA1N
zZ3oK_kMGLuGk0BWMmCK9>9ginzVyQ0HRf;LWH#D+%~ITKjCVb7tGV{^XIpOW7`n|d
z8*j3|eMP&uaD&+pH+vs9E`&Mb!oc7AWeuGDZW=OmXdu^;_6o%k%)+wg-)K=eXMy%-
z^c{;czQ>MO)_#mx<uf`4WhL6LSzu2XYa8n{p7v^&2k^_3b+jwHIe_mOHyOQOAfWBk
zlgKr%-f`=0Y+%mAIp6`B CNh5Cv6%Nlx@ms><w0?6B7dHbsn95AX>^hWZ9;icH%+W
ze$-O}=UJ4eW!a|uX;Jq1-ii9(B5}4AR{_(wK8Hl2C_f_0Hs$nsDky3ixc?CCheZAh
zQ7+q*Zx^(OM4nOoD3?6&V4+|d`EewJ9kM7lK?8Ltvt_pk<&H#Crnp5kw<_h8LN?_}
zp=dxMn-o(lqM8MSSA6|%=w}IOH{O73t0->SiHua|>_)VI7!ViRWX662%-+HIuc5$$
zzvl1gM>`-mi!lQl%myhSX+5DgiKZaPi>t=yCmxC;!AG?2!L?suWUu|GO)Cr ZPZCA
zAkd43hCHx suj?uqzFN)Esa|>=#x)`7aH;y6>H$D3WJ+0_|St Ej+GJbl){Oz5e=G
z4Ussv0W9qsO#TY4wXEpH06`;?$;WW51OUns{z2t*s0y-bnE?MIMKfQ}tiiRG><vXj
z5=<V$HGE&vk#HqiWF(~T9HQ4cEqD(!fUm-NJTn5`Mk4<SKNEt hp;iEv&F_I(0*Lg
zRK`^HB7L lPrcx#FYjkeW9THuRQL9CeKL+P6kjG^;Ww&M{PuK_ioRXi8#K?PH)tCp
z9H9EJiWM&lyNGk8sZ#i`tRRM~z+cLmeGclG;_GucdXY^&e3<(5K_5DqHrKd2qj)!X
z)oLN!j}{lblDZdO7ds<(t;`;-V2FG-Xky64m{$BOWs#rhWng&ETWc5f1)Biq6(9zj
z;LK^Ys)Y%3o7Vb-SqNh7XGuf)&>Rng)`#Q>+h^mW&SKJfDD?^RpqiF-T<CN57<+%R
zNUJdDnEyMVD>09^KlHLl!-uU;Cm7FVJISQgnATvq8vhBQYT$8TXbqODF 1=@lU)_i
zYWxZkjg-mnscMx~T19E?l&dJ6%M1 %jqR*vl$nmPid`%&PRKT|S_WpMm#Hyb_n{WT
zboN(cx=;ETbszj^9SQGCdZb4Bn9o^i*txA5)BS>vQPN-jK++f2NZ;>sR?=^)#&pwo
zDE}zwr#_H$IxQITbJsqfvyx8x*APwj2_K`RpZP%2Y2O&)+_lH&tfX(L#&kbZ!3>Mf
z2{ He!3=uC<@`>Z%cx*<WWJ>}gv HFiPhO?)QVJz-q~oR&WXiZI;RrdS$$A3-?bYk
zVLPWe9tK6zxe 3&X_V)Gg?4pj&ZdvFz3bq+)2v#q$DPyK6^5GedS7$-448! Dp!r^
zOjcvM Aomvt2Agdz*v#gzYJ)U5JH5hjs(4Gt@<yYkMhQ7HKwzt8q t)1*79RS;6Rd
z4p^Zyq{mR9;cRhOt CU&)mF?#qv9Frs5qQEo`)+mbI0 5XQTPm+tqp9+4NB(=)F75
zs<$dM^t2KNy>s|6&^6BvZa$+o5QpG KgNj1SAmI&QI5^Je<qqIK -z7l^v1ng;?eE
z>_t)QLrpx-Htz2wHmaWsW?9EbD*bDuvl6RhVXeR)0+oChnv<YuMsJWQi%ex0WwN*k
z+0}}V!5n$SjlB%4|4h9?l8S$H$zq?vfQ{lq-*)sG1wQKdoZMZ+6iu0WMdd%kB!fQ?
zSuDW$F<{7I`uCWmIVv*}r7%CJ!O)#tgDlb-FV}f3Jwk2(=!jwLVqn7l`5e)NG~5o%
z7?89=O3rCu^cp2Gze~N4e2*O<i~>pXPzWQxKRbfLxAZR+jgL7B46Pr&^dCx^s891#
z!i04GIWS?nE{4%I$VeBd&t<^0fsP`J#$6tAlslrBqUi$7HnbyCm}{u0K=Qev29pNH
z=S;*!VD#=n_L`txDEd}B0F2(jN}8_$Lu8T$5tYy22#^Lz^DGGTIxjK*1dQBSkrj9v
z%+XOz`Mjg;`Uz<Km?w^BND!Rp>odQOFcKu^OC%=X`OASJ=li|7f!PO)KVCf*J~5W%
z7ox3pF5g_C(S9BTW`BrJ5g6*}%eq(f -cs`FuwFBYG}S!gE<LIGdPna($aZgpx0-K
zSxzh!80<>a;u&|KJmjQ`sr(Sm^{eV=d4Tqpm3lTmSkP^$fq|mCOV JQysOKD_<v`m
zLc`?*4=&)-d*FNnp78N;NFLpAW<77AH4BLgDsooQa~PuSg!m2XD(BHq!vn2TRDW{7
z>PdzuY{sp kGk28)!h#M!0Kg3T=avnDSYFhE}4Qelq(FRa!!W6`h-#9LlASa`K*^s
z<+69-M2I$?j+iK|dN=i8hE%EJP+#U$Ya^tvxctJ -PMIZHpYeExU7I>-}X)0)?eT2
zY}wkoy=Sx2*Sm4^I(-rk`r CYPKgfhk<9Sd`1l=eYG)j-s`&#5kaM`q%asD` On(1
zmv&OHT6z^{qg<yjNL1;a4vs5~WTotI1I}~PnHizgNb2 N(J7S&@S)LjN1R=5v6L<3
zrN(#>>Fmx0ggOF~odqM;9;f;sd9o9h<HjHCF}K&$ HkrCVK+4zG$T7Q3h&5s=Z+(4
z;Zy3#)r?dKoLeW1Bh?-aDj^IRRZAw`iDmO}L!lJ1AL27kz|Y{69Z3zj;wX&pP{~bu
z<Sj(pP=3VCOK;C AjN?Q3+1lR*-hyv-6C~PS2Wc1KtKf#ekyl}xvvhCI^sx9m2Sdm
zYR#utfi(J6W^2EO{t+MsGI0Js9L`R7$btbT_4b0kUr$b4OQ!+RuM&CW8zEZVX=j p
zAaQ6KXeUW}`qP27MGjCfigDr&Q(GKYDv3eU! AQg=G|OJ!bwqY5dgk6K PI5mh;@>
StOFUr<4dVbQ|%II#s2_!9zG}l

literal 0
HcmV?d00001

diff --git a/images/lib-win64.dll b/images/lib-win64.dll
new file mode 100755
index 0000000000000000000000000000000000000000..ca94485c04b7663aef4b64976ca34609a1b790f0
GIT binary patch
literal 34777
zcmeHw4}28Wz3<F!mMjS&L5NZXSv6p+<R63xigiO0o!A8eB#1~m*(94}b+cJF6B4ZL
z1w*X+*7QZIZEbyRYPnTgeUJ9}6#ukFpn$Dfq<xlNt;Jq!gP}fKEv0JB{r=9MnVp 0
zHSP7?wwzCP&N;vHJHNl -<+A8S-yTyaVv_Ff#2AeqU=CS!OyNIzidYF)H#n$RUVrB
z>^VEsz_aJnw}-oYv3O@&JlNrD4o0J$hOa5)i+4wT;i#{A<r-f{XG^F!Cnu{wkglsy
zl$M)MQ#ST T&dJ4N~cRv-caWGvR$slN*<6-!_TWI!_yH{UU}eJy0SEINp1=r1sMvZ
zs-jF%6yFAw>4g*n^SYE|M9j#9fOiFD8WrWBBue 8FbEduu$25E6wXY^|E0-dBh+gE
z`Hfs$^285%qz0c-*I3*VG=c!uQGpLXQu}oLQi5Np8!nD>L?6t-1SY&R!Td_2zqqNZ
zi>k&laq&~i88$18!^I&^kJ*Tr6TLI-xPGP7UmWIm%!Z99Cmm)v P>=4R W1B9bIDh
z5xsLMV+FtBA1*c`Og=OLMcIrW;mO8>Bn9w=zM)8Gv+&IzfP^=XO059AWhLc2UrNys
zeuP(upDpCMO3IcnNDp1N<41TOrA%r7-oix;up}GNFn&|;n~$F 0I&Qa2Kg1y*^eK!
zvBeCOasggN8OxtZc!%&KyruZr0`M+c$RI=t9fr&2r%Y<_yGj-_k11C(Fd75VU6zVN
zY0z83<r^b^<pGZjUQK1G0eEGlOzJ$MLye2%3#8&unw6#lPv!p$T42qi3Y 6*9rcYo
zKNX3 E-mrYNCjGf*8ifG@VtxWgXmR6JAkMdleN7xU!coreY<_v>}qA9ICsugrd?%y
z!&QOA-nDDA#E*z-|AFpLC-c8hq9|p<{RckN+V`4THk`=s2jDTH_lB1Ho&0-=N&m3%
zQ7yS>&MHNDl1j>6%$?&`9vuO<u@|(&LBhQB(;TyVB<Z;c$-d*R+^t7|{OBB9M$Ui+
zOiCu&C-qNMZrIiLw#q==qaiJsF}D<WTC&|+Hca%2iUj8++L9mSZfzn{Bp2OXrzkaL
zhexO6&QTcrO2CC6fy5zJ hx<Fh}`|lvSUflACc)F&fWU&rX&M7fE? 2A~v7(>?P#n
zq9HPH|1o2>Hjr}%(j))kp?XG6ZQ}T2)StA(&&OWq^RyK!ib^Ul!LQ+Z<j&a)43NnQ
zgWAYe^gHl}zl;E2H3W+hEU`!Hd)=!od9&wqEjfv-`u_+pwjUtqv+* B899bgO55wn
zMlD8kuP09=_j=}u6c>F8a_ORI1NpCh0^ot1=Me4nyoE89JT`JKksZk2&I`YeXygun
z_IeHggA_b6^4{3k_X+pN9;C>=eMhza1BrYC2GbH73JSHvjRlJnKhYAA0>73p3QD!a
zj{}JxbYGqH)D>|vze~Kn0o&CkMiT#~CH^#WY%<!yJMP3D!`uI2Zhry X4$oW9vdU)
z>;VwQkC_F}qf%nes6J3N)^}XZy?F}|21h;)x_$4c-QQ@<ol^}y*}y^-)>w&E68Zk&
z#GdZ+0WCW~pk9u`Gw-}RHfEMYiNzaxJ-5ROV+dN3G)$6KNvNqMNy)z5+Ac8T{b%G7
zLEqSG3VI(%63g8FPk_eg|13K;`Ynl1_Cpij>*<7XC>S|J W?i1UcZv4CkqA&76%g5
z1%)HO1 %A@DJ=<Dk_riXBd`Zq5d9YN<*1lpMrOfnTHo<8jj9_PAEjww<i}Y6CUXug
zK>8hc6Y1SZGn|pv2ry7zP#74fF7TnX5!g5K4OS;W4&F8L0;?3DV$YX}$`1fwv;o*e
zfEx)taS+m#UV|a&=VSS;%L%fJASl4V!~6sN3rDUX)53=z8AfU0F0Ki`Vju!W-`g%D
zpUOm!vh1x5%&xtL1YWd^q9tz{2eqV|x{V86rf(PZr0(C^s?vaGj(41X{{iE)zPH^*
z&R{Agy8N?PGEkQvk^V}a-8ZWC&d{27Y02t6dBo`TvHgH;I;tf<>BXRHJfS6irzKt<
zSp{E>{y1%XmE)?G%)g$|K48pBy84cvZ7kNB_w ~{2^YH25A({%6d0bh0ngRI+v{10
zD+TmVjVdNQWr)g#NB6NAVB{z8td`ihgEdp=Gpr>&xm1(-ElQSowM71V7qBXKS{8<N
zQLqopyt`<;9ydSWx$`5SK{!<2x F1o^+qNW5s>D}rJDNGmL+s6(EVE3aO;*$GqYW}
zcaR3&^!bI+=QXNxA6Ydi_mRpOH4wKb_mN?3pjw?-_Vj3m);C;Oo%BzsNjz1%<oTY-
z)o#Bxuw-XEtM4hbddc(gUkcWI{DC}|zBw{BwtPK|brcB$!?sXJ(VFw~kDzs_JGWfS
z1U%fj<pzk?{Sw%(o>ZH7y7q#navxd7gxJT0aLp_`Fq$RX=Wt<Cn^KwBw|vP{aj#qR
z)-HKEp53<-f*gpyGB|n%HG%)0^cN7vKkk2OWR9)<Lf_uyG|q1*Xr$q=JwP+`jRi3+
z tl_US@#SYQW|MUX{RA21}eR9dVPVfatF<IWBISw!t~(Lf^J{kcRa)J^&R&cX9WfV
z1sf`N_{q5#2QU_)JC5b=0Cp|<UE*!D!jbo|4v^KpK-F$z)v5v8kXq{|)H)JJ(;4|G
zYNYlLZOhSHz j?o`Bfn}K@E-6s3RTL(IDSg(?1+Yw2)$vf>;1$y A9N1)EXHSV+og
zq+A^-w~ofk#z2ygk%|RS&>Ki{WNpiCVg%juHQeW*Usod9>uCd93 %{3U%LR~$??q3
z+>dMaXEr8_<^ZGrx82#vOFu%XF=N%Bw&dS17ED5R<4xK?(Jy`t-w)hau+;3oAJ3 V
zfq546-qzG3N!9J9Q36BU(vdohqS}&|dtN+J4O4LcCl~EJgXSGLYGC%`NG7xUpYFaZ
zS(Sms!|ll~Z{K rZvQ9|?AtXZFt8{I9Bs)@a{Fk)2n `<1`-4yLFwrA)W7=P^X6_n
z0}55sfUNDUE+8)}wHN$(B#4=dJX5F*XpJz#{ikCYll$=SNF53SYNVjF 4dX-txo_w
z_p=5_fYxB{)>o0Y#xo`bRtkMvpiJ_*jN~QN$trJU?!#{c)ZYZuS3x3>EHT#S-c0W9
zd(W4<^)V3Wd(Y4H&Fyan9O4Ar9SXU$v~q_R2mxwPM EV;8IOKt<Y8K=4CFtVPm$JG
znRsL5+W;MzLbKK*HA*Wc?8H;320|KE2B0`l?SajqZsiUdkp#V8U}`*~fur<K?!z_8
z*5OUPydsH`Qjyw$sJM+P=At}VgXw(JVvV$5b2QbQyg#)Xxm#50plSz6N-<xPrs b2
zZ1n$PJW0)e&YnNA4D4Vr<3U&}xBqrfX&pTB3q;m%I>_e}t?$wUbHOz^dp?*O>-*jr
zGZtZLI16p_Oh7DuB T|w*n{b#`xtsYJfD+9wQD|k<nVEl(T`O$s{96P=+R6zUnX`9
zRH=!bTHn$al<wb;ej7FJpFzV!PYrX)y~tp0XaINI2#n=x1WtGsA%A2e<frjB=_y7Q
zLyCuul6yU8AxpNU?2(IsWyuG8tTjCU2NGyWHV)0kyqffEBfvnNS4;Y7V!4yD=n?;p
zrNqw*DE+iCZ7ly=)kyC3>;i-Wsc0J=2Ql9s^~xo`7iH=B1}*XGS{f?{a>^hjtp;La
z`Clfw$=PSjLp0DZQiJgxtK#jn*6AOvO+1ymbsMo8s5zu18%8i5mOV{fZ7~yq8X<}>
zMzX%<Ve%sF8|fheNzX7Cp+aKOWk~Gx<U{(&8OrcpPcBl-P6^KpB!T)ps*$J}Mw0FT
zklZ(xKcgC{ft=d_7|W+c=ve;!Rk&XwBFrgnz(%eGrPe_$Sp)ldmV*;yqU5hYnYl`?
zkJ_~z3-0-4(Onl3{S8=fCTCyHco{Sn-$-L|q+lJ5!HwFIT}F}iN36bQUq~nzet}MS
z7=AGZ6CQ@&MmVA!(>;?j0Bgu$Xe{3cK?$XFEdS5Tu=xFfi1#LbJC>h~LJjkdFR>>v
zHkLnya2K{9drV{N4%&dMEjwCU_HJ$2Teaux#?4mkl9#kU?l)!z5_4~Z!qD$_L`Ry?
z$T<HU&wRpnp!KKd=ua#ZT8<vDI H+Qwcs*1I5u~xh(9LcNonx+ATHs(AYz$6Ti_iN
z b8QGbrDBJe6xr*ig=!gCyDswN>2Z5kuMhU$3(nGl* WAi2TE8vBY~$z$KoDVHgV3
zQYrA9mFH0FnqGcrhS*;fC?j+1`OTF)?_0)W*|MG$Ua%;iO8q pV0k!t#Z^UDRh0Wy
zcSntIN61%JT<R-q3K>CPk*_cw+F0x>y}(zBP{jVyl!|qQx?4JRw)+}1!ktmt{x>?C
zJ0rf0p?DVo=C=6oRG>S0U9__&>N7fh20bOfGXY{(oW%(?h+<C9mqM>8Z1}puH-tb3
zxE);^o8v}tOC+L1I-_mZcEr*IO3!ZQ?KDHgK0nWw#(12L{?C|a&t9N-A@;r06a!FR
z{vzR~qMmTHqMVsN1?g1s 7e<XMoau#TQDC773HNA*fW3~1?)tjzKNGKiFl)kZx!)9
zB7R83&x!bD5x*{CZ! PeOT-l-zEZ^PB94i8tB8k0{9O^J%DGd(_KWys5g!%taS<!f
zkwTV;XNY)~i06s8Sj3A(%xhWK|H`%?DL*WGyrWzm4}}8Zrg$*ENvTn<2pLt~ pvd|
z)WtiSLwMkLxf52~qSU59>)Yd U<-iCJp`qSl`SoCs;oRikTsjSj8I2CrjW|6%fpcn
zrIc5wq(0nyT~#Nh7e!g&3Umfrgd|umea*G1I~3nk7mBxb#yf)1<`6>+#g+Z8)kdT$
z7&E%#fJNEU*q;$B(AjxickJ +Xfw@jHBkd9DKAsW+Hl<H4n`WH7#AUDoqJ8lXo$84
zqb-q8OHFTcC`L6Pn*sV8+-oACP)uoY*N5UA;b_nZNn<F6`-Ih$Tit>Uu#HeNbo!ix
zFjb(VqU)FrJENiAu%WC$F5KCqw?be==~47xM^~H9ij=n$Jsb i5T`>qN7eDX^g1P~
z>Z0azs@@%Cuu mBsWWaUpLDgx;^C;#s<gOT;Za5TlB**KR-pV<S4XI$IR;xGH2!UV
zAFo-xq9(9#ft+GyfbIwRrK}Ag(5diOSs-ux^^v?k aK<T{#WrlRr!<!PFdi?wSZ5&
zZZzZ DjixpMDGgaL4rd=BSUWt9Ur21b0|NPmwvdio#OVNZh`sW;9^{8mmWck`&k)0
zd+Pd+ZGlUn9{2wr&;Wi5uj_a-Pp 53Tdx%2oxtiyWO*<g1#FEG#CkWTya>ElGc6>U
zW$>^b1gLT~=&1PVdR6_()q0?IO}(xw=Q2oj3gjQ#pnqrD{SJ=f{`aa^tZ496`O1sS
zu>-iEv~)@7g3=0KVW>A2isR-gY6K$}C OZ}O7O!SM{%=K(%#t-Dv4i<TZpcbc&wwT
zI~-{#S=LY+s4l xPFqh=Pepl&fxW)#tb7rwTjNa1ezQx*9SGYcM7zoJxV RQ#ph#}
z?r2xIEgHgBBJS(l>ZIoOU|ex~Jr)KlaAkJ2<JJYcjj8Av9#)vav3WYvhLYjUbZ2mO
zHn>~$nt8_3<DFD})ymb?iu;pU*ejcKRqcvpD^~^-w|*F&cV}d MmmFrGAU5Ec4aNF
zV)Q;T<Q3v v0WZ6B}u}`Rg^0kgI@uKNxYuxR`wpVR=J`&P }k>p<Jf-JGgpP#>kt|
z(%Ib<2`TQp3}yq7&Ggc{HIvmWuj}!w40tyC ^DiqUQKTeyPn7zL}B(?zA>w~zL&KC
zd1Z>eqF%4BU8XE{J)HF|)X6dLUIXDSLvcNl^&>!C=P5ZD1e&i~7VHWst{se+>pU+9
z2ErW}5nPW7XkN~m?k0JU-lVu56Y!Z+4}zuZJYP;_96P(TL(tF_ir00*7Pw7zJt^=C
zbJm0+t%_?n>v_hyRLRwA)>YNi)z_|Ep|7sF0;9|7N|C7|hp3rel0DN)TIbc(F0Z_z
zMz0U7(W #0fn}9dA6Hz1)81qlf5LT|n(M~f<z$f4$O<f_Ow#MtUcOfG<nIRvnOe%6
z{%vHYPlly3JcD7>nn4YfM!;||f}QCW1~Kz!_lgP>695F4l27$Lw_kwjr>i<P%!4g$
zUDx+?#!)z$p>6>S_k$=rV`Xb=R|u9I%^<O6#wmR?gBk!#P+zl5QBPM_$PJbH5Nvzh
z>FO_0(@mF;oOv5v&l<uNA=67V!LXLhOLzC7ma5K<STG)fkFi(L7BWrWm7x+B_XbP?
zXH<u}4BDl 4u<0D%3!dX-YQmu0A#l_h*Bty4G#&K8N&ku#bvN!FmD2>S%hkrz`?p#
zu-;Cr>x1z&Qo5IOT^o#aqq+5RnzO+{Z)Ubt)Js jkV}@zlv~!{fY8~rwoxyoBt#)^
z&rz+(ZPNAXWe}`RRQmL3{C+k7<gei!7T-BkS^FPAIf9fAKV-=x^cd1dPl8qLDkP_)
zEuBN9Kk?uN_9}wkKxTZL;C0A8PH-klKZ)`?z|U(#Vl$x*ejcR-Uq^NZ<U8|rB$T<k
zr*T>GgiQ1J4owJlR&OC17XepM&VLorcB1mBLfW KYX#M&Eqi3RBx^{L^+21~N~1s+
z1nLR&4FX}zHqbQHhQp}zb3iV52$xY|khesv)^C70K5C3pgoZaa9sNRTc;|9K&LaT_
z!A`xZ2Q&)zBPoQOPZrRHo?#KIoy-z7DB_k-l-auOT!E<DnCmtR^X!<;&GjkNqa_P>
z-8ORFLjd{6Ch9hFT^@|hUAK)~7eRI&`d2glCq+ eNzGv&Kt*9)kA#970sGNIf;O7Y
zIC9*@<QNt>Sz;<HfUXHsj=M;XPf&|ua@<97e4etb3Ef3<JdLbUtm`psa_T_?Lu@<w
z<-)@NPj)NfiB*ZNQ-9nT(!2OdjAA3Cc<%Tin5pV48kw9(Y)8*?=j#k7)B6_UQVR>y
zcn6kuG#quIr+dD5I SZA^+&KSn+1aNkY7M#d&7EAQ47vu<vf3bqR!>{GU{EcOjKy0
zsPis2QJZz3o^R$`Hbr&(TL<gJdNVc n=q*;>IJv63JZUR9s&lu(Km(K!cj#nqGqqE
zCYbewVgY0;4Lul(>BgoQyjDtvQ`K^ N>vw=BI;!K%$V4- `Hm*iQ@VfE_#ZKOZXoi
zgS9m`Q-&g*TR;mTw(@BS$9W=k2~<&D1l%IFtfE?!Dw4}9f! 2gLI+-~xrphqaDgDL
z96FneEaM-dxwz6-J+2cjlw9Mkhg@>`gg0u CtQ4agorI9Xi?(Ia4e4iaxTPN>B}RR
zxh`?ZrI5?MK=F8Qf)0~ZSLz}N64 3=Ot4Is*WHX6CKBrP@l};8&jg6&j>~64Y^xyJ
z{?=m#78DoW2zK6AaG`sX$z_yKvh4RL>NmZ=Blu+Ze(|~k5K?bh)O#hup|tlQV8OrZ
zpiWcgdZ%Z*y=Qr+si&!V7>Zm4SXgIge+>W8<StMs;YP>I;7P1uash(}PY2e;*_UM3
zPRI00FiLpymGh iVlpN0NbL+YI~!OY6|n3aUd2NQQ>LrLMV94QWsC8ce`=0WJDn1_
z(@|$BDCG%$tn##c_53MB -z?dFbQX<?x~DeHbG|;qS7q9H<*t~Q>Bon7ps>|VKRG2
zMjt~x!;>P %<`1XN3zi*&h#i{Ab3_ei)Jli+-4U;bfQXR$ZGyc#Pw{{Hkr*anWbU*
zz))bhVC-|U)dp7kT&p(0&zr55O>daAF8gXGW&z1T VVLW*lCb#o{$x0C;0gmK4w88
zius&ige|FjGzEZ(?n2UvD$h W!?i_O+zi>%z^6Ec5B!1upObFCYzq0Ml>S|$OjT>A
zlMNP}gWSS-%uMB}s4mn+4;#0&$tH% MqZ?bXK!uf;z_(gWu`VeuVg#<9B?c_y)3~K
zt>m&PoG0-;6;5P<J#ev0xf{i*`VM-Xia;6s(QSH3cUQc`IXiW2>MDwNb{hPqz9bxN
zj&!$#a1&cB(~4ql5`Y$-kVcK-c5tF(OQ Bnn{Xp(bhYpdy8(;_BgkR8rnL|r_VOYO
zCoZ|lcVD8O*RZ^A>%|8*-tJxgX5jG*m-{~NQVakGdx}}Q73rIMUqJfp%*T+vrS}1(
zk7pVT{ 8|JyQd#^fA3!ic=zP50{EMagGhhfdnMAp>UrQAWWM74Ju<KM+;k^0U+_}Z
zU-dlZ&N2?Vv%U(@tql2i&sQIRbome6XB+OOE8S<Wb6@|$<Ck1o`s!_40`vR(yz7DZ
zS|)M$N-tG<HIq1erFWgX!T9OW)!q_!<goiWW#5XTX79Rd-8sL%=Ev?$OBW4!R|MRx
z-qZG9{ovJa7L}Af{j u8-~1tWlj~gd>Y|d8r;AG5`8T;&KNh&;YYS^X=lw&i%LBg!
z;5L_X`FNfjfBAw1Fk8*g`UO5}Yl;*#8=Y~oIW>V(;h(_*GoU2B1F9-&Z{Czl 3cJb
z`vR%FxDBin`O2wzwNp!{xzUqZkpG%2 1u)E!Lq4&l~ZR{PW4UmWK5gno;Jl*J+-is
zYEGJ#;kjZe-5FDu&m%?N%q<p8uX<|T>S-SLG`A-(EdvxJzgYrb-gI3l^1v6VQ_%;p
zKugbRe(R^}p>c07+i~Bkv3FXO)H|{W_F=GZw-Gn0bcd<4_d`<mZ$F3-r*QwjTR KZ
zE~UpS(`?BG$pFifX*mu6R+=uf?18IA0nw7_H5M#Srt2-(OqpJ1!F)2!&n{qc6v}j?
zg;y%mpB96JTj|*^imgZr*CIfwvRWo-^+Q2b*2v_)atJ`HcZlSRCTNXJzG8w_%j7qN
z j&Z-k=$v4%7uhdQeX)ZW+dgj)}+1a1(BR>5?XbENYZ8=1yxy9DU#P%Aj$3$!4_Cu
z4hiu8_Vyqpkmga9bu#&7fvGADGI_5FS|=^_3lr2JldqVdbu#&{rkoAZQl+Mx4N`Q=
zQVoKH8Fh=4B|+V{1nB!BR{1$8W)&o!6l^W8NPSJLSwajsmyJW^CxS|eDY0z8CY85E
z%5qWNLQ$*MRK3pW4~IC%1)*=6wbnYVv)1G*5>)~_X4a~gwIokfsqb|(2ZtVS34&6e
zajX#(Jhqs;>TVawdn{18gqsELts<u3LZ)}%7J$OIU0GJ7$2}C#NoDfWq8=KkOn%k`
zt(Hki9ax-#b#>BSC24n=gx1KUB#4eBlNN19*LKogCu!eg(q1c*k|4UDOj@)Z?*5*z
zh1(=lPkXWydM(fwMe;5aRQIq*TC^Q4U|68+7BM+WrsaDg<2p)Ke92_DS|*QJATFhK
zb=F!XYaKRgIYupKt#z{2>t-!Eqgc%T*;8G 0CF%b6zxckecMI<EfDZe34A#xrQ0tZ
zKb>AWK0D_KKuQ1o YCg$ga7{)gzpsbkcg$c36W2a{?_zH1%tbU-Q<`n=P`O3L_v;=
zJZD|yVDA=qa`sp% -s#36R}m3r~cad>GV$J|FJDl+=~C5fQskh_a6Rhw2ij? Kg|c
zLbh;&$f=4Cud~>S%* S5(dvb8_;7KXD9b?12jP2=qIr<fVWp4YN`p7ACC|a5B4XoK
zX@)7MtQq7PcmyCm<H;k>wIdwHU8Sot{7``KumE&AxY%iE2Spyc-N2z&-L6Q(P?W<0
zf 7V4Lyzg4MtTEfGx5u0I3P0)j$CEYF SD$Kdyvl51E4WG=SYIJF(4<fE+y{pnyGb
z;8f!3l;>OlqI)~HT8gVveR^I-;WYf*>iFln(SvgedHA_idUj_IvW?MRkJ-l9gI%kY
zNx$d8O+;>7pYo#x8S(e?JITWR&d?nf@;iB(`&}rIf+c0%2N;(bo28bx4D-X5`AUe%
z?Sua16dC{PgMVAXOIX9qhSUe067GiN)JCoFL3-24tSWgO`am9Zwr<&TPsWR+Uk3|t
zUMH{y-dSkDiwGKUS&zeusRX%!jZqvzblO43kEdbQh|~*6DN0!TArz$#knIA8_mM%W
zg%XbA)O{_=X}qw4v _|&TQBJjw3Hxq_W{Nzt3Epd;POOFszwytssn}L6s%vro ks9
z2k-RaIETtY;8-IPGAV&h=>*PtKVT=sVJD3i)E #4jqz@kC=zEY2s%|{Rf~>YZh=$1
z_<eDzD>WOA#fMUyPWAe_li`TdR{ePRNm86_wDF;w`wNM*ApPYB5$>-v1Z259wUy*|
zOLse-z*+BmU!1B+s(ErcRqM&;C&HonLy(v2K7QXJobLdqj bt|1W<MY(r7|to40I8
z-UUiZkZs-v*k5i#lHMNVX|@FAZH!(!cZP#tACnT=MKO_&0=`}1FzCC433J(3Ae;`h
zjRKVO)r%zZLG-Fa?Gv>PqDOZ?LxTHw?T~Oj3Y<omg-b|~8bD0S<~Yykkj(Vz-5G>v
zhKb2+ 5e+;`ofPi_eCdx9iagd4r2MiWF`xz1-*SaJIf&^?L*@;y^N-mV&JqiZ3i71
zqnQmEjc&4riKEAgE6NrvDfgia1&~R$OwOIGK`Wi<tggH`twF8ME~f0=jgq ct2cX)
z*4Pd(w}zb$Varz-ho#JRHjJQ nd6Ym_F0;cq|DUMn5N^=5$8E?Hf3hy9hX}`VE<nr
z56Ah>m*<O+=g>*yAqBn-93OsGOQ2mZQ&XlRy)EuX3K48*A4v#C;Rq5M;*;S_fiq1z
zvs&i atO;s`zXO>CSJ#2 v|AGyg2=pC%8%s_|)OA7}go~Alt?vGzoI~c%y{m<wrT!
z%T9xGl9z(fhL1?nA{MS(_Z|WxbKQ%#7U?Ac8UEJt<eBnF4)&PV>h!WEU#rU<8#~TH
zWa-WfO$hd>2DaVzgnbx4x-;YVXmtc~1iEjk1eD)5RUidGTA=$Ky2~MNx>e$64-Wg7
zJ=YIJ<{i@)rtS(qIlbVb-Ea-2CmP4tS?UFgmZFLcQa&FN*dP_fRxPo%8Ii5!199JG
z(GlEfcC_&-KMLt=kcyYlHv~j*e`7-2haKE$|IEg#oMvMiq+*^`OK?9vA 28CbcF61
z4({|c#LoSwLw5x??+}taDDGJO$i1K6>3<(=lo!o#aL;h)P90g)61saQ#Qgz_j?jII
zgZsM<-H$tT&zlhUyB*wVm1eU>`AZJ&J009-PKZ1Gmw=7eB6<R7gOpE6m#2dErR<jX
zO^EwGi;l27jb3){<qqzPty;qGg%jew!=fX&(@wmd`wR#78CEU9y>vp{hb%gR`&;R}
z$`3pIzTe^Z#S`NGgoFEhhwih|<*Aru)@qLiapnxpOEM*FHQMnXj5smLswM2>mlC2R
zJvc^* o>aC!JIF~!{IhuFhk0tQVPaO335(3EG0}^BN3{=DW^G=wS;l PURf;A?j7W
z^!;UC6p$V~v0fKFBR#0nEN>4Ey*|(w-YY3f8!mcC$}Az}_kp3Ue^s<Q+OsBG%Ln3q
zi-Y 59o+XhxPRBdy>3F>>5Bw5y%s&=;6Ci&KIGuOZbIA}9o)A%xc54^zbspedC%B5
zA 21K?hyy~MhEwM9NgO{#J$?VJ>cN(cW|$FaF0!hd%J`C9S-idIJkQqe(#+Scf-N`
z0SEUX2lp!-+&52%`(_9C-45<M9Nf1$xZg4%?wW&py R{v;NIl$`{0DQ-{|1}goFEb
z2ltpm_b*L|`#J}A!@<4X!TlkJ?n4ve9&m8q;NVX8m$vb+VxxomeG}qd=iuJr;J(hm
z{Z<F}?Gxg !NL7T2ltqR`*RNNJ0`@v#lihn2lvem?yozz4^N1D#KHY;2lqh-_gRiM
zzi&d^V-D`y9NfR;;9g;Jm+Mu(i6hsmDf5L`ukM!;f<t=vTd!A%K3`{^c)eOJH9hgV
zu6(IU2Zl-ua$WZ!>Q%nql*gMUjk(5N^wRt5b<wTT?<(zp* N7#dku8VXY2Uy=#=d`
zb8Yis=uXnne%&kRaeTjSoCbvQi_t25C_=<`Mik|0B;{y~$_P<Fr0yK -v}LnavVZ$
zG9D6b)y1Ch(*LRFp&Xlvz~TRxfbWd49U-5nbsuWU-4#yf5kUBuAaQ;yc#-co4()Q4
zioHq>`Gdfr*2^LEd|uu`b9o|qGuuh#@&Hkp4V*^kPOX&JDxoBVrgPdkgywcwC<Q`i
zY0%cNh4UFe3IVYw4+0|BQJl_$fLPWbnok1qF1TAVKX0Q$Pst;AO71r))4z4lKY7e#
zcJ>JgUqP(`;2;u^w<(EWLA(&y?&S+f1)HW-fXKUAE^{3q *b8$!hmR~XleQ>8$=iX
z>Oa%OVP~S^7$FLl#geFHhYSJokj)wo0wUKEocl9?$Pto5e#z)OaIHo8bwK23%yA}>
zfo+=30^~-M7ulH(N}#~?(#4UgKAW9OQH#$P((=myv0JqfkgX<VqG$j !D_vm0co+}
zd>IfwSX=)3E+BQNMH<M~8%$|qylu27i&1X*;z`t!V++^)SwOa%y%NaEi-7oSyj}w&
zW`i69M6O^tom`ZY-?=<Qrw9<MJ?r9t+Ql}DT?!l a4o%R0g2dj*8!nG5$AP1lF!(1
zJ`2c~Y+4KfV%PM40pdq3i`SEYth3d677)H8?GwBX0&>*GYZMT<@5kl&6Ci|cwXrF1
zrreq2ICT2PTQ)jHfXL?s9On{1>TL3S91xP%qD;@08*Ml-Kz5iA9Ed`P1uI?#AuV|8
zy 9naAt)#&1Z6}F2NRL#g8&HKKaawn+GM^LkUWzzVLk-N6E>V 0FgV=;4Y3K=1;^(
z9tuAPjx`q$<TrrGJw1+d43N#HUWAi}gPGcGklBD_03FRyP%Z|9+MQ*wD*({|vvj|j
z;iQfUt$ %3!E5RKP-Ugirl|oO*><>u1Ay$d>HZ)f{ArHV^ie<tZ8HA|5DG+t(>V-?
zX5z^6R1_0J*uMu33?fDe@@W_&zYh>guQA{ZLk)-|DCgsa!THEZx!H*UO1aHqOMpYc
zve+sIqzMp`)x!A<Ah*~gyv<STen9Rp?W6N!wH3du)=uD*GKf#e{2U;K;AP4DYe4Qc
z>5!}$*bej~CYk7mHz)vkz=m %AotmLtpH?$4JQnU4-oP_r;`MPMlFl-Hb8E*)!GHf
zA>dfGo&&_*#$E>G8K_{j%;SK>OnI{LFtWHM)YRRk2XQV}Tc}HBW8F=(TW#jU(bi5`
z7Hn#wW4lDfNH`jj=~jHl+st&~I2DP5Bfv#cu)*O)=DA!rTtyxsi6&(~)d&FRK}zF*
zq!u>OQibMXviH+!D=VcmHi0o_NqD;YY1XmZiWJrPp+fv$UTL&TJ+vq_--3UcS9H4S
z5jrdns753nYD<Ib?Ktoag)JdEZAy=c^X}-sZqopQGmb#h hUbBNrIzv9jBnt?tZAY
zBiI&NMhEce`sFxEp{`~PPKBpa+H}3PYei?YCmuF}I2f=tD$d+zHBhQkNr=`MojAfC
zehGya;@Bba9Txco7gDAt$j dfu2@jEcrjJQ7hc*TolQZkW$A<fevZ66{LWTRYNH%J
zW=G|-!{vxVJQTyZjCxyFYcL$a8T*QU1y1JU2kozhO>hhzLCk{(1&rNl7U+6csJR>B
zZ_=A_9DkUaBn~um!ck1;1<_%Zc5>p7J4lv7iw@|M1OZ>&u%f<pd5vDTrlz5KCC(TO
ztgMo!nCkehfc+Z=wd75_6I YF*Xu&@XehF9fgXgzsL#M=kdPnMg((o^Q_mB^;eZ`6
zz-03}!FL9LLFZ(#^S(Hdw13fNv$D?G)_AgjE#t#y9=)~M;ICW-aIEH)_;L<xf#VDH
z&Q Z9f8vJqaEK%0WG@i^>&;3!g4d$0cXc=65D<KUK^LF-;qp<7#odD` yR}k0PPrh
z*g_X(vA$Vg;qaw|=p5v^2u=>cHxYDv$)TC-jR#~YgihkknibVH711+esj3UF&=F(l
zrsZE4z lBs6-#Bww27fd)1n9OvW25CRA-mXLd+k0&JxZ+%aZ40+P-BWic>$OK_GO0
zy$SuFv0&63pQ2z*oW=wlgGO7FdV_ xcGd?n^l|E*v>R{-**>a~(ng^)lgR2U=4U)$
zu(Y<zPp=dGMA|I%<Y4M^DWb~W!cT<b{+89!xZ+zG>@y=^nl^CQ1_;sqnoW=KL+M&V
zy(x+iE&1gU>GkFmuQS$Z-{>I8PvBGA*~p?bn<v-lX@;d{&c4<m><VK=aLgHd$zOoP
zEu*f}|M86HZ~0LVlZ5$o5J`c5(L+zy0c&jP==Syt#cT#S(dSfnqu^aA)k6H6C9tDI
zk^1z{qDX<o7&p%FDZfslpYZc3dV24nK{v&!a+G63K<XgJM<yf1&wA?2YmI(vXcsMe
zV{>x^laxG6Q7CX?;ZnZMqK~7#>@YA@>KTpFQKl)W)ryXQY1e*Qx4&$GT*`<sv#Yz)
z95R__#K|4p+kAXU9nx`}aZ4z!w?=|(T`9wwWq}lAtKVBakdJ~+x{No5pDOz|cgR2T
z^EGLMJx-03W4)|A-p6 BA+6KP-h9%@$dWx}%wl}35}_5F`cFJe%K62%WVFt?6wTt~
cJ*T 12dh96Hl-NSz1AErCnCApa2oPI0GHmX2><{9

literal 0
HcmV?d00001

diff --git a/images/lib-x86_64.so b/images/lib-x86_64.so
new file mode 100755
index 0000000000000000000000000000000000000000..8cee4d202fc167f5cb2809048577b7c130dd0567
GIT binary patch
literal 5467
zcmdT|U5pe(5U#ytVO3-i0TD4wKoih7ZV>P^LHAe=2DAJKcLsxInA_ds*6fe&%#p(w
zB{ hGa)}y$9(>UFqS2V}pb3%~fA9}|xkOF;&ly5;iiz@|;tOk4Pk+Zu?_M+}KG>U`
z>iVjxtGc_or>7t3Eo|&cBnTx*w~^vzgh);cK2Ae}C`a9t;^$(zLg}V1h}vpPv=EfY
zQaa*eCjTuhw^AVvI;lfCrzz~ZwB2 Xw_V$T9?<%r2wS=%|6N*c(rZ{I1yppU+<7`E
zNu2+*ME%WYqa^<~ZSAN0 sr2it{p0#uRTy$_{`z&zj<x^Pia%+(iI6y{5<-Om7p29
ziv*j+|BLv4{M3^V<$J&Q`O61(EqQb7?3^>7{W6E)X-kr=K9+_fMcTI_JgV1EgD+ux
z8I&UQ9<I-&v#mw5tO!c9S>tH~-#!gKm+^TW;#{ck*_77v%WPO&cW<pxcm2R?2ChqP
zrCtfh9b`hTTO9GE>QyTbmdU+ipSz>Hx8euoX1?nAe%YsLWuR#L4SOxQ<&qb8Y%}2d
zVQUQ4OSGx5d41kpWv{Z=z$H-^&kKGbD%|Z{mH4F$FRt(ub&(gc<fJTBLmq%1pBdsZ
z$CAS+Uq<lglubl%<f5|C<14ul#huZg(~~zcIQfY e&dHT`hNOEYt6+;i(1#t=4WPU
zj%&gXv6z0GXti2m=Nw6W&}ETx=$)XeHLlDaN9jMXZh~dxJa)RLZ|CrUGrI0&;e*-E
z*t%H>izZ)@R>o3iIK2vE*M7^yIkMml)+wx<aNa$abjEhIoLj#3t<2I564ZMM=dlG(
zv%IG@|8rJ7%vF{*Pk)%&$JNB{o_kK77|bj^$RQH-v%_a4b2)%uapB0-%UNg3p>KjY
z?EeuKoa||x$}FXmC&GyPS#PKAR8C?UJ=Y4ZbjGf}i5b>&M$e?Vk4KUs7(OeV-7U6i
z{4#1lc+`|@^<YF5ASMqS^PJFt<cO5nA(>i_muepQ{oDCgL!blN5NZFiP7=u%DaW+@
z;*h19rk7~CNYkXIlRAHNGX%NpNm3+#q+AgaI;stUZ`VBXc#qbT{YVPhJKqZ9&uV=h
zAJrd>!>^iOsO5he^02l4{)zX4>FIYJ7j4StZ?#tNR=v_%ZLhYo)~amwmh77BT5H9Q
za>;VMAjEH2y^?qI|Dm$&@2>^k0NH-f4CxSR^+r&(_tuB)f#FKEbVH>?iW~C$A+k&R
z>ued)pczW`m79L0QI9b$%bMk?CkDE9e>EUmZPa#99^ty$uI=)WJJ|GUWwMJwqv><g
zA-S)}O~~#n?bywR^6AwoMfTHRYkt_ON#45Iwo$8<>w!6;|B}Co?IicHUZy)Ap!w+D
zE11py-#NEokM#`NtqqZGSXUb66BUuHW!PiAgZ`=&#johV9_uj2n6wRh>>r mFIYtt
ztWWR`S7hzN9_tkp`v&5N9%w(?%U%E;`vIt>9ZCG+8}VzHN?bwT1jGIVx<^1R DF?R
zzs|C#{ZXw53O#{k4>j#a7?ZfL-{SlP3VT*jMSMkz&rH;QLi-1`qRL!{J<bsi8}?HQ
zS}|=*80^sOLBk&J7f|!S2>-A tnD#>i}Z^K)YLcmr?frh$4XhMX`JuPcrpG;i677L
zU%CkUthUeUIR4K5MZ-R)?Q`1R^k?!f8TNReJO9xBb+(t>LHu~%;5+4jo<EEm{G(rQ
z8UArz9M=hH<{#`q-!ts-{-4zL7R#drcA%fKQ0j;u=lHZf5Fk#p0Xy*HTrpBqiD3T&
z6g4$<FJm0OqpCk@|6fHxuABD4BX^^!PA24z>VdzK+3Wa^_%W_>uIc3e+~uKt(Qs(6
zq0%(ZBu9()NmM1t5hE|+cyj8z7sqE1_VYNNBJ9&~d?sZ(bSlYjI_#@){q)p1Fpjr>
zPl`OrJLyEn_W4bQM2|F-<kK+rqX^9HTuRty;`kiCAF!g3swXK!*dL<8B!87*-N*6E
zroPMK_&mZojpLUS)?XZ-PgqxRd;wv-#BuqWjh8S_+s8-pe+GY7$F+&%J3K+{;~+Vl
z=r9i53U42WUdFrlgkc%;vRmn2h#z@<pT_6Tvbc6(y^L^O+IhifXS(<gvcAN>!kEV=
z6y84X&nvt={#Ui%al`MsjCUHhkEEThvn_MJzEgO6KK!Kc40RiE{-N7x%M%_bi)CiX
zOoK0Hd|rqAU&;6~vk~Td8JBw&Gq3K{xOx9_*EIU~GT!N)g^FIa8o5%TVl(iA;lV+>
z$af?8zHK|)!seZQa?|2&h;eu1Bcf8n-CJ!8cvV-O;azWdg!o{7f3+NxOZM7T-D^k$
zZlyFL+|8s8{%&cwR@)Chy<0aZHyd~KZ0U8ui5t`}cu^k=$_wA<NT{0%+t&9K+-(~-
z?(FSz`+C+FdL`tN-*AV#da26SL1Fy5tqpf??b)(9&uIKQsl%O7r^}^WE_zSYc8P?`
ICH2ko7w~UU;Q#;t

literal 0
HcmV?d00001

diff --git a/po/POTFILES.in b/po/POTFILES.in
index ca01b3d..e4a32fd 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,4 +1,5 @@
 cat/virt-cat.pl
+daemon/arch.c
 daemon/augeas.c
 daemon/blockdev.c
 daemon/checksum.c
diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
index fa8f08c..1b9cba4 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-150
+151
diff --git a/src/generator.ml b/src/generator.ml
index 6aaaf67..a0ddb58 100755
--- a/src/generator.ml
+++ b/src/generator.ml
@@ -3050,6 +3050,52 @@ handle files that contain embedded ASCII NUL characters.
 However unlike C<guestfs_download>, this function is limited
 in the total size of file that can be handled.");
 
+  ("file_arch", (RString "arch", [String "path"]), 151, [],
+   [InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/bin-i586-dynamic"]], "i386");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/bin-sparc-dynamic"]], "sparc");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/bin-win32.exe"]], "i386");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/bin-win64.exe"]], "x86_64");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/bin-x86_64-dynamic"]], "x86_64");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/lib-i586.so"]], "i386");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/lib-sparc.so"]], "sparc");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/lib-win32.dll"]], "i386");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/lib-win64.dll"]], "x86_64");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/lib-x86_64.so"]], "x86_64");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/initrd-x86_64.img"]], "x86_64");
+    InitSquashFS, Always, TestOutput (
+      [["file_arch"; "/initrd-x86_64.img.gz"]], "x86_64")],
+   "detect architecture of a binary",
+   "\
+This call returns the architecture string for the binary,
+library, Linux kernel module, or Linux initrd named C<path>.
+
+The call contains a wide range of heuristics, and can look
+deep inside files such as initrd to try to get an answer.
+It should give a better result than using C<guestfs_file>.
+
+Note that this command does not work on Linux i386 or x86_64
+vmlinuz files.  The reason is that these files are not
+readily reversible.  Instead, use this command on the
+associated initrd or kernel module(s).
+
+The returned string is one of the canonical architecture strings,
+such as C<i[3456]86>, C<x86_64>, C<sparc> etc.  For Win32
+binaries and DLLs it returns C<i[3456]86> and for Win64 it returns
+C<x86_64>.
+
+If the architecture detection fails, this call returns an error.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions
-- 
1.6.2.5


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]