[Libguestfs] [PATCH] guestfs_file_arch command

Richard W.M. Jones rjones at redhat.com
Tue Jul 28 12:11:09 UTC 2009


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
-------------- next part --------------
>From 25cde23d4533e8a82a14f480ffe6c7ac16cf0751 Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at 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 at 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 at 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 at x))QqIr{$r^P^JZvb9|p$qlTK$FkL
z+8J}FxK9Ynnk$w|R at 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 at -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 at 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 at 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 at QawrjHQY4Jz!M-YvCTFJDtT?C8)$lMn=AD^kF;LYb4A8bI=%!#}5n)
z3?_`eNhfEF+n#FgPYhyx|L^Q%{6KuG at 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 at 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 at 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 at NO0|
zUlb1S9E`tPzUP;M`9(1w6 at l!Acl!^YYhK68)AS?2I^GD_Nnjms1gH8GF!PgdCW4)6
z3Z*<{26zVL&CqxYz;T>|Q6SH at 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<_ at 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 at k3XFr{TW;n<Lmyqux7^}4ji0NQ
zt-M{z6&!exuTnqOjmS6?7;$3N;mH{~@*s<u at 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 at wEK24KW2`jAxAJ7(c{kUl<?X-UA2d1fAD at Ay}-+k{o
zPR1nqbyqs?oZmg?o_p at Of8KrX?7+|wWhrSCOWGkTQPvW8ugE$LA=wg at 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 at 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 at wXn;P^F1lp)YL0AM<;F}><DewkJLY>
z4eb~9Jh(jnr==)kVgE)>Oi6 at w%|t!MG{0bVFX|jQvhHGg_hJZk$Q^tmZ;t4^nLdrb
zd-2b?q22!~MsMa2G3vfdjKQ2bnA6X$MsD?j>$&1V5yaSbAy$pv!W at 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 at qd_B>-{}H=qG?%rHraixY at 58%A
z{_l<Bl{3>`dR*cauk7<FBjt-;u6#=3#gdncCl4Rn>!l|HG+CU9kI&@sI?QJ!PBfLS
zOi4U at 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 at up^~VXNnyNFM|hm5eMCY^mzxSi}6<lq8-M;dzHRh
zF)yYVyWgO~*qwwONZ&En+WoG{ZWeYRIcki+jlUXX`oozVflO+=BOo^Hu0u9<H(&?4
ztKA=)>=t1MYWRTIkpB#sbIE?+gB_ at G*M_L=qTsmOnSNU?qY21=$APnO9HgIt7+<UZ
zZqe_TAz)L?c;81wFpieb;1AS at iMG_S`~$@P`L0 at q9Z0VuFkOtlkAX}Zh_qAsrR$qD
zbhu8zSEEGvZv3PHSA5VH*MCqp{uJTG0PY7RK<t;8 at 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 at 0cr!WlT>He#8`2c1kpXi~h;NVq
z`=2(JUbDpfwxphGlemK%>)|pPu=(bABfvaIsOOrZ9-jm#di`kJsd4at9-j-1^?~Hp
z{|Ve?;=|-HzAh6VFyre1UIb at D#`mbGkWGxqV}6bY{VC|#-*?2))4=;P at f7T<;Ku$u
zaIFddLX<zvfj>0!OAucb{lCK+C>Y<H$nRSLW`6&$Ccf+Nw?uv5 at 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 at 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 at 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 at 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 at oAbe?5kU at 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 at 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 at hS|tGbl1Mut&ypiGe)RRdm4WBY{SpUw1N7{^8G9r
zX3y4FT2>gbRml(m5A11p3z2{1AHlKT53ql at XVu6sa)VPXund%s9EHTbSAR6}0e~Z4
zpc3Nr?<Yw}So?)6t8(NX1G<imd=exB(<(<EBhu-IVe?}`5=aN@$_GHW2_- at 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 at 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 at G~`cXZDeU@!yyO&DP1gNyb}4YR(tN3-+#-^@<l
zGwt(~?-&}L-1nN*_Xh8I6D`?01x<hXFGolFj+Nhf`{twQ|J7f8%@}xQ&vHH(=qHZ;
z=X!oL at X~8f>hZn5JPi8>PQnyx^U;o>&CeDQLJjp=AKG_x_P*vYqxdNmKd$0qDn6j%
zLn?km#k*Dfkcx*y3{{&?-SBG+CTD)xeCk2uRiDF%8103f6evBU(gL^uH<HQ1Sn at 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 at 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 at o=Q
zam*Oip(vZ*))P;(x5v{mF at 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 at 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 at LFKhIBfW
zZtCd3QpbD^3JyrPC6<UqvnjOQ3RO at ZsK@J0O at 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 at 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 at 8JpsLCG`Of6t)SIBWtY|qA$
z?Xh;<7f>1#?Pbn-fy*ZUF<P&jntYTqQ at 5+HqqqWZxy)t<SXnZuh-MoiFSQ#s)-^P@
zHa4xb*EiJBkZSfdmV5;S(5QBab+qmCtt!!@!YNSoxKWi at 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 at h5l?EP;t(wh?T!-I|tMj~SCcNxs>IYx+J^BMhQ6F8-C5Kyszd
z&iE3_jEB2td`-l7b_o8EDviKjVl#Q+)(t<e at p5RJi|bL4UB&Y at a{Sl43S}#C9Yy&p
zyEEBi$8 at i?<>OMC at vZy;6gPv6*8TrN`fsrDt8^*FuSmR;&@0da(^83cmpg95%=Z%<
ziHfew?;vqQgy8WEk5V1oJ&fN;P7pstSr&E7*>a0%loQU2O!{R&VB456kvae{`q`kY
z1A at K}%~!KI;_1u$#5a-Sd=5F^?o8l;%$OmB08+i7M(2q{VM`@8S9FbQv16J{{eZp4
zj(6c{P<Ne6cngX+dd7PZ&lN2mC*qHSRuk(jHJ{FRD(X#$*- at 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 at D@ab%YL*Rvd9X-jY at VfDbx1vK8
zSrOd*yrdINkVJAERyTSX!9Nj2j`NZm5z#|g;O{|!H8c0&%>1nXUZN{9>4iB8z0Yap
zU+KbwD7+Z{uX%t^<g@*gOHKb3{)v1NFURa at 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 at UnG*;?T}6mrACOh2s*-EMK9YM`k>e2q`YtC|U}@8m=LB5RX|8+&Zk;}z
zR|`QKOE(GqSC+#0lQ80D)UfKwBrP}{i48s?U~FcHxh6=dSg0MaRI9 at 3>}vO#TB%Hh
z|4ILB*PQDEr0wdN=&W<R=(VWIT=JlF{(Dpz8s+)`m9ew*7N<=`{jA*XP^7z$&)YAG
zb-(aSPnPJGA4k at e=35ug{h`cj8`b7wI4=*-rp#bF!OQtC$Cu&GfnX6}e11<RU9d~Y
z?8wYZr&3w at 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 at rTXNasLxrpEr}oar^#<j_)w9@~<+>H~N=8+HaPG%qQ-<- at 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 at 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 at wQ|343;QKj9uX#CN*ycmAJJP;D^*W_IN
z_9$bW`iEbS8}u7af;bB at V~l=cs~4NJMhF_ge-G|Kg~<KeN06h*-KE(Ngr;y8`8yyq
z`4VC>eNqA-5WJJ%G(F9xtP}Jp2?9_E8mGuf=#viw;0GSiI18IYLy3P at 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 at b&(T??ugQa>ZzCZ27L!3z0sx};BbjwwUDbSsFy at Y7e4aO
zYtsu>FLe^BS!gF+j$uxsP#1YAH|X(oMjxJoF4AzevFz#^!=CffHHI8 at Vv71Im5${f
z@&uh+lRg}KhSYu4_4D_ at 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+ at 6AI{fRlgLMEx4K;KNc&T+9Ho6<zOI^$`AF at RE|=221nvSzEhrDydiM!x
zEEl%>*IhYE`&0S4YO?uA?L97+(jGo9?Z;d>O8evax at xxMBemDLTuS@O^V0r`D at 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 at 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 at _Rh0>qz#BovqH)q8Ugd`O+{#A{NL;mY|4Xk6{K`XXDG
zOPfDMa*%ZGp*e$SBti#v+g0nh+P at 4My$3)Gs$;kEIVGrS at 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 at 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 at 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 at 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_ at g`H98X at QWG5TTUt{(M at 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 at 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 at MnZ9~Jvu1Xzzx1V<{8iqH#l2p|54ZWjKs9-nCSRkZc?66#Pseu7zvS<&sH
zb)=$G at 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 at _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 at 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 at ZgiJJ=rmOz~+x5r~v7gsy=h*B^dMfz!NhF^x&Z
zJ3Aq>_~GEpz))aj`*p8PF;WXCFpGCKB4uC?mA9z)1Iq!VZ+I2J&L at 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 at 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+ at P-$nswp13zHF|jw75;Ys1J^x4wQ$8%p(|@P)LglL at LL0a
zG?t!G?Ee-?IkGjYev2P&C~G}>SG%t7x~h>!$#bio9Q*!}JP at W`OHj>UfhcLaogaT=
zZ0r$us2Ke{sy*#G1*v4zou5Sl4D!AW(iBkyqrU^i0oR{u)o5{K5ESXTO;E7v*{WBD
zRvUrHlYxCdcZ at y^y86K<sz%@}>19hmaIL at iwCxarikW)az&DK18$se9>M&MEe$y~`
zWOS#@;hYsn&p2)M;AmiQUtnOrdvr6<OaAo!Zw4Y?59~Ya2&7A2eh*k5a5 at z)SIrvq
z5QAs_2-tMtLHq^=OB&Lyrzn;#{ThPNU!$mluKN)^ax)ca at OxvW+g1be{dH_?7$tn<
z3R%LBA~@ihiNcX>Mja4+<W7*J3**G*FH_M{PDAJNQuzVbFHj_UMz2JzQbRuS#Ou_?
ze4PF`(j}K=I{iLQZw3QzAZ?_ at 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 at xkR_0-hjK;+=Sh%sme1~+`OMEec~mXkquz*UT2de8velyT7YdrZu#
zMvfkQgj{#@kFaxK at NsE*;yQw1?Yp2jK)nf4mb(LkrC(K9Zj+{!KU5zL>DiC00u78_
zGxkd>jbfA at 7(7U67^8jEUhMFY>rZE^{QJ3lm4S3&7(>wLUN{Jv2AZ+ItUR?@wU-Z)
zuIWM_5qyjY(uHL-UJ=dchX{d at tGr<d^Mt_QPt<(j3Yn*&tUNHdf0SH4kZz!4*K6qL
zM`J)p-a!0>5Y^Hg&p_|WEB1rQSm~)$#KHZ92 at F1S1-THqPL!v7bS1Gv`#qT)4}*Nx
zL*>o(M}ph0Te5n6DxcATNX^oKvG2MiH0<~Nx at x5Tx~(%Y%->4P-22DXzqFsq;V*vp
zlDy)FYi87;y5<%?JQ5i48#Ak(Jn9S#jFkJ+zNvMC`|6i`Z;Qw8 at VOh7Jf18V*k|~c
zd at uR$EL!z%&}Uiii!@(?v&0ceVPKWADLqnp8&Cn`@#`*-3O?U{-8QJ#_Z-AG<<$>9
zS%1#H;)j<@B at QYj%$ZeBA1%=K87WT(rq&D|T)kvp((MSi>z6#4oPuG at zvSuU&xeoR
zN=@LyX<r#h{PUrGqo<9xU;pZzBk<|6*1%w at 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 at 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 at C^U1!u(zQ-Zk#9-&x(D9C
z+~X)Q9N0g#VQAqL&;*uzzjy%4L1PU=XFmH&3a%-uJo;YhKL*}#7w<R;1 at cp44;=89
zQ7w!5bN)Jdvy1FZ*r7lx%y3Sb5OtUjk8VdogAp&Q9C)Loc*kCl7k at AX7T`5pyyFGH
zR(~$FSn|i>f$LD1^d at 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 at y=VorG5CwPZ4DGmumxqFI-A(d#JDmOD{BfC&o&Dfms at +_-AA7
zBrvpg6q8(Z$)n|D#hoMdgZqki+y@;4Lv at 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 at 2`w!q}dlzsik3MZV0F7_Y{!)%U5~=1_fq`Xb(0WsP_68IE;`)KVjHMQ0
zs&oqas#U;P?RW5*u^HdMbgJ(a at 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 at _&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 at qh7;uhlBN7yCjFhJ|=33wI-M(Kd at _e5@>@Fv~d%av0 at s8;8Rjev-on
zIed!4pK<tG4&713cNT|>I9$bH2Zsp`cW}6i!!L1|t?%QEJH+8(4qxK%H4Y16EStkh
z4lm#^z+n at 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 at eoiSZosmtoJ?LJASYtNygrlq*=8^ZBm-NMwTZ6G=drz_}+#QKYLX_f=
z*_4Xch7+m2ByipGG{TPw*U;0msV}jjuRB78uIo;rkm6^Qa%m at 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 at 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 at _~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 at 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 at Fg^nj!$3B<Ps4-S9L;0XH*z1K>8mEesC>?o9}DEyH(GI^atg-bLx1
z!n};(`vFG*uVZ*O;KjncoWVT+mk4t`gChW|Q0yxhK1eXiy at BCF1f$?rGW-m|DEU<k
zA11h3m?4Ho30^47R)&uO?u52shF>)be}(fuD7NWQ>n=^Pjh$HUfCp at 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 at 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 at 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- at bkX)c4wlN&pD$I at 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 at 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 at 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 at 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 at 13`<{AdsXa0#n_L*xLWS at 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 at 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 at MONqQY^D3m3f)d%-my+1K7`skl
z<%_Av`zRw at 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 at bFvaPVKmV3AvKNP1<f4ZAOAcDqIKv2GiWiP<?0xSR`QC8UY0y%p<J6PT
z)9d%_qfT<PvLwB?zvQF^4sm9rBNo|&$!d3aV=PKXLxgd<VNfZI8<Dpxf%!ByNn?(2
zH|8g0iC~?^lo at 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 at 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 at 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 at 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 at 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 at 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 at MBBK?
zBD!cQmB at EGur+5%n=a4JLW#B6)Widgal%HWTM`--xdpW^r*2Cw-MaFWSLbK at zgs)8
zM>}yrwoFoD($9Q3oIFWN8-FP(#IJ#>KsO`kq?ef2*PEPY at 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 at L8GVnf`m+zq-Ov at cawk{OMjtp?m4Y_18E`+y{Sh?-h>A-0ME=C~%+P2>!uwH3G`L
z?iNSEJukZFIWBzO at ubnd(mkiX at 0P%Ym%HbEbWMw6 at 3jx0R4K<p*Iw`VmJCy|WsZB^
z?>^`_@%bO#>o_FtaeV0gKf3td_4SVAunfLz3}5Lu!(HJhS@)GseZ=9Za6J0{cE?F(
zh4GcHD;!t3+h6%g*GC)`?p2Nu{<_ at lj`Q5 at FI?<6!9DCaaaFzPf{!%7MNF|`BCnZv
zx*>!$-+(`CY>UsOiF+ at 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 at lt<co`^-H*hHGd83w{8vV^fDzb^M<{W^{Xi=0m(E6dLsGgeEKCA
z!?S$+MI{{jpB>;(0y=a2PeM^kOP$TwUsv0<_4Ga|)Lx at JtZJ=dMCt4VZz9*ku~R{Z
zgT?C3ZX9sZ?DUZe+NSh(CgrK8t<1Wa&P>o^7S2aVF(if4q^Q;5t9z1I=GqiXYCcLS
zETif at 0IjCAMl5$k6`hp8YvxQySy`skG?#rS6r1o>T(Mi5y%a6Q at b+?JyZjH4a*b6;
zt!)O#D2|g%y^5xhR#mb5x=|em(M6=~9m|}0v%YC_xTZTwTzUl-R at 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 at zLhpeLGX$x1P<8<jR)6LZJAq(f#@tZ7M
zxsHF>!d2?{?G|paj(?o11+_sZGIF0U at _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 at 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 at +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 at vVQ;G{1&H)V- at Xq>p)Tk{@xhF$_y?0ssG%WlVKY}hVbHl9_1uS0Pj!O
z at 5Nbq{E;afxE&?AaWi7nxGhWs5Oxz7gNV2Rf8`kr<)V#XZw7;i_z3=j_><BJA at 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 at _C2M*be
zd-TK{hiO40zicy(0;|d_-Xm#J__gcP%P7*xVN~LmCrgOwN6+TTI~~ShI}_lC8B3Zv
z4BFSreRSJd40NXL$Q^3zs`8_K!zaCk_~;ZXd at 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 at 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 at 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 at cOW9{p
z<=Z5Eu}yl)CjE8POs at 39=)~TRveVu~4(Elm&z6I!e%U7dkWG5)q%7~ZNx#u1eTL2Q
z1yC=y>>ZPm-eQyffK7U}O?tp4JuxZiw33r!=Y{v#q at 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 at kKV*}>%O>4BDe14<EI-vI{Z5;7I#SJ^z%8zPQqpJG%D&Vl
z{h&?y4x9AKNlAakR`w at sUPmiBTvA>c2->`E at 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 at F`Qlioim=`Y(X|GKT-Z?H-Kna%RsCncTEdgEW#3h;9_=^ZxdxOrLUVxPZZ
zQqq55lfKs`Jz$f*JR at 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 at Ae>V(&HO$uzo at 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 at 3)a*jnpdXmrx at 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 at vOG9
z9+)5G<mv?GnjFmgfO$O!GYHJgoO0a-OnHtq?gxg-WXXCA7(HVIJ3QY3rZvL{-wdYD
z_zJc1Pjx{)MmO4_d1cx8MdpmEmoyltxle#8sd#vffhLusvw@=%dM!oKlmc at wV^zv^
z1~Ao`Tp_x93?BjBl|w at 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 at 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 at 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 at ZG{8dAXU8Wzjd-=cH3rN~TR~*R<5Ht_ua5>(=@k at ww23##;Ry+|bIH
zz6d^;?1{vBd+Sl(@QJoX)%1(&k-B5?1 at l8;2%;tm4NyGQ>@eGa#O#YeabLc?+n8 at 5
zmL<a7$1(aCXh$qb&Z!8r6Evmb4KQ0 at Vg+s_rF*93Wk<x8uIt5J#i$r5W!%+Ca)uO=
z?m3aNT8<jeL+z22Iz-%nkG-zK$A at 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 at 0_<na~KB~NbSrH_^3E0MLziEIUAK@;dnXcEhA!V^!~&%)R}y*XBvHKj&(rYB4C
z=g+!gHNAA(6 at 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 at 7hb@<r9UbtQy0#^lh6Zkl?M><?&@*Jc+u=kjb+FkKLz
zxfvU7%$H0nztjAsZLJb;4+Ke8N2og0oX(RQMI_ at 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 at 1>BZ6=$h4|u
zOSNHNl#TA4XG^nm$pAQeL0e!4`U*(Qs$9j1d+-TH4_=B8q2qU%<6AP_r=Ml at oUSUn
z(^lPSD$5T-*>eu7H_x;`exCq;9)UJTB5 at 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 at Bcyh_h3;DF<XJcvBra5_;3p~&sRrEj69tqmvW(^fo-
zqcV<fKjXWooHEliSzW2m3Lk%-l9{sc^p7+Atr4H+uUVb8RNYoq*`FVOoX~@FW at 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 at wj
zyEEerg$G_Z_RP8GyXV|<?%g}*{yaYv9#(ulU{c^qKvGH71!TVg{M&^nu at Lw{htI%1
zXh5VMA6?WCw at 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 at 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 at 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 at 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 at 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 at 5);4;*1rY04--_Z9dJVWZFt(XF*G6tc2FrKhkMMr=&EM&TA9-Brc%IIA|nIM|0Dl
z#V at 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 at LU~HC%09H-7IFXUrV}VqZesg+MMsJ9m|$SoOyoBjC${H2 at -$+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 at 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 at 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 at 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 at 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 at GB?!j*kogoki`-SyU4 at 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 at 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 at Znr0(~Z+BaT8QQtt(Bzix#<?gOPqSI3TdGG;|ce9V5-R{+2I
z@%Y<;mhUGnzqPaa%iQhCpTGOH63x?qeHHk?Jg)>$%GD)#Hw>Qw|2pu}qq4C|+%C3*
zz2K5xnIU7CViN}nSc0sUfsQb7z!I at Q2wm@wClk7987WKGg&s{rEur^;Ko!gwWQ|z#
zU|8sz2ldWyf7G<XsX)vy&9EtA(cYkDCbhLf4~GoPK%ZXIl-|&k2#L0i_U3?Ir>)jr
zlu<eFo at u|Ap<tc_^U3H#v at 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 at 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 at 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 at f1+m@hm-!Mvy5`cD!8ZmvJw^
z-~tr0&C40+=}!UeZYTj%>3BBNmx9l5*pDdzRN0Yo%@pjzCE!Cx-h9sinICI`HR|?v
zc##kXl at sV(ETri$QWE8trrfJ+DlbLmo|LkTz`ZABMwfd`%Dl1UUXn6bO70mc&vRt;
z9adhNLGA&m=O|>YOPM#GtZ6CpM3J>CWx1mKrj;@V4PZSI%7y&QWZg-5u|rv3QkJ_&
z-CgC*jVZseq at 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 at 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 at jIDvIDWO6%Ijc
zXh6SEQtyu?dySaxT-v&k&Iso+*F))e{D6wnvUQ^qrnR$aON*`~hEe=Kj+~DG#}Qs4
zOtr0JTXR!~zOA*jtEF4-ZffpmVag#hsYi at 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 at Uje&5`g?QJ0j9(?d@
z&YttlIdf*_%+H-U80*+#gbY!kDls2A3aSc_%|g_jldxHYg(;fE{bG at 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 at 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 at 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 at 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 at 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 at c%~mA
z_$6W-E0>jRy6I#;+R36ezD}r;O{WtX?=F|fgYf4X=9)gEn0rGL*EPw)di at KMe%veM
zW-yN*68*^Q!Q3zK;~tXx=$Nw6mp<G}Hkg=x*i&-faj$8TOAlbH+BfhEwfijZVY*$E
z%RcRfANCpbP_NG-49xZzi;@%vQ>S0SXK at r*$D<ABgUEoDANRK0-`w-`TcB+88wN8z
z&J5m%<eg{-uqMVJy#UsJ1^9tOwwR)@QjbC^KeNR137F at 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 at 4QBk+IBB=y at 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 at JwTz!Ma}
z%p36)3SiC&@U(XcG1i5&a~}iCIi>$XiPax4 at 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 at ayG&ck{!4(R#v--*Ucz!BONer1OJ
zb=pYF<i9bB`Dmmn-;Mn_FYgWQ-D~yZjTi0d>UKKXcJ=VZ=xm;b+M at 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 at 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_ at -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 at ITVo@Ij2mxk
zyr5aJ-qOq1M!tY;ni$!@KE>E2oUxbLycG at HSS^%V078SY=_qnaF(fKc8F<ngT||zI
zu`{wV_DL at 65*>(^I*43lTNvvmbU$O46N9;6RFKTo`hoFr&)w~z_jTla(u)kC6o7uV
zr9YlYc`4v*!pD$cv#cOjkYsJs at uDOYer-bo(OsY^WDdGye4tdK+BUi*=~4 at 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 at d8}
z{EcN(z4o!5W;>c>QREgwK4~?d`g at 3d@yLO{A;|~6bs1%6rGJR%$KT=~n?7>zz&A0Q
z1^w3XH>{~8#B<_=*L|3T9JuM{SG{z{vID!=lsPf&*)zu_!T4$Gs+V at 1o?P5~Y8`kT
ztD|1T=9ndXa;gj1 at uSwQJC6ALZ-jv8)Q-sb+uU0{)f=6>t=XD{H86^dcnO{ze<L#S
zFO%OXFE}jJnD(4g>6w|C1MXXsXKwxN9nVKdz!>D5`WC1srXL|P at 7iO)F!l&(eCkPR
z&7&0($VW6 at 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 at 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 at 9~C*62q6ExHuMf+qY}S6UV9XEVh%vm%tWCl5mPy)
z%Ch%I at 0$FG>;KX7__?KVE;}%kzTGLsGr1gdHtcfx+ at 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 at 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_ at 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 at N)Qiy3><Si<U^QLo61aVi at 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 at +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 at 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 at CNh5Cv6%Nlx at 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 at ZPZCA
zAkd43hCHx at suj?uqzFN)Esa|>=#x)`7aH;y6>H$D3WJ+0_|St at Ej+GJbl){Oz5e=G
z4Ussv0W9qsO#TY4wXEpH06`;?$;WW51OUns{z2t*s0y-bnE?MIMKfQ}tiiRG><vXj
z5=<V$HGE&vk#HqiWF(~T9HQ4cEqD(!fUm-NJTn5`Mk4<SKNEt at hp;iEv&F_I(0*Lg
zRK`^HB7L at 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 at 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 at HFiPhO?)QVJz-q~oR&WXiZI;RrdS$$A3-?bYk
zVLPWe9tK6zxe at 3&X_V)Gg?4pj&ZdvFz3bq+)2v#q$DPyK6^5GedS7$-448!@Dp!r^
zOjcvM at Aomvt2Agdz*v#gzYJ)U5JH5hjs(4Gt@<yYkMhQ7HKwzt8q at t)1*79RS;6Rd
z4p^Zyq{mR9;cRhOt at CU&)mF?#qv9Frs5qQEo`)+mbI0 at 5XQTPm+tqp9+4NB(=)F75
zs<$dM^t2KNy>s|6&^6BvZa$+o5QpG at KgNj1SAmI&QI5^Je<qqIK at -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 at -cs`FuwFBYG}S!gE<LIGdPna($aZgpx0-K
zSxzh!80<>a;u&|KJmjQ`sr(Sm^{eV=d4Tqpm3lTmSkP^$fq|mCOV at JQysOKD_<v`m
zLc`?*4=&)-d*FNnp78N;NFLpAW<77AH4BLgDsooQa~PuSg!m2XD(BHq!vn2TRDW{7
z>PdzuY{sp at kGk28)!h#M!0Kg3T=avnDSYFhE}4Qelq(FRa!!W6`h-#9LlASa`K*^s
z<+69-M2I$?j+iK|dN=i8hE%EJP+#U$Ya^tvxctJ at -PMIZHpYeExU7I>-}X)0)?eT2
zY}wkoy=Sx2*Sm4^I(-rk`r at CYPKgfhk<9Sd`1l=eYG)j-s`&#5kaM`q%asD`@On(1
zmv&OHT6z^{qg<yjNL1;a4vs5~WTotI1I}~PnHizgNb2 at 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 at AjN?Q3+1lR*-hyv-6C~PS2Wc1KtKf#ekyl}xvvhCI^sx9m2Sdm
zYR#utfi(J6W^2EO{t+MsGI0Js9L`R7$btbT_4b0kUr$b4OQ!+RuM&CW8zEZVX=j at p
zAaQ6KXeUW}`qP27MGjCfigDr&Q(GKYDv3eU!@AQg=G|OJ!bwqY5dgk6K at 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 at 0
zHSP7?wwzCP&N;vHJHNl at -<+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 at T&dJ4N~cRv-caWGvR$slN*<6-!_TWI!_yH{UU}eJy0SEINp1=r1sMvZ
zs-jF%6yFAw>4g*n^SYE|M9j#9fOiFD8WrWBBue at 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 at P>=4R at W1B9bIDh
z5xsLMV+FtBA1*c`Og=OLMcIrW;mO8>Bn9w=zM)8Gv+&IzfP^=XO059AWhLc2UrNys
zeuP(upDpCMO3IcnNDp1N<41TOrA%r7-oix;up}GNFn&|;n~$F at 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 at 6*9rcYo
zKNX3 at E-mrYNCjGf*8ifG at 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 at 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 at 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 at W?i1UcZv4CkqA&76%g5
z1%)HO1@%A at 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 at 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 at 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 at j?o`Bfn}K at E-6s3RTL(IDSg(?1+Yw2)$vf>;1$y at 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 at V
zfq546-qzG3N!9J9Q36BU(vdohqS}&|dtN+J4O4LcCl~EJgXSGLYGC%`NG7xUpYFaZ
zS(Sms!|ll~Z{K at rZvQ9|?AtXZFt8{I9Bs)@a{Fk)2n@`<1`-4yLFwrA)W7=P^X6_n
z0}55sfUNDUE+8)}wHN$(B#4=dJX5F*XpJz#{ikCYll$=SNF53SYNVjF at 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 at 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 at b2
zZ1n$PJW0)e&YnNA4D4Vr<3U&}xBqrfX&pTB3q;m%I>_e}t?$wUbHOz^dp?*O>-*jr
zGZtZLI16p_Oh7DuB at 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 at H+Qwcs*1I5u~xh(9LcNonx+ATHs(AYz$6Ti_iN
z at b8QGbrDBJe6xr*ig=!gCyDswN>2Z5kuMhU$3(nGl*@WAi2TE8vBY~$z$KoDVHgV3
zQYrA9mFH0FnqGcrhS*;fC?j+1`OTF)?_0)W*|MG$Ua%;iO8q at 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 at 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 at 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 at +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 at i5T`>qN7eDX^g1P~
z>Z0azs@@%Cuu at mBsWWaUpLDgx;^C;#s<gOT;Za5TlB**KR-pV<S4XI$IR;xGH2!UV
zAFo-xq9(9#ft+GyfbIwRrK}Ag(5diOSs-ux^^v?k at aK<T{#WrlRr!<!PFdi?wSZ5&
zZZzZ at DjixpMDGgaL4rd=BSUWt9Ur21b0|NPmwvdio#OVNZh`sW;9^{8mmWck`&k)0
zd+Pd+ZGlUn9{2wr&;Wi5uj_a-Pp at 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 at OZ}O7O!SM{%=K(%#t-Dv4i<TZpcbc&wwT
zI~-{#S=LY+s4l at xPFqh=Pepl&fxW)#tb7rwTjNa1ezQx*9SGYcM7zoJxV at RQ#ph#}
z?r2xIEgHgBBJS(l>ZIoOU|ex~Jr)KlaAkJ2<JJYcjj8Av9#)vav3WYvhLYjUbZ2mO
zHn>~$nt8_3<DFD})ymb?iu;pU*ejcKRqcvpD^~^-w|*F&cV}d at MmmFrGAU5Ec4aNF
zV)Q;T<Q3v at v0WZ6B}u}`Rg^0kgI at 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 at 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 at 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 at 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+ at 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 at SZA^+&KSn+1aNkY7M#d&7EAQ47vu<vf3bqR!>{GU{EcOjKy0
zsPis2QJZz3o^R$`Hbr&(TL<gJdNVc at n=q*;>IJv63JZUR9s&lu(Km(K!cj#nqGqqE
zCYbewVgY0;4Lul(>BgoQyjDtvQ`K^@N>vw=BI;!K%$V4-@`Hm*iQ at VfE_#ZKOZXoi
zgS9m`Q-&g*TR;mTw(@BS$9W=k2~<&D1l%IFtfE?!Dw4}9f!@2gLI+-~xrphqaDgDL
z96FneEaM-dxwz6-J+2cjlw9Mkhg@>`gg0u at CtQ4agorI9Xi?(Ia4e4iaxTPN>B}RR
zxh`?ZrI5?MK=F8Qf)0~ZSLz}N64 at 3=Ot4Is*WHX6CKBrP at 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 at iVlpN0NbL+YI~!OY6|n3aUd2NQQ>LrLMV94QWsC8ce`=0WJDn1_
z(@|$BDCG%$tn##c_53MB at -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 at VVLW*lCb#o{$x0C;0gmK4w88
zius&ige|FjGzEZ(?n2UvD$h at 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 at 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 at 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 at 3cJb
z`vR%FxDBin`O2wzwNp!{xzUqZkpG%2 at 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 at 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 at 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 at 0CF%b6zxckecMI<EfDZe34A#xrQ0tZ
zKb>AWK0D_KKuQ1o at 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 at 7V4Lyzg4MtTEfGx5u0I3P0)j$CEYF at 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 at _|&TQBJjw3Hxq_W{Nzt3Epd;POOFszwytssn}L6s%vro at ks9
z2k-RaIETtY;8-IPGAV&h=>*PtKVT=sVJD3i)E@#4jqz at 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 at 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+ at 5e+;`ofPi_eCdx9iagd4r2MiWF`xz1-*SaJIf&^?L*@;y^N-mV&JqiZ3i71
zqnQmEjc&4riKEAgE6NrvDfgia1&~R$OwOIGK`Wi<tggH`twF8ME~f0=jgq at ct2cX)
z*4Pd(w}zb$Varz-ho#JRHjJQ at nd6Ym_F0;cq|DUMn5N^=5$8E?Hf3hy9hX}`VE<nr
z56Ah>m*<O+=g>*yAqBn-93OsGOQ2mZQ&XlRy)EuX3K48*A4v#C;Rq5M;*;S_fiq1z
zvs&i at atO;s`zXO>CSJ#2 at 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 at 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 at PURf;A?j7W
z^!;UC6p$V~v0fKFBR#0nEN>4Ey*|(w-YY3f8!mcC$}Az}_kp3Ue^s<Q+OsBG%Ln3q
zi-Y at 59o+XhxPRBdy>3F>>5Bw5y%s&=;6Ci&KIGuOZbIA}9o)A%xc54^zbspedC%B5
zA at 21K?hyy~MhEwM9NgO{#J$?VJ>cN(cW|$FaF0!hd%J`C9S-idIJkQqe(#+Scf-N`
z0SEUX2lp!-+&52%`(_9C-45<M9Nf1$xZg4%?wW&py at 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 at -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 at 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 at 9naAt)#&1Z6}F2NRL#g8&HKKaawn+GM^LkUWzzVLk-N6E>V at 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 at hUbBNrIzv9jBnt?tZAY
zBiI&NMhEce`sFxEp{`~PPKBpa+H}3PYei?YCmuF}I2f=tD$d+zHBhQkNr=`MojAfC
zehGya;@Bba9Txco7gDAt$j at 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 at 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 at Z9f8vJqaEK%0WG at 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 at lBs6-#Bww27fd)1n9OvW25CRA-mXLd+k0&JxZ+%aZ40+P-BWic>$OK_GO0
zy$SuFv0&63pQ2z*oW=wlgGO7FdV_ at 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 at BA+6KP-h9%@$dWx}%wl}35}_5F`cFJe%K62%WVFt?6wTt~
cJ*T at 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 at Xw_V$T9?<%r2wS=%|6N*c(rZ{I1yppU+<7`E
zNu2+*ME%WYqa^<~ZSAN0 at 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 at 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 at mFIYtt
ztWWR`S7hzN9_tkp`v&5N9%w(?%U%E;`vIt>9ZCG+8}VzHN?bwT1jGIVx<^1R at DF?R
zzs|C#{ZXw53O#{k4>j#a7?ZfL-{SlP3VT*jMSMkz&rH;QLi-1`qRL!{J<bsi8}?HQ
zS}|=*80^sOLBk&J7f|!S2>-A at 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



More information about the Libguestfs mailing list